From d11d049ff8eae7e15f09243f3a99b7048fd30d1a Mon Sep 17 00:00:00 2001 From: Cesar Coelho Date: Sat, 18 Jul 2026 14:37:42 +0200 Subject: [PATCH 01/45] Bump version to 14.2-SNAPSHOT Co-Authored-By: Claude Opus 4.8 --- api-generator/api-generator-maven-plugin/pom.xml | 4 ++-- api-generator/generator-docs/pom.xml | 4 ++-- api-generator/generator-interfaces/pom.xml | 8 ++++---- api-generator/generator-java/pom.xml | 4 ++-- api-generator/pom.xml | 4 ++-- apis/api-area001-v003-mal/pom.xml | 4 ++-- apis/api-area002-v001-com/pom.xml | 4 ++-- apis/api-area003-v001-common/pom.xml | 4 ++-- apis/api-area004-v001-mc/pom.xml | 4 ++-- apis/api-area004-v002-mc/pom.xml | 4 ++-- apis/api-area005-v001-mps/pom.xml | 4 ++-- apis/api-area009-v001-mpd/pom.xml | 4 ++-- apis/pom.xml | 4 ++-- encodings/encoding-binary/pom.xml | 4 ++-- encodings/encoding-string/pom.xml | 4 ++-- encodings/encoding-xml/pom.xml | 4 ++-- encodings/pom.xml | 4 ++-- mal-impl/pom.xml | 4 ++-- parent/pom.xml | 4 ++-- pom.xml | 2 +- services-impl/pom.xml | 4 ++-- services-impl/services-area003-v001-common/pom.xml | 4 ++-- services-impl/services-area004-v002-mc/pom.xml | 4 ++-- services-impl/services-area009-v001-mpd/pom.xml | 4 ++-- testbeds/pom.xml | 4 ++-- testbeds/test-apis/pom.xml | 4 ++-- testbeds/test-apis/test-api-com/pom.xml | 4 ++-- testbeds/test-apis/test-api-mal/pom.xml | 4 ++-- testbeds/test-apis/test-api-mc/pom.xml | 4 ++-- testbeds/testbed-com-framework/pom.xml | 4 ++-- testbeds/testbed-com-provider-esa/pom.xml | 4 ++-- testbeds/testbed-com/pom.xml | 4 ++-- testbeds/testbed-encoders/pom.xml | 4 ++-- testbeds/testbed-mal/pom.xml | 4 ++-- testbeds/testbed-malspp-framework/pom.xml | 4 ++-- testbeds/testbed-malspp/pom.xml | 4 ++-- testbeds/testbed-mc/pom.xml | 4 ++-- testbeds/testbed-mpd/pom.xml | 4 ++-- testbeds/testbed-pom/pom.xml | 4 ++-- testbeds/testbed-util-spp/pom.xml | 4 ++-- testbeds/testbed-util/pom.xml | 4 ++-- testbeds/xml-tests/pom.xml | 2 +- tooling/basic-demo/pom.xml | 4 ++-- tooling/mo-navigator/pom.xml | 4 ++-- tooling/pom.xml | 4 ++-- tooling/simple-mo-consumer/pom.xml | 4 ++-- tooling/simple-mo-provider/pom.xml | 4 ++-- tooling/transport-bridge/pom.xml | 4 ++-- transports/pom.xml | 4 ++-- transports/transport-file/pom.xml | 4 ++-- transports/transport-generic/pom.xml | 4 ++-- transports/transport-http/pom.xml | 4 ++-- transports/transport-rmi/pom.xml | 4 ++-- transports/transport-spp/pom.xml | 4 ++-- transports/transport-tcpip/pom.xml | 4 ++-- transports/transport-zmtp/pom.xml | 4 ++-- xml-service-specifications/pom.xml | 4 ++-- .../xml-ccsds-mo-prototypes/pom.xml | 4 ++-- xml-service-specifications/xml-ccsds-mo-standards/pom.xml | 4 ++-- 59 files changed, 118 insertions(+), 118 deletions(-) diff --git a/api-generator/api-generator-maven-plugin/pom.xml b/api-generator/api-generator-maven-plugin/pom.xml index efbf99d7..b8099ddc 100644 --- a/api-generator/api-generator-maven-plugin/pom.xml +++ b/api-generator/api-generator-maven-plugin/pom.xml @@ -19,12 +19,12 @@ int.esa.ccsds.mo parent - 14.1 + 14.2-SNAPSHOT ../../parent/pom.xml api-generator-maven-plugin - 14.1 + 14.2-SNAPSHOT maven-plugin ESA MO API Generator - Maven Plugin diff --git a/api-generator/generator-docs/pom.xml b/api-generator/generator-docs/pom.xml index 6d355348..dbd0c841 100644 --- a/api-generator/generator-docs/pom.xml +++ b/api-generator/generator-docs/pom.xml @@ -19,12 +19,12 @@ int.esa.ccsds.mo parent - 14.1 + 14.2-SNAPSHOT ../../parent/pom.xml generator-docs - 14.1 + 14.2-SNAPSHOT jar ESA MO API Generator - Documentation diff --git a/api-generator/generator-interfaces/pom.xml b/api-generator/generator-interfaces/pom.xml index 138039b4..d038db73 100644 --- a/api-generator/generator-interfaces/pom.xml +++ b/api-generator/generator-interfaces/pom.xml @@ -19,12 +19,12 @@ int.esa.ccsds.mo parent - 14.1 + 14.2-SNAPSHOT ../../parent/pom.xml generator-interfaces - 14.1 + 14.2-SNAPSHOT jar ESA MO API Generator - Interfaces @@ -65,12 +65,12 @@ int.esa.ccsds.mo xml-ccsds-mo-prototypes - 14.1 + 14.2-SNAPSHOT int.esa.ccsds.mo xml-ccsds-mo-standards - 14.1 + 14.2-SNAPSHOT diff --git a/api-generator/generator-java/pom.xml b/api-generator/generator-java/pom.xml index 58eefe7d..cacc1997 100644 --- a/api-generator/generator-java/pom.xml +++ b/api-generator/generator-java/pom.xml @@ -19,12 +19,12 @@ int.esa.ccsds.mo parent - 14.1 + 14.2-SNAPSHOT ../../parent/pom.xml generator-java - 14.1 + 14.2-SNAPSHOT jar ESA MO API Generator - Java diff --git a/api-generator/pom.xml b/api-generator/pom.xml index 4fa11d83..ec3c1074 100644 --- a/api-generator/pom.xml +++ b/api-generator/pom.xml @@ -19,12 +19,12 @@ int.esa.ccsds.mo parent - 14.1 + 14.2-SNAPSHOT ../parent/pom.xml api-generator - 14.1 + 14.2-SNAPSHOT pom ESA MO API Generator diff --git a/apis/api-area001-v003-mal/pom.xml b/apis/api-area001-v003-mal/pom.xml index 1ef68576..9df2ae68 100644 --- a/apis/api-area001-v003-mal/pom.xml +++ b/apis/api-area001-v003-mal/pom.xml @@ -19,12 +19,12 @@ int.esa.ccsds.mo parent - 14.1 + 14.2-SNAPSHOT ../../parent/pom.xml api-area001-v003-mal - 14.1 + 14.2-SNAPSHOT jar ESA MO API - MAL v003 diff --git a/apis/api-area002-v001-com/pom.xml b/apis/api-area002-v001-com/pom.xml index 1c6a4e6e..a1aae269 100644 --- a/apis/api-area002-v001-com/pom.xml +++ b/apis/api-area002-v001-com/pom.xml @@ -19,12 +19,12 @@ int.esa.ccsds.mo parent - 14.1 + 14.2-SNAPSHOT ../../parent/pom.xml api-area002-v001-com - 14.1 + 14.2-SNAPSHOT jar ESA MO API - COM v001 diff --git a/apis/api-area003-v001-common/pom.xml b/apis/api-area003-v001-common/pom.xml index b5d2298e..44218bc0 100644 --- a/apis/api-area003-v001-common/pom.xml +++ b/apis/api-area003-v001-common/pom.xml @@ -19,12 +19,12 @@ int.esa.ccsds.mo parent - 14.1 + 14.2-SNAPSHOT ../../parent/pom.xml api-area003-v001-common - 14.1 + 14.2-SNAPSHOT jar ESA MO API - Common v001 diff --git a/apis/api-area004-v001-mc/pom.xml b/apis/api-area004-v001-mc/pom.xml index bd5d7bca..2b973f15 100644 --- a/apis/api-area004-v001-mc/pom.xml +++ b/apis/api-area004-v001-mc/pom.xml @@ -19,12 +19,12 @@ int.esa.ccsds.mo parent - 14.1 + 14.2-SNAPSHOT ../../parent/pom.xml api-area004-v001-mc - 14.1 + 14.2-SNAPSHOT jar ESA MO API - MC v001 diff --git a/apis/api-area004-v002-mc/pom.xml b/apis/api-area004-v002-mc/pom.xml index ca170c63..c2900e34 100644 --- a/apis/api-area004-v002-mc/pom.xml +++ b/apis/api-area004-v002-mc/pom.xml @@ -19,12 +19,12 @@ int.esa.ccsds.mo parent - 14.1 + 14.2-SNAPSHOT ../../parent/pom.xml api-area004-v002-mc - 14.1 + 14.2-SNAPSHOT jar ESA MO API - MC v002 diff --git a/apis/api-area005-v001-mps/pom.xml b/apis/api-area005-v001-mps/pom.xml index 6ed4f4a0..c4eabab1 100644 --- a/apis/api-area005-v001-mps/pom.xml +++ b/apis/api-area005-v001-mps/pom.xml @@ -19,12 +19,12 @@ int.esa.ccsds.mo parent - 14.1 + 14.2-SNAPSHOT ../../parent/pom.xml api-area005-v001-mps - 14.1 + 14.2-SNAPSHOT jar ESA MO API - MPS v001 diff --git a/apis/api-area009-v001-mpd/pom.xml b/apis/api-area009-v001-mpd/pom.xml index 59642d8e..d1498273 100644 --- a/apis/api-area009-v001-mpd/pom.xml +++ b/apis/api-area009-v001-mpd/pom.xml @@ -19,12 +19,12 @@ int.esa.ccsds.mo parent - 14.1 + 14.2-SNAPSHOT ../../parent/pom.xml api-area009-v001-mpd - 14.1 + 14.2-SNAPSHOT jar ESA MO API - MPD v001 diff --git a/apis/pom.xml b/apis/pom.xml index 31a859de..cc63f733 100644 --- a/apis/pom.xml +++ b/apis/pom.xml @@ -19,12 +19,12 @@ int.esa.ccsds.mo parent - 14.1 + 14.2-SNAPSHOT ../parent/pom.xml apis - 14.1 + 14.2-SNAPSHOT pom ESA MO APIs diff --git a/encodings/encoding-binary/pom.xml b/encodings/encoding-binary/pom.xml index b41d574d..2d4cd3a1 100644 --- a/encodings/encoding-binary/pom.xml +++ b/encodings/encoding-binary/pom.xml @@ -19,13 +19,13 @@ int.esa.ccsds.mo parent - 14.1 + 14.2-SNAPSHOT ../../parent/pom.xml encoding-binary jar - 14.1 + 14.2-SNAPSHOT ESA MO Encoder - Binary A simple Java binary encoder for the CCSDS MAL diff --git a/encodings/encoding-string/pom.xml b/encodings/encoding-string/pom.xml index 334eee14..b76cb7b6 100644 --- a/encodings/encoding-string/pom.xml +++ b/encodings/encoding-string/pom.xml @@ -19,13 +19,13 @@ int.esa.ccsds.mo parent - 14.1 + 14.2-SNAPSHOT ../../parent/pom.xml encoding-string jar - 14.1 + 14.2-SNAPSHOT ESA MO Encoder - String A simple Java String based encoder for the CCSDS MAL diff --git a/encodings/encoding-xml/pom.xml b/encodings/encoding-xml/pom.xml index 2130fae2..ff69aeb1 100644 --- a/encodings/encoding-xml/pom.xml +++ b/encodings/encoding-xml/pom.xml @@ -19,13 +19,13 @@ int.esa.ccsds.mo parent - 14.1 + 14.2-SNAPSHOT ../../parent/pom.xml encoding-xml jar - 14.1 + 14.2-SNAPSHOT ESA MO Encoder - XML A simple Java String based encoder for the CCSDS MAL diff --git a/encodings/pom.xml b/encodings/pom.xml index 18605409..63e6cc95 100644 --- a/encodings/pom.xml +++ b/encodings/pom.xml @@ -19,12 +19,12 @@ int.esa.ccsds.mo parent - 14.1 + 14.2-SNAPSHOT ../parent/pom.xml encodings - 14.1 + 14.2-SNAPSHOT pom ESA MO Encodings diff --git a/mal-impl/pom.xml b/mal-impl/pom.xml index 5d6afeed..1aa861d3 100644 --- a/mal-impl/pom.xml +++ b/mal-impl/pom.xml @@ -19,13 +19,13 @@ int.esa.ccsds.mo parent - 14.1 + 14.2-SNAPSHOT ../parent/pom.xml mal-impl jar - 14.1 + 14.2-SNAPSHOT ESA MO MAL Java Implementation The ESA implementation of the CCSDS MAL in Java diff --git a/parent/pom.xml b/parent/pom.xml index feac821c..2fa8ce6d 100644 --- a/parent/pom.xml +++ b/parent/pom.xml @@ -17,7 +17,7 @@ 4.0.0 int.esa.ccsds.mo parent - 14.1 + 14.2-SNAPSHOT pom ESA MO POM @@ -73,7 +73,7 @@ UTF-8 - 14.1 + 14.2-SNAPSHOT ${esa.mo.version} ${esa.mo.version} diff --git a/pom.xml b/pom.xml index d51204bb..543fc8f4 100644 --- a/pom.xml +++ b/pom.xml @@ -19,7 +19,7 @@ int.esa.ccsds.mo parent - 14.1 + 14.2-SNAPSHOT parent/pom.xml diff --git a/services-impl/pom.xml b/services-impl/pom.xml index 38146809..b83127fa 100644 --- a/services-impl/pom.xml +++ b/services-impl/pom.xml @@ -19,12 +19,12 @@ int.esa.ccsds.mo parent - 14.1 + 14.2-SNAPSHOT ../parent/pom.xml services-impl - 14.1 + 14.2-SNAPSHOT pom ESA MO Services Implementations diff --git a/services-impl/services-area003-v001-common/pom.xml b/services-impl/services-area003-v001-common/pom.xml index f7d80235..c09760e4 100644 --- a/services-impl/services-area003-v001-common/pom.xml +++ b/services-impl/services-area003-v001-common/pom.xml @@ -19,12 +19,12 @@ int.esa.ccsds.mo parent - 14.1 + 14.2-SNAPSHOT ../../parent/pom.xml services-area003-v001-common - 14.1 + 14.2-SNAPSHOT jar ESA MO Services - Common Services diff --git a/services-impl/services-area004-v002-mc/pom.xml b/services-impl/services-area004-v002-mc/pom.xml index 618f57d5..7e154bb9 100644 --- a/services-impl/services-area004-v002-mc/pom.xml +++ b/services-impl/services-area004-v002-mc/pom.xml @@ -19,12 +19,12 @@ int.esa.ccsds.mo parent - 14.1 + 14.2-SNAPSHOT ../../parent/pom.xml services-area004-v002-mc - 14.1 + 14.2-SNAPSHOT jar ESA MO Services - MC Services diff --git a/services-impl/services-area009-v001-mpd/pom.xml b/services-impl/services-area009-v001-mpd/pom.xml index 421cbe72..06b2e755 100644 --- a/services-impl/services-area009-v001-mpd/pom.xml +++ b/services-impl/services-area009-v001-mpd/pom.xml @@ -19,12 +19,12 @@ int.esa.ccsds.mo parent - 14.1 + 14.2-SNAPSHOT ../../parent/pom.xml services-area009-v001-mpd - 14.1 + 14.2-SNAPSHOT jar ESA MO Services - MPD Services diff --git a/testbeds/pom.xml b/testbeds/pom.xml index d7e4c02d..7b597e0e 100644 --- a/testbeds/pom.xml +++ b/testbeds/pom.xml @@ -19,12 +19,12 @@ int.esa.ccsds.mo parent - 14.1 + 14.2-SNAPSHOT ../parent/pom.xml testbeds - 14.1 + 14.2-SNAPSHOT pom ESA CCSDS Testbed reactor build diff --git a/testbeds/test-apis/pom.xml b/testbeds/test-apis/pom.xml index 0078e18a..168ad590 100644 --- a/testbeds/test-apis/pom.xml +++ b/testbeds/test-apis/pom.xml @@ -19,12 +19,12 @@ int.esa.ccsds.mo testbed-pom - 14.1 + 14.2-SNAPSHOT ../testbed-pom/pom.xml test-apis - 14.1 + 14.2-SNAPSHOT pom CCSDS MOIMS MO Testbed APIs diff --git a/testbeds/test-apis/test-api-com/pom.xml b/testbeds/test-apis/test-api-com/pom.xml index 073e184f..e5ee8f8e 100644 --- a/testbeds/test-apis/test-api-com/pom.xml +++ b/testbeds/test-apis/test-api-com/pom.xml @@ -19,12 +19,12 @@ int.esa.ccsds.mo testbed-pom - 14.1 + 14.2-SNAPSHOT ../../testbed-pom/pom.xml api-com-test - 14.1 + 14.2-SNAPSHOT jar CCSDS MOIMS MO Testbed API - COM diff --git a/testbeds/test-apis/test-api-mal/pom.xml b/testbeds/test-apis/test-api-mal/pom.xml index 55ae17b3..35828189 100644 --- a/testbeds/test-apis/test-api-mal/pom.xml +++ b/testbeds/test-apis/test-api-mal/pom.xml @@ -19,12 +19,12 @@ int.esa.ccsds.mo testbed-pom - 14.1 + 14.2-SNAPSHOT ../../testbed-pom/pom.xml api-mal-test - 14.1 + 14.2-SNAPSHOT jar CCSDS MOIMS MO Testbed API - MAL diff --git a/testbeds/test-apis/test-api-mc/pom.xml b/testbeds/test-apis/test-api-mc/pom.xml index 44a24b46..beddae45 100644 --- a/testbeds/test-apis/test-api-mc/pom.xml +++ b/testbeds/test-apis/test-api-mc/pom.xml @@ -19,12 +19,12 @@ int.esa.ccsds.mo testbed-pom - 14.1 + 14.2-SNAPSHOT ../../testbed-pom/pom.xml api-mc-test - 14.1 + 14.2-SNAPSHOT jar CCSDS MOIMS MO Testbed API - MC diff --git a/testbeds/testbed-com-framework/pom.xml b/testbeds/testbed-com-framework/pom.xml index 56dcbb8e..b68fa646 100644 --- a/testbeds/testbed-com-framework/pom.xml +++ b/testbeds/testbed-com-framework/pom.xml @@ -19,13 +19,13 @@ int.esa.ccsds.mo testbed-pom - 14.1 + 14.2-SNAPSHOT ../testbed-pom/pom.xml testbed-com-framework jar - 14.1 + 14.2-SNAPSHOT CCSDS MOIMS MO Testbed COM - Harness diff --git a/testbeds/testbed-com-provider-esa/pom.xml b/testbeds/testbed-com-provider-esa/pom.xml index d8016f98..d6fdf749 100644 --- a/testbeds/testbed-com-provider-esa/pom.xml +++ b/testbeds/testbed-com-provider-esa/pom.xml @@ -19,12 +19,12 @@ int.esa.ccsds.mo testbed-pom - 14.1 + 14.2-SNAPSHOT ../testbed-pom/pom.xml testbed-com-provider-esa - 14.1 + 14.2-SNAPSHOT jar CCSDS MOIMS MO Testbed COM - Provider Impl diff --git a/testbeds/testbed-com/pom.xml b/testbeds/testbed-com/pom.xml index 8188c2f3..b9fb8501 100644 --- a/testbeds/testbed-com/pom.xml +++ b/testbeds/testbed-com/pom.xml @@ -19,13 +19,13 @@ int.esa.ccsds.mo testbed-pom - 14.1 + 14.2-SNAPSHOT ../testbed-pom/pom.xml testbed-com jar - 14.1 + 14.2-SNAPSHOT CCSDS MOIMS MO Testbed for COM diff --git a/testbeds/testbed-encoders/pom.xml b/testbeds/testbed-encoders/pom.xml index 0e9b567f..9280bf09 100644 --- a/testbeds/testbed-encoders/pom.xml +++ b/testbeds/testbed-encoders/pom.xml @@ -19,13 +19,13 @@ int.esa.ccsds.mo parent - 14.1 + 14.2-SNAPSHOT ../../testbed-pom/pom.xml testbed-encoders jar - 14.1 + 14.2-SNAPSHOT CCSDS MOIMS MO Testbed Encoders diff --git a/testbeds/testbed-mal/pom.xml b/testbeds/testbed-mal/pom.xml index 37ef6271..b49fb23b 100644 --- a/testbeds/testbed-mal/pom.xml +++ b/testbeds/testbed-mal/pom.xml @@ -19,13 +19,13 @@ int.esa.ccsds.mo testbed-pom - 14.1 + 14.2-SNAPSHOT ../testbed-pom/pom.xml testbed-mal jar - 14.1 + 14.2-SNAPSHOT CCSDS MOIMS MO Testbed for MAL diff --git a/testbeds/testbed-malspp-framework/pom.xml b/testbeds/testbed-malspp-framework/pom.xml index 94c1980f..d7c5e00c 100644 --- a/testbeds/testbed-malspp-framework/pom.xml +++ b/testbeds/testbed-malspp-framework/pom.xml @@ -40,14 +40,14 @@ int.esa.ccsds.mo testbed-pom - 14.1 + 14.2-SNAPSHOT ../testbed-pom/pom.xml int.esa.ccsds.mo testbed-malspp-framework jar - 14.1 + 14.2-SNAPSHOT CCSDS MOIMS MO Testbed Framework for MAL/SPP Binding diff --git a/testbeds/testbed-malspp/pom.xml b/testbeds/testbed-malspp/pom.xml index 50e189af..3b38aad3 100644 --- a/testbeds/testbed-malspp/pom.xml +++ b/testbeds/testbed-malspp/pom.xml @@ -40,14 +40,14 @@ int.esa.ccsds.mo testbed-pom - 14.1 + 14.2-SNAPSHOT ../testbed-pom/pom.xml int.esa.ccsds.mo testbed-malspp jar - 14.1 + 14.2-SNAPSHOT CCSDS MOIMS MO Testbed for MAL/SPP Binding diff --git a/testbeds/testbed-mc/pom.xml b/testbeds/testbed-mc/pom.xml index 43eac22d..01150d51 100644 --- a/testbeds/testbed-mc/pom.xml +++ b/testbeds/testbed-mc/pom.xml @@ -19,13 +19,13 @@ int.esa.ccsds.mo testbed-pom - 14.1 + 14.2-SNAPSHOT ../testbed-pom/pom.xml testbed-mc jar - 14.1 + 14.2-SNAPSHOT CCSDS MOIMS MO Testbed MC diff --git a/testbeds/testbed-mpd/pom.xml b/testbeds/testbed-mpd/pom.xml index a0e86a71..0947915c 100644 --- a/testbeds/testbed-mpd/pom.xml +++ b/testbeds/testbed-mpd/pom.xml @@ -19,14 +19,14 @@ int.esa.ccsds.mo parent - 14.1 + 14.2-SNAPSHOT ../../parent/pom.xml int.esa.ccsds.mo testbed-mpd jar - 14.1 + 14.2-SNAPSHOT CCSDS MOIMS MO Testbed MPD diff --git a/testbeds/testbed-pom/pom.xml b/testbeds/testbed-pom/pom.xml index b6a1def8..deb5b391 100644 --- a/testbeds/testbed-pom/pom.xml +++ b/testbeds/testbed-pom/pom.xml @@ -19,13 +19,13 @@ int.esa.ccsds.mo parent - 14.1 + 14.2-SNAPSHOT ../../parent/pom.xml testbed-pom pom - 14.1 + 14.2-SNAPSHOT CCSDS MOIMS MO Testbed POM diff --git a/testbeds/testbed-util-spp/pom.xml b/testbeds/testbed-util-spp/pom.xml index 81b1f269..cf30effd 100644 --- a/testbeds/testbed-util-spp/pom.xml +++ b/testbeds/testbed-util-spp/pom.xml @@ -40,14 +40,14 @@ int.esa.ccsds.mo testbed-pom - 14.1 + 14.2-SNAPSHOT ../testbed-pom/pom.xml int.esa.ccsds.mo testbed-util-spp jar - 14.1 + 14.2-SNAPSHOT CCSDS MOIMS MO Testbed utilities for the Space Packet Protocol diff --git a/testbeds/testbed-util/pom.xml b/testbeds/testbed-util/pom.xml index 508321e3..4f95fe3b 100644 --- a/testbeds/testbed-util/pom.xml +++ b/testbeds/testbed-util/pom.xml @@ -19,13 +19,13 @@ int.esa.ccsds.mo testbed-pom - 14.1 + 14.2-SNAPSHOT ../testbed-pom/pom.xml testbed-util jar - 14.1 + 14.2-SNAPSHOT CCSDS MOIMS MO Testbed utilities diff --git a/testbeds/xml-tests/pom.xml b/testbeds/xml-tests/pom.xml index 118c08b1..6dc3b616 100644 --- a/testbeds/xml-tests/pom.xml +++ b/testbeds/xml-tests/pom.xml @@ -18,7 +18,7 @@ int.esa.ccsds.mo xml-tests - 14.1 + 14.2-SNAPSHOT jar CCSDS MOIMS MO Testbed XML diff --git a/tooling/basic-demo/pom.xml b/tooling/basic-demo/pom.xml index 6de8601b..7f1c7989 100644 --- a/tooling/basic-demo/pom.xml +++ b/tooling/basic-demo/pom.xml @@ -19,13 +19,13 @@ int.esa.ccsds.mo parent - 14.1 + 14.2-SNAPSHOT ../../parent/pom.xml basic-demo jar - 14.1 + 14.2-SNAPSHOT ESA MO Java Demo A Demo Java application for the CCSDS MAL diff --git a/tooling/mo-navigator/pom.xml b/tooling/mo-navigator/pom.xml index 9d21153f..39a1c261 100644 --- a/tooling/mo-navigator/pom.xml +++ b/tooling/mo-navigator/pom.xml @@ -19,13 +19,13 @@ int.esa.ccsds.mo parent - 14.1 + 14.2-SNAPSHOT ../../parent/pom.xml int.esa.ccsds.mo mo-navigator - 14.1 + 14.2-SNAPSHOT jar ESA MO Navigator diff --git a/tooling/pom.xml b/tooling/pom.xml index 745ce085..cd6dae94 100644 --- a/tooling/pom.xml +++ b/tooling/pom.xml @@ -19,12 +19,12 @@ int.esa.ccsds.mo parent - 14.1 + 14.2-SNAPSHOT ../parent/pom.xml tooling - 14.1 + 14.2-SNAPSHOT pom ESA MO Tooling diff --git a/tooling/simple-mo-consumer/pom.xml b/tooling/simple-mo-consumer/pom.xml index b9455e45..b4d17de8 100644 --- a/tooling/simple-mo-consumer/pom.xml +++ b/tooling/simple-mo-consumer/pom.xml @@ -7,12 +7,12 @@ int.esa.ccsds.mo parent - 14.1 + 14.2-SNAPSHOT ../../parent/pom.xml simple-mo-consumer - 14.1 + 14.2-SNAPSHOT jar Simple MO Consumer diff --git a/tooling/simple-mo-provider/pom.xml b/tooling/simple-mo-provider/pom.xml index 45979aba..b79b890d 100644 --- a/tooling/simple-mo-provider/pom.xml +++ b/tooling/simple-mo-provider/pom.xml @@ -7,12 +7,12 @@ int.esa.ccsds.mo parent - 14.1 + 14.2-SNAPSHOT ../../parent/pom.xml simple-mo-provider - 14.1 + 14.2-SNAPSHOT jar Simple MO Provider diff --git a/tooling/transport-bridge/pom.xml b/tooling/transport-bridge/pom.xml index fc9b1198..78abc605 100644 --- a/tooling/transport-bridge/pom.xml +++ b/tooling/transport-bridge/pom.xml @@ -19,12 +19,12 @@ int.esa.ccsds.mo parent - 14.1 + 14.2-SNAPSHOT ../../parent/pom.xml transport-bridge - 14.1 + 14.2-SNAPSHOT jar ESA MO Transport Bridge diff --git a/transports/pom.xml b/transports/pom.xml index 1e147a82..3bb5914c 100644 --- a/transports/pom.xml +++ b/transports/pom.xml @@ -19,12 +19,12 @@ int.esa.ccsds.mo parent - 14.1 + 14.2-SNAPSHOT ../parent/pom.xml transports - 14.1 + 14.2-SNAPSHOT pom ESA MO Transports diff --git a/transports/transport-file/pom.xml b/transports/transport-file/pom.xml index d3b6e653..a2f74a6b 100644 --- a/transports/transport-file/pom.xml +++ b/transports/transport-file/pom.xml @@ -19,13 +19,13 @@ int.esa.ccsds.mo parent - 14.1 + 14.2-SNAPSHOT ../../parent/pom.xml transport-file jar - 14.1 + 14.2-SNAPSHOT ESA MO Transport - File A Java File based transport for CCSDS MAL diff --git a/transports/transport-generic/pom.xml b/transports/transport-generic/pom.xml index 5520c45a..72812017 100644 --- a/transports/transport-generic/pom.xml +++ b/transports/transport-generic/pom.xml @@ -19,13 +19,13 @@ int.esa.ccsds.mo parent - 14.1 + 14.2-SNAPSHOT ../../parent/pom.xml transport-generic jar - 14.1 + 14.2-SNAPSHOT ESA MO Transport - Generic Framework A base Java framework for CCSDS MAL transports diff --git a/transports/transport-http/pom.xml b/transports/transport-http/pom.xml index f7653eff..640b1340 100644 --- a/transports/transport-http/pom.xml +++ b/transports/transport-http/pom.xml @@ -19,13 +19,13 @@ int.esa.ccsds.mo parent - 14.1 + 14.2-SNAPSHOT ../../parent/pom.xml transport-http jar - 14.1 + 14.2-SNAPSHOT ESA MO Transport - HTTP A Java HTTP transport for CCSDS MAL diff --git a/transports/transport-rmi/pom.xml b/transports/transport-rmi/pom.xml index 770f876e..51752149 100644 --- a/transports/transport-rmi/pom.xml +++ b/transports/transport-rmi/pom.xml @@ -19,13 +19,13 @@ int.esa.ccsds.mo parent - 14.1 + 14.2-SNAPSHOT ../../parent/pom.xml transport-rmi jar - 14.1 + 14.2-SNAPSHOT ESA MO Transport - RMI A Java RMI transport for CCSDS MAL diff --git a/transports/transport-spp/pom.xml b/transports/transport-spp/pom.xml index f50c415d..e7f05c86 100644 --- a/transports/transport-spp/pom.xml +++ b/transports/transport-spp/pom.xml @@ -19,13 +19,13 @@ int.esa.ccsds.mo parent - 14.1 + 14.2-SNAPSHOT ../../parent/pom.xml transport-spp jar - 14.1 + 14.2-SNAPSHOT ESA MO Transport - SPP A Java SPP transport for CCSDS MAL diff --git a/transports/transport-tcpip/pom.xml b/transports/transport-tcpip/pom.xml index 8fbb7e73..75ac0626 100644 --- a/transports/transport-tcpip/pom.xml +++ b/transports/transport-tcpip/pom.xml @@ -19,12 +19,12 @@ int.esa.ccsds.mo parent - 14.1 + 14.2-SNAPSHOT ../../parent/pom.xml transport-tcpip - 14.1 + 14.2-SNAPSHOT jar ESA MO Transport - TCP/IP diff --git a/transports/transport-zmtp/pom.xml b/transports/transport-zmtp/pom.xml index a293064a..fd5a1ee2 100644 --- a/transports/transport-zmtp/pom.xml +++ b/transports/transport-zmtp/pom.xml @@ -19,13 +19,13 @@ int.esa.ccsds.mo parent - 14.1 + 14.2-SNAPSHOT ../../parent/pom.xml transport-zmtp jar - 14.1 + 14.2-SNAPSHOT ESA MO Transport - ZMTP A Java ZeroMQ Transport Protocol binding for CCSDS MAL diff --git a/xml-service-specifications/pom.xml b/xml-service-specifications/pom.xml index 0c5e85bb..c8b67174 100644 --- a/xml-service-specifications/pom.xml +++ b/xml-service-specifications/pom.xml @@ -19,13 +19,13 @@ int.esa.ccsds.mo parent - 14.1 + 14.2-SNAPSHOT ../parent/pom.xml int.esa.ccsds.mo xml-service-specifications - 14.1 + 14.2-SNAPSHOT pom ESA MO XML specifications diff --git a/xml-service-specifications/xml-ccsds-mo-prototypes/pom.xml b/xml-service-specifications/xml-ccsds-mo-prototypes/pom.xml index 757918d5..c872429a 100644 --- a/xml-service-specifications/xml-ccsds-mo-prototypes/pom.xml +++ b/xml-service-specifications/xml-ccsds-mo-prototypes/pom.xml @@ -19,13 +19,13 @@ int.esa.ccsds.mo parent - 14.1 + 14.2-SNAPSHOT ../../parent/pom.xml int.esa.ccsds.mo xml-ccsds-mo-prototypes - 14.1 + 14.2-SNAPSHOT jar ESA MO XML specifications - MO Prototypes diff --git a/xml-service-specifications/xml-ccsds-mo-standards/pom.xml b/xml-service-specifications/xml-ccsds-mo-standards/pom.xml index 545c50bf..2ce6bbca 100644 --- a/xml-service-specifications/xml-ccsds-mo-standards/pom.xml +++ b/xml-service-specifications/xml-ccsds-mo-standards/pom.xml @@ -19,13 +19,13 @@ int.esa.ccsds.mo parent - 14.1 + 14.2-SNAPSHOT ../../parent/pom.xml int.esa.ccsds.mo xml-ccsds-mo-standards - 14.1 + 14.2-SNAPSHOT jar ESA MO XML specifications - MO Standards From 3c569b2c74472fc4ff85cb0fe8afb9aec7e1dafe Mon Sep 17 00:00:00 2001 From: Cesar Coelho Date: Sat, 18 Jul 2026 15:02:06 +0200 Subject: [PATCH 02/45] Key the CI Maven caches per commit to avoid stale artifacts The testbeds workflow passes built artifacts down a job chain via the Maven local repository cache. The keys were rotated weekly by date, but actions/cache keys are immutable (written only on a miss), so after a change within the same week the build jobs restored a stale cache and could not re-save, and downstream jobs tested against outdated artifacts. The version bump to 14.2-SNAPSHOT surfaced this sharply. Key every artifact-passing cache on github.sha so each commit gets its own cache. The root build jobs restore before building (with a restore-keys prefix to keep external dependencies warm) and save the freshly built artifacts; downstream jobs restore the exact-SHA cache with no fallback, so they always get the current commit's build. Also removes the now-unused Get Date steps. Co-Authored-By: Claude Opus 4.8 --- .github/workflows/testbeds.yml | 207 +++++++-------------------------- 1 file changed, 44 insertions(+), 163 deletions(-) diff --git a/.github/workflows/testbeds.yml b/.github/workflows/testbeds.yml index a112d21b..30d70bbc 100644 --- a/.github/workflows/testbeds.yml +++ b/.github/workflows/testbeds.yml @@ -6,99 +6,80 @@ jobs: build-jdk8: runs-on: ubuntu-latest - env: - DATE_FILE: ./date.txt steps: - - name: Get Date - id: get-date - run: | - echo "date=$(/bin/date -u "+%Y-week-%U")" >> $GITHUB_OUTPUT - shell: bash - uses: actions/checkout@v4 - uses: actions/setup-java@v4 with: java-version: '8' distribution: 'temurin' - - name: Run Maven install - run: mvn --batch-mode --update-snapshots -P ESA -DskipTests clean install - name: Cache Maven local repository uses: actions/cache@v4 with: path: ~/.m2/repository - key: ${{ runner.os }}-maven-mo-services-java-jdk8-${{ steps.get-date.outputs.date }} + key: ${{ runner.os }}-maven-mo-services-java-jdk8-${{ github.sha }} + restore-keys: | + ${{ runner.os }}-maven-mo-services-java-jdk8- + - name: Run Maven install + run: mvn --batch-mode --update-snapshots -P ESA -DskipTests clean install build-jdk11: runs-on: ubuntu-latest steps: - - name: Get Date - id: get-date - run: | - echo "date=$(/bin/date -u "+%Y-week-%U")" >> $GITHUB_OUTPUT - shell: bash - uses: actions/checkout@v4 - uses: actions/setup-java@v4 with: java-version: '11' distribution: 'temurin' - - name: Run Maven install - run: mvn --batch-mode --update-snapshots -P ESA -DskipTests clean install - name: Cache Maven local repository uses: actions/cache@v4 with: path: ~/.m2/repository - key: ${{ runner.os }}-maven-mo-services-java-jdk11-${{ steps.get-date.outputs.date }} + key: ${{ runner.os }}-maven-mo-services-java-jdk11-${{ github.sha }} + restore-keys: | + ${{ runner.os }}-maven-mo-services-java-jdk11- + - name: Run Maven install + run: mvn --batch-mode --update-snapshots -P ESA -DskipTests clean install build-jdk17: runs-on: ubuntu-latest steps: - - name: Get Date - id: get-date - run: | - echo "date=$(/bin/date -u "+%Y-week-%U")" >> $GITHUB_OUTPUT - shell: bash - uses: actions/checkout@v4 - uses: actions/setup-java@v4 with: java-version: '17' distribution: 'temurin' - - name: Run Maven install - run: mvn --batch-mode --update-snapshots -P ESA -DskipTests clean install - name: Cache Maven local repository uses: actions/cache@v4 with: path: ~/.m2/repository - key: ${{ runner.os }}-maven-mo-services-java-jdk17-${{ steps.get-date.outputs.date }} + key: ${{ runner.os }}-maven-mo-services-java-jdk17-${{ github.sha }} + restore-keys: | + ${{ runner.os }}-maven-mo-services-java-jdk17- + - name: Run Maven install + run: mvn --batch-mode --update-snapshots -P ESA -DskipTests clean install build-jdk21: runs-on: ubuntu-latest steps: - - name: Get Date - id: get-date - run: | - echo "date=$(/bin/date -u "+%Y-week-%U")" >> $GITHUB_OUTPUT - shell: bash - uses: actions/checkout@v4 - uses: actions/setup-java@v4 with: java-version: '21' distribution: 'temurin' - - name: Run Maven install - run: mvn --batch-mode --update-snapshots -P ESA -DskipTests install - name: Cache Maven local repository uses: actions/cache@v4 with: path: ~/.m2/repository - key: ${{ runner.os }}-maven-mo-services-java-jdk21-${{ steps.get-date.outputs.date }} + key: ${{ runner.os }}-maven-mo-services-java-jdk21-${{ github.sha }} + restore-keys: | + ${{ runner.os }}-maven-mo-services-java-jdk21- + - name: Run Maven install + run: mvn --batch-mode --update-snapshots -P ESA -DskipTests install build-testbeds-jdk11: needs: build-jdk11 runs-on: ubuntu-latest steps: - - name: Get Date - id: get-date - run: | - echo "date=$(/bin/date -u "+%Y-week-%U")" >> $GITHUB_OUTPUT - shell: bash - uses: actions/checkout@v4 - uses: actions/setup-java@v4 with: @@ -108,7 +89,7 @@ jobs: uses: actions/cache@v4 with: path: ~/.m2/repository - key: ${{ runner.os }}-maven-mo-services-java-jdk11-${{ steps.get-date.outputs.date }} + key: ${{ runner.os }}-maven-mo-services-java-jdk11-${{ github.sha }} - name: Run the testbeds install # run: mvn --batch-mode --update-snapshots -pl '!testbed-malspp-framework,!testbed-malspp' -P ESA -DskipTests clean install # disable malspp for now run: mvn --batch-mode --update-snapshots -P ESA -DskipTests clean install @@ -117,17 +98,12 @@ jobs: uses: actions/cache@v4 with: path: ~/.m2/repository - key: ${{ runner.os }}-maven-mo-testbeds-jdk11-${{ steps.get-date.outputs.date }} + key: ${{ runner.os }}-maven-mo-testbeds-jdk11-${{ github.sha }} build-testbeds-jdk17: needs: build-jdk17 runs-on: ubuntu-latest steps: - - name: Get Date - id: get-date - run: | - echo "date=$(/bin/date -u "+%Y-week-%U")" >> $GITHUB_OUTPUT - shell: bash - uses: actions/checkout@v4 - uses: actions/setup-java@v4 with: @@ -137,7 +113,7 @@ jobs: uses: actions/cache@v4 with: path: ~/.m2/repository - key: ${{ runner.os }}-maven-mo-services-java-jdk17-${{ steps.get-date.outputs.date }} + key: ${{ runner.os }}-maven-mo-services-java-jdk17-${{ github.sha }} - name: Run the testbeds install # run: mvn --batch-mode --update-snapshots -pl '!testbed-malspp-framework,!testbed-malspp' -P ESA -DskipTests clean install # disable malspp for now run: mvn --batch-mode --update-snapshots -P ESA -DskipTests clean install @@ -146,17 +122,12 @@ jobs: uses: actions/cache@v4 with: path: ~/.m2/repository - key: ${{ runner.os }}-maven-mo-testbeds-jdk17-${{ steps.get-date.outputs.date }} + key: ${{ runner.os }}-maven-mo-testbeds-jdk17-${{ github.sha }} build-testbeds-jdk21: needs: build-jdk21 runs-on: ubuntu-latest steps: - - name: Get Date - id: get-date - run: | - echo "date=$(/bin/date -u "+%Y-week-%U")" >> $GITHUB_OUTPUT - shell: bash - uses: actions/checkout@v4 - uses: actions/setup-java@v4 with: @@ -166,7 +137,7 @@ jobs: uses: actions/cache@v4 with: path: ~/.m2/repository - key: ${{ runner.os }}-maven-mo-services-java-jdk21-${{ steps.get-date.outputs.date }} + key: ${{ runner.os }}-maven-mo-services-java-jdk21-${{ github.sha }} - name: Run the testbeds install # run: mvn --batch-mode --update-snapshots -pl '!testbed-malspp-framework,!testbed-malspp' -P ESA -DskipTests install # disable malspp for now run: mvn --batch-mode --update-snapshots -P ESA -DskipTests clean install @@ -175,17 +146,12 @@ jobs: uses: actions/cache@v4 with: path: ~/.m2/repository - key: ${{ runner.os }}-maven-mo-testbeds-jdk21-${{ steps.get-date.outputs.date }} + key: ${{ runner.os }}-maven-mo-testbeds-jdk21-${{ github.sha }} testbed-mal-jdk11-rmi: needs: build-testbeds-jdk11 runs-on: ubuntu-latest steps: - - name: Get Date - id: get-date - run: | - echo "date=$(/bin/date -u "+%Y-week-%U")" >> $GITHUB_OUTPUT - shell: bash - uses: actions/checkout@v4 - uses: actions/setup-java@v4 with: @@ -195,7 +161,7 @@ jobs: uses: actions/cache@v4 with: path: ~/.m2/repository - key: ${{ runner.os }}-maven-mo-testbeds-jdk11-${{ steps.get-date.outputs.date }} + key: ${{ runner.os }}-maven-mo-testbeds-jdk11-${{ github.sha }} - name: Run the Testbed for MAL run: mvn --batch-mode --update-snapshots -P ESA test working-directory: testbeds/testbed-mal @@ -210,11 +176,6 @@ jobs: needs: build-testbeds-jdk11 runs-on: ubuntu-latest steps: - - name: Get Date - id: get-date - run: | - echo "date=$(/bin/date -u "+%Y-week-%U")" >> $GITHUB_OUTPUT - shell: bash - uses: actions/checkout@v4 - uses: actions/setup-java@v4 with: @@ -224,7 +185,7 @@ jobs: uses: actions/cache@v4 with: path: ~/.m2/repository - key: ${{ runner.os }}-maven-mo-testbeds-jdk11-${{ steps.get-date.outputs.date }} + key: ${{ runner.os }}-maven-mo-testbeds-jdk11-${{ github.sha }} - name: Run the Testbed for MAL run: mvn --batch-mode --update-snapshots -P ESA_TCPIP test working-directory: testbeds/testbed-mal @@ -240,11 +201,6 @@ jobs: needs: build-testbeds-jdk11 runs-on: ubuntu-latest steps: - - name: Get Date - id: get-date - run: | - echo "date=$(/bin/date -u "+%Y-week-%U")" >> $GITHUB_OUTPUT - shell: bash - uses: actions/checkout@v4 - uses: actions/setup-java@v4 with: @@ -255,7 +211,7 @@ jobs: uses: actions/cache@v4 with: path: ~/.m2/repository - key: ${{ runner.os }}-maven-mo-testbeds-jdk11-${{ steps.get-date.outputs.date }} + key: ${{ runner.os }}-maven-mo-testbeds-jdk11-${{ github.sha }} - name: Run the Testbed for MAL run: mvn --batch-mode --update-snapshots -P ESA_HTTP test working-directory: testbeds/testbed-mal @@ -270,11 +226,6 @@ jobs: needs: build-testbeds-jdk11 runs-on: ubuntu-latest steps: - - name: Get Date - id: get-date - run: | - echo "date=$(/bin/date -u "+%Y-week-%U")" >> $GITHUB_OUTPUT - shell: bash - uses: actions/checkout@v4 - uses: actions/setup-java@v4 with: @@ -284,7 +235,7 @@ jobs: uses: actions/cache@v4 with: path: ~/.m2/repository - key: ${{ runner.os }}-maven-mo-testbeds-jdk11-${{ steps.get-date.outputs.date }} + key: ${{ runner.os }}-maven-mo-testbeds-jdk11-${{ github.sha }} - name: Run the Testbed for MAL run: mvn --batch-mode --update-snapshots -P ESA_ZMTP test working-directory: testbeds/testbed-mal @@ -299,11 +250,6 @@ jobs: needs: build-testbeds-jdk17 runs-on: ubuntu-latest steps: - - name: Get Date - id: get-date - run: | - echo "date=$(/bin/date -u "+%Y-week-%U")" >> $GITHUB_OUTPUT - shell: bash - uses: actions/checkout@v4 - uses: actions/setup-java@v4 with: @@ -313,7 +259,7 @@ jobs: uses: actions/cache@v4 with: path: ~/.m2/repository - key: ${{ runner.os }}-maven-mo-testbeds-jdk17-${{ steps.get-date.outputs.date }} + key: ${{ runner.os }}-maven-mo-testbeds-jdk17-${{ github.sha }} - name: Run the Testbed for MAL run: mvn --batch-mode --update-snapshots -P ESA test working-directory: testbeds/testbed-mal @@ -328,11 +274,6 @@ jobs: needs: build-testbeds-jdk21 runs-on: ubuntu-latest steps: - - name: Get Date - id: get-date - run: | - echo "date=$(/bin/date -u "+%Y-week-%U")" >> $GITHUB_OUTPUT - shell: bash - uses: actions/checkout@v4 - uses: actions/setup-java@v4 with: @@ -342,7 +283,7 @@ jobs: uses: actions/cache@v4 with: path: ~/.m2/repository - key: ${{ runner.os }}-maven-mo-testbeds-jdk21-${{ steps.get-date.outputs.date }} + key: ${{ runner.os }}-maven-mo-testbeds-jdk21-${{ github.sha }} - name: Run the Testbed for MAL run: mvn --batch-mode --update-snapshots -P ESA test working-directory: testbeds/testbed-mal @@ -357,11 +298,6 @@ jobs: needs: build-testbeds-jdk11 runs-on: ubuntu-latest steps: - - name: Get Date - id: get-date - run: | - echo "date=$(/bin/date -u "+%Y-week-%U")" >> $GITHUB_OUTPUT - shell: bash - uses: actions/checkout@v4 - uses: actions/setup-java@v4 with: @@ -371,7 +307,7 @@ jobs: uses: actions/cache@v4 with: path: ~/.m2/repository - key: ${{ runner.os }}-maven-mo-testbeds-jdk11-${{ steps.get-date.outputs.date }} + key: ${{ runner.os }}-maven-mo-testbeds-jdk11-${{ github.sha }} - name: Run the Testbed for COM run: mvn --batch-mode --update-snapshots -P ESA test working-directory: testbeds/testbed-com @@ -386,11 +322,6 @@ jobs: needs: build-testbeds-jdk11 runs-on: ubuntu-latest steps: - - name: Get Date - id: get-date - run: | - echo "date=$(/bin/date -u "+%Y-week-%U")" >> $GITHUB_OUTPUT - shell: bash - uses: actions/checkout@v4 - uses: actions/setup-java@v4 with: @@ -400,7 +331,7 @@ jobs: uses: actions/cache@v4 with: path: ~/.m2/repository - key: ${{ runner.os }}-maven-mo-testbeds-jdk11-${{ steps.get-date.outputs.date }} + key: ${{ runner.os }}-maven-mo-testbeds-jdk11-${{ github.sha }} - name: Run the Testbed for MPD run: mvn --batch-mode --update-snapshots -P ESA test working-directory: testbeds/testbed-mpd @@ -415,11 +346,6 @@ jobs: needs: build-testbeds-jdk17 runs-on: ubuntu-latest steps: - - name: Get Date - id: get-date - run: | - echo "date=$(/bin/date -u "+%Y-week-%U")" >> $GITHUB_OUTPUT - shell: bash - uses: actions/checkout@v4 - uses: actions/setup-java@v4 with: @@ -429,7 +355,7 @@ jobs: uses: actions/cache@v4 with: path: ~/.m2/repository - key: ${{ runner.os }}-maven-mo-testbeds-jdk17-${{ steps.get-date.outputs.date }} + key: ${{ runner.os }}-maven-mo-testbeds-jdk17-${{ github.sha }} - name: Run the Testbed for MPD run: mvn --batch-mode --update-snapshots -P ESA test working-directory: testbeds/testbed-mpd @@ -444,11 +370,6 @@ jobs: needs: build-testbeds-jdk21 runs-on: ubuntu-latest steps: - - name: Get Date - id: get-date - run: | - echo "date=$(/bin/date -u "+%Y-week-%U")" >> $GITHUB_OUTPUT - shell: bash - uses: actions/checkout@v4 - uses: actions/setup-java@v4 with: @@ -458,7 +379,7 @@ jobs: uses: actions/cache@v4 with: path: ~/.m2/repository - key: ${{ runner.os }}-maven-mo-testbeds-jdk21-${{ steps.get-date.outputs.date }} + key: ${{ runner.os }}-maven-mo-testbeds-jdk21-${{ github.sha }} - name: Run the Testbed for MPD run: mvn --batch-mode --update-snapshots -P ESA test working-directory: testbeds/testbed-mpd @@ -473,11 +394,6 @@ jobs: needs: build-testbeds-jdk17 runs-on: ubuntu-latest steps: - - name: Get Date - id: get-date - run: | - echo "date=$(/bin/date -u "+%Y-week-%U")" >> $GITHUB_OUTPUT - shell: bash - uses: actions/checkout@v4 - uses: actions/setup-java@v4 with: @@ -487,7 +403,7 @@ jobs: uses: actions/cache@v4 with: path: ~/.m2/repository - key: ${{ runner.os }}-maven-mo-testbeds-jdk17-${{ steps.get-date.outputs.date }} + key: ${{ runner.os }}-maven-mo-testbeds-jdk17-${{ github.sha }} - name: Run the Testbed for COM run: mvn --batch-mode --update-snapshots -P ESA test working-directory: testbeds/testbed-com @@ -502,11 +418,6 @@ jobs: needs: build-testbeds-jdk21 runs-on: ubuntu-latest steps: - - name: Get Date - id: get-date - run: | - echo "date=$(/bin/date -u "+%Y-week-%U")" >> $GITHUB_OUTPUT - shell: bash - uses: actions/checkout@v4 - uses: actions/setup-java@v4 with: @@ -516,7 +427,7 @@ jobs: uses: actions/cache@v4 with: path: ~/.m2/repository - key: ${{ runner.os }}-maven-mo-testbeds-jdk21-${{ steps.get-date.outputs.date }} + key: ${{ runner.os }}-maven-mo-testbeds-jdk21-${{ github.sha }} - name: Run the Testbed for COM run: mvn --batch-mode --update-snapshots -P ESA test working-directory: testbeds/testbed-com @@ -532,11 +443,6 @@ jobs: needs: build-testbeds-jdk11 runs-on: ubuntu-latest steps: - - name: Get Date - id: get-date - run: | - echo "date=$(/bin/date -u "+%Y-week-%U")" >> $GITHUB_OUTPUT - shell: bash - uses: actions/checkout@v4 - uses: actions/setup-java@v4 with: @@ -546,7 +452,7 @@ jobs: uses: actions/cache@v4 with: path: ~/.m2/repository - key: ${{ runner.os }}-maven-mo-testbeds-jdk11-${{ steps.get-date.outputs.date }} + key: ${{ runner.os }}-maven-mo-testbeds-jdk11-${{ github.sha }} - name: Run the Testbed for MAL/SPP run: mvn --batch-mode --update-snapshots -P DLR test working-directory: testbeds/testbed-malspp @@ -562,11 +468,6 @@ jobs: needs: build-testbeds-jdk17 runs-on: ubuntu-latest steps: - - name: Get Date - id: get-date - run: | - echo "date=$(/bin/date -u "+%Y-week-%U")" >> $GITHUB_OUTPUT - shell: bash - uses: actions/checkout@v4 - uses: actions/setup-java@v4 with: @@ -576,7 +477,7 @@ jobs: uses: actions/cache@v4 with: path: ~/.m2/repository - key: ${{ runner.os }}-maven-mo-testbeds-jdk17-${{ steps.get-date.outputs.date }} + key: ${{ runner.os }}-maven-mo-testbeds-jdk17-${{ github.sha }} - name: Run the Testbed for MAL/SPP run: mvn --batch-mode --update-snapshots -P DLR test working-directory: testbeds/testbed-malspp @@ -592,11 +493,6 @@ jobs: needs: build-testbeds-jdk21 runs-on: ubuntu-latest steps: - - name: Get Date - id: get-date - run: | - echo "date=$(/bin/date -u "+%Y-week-%U")" >> $GITHUB_OUTPUT - shell: bash - uses: actions/checkout@v4 - uses: actions/setup-java@v4 with: @@ -606,7 +502,7 @@ jobs: uses: actions/cache@v4 with: path: ~/.m2/repository - key: ${{ runner.os }}-maven-mo-testbeds-jdk21-${{ steps.get-date.outputs.date }} + key: ${{ runner.os }}-maven-mo-testbeds-jdk21-${{ github.sha }} - name: Run the Testbed for MAL/SPP run: mvn --batch-mode --update-snapshots -P DLR test working-directory: testbeds/testbed-malspp @@ -621,11 +517,6 @@ jobs: needs: build-testbeds-jdk11 runs-on: ubuntu-latest steps: - - name: Get Date - id: get-date - run: | - echo "date=$(/bin/date -u "+%Y-week-%U")" >> $GITHUB_OUTPUT - shell: bash - uses: actions/checkout@v4 - uses: actions/setup-java@v4 with: @@ -635,7 +526,7 @@ jobs: uses: actions/cache@v4 with: path: ~/.m2/repository - key: ${{ runner.os }}-maven-mo-testbeds-jdk11-${{ steps.get-date.outputs.date }} + key: ${{ runner.os }}-maven-mo-testbeds-jdk11-${{ github.sha }} - name: Run the Testbed for Encoders run: mvn --batch-mode --update-snapshots test working-directory: testbeds/testbed-encoders @@ -644,11 +535,6 @@ jobs: needs: build-testbeds-jdk17 runs-on: ubuntu-latest steps: - - name: Get Date - id: get-date - run: | - echo "date=$(/bin/date -u "+%Y-week-%U")" >> $GITHUB_OUTPUT - shell: bash - uses: actions/checkout@v4 - uses: actions/setup-java@v4 with: @@ -658,7 +544,7 @@ jobs: uses: actions/cache@v4 with: path: ~/.m2/repository - key: ${{ runner.os }}-maven-mo-testbeds-jdk17-${{ steps.get-date.outputs.date }} + key: ${{ runner.os }}-maven-mo-testbeds-jdk17-${{ github.sha }} - name: Run the Testbed for Encoders run: mvn --batch-mode --update-snapshots test working-directory: testbeds/testbed-encoders @@ -667,11 +553,6 @@ jobs: needs: build-testbeds-jdk21 runs-on: ubuntu-latest steps: - - name: Get Date - id: get-date - run: | - echo "date=$(/bin/date -u "+%Y-week-%U")" >> $GITHUB_OUTPUT - shell: bash - uses: actions/checkout@v4 - uses: actions/setup-java@v4 with: @@ -681,7 +562,7 @@ jobs: uses: actions/cache@v4 with: path: ~/.m2/repository - key: ${{ runner.os }}-maven-mo-testbeds-jdk21-${{ steps.get-date.outputs.date }} + key: ${{ runner.os }}-maven-mo-testbeds-jdk21-${{ github.sha }} - name: Run the Testbed for Encoders run: mvn --batch-mode --update-snapshots test working-directory: testbeds/testbed-encoders From e893da8d5bfab7d9a9b396f693450d172f221b63 Mon Sep 17 00:00:00 2001 From: Cesar Coelho Date: Sat, 18 Jul 2026 15:13:14 +0200 Subject: [PATCH 03/45] Bump GitHub Actions to v5 to run on Node.js 24 actions/checkout, actions/setup-java, actions/cache and actions/upload-artifact were pinned to v4, which targets the deprecated Node.js 20 runtime. Bump them to v5 (Node.js 24) to clear the deprecation warnings. Co-Authored-By: Claude Opus 4.8 --- .github/workflows/generate-docs.yml | 10 +- .github/workflows/testbeds.yml | 186 ++++++++++++++-------------- 2 files changed, 98 insertions(+), 98 deletions(-) diff --git a/.github/workflows/generate-docs.yml b/.github/workflows/generate-docs.yml index 5a9534b0..2aa85423 100644 --- a/.github/workflows/generate-docs.yml +++ b/.github/workflows/generate-docs.yml @@ -13,15 +13,15 @@ jobs: id: get-date run: echo "date=$(/bin/date -u "+%Y-%m-%dT%H-%M-%S")" >> $GITHUB_OUTPUT - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - - uses: actions/setup-java@v4 + - uses: actions/setup-java@v5 with: java-version: '11' distribution: 'temurin' - name: Cache Maven local repository - uses: actions/cache@v4 + uses: actions/cache@v5 with: path: ~/.m2/repository key: ${{ runner.os }}-maven-docgen-${{ steps.get-date.outputs.date }} @@ -48,14 +48,14 @@ jobs: docx-output/standards - name: Upload DOCX artifacts for XML prototypes - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: mo-prototypes-docx-${{ steps.get-date.outputs.date }} path: docx-output/prototypes/ if-no-files-found: error - name: Upload DOCX artifacts for XML standards - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: mo-standards-docx-${{ steps.get-date.outputs.date }} path: docx-output/standards/ diff --git a/.github/workflows/testbeds.yml b/.github/workflows/testbeds.yml index 30d70bbc..8eb7dd34 100644 --- a/.github/workflows/testbeds.yml +++ b/.github/workflows/testbeds.yml @@ -7,13 +7,13 @@ jobs: build-jdk8: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - uses: actions/setup-java@v4 + - uses: actions/checkout@v5 + - uses: actions/setup-java@v5 with: java-version: '8' distribution: 'temurin' - name: Cache Maven local repository - uses: actions/cache@v4 + uses: actions/cache@v5 with: path: ~/.m2/repository key: ${{ runner.os }}-maven-mo-services-java-jdk8-${{ github.sha }} @@ -25,13 +25,13 @@ jobs: build-jdk11: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - uses: actions/setup-java@v4 + - uses: actions/checkout@v5 + - uses: actions/setup-java@v5 with: java-version: '11' distribution: 'temurin' - name: Cache Maven local repository - uses: actions/cache@v4 + uses: actions/cache@v5 with: path: ~/.m2/repository key: ${{ runner.os }}-maven-mo-services-java-jdk11-${{ github.sha }} @@ -43,13 +43,13 @@ jobs: build-jdk17: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - uses: actions/setup-java@v4 + - uses: actions/checkout@v5 + - uses: actions/setup-java@v5 with: java-version: '17' distribution: 'temurin' - name: Cache Maven local repository - uses: actions/cache@v4 + uses: actions/cache@v5 with: path: ~/.m2/repository key: ${{ runner.os }}-maven-mo-services-java-jdk17-${{ github.sha }} @@ -61,13 +61,13 @@ jobs: build-jdk21: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - uses: actions/setup-java@v4 + - uses: actions/checkout@v5 + - uses: actions/setup-java@v5 with: java-version: '21' distribution: 'temurin' - name: Cache Maven local repository - uses: actions/cache@v4 + uses: actions/cache@v5 with: path: ~/.m2/repository key: ${{ runner.os }}-maven-mo-services-java-jdk21-${{ github.sha }} @@ -80,13 +80,13 @@ jobs: needs: build-jdk11 runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - uses: actions/setup-java@v4 + - uses: actions/checkout@v5 + - uses: actions/setup-java@v5 with: java-version: '11' distribution: 'temurin' - name: Restore Maven local repository from cache - uses: actions/cache@v4 + uses: actions/cache@v5 with: path: ~/.m2/repository key: ${{ runner.os }}-maven-mo-services-java-jdk11-${{ github.sha }} @@ -95,7 +95,7 @@ jobs: run: mvn --batch-mode --update-snapshots -P ESA -DskipTests clean install working-directory: testbeds - name: Cache Maven local repository - uses: actions/cache@v4 + uses: actions/cache@v5 with: path: ~/.m2/repository key: ${{ runner.os }}-maven-mo-testbeds-jdk11-${{ github.sha }} @@ -104,13 +104,13 @@ jobs: needs: build-jdk17 runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - uses: actions/setup-java@v4 + - uses: actions/checkout@v5 + - uses: actions/setup-java@v5 with: java-version: '17' distribution: 'temurin' - name: Restore Maven local repository from cache - uses: actions/cache@v4 + uses: actions/cache@v5 with: path: ~/.m2/repository key: ${{ runner.os }}-maven-mo-services-java-jdk17-${{ github.sha }} @@ -119,7 +119,7 @@ jobs: run: mvn --batch-mode --update-snapshots -P ESA -DskipTests clean install working-directory: testbeds - name: Cache Maven local repository - uses: actions/cache@v4 + uses: actions/cache@v5 with: path: ~/.m2/repository key: ${{ runner.os }}-maven-mo-testbeds-jdk17-${{ github.sha }} @@ -128,13 +128,13 @@ jobs: needs: build-jdk21 runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - uses: actions/setup-java@v4 + - uses: actions/checkout@v5 + - uses: actions/setup-java@v5 with: java-version: '21' distribution: 'temurin' - name: Restore Maven local repository from cache - uses: actions/cache@v4 + uses: actions/cache@v5 with: path: ~/.m2/repository key: ${{ runner.os }}-maven-mo-services-java-jdk21-${{ github.sha }} @@ -143,7 +143,7 @@ jobs: run: mvn --batch-mode --update-snapshots -P ESA -DskipTests clean install working-directory: testbeds - name: Cache Maven local repository - uses: actions/cache@v4 + uses: actions/cache@v5 with: path: ~/.m2/repository key: ${{ runner.os }}-maven-mo-testbeds-jdk21-${{ github.sha }} @@ -152,13 +152,13 @@ jobs: needs: build-testbeds-jdk11 runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - uses: actions/setup-java@v4 + - uses: actions/checkout@v5 + - uses: actions/setup-java@v5 with: java-version: '11' distribution: 'temurin' - name: Restore Maven local repository from cache - uses: actions/cache@v4 + uses: actions/cache@v5 with: path: ~/.m2/repository key: ${{ runner.os }}-maven-mo-testbeds-jdk11-${{ github.sha }} @@ -167,7 +167,7 @@ jobs: working-directory: testbeds/testbed-mal - name: Upload report for MAL testbed if: always() - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: testbed-mal-jdk11-report-rmi path: testbeds/testbed-mal/target/surefire-reports/ @@ -176,13 +176,13 @@ jobs: needs: build-testbeds-jdk11 runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - uses: actions/setup-java@v4 + - uses: actions/checkout@v5 + - uses: actions/setup-java@v5 with: java-version: '11' distribution: 'temurin' - name: Restore Maven local repository from cache - uses: actions/cache@v4 + uses: actions/cache@v5 with: path: ~/.m2/repository key: ${{ runner.os }}-maven-mo-testbeds-jdk11-${{ github.sha }} @@ -191,7 +191,7 @@ jobs: working-directory: testbeds/testbed-mal - name: Upload report for MAL testbed if: always() - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: testbed-mal-jdk11-report-tcpip path: testbeds/testbed-mal/target/surefire-reports/ @@ -201,14 +201,14 @@ jobs: needs: build-testbeds-jdk11 runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - uses: actions/setup-java@v4 + - uses: actions/checkout@v5 + - uses: actions/setup-java@v5 with: java-version: '11' distribution: 'temurin' java-package: jdk - name: Restore Maven local repository from cache - uses: actions/cache@v4 + uses: actions/cache@v5 with: path: ~/.m2/repository key: ${{ runner.os }}-maven-mo-testbeds-jdk11-${{ github.sha }} @@ -217,7 +217,7 @@ jobs: working-directory: testbeds/testbed-mal - name: Upload report for MAL testbed if: always() - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: testbed-mal-jdk11-report-http path: testbeds/testbed-mal/target/surefire-reports/ @@ -226,13 +226,13 @@ jobs: needs: build-testbeds-jdk11 runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - uses: actions/setup-java@v4 + - uses: actions/checkout@v5 + - uses: actions/setup-java@v5 with: java-version: '11' distribution: 'temurin' - name: Restore Maven local repository from cache - uses: actions/cache@v4 + uses: actions/cache@v5 with: path: ~/.m2/repository key: ${{ runner.os }}-maven-mo-testbeds-jdk11-${{ github.sha }} @@ -241,7 +241,7 @@ jobs: working-directory: testbeds/testbed-mal - name: Upload report for MAL testbed if: always() - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: testbed-mal-jdk11-report-zmtp path: testbeds/testbed-mal/target/surefire-reports/ @@ -250,13 +250,13 @@ jobs: needs: build-testbeds-jdk17 runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - uses: actions/setup-java@v4 + - uses: actions/checkout@v5 + - uses: actions/setup-java@v5 with: java-version: '17' distribution: 'temurin' - name: Restore Maven local repository from cache - uses: actions/cache@v4 + uses: actions/cache@v5 with: path: ~/.m2/repository key: ${{ runner.os }}-maven-mo-testbeds-jdk17-${{ github.sha }} @@ -265,7 +265,7 @@ jobs: working-directory: testbeds/testbed-mal - name: Upload report for MAL testbed if: always() - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: testbed-mal-jdk17-report path: testbeds/testbed-mal/target/surefire-reports/ @@ -274,13 +274,13 @@ jobs: needs: build-testbeds-jdk21 runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - uses: actions/setup-java@v4 + - uses: actions/checkout@v5 + - uses: actions/setup-java@v5 with: java-version: '21' distribution: 'temurin' - name: Restore Maven local repository from cache - uses: actions/cache@v4 + uses: actions/cache@v5 with: path: ~/.m2/repository key: ${{ runner.os }}-maven-mo-testbeds-jdk21-${{ github.sha }} @@ -289,7 +289,7 @@ jobs: working-directory: testbeds/testbed-mal - name: Upload report for MAL testbed if: always() - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: testbed-mal-jdk21-report path: testbeds/testbed-mal/target/surefire-reports/ @@ -298,13 +298,13 @@ jobs: needs: build-testbeds-jdk11 runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - uses: actions/setup-java@v4 + - uses: actions/checkout@v5 + - uses: actions/setup-java@v5 with: java-version: '11' distribution: 'temurin' - name: Restore Maven local repository from cache - uses: actions/cache@v4 + uses: actions/cache@v5 with: path: ~/.m2/repository key: ${{ runner.os }}-maven-mo-testbeds-jdk11-${{ github.sha }} @@ -313,7 +313,7 @@ jobs: working-directory: testbeds/testbed-com - name: Upload report for COM testbed if: always() - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: testbed-com-jdk11-report path: testbeds/testbed-com/target/surefire-reports/ @@ -322,13 +322,13 @@ jobs: needs: build-testbeds-jdk11 runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - uses: actions/setup-java@v4 + - uses: actions/checkout@v5 + - uses: actions/setup-java@v5 with: java-version: '11' distribution: 'temurin' - name: Restore Maven local repository from cache - uses: actions/cache@v4 + uses: actions/cache@v5 with: path: ~/.m2/repository key: ${{ runner.os }}-maven-mo-testbeds-jdk11-${{ github.sha }} @@ -337,7 +337,7 @@ jobs: working-directory: testbeds/testbed-mpd - name: Upload report for MPD testbed if: always() - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: testbed-mpd-jdk11-report path: testbeds/testbed-mpd/target/surefire-reports/ @@ -346,13 +346,13 @@ jobs: needs: build-testbeds-jdk17 runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - uses: actions/setup-java@v4 + - uses: actions/checkout@v5 + - uses: actions/setup-java@v5 with: java-version: '17' distribution: 'temurin' - name: Restore Maven local repository from cache - uses: actions/cache@v4 + uses: actions/cache@v5 with: path: ~/.m2/repository key: ${{ runner.os }}-maven-mo-testbeds-jdk17-${{ github.sha }} @@ -361,7 +361,7 @@ jobs: working-directory: testbeds/testbed-mpd - name: Upload report for MPD testbed if: always() - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: testbed-mpd-jdk17-report path: testbeds/testbed-mpd/target/surefire-reports/ @@ -370,13 +370,13 @@ jobs: needs: build-testbeds-jdk21 runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - uses: actions/setup-java@v4 + - uses: actions/checkout@v5 + - uses: actions/setup-java@v5 with: java-version: '21' distribution: 'temurin' - name: Restore Maven local repository from cache - uses: actions/cache@v4 + uses: actions/cache@v5 with: path: ~/.m2/repository key: ${{ runner.os }}-maven-mo-testbeds-jdk21-${{ github.sha }} @@ -385,7 +385,7 @@ jobs: working-directory: testbeds/testbed-mpd - name: Upload report for MPD testbed if: always() - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: testbed-mpd-jdk21-report path: testbeds/testbed-mpd/target/surefire-reports/ @@ -394,13 +394,13 @@ jobs: needs: build-testbeds-jdk17 runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - uses: actions/setup-java@v4 + - uses: actions/checkout@v5 + - uses: actions/setup-java@v5 with: java-version: '17' distribution: 'temurin' - name: Restore Maven local repository from cache - uses: actions/cache@v4 + uses: actions/cache@v5 with: path: ~/.m2/repository key: ${{ runner.os }}-maven-mo-testbeds-jdk17-${{ github.sha }} @@ -409,7 +409,7 @@ jobs: working-directory: testbeds/testbed-com - name: Upload report for COM testbed if: always() - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: testbed-com-jdk17-report path: testbeds/testbed-com/target/surefire-reports/ @@ -418,13 +418,13 @@ jobs: needs: build-testbeds-jdk21 runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - uses: actions/setup-java@v4 + - uses: actions/checkout@v5 + - uses: actions/setup-java@v5 with: java-version: '21' distribution: 'temurin' - name: Restore Maven local repository from cache - uses: actions/cache@v4 + uses: actions/cache@v5 with: path: ~/.m2/repository key: ${{ runner.os }}-maven-mo-testbeds-jdk21-${{ github.sha }} @@ -433,7 +433,7 @@ jobs: working-directory: testbeds/testbed-com - name: Upload report for COM testbed if: always() - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: testbed-com-jdk21-report path: testbeds/testbed-com/target/surefire-reports/ @@ -443,13 +443,13 @@ jobs: needs: build-testbeds-jdk11 runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - uses: actions/setup-java@v4 + - uses: actions/checkout@v5 + - uses: actions/setup-java@v5 with: java-version: '11' distribution: 'temurin' - name: Restore Maven local repository from cache - uses: actions/cache@v4 + uses: actions/cache@v5 with: path: ~/.m2/repository key: ${{ runner.os }}-maven-mo-testbeds-jdk11-${{ github.sha }} @@ -458,7 +458,7 @@ jobs: working-directory: testbeds/testbed-malspp - name: Upload report for MAL/SPP testbed if: always() - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: testbed-malspp-jdk11-report path: testbeds/testbed-malspp/target/surefire-reports/ @@ -468,13 +468,13 @@ jobs: needs: build-testbeds-jdk17 runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - uses: actions/setup-java@v4 + - uses: actions/checkout@v5 + - uses: actions/setup-java@v5 with: java-version: '17' distribution: 'temurin' - name: Restore Maven local repository from cache - uses: actions/cache@v4 + uses: actions/cache@v5 with: path: ~/.m2/repository key: ${{ runner.os }}-maven-mo-testbeds-jdk17-${{ github.sha }} @@ -483,7 +483,7 @@ jobs: working-directory: testbeds/testbed-malspp - name: Upload report for MAL/SPP testbed if: always() - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: testbed-malspp-jdk17-report path: testbeds/testbed-malspp/target/surefire-reports/ @@ -493,13 +493,13 @@ jobs: needs: build-testbeds-jdk21 runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - uses: actions/setup-java@v4 + - uses: actions/checkout@v5 + - uses: actions/setup-java@v5 with: java-version: '21' distribution: 'temurin' - name: Restore Maven local repository from cache - uses: actions/cache@v4 + uses: actions/cache@v5 with: path: ~/.m2/repository key: ${{ runner.os }}-maven-mo-testbeds-jdk21-${{ github.sha }} @@ -508,7 +508,7 @@ jobs: working-directory: testbeds/testbed-malspp - name: Upload report for MAL/SPP testbed if: always() - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: testbed-malspp-jdk21-report path: testbeds/testbed-malspp/target/surefire-reports/ @@ -517,13 +517,13 @@ jobs: needs: build-testbeds-jdk11 runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - uses: actions/setup-java@v4 + - uses: actions/checkout@v5 + - uses: actions/setup-java@v5 with: java-version: '11' distribution: 'temurin' - name: Restore Maven local repository from cache - uses: actions/cache@v4 + uses: actions/cache@v5 with: path: ~/.m2/repository key: ${{ runner.os }}-maven-mo-testbeds-jdk11-${{ github.sha }} @@ -535,13 +535,13 @@ jobs: needs: build-testbeds-jdk17 runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - uses: actions/setup-java@v4 + - uses: actions/checkout@v5 + - uses: actions/setup-java@v5 with: java-version: '17' distribution: 'temurin' - name: Restore Maven local repository from cache - uses: actions/cache@v4 + uses: actions/cache@v5 with: path: ~/.m2/repository key: ${{ runner.os }}-maven-mo-testbeds-jdk17-${{ github.sha }} @@ -553,13 +553,13 @@ jobs: needs: build-testbeds-jdk21 runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - uses: actions/setup-java@v4 + - uses: actions/checkout@v5 + - uses: actions/setup-java@v5 with: java-version: '21' distribution: 'temurin' - name: Restore Maven local repository from cache - uses: actions/cache@v4 + uses: actions/cache@v5 with: path: ~/.m2/repository key: ${{ runner.os }}-maven-mo-testbeds-jdk21-${{ github.sha }} From a4263e89e6f30e6340cb606342bedcd3ed05699f Mon Sep 17 00:00:00 2001 From: Cesar Coelho Date: Sat, 25 Jul 2026 20:51:16 +0200 Subject: [PATCH 04/45] Fix TCPIP transport handing back closed sockets from the client pool TCPIPClientSocketsManager.get() returned a pooled Socket keyed by port without checking whether it was still usable. A java.net.Socket is single-use: once closed it can never be reconnected. When a consumer's channel was torn down, its socket was closed but left in the pool; a later getRandomClientPort() collision then handed back the dead socket and connect() threw "SocketException: Socket is closed", surfacing as a MALTransmitError / DeliveryFailed (65536). This was an intermittent failure whose likelihood grew with the number of closed sockets in the pool, causing flaky e2e test failures. Fixes: - get() now evicts and recreates a pooled socket that is closed or already connected, so it never returns an unusable Socket. - Sockets are removed from the pool when their connection is torn down (TCPIPTransportDataTransceiver.close -> TCPIPClientSocketsManager.remove), so dead entries no longer accumulate. Server-side accepted sockets are not pooled, so their eviction is a harmless no-op. Co-Authored-By: Claude Opus 4.8 --- .../tcpip/TCPIPClientSocketsManager.java | 31 ++++++++++++++++--- .../mal/transport/tcpip/TCPIPTransport.java | 3 +- .../tcpip/TCPIPTransportDataTransceiver.java | 13 +++++++- 3 files changed, 40 insertions(+), 7 deletions(-) diff --git a/transports/transport-tcpip/src/main/java/esa/mo/mal/transport/tcpip/TCPIPClientSocketsManager.java b/transports/transport-tcpip/src/main/java/esa/mo/mal/transport/tcpip/TCPIPClientSocketsManager.java index 4ba1ea69..082add8b 100644 --- a/transports/transport-tcpip/src/main/java/esa/mo/mal/transport/tcpip/TCPIPClientSocketsManager.java +++ b/transports/transport-tcpip/src/main/java/esa/mo/mal/transport/tcpip/TCPIPClientSocketsManager.java @@ -56,10 +56,15 @@ public class TCPIPClientSocketsManager { private final Map connections = new ConcurrentHashMap<>(); /** - * Returns a socket bound to a specific port. If this socket doesn't exist, - * this method will try once to create a socket on the same port. If that is - * not possible, a socket with an ephemeral port number will be created and - * returned. + * Returns a socket bound to a specific port. If no usable socket exists yet + * for the port, this method will try once to create a socket on the same + * port. If that is not possible, a socket with an ephemeral port number will + * be created and returned. + * + * A Java {@link Socket} is single-use: once it has been closed or connected + * it can never be connected again. A pooled socket that is closed (or already + * connected) is therefore stale and is evicted and replaced with a fresh one, + * rather than being handed back to fail with "Socket is closed". * * @param localPort The port number of the socket to return. Returns a * socket with an ephemeral port number if the localPort is occupied or not @@ -69,7 +74,10 @@ public class TCPIPClientSocketsManager { public synchronized Socket get(int localPort) { Socket s = connections.get(localPort); - if (s == null) { + if (s == null || s.isClosed() || s.isConnected()) { + if (s != null) { + connections.remove(localPort); // Evict the stale socket + } s = createSocket(localPort); } @@ -104,6 +112,19 @@ private synchronized Socket createSocket(int localPort) { return s; } + /** + * Evicts a socket from the connection pool when its connection is torn down, + * so that a stale (closed) socket is never handed back by {@link #get(int)}. + * The socket itself is expected to be closed by the caller. Sockets that are + * not part of the pool (for example server-side accepted sockets) are simply + * ignored. + * + * @param socket the socket to evict from the pool + */ + public synchronized void remove(Socket socket) { + connections.values().remove(socket); + } + /** * Close all sockets and remove them from the connections pool */ diff --git a/transports/transport-tcpip/src/main/java/esa/mo/mal/transport/tcpip/TCPIPTransport.java b/transports/transport-tcpip/src/main/java/esa/mo/mal/transport/tcpip/TCPIPTransport.java index 5eaa83e5..e27c9e4d 100644 --- a/transports/transport-tcpip/src/main/java/esa/mo/mal/transport/tcpip/TCPIPTransport.java +++ b/transports/transport-tcpip/src/main/java/esa/mo/mal/transport/tcpip/TCPIPTransport.java @@ -668,7 +668,8 @@ protected MessageSender createMessageSender(MALMessageHeader msgHeader, */ protected TCPIPTransportDataTransceiver createDataTransceiver(Socket socket) throws IOException { RLOGGER.fine("TCPIPTransport.createDataTransceiver()"); - return new TCPIPTransportDataTransceiver(socket, ((clientPort == 0) ? serverPort : clientPort)); + int port = ((clientPort == 0) ? serverPort : clientPort); + return new TCPIPTransportDataTransceiver(socket, port, clientSockets); } /** diff --git a/transports/transport-tcpip/src/main/java/esa/mo/mal/transport/tcpip/TCPIPTransportDataTransceiver.java b/transports/transport-tcpip/src/main/java/esa/mo/mal/transport/tcpip/TCPIPTransportDataTransceiver.java index 70558820..94185b13 100644 --- a/transports/transport-tcpip/src/main/java/esa/mo/mal/transport/tcpip/TCPIPTransportDataTransceiver.java +++ b/transports/transport-tcpip/src/main/java/esa/mo/mal/transport/tcpip/TCPIPTransportDataTransceiver.java @@ -50,17 +50,23 @@ public class TCPIPTransportDataTransceiver implements MessageReceiver Date: Sat, 25 Jul 2026 21:17:39 +0200 Subject: [PATCH 05/45] Add JDK 25 build and testbed jobs to the Testbeds workflow Mirror the existing JDK 21 job set for JDK 25: build-jdk25, build-testbeds-jdk25, and the testbed-mal/com/mpd/encoders jobs, plus a disabled testbed-malspp-jdk25 to match its siblings. Each job uses its own jdk25 Maven cache keys. Co-Authored-By: Claude Opus 4.8 --- .github/workflows/testbeds.yml | 158 ++++++++++++++++++++++++++++++++- 1 file changed, 157 insertions(+), 1 deletion(-) diff --git a/.github/workflows/testbeds.yml b/.github/workflows/testbeds.yml index 8eb7dd34..f7a0844e 100644 --- a/.github/workflows/testbeds.yml +++ b/.github/workflows/testbeds.yml @@ -76,6 +76,24 @@ jobs: - name: Run Maven install run: mvn --batch-mode --update-snapshots -P ESA -DskipTests install + build-jdk25: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v5 + - uses: actions/setup-java@v5 + with: + java-version: '25' + distribution: 'temurin' + - name: Cache Maven local repository + uses: actions/cache@v5 + with: + path: ~/.m2/repository + key: ${{ runner.os }}-maven-mo-services-java-jdk25-${{ github.sha }} + restore-keys: | + ${{ runner.os }}-maven-mo-services-java-jdk25- + - name: Run Maven install + run: mvn --batch-mode --update-snapshots -P ESA -DskipTests install + build-testbeds-jdk11: needs: build-jdk11 runs-on: ubuntu-latest @@ -148,6 +166,29 @@ jobs: path: ~/.m2/repository key: ${{ runner.os }}-maven-mo-testbeds-jdk21-${{ github.sha }} + build-testbeds-jdk25: + needs: build-jdk25 + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v5 + - uses: actions/setup-java@v5 + with: + java-version: '25' + distribution: 'temurin' + - name: Restore Maven local repository from cache + uses: actions/cache@v5 + with: + path: ~/.m2/repository + key: ${{ runner.os }}-maven-mo-services-java-jdk25-${{ github.sha }} + - name: Run the testbeds install + run: mvn --batch-mode --update-snapshots -P ESA -DskipTests clean install + working-directory: testbeds + - name: Cache Maven local repository + uses: actions/cache@v5 + with: + path: ~/.m2/repository + key: ${{ runner.os }}-maven-mo-testbeds-jdk25-${{ github.sha }} + testbed-mal-jdk11-rmi: needs: build-testbeds-jdk11 runs-on: ubuntu-latest @@ -294,6 +335,30 @@ jobs: name: testbed-mal-jdk21-report path: testbeds/testbed-mal/target/surefire-reports/ + testbed-mal-jdk25: + needs: build-testbeds-jdk25 + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v5 + - uses: actions/setup-java@v5 + with: + java-version: '25' + distribution: 'temurin' + - name: Restore Maven local repository from cache + uses: actions/cache@v5 + with: + path: ~/.m2/repository + key: ${{ runner.os }}-maven-mo-testbeds-jdk25-${{ github.sha }} + - name: Run the Testbed for MAL + run: mvn --batch-mode --update-snapshots -P ESA test + working-directory: testbeds/testbed-mal + - name: Upload report for MAL testbed + if: always() + uses: actions/upload-artifact@v5 + with: + name: testbed-mal-jdk25-report + path: testbeds/testbed-mal/target/surefire-reports/ + testbed-com-jdk11: needs: build-testbeds-jdk11 runs-on: ubuntu-latest @@ -390,6 +455,30 @@ jobs: name: testbed-mpd-jdk21-report path: testbeds/testbed-mpd/target/surefire-reports/ + testbed-mpd-jdk25: + needs: build-testbeds-jdk25 + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v5 + - uses: actions/setup-java@v5 + with: + java-version: '25' + distribution: 'temurin' + - name: Restore Maven local repository from cache + uses: actions/cache@v5 + with: + path: ~/.m2/repository + key: ${{ runner.os }}-maven-mo-testbeds-jdk25-${{ github.sha }} + - name: Run the Testbed for MPD + run: mvn --batch-mode --update-snapshots -P ESA test + working-directory: testbeds/testbed-mpd + - name: Upload report for MPD testbed + if: always() + uses: actions/upload-artifact@v5 + with: + name: testbed-mpd-jdk25-report + path: testbeds/testbed-mpd/target/surefire-reports/ + testbed-com-jdk17: needs: build-testbeds-jdk17 runs-on: ubuntu-latest @@ -438,6 +527,30 @@ jobs: name: testbed-com-jdk21-report path: testbeds/testbed-com/target/surefire-reports/ + testbed-com-jdk25: + needs: build-testbeds-jdk25 + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v5 + - uses: actions/setup-java@v5 + with: + java-version: '25' + distribution: 'temurin' + - name: Restore Maven local repository from cache + uses: actions/cache@v5 + with: + path: ~/.m2/repository + key: ${{ runner.os }}-maven-mo-testbeds-jdk25-${{ github.sha }} + - name: Run the Testbed for COM + run: mvn --batch-mode --update-snapshots -P ESA test + working-directory: testbeds/testbed-com + - name: Upload report for COM testbed + if: always() + uses: actions/upload-artifact@v5 + with: + name: testbed-com-jdk25-report + path: testbeds/testbed-com/target/surefire-reports/ + testbed-malspp-jdk11: if: ${{ false }} # disable for now needs: build-testbeds-jdk11 @@ -512,7 +625,32 @@ jobs: with: name: testbed-malspp-jdk21-report path: testbeds/testbed-malspp/target/surefire-reports/ - + + testbed-malspp-jdk25: + if: ${{ false }} # disable for now + needs: build-testbeds-jdk25 + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v5 + - uses: actions/setup-java@v5 + with: + java-version: '25' + distribution: 'temurin' + - name: Restore Maven local repository from cache + uses: actions/cache@v5 + with: + path: ~/.m2/repository + key: ${{ runner.os }}-maven-mo-testbeds-jdk25-${{ github.sha }} + - name: Run the Testbed for MAL/SPP + run: mvn --batch-mode --update-snapshots -P DLR test + working-directory: testbeds/testbed-malspp + - name: Upload report for MAL/SPP testbed + if: always() + uses: actions/upload-artifact@v5 + with: + name: testbed-malspp-jdk25-report + path: testbeds/testbed-malspp/target/surefire-reports/ + testbed-encoders-jdk11: needs: build-testbeds-jdk11 runs-on: ubuntu-latest @@ -567,4 +705,22 @@ jobs: run: mvn --batch-mode --update-snapshots test working-directory: testbeds/testbed-encoders + testbed-encoders-jdk25: + needs: build-testbeds-jdk25 + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v5 + - uses: actions/setup-java@v5 + with: + java-version: '25' + distribution: 'temurin' + - name: Restore Maven local repository from cache + uses: actions/cache@v5 + with: + path: ~/.m2/repository + key: ${{ runner.os }}-maven-mo-testbeds-jdk25-${{ github.sha }} + - name: Run the Testbed for Encoders + run: mvn --batch-mode --update-snapshots test + working-directory: testbeds/testbed-encoders + From 878a49063de54a535a124f63a3b9236384a129fa Mon Sep 17 00:00:00 2001 From: Cesar Coelho Date: Sat, 25 Jul 2026 21:23:33 +0200 Subject: [PATCH 06/45] Join addClassVariable call onto a single line in GeneratorLangs Cosmetic formatting only; no behaviour change. Co-Authored-By: Claude Opus 4.8 --- .../src/main/java/esa/mo/tools/stubgen/GeneratorLangs.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/api-generator/generator-java/src/main/java/esa/mo/tools/stubgen/GeneratorLangs.java b/api-generator/generator-java/src/main/java/esa/mo/tools/stubgen/GeneratorLangs.java index 96463d5b..b01ccb0b 100644 --- a/api-generator/generator-java/src/main/java/esa/mo/tools/stubgen/GeneratorLangs.java +++ b/api-generator/generator-java/src/main/java/esa/mo/tools/stubgen/GeneratorLangs.java @@ -734,8 +734,7 @@ protected void createServiceProviderProgressInteractionClass(File providerFolder file.addClassOpenStatement(className, false, false, null, null, "Provider PROGRESS interaction class for " + service + "::" + op.getName() + " operation."); - file.addClassVariable(false, false, StdStrings.PRIVATE, opTypeVar, - false, (String) null); + file.addClassVariable(false, false, StdStrings.PRIVATE, opTypeVar, false, (String) null); MethodWriter method = file.addConstructor(StdStrings.PUBLIC, className, createCompositeElementsDetails(file, false, "interaction", From 7849085846120ff3afd07c7cc7ead5437609ef21 Mon Sep 17 00:00:00 2001 From: Cesar Coelho Date: Sat, 25 Jul 2026 21:37:51 +0200 Subject: [PATCH 07/45] Skip address lookup for PUBLISH error messages (fixes #9) A publish error is returned to the publisher as a PUBLISH message with the isError flag set. The publisher is not a MAL provider for the PUBLISH operation, so the unconditional lookupAddress at the _PUBLISH_STAGE dispatch always failed for it and logged a spurious warning: "lookupAddress failed to find local endpoint for ...". Delivery of the error was unaffected because handlePublish already ignores the address for error messages and dispatches via the publish listener map. Only perform the address lookup for non-error PUBLISH messages (the broker path). The NOTIFY path already avoided the lookup. Co-Authored-By: Claude Opus 4.8 --- .../src/main/java/esa/mo/mal/impl/MALReceiver.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/mal-impl/src/main/java/esa/mo/mal/impl/MALReceiver.java b/mal-impl/src/main/java/esa/mo/mal/impl/MALReceiver.java index b6a3ff93..daef0fed 100644 --- a/mal-impl/src/main/java/esa/mo/mal/impl/MALReceiver.java +++ b/mal-impl/src/main/java/esa/mo/mal/impl/MALReceiver.java @@ -189,7 +189,15 @@ public void onMessage(final MALEndpoint callingEndpoint, MALMessage msg) { handlePublishRegister(msg, address); break; case MALPubSubOperation._PUBLISH_STAGE: - address = lookupAddress(callingEndpoint, null); + // Only brokers hold a provider endpoint for the PUBLISH + // operation. A publish error is returned to the publisher + // as a PUBLISH message with the isError flag set; the + // publisher is not a provider, so looking up its (absent) + // address would only log a spurious warning. handlePublish + // does not use the address for error messages anyway. + if (!msg.getHeader().getIsErrorMessage()) { + address = lookupAddress(callingEndpoint, null); + } handlePublish(msg, address); break; case MALPubSubOperation._NOTIFY_STAGE: From 4364d6883983543e2951a709582df49d017258dc Mon Sep 17 00:00:00 2001 From: Cesar Coelho Date: Sat, 25 Jul 2026 21:50:34 +0200 Subject: [PATCH 08/45] Poll for transport activity events to de-flake MultiHop monitor test receivedExpectedTransportActivity sampled the received-events list only once. The transport activity events arrive asynchronously over pub-sub, so the last one (e.g. ACCEPTANCE) could still be in flight when the check ran, intermittently failing ActivityTestScenario.MonitorCase.MultiHop with "NO MATCH for ACCEPTANCE" even though the event arrived a moment later. Poll until all expected events have been received or a timeout elapses (2 * COM_PERIOD_LONG, checked every COM_PERIOD_SHORT), matching the wait constants already used by the sibling methods. The fast path is unchanged when the events are already present, and a genuine absence still fails after the timeout with the same NO MATCH diagnostics. Co-Authored-By: Claude Opus 4.8 --- .../activity/MonitorActivityScenario.java | 45 ++++++++++++++++--- 1 file changed, 40 insertions(+), 5 deletions(-) diff --git a/testbeds/testbed-com-framework/src/main/java/org/ccsds/moims/mo/com/test/activity/MonitorActivityScenario.java b/testbeds/testbed-com-framework/src/main/java/org/ccsds/moims/mo/com/test/activity/MonitorActivityScenario.java index 9e245856..acb1eb18 100644 --- a/testbeds/testbed-com-framework/src/main/java/org/ccsds/moims/mo/com/test/activity/MonitorActivityScenario.java +++ b/testbeds/testbed-com-framework/src/main/java/org/ccsds/moims/mo/com/test/activity/MonitorActivityScenario.java @@ -319,12 +319,30 @@ public boolean patternCompletesAsExpected(String monitorKey, String[] transactiv */ public boolean receivedExpectedTransportActivity(String monitorKey, String[] transactivity) { logMessage(loggingClassName + ":receivedExpectedTransportActivity"); - boolean transEventsMatch = true; - for (int transCnt = 0; transCnt < transactivity.length && transEventsMatch; transCnt++) { - if (!transactivity[transCnt].isEmpty()) { - transEventsMatch = monitorEventAdapter.getMonitorEventList().matches(transactivity[transCnt]); - if (!transEventsMatch) { + // The transport-activity events arrive asynchronously over pub-sub, and the + // last one (e.g. ACCEPTANCE) can still be in flight when this check runs. + // Poll until all expected events have been received or a reasonable timeout + // elapses, instead of sampling the received list only once. + final long deadline = System.currentTimeMillis() + 2 * Configuration.COM_PERIOD_LONG; + boolean transEventsMatch; + do { + transEventsMatch = allTransportActivityReceived(transactivity); + if (transEventsMatch || System.currentTimeMillis() >= deadline) { + break; + } + try { + Thread.sleep(Configuration.COM_PERIOD_SHORT); + } catch (InterruptedException ex) { + Thread.currentThread().interrupt(); + break; + } + } while (true); + + if (!transEventsMatch) { + for (int transCnt = 0; transCnt < transactivity.length; transCnt++) { + if (!transactivity[transCnt].isEmpty() + && !monitorEventAdapter.getMonitorEventList().matches(transactivity[transCnt])) { logMessage(loggingClassName + ":patternCompletesAsExpectedWithTransportActivityAndExecutionActivity NO MATCH for " + transactivity[transCnt]); } @@ -335,6 +353,23 @@ public boolean receivedExpectedTransportActivity(String monitorKey, String[] tra return transEventsMatch; } + /** + * Checks whether all of the expected transport activity events have been + * received so far. + * + * @param transactivity the expected transport activity events + * @return {@code true} if every non-empty expected event has been received + */ + private boolean allTransportActivityReceived(String[] transactivity) { + for (int transCnt = 0; transCnt < transactivity.length; transCnt++) { + if (!transactivity[transCnt].isEmpty() + && !monitorEventAdapter.getMonitorEventList().matches(transactivity[transCnt])) { + return false; + } + } + return true; + } + /** * For an executed pattern checks expected Activity Events have been * received for execution activities From df67bb43ba8caf029798ba362e9fb47d8d3ecf0a Mon Sep 17 00:00:00 2001 From: Cesar Coelho Date: Sat, 25 Jul 2026 22:40:37 +0200 Subject: [PATCH 09/45] Add a File constructor to Blob Convenience constructor that wraps a local file as a URL-based Blob, so callers can pass a java.io.File directly instead of building the file URI by hand. Reuses the existing URL-backed machinery. Rejects a null file with IllegalArgumentException, per the documented contract. Co-Authored-By: Claude Opus 4.8 --- .../ccsds/moims/mo/mal/structures/Blob.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/apis/api-area001-v003-mal/src/main/java/org/ccsds/moims/mo/mal/structures/Blob.java b/apis/api-area001-v003-mal/src/main/java/org/ccsds/moims/mo/mal/structures/Blob.java index c2b04a4c..f3c14435 100644 --- a/apis/api-area001-v003-mal/src/main/java/org/ccsds/moims/mo/mal/structures/Blob.java +++ b/apis/api-area001-v003-mal/src/main/java/org/ccsds/moims/mo/mal/structures/Blob.java @@ -21,6 +21,7 @@ package org.ccsds.moims.mo.mal.structures; import java.io.ByteArrayOutputStream; +import java.io.File; import java.io.InputStream; import java.net.URL; import java.util.Arrays; @@ -81,6 +82,25 @@ public Blob(final String sourceUrl) throws java.lang.IllegalArgumentException { urlValue = null; } + /** + * File constructor. The resource identified by the file should not be + * modified until the method ‘detach’ is called. If the resource identified + * by the file is modified after the constructor has been called then the + * Blob behaviour is unspecified. + * + * @param file Source file. + * @throws java.lang.IllegalArgumentException If the argument is null. + */ + public Blob(final File file) throws java.lang.IllegalArgumentException { + if (file == null) { + throw new IllegalArgumentException("The file argument cannot be null!"); + } + this.value = null; + this.length = 0; + this.uvalue = file.toURI().toString(); + this.urlValue = null; + } + @Override public Element createElement() { return new Blob(); From 84eccf26fcae3c4d817a656c242b2303ed2096d2 Mon Sep 17 00:00:00 2001 From: Cesar Coelho Date: Sat, 25 Jul 2026 23:14:36 +0200 Subject: [PATCH 10/45] Stream Blob content during encoding instead of materialising it encodeBlob previously called Blob.getValue(), which loads the entire content into a single byte array before writing. For large (URL/file- backed) Blobs this holds the whole payload in memory and fails outright above ~2 GB (the Java array limit). Add a streaming path: - Blob: getAsStream() (lazy InputStream over the URL/file or wrapped array) and getLengthLong() (long length, e.g. File.length()), plus the File constructor already added. - StreamHolder: writeStream(InputStream, long) with a materialising default (reads fully then writeBytes) so non-overriding encodings (string, xml) are unchanged. - BaseBinaryStreamHolder / FixedBinaryStreamHolder override writeStream to copy the content in fixed-size chunks after the length prefix, so the payload is never fully held in memory. A guard rejects lengths above the 32-bit length field with a clear message. - Encoder.encodeBlob now streams via writeStream(getAsStream(), getLengthLong()). Add LargeBlobTest, an @Ignore'd probe that generates a 3 GB file and attempts to encode/decode it, documenting the remaining 32-bit length field limitation. It is disabled so it does not break CI. Co-Authored-By: Claude Opus 4.8 --- .../ccsds/moims/mo/mal/encoding/Encoder.java | 5 +- .../moims/mo/mal/encoding/StreamHolder.java | 25 ++++ .../ccsds/moims/mo/mal/structures/Blob.java | 54 ++++++++ .../binary/base/BaseBinaryEncoder.java | 40 ++++++ .../binary/fixed/FixedBinaryEncoder.java | 17 +++ .../esa/mo/mal/encoders/LargeBlobTest.java | 125 ++++++++++++++++++ 6 files changed, 265 insertions(+), 1 deletion(-) create mode 100644 testbeds/testbed-encoders/src/test/java/esa/mo/mal/encoders/LargeBlobTest.java diff --git a/apis/api-area001-v003-mal/src/main/java/org/ccsds/moims/mo/mal/encoding/Encoder.java b/apis/api-area001-v003-mal/src/main/java/org/ccsds/moims/mo/mal/encoding/Encoder.java index f9d4d3bf..bcb652ab 100644 --- a/apis/api-area001-v003-mal/src/main/java/org/ccsds/moims/mo/mal/encoding/Encoder.java +++ b/apis/api-area001-v003-mal/src/main/java/org/ccsds/moims/mo/mal/encoding/Encoder.java @@ -439,7 +439,10 @@ public void encodeBlob(final Blob value) throws MALException { } else { checkForNull(value.getValue()); } - outputStream.writeBytes(value.getValue()); + // Stream the content instead of materialising it into a single byte + // array, so that large (URL/file-backed) Blobs are not loaded fully + // into memory during encoding. + outputStream.writeStream(value.getAsStream(), value.getLengthLong()); } catch (IOException ex) { throw new MALException(ENCODING_EXCEPTION_STR, ex); } diff --git a/apis/api-area001-v003-mal/src/main/java/org/ccsds/moims/mo/mal/encoding/StreamHolder.java b/apis/api-area001-v003-mal/src/main/java/org/ccsds/moims/mo/mal/encoding/StreamHolder.java index 71de747f..717a70a8 100644 --- a/apis/api-area001-v003-mal/src/main/java/org/ccsds/moims/mo/mal/encoding/StreamHolder.java +++ b/apis/api-area001-v003-mal/src/main/java/org/ccsds/moims/mo/mal/encoding/StreamHolder.java @@ -20,7 +20,9 @@ */ package org.ccsds.moims.mo.mal.encoding; +import java.io.ByteArrayOutputStream; import java.io.IOException; +import java.io.InputStream; import java.io.OutputStream; import java.math.BigInteger; @@ -153,6 +155,29 @@ public StreamHolder(OutputStream outputStream) { */ public abstract void writeBytes(final byte[] value) throws IOException; + /** + * Adds a length-prefixed byte block to the output stream, streamed from an + * input source without holding the whole payload in memory. The default + * implementation reads the input fully and delegates to + * {@link #writeBytes(byte[])} for backwards compatibility; sub-classes that + * can stream should override this. The input stream is always closed. + * + * @param input the source of the bytes to encode. + * @param length the number of bytes provided by the input. + * @throws IOException is there is a problem adding the value to the stream. + */ + public void writeStream(final InputStream input, final long length) throws IOException { + try (InputStream in = input) { + final ByteArrayOutputStream buffer = new ByteArrayOutputStream(); + final byte[] chunk = new byte[8192]; + int read; + while ((read = in.read(chunk)) != -1) { + buffer.write(chunk, 0, read); + } + writeBytes(buffer.toByteArray()); + } + } + /** * Adds a byte to the output stream. * diff --git a/apis/api-area001-v003-mal/src/main/java/org/ccsds/moims/mo/mal/structures/Blob.java b/apis/api-area001-v003-mal/src/main/java/org/ccsds/moims/mo/mal/structures/Blob.java index f3c14435..ca08ec8a 100644 --- a/apis/api-area001-v003-mal/src/main/java/org/ccsds/moims/mo/mal/structures/Blob.java +++ b/apis/api-area001-v003-mal/src/main/java/org/ccsds/moims/mo/mal/structures/Blob.java @@ -20,8 +20,10 @@ */ package org.ccsds.moims.mo.mal.structures; +import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; +import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.util.Arrays; @@ -157,6 +159,58 @@ public int getLength() { return length; } + /** + * Returns the content of this Blob as a stream, without loading the whole + * content into memory. For a URL-based Blob the stream is opened lazily over + * the designated resource; for a byte array based Blob the stream reads from + * the wrapped array. The returned stream should be closed by the caller. + * + * @return The Blob content as an input stream. + * @throws MALException if the stream could not be opened. + */ + public InputStream getAsStream() throws MALException { + if (isURLBased()) { + try { + return new URL(uvalue).openStream(); + } catch (IOException ex) { + throw new MALException("The Blob URL stream could not be opened: " + uvalue, ex); + } + } + + return new ByteArrayInputStream((value != null) ? value : new byte[0]); + } + + /** + * Returns the length of the Blob content as a {@code long}, allowing lengths + * larger than {@link Integer#MAX_VALUE}. For a URL-based Blob the length is + * that of the designated resource; for a byte array based Blob it is the + * length of the wrapped array. + * + * @return The length of the Blob content in bytes. + * @throws MALException if the length could not be determined. + */ + public long getLengthLong() throws MALException { + if (isURLBased()) { + try { + final URL url = new URL(uvalue); + + if ("file".equals(url.getProtocol())) { + return new File(url.toURI()).length(); + } + + final long len = url.openConnection().getContentLengthLong(); + if (len < 0) { + throw new MALException("The Blob URL length is unknown: " + uvalue); + } + return len; + } catch (IOException | java.net.URISyntaxException ex) { + throw new MALException("The Blob URL length could not be determined: " + uvalue, ex); + } + } + + return (value != null) ? value.length : 0; + } + /** * Returns the URL of this Blob. * diff --git a/encodings/encoding-binary/src/main/java/esa/mo/mal/encoder/binary/base/BaseBinaryEncoder.java b/encodings/encoding-binary/src/main/java/esa/mo/mal/encoder/binary/base/BaseBinaryEncoder.java index 22aaaff3..8640e1d2 100644 --- a/encodings/encoding-binary/src/main/java/esa/mo/mal/encoder/binary/base/BaseBinaryEncoder.java +++ b/encodings/encoding-binary/src/main/java/esa/mo/mal/encoder/binary/base/BaseBinaryEncoder.java @@ -21,6 +21,7 @@ package esa.mo.mal.encoder.binary.base; import java.io.IOException; +import java.io.InputStream; import java.io.OutputStream; import org.ccsds.moims.mo.mal.MALException; import org.ccsds.moims.mo.mal.encoding.Encoder; @@ -121,6 +122,45 @@ public void writeBytes(final byte[] value) throws IOException { } } + @Override + public void writeStream(final InputStream input, final long length) throws IOException { + if (length > Integer.MAX_VALUE) { + throw new IOException("Blob is too large to encode: " + length + + " bytes exceeds the maximum of " + Integer.MAX_VALUE + + " supported by this encoding's 32-bit length field"); + } + writeUnsignedInt((int) length); + copyStream(input, length); + } + + /** + * Copies exactly {@code length} bytes from the input to the output stream + * in fixed-size chunks, without holding the whole payload in memory. The + * input stream is always closed. The length prefix must already have been + * written by the caller. + * + * @param input the source of the bytes to copy. + * @param length the number of bytes to copy. + * @throws IOException if there is a problem reading or writing, or if the + * input ends before {@code length} bytes have been copied. + */ + protected void copyStream(final InputStream input, final long length) throws IOException { + try (InputStream in = input) { + final byte[] chunk = new byte[65536]; + long remaining = length; + int read; + while (remaining > 0 + && (read = in.read(chunk, 0, (int) Math.min(chunk.length, remaining))) != -1) { + write(chunk, 0, read); + remaining -= read; + } + if (remaining != 0) { + throw new IOException("Blob stream ended early: " + remaining + + " of " + length + " bytes were missing"); + } + } + } + @Override public void writeString(String value) throws IOException { writeBytes(value.getBytes(UTF8_CHARSET)); diff --git a/encodings/encoding-binary/src/main/java/esa/mo/mal/encoder/binary/fixed/FixedBinaryEncoder.java b/encodings/encoding-binary/src/main/java/esa/mo/mal/encoder/binary/fixed/FixedBinaryEncoder.java index 1554bb7e..be6a1712 100644 --- a/encodings/encoding-binary/src/main/java/esa/mo/mal/encoder/binary/fixed/FixedBinaryEncoder.java +++ b/encodings/encoding-binary/src/main/java/esa/mo/mal/encoder/binary/fixed/FixedBinaryEncoder.java @@ -22,6 +22,7 @@ import esa.mo.mal.encoder.binary.base.BinaryTimeHandler; import java.io.IOException; +import java.io.InputStream; import java.io.OutputStream; import java.math.BigInteger; import org.ccsds.moims.mo.mal.encoding.StreamHolder; @@ -165,5 +166,21 @@ public void writeBytes(final byte[] value) throws IOException { write(value); } } + + @Override + public void writeStream(final InputStream input, final long length) throws IOException { + final long max = shortLengthField ? 0xFFFFL : Integer.MAX_VALUE; + if (length > max) { + throw new IOException("Blob is too large to encode: " + length + + " bytes exceeds the maximum of " + max + + " supported by this encoding's length field"); + } + if (shortLengthField) { + writeUnsignedShort((int) length); + } else { + writeUnsignedInt((int) length); + } + copyStream(input, length); + } } } diff --git a/testbeds/testbed-encoders/src/test/java/esa/mo/mal/encoders/LargeBlobTest.java b/testbeds/testbed-encoders/src/test/java/esa/mo/mal/encoders/LargeBlobTest.java new file mode 100644 index 00000000..aa424506 --- /dev/null +++ b/testbeds/testbed-encoders/src/test/java/esa/mo/mal/encoders/LargeBlobTest.java @@ -0,0 +1,125 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO Transport Framework + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.mal.encoders; + +import esa.mo.mal.encoder.binary.base.BinaryTimeHandler; +import esa.mo.mal.encoder.binary.fixed.FixedBinaryDecoder; +import esa.mo.mal.encoder.binary.fixed.FixedBinaryEncoder; +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.Random; +import org.ccsds.moims.mo.mal.structures.Blob; +import org.ccsds.moims.mo.mal.structures.Element; +import static org.junit.Assume.assumeTrue; +import org.junit.Ignore; +import org.junit.Test; + +/** + * Probes whether a Blob larger than 2 GB can be encoded and decoded: + * generate a 3 GB file, wrap it in a Blob, encode, then decode. + */ +public class LargeBlobTest { + + private static final long SIZE = 3L * 1024 * 1024 * 1024; // 3 GB (on purpose > 2 GB) + + @Ignore("A Blob larger than 2 GB cannot yet be encoded (the length prefix is a " + + "32-bit field); this probe is expected to fail until that is addressed. " + + "Enable it manually to reproduce the limitation.") + @Test + public void encodeThenDecode3GBBlob() throws Exception { + File dir = new File("target/large-blob-test"); + dir.mkdirs(); + File srcFile = new File(dir, "blob-3gb.bin"); + File encodedFile = new File(dir, "encoded.bin"); + + // Pre-flight resource checks. This test deliberately uses a 3 GB Blob to + // exercise the >2 GB limitation. Without enough heap or disk it would fail + // for the wrong reason (a heap OutOfMemoryError, or "No space left on + // device") which would mask the actual Blob limitation. In that case, + // alert and skip the test rather than report a misleading failure. + long maxHeap = Runtime.getRuntime().maxMemory(); + long freeDisk = dir.getUsableSpace(); + + if (maxHeap < SIZE) { + System.err.println("ALERT: skipping - not enough heap for a " + SIZE + + " byte Blob. Need -Xmx >= " + SIZE + " bytes, have " + maxHeap + + ". The test would fail with a heap OutOfMemoryError for lack of RAM," + + " not because of the Blob 2 GB limitation."); + } + if (freeDisk < SIZE) { + System.err.println("ALERT: skipping - not enough free disk to generate a " + SIZE + + " byte file in " + dir.getAbsolutePath() + ". Need " + SIZE + + " bytes, have " + freeDisk + ". The test would fail while writing the" + + " file, not because of the Blob limitation."); + } + assumeTrue("Not enough heap (-Xmx) for a 3 GB Blob", maxHeap >= SIZE); + assumeTrue("Not enough free disk for a 3 GB file", freeDisk >= SIZE); + + try { + // 1. Generate a 3 GB file with random content + System.out.println("[1] Generating " + SIZE + " byte random file..."); + byte[] chunk = new byte[8 * 1024 * 1024]; + Random rnd = new Random(42); + long written = 0; + try (OutputStream os = new BufferedOutputStream(new FileOutputStream(srcFile))) { + while (written < SIZE) { + rnd.nextBytes(chunk); + int toWrite = (int) Math.min(chunk.length, SIZE - written); + os.write(chunk, 0, toWrite); + written += toWrite; + } + } + System.out.println(" File generated: " + srcFile.length() + " bytes"); + + // 2. Create a Blob with it (file-based: a byte[] cannot hold 3 GB) + Blob blob = new Blob(srcFile); + System.out.println("[2] Blob created: " + blob); + + // 3. Encode + System.out.println("[3] Encoding..."); + try (OutputStream fos = new BufferedOutputStream(new FileOutputStream(encodedFile))) { + FixedBinaryEncoder encoder = new FixedBinaryEncoder(fos, new BinaryTimeHandler(), false); + blob.encode(encoder); + encoder.close(); + } + System.out.println(" Encoded: " + encodedFile.length() + " bytes"); + + // 4. Decode + System.out.println("[4] Decoding..."); + try (InputStream fis = new BufferedInputStream(new FileInputStream(encodedFile))) { + FixedBinaryDecoder decoder = new FixedBinaryDecoder(fis, new BinaryTimeHandler(), false); + Element decoded = new Blob().decode(decoder); + System.out.println(" Decoded: " + decoded); + } + + System.out.println("RESULT: PASS"); + } finally { + srcFile.delete(); + encodedFile.delete(); + dir.delete(); + } + } +} From 633500119cce8674c23a64546caeff6073ce0add Mon Sep 17 00:00:00 2001 From: Cesar Coelho Date: Sat, 25 Jul 2026 23:15:22 +0200 Subject: [PATCH 11/45] Remove unused imports from StringEncoderDecoderTest Co-Authored-By: Claude Opus 4.8 --- .../test/java/esa/mo/mal/encoders/StringEncoderDecoderTest.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/testbeds/testbed-encoders/src/test/java/esa/mo/mal/encoders/StringEncoderDecoderTest.java b/testbeds/testbed-encoders/src/test/java/esa/mo/mal/encoders/StringEncoderDecoderTest.java index 35e7dad2..fc6ae163 100644 --- a/testbeds/testbed-encoders/src/test/java/esa/mo/mal/encoders/StringEncoderDecoderTest.java +++ b/testbeds/testbed-encoders/src/test/java/esa/mo/mal/encoders/StringEncoderDecoderTest.java @@ -26,9 +26,7 @@ import java.io.ByteArrayOutputStream; import java.nio.charset.StandardCharsets; import java.util.Arrays; -import org.ccsds.moims.mo.mal.MALContextFactory; import org.ccsds.moims.mo.mal.MALException; -import org.ccsds.moims.mo.mal.MALHelper; import org.ccsds.moims.mo.mal.OperationField; import org.ccsds.moims.mo.mal.encoding.MALElementInputStream; import org.ccsds.moims.mo.mal.encoding.MALElementOutputStream; From 31d24a64b60a7fdb65e2fd0b7c92b7167b67bfbe Mon Sep 17 00:00:00 2001 From: Cesar Coelho Date: Wed, 29 Jul 2026 19:05:28 +0200 Subject: [PATCH 12/45] Exercise >2 GB Blob encode/decode in LargeBlobTest Enable the previously @Ignore'd probe and run it over fixed binary (FixedBinaryEncoder/Decoder), so it exercises a full 3 GB Blob round-trip rather than documenting the limitation. Extract the random-file generation into a reusable public static generateRandomFile(File, long) helper that writes in fixed-size chunks, so other tests can reuse it and generation never holds the whole file in memory. The test still guards on available heap/disk and skips (via assumeTrue) when they are insufficient. Co-Authored-By: Claude Opus 4.8 --- .../esa/mo/mal/encoders/LargeBlobTest.java | 41 ++++++++++++------- 1 file changed, 26 insertions(+), 15 deletions(-) diff --git a/testbeds/testbed-encoders/src/test/java/esa/mo/mal/encoders/LargeBlobTest.java b/testbeds/testbed-encoders/src/test/java/esa/mo/mal/encoders/LargeBlobTest.java index aa424506..cc4609b2 100644 --- a/testbeds/testbed-encoders/src/test/java/esa/mo/mal/encoders/LargeBlobTest.java +++ b/testbeds/testbed-encoders/src/test/java/esa/mo/mal/encoders/LargeBlobTest.java @@ -28,13 +28,13 @@ import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; +import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.Random; import org.ccsds.moims.mo.mal.structures.Blob; import org.ccsds.moims.mo.mal.structures.Element; import static org.junit.Assume.assumeTrue; -import org.junit.Ignore; import org.junit.Test; /** @@ -45,9 +45,6 @@ public class LargeBlobTest { private static final long SIZE = 3L * 1024 * 1024 * 1024; // 3 GB (on purpose > 2 GB) - @Ignore("A Blob larger than 2 GB cannot yet be encoded (the length prefix is a " - + "32-bit field); this probe is expected to fail until that is addressed. " - + "Enable it manually to reproduce the limitation.") @Test public void encodeThenDecode3GBBlob() throws Exception { File dir = new File("target/large-blob-test"); @@ -81,17 +78,7 @@ public void encodeThenDecode3GBBlob() throws Exception { try { // 1. Generate a 3 GB file with random content System.out.println("[1] Generating " + SIZE + " byte random file..."); - byte[] chunk = new byte[8 * 1024 * 1024]; - Random rnd = new Random(42); - long written = 0; - try (OutputStream os = new BufferedOutputStream(new FileOutputStream(srcFile))) { - while (written < SIZE) { - rnd.nextBytes(chunk); - int toWrite = (int) Math.min(chunk.length, SIZE - written); - os.write(chunk, 0, toWrite); - written += toWrite; - } - } + generateRandomFile(srcFile, SIZE); System.out.println(" File generated: " + srcFile.length() + " bytes"); // 2. Create a Blob with it (file-based: a byte[] cannot hold 3 GB) @@ -122,4 +109,28 @@ public void encodeThenDecode3GBBlob() throws Exception { dir.delete(); } } + + /** + * Generates a file of the given size filled with deterministic pseudo-random + * bytes. The content is written in fixed-size chunks so the generation itself + * never holds the whole file in memory, allowing sizes larger than the heap. + * Reusable by any test that needs a large file. + * + * @param file the file to (over)write. + * @param size the number of bytes to write. + * @throws IOException if the file could not be written. + */ + public static void generateRandomFile(File file, long size) throws IOException { + byte[] chunk = new byte[8 * 1024 * 1024]; + Random rnd = new Random(42); + long written = 0; + try (OutputStream os = new BufferedOutputStream(new FileOutputStream(file))) { + while (written < size) { + rnd.nextBytes(chunk); + int toWrite = (int) Math.min(chunk.length, size - written); + os.write(chunk, 0, toWrite); + written += toWrite; + } + } + } } From f6067c2243466c02c5d8d59abdf5f8891ffc3441 Mon Sep 17 00:00:00 2001 From: Cesar Coelho Date: Wed, 29 Jul 2026 20:20:55 +0200 Subject: [PATCH 13/45] Encode/decode Blob length as 64-bit so Blobs above 2 GB work The Blob body was framed with a 32-bit length, capping a Blob at 2 GB even after the encode path was made streaming. Frame it with a 64-bit length instead: - Encode: BaseBinaryStreamHolder.writeStream writes the length via writeUnsignedLong and streams the body in chunks. FixedBinaryStreamHolder no longer overrides writeStream, so both inherit it and dispatch to their own writeUnsignedLong. For the variable-length encoding a varint of a value <= Integer.MAX_VALUE is byte-identical to the old 32-bit length, so existing data stays readable; only lengths above 2 GB use the new range. - Decode: BaseBinaryDecoder overrides decodeBlob to read the 64-bit length, return a byte-array-backed Blob up to the max array size, and spool larger bodies to a temporary file (streamed via readBytesInto), returning a file-backed Blob so a Blob above 2 GB is never held in memory. The byte[] boundary is Integer.MAX_VALUE - 8: the JVM rejects arrays within a few bytes of Integer.MAX_VALUE. LargeBlobTest now round-trips a range of sizes (512 KB, 32 MB, 1 GB, 3 GB, 5 GB) through a shared method, asserts the decoded length matches, logs each step with its duration, and cleans up source, encoded and spooled temporary files. Co-Authored-By: Claude Opus 4.8 --- .../binary/base/BaseBinaryDecoder.java | 82 ++++++++++++ .../binary/base/BaseBinaryEncoder.java | 11 +- .../binary/fixed/FixedBinaryEncoder.java | 16 --- .../esa/mo/mal/encoders/LargeBlobTest.java | 120 +++++++++++------- 4 files changed, 164 insertions(+), 65 deletions(-) diff --git a/encodings/encoding-binary/src/main/java/esa/mo/mal/encoder/binary/base/BaseBinaryDecoder.java b/encodings/encoding-binary/src/main/java/esa/mo/mal/encoder/binary/base/BaseBinaryDecoder.java index c4b384c7..6e058476 100644 --- a/encodings/encoding-binary/src/main/java/esa/mo/mal/encoder/binary/base/BaseBinaryDecoder.java +++ b/encodings/encoding-binary/src/main/java/esa/mo/mal/encoder/binary/base/BaseBinaryDecoder.java @@ -20,7 +20,10 @@ */ package esa.mo.mal.encoder.binary.base; +import java.io.File; +import java.io.FileOutputStream; import java.io.IOException; +import java.io.OutputStream; import java.nio.charset.Charset; import java.util.Arrays; import java.util.logging.Level; @@ -28,6 +31,7 @@ import org.ccsds.moims.mo.mal.MALException; import org.ccsds.moims.mo.mal.encoding.BufferHolder; import org.ccsds.moims.mo.mal.encoding.Decoder; +import org.ccsds.moims.mo.mal.structures.Blob; import org.ccsds.moims.mo.mal.structures.Duration; import org.ccsds.moims.mo.mal.structures.Element; import org.ccsds.moims.mo.mal.structures.Enumeration; @@ -42,6 +46,10 @@ public abstract class BaseBinaryDecoder extends Decoder { private static final Logger LOGGER = Logger.getLogger(BaseBinaryDecoder.class.getName()); protected static final Charset UTF8_CHARSET = Charset.forName("UTF-8"); protected static final int BLOCK_SIZE = 65536; + // The largest array the JVM will allocate: HotSpot rejects sizes within a + // few bytes of Integer.MAX_VALUE with "Requested array size exceeds VM + // limit", so a byte-array-backed Blob is capped here and larger ones spool. + private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8; protected final BinaryTimeHandler timeHandler; @@ -91,6 +99,37 @@ public Element decodeEnumeration(Enumeration enumeration) throws MALException { throw new MALException("The Enumeration could not be decoded!"); } + /** + * Decodes a Blob whose body is preceded by a 64-bit length (see the matching + * {@code writeStream} in the encoder). Bodies that fit in a single byte array + * are returned as a byte-array-backed Blob; larger ones are spooled to a + * temporary file and returned as a file-backed Blob, so a Blob above 2 GB is + * never held in memory. + * + * @return the decoded Blob. + * @throws MALException if the Blob could not be decoded. + */ + @Override + public Blob decodeBlob() throws MALException { + final long length = sourceBuffer.readUnsignedLong(); + + if (length <= MAX_ARRAY_SIZE) { + return new Blob(sourceBuffer.readBytes((int) length)); + } + + // Too large for a single byte array: spool the body to a temporary file. + try { + final File tmp = File.createTempFile("mal-blob-", ".bin"); + tmp.deleteOnExit(); + try (OutputStream os = new java.io.BufferedOutputStream(new FileOutputStream(tmp))) { + getBufferHolder().getBuf().readBytesInto(os, length); + } + return new Blob(tmp); + } catch (IOException ex) { + throw new MALException("Unable to spool a large Blob to a temporary file", ex); + } + } + /** * Returns the source buffer. * @@ -244,6 +283,49 @@ public byte[] directGetBytes(final int size) throws MALException { throw new IllegalArgumentException("Size must not be negative"); } + /** + * Streams exactly {@code length} bytes to the given output without holding + * them all in memory. Any bytes already buffered are drained first, then + * the remainder is read straight from the input stream in chunks. Used to + * spool a Blob that is too large to fit in a single byte array. + * + * @param out the output to write the bytes to. + * @param length the number of bytes to stream. + * @throws MALException if the bytes could not be read or written. + */ + public void readBytesInto(final OutputStream out, final long length) throws MALException { + long remaining = length; + try { + // Drain whatever is already buffered. + if (buf != null && offset < contentLength) { + final int fromBuf = (int) Math.min(contentLength - offset, remaining); + out.write(buf, offset, fromBuf); + offset += fromBuf; + remaining -= fromBuf; + } + + if (remaining > 0 && inputStream == null) { + throw new MALException("Unable to read " + remaining + " more bytes: " + + "the buffer is exhausted and there is no input stream"); + } + + // Stream the rest straight from the input stream in fixed chunks. + final byte[] chunk = new byte[BLOCK_SIZE]; + while (remaining > 0) { + final int toRead = (int) Math.min(chunk.length, remaining); + final int read = inputStream.read(chunk, 0, toRead); + if (read < 0) { + throw new MALException("End of stream while reading the Blob body; " + + remaining + " bytes were missing"); + } + out.write(chunk, 0, read); + remaining -= read; + } + } catch (IOException ex) { + throw new MALException("Unable to stream the Blob body from the source", ex); + } + } + /** * Ensures that we have loaded enough buffer from the input stream (if * we are stream based) for the next read. diff --git a/encodings/encoding-binary/src/main/java/esa/mo/mal/encoder/binary/base/BaseBinaryEncoder.java b/encodings/encoding-binary/src/main/java/esa/mo/mal/encoder/binary/base/BaseBinaryEncoder.java index 8640e1d2..e5532fed 100644 --- a/encodings/encoding-binary/src/main/java/esa/mo/mal/encoder/binary/base/BaseBinaryEncoder.java +++ b/encodings/encoding-binary/src/main/java/esa/mo/mal/encoder/binary/base/BaseBinaryEncoder.java @@ -124,12 +124,11 @@ public void writeBytes(final byte[] value) throws IOException { @Override public void writeStream(final InputStream input, final long length) throws IOException { - if (length > Integer.MAX_VALUE) { - throw new IOException("Blob is too large to encode: " + length - + " bytes exceeds the maximum of " + Integer.MAX_VALUE - + " supported by this encoding's 32-bit length field"); - } - writeUnsignedInt((int) length); + // Blobs use a 64-bit length so they are not capped at 2 GB. For the + // variable-length encoding a varint of a value <= Integer.MAX_VALUE is + // byte-identical to the old 32-bit length, so existing data stays + // readable; only lengths above 2 GB use the extended range. + writeUnsignedLong(length); copyStream(input, length); } diff --git a/encodings/encoding-binary/src/main/java/esa/mo/mal/encoder/binary/fixed/FixedBinaryEncoder.java b/encodings/encoding-binary/src/main/java/esa/mo/mal/encoder/binary/fixed/FixedBinaryEncoder.java index be6a1712..3327ddac 100644 --- a/encodings/encoding-binary/src/main/java/esa/mo/mal/encoder/binary/fixed/FixedBinaryEncoder.java +++ b/encodings/encoding-binary/src/main/java/esa/mo/mal/encoder/binary/fixed/FixedBinaryEncoder.java @@ -22,7 +22,6 @@ import esa.mo.mal.encoder.binary.base.BinaryTimeHandler; import java.io.IOException; -import java.io.InputStream; import java.io.OutputStream; import java.math.BigInteger; import org.ccsds.moims.mo.mal.encoding.StreamHolder; @@ -167,20 +166,5 @@ public void writeBytes(final byte[] value) throws IOException { } } - @Override - public void writeStream(final InputStream input, final long length) throws IOException { - final long max = shortLengthField ? 0xFFFFL : Integer.MAX_VALUE; - if (length > max) { - throw new IOException("Blob is too large to encode: " + length - + " bytes exceeds the maximum of " + max - + " supported by this encoding's length field"); - } - if (shortLengthField) { - writeUnsignedShort((int) length); - } else { - writeUnsignedInt((int) length); - } - copyStream(input, length); - } } } diff --git a/testbeds/testbed-encoders/src/test/java/esa/mo/mal/encoders/LargeBlobTest.java b/testbeds/testbed-encoders/src/test/java/esa/mo/mal/encoders/LargeBlobTest.java index cc4609b2..27f3b39f 100644 --- a/testbeds/testbed-encoders/src/test/java/esa/mo/mal/encoders/LargeBlobTest.java +++ b/testbeds/testbed-encoders/src/test/java/esa/mo/mal/encoders/LargeBlobTest.java @@ -31,78 +31,101 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.net.URI; import java.util.Random; import org.ccsds.moims.mo.mal.structures.Blob; -import org.ccsds.moims.mo.mal.structures.Element; -import static org.junit.Assume.assumeTrue; +import static org.junit.Assert.assertEquals; import org.junit.Test; /** - * Probes whether a Blob larger than 2 GB can be encoded and decoded: - * generate a 3 GB file, wrap it in a Blob, encode, then decode. + * Encodes and decodes Blobs of a range of sizes, including sizes larger than + * 2 GB, to check that the whole round-trip is streamed (never fully held in + * memory) and preserves the content length. */ public class LargeBlobTest { - private static final long SIZE = 3L * 1024 * 1024 * 1024; // 3 GB (on purpose > 2 GB) + private static final long KB = 1024; + private static final long MB = 1024 * KB; + private static final long GB = 1024 * MB; @Test - public void encodeThenDecode3GBBlob() throws Exception { + public void blob512KB() throws Exception { + encodeThenDecodeBlob("512 KB", 512 * KB); + } + + @Test + public void blob32MB() throws Exception { + encodeThenDecodeBlob("32 MB", 32 * MB); + } + + @Test + public void blob1GB() throws Exception { + encodeThenDecodeBlob("1 GB", 1 * GB); + } + + @Test + public void blob3GB() throws Exception { + encodeThenDecodeBlob("3 GB", 3 * GB); + } + + @Test + public void blob5GB() throws Exception { + encodeThenDecodeBlob("5 GB", 5 * GB); + } + + /** + * Generates a random file of the given size, wraps it in a Blob, encodes it + * with the fixed binary encoder, decodes it back and checks the decoded Blob + * has the same length. The round-trip is streamed, so it works for files + * larger than the heap. Source, encoded and any spooled temporary files are + * cleaned up afterwards. + * + * @param label a human-readable size label, for messages. + * @param size the Blob size in bytes. + * @throws Exception if the round-trip fails. + */ + private void encodeThenDecodeBlob(String label, long size) throws Exception { + System.out.println("=== " + label + " (" + size + " bytes) ==="); + File dir = new File("target/large-blob-test"); dir.mkdirs(); - File srcFile = new File(dir, "blob-3gb.bin"); + File srcFile = new File(dir, "blob-src.bin"); File encodedFile = new File(dir, "encoded.bin"); - // Pre-flight resource checks. This test deliberately uses a 3 GB Blob to - // exercise the >2 GB limitation. Without enough heap or disk it would fail - // for the wrong reason (a heap OutOfMemoryError, or "No space left on - // device") which would mask the actual Blob limitation. In that case, - // alert and skip the test rather than report a misleading failure. - long maxHeap = Runtime.getRuntime().maxMemory(); - long freeDisk = dir.getUsableSpace(); - - if (maxHeap < SIZE) { - System.err.println("ALERT: skipping - not enough heap for a " + SIZE - + " byte Blob. Need -Xmx >= " + SIZE + " bytes, have " + maxHeap - + ". The test would fail with a heap OutOfMemoryError for lack of RAM," - + " not because of the Blob 2 GB limitation."); - } - if (freeDisk < SIZE) { - System.err.println("ALERT: skipping - not enough free disk to generate a " + SIZE - + " byte file in " + dir.getAbsolutePath() + ". Need " + SIZE - + " bytes, have " + freeDisk + ". The test would fail while writing the" - + " file, not because of the Blob limitation."); - } - assumeTrue("Not enough heap (-Xmx) for a 3 GB Blob", maxHeap >= SIZE); - assumeTrue("Not enough free disk for a 3 GB file", freeDisk >= SIZE); - try { - // 1. Generate a 3 GB file with random content - System.out.println("[1] Generating " + SIZE + " byte random file..."); - generateRandomFile(srcFile, SIZE); - System.out.println(" File generated: " + srcFile.length() + " bytes"); + // 1. Generate a file of the requested size with random content + long start = System.nanoTime(); + generateRandomFile(srcFile, size); + System.out.println("[1] Generated " + srcFile.length() + " byte file in " + + elapsedMs(start) + " ms"); - // 2. Create a Blob with it (file-based: a byte[] cannot hold 3 GB) + // 2. Wrap it in a Blob (file-based, so a byte[] is never needed) Blob blob = new Blob(srcFile); System.out.println("[2] Blob created: " + blob); // 3. Encode - System.out.println("[3] Encoding..."); + start = System.nanoTime(); try (OutputStream fos = new BufferedOutputStream(new FileOutputStream(encodedFile))) { FixedBinaryEncoder encoder = new FixedBinaryEncoder(fos, new BinaryTimeHandler(), false); blob.encode(encoder); encoder.close(); } - System.out.println(" Encoded: " + encodedFile.length() + " bytes"); + System.out.println("[3] Encoded " + encodedFile.length() + " bytes in " + + elapsedMs(start) + " ms"); - // 4. Decode - System.out.println("[4] Decoding..."); + // 4. Decode and check the content length survived the round-trip + start = System.nanoTime(); try (InputStream fis = new BufferedInputStream(new FileInputStream(encodedFile))) { FixedBinaryDecoder decoder = new FixedBinaryDecoder(fis, new BinaryTimeHandler(), false); - Element decoded = new Blob().decode(decoder); - System.out.println(" Decoded: " + decoded); - } + Blob decoded = (Blob) new Blob().decode(decoder); + System.out.println("[4] Decoded " + decoded + " in " + elapsedMs(start) + " ms"); + assertEquals(label + ": decoded length", size, decoded.getLengthLong()); - System.out.println("RESULT: PASS"); + // Remove the temporary file the decoder spools large Blobs into + if (decoded.isURLBased()) { + new File(URI.create(decoded.getURL())).delete(); + } + } } finally { srcFile.delete(); encodedFile.delete(); @@ -110,6 +133,17 @@ public void encodeThenDecode3GBBlob() throws Exception { } } + /** + * Returns the number of milliseconds elapsed since the given nanosecond + * timestamp. + * + * @param startNanos the start time, from {@link System#nanoTime()}. + * @return the elapsed time in milliseconds. + */ + private static long elapsedMs(long startNanos) { + return (System.nanoTime() - startNanos) / 1_000_000; + } + /** * Generates a file of the given size filled with deterministic pseudo-random * bytes. The content is written in fixed-size chunks so the generation itself From 9be43d9e72becc9e5e7e5c4399a44d787ca4ce61 Mon Sep 17 00:00:00 2001 From: Cesar Coelho Date: Wed, 29 Jul 2026 20:52:11 +0200 Subject: [PATCH 14/45] Run LargeBlobTest cases in ascending size order JUnit's default method order is hash-based, so the size cases ran in an arbitrary order. Add @FixMethodOrder(NAME_ASCENDING) and give the methods a numeric prefix so they execute smallest to largest, making the logged timings read in order. Co-Authored-By: Claude Opus 4.8 --- .../java/esa/mo/mal/encoders/LargeBlobTest.java | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/testbeds/testbed-encoders/src/test/java/esa/mo/mal/encoders/LargeBlobTest.java b/testbeds/testbed-encoders/src/test/java/esa/mo/mal/encoders/LargeBlobTest.java index 27f3b39f..7dbe6fcb 100644 --- a/testbeds/testbed-encoders/src/test/java/esa/mo/mal/encoders/LargeBlobTest.java +++ b/testbeds/testbed-encoders/src/test/java/esa/mo/mal/encoders/LargeBlobTest.java @@ -35,13 +35,16 @@ import java.util.Random; import org.ccsds.moims.mo.mal.structures.Blob; import static org.junit.Assert.assertEquals; +import org.junit.FixMethodOrder; import org.junit.Test; +import org.junit.runners.MethodSorters; /** * Encodes and decodes Blobs of a range of sizes, including sizes larger than * 2 GB, to check that the whole round-trip is streamed (never fully held in * memory) and preserves the content length. */ +@FixMethodOrder(MethodSorters.NAME_ASCENDING) public class LargeBlobTest { private static final long KB = 1024; @@ -49,27 +52,27 @@ public class LargeBlobTest { private static final long GB = 1024 * MB; @Test - public void blob512KB() throws Exception { + public void blob1_512KB() throws Exception { encodeThenDecodeBlob("512 KB", 512 * KB); } @Test - public void blob32MB() throws Exception { + public void blob2_32MB() throws Exception { encodeThenDecodeBlob("32 MB", 32 * MB); } @Test - public void blob1GB() throws Exception { + public void blob3_1GB() throws Exception { encodeThenDecodeBlob("1 GB", 1 * GB); } @Test - public void blob3GB() throws Exception { + public void blob4_3GB() throws Exception { encodeThenDecodeBlob("3 GB", 3 * GB); } @Test - public void blob5GB() throws Exception { + public void blob5_5GB() throws Exception { encodeThenDecodeBlob("5 GB", 5 * GB); } From 25180a3141b3142bf0290c740860ab1a0cafa787 Mon Sep 17 00:00:00 2001 From: Cesar Coelho Date: Fri, 31 Jul 2026 22:44:57 +0200 Subject: [PATCH 15/45] Remove unused imports from MC API and service implementations Drops 10 imports that no longer resolve to any code reference in apis/api-area004-v002-mc and services-impl/services-area004-v002-mc. Co-Authored-By: Claude Opus 5 --- .../src/main/java/org/ccsds/moims/mo/mc/ParameterDataset.java | 2 -- .../java/org/ccsds/moims/mo/mc/backends/PacketBackend.java | 1 - .../java/org/ccsds/moims/mo/mc/backends/ParameterBackend.java | 1 - .../esa/mo/services/mc/consumer/AlertConsumerServiceImpl.java | 2 -- .../mo/services/mc/provider/ActionProviderServiceImpl.java | 4 ---- 5 files changed, 10 deletions(-) diff --git a/apis/api-area004-v002-mc/src/main/java/org/ccsds/moims/mo/mc/ParameterDataset.java b/apis/api-area004-v002-mc/src/main/java/org/ccsds/moims/mo/mc/ParameterDataset.java index 211a1f16..f52e9ab4 100644 --- a/apis/api-area004-v002-mc/src/main/java/org/ccsds/moims/mo/mc/ParameterDataset.java +++ b/apis/api-area004-v002-mc/src/main/java/org/ccsds/moims/mo/mc/ParameterDataset.java @@ -31,8 +31,6 @@ import org.ccsds.moims.mo.mal.structures.Attribute; import org.ccsds.moims.mo.mal.structures.AttributeType; -import org.ccsds.moims.mo.mal.structures.Identifier; -import org.ccsds.moims.mo.mal.structures.IdentifierList; import org.ccsds.moims.mo.mal.structures.ObjectIdentity; import org.ccsds.moims.mo.mc.backends.BackendTimer; import org.ccsds.moims.mo.mc.backends.ConversionFunction; diff --git a/apis/api-area004-v002-mc/src/main/java/org/ccsds/moims/mo/mc/backends/PacketBackend.java b/apis/api-area004-v002-mc/src/main/java/org/ccsds/moims/mo/mc/backends/PacketBackend.java index 24eaabb1..846c25a5 100644 --- a/apis/api-area004-v002-mc/src/main/java/org/ccsds/moims/mo/mc/backends/PacketBackend.java +++ b/apis/api-area004-v002-mc/src/main/java/org/ccsds/moims/mo/mc/backends/PacketBackend.java @@ -28,7 +28,6 @@ import org.ccsds.moims.mo.mal.structures.IdentifierList; import org.ccsds.moims.mo.mal.structures.NullableAttributeList; import org.ccsds.moims.mo.mal.structures.Time; -import org.ccsds.moims.mo.mc.backends.AlertBackend.AlertListener; /** * The Backend interface to the Packet service. diff --git a/apis/api-area004-v002-mc/src/main/java/org/ccsds/moims/mo/mc/backends/ParameterBackend.java b/apis/api-area004-v002-mc/src/main/java/org/ccsds/moims/mo/mc/backends/ParameterBackend.java index c4f22257..ae559267 100644 --- a/apis/api-area004-v002-mc/src/main/java/org/ccsds/moims/mo/mc/backends/ParameterBackend.java +++ b/apis/api-area004-v002-mc/src/main/java/org/ccsds/moims/mo/mc/backends/ParameterBackend.java @@ -23,7 +23,6 @@ */ package org.ccsds.moims.mo.mc.backends; -import java.io.IOException; import org.ccsds.moims.mo.mal.structures.Attribute; import org.ccsds.moims.mo.mc.structures.ParameterDefinitionList; diff --git a/services-impl/services-area004-v002-mc/src/main/java/esa/mo/services/mc/consumer/AlertConsumerServiceImpl.java b/services-impl/services-area004-v002-mc/src/main/java/esa/mo/services/mc/consumer/AlertConsumerServiceImpl.java index 6380498c..11861678 100644 --- a/services-impl/services-area004-v002-mc/src/main/java/esa/mo/services/mc/consumer/AlertConsumerServiceImpl.java +++ b/services-impl/services-area004-v002-mc/src/main/java/esa/mo/services/mc/consumer/AlertConsumerServiceImpl.java @@ -27,8 +27,6 @@ import org.ccsds.moims.mo.mal.helpertools.connections.SingleConnectionDetails; import org.ccsds.moims.mo.mal.helpertools.misc.ConsumerServiceImpl; import org.ccsds.moims.mo.mal.structures.Blob; -import org.ccsds.moims.mo.mc.aggregation.AggregationHelper; -import org.ccsds.moims.mo.mc.aggregation.consumer.AggregationStub; import org.ccsds.moims.mo.mc.alert.AlertHelper; import org.ccsds.moims.mo.mc.alert.consumer.AlertStub; diff --git a/services-impl/services-area004-v002-mc/src/main/java/esa/mo/services/mc/provider/ActionProviderServiceImpl.java b/services-impl/services-area004-v002-mc/src/main/java/esa/mo/services/mc/provider/ActionProviderServiceImpl.java index 36c21520..82a9e9b7 100644 --- a/services-impl/services-area004-v002-mc/src/main/java/esa/mo/services/mc/provider/ActionProviderServiceImpl.java +++ b/services-impl/services-area004-v002-mc/src/main/java/esa/mo/services/mc/provider/ActionProviderServiceImpl.java @@ -29,9 +29,7 @@ import java.util.logging.Logger; import org.ccsds.moims.mo.mal.MALException; -import org.ccsds.moims.mo.mal.MALHelper; import org.ccsds.moims.mo.mal.MALInteractionException; -import org.ccsds.moims.mo.mal.MOErrorException; import org.ccsds.moims.mo.mal.UnknownException; import org.ccsds.moims.mo.mal.helpertools.connections.ConfigurationProviderSingleton; import org.ccsds.moims.mo.mal.helpertools.connections.ConnectionProvider; @@ -52,13 +50,11 @@ import org.ccsds.moims.mo.mal.structures.UpdateHeader; import org.ccsds.moims.mo.mc.DuplicateException; import org.ccsds.moims.mo.mc.InvalidException; -import org.ccsds.moims.mo.mc.MCHelper; import org.ccsds.moims.mo.mc.RejectedException; import org.ccsds.moims.mo.mc.action.ActionHelper; import org.ccsds.moims.mo.mc.action.provider.ActionInheritanceSkeleton; import org.ccsds.moims.mo.mc.action.provider.MonitorExecutionPublisher; import org.ccsds.moims.mo.mc.backends.ActionBackend; -import org.ccsds.moims.mo.mc.structures.ActionCategory; import org.ccsds.moims.mo.mc.structures.ActionCompleteEvent; import org.ccsds.moims.mo.mc.structures.ActionDefinition; import org.ccsds.moims.mo.mc.structures.ActionDefinitionList; From 60f7c6334701ddc958b10aefa77ec3b366514728 Mon Sep 17 00:00:00 2001 From: Cesar Coelho Date: Sat, 1 Aug 2026 08:08:33 +0200 Subject: [PATCH 16/45] Extract the endpoint registry out of Transport Transport held two parallel HashMaps indexing every endpoint by MAL local name and by transport routing name, touched from eleven places spread across endpoint creation, deletion, message dispatch, the in-process shortcut and error replies. Move both maps and the operations over them into a new EndpointRegistry, so Transport delegates rather than manipulating the two maps in step. No behaviour change: the maps stay unsynchronised HashMaps as before. The two maps were protected, so this is source and binary incompatible for any transport outside this repository that reached into them. Nothing in mo-services-java or nanosat-mo-framework did. Co-Authored-By: Claude Opus 5 --- .../mal/transport/gen/EndpointRegistry.java | 131 ++++++++++++++++++ .../esa/mo/mal/transport/gen/Transport.java | 37 ++--- 2 files changed, 144 insertions(+), 24 deletions(-) create mode 100644 transports/transport-generic/src/main/java/esa/mo/mal/transport/gen/EndpointRegistry.java diff --git a/transports/transport-generic/src/main/java/esa/mo/mal/transport/gen/EndpointRegistry.java b/transports/transport-generic/src/main/java/esa/mo/mal/transport/gen/EndpointRegistry.java new file mode 100644 index 00000000..acffe651 --- /dev/null +++ b/transports/transport-generic/src/main/java/esa/mo/mal/transport/gen/EndpointRegistry.java @@ -0,0 +1,131 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2013 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO Generic Transport Framework + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.mal.transport.gen; + +import java.util.HashMap; +import java.util.Map; +import org.ccsds.moims.mo.mal.MALException; + +/** + * Holds the endpoints that belong to a transport. Each endpoint is indexed + * twice: once under the MAL local name it was created with, and once under the + * transport routing name derived from it. + */ +public class EndpointRegistry { + + /** + * Map of string MAL names to endpoints. + */ + private final Map endpointMalMap = new HashMap<>(); + /** + * Map of string transport routing names to endpoints. + */ + private final Map endpointRoutingMap = new HashMap<>(); + + /** + * Returns the endpoint registered under a MAL local name. + * + * @param localName The MAL local name. + * @return The endpoint, or null if none is registered. + */ + public Endpoint getByLocalName(final String localName) { + return endpointMalMap.get(localName); + } + + /** + * Returns the endpoint registered under a transport routing name. + * + * @param routingName The transport routing name. + * @return The endpoint, or null if none is registered. + */ + public Endpoint getByRoutingName(final String routingName) { + return endpointRoutingMap.get(routingName); + } + + /** + * Returns true if an endpoint is registered under a routing name. + * + * @param routingName The transport routing name. + * @return True if an endpoint is registered under that routing name. + */ + public boolean containsRoutingName(final String routingName) { + return endpointRoutingMap.containsKey(routingName); + } + + /** + * Registers an endpoint under both its MAL local name and its routing name. + * + * @param localName The MAL local name. + * @param routingName The transport routing name. + * @param endpoint The endpoint to register. + */ + public void add(final String localName, final String routingName, final Endpoint endpoint) { + endpointMalMap.put(localName, endpoint); + endpointRoutingMap.put(routingName, endpoint); + } + + /** + * Removes the endpoint registered under a MAL local name, together with its + * routing name entry. The endpoint itself is not closed. + * + * @param localName The MAL local name. + * @return The removed endpoint, or null if none was registered. + */ + public Endpoint remove(final String localName) { + final Endpoint endpoint = endpointMalMap.get(localName); + + if (endpoint != null) { + endpointMalMap.remove(localName); + endpointRoutingMap.remove(endpoint.getRoutingName()); + } + + return endpoint; + } + + /** + * Returns an arbitrary registered endpoint. Used when a message has to be + * sent that is not tied to any particular endpoint, such as an error reply + * for a message that could not be routed. + * + * @return Any registered endpoint, or null if none are registered. + */ + public Endpoint any() { + for (Endpoint endpoint : endpointMalMap.values()) { + return endpoint; + } + + return null; + } + + /** + * Closes every registered endpoint and empties the registry. + * + * @throws MALException if an endpoint could not be closed. + */ + public void closeAll() throws MALException { + for (Endpoint endpoint : endpointMalMap.values()) { + endpoint.close(); + } + + endpointMalMap.clear(); + endpointRoutingMap.clear(); + } +} diff --git a/transports/transport-generic/src/main/java/esa/mo/mal/transport/gen/Transport.java b/transports/transport-generic/src/main/java/esa/mo/mal/transport/gen/Transport.java index 803df45c..e6c5bd91 100644 --- a/transports/transport-generic/src/main/java/esa/mo/mal/transport/gen/Transport.java +++ b/transports/transport-generic/src/main/java/esa/mo/mal/transport/gen/Transport.java @@ -115,13 +115,10 @@ public abstract class Transport implements MALTransport { */ protected final String protocol; /** - * Map of string MAL names to endpoints. + * The endpoints created by this transport, indexed by MAL local name and by + * transport routing name. */ - protected final Map endpointMalMap = new HashMap<>(); - /** - * Map of string transport routing names to endpoints. - */ - protected final Map endpointRoutingMap = new HashMap<>(); + protected final EndpointRegistry endpoints = new EndpointRegistry(); /** * Map of QoS properties. */ @@ -265,14 +262,13 @@ public MALEndpoint createEndpoint(final String localName, final Map qosPropertie } final String strRoutingName = getLocalName(localName, localProperties); - Endpoint endpoint = endpointRoutingMap.get(strRoutingName); + Endpoint endpoint = endpoints.getByRoutingName(strRoutingName); if (endpoint == null) { LOGGER.log(Level.FINE, "Creating endpoint {0} : {1}", new Object[]{localName, strRoutingName}); endpoint = internalCreateEndpoint(localName, strRoutingName, localProperties, supplements); - endpointMalMap.put(localName, endpoint); - endpointRoutingMap.put(strRoutingName, endpoint); + endpoints.add(localName, strRoutingName, endpoint); } return endpoint; @@ -280,13 +276,13 @@ public MALEndpoint createEndpoint(final String localName, final Map qosPropertie @Override public MALEndpoint getEndpoint(final String localName) throws IllegalArgumentException { - return endpointMalMap.get(localName); + return endpoints.getByLocalName(localName); } @Override public MALEndpoint getEndpoint(final URI uri) throws IllegalArgumentException { String endpointUriPart = getRoutingPart(uri.getValue()); - return endpointRoutingMap.get(endpointUriPart); + return endpoints.getByRoutingName(endpointUriPart); } /** @@ -339,7 +335,7 @@ public void sendMessage(final Object multiSendHandle, final boolean lastForHandl if (inProcessSupport && (uriBase.startsWith(remoteRootURI) || remoteRootURI.startsWith(uriBase)) - && endpointRoutingMap.containsKey(endpointUriPart)) { + && endpoints.containsRoutingName(endpointUriPart)) { LOGGER.log(Level.FINE, "Routing msg internally to: {0}", new Object[]{endpointUriPart}); @@ -423,24 +419,17 @@ public void communicationError(String uriTo, ReceptionHandler receptionHandler) @Override public void deleteEndpoint(final String localName) throws MALException { - final Endpoint endpoint = endpointMalMap.get(localName); + final Endpoint endpoint = endpoints.remove(localName); if (null != endpoint) { LOGGER.log(Level.INFO, "Deleting endpoint", localName); - endpointMalMap.remove(localName); - endpointRoutingMap.remove(endpoint.getRoutingName()); endpoint.close(); } } @Override public void close() throws MALException { - for (Endpoint entry : endpointMalMap.values()) { - entry.close(); - } - - endpointMalMap.clear(); - endpointRoutingMap.clear(); + endpoints.closeAll(); decoderExecutor.shutdown(); dispatcherExecutor.shutdown(); @@ -503,7 +492,7 @@ public void dispatchMessage(final GENMessage msg, PacketToString smsg) { new Object[]{msg.getHeader().getTransactionId(), smsg}); String endpointUriPart = getRoutingPart(msg.getHeader().getTo().getValue()); - final Endpoint endpoint = endpointRoutingMap.get(endpointUriPart); + final Endpoint endpoint = endpoints.getByRoutingName(endpointUriPart); if (endpoint != null) { LOGGER.log(Level.FINE, "Passing message to endpoint {0} : {1}", @@ -573,9 +562,9 @@ protected void returnErrorMessage(final MALMessageHeader srcHdr, || ((interactionType.equals(InteractionType.PUBSUB)) && (stage == MALPubSubOperation._PUBLISH_REGISTER_STAGE)) || ((interactionType.equals(InteractionType.PUBSUB)) && (stage == MALPubSubOperation._PUBLISH_DEREGISTER_STAGE))) { - if (!endpointMalMap.isEmpty()) { - Endpoint endpoint = endpointMalMap.entrySet().iterator().next().getValue(); + Endpoint endpoint = endpoints.any(); + if (endpoint != null) { final GENMessage retMsg = (GENMessage) endpoint.createMessage(srcHdr.getAuthenticationId(), srcHdr.getFromURI(), Time.now(), From 7fad9da3a226feedf504f90474407d8aab7da392 Mon Sep 17 00:00:00 2001 From: Cesar Coelho Date: Sat, 1 Aug 2026 08:22:38 +0200 Subject: [PATCH 17/45] Extract the URI addressing scheme out of Transport Transport carried six fields describing the shape of its URIs, plus the routing part cache, and spread the parsing of them across the constructor, init(), sendMessage(), getRoutingPart() and manageCommunicationChannel(). Move them into a new TransportAddressing, which also takes over the three computations that were inline: deriving the service delimiter count, building the base URI, and the cached routing part lookup. init() is now one line. getRoutingPart() stays an overridable method on Transport delegating to the new class, because SPPBaseTransport overrides it to parse on the protocol delimiter instead. The six fields were protected, so this is source and binary incompatible for any transport outside this repository that read them. The five in this repository are updated here; nanosat-mo-framework has no references. Co-Authored-By: Claude Opus 5 --- .../mo/mal/transport/file/FileTransport.java | 3 +- .../esa/mo/mal/transport/gen/Transport.java | 83 +------ .../transport/gen/TransportAddressing.java | 226 ++++++++++++++++++ .../mal/transport/spp/SPPBaseTransport.java | 5 +- .../mal/transport/tcpip/TCPIPTransport.java | 20 +- .../mo/mal/transport/zmtp/ZMTPTransport.java | 2 +- 6 files changed, 256 insertions(+), 83 deletions(-) create mode 100644 transports/transport-generic/src/main/java/esa/mo/mal/transport/gen/TransportAddressing.java diff --git a/transports/transport-file/src/main/java/esa/mo/mal/transport/file/FileTransport.java b/transports/transport-file/src/main/java/esa/mo/mal/transport/file/FileTransport.java index b095d001..403c2314 100644 --- a/transports/transport-file/src/main/java/esa/mo/mal/transport/file/FileTransport.java +++ b/transports/transport-file/src/main/java/esa/mo/mal/transport/file/FileTransport.java @@ -171,7 +171,8 @@ protected String createTransportAddress() throws MALException { @Override protected Endpoint internalCreateEndpoint(String localName, String routingName, Map qosProperties, NamedValueList supplements) throws MALException { - return new Endpoint(this, localName, routingName, uriBase + localName, false, supplements); + return new Endpoint(this, localName, routingName, + addressing.getUriBase() + localName, false, supplements); } @Override diff --git a/transports/transport-generic/src/main/java/esa/mo/mal/transport/gen/Transport.java b/transports/transport-generic/src/main/java/esa/mo/mal/transport/gen/Transport.java index e6c5bd91..b869b260 100644 --- a/transports/transport-generic/src/main/java/esa/mo/mal/transport/gen/Transport.java +++ b/transports/transport-generic/src/main/java/esa/mo/mal/transport/gen/Transport.java @@ -30,7 +30,6 @@ import java.io.StringWriter; import java.nio.charset.Charset; import java.util.*; -import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.logging.Level; @@ -79,28 +78,9 @@ public abstract class Transport implements MALTransport { */ protected static final Random RANDOM_NAME = new Random(); /** - * The delimiter to use to separate the protocol part from the address part - * of the URL. + * The shape of the URIs used by this transport, and the parsing of them. */ - protected final String protocolDelim; - /** - * The delimiter to use to separate the external address part from the - * internal object part of the URL. - */ - protected final char serviceDelim; - /** - * If the protocol delimiter is the same as the service delimiter then we - * need a count to find the correct service delimiter. - */ - protected final int serviceDelimCounter; - /** - * Delimiter to use when holding routing information in a URL - */ - protected final char routingDelim; - /** - * True if protocol supports the concept of routing. - */ - protected final boolean supportsRouting; + protected final TransportAddressing addressing; /** * True if calls to ourselves should be handled in-process i.e. not via the * underlying transport. @@ -110,10 +90,6 @@ public abstract class Transport implements MALTransport { * The timeout in seconds to wait for confirmation of delivery. */ protected final int deliveryTimeout; - /** - * The string used to represent this protocol. - */ - protected final String protocol; /** * The endpoints created by this transport, indexed by MAL local name and by * transport routing name. @@ -147,14 +123,6 @@ public abstract class Transport implements MALTransport { * The stream factory used for encoding and decoding messages. */ private final MALElementStreamFactory streamFactory; - /** - * The base string for URL for this protocol. - */ - protected String uriBase; - /** - * Map of cachedRoutingParts. This associates a URI to its Routing part. - */ - private final ConcurrentHashMap cachedRoutingParts = new ConcurrentHashMap<>(); /** * Constructor. @@ -193,24 +161,14 @@ public Transport(final String protocol, final char routingDelim, final boolean supportsRouting, final java.util.Map properties) throws MALException { - this.protocol = protocol; - this.supportsRouting = supportsRouting; - this.protocolDelim = protocolDelim; - this.serviceDelim = serviceDelim; - this.routingDelim = routingDelim; + this.addressing = new TransportAddressing(protocol, protocolDelim, + serviceDelim, routingDelim, supportsRouting); this.qosProperties = properties; streamFactory = MALElementStreamFactory.newFactory(protocol, properties); LOGGER.log(Level.FINE, "Created element stream: {0}", streamFactory.getClass().getName()); - if (protocolDelim.contains("" + serviceDelim)) { - String replaced = protocolDelim.replace("" + serviceDelim, ""); - serviceDelimCounter = protocolDelim.length() - replaced.length(); - } else { - serviceDelimCounter = 0; - } - // default values boolean lInProcessSupport = true; int lDeliveryTime = 10; @@ -241,12 +199,7 @@ public Transport(final String protocol, * @throws MALException On error */ public void init() throws MALException { - String protocolString = protocol; - if (protocol.contains(":")) { - protocolString = protocol.substring(0, protocol.indexOf(':')); - } - - uriBase = protocolString + protocolDelim + createTransportAddress() + serviceDelim; + addressing.initUriBase(createTransportAddress()); } @Override @@ -328,13 +281,13 @@ public void sendMessage(final Object multiSendHandle, final boolean lastForHandl // get the root URI, (e.g. maltcp://10.0.0.1:61616 ) String destinationURI = header.getTo().getValue(); - String remoteRootURI = header.getToURI().getRootURI(serviceDelim, serviceDelimCounter); + String remoteRootURI = addressing.getRootURI(header.getToURI()); // first check if its actually a message to ourselves String endpointUriPart = getRoutingPart(destinationURI); if (inProcessSupport - && (uriBase.startsWith(remoteRootURI) || remoteRootURI.startsWith(uriBase)) + && addressing.matchesLocalBase(remoteRootURI) && endpoints.containsRoutingName(endpointUriPart)) { LOGGER.log(Level.FINE, "Routing msg internally to: {0}", new Object[]{endpointUriPart}); @@ -622,20 +575,7 @@ protected String getLocalName(String localName, final java.util.Map properties) * @return the routing part of the URI */ public String getRoutingPart(String uriValue) { - String routingPart = cachedRoutingParts.get(uriValue); - - if (routingPart == null) { - final int iFirst = URI.nthIndexOf(uriValue, serviceDelim, serviceDelimCounter); - int iSecond = supportsRouting ? uriValue.indexOf(routingDelim) : uriValue.length(); - if (iSecond < 0) { - iSecond = uriValue.length(); - } - - routingPart = uriValue.substring(iFirst + 1, iSecond); - cachedRoutingParts.put(uriValue, routingPart); - } - - return routingPart; + return addressing.getRoutingPart(uriValue); } /** @@ -651,7 +591,8 @@ public String getRoutingPart(String uriValue) { protected Endpoint internalCreateEndpoint(final String localName, final String routingName, final Map qosProperties, final NamedValueList supplements) throws MALException { - return new Endpoint(this, localName, routingName, uriBase + routingName, supplements); + return new Endpoint(this, localName, routingName, + addressing.getUriBase() + routingName, supplements); } /** @@ -679,7 +620,7 @@ public synchronized ConcurrentMessageSender manageCommunicationChannel(GENMessag // this is the first message received form this reception handler // add the remote base URI it is receiving messages from URI sourceURI = msg.getHeader().getFromURI(); - String sourceRootURI = sourceURI.getRootURI(serviceDelim, serviceDelimCounter); + String sourceRootURI = addressing.getRootURI(sourceURI); receptionHandler.setRemoteURI(sourceRootURI); //register the communication channel with this URI if needed @@ -689,7 +630,7 @@ public synchronized ConcurrentMessageSender manageCommunicationChannel(GENMessag // outgoing message // get target URI URI reroutedMsg = this.rerouteMessage(msg); - String remoteRootURI = reroutedMsg.getRootURI(serviceDelim, serviceDelimCounter); + String remoteRootURI = addressing.getRootURI(reroutedMsg); sender = outgoingDataChannelsManager.manageCommunicationChannelOutgoing(msg.getHeader(), remoteRootURI); } diff --git a/transports/transport-generic/src/main/java/esa/mo/mal/transport/gen/TransportAddressing.java b/transports/transport-generic/src/main/java/esa/mo/mal/transport/gen/TransportAddressing.java new file mode 100644 index 00000000..e49994d1 --- /dev/null +++ b/transports/transport-generic/src/main/java/esa/mo/mal/transport/gen/TransportAddressing.java @@ -0,0 +1,226 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2013 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO Generic Transport Framework + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.mal.transport.gen; + +import java.util.concurrent.ConcurrentHashMap; +import org.ccsds.moims.mo.mal.structures.URI; + +/** + * Describes the shape of the URIs used by a transport, and parses them. + * + * A transport URI is built as: + * {@code } + * where the routing part may itself be terminated by a routing delimiter when + * the protocol supports routing. + */ +public class TransportAddressing { + + /** + * The string used to represent this protocol. + */ + private final String protocol; + /** + * The delimiter to use to separate the protocol part from the address part + * of the URL. + */ + private final String protocolDelim; + /** + * The delimiter to use to separate the external address part from the + * internal object part of the URL. + */ + private final char serviceDelim; + /** + * If the protocol delimiter is the same as the service delimiter then we + * need a count to find the correct service delimiter. + */ + private final int serviceDelimCounter; + /** + * Delimiter to use when holding routing information in a URL. + */ + private final char routingDelim; + /** + * True if protocol supports the concept of routing. + */ + private final boolean supportsRouting; + /** + * Map of cachedRoutingParts. This associates a URI to its Routing part. + */ + private final ConcurrentHashMap cachedRoutingParts = new ConcurrentHashMap<>(); + /** + * The base string for URL for this protocol. + */ + private String uriBase; + + /** + * Constructor. + * + * @param protocol The protocol string. + * @param protocolDelim The delimiter separating the protocol part of the + * URL. + * @param serviceDelim The delimiter separating the address part of the URL. + * @param routingDelim The delimiter separating the routing part of the URL. + * @param supportsRouting True if routing is supported by the naming + * convention. + */ + public TransportAddressing(final String protocol, final String protocolDelim, + final char serviceDelim, final char routingDelim, final boolean supportsRouting) { + this.protocol = protocol; + this.protocolDelim = protocolDelim; + this.serviceDelim = serviceDelim; + this.routingDelim = routingDelim; + this.supportsRouting = supportsRouting; + + if (protocolDelim.contains("" + serviceDelim)) { + String replaced = protocolDelim.replace("" + serviceDelim, ""); + this.serviceDelimCounter = protocolDelim.length() - replaced.length(); + } else { + this.serviceDelimCounter = 0; + } + } + + /** + * Returns the protocol string. + * + * @return The protocol string. + */ + public String getProtocol() { + return protocol; + } + + /** + * Returns the protocol delimiter. + * + * @return The protocol delimiter. + */ + public String getProtocolDelim() { + return protocolDelim; + } + + /** + * Returns the service delimiter. + * + * @return The service delimiter. + */ + public char getServiceDelim() { + return serviceDelim; + } + + /** + * Returns the number of service delimiters contained in the protocol + * delimiter. + * + * @return The service delimiter count. + */ + public int getServiceDelimCounter() { + return serviceDelimCounter; + } + + /** + * Returns the routing delimiter. + * + * @return The routing delimiter. + */ + public char getRoutingDelim() { + return routingDelim; + } + + /** + * Returns true if the protocol supports routing. + * + * @return True if the protocol supports routing. + */ + public boolean supportsRouting() { + return supportsRouting; + } + + /** + * Builds the base URI for this transport from the transport specific + * address. + * + * @param transportAddress The address part specific to this transport + * instance. + */ + public void initUriBase(final String transportAddress) { + String protocolString = protocol; + + if (protocol.contains(":")) { + protocolString = protocol.substring(0, protocol.indexOf(':')); + } + + uriBase = protocolString + protocolDelim + transportAddress + serviceDelim; + } + + /** + * Returns the base URI for this transport, or null if it has not been built + * yet. + * + * @return The base URI. + */ + public String getUriBase() { + return uriBase; + } + + /** + * Returns the root part of a URI, i.e. the part identifying the transport + * instance rather than the endpoint within it. + * + * @param uri The URI. + * @return The root URI. + */ + public String getRootURI(final URI uri) { + return uri.getRootURI(serviceDelim, serviceDelimCounter); + } + + /** + * Returns true if a root URI refers to this transport instance, and so can + * be delivered to without going through the underlying transport. + * + * @param rootURI The root URI to test. + * @return True if the root URI refers to this transport instance. + */ + public boolean matchesLocalBase(final String rootURI) { + return uriBase.startsWith(rootURI) || rootURI.startsWith(uriBase); + } + + /** + * Returns the routing part of a URI, i.e. the endpoint identifier. Results + * are cached, as the same URIs are parsed repeatedly. + * + * @param uriValue The URI value. + * @return The routing part of the URI. + */ + public String getRoutingPart(final String uriValue) { + String routingPart = cachedRoutingParts.get(uriValue); + + if (routingPart == null) { + final int iFirst = URI.nthIndexOf(uriValue, serviceDelim, serviceDelimCounter); + int iSecond = supportsRouting ? uriValue.indexOf(routingDelim) : uriValue.length(); + if (iSecond < 0) { + iSecond = uriValue.length(); + } + + routingPart = uriValue.substring(iFirst + 1, iSecond); + cachedRoutingParts.put(uriValue, routingPart); + } + + return routingPart; + } +} diff --git a/transports/transport-spp/src/main/java/esa/mo/mal/transport/spp/SPPBaseTransport.java b/transports/transport-spp/src/main/java/esa/mo/mal/transport/spp/SPPBaseTransport.java index 09998349..1fb39b7f 100644 --- a/transports/transport-spp/src/main/java/esa/mo/mal/transport/spp/SPPBaseTransport.java +++ b/transports/transport-spp/src/main/java/esa/mo/mal/transport/spp/SPPBaseTransport.java @@ -199,7 +199,7 @@ private int getNextSubId(long qualifier, int apid) { @Override public String getRoutingPart(String uriValue) { - int iFirst = uriValue.indexOf(protocolDelim) + 1; + int iFirst = uriValue.indexOf(addressing.getProtocolDelim()) + 1; return uriValue.substring(iFirst); } @@ -208,7 +208,8 @@ public String getRoutingPart(String uriValue) { protected Endpoint internalCreateEndpoint(final String localName, final String routingName, final Map properties, NamedValueList supplements) throws MALException { return new SPPEndpoint(this, defaultConfiguration, defaultApidQualifier, - uriRep, ssc, localName, routingName, uriBase + routingName, properties); + uriRep, ssc, localName, routingName, + addressing.getUriBase() + routingName, properties); } @Override diff --git a/transports/transport-tcpip/src/main/java/esa/mo/mal/transport/tcpip/TCPIPTransport.java b/transports/transport-tcpip/src/main/java/esa/mo/mal/transport/tcpip/TCPIPTransport.java index e27c9e4d..4f10d63a 100644 --- a/transports/transport-tcpip/src/main/java/esa/mo/mal/transport/tcpip/TCPIPTransport.java +++ b/transports/transport-tcpip/src/main/java/esa/mo/mal/transport/tcpip/TCPIPTransport.java @@ -496,8 +496,10 @@ protected OutgoingMessageHolder encodeMessage( @Override protected Endpoint internalCreateEndpoint(final String localName, final String routingName, final Map properties, NamedValueList supplements) throws MALException { - RLOGGER.log(Level.FINE, "TCPIPTransport.internalCreateEndpoint() with uri: {0}", uriBase); - return new TCPIPEndpoint(this, localName, routingName, uriBase + routingName, supplements); + RLOGGER.log(Level.FINE, "TCPIPTransport.internalCreateEndpoint() with uri: {0}", + addressing.getUriBase()); + return new TCPIPEndpoint(this, localName, routingName, + addressing.getUriBase() + routingName, supplements); } /** @@ -548,7 +550,7 @@ protected String createTransportAddress() throws MALException { */ @Override public GENMessage decodeMessage(TCPIPPacketInfoHolder packetInfo) throws MALException { - String serviceDelimStr = Character.toString(serviceDelim); + String serviceDelimStr = Character.toString(addressing.getServiceDelim()); String from = packetInfo.getUriFrom().getValue(); if (!from.endsWith(serviceDelimStr)) { from += serviceDelimStr; @@ -711,7 +713,7 @@ private String getDefaultHost() throws MALException { * @return The service delimiter. */ public char getServiceDelim() { - return this.serviceDelim; + return addressing.getServiceDelim(); } /** @@ -724,15 +726,17 @@ public char getServiceDelim() { private ConnectionTuple getConnectionParts(String addr) throws MALException { // decode address - String targetAddress = addr.replaceAll(protocol + protocolDelim, ""); - targetAddress = targetAddress.replaceAll(protocol, ""); + String targetAddress = addr.replaceAll( + addressing.getProtocol() + addressing.getProtocolDelim(), ""); + targetAddress = targetAddress.replaceAll(addressing.getProtocol(), ""); // remove service URI part, i.e. the part after the service delimiter - int serviceIdx = targetAddress.indexOf(serviceDelim); + int serviceIdx = targetAddress.indexOf(addressing.getServiceDelim()); if (serviceIdx >= 0) { targetAddress = targetAddress.substring(0, serviceIdx); } - targetAddress = targetAddress.replaceAll(Character.toString(serviceDelim), ""); + targetAddress = targetAddress.replaceAll( + Character.toString(addressing.getServiceDelim()), ""); if (!targetAddress.contains(":")) { // malformed URI diff --git a/transports/transport-zmtp/src/main/java/esa/mo/mal/transport/zmtp/ZMTPTransport.java b/transports/transport-zmtp/src/main/java/esa/mo/mal/transport/zmtp/ZMTPTransport.java index 630303dc..b670aa99 100644 --- a/transports/transport-zmtp/src/main/java/esa/mo/mal/transport/zmtp/ZMTPTransport.java +++ b/transports/transport-zmtp/src/main/java/esa/mo/mal/transport/zmtp/ZMTPTransport.java @@ -412,7 +412,7 @@ protected ZMTPHeaderStreamFactory getHeaderStreamFactory() { protected Endpoint internalCreateEndpoint(final String localName, final String routingName, final Map properties, NamedValueList supplements) throws MALException { return new ZMTPEndpoint(this, defaultConfiguration, localName, - routingName, uriBase + routingName, supplements, properties); + routingName, addressing.getUriBase() + routingName, supplements, properties); } /** From 37cbb390d616188ee8dcf650b12279a94ab5def1 Mon Sep 17 00:00:00 2001 From: Cesar Coelho Date: Sat, 1 Aug 2026 11:13:27 +0200 Subject: [PATCH 18/45] Return errors from the endpoint the message was addressed to returnErrorMessage picked an arbitrary endpoint to build the reply from, so the error carried the URI, supplements and transport specific header of whichever endpoint the map happened to iterate first. dispatchMessage did have the right endpoint, but declared it inside the try block where the catch clauses could not see it. Hoist it, and pass it down, so an error caused by a failing delivery is returned from the endpoint the message was actually addressed to. The endpoint-not-found path still has no endpoint to attribute to and keeps falling back to any of them. Move the construction and sending of the reply into a new ErrorReplyBuilder while here. The existing three argument returnErrorMessage keeps its signature and delegates, so the two callers outside this class, both decode failures with no endpoint context, are unaffected. Co-Authored-By: Claude Opus 5 --- .../mal/transport/gen/ErrorReplyBuilder.java | 147 ++++++++++++++++++ .../esa/mo/mal/transport/gen/Transport.java | 84 ++++------ 2 files changed, 177 insertions(+), 54 deletions(-) create mode 100644 transports/transport-generic/src/main/java/esa/mo/mal/transport/gen/ErrorReplyBuilder.java diff --git a/transports/transport-generic/src/main/java/esa/mo/mal/transport/gen/ErrorReplyBuilder.java b/transports/transport-generic/src/main/java/esa/mo/mal/transport/gen/ErrorReplyBuilder.java new file mode 100644 index 00000000..d90cb0e0 --- /dev/null +++ b/transports/transport-generic/src/main/java/esa/mo/mal/transport/gen/ErrorReplyBuilder.java @@ -0,0 +1,147 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2013 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO Generic Transport Framework + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.mal.transport.gen; + +import java.util.Map; +import java.util.logging.Level; +import org.ccsds.moims.mo.mal.MALException; +import org.ccsds.moims.mo.mal.MALInvokeOperation; +import org.ccsds.moims.mo.mal.MALProgressOperation; +import org.ccsds.moims.mo.mal.MALPubSubOperation; +import org.ccsds.moims.mo.mal.MALRequestOperation; +import org.ccsds.moims.mo.mal.MALSubmitOperation; +import org.ccsds.moims.mo.mal.structures.InteractionType; +import org.ccsds.moims.mo.mal.structures.Time; +import org.ccsds.moims.mo.mal.structures.UInteger; +import org.ccsds.moims.mo.mal.structures.UOctet; +import org.ccsds.moims.mo.mal.structures.Union; +import org.ccsds.moims.mo.mal.transport.MALMessageHeader; +import org.ccsds.moims.mo.mal.transport.MALTransmitErrorException; + +/** + * Builds and sends the MO Error message that answers a received message which + * could not be delivered or processed. + * + * Only certain interaction type and stage combinations have an error defined as + * their answer; for all others no error is returned. + */ +public class ErrorReplyBuilder { + + private final Transport transport; + private final EndpointRegistry endpoints; + private final Map qosProperties; + + /** + * Constructor. + * + * @param transport The transport used to send the error message. + * @param endpoints The endpoints of that transport, used to find a fallback + * sender when the intended endpoint is not known. + * @param qosProperties The QoS properties to send the error message with. + */ + public ErrorReplyBuilder(final Transport transport, + final EndpointRegistry endpoints, final Map qosProperties) { + this.transport = transport; + this.endpoints = endpoints; + this.qosProperties = qosProperties; + } + + /** + * Returns true if a message with this interaction type and stage has an MO + * Error defined as a valid answer. + * + * @param interactionType The interaction type of the received message. + * @param stage The interaction stage of the received message. + * @return True if an error may be returned. + */ + private static boolean isErrorExpected(final InteractionType interactionType, final short stage) { + return ((interactionType.equals(InteractionType.SUBMIT)) && (stage == MALSubmitOperation._SUBMIT_STAGE)) + || ((interactionType.equals(InteractionType.REQUEST)) && (stage == MALRequestOperation._REQUEST_STAGE)) + || ((interactionType.equals(InteractionType.INVOKE)) && (stage == MALInvokeOperation._INVOKE_STAGE)) + || ((interactionType.equals(InteractionType.PROGRESS)) && (stage == MALProgressOperation._PROGRESS_STAGE)) + || ((interactionType.equals(InteractionType.PUBSUB)) && (stage == MALPubSubOperation._REGISTER_STAGE)) + || ((interactionType.equals(InteractionType.PUBSUB)) && (stage == MALPubSubOperation._DEREGISTER_STAGE)) + || ((interactionType.equals(InteractionType.PUBSUB)) && (stage == MALPubSubOperation._PUBLISH_REGISTER_STAGE)) + || ((interactionType.equals(InteractionType.PUBSUB)) && (stage == MALPubSubOperation._PUBLISH_DEREGISTER_STAGE)); + } + + /** + * Creates and sends an error message answering a received message. + * + * The error is sent from the endpoint the received message was being + * delivered to. When that endpoint is not known, for example because the + * message could not be routed to one at all, any endpoint of the transport + * is used instead so that the sender is at least informed. + * + * @param endpoint The endpoint the message was being delivered to, or null + * if it is not known. + * @param srcHdr The header of the received message. + * @param errorNumber The error number. + * @param errorMsg The error message. + * @throws MALException if the response message could not be encoded. + */ + public void returnError(final Endpoint endpoint, final MALMessageHeader srcHdr, + final UInteger errorNumber, final String errorMsg) throws MALException { + try { + InteractionType interactionType = srcHdr.getInteractionType(); + final short stage = (null != srcHdr.getInteractionStage()) + ? srcHdr.getInteractionStage().getValue() : 0; + + if (!isErrorExpected(interactionType, stage)) { + Transport.LOGGER.log(Level.WARNING, "An MO Error will not be returned because this " + + "combination of type/stage does not have an MO Error to " + + "be returned! For interaction type: {0} - and stage: {1}", + new Object[]{interactionType.toString(), stage}); + return; + } + + Endpoint sender = (endpoint != null) ? endpoint : endpoints.any(); + + if (sender == null) { + Transport.LOGGER.log(Level.WARNING, "(1) Unable to return error" + + " number ({0}) as no endpoint supplied: {1}", + new Object[]{errorNumber, srcHdr}); + return; + } + + final GENMessage retMsg = (GENMessage) sender.createMessage(srcHdr.getAuthenticationId(), + srcHdr.getFromURI(), + Time.now(), + srcHdr.getInteractionType(), + new UOctet((short) (srcHdr.getInteractionStage().getValue() + 1)), + srcHdr.getTransactionId(), + srcHdr.getServiceArea(), + srcHdr.getService(), + srcHdr.getOperation(), + srcHdr.getAreaVersion(), + true, + srcHdr.getSupplements(), + qosProperties, + errorNumber, new Union(errorMsg)); + + transport.sendMessage(null, true, retMsg); + } catch (MALTransmitErrorException ex) { + Transport.LOGGER.log(Level.WARNING, + "Error occurred when attempting to return previous error!", + ex); + } + } +} diff --git a/transports/transport-generic/src/main/java/esa/mo/mal/transport/gen/Transport.java b/transports/transport-generic/src/main/java/esa/mo/mal/transport/gen/Transport.java index b869b260..ade90c9c 100644 --- a/transports/transport-generic/src/main/java/esa/mo/mal/transport/gen/Transport.java +++ b/transports/transport-generic/src/main/java/esa/mo/mal/transport/gen/Transport.java @@ -37,7 +37,6 @@ import org.ccsds.moims.mo.mal.*; import org.ccsds.moims.mo.mal.encoding.MALElementStreamFactory; import org.ccsds.moims.mo.mal.structures.*; -import org.ccsds.moims.mo.mal.structures.InteractionType; import org.ccsds.moims.mo.mal.transport.*; /** @@ -95,6 +94,11 @@ public abstract class Transport implements MALTransport { * transport routing name. */ protected final EndpointRegistry endpoints = new EndpointRegistry(); + /** + * Builds and sends the error messages that answer messages which could not + * be delivered or processed. + */ + protected final ErrorReplyBuilder errorReplies; /** * Map of QoS properties. */ @@ -164,6 +168,7 @@ public Transport(final String protocol, this.addressing = new TransportAddressing(protocol, protocolDelim, serviceDelim, routingDelim, supportsRouting); this.qosProperties = properties; + this.errorReplies = new ErrorReplyBuilder(this, endpoints, properties); streamFactory = MALElementStreamFactory.newFactory(protocol, properties); LOGGER.log(Level.FINE, "Created element stream: {0}", @@ -440,12 +445,16 @@ public void receiveIncomingMessage(final IncomingMessageHolder malMsg) { * @param smsg The message in a string representation for logging. */ public void dispatchMessage(final GENMessage msg, PacketToString smsg) { + // Held outside the try so that, if the delivery below throws, the error + // can be returned from the endpoint the message was destined for. + Endpoint endpoint = null; + try { LOGGER.log(Level.FINE, "Processing message : {0} : {1}", new Object[]{msg.getHeader().getTransactionId(), smsg}); String endpointUriPart = getRoutingPart(msg.getHeader().getTo().getValue()); - final Endpoint endpoint = endpoints.getByRoutingName(endpointUriPart); + endpoint = endpoints.getByRoutingName(endpointUriPart); if (endpoint != null) { LOGGER.log(Level.FINE, "Passing message to endpoint {0} : {1}", @@ -466,7 +475,7 @@ public void dispatchMessage(final GENMessage msg, PacketToString smsg) { e.printStackTrace(new PrintWriter(wrt)); try { - returnErrorMessage(msg.getHeader(), MALHelper.INTERNAL_ERROR_NUMBER, + returnErrorMessage(endpoint, msg.getHeader(), MALHelper.INTERNAL_ERROR_NUMBER, "Error occurred: " + e.toString() + " : " + wrt.toString()); } catch (MALException ex) { LOGGER.log(Level.SEVERE, @@ -482,7 +491,7 @@ public void dispatchMessage(final GENMessage msg, PacketToString smsg) { e.printStackTrace(new PrintWriter(wrt)); try { - returnErrorMessage(msg.getHeader(), MALHelper.INTERNAL_ERROR_NUMBER, + returnErrorMessage(endpoint, msg.getHeader(), MALHelper.INTERNAL_ERROR_NUMBER, "Error occurred: " + e.toString() + " : " + wrt.toString()); } catch (MALException ex) { LOGGER.log(Level.SEVERE, "Error occurred when return error data : {0}", ex); @@ -500,56 +509,23 @@ public void dispatchMessage(final GENMessage msg, PacketToString smsg) { */ protected void returnErrorMessage(final MALMessageHeader srcHdr, final UInteger errorNumber, final String errorMsg) throws MALException { - try { - InteractionType interactionType = srcHdr.getInteractionType(); - final short stage = (null != srcHdr.getInteractionStage()) - ? srcHdr.getInteractionStage().getValue() : 0; - - // first check that message should be responded to - if (((interactionType.equals(InteractionType.SUBMIT)) && (stage == MALSubmitOperation._SUBMIT_STAGE)) - || ((interactionType.equals(InteractionType.REQUEST)) && (stage == MALRequestOperation._REQUEST_STAGE)) - || ((interactionType.equals(InteractionType.INVOKE)) && (stage == MALInvokeOperation._INVOKE_STAGE)) - || ((interactionType.equals(InteractionType.PROGRESS)) && (stage == MALProgressOperation._PROGRESS_STAGE)) - || ((interactionType.equals(InteractionType.PUBSUB)) && (stage == MALPubSubOperation._REGISTER_STAGE)) - || ((interactionType.equals(InteractionType.PUBSUB)) && (stage == MALPubSubOperation._DEREGISTER_STAGE)) - || ((interactionType.equals(InteractionType.PUBSUB)) && (stage == MALPubSubOperation._PUBLISH_REGISTER_STAGE)) - || ((interactionType.equals(InteractionType.PUBSUB)) && (stage == MALPubSubOperation._PUBLISH_DEREGISTER_STAGE))) { - - Endpoint endpoint = endpoints.any(); - - if (endpoint != null) { - final GENMessage retMsg = (GENMessage) endpoint.createMessage(srcHdr.getAuthenticationId(), - srcHdr.getFromURI(), - Time.now(), - srcHdr.getInteractionType(), - new UOctet((short) (srcHdr.getInteractionStage().getValue() + 1)), - srcHdr.getTransactionId(), - srcHdr.getServiceArea(), - srcHdr.getService(), - srcHdr.getOperation(), - srcHdr.getAreaVersion(), - true, - srcHdr.getSupplements(), - qosProperties, - errorNumber, new Union(errorMsg)); - - sendMessage(null, true, retMsg); - } else { - LOGGER.log(Level.WARNING, "(1) Unable to return error" - + " number ({0}) as no endpoint supplied: {1}", - new Object[]{errorNumber, srcHdr}); - } - } else { - LOGGER.log(Level.WARNING, "An MO Error will not be returned because this " - + "combination of type/stage does not have an MO Error to " - + "be returned! For interaction type: {0} - and stage: {1}", - new Object[]{interactionType.toString(), stage}); - } - } catch (MALTransmitErrorException ex) { - LOGGER.log(Level.WARNING, - "Error occurred when attempting to return previous error!", - ex); - } + returnErrorMessage(null, srcHdr, errorNumber, errorMsg); + } + + /** + * Creates a return error message based on a received message, sent from the + * endpoint the received message was being delivered to. + * + * @param endpoint The endpoint the message was being delivered to, or null + * if it is not known. + * @param srcHdr The source header + * @param errorNumber The error number + * @param errorMsg The error message. + * @throws MALException if cannot encode a response message + */ + protected void returnErrorMessage(final Endpoint endpoint, final MALMessageHeader srcHdr, + final UInteger errorNumber, final String errorMsg) throws MALException { + errorReplies.returnError(endpoint, srcHdr, errorNumber, errorMsg); } /** From 18601c612c6c87234b0ec542d5bada247be89927 Mon Sep 17 00:00:00 2001 From: Cesar Coelho Date: Sat, 1 Aug 2026 13:08:19 +0200 Subject: [PATCH 19/45] Fix the MAL testbed over HTTP The HTTP profile of the MAL testbed failed every PubSub procedure and the INVOKE response, all of them with a connection refused to the consumer. The consumer was never listening: its transport died during init with NoClassDefFoundError: com/sun/net/httpserver/HttpServer maven-surefire-plugin 2.7.2 predates Java 9. Its isolated class loader has no parent, so classes of platform modules such as jdk.httpserver cannot be seen from the tests. Only the HTTP transport needs one, which is why the other transports were unaffected. Move to surefire 3.2.5. Under surefire 3 the class loader running the tests is no longer a URLClassLoader, so RemoteProcessRunner could no longer read the classpath back out of it and started the remote provider with an empty one. Fall back to the java.class.path system property when the cast is not possible. With both in place the HTTP profile passes, so re-enable its workflow job. Checked for regressions against the other profiles of the MAL testbed, ESA, ESA_TCPIP and ESA_ZMTP, and against testbed-com, testbed-mpd and testbed-encoders. Not checked against testbed-malspp, which needs artifacts that are not built here. Co-Authored-By: Claude Opus 5 --- .github/workflows/testbeds.yml | 1 - testbeds/testbed-pom/pom.xml | 5 +- .../mo/testbed/util/RemoteProcessRunner.java | 79 +++++++++++++------ 3 files changed, 60 insertions(+), 25 deletions(-) diff --git a/.github/workflows/testbeds.yml b/.github/workflows/testbeds.yml index f7a0844e..dc6a7b80 100644 --- a/.github/workflows/testbeds.yml +++ b/.github/workflows/testbeds.yml @@ -238,7 +238,6 @@ jobs: path: testbeds/testbed-mal/target/surefire-reports/ testbed-mal-jdk11-http: - if: ${{ false }} # disable for now needs: build-testbeds-jdk11 runs-on: ubuntu-latest steps: diff --git a/testbeds/testbed-pom/pom.xml b/testbeds/testbed-pom/pom.xml index deb5b391..8815db59 100644 --- a/testbeds/testbed-pom/pom.xml +++ b/testbeds/testbed-pom/pom.xml @@ -253,7 +253,10 @@ org.apache.maven.plugins maven-surefire-plugin - 2.7.2 + + 3.2.5 org.apache.maven.plugins diff --git a/testbeds/testbed-util/src/main/java/org/ccsds/moims/mo/testbed/util/RemoteProcessRunner.java b/testbeds/testbed-util/src/main/java/org/ccsds/moims/mo/testbed/util/RemoteProcessRunner.java index 864814b5..a9c118fd 100644 --- a/testbeds/testbed-util/src/main/java/org/ccsds/moims/mo/testbed/util/RemoteProcessRunner.java +++ b/testbeds/testbed-util/src/main/java/org/ccsds/moims/mo/testbed/util/RemoteProcessRunner.java @@ -189,41 +189,74 @@ public static String createClasspath(String[] extraJarList, appendMavenDependencies(cp, File.separator, sep, mavenJarList); - if (RemoteProcessRunner.class.getClassLoader() instanceof URLClassLoader) { - URL[] classpath = ((URLClassLoader) RemoteProcessRunner.class.getClassLoader()).getURLs(); + String[] classpath = currentClasspath(sep); - if (classpath.length > 0) { - StringBuilder filterEnv = new StringBuilder(); + if (classpath.length > 0) { + StringBuilder filterEnv = new StringBuilder(); - for (String str : filterJarList) { - filterEnv.append(System.getProperty(str)); - filterEnv.append(','); - } + for (String str : filterJarList) { + filterEnv.append(System.getProperty(str)); + filterEnv.append(','); + } - String[] filterStr = null; + String[] filterStr = null; - if (filterEnv.length() > 0) { - filterStr = filterEnv.toString().toLowerCase().split(","); - } + if (filterEnv.length() > 0) { + filterStr = filterEnv.toString().toLowerCase().split(","); + } - int length = classpath.length; + if (!isLinux) { + cp.append('"'); // Adds a Quotation mark before the jars + } - if (length != 0 && !isLinux) { - cp.append('"'); // Adds a Quotation mark before the jars - } + for (String entry : classpath) { + addClasspathEntry(cp, entry, sep, filterStr); + } - for (int i = 0; i < length; i++) { - String path = classpath[i].toURI().getPath(); - addClasspathEntry(cp, path, sep, filterStr); - } + if (!isLinux) { + cp.append('"'); // Adds a Quotation mark after the jars + } + } - if (length != 0 && !isLinux) { - cp.append('"'); // Adds a Quotation mark after the jars + return cp.toString(); + } + + /** + * Returns the entries of the classpath this process was started with, so + * that the remote process can be started with the same one. + * + * Up to Java 8 the class loader could be cast to a URLClassLoader to read + * them back, and up to surefire 2 the tests ran under such a loader. Neither + * holds any more, so fall back to the java.class.path system property, which + * works both on a modern JDK and under the system class loader. + * + * @param sep The path separator of this platform. + * @return The classpath entries, empty if none could be determined. + */ + private static String[] currentClasspath(String sep) throws Exception { + ClassLoader loader = RemoteProcessRunner.class.getClassLoader(); + + if (loader instanceof URLClassLoader) { + URL[] urls = ((URLClassLoader) loader).getURLs(); + + if (urls.length > 0) { + String[] entries = new String[urls.length]; + + for (int i = 0; i < urls.length; i++) { + entries[i] = urls[i].toURI().getPath(); } + + return entries; } } - return cp.toString(); + String classpath = System.getProperty("java.class.path"); + + if (classpath == null || classpath.isEmpty()) { + return new String[0]; + } + + return classpath.split(java.util.regex.Pattern.quote(sep)); } private static void appendMavenDependencies(StringBuffer cp, From 727af933946e3f26702c40e45d9799c78f2ec21b Mon Sep 17 00:00:00 2001 From: Cesar Coelho Date: Sat, 1 Aug 2026 13:17:49 +0200 Subject: [PATCH 20/45] Flatten the HTTP message sender chain The three senders formed a chain of concrete classes, each replacing the send method of the one above rather than refining it, so the inheritance bought no reuse. What was genuinely duplicated sat elsewhere: the mapping of the MAL header onto HTTP headers existed twice, once writing to a client request and once to a server response, differing only in the setter called. Give the three a small abstract base holding what they really share, and move the mapping into MALHttpHeaderEncoder, which writes through a HttpHeaderSink so it can serve either direction. The request and the response mappings are not identical, and the three differences are kept rather than smoothed over: an invalid From or To field is fatal on the response path but only logged on the request path, the interaction stage is written unguarded on the response path, and the error flag is capitalised on one and not on the other. They are noted in the javadoc of encodeResponseHeaders. Also drop encodeAscii, which returned its argument unchanged and was never overridden. Co-Authored-By: Claude Opus 5 --- .../http/sending/HTTPMessageSender.java | 134 ++++++++++++ .../sending/HTTPMessageSenderNoEncoding.java | 75 ++----- .../sending/HTTPMessageSenderNoResponse.java | 93 ++------ .../HTTPMessageSenderRequestResponse.java | 117 ++++------ .../transport/http/util/HttpHeaderSink.java | 90 ++++++++ .../http/util/MALHttpHeaderEncoder.java | 201 ++++++++++++++++++ .../http/test/HTTPMessageSenderBaseTest.java | 4 +- 7 files changed, 498 insertions(+), 216 deletions(-) create mode 100644 transports/transport-http/src/main/java/esa/mo/mal/transport/http/sending/HTTPMessageSender.java create mode 100644 transports/transport-http/src/main/java/esa/mo/mal/transport/http/util/HttpHeaderSink.java create mode 100644 transports/transport-http/src/main/java/esa/mo/mal/transport/http/util/MALHttpHeaderEncoder.java diff --git a/transports/transport-http/src/main/java/esa/mo/mal/transport/http/sending/HTTPMessageSender.java b/transports/transport-http/src/main/java/esa/mo/mal/transport/http/sending/HTTPMessageSender.java new file mode 100644 index 00000000..9bcae5b6 --- /dev/null +++ b/transports/transport-http/src/main/java/esa/mo/mal/transport/http/sending/HTTPMessageSender.java @@ -0,0 +1,134 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2021 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO HTTP Transport Framework + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.mal.transport.http.sending; + +import esa.mo.mal.transport.gen.sending.MessageSender; +import esa.mo.mal.transport.http.HTTPTransport; +import esa.mo.mal.transport.http.api.IPostClient; +import esa.mo.mal.transport.http.util.HttpApiImplException; +import java.io.IOException; +import org.ccsds.moims.mo.mal.transport.MALMessageHeader; + +/** + * Common ground for the message senders of the HTTP transport. + * + * One sender exists per HTTP binding mode. They differ in how much of the MAL + * message is mapped onto HTTP, and in whether they take part in the HTTP + * request/response paradigm, so each writes its own send method rather than + * refining another sender's. + */ +public abstract class HTTPMessageSender implements MessageSender { + + protected final HTTPTransport transport; + protected final String abstractPostClientImpl; + + /** + * Constructor. + * + * @param transport The parent HTTP transport. + * @param abstractPostClientImpl AbstractPostClient interface implementation + */ + protected HTTPMessageSender(final HTTPTransport transport, final String abstractPostClientImpl) { + this.transport = transport; + this.abstractPostClientImpl = abstractPostClientImpl; + } + + /** + * Maps the MAL header fields of a message onto the HTTP headers of the + * request that carries it. Binding modes that do not map the MAL header + * onto HTTP leave this empty. + * + * @param malMessageHeader the MALMessageHeader + * @param client the AbstractPostClient + * @throws IOException in case an internal error occurs + */ + public abstract void setRequestHeaders(MALMessageHeader malMessageHeader, + IPostClient client) throws IOException; + + /** + * Returns the URL to send to, derived from the To field of the MAL header. + * + * @param malMessageHeader The MAL message header. + * @return The remote URL. + */ + protected String getRemoteUrl(final MALMessageHeader malMessageHeader) { + String remoteUrl = malMessageHeader.getTo().getValue(); + + if (transport.useHttps()) { + return remoteUrl.replaceAll("malhttp://", "https://"); + } + + return remoteUrl.replaceAll("malhttp://", "http://"); + } + + /** + * Creates a client and connects it to the given URL. + * + * @param remoteUrl The URL to connect to. + * @return The connected client. + * @throws HttpApiImplException in case the client could not be created or + * connected. + */ + protected IPostClient connectPostClient(final String remoteUrl) throws HttpApiImplException { + IPostClient client = createPostClient(); + client.initAndConnectClient(remoteUrl, transport.useHttps(), + transport.getKeystoreFilename(), transport.getKeystorePassword()); + return client; + } + + /** + * Creates an instance of the AbstractPostClient interface. + * + * @return the AbstractPostClient implementation + * @throws HttpApiImplException in case an error occurs when trying to + * instantiate the AbstractPostClient + */ + public IPostClient createPostClient() throws HttpApiImplException { + try { + return (IPostClient) Class.forName(abstractPostClientImpl).newInstance(); + } catch (ClassNotFoundException ex) { + throw new HttpApiImplException("HTTPMessageSender: ClassNotFoundException at createPostClient()", ex); + } catch (InstantiationException ex) { + throw new HttpApiImplException("HTTPMessageSender: InstantiationException at createPostClient()", ex); + } catch (IllegalAccessException ex) { + throw new HttpApiImplException("HTTPMessageSender: IllegalAccessException at createPostClient()", ex); + } + } + + /** + * Lets the current thread sleep during the specified number of + * milliseconds. + * + * @param millis the duration of time to sleep in milliseconds + */ + protected void threadSleep(final int millis) { + try { + Thread.sleep(millis); + } catch (InterruptedException ex) { + // do nothing + } + } + + @Override + public void close() { + // nothing to close + } +} diff --git a/transports/transport-http/src/main/java/esa/mo/mal/transport/http/sending/HTTPMessageSenderNoEncoding.java b/transports/transport-http/src/main/java/esa/mo/mal/transport/http/sending/HTTPMessageSenderNoEncoding.java index 01514ae6..48599a48 100644 --- a/transports/transport-http/src/main/java/esa/mo/mal/transport/http/sending/HTTPMessageSenderNoEncoding.java +++ b/transports/transport-http/src/main/java/esa/mo/mal/transport/http/sending/HTTPMessageSenderNoEncoding.java @@ -1,10 +1,10 @@ /* ---------------------------------------------------------------------------- - * Copyright (C) 2024 European Space Agency + * Copyright (C) 2021 European Space Agency * European Space Operations Centre * Darmstadt * Germany * ---------------------------------------------------------------------------- - * System : CCSDS MO Transport - HTTP + * System : CCSDS MO HTTP Transport Framework * ---------------------------------------------------------------------------- * Licensed under the European Space Agency Public License, Version 2.0 * You may not use this file except in compliance with the License. @@ -13,31 +13,27 @@ * You on an "as is" basis and without warranties of any kind, including without * limitation merchantability, fitness for a particular purpose, absence of * defects or errors, accuracy or non-infringement of intellectual property rights. - * + * * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * ---------------------------------------------------------------------------- */ package esa.mo.mal.transport.http.sending; -import esa.mo.mal.transport.gen.sending.MessageSender; import esa.mo.mal.transport.gen.sending.OutgoingMessageHolder; import esa.mo.mal.transport.http.HTTPTransport; +import static esa.mo.mal.transport.http.HTTPTransport.RLOGGER; import esa.mo.mal.transport.http.api.IPostClient; import esa.mo.mal.transport.http.receiving.HTTPClientShutDown; import esa.mo.mal.transport.http.util.HttpApiImplException; -import static esa.mo.mal.transport.http.HTTPTransport.RLOGGER; import java.io.IOException; import org.ccsds.moims.mo.mal.transport.MALMessageHeader; /** - * The implementation of the GENMessageSender interface for HTTP transport. - * Encodes and delivers the MAL message via a HTTP request. + * The message sender for the binding mode that maps nothing of the MAL message + * onto HTTP. The whole encoded message travels in the request body. */ -public class HTTPMessageSenderNoEncoding implements MessageSender { - - protected final HTTPTransport transport; - protected final String abstractPostClientImpl; +public class HTTPMessageSenderNoEncoding extends HTTPMessageSender { /** * Constructor. @@ -46,39 +42,15 @@ public class HTTPMessageSenderNoEncoding implements MessageSender { * @param abstractPostClientImpl AbstractPostClient interface implementation */ public HTTPMessageSenderNoEncoding(HTTPTransport transport, String abstractPostClientImpl) { - this.transport = transport; - this.abstractPostClientImpl = abstractPostClientImpl; - } - - /** - * Lets the current thread sleep during the specified number of - * milliseconds. - * - * @param millis the duration of time to sleep in milliseconds - */ - protected void threadSleep(int millis) { - try { - Thread.sleep(millis); - } catch (InterruptedException ex) { - // do nothing - } + super(transport, abstractPostClientImpl); } @Override public void sendEncodedMessage(OutgoingMessageHolder packetData) throws IOException { MALMessageHeader malMessageHeader = packetData.getOriginalMessage().getHeader(); - String remoteUrl = malMessageHeader.getTo().getValue(); - if (transport.useHttps()) { - remoteUrl = remoteUrl.replaceAll("malhttp://", "https://"); - } else { - remoteUrl = remoteUrl.replaceAll("malhttp://", "http://"); - } - try { - IPostClient client = createPostClient(); - client.initAndConnectClient(remoteUrl, transport.useHttps(), - transport.getKeystoreFilename(), transport.getKeystorePassword()); + IPostClient client = connectPostClient(getRemoteUrl(malMessageHeader)); if (malMessageHeader.getIsErrorMessage()) { RLOGGER.severe("sendEncodedMessage: This is an untreated error message!"); @@ -94,30 +66,13 @@ public void sendEncodedMessage(OutgoingMessageHolder packetData) throws } /** - * Creates an instance of the AbstractPostClient interface. + * This binding mode does not map the MAL header onto HTTP headers. * - * @return the AbstractPostClient implementation - * @throws HttpApiImplException in case an error occurs when trying to - * instantiate the AbstractPostClient + * @param malMessageHeader the MALMessageHeader + * @param client the AbstractPostClient */ - public IPostClient createPostClient() throws HttpApiImplException { - try { - IPostClient clientImpl = (IPostClient) Class.forName(abstractPostClientImpl).newInstance(); - return clientImpl; - } catch (ClassNotFoundException ex) { - throw new HttpApiImplException("HTTPMessageSender: ClassNotFoundException at createPostClient()", ex); - } catch (InstantiationException ex) { - throw new HttpApiImplException("HTTPMessageSender: InstantiationException at createPostClient()", ex); - } catch (IllegalAccessException ex) { - throw new HttpApiImplException("HTTPMessageSender: IllegalAccessException at createPostClient()", ex); - } - } - @Override - public void close() { - // nothing to close - } - - public void setRequestHeaders(MALMessageHeader malMessageHeader, IPostClient client) throws IOException { + public void setRequestHeaders(MALMessageHeader malMessageHeader, IPostClient client) { + // nothing is mapped onto the HTTP headers in this binding mode } } diff --git a/transports/transport-http/src/main/java/esa/mo/mal/transport/http/sending/HTTPMessageSenderNoResponse.java b/transports/transport-http/src/main/java/esa/mo/mal/transport/http/sending/HTTPMessageSenderNoResponse.java index 6301f1ac..462aaf82 100644 --- a/transports/transport-http/src/main/java/esa/mo/mal/transport/http/sending/HTTPMessageSenderNoResponse.java +++ b/transports/transport-http/src/main/java/esa/mo/mal/transport/http/sending/HTTPMessageSenderNoResponse.java @@ -1,10 +1,10 @@ /* ---------------------------------------------------------------------------- - * Copyright (C) 2024 European Space Agency + * Copyright (C) 2021 European Space Agency * European Space Operations Centre * Darmstadt * Germany * ---------------------------------------------------------------------------- - * System : CCSDS MO Transport - HTTP + * System : CCSDS MO HTTP Transport Framework * ---------------------------------------------------------------------------- * Licensed under the European Space Agency Public License, Version 2.0 * You may not use this file except in compliance with the License. @@ -13,9 +13,9 @@ * You on an "as is" basis and without warranties of any kind, including without * limitation merchantability, fitness for a particular purpose, absence of * defects or errors, accuracy or non-infringement of intellectual property rights. - * + * * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * ---------------------------------------------------------------------------- */ package esa.mo.mal.transport.http.sending; @@ -26,21 +26,16 @@ import esa.mo.mal.transport.http.api.IPostClient; import esa.mo.mal.transport.http.receiving.HTTPClientShutDown; import esa.mo.mal.transport.http.util.HttpApiImplException; -import esa.mo.mal.transport.http.util.SupplementsEncoder; +import esa.mo.mal.transport.http.util.HttpHeaderSink; +import esa.mo.mal.transport.http.util.MALHttpHeaderEncoder; import java.io.IOException; -import java.net.URI; -import java.net.URISyntaxException; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.logging.Level; -import java.util.TimeZone; import org.ccsds.moims.mo.mal.transport.MALMessageHeader; /** - * Extension of HTTPMessageSenderNoEncoding. Additionally encodes the MAL - * message header separately over the HTTP headers. + * The message sender for the binding mode that maps the MAL message header onto + * HTTP headers, but does not take part in the HTTP request/response paradigm. */ -public class HTTPMessageSenderNoResponse extends HTTPMessageSenderNoEncoding { +public class HTTPMessageSenderNoResponse extends HTTPMessageSender { /** * Constructor. @@ -56,17 +51,8 @@ public HTTPMessageSenderNoResponse(HTTPTransport transport, String abstractPostC public synchronized void sendEncodedMessage(OutgoingMessageHolder packetData) throws IOException { MALMessageHeader malMessageHeader = packetData.getOriginalMessage().getHeader(); - String remoteUrl = malMessageHeader.getTo().getValue(); - if (transport.useHttps()) { - remoteUrl = remoteUrl.replaceAll("malhttp://", "https://"); - } else { - remoteUrl = remoteUrl.replaceAll("malhttp://", "http://"); - } - try { - IPostClient client = createPostClient(); - client.initAndConnectClient(remoteUrl, transport.useHttps(), transport.getKeystoreFilename(), - transport.getKeystorePassword()); + IPostClient client = connectPostClient(getRemoteUrl(malMessageHeader)); client.setRequestReferer(malMessageHeader.getFrom().getValue()); client.setRequestHeader("X-MAL-Version-Number", "2"); // according to 3.4.2 in recommended standard. @@ -98,47 +84,7 @@ public synchronized void sendEncodedMessage(OutgoingMessageHolder packet */ @Override public void setRequestHeaders(MALMessageHeader malMessageHeader, IPostClient client) throws IOException { - client.setRequestHeader("X-MAL-Authentication-Id", - HTTPTransport.byteArrayToHexString(malMessageHeader.getAuthenticationId().getValue())); - - try { - URI uriFrom = new URI(malMessageHeader.getFrom().getValue()); - URI uriTo = new URI(malMessageHeader.getTo().getValue()); - client.setRequestReferer(uriFrom.toASCIIString()); - client.setRequestHeader("X-MAL-Version-Number", "2"); // according to 3.4.2 in recommended standard. - client.setRequestHeader("X-MAL-To", uriTo.toASCIIString()); - client.setRequestHeader("Host", uriTo.getHost()); - client.setRequestHeader("request-target", uriTo.getPath()); - } catch (URISyntaxException e) { - RLOGGER.log(Level.SEVERE, e.getMessage(), e); - } - - Date timestampAsDate = new Date(malMessageHeader.getTimestamp().getValue()); - SimpleDateFormat TIMESTAMP_FORMAT = new SimpleDateFormat(HTTPTransport.TIMESTAMP_STRING_FORMAT); - TIMESTAMP_FORMAT.setTimeZone(TimeZone.getTimeZone("UTC")); - client.setRequestHeader("X-MAL-Timestamp", TIMESTAMP_FORMAT.format(timestampAsDate)); - client.setRequestHeader("X-MAL-Interaction-Type", malMessageHeader.getInteractionType().toString()); - - if (malMessageHeader.getInteractionStage() != null) { - client.setRequestHeader("X-MAL-Interaction-Stage", - encodeAscii(String.valueOf(malMessageHeader.getInteractionStage().getValue()))); - } - - client.setRequestHeader("X-MAL-Transaction-Id", - encodeAscii(String.valueOf(malMessageHeader.getTransactionId()))); - client.setRequestHeader("X-MAL-Service-Area", - encodeAscii(String.valueOf(malMessageHeader.getServiceArea().getValue()))); - client.setRequestHeader("X-MAL-Service", encodeAscii(String.valueOf(malMessageHeader.getService().getValue()))); - client.setRequestHeader("X-MAL-Operation", - encodeAscii(String.valueOf(malMessageHeader.getOperation().getValue()))); - client.setRequestHeader("X-MAL-Area-Version", - encodeAscii(String.valueOf(malMessageHeader.getAreaVersion().getValue()))); - client.setRequestHeader("X-MAL-Is-Error-Message", malMessageHeader.getIsErrorMessage() ? "True" : "False"); - - String supplements = SupplementsEncoder.encode(malMessageHeader.getSupplements()); - if (supplements != null) { - client.setRequestHeader("X-MAL-Supplements", encodeAscii(supplements)); - } + MALHttpHeaderEncoder.encodeRequestHeaders(malMessageHeader, HttpHeaderSink.of(client)); } /** @@ -149,19 +95,8 @@ public void setRequestHeaders(MALMessageHeader malMessageHeader, IPostClient cli * @param client The client object. */ protected void setContentTypeHeader(IPostClient client) { - String contentType = "application/mal-xml"; - String encoderInUse = transport.getStreamFactory().getClass().getCanonicalName(); - RLOGGER.log(Level.FINEST, "Using encoder {0}", encoderInUse); - boolean isUsingDefaultEncoder = HTTPTransport.HTTP_DEFAULT_XML_ENCODER.equals(encoderInUse); - - if (!isUsingDefaultEncoder) { - contentType = "application/mal"; - client.setRequestHeader("X-MAL-Encoding", encodeAscii(encoderInUse)); - } - client.setRequestHeader("Content-Type", contentType); - } - - protected String encodeAscii(String input) { - return input; + MALHttpHeaderEncoder.encodeContentType( + transport.getStreamFactory().getClass().getCanonicalName(), + HttpHeaderSink.of(client)); } } diff --git a/transports/transport-http/src/main/java/esa/mo/mal/transport/http/sending/HTTPMessageSenderRequestResponse.java b/transports/transport-http/src/main/java/esa/mo/mal/transport/http/sending/HTTPMessageSenderRequestResponse.java index 469c8df9..5c8cf4ad 100644 --- a/transports/transport-http/src/main/java/esa/mo/mal/transport/http/sending/HTTPMessageSenderRequestResponse.java +++ b/transports/transport-http/src/main/java/esa/mo/mal/transport/http/sending/HTTPMessageSenderRequestResponse.java @@ -1,10 +1,10 @@ /* ---------------------------------------------------------------------------- - * Copyright (C) 2024 European Space Agency + * Copyright (C) 2021 European Space Agency * European Space Operations Centre * Darmstadt * Germany * ---------------------------------------------------------------------------- - * System : CCSDS MO Transport - HTTP + * System : CCSDS MO HTTP Transport Framework * ---------------------------------------------------------------------------- * Licensed under the European Space Agency Public License, Version 2.0 * You may not use this file except in compliance with the License. @@ -13,9 +13,9 @@ * You on an "as is" basis and without warranties of any kind, including without * limitation merchantability, fitness for a particular purpose, absence of * defects or errors, accuracy or non-infringement of intellectual property rights. - * + * * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * ---------------------------------------------------------------------------- */ package esa.mo.mal.transport.http.sending; @@ -29,25 +29,21 @@ import esa.mo.mal.transport.http.receiving.HTTPClientProcessResponse; import esa.mo.mal.transport.http.receiving.HTTPClientShutDown; import esa.mo.mal.transport.http.util.HttpApiImplException; +import esa.mo.mal.transport.http.util.HttpHeaderSink; +import esa.mo.mal.transport.http.util.MALHttpHeaderEncoder; import esa.mo.mal.transport.http.util.StatusCodeHelper; -import esa.mo.mal.transport.http.util.SupplementsEncoder; import java.io.IOException; -import java.net.URI; -import java.net.URISyntaxException; -import java.text.SimpleDateFormat; -import java.util.Date; import java.util.logging.Level; -import java.util.TimeZone; import org.ccsds.moims.mo.mal.transport.MALMessageBody; import org.ccsds.moims.mo.mal.transport.MALMessageHeader; /** - * Extension of HTTPMessageSenderNoResponse. Additionally adds support for the - * HTTP request/response paradigm. I.e. potentially encodes and delivers the MAL - * message via a HTTP response, or possibly processes the HTTP response as - * received message for the parent transport. + * The message sender for the binding mode that takes part in the HTTP + * request/response paradigm. A message is delivered either over an HTTP + * response that was left open for it, or over a fresh HTTP request whose + * response may itself carry a message back. */ -public class HTTPMessageSenderRequestResponse extends HTTPMessageSenderNoResponse { +public class HTTPMessageSenderRequestResponse extends HTTPMessageSender { /** * Constructor. @@ -62,6 +58,7 @@ public HTTPMessageSenderRequestResponse(HTTPTransport transport, String abstract @Override public synchronized void sendEncodedMessage(OutgoingMessageHolder packetData) throws IOException { MALMessageHeader header = packetData.getOriginalMessage().getHeader(); + if (HTTPTransport.messageIsEncodedHttpResponse(header)) { sendEncodedMessageViaHttpResponse(packetData); } else { @@ -119,18 +116,9 @@ private void sendEncodedMessageViaHttpResponse(OutgoingMessageHolder pac */ private void sendEncodedMessageViaHttpClient(OutgoingMessageHolder packetData) throws IOException { MALMessageHeader malMessageHeader = packetData.getOriginalMessage().getHeader(); - String remoteUrl = malMessageHeader.getTo().getValue(); - - if (transport.useHttps()) { - remoteUrl = remoteUrl.replaceAll("malhttp://", "https://"); - } else { - remoteUrl = remoteUrl.replaceAll("malhttp://", "http://"); - } try { - IPostClient client = createPostClient(); - client.initAndConnectClient(remoteUrl, transport.useHttps(), transport.getKeystoreFilename(), - transport.getKeystorePassword()); + IPostClient client = connectPostClient(getRemoteUrl(malMessageHeader)); setContentTypeHeader(client); // according to 3.4.3 in recommended standard. setRequestHeaders(malMessageHeader, client); @@ -150,6 +138,19 @@ private void sendEncodedMessageViaHttpClient(OutgoingMessageHolder packe } } + /** + * Maps the MAL header fields from the message to HTTP custom headers of the + * client + * + * @param malMessageHeader the MALMessageHeader + * @param client the AbstractPostClient + * @throws IOException in case an internal error occurs + */ + @Override + public void setRequestHeaders(MALMessageHeader malMessageHeader, IPostClient client) throws IOException { + MALHttpHeaderEncoder.encodeRequestHeaders(malMessageHeader, HttpHeaderSink.of(client)); + } + /** * Maps the MAL header fields from the message to HTTP custom headers of the * httpResponse @@ -160,46 +161,7 @@ private void sendEncodedMessageViaHttpClient(OutgoingMessageHolder packe */ private void setResponseHeaders(MALMessageHeader malMessageHeader, IHttpResponse httpResponse) throws IOException { - httpResponse.setResponseHeader("X-MAL-Authentication-Id", - HTTPTransport.byteArrayToHexString(malMessageHeader.getAuthenticationId().getValue())); - - try { - URI from = new URI(malMessageHeader.getFrom().getValue()); - URI to = new URI(malMessageHeader.getTo().getValue()); - httpResponse.setReferer(from.toASCIIString()); - httpResponse.setResponseHeader("X-MAL-Version-Number", "2"); // according to 3.4.2 in recommended standard. - httpResponse.setResponseHeader("X-MAL-To", to.toASCIIString()); - httpResponse.setResponseHeader("Host", to.getHost()); - httpResponse.setResponseHeader("request-target", to.getPath()); - } catch (URISyntaxException use) { - throw new IOException("HTTPMessageSender: HttpApiImplException at sendEncodedMessageViaHttpResponse()", - use); - } - - Date timestampAsDate = new Date(malMessageHeader.getTimestamp().getValue()); - SimpleDateFormat TIMESTAMP_FORMAT = new SimpleDateFormat(HTTPTransport.TIMESTAMP_STRING_FORMAT); - TIMESTAMP_FORMAT.setTimeZone(TimeZone.getTimeZone("UTC")); - httpResponse.setResponseHeader("X-MAL-Timestamp", TIMESTAMP_FORMAT.format(timestampAsDate)); - httpResponse.setResponseHeader("X-MAL-Interaction-Type", malMessageHeader.getInteractionType().toString()); - httpResponse.setResponseHeader("X-MAL-Interaction-Stage", - encodeAscii(String.valueOf(malMessageHeader.getInteractionStage().getValue()))); - httpResponse.setResponseHeader("X-MAL-Transaction-Id", - encodeAscii(String.valueOf(malMessageHeader.getTransactionId()))); - httpResponse.setResponseHeader("X-MAL-Service-Area", - encodeAscii(String.valueOf(malMessageHeader.getServiceArea().getValue()))); - httpResponse.setResponseHeader("X-MAL-Service", - encodeAscii(String.valueOf(malMessageHeader.getService().getValue()))); - httpResponse.setResponseHeader("X-MAL-Operation", - encodeAscii(String.valueOf(malMessageHeader.getOperation().getValue()))); - httpResponse.setResponseHeader("X-MAL-Area-Version", - encodeAscii(String.valueOf(malMessageHeader.getAreaVersion().getValue()))); - httpResponse.setResponseHeader("X-MAL-Is-Error-Message", - encodeAscii(String.valueOf(malMessageHeader.getIsErrorMessage()))); - - String supplements = SupplementsEncoder.encode(malMessageHeader.getSupplements()); - if (supplements != null) { - httpResponse.setResponseHeader("X-MAL-Supplements", encodeAscii(supplements)); - } + MALHttpHeaderEncoder.encodeResponseHeaders(malMessageHeader, HttpHeaderSink.of(httpResponse)); } /** @@ -210,16 +172,21 @@ private void setResponseHeaders(MALMessageHeader malMessageHeader, * @param client The client object to be set. */ private void setContentTypeHeader(IHttpResponse client) { - String contentType = "application/mal-xml"; - String encoderInUse = transport.getStreamFactory().getClass().getCanonicalName(); - RLOGGER.log(Level.FINEST, "Using encoder {0}", encoderInUse); - boolean isUsingDefaultEncoder = HTTPTransport.HTTP_DEFAULT_XML_ENCODER.equals(encoderInUse); - - if (!isUsingDefaultEncoder) { - contentType = "application/mal"; - client.setResponseHeader("X-MAL-Encoding", encodeAscii(encoderInUse)); - } + MALHttpHeaderEncoder.encodeContentType( + transport.getStreamFactory().getClass().getCanonicalName(), + HttpHeaderSink.of(client)); + } - client.setResponseHeader("Content-Type", contentType); + /** + * If the default xml encoding mechanism is used, set the contenttype to + * application/mal-xml. Otherwise, set the content-type to application/mal + * and specify the encoder used in the X-MAL-ENCODING header. + * + * @param client The client object to be set. + */ + private void setContentTypeHeader(IPostClient client) { + MALHttpHeaderEncoder.encodeContentType( + transport.getStreamFactory().getClass().getCanonicalName(), + HttpHeaderSink.of(client)); } } diff --git a/transports/transport-http/src/main/java/esa/mo/mal/transport/http/util/HttpHeaderSink.java b/transports/transport-http/src/main/java/esa/mo/mal/transport/http/util/HttpHeaderSink.java new file mode 100644 index 00000000..d65b349c --- /dev/null +++ b/transports/transport-http/src/main/java/esa/mo/mal/transport/http/util/HttpHeaderSink.java @@ -0,0 +1,90 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2021 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO HTTP Transport Framework + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.mal.transport.http.util; + +import esa.mo.mal.transport.http.api.IHttpResponse; +import esa.mo.mal.transport.http.api.IPostClient; + +/** + * Somewhere HTTP headers can be written to. + * + * The MAL header fields are mapped onto HTTP headers identically whether they + * travel on an HTTP request or on an HTTP response, but the two are set through + * unrelated interfaces. This hides that difference so the mapping only has to + * be written once. + */ +public interface HttpHeaderSink { + + /** + * Sets a header. + * + * @param headerName The name of the header. + * @param headerValue The value of the header. + */ + void setHeader(String headerName, String headerValue); + + /** + * Sets the referer. + * + * @param referer The referer. + */ + void setReferer(String referer); + + /** + * Returns a sink writing to the request of an HTTP client. + * + * @param client The client to write to. + * @return The sink. + */ + static HttpHeaderSink of(final IPostClient client) { + return new HttpHeaderSink() { + @Override + public void setHeader(final String headerName, final String headerValue) { + client.setRequestHeader(headerName, headerValue); + } + + @Override + public void setReferer(final String referer) { + client.setRequestReferer(referer); + } + }; + } + + /** + * Returns a sink writing to an HTTP response. + * + * @param response The response to write to. + * @return The sink. + */ + static HttpHeaderSink of(final IHttpResponse response) { + return new HttpHeaderSink() { + @Override + public void setHeader(final String headerName, final String headerValue) { + response.setResponseHeader(headerName, headerValue); + } + + @Override + public void setReferer(final String referer) { + response.setReferer(referer); + } + }; + } +} diff --git a/transports/transport-http/src/main/java/esa/mo/mal/transport/http/util/MALHttpHeaderEncoder.java b/transports/transport-http/src/main/java/esa/mo/mal/transport/http/util/MALHttpHeaderEncoder.java new file mode 100644 index 00000000..fea91e7d --- /dev/null +++ b/transports/transport-http/src/main/java/esa/mo/mal/transport/http/util/MALHttpHeaderEncoder.java @@ -0,0 +1,201 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2021 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO HTTP Transport Framework + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.mal.transport.http.util; + +import esa.mo.mal.transport.http.HTTPTransport; +import static esa.mo.mal.transport.http.HTTPTransport.RLOGGER; +import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.TimeZone; +import java.util.logging.Level; +import org.ccsds.moims.mo.mal.transport.MALMessageHeader; + +/** + * Maps the fields of a MAL message header onto the custom HTTP headers defined + * by the MAL-HTTP binding. + * + * The same mapping is used whether the message travels on an HTTP request or on + * an HTTP response, so the methods here write through a {@link HttpHeaderSink} + * rather than to either interface directly. The few fields whose treatment + * differs between the two directions are deliberately left to the caller. + */ +public abstract class MALHttpHeaderEncoder { + + private MALHttpHeaderEncoder() { + } + + /** + * Writes the referer and the addressing headers, taken from the From and To + * fields of the MAL header. + * + * @param malMessageHeader The MAL message header. + * @param sink Where to write the HTTP headers. + * @throws URISyntaxException if the From or To field is not a valid URI. + */ + public static void encodeUriHeaders(final MALMessageHeader malMessageHeader, + final HttpHeaderSink sink) throws URISyntaxException { + URI uriFrom = new URI(malMessageHeader.getFrom().getValue()); + URI uriTo = new URI(malMessageHeader.getTo().getValue()); + sink.setReferer(uriFrom.toASCIIString()); + sink.setHeader("X-MAL-Version-Number", "2"); // according to 3.4.2 in recommended standard. + sink.setHeader("X-MAL-To", uriTo.toASCIIString()); + sink.setHeader("Host", uriTo.getHost()); + sink.setHeader("request-target", uriTo.getPath()); + } + + /** + * Writes the header fields that are mapped identically in both directions. + * + * The interaction stage and the error flag are not written here, because + * the request and the response paths treat them differently. + * + * @param malMessageHeader The MAL message header. + * @param sink Where to write the HTTP headers. + */ + public static void encodeCommonHeaders(final MALMessageHeader malMessageHeader, + final HttpHeaderSink sink) { + sink.setHeader("X-MAL-Authentication-Id", + HTTPTransport.byteArrayToHexString(malMessageHeader.getAuthenticationId().getValue())); + + Date timestampAsDate = new Date(malMessageHeader.getTimestamp().getValue()); + SimpleDateFormat timestampFormat = new SimpleDateFormat(HTTPTransport.TIMESTAMP_STRING_FORMAT); + timestampFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + sink.setHeader("X-MAL-Timestamp", timestampFormat.format(timestampAsDate)); + + sink.setHeader("X-MAL-Interaction-Type", malMessageHeader.getInteractionType().toString()); + sink.setHeader("X-MAL-Transaction-Id", String.valueOf(malMessageHeader.getTransactionId())); + sink.setHeader("X-MAL-Service-Area", String.valueOf(malMessageHeader.getServiceArea().getValue())); + sink.setHeader("X-MAL-Service", String.valueOf(malMessageHeader.getService().getValue())); + sink.setHeader("X-MAL-Operation", String.valueOf(malMessageHeader.getOperation().getValue())); + sink.setHeader("X-MAL-Area-Version", String.valueOf(malMessageHeader.getAreaVersion().getValue())); + } + + /** + * Writes the interaction stage header. + * + * @param malMessageHeader The MAL message header. + * @param sink Where to write the HTTP header. + */ + public static void encodeInteractionStage(final MALMessageHeader malMessageHeader, + final HttpHeaderSink sink) { + sink.setHeader("X-MAL-Interaction-Stage", + String.valueOf(malMessageHeader.getInteractionStage().getValue())); + } + + /** + * Writes the supplements header, if the message carries any supplements. + * + * @param malMessageHeader The MAL message header. + * @param sink Where to write the HTTP header. + * @throws IOException if the supplements could not be encoded. + */ + public static void encodeSupplements(final MALMessageHeader malMessageHeader, + final HttpHeaderSink sink) throws IOException { + String supplements = SupplementsEncoder.encode(malMessageHeader.getSupplements()); + + if (supplements != null) { + sink.setHeader("X-MAL-Supplements", supplements); + } + } + + /** + * Writes the full set of MAL headers onto an outgoing HTTP request. + * + * A From or To field that is not a valid URI is logged and the addressing + * headers are skipped, the rest of the mapping still being useful. + * + * @param malMessageHeader The MAL message header. + * @param sink Where to write the HTTP headers. + * @throws IOException if the supplements could not be encoded. + */ + public static void encodeRequestHeaders(final MALMessageHeader malMessageHeader, + final HttpHeaderSink sink) throws IOException { + encodeCommonHeaders(malMessageHeader, sink); + + try { + encodeUriHeaders(malMessageHeader, sink); + } catch (URISyntaxException e) { + RLOGGER.log(Level.SEVERE, e.getMessage(), e); + } + + if (malMessageHeader.getInteractionStage() != null) { + encodeInteractionStage(malMessageHeader, sink); + } + + sink.setHeader("X-MAL-Is-Error-Message", malMessageHeader.getIsErrorMessage() ? "True" : "False"); + encodeSupplements(malMessageHeader, sink); + } + + /** + * Writes the full set of MAL headers onto an outgoing HTTP response. + * + * Note that this differs from the request mapping in three ways, all of + * them preserved from the two implementations this was factored out of: an + * invalid From or To field is fatal rather than logged, the interaction + * stage is written unconditionally, and the error flag is written in lower + * case. + * + * @param malMessageHeader The MAL message header. + * @param sink Where to write the HTTP headers. + * @throws IOException if the From or To field is not a valid URI. + */ + public static void encodeResponseHeaders(final MALMessageHeader malMessageHeader, + final HttpHeaderSink sink) throws IOException { + encodeCommonHeaders(malMessageHeader, sink); + + try { + encodeUriHeaders(malMessageHeader, sink); + } catch (URISyntaxException use) { + throw new IOException( + "HTTPMessageSender: HttpApiImplException at sendEncodedMessageViaHttpResponse()", use); + } + + encodeInteractionStage(malMessageHeader, sink); + sink.setHeader("X-MAL-Is-Error-Message", String.valueOf(malMessageHeader.getIsErrorMessage())); + encodeSupplements(malMessageHeader, sink); + } + + /** + * Writes the content type header. If the default xml encoding mechanism is + * used the content type is application/mal-xml, otherwise it is + * application/mal and the encoder in use is named in the X-MAL-Encoding + * header. + * + * @param encoderInUse The canonical name of the element stream factory in + * use. + * @param sink Where to write the HTTP headers. + */ + public static void encodeContentType(final String encoderInUse, final HttpHeaderSink sink) { + String contentType = "application/mal-xml"; + RLOGGER.log(Level.FINEST, "Using encoder {0}", encoderInUse); + boolean isUsingDefaultEncoder = HTTPTransport.HTTP_DEFAULT_XML_ENCODER.equals(encoderInUse); + + if (!isUsingDefaultEncoder) { + contentType = "application/mal"; + sink.setHeader("X-MAL-Encoding", encoderInUse); + } + + sink.setHeader("Content-Type", contentType); + } +} diff --git a/transports/transport-http/src/test/java/esa/mo/mal/transport/http/test/HTTPMessageSenderBaseTest.java b/transports/transport-http/src/test/java/esa/mo/mal/transport/http/test/HTTPMessageSenderBaseTest.java index a26c655e..fd934136 100644 --- a/transports/transport-http/src/test/java/esa/mo/mal/transport/http/test/HTTPMessageSenderBaseTest.java +++ b/transports/transport-http/src/test/java/esa/mo/mal/transport/http/test/HTTPMessageSenderBaseTest.java @@ -4,7 +4,7 @@ import esa.mo.mal.transport.http.api.IPostClient; import esa.mo.mal.transport.http.connection.JdkTestClient; import static esa.mo.mal.transport.http.HTTPTransport.RLOGGER; -import esa.mo.mal.transport.http.sending.HTTPMessageSenderNoEncoding; +import esa.mo.mal.transport.http.sending.HTTPMessageSender; import java.io.UnsupportedEncodingException; import java.math.BigInteger; import java.net.HttpURLConnection; @@ -22,7 +22,7 @@ public abstract class HTTPMessageSenderBaseTest { - protected HTTPMessageSenderNoEncoding sender; + protected HTTPMessageSender sender; protected HTTPTransport transport; protected MALMessage message; protected GENMessageBuilder messageBuilder; From e4a5fee3b1bc662e1fd108ea3134c4d674f4efd6 Mon Sep 17 00:00:00 2001 From: Cesar Coelho Date: Sat, 1 Aug 2026 13:30:28 +0200 Subject: [PATCH 21/45] Re-enable the access control test scenario The scenario was commented out of the test document in d4229273, a large release commit, with no change to the scenario or to its fixtures. It was most likely turned off to get that release green rather than because the test was wrong, and nothing has touched the access control code since. It passes again, so let it run. Checked against all four transports of the MAL testbed, ESA, ESA_TCPIP, ESA_ZMTP and ESA_HTTP, each reporting 78 passing assertions for the scenario and no failures. Co-Authored-By: Claude Opus 5 --- .../fitnesse/FitNesseRoot/MalTests/TestDocument/content.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testbeds/testbed-mal/src/main/fitnesse/FitNesseRoot/MalTests/TestDocument/content.txt b/testbeds/testbed-mal/src/main/fitnesse/FitNesseRoot/MalTests/TestDocument/content.txt index 4107a7ce..5c3355c1 100644 --- a/testbeds/testbed-mal/src/main/fitnesse/FitNesseRoot/MalTests/TestDocument/content.txt +++ b/testbeds/testbed-mal/src/main/fitnesse/FitNesseRoot/MalTests/TestDocument/content.txt @@ -41,5 +41,5 @@ !see TestScenarios.Section4Scenarios.ErrorTestScenario !see TestScenarios.Section4Scenarios.ErrorTestScenario.TransportErrors !see TestScenarios.Section4Scenarios.ErrorTestScenario.SecurityErrors -#!see TestScenarios.Section4Scenarios.AccessControlTestScenario +!see TestScenarios.Section4Scenarios.AccessControlTestScenario !see TestScenarios.RegressionScenarios.FastProvider From 4d22f1b50848abe44394e4798aaf84ac9dbe152c Mon Sep 17 00:00:00 2001 From: Cesar Coelho Date: Sat, 1 Aug 2026 14:12:03 +0200 Subject: [PATCH 22/45] Resolve the XML namespace schema locally XMLSchema.xsd imports the schema for the XML namespace by its published URL, and nothing resolved that locally, so every clean build fetched it from www.w3.org. An offline build, a network outage or a rate limit at the far end therefore failed the build, and did so with the misleading symptom of xml:lang being reported as an undefined attribute, the import having silently failed first. Keep a copy of that schema next to the sources and point an XML catalog at it. Verified by building with the network blocked, which fails before this change and succeeds after it, generating the same 68 classes as before. Co-Authored-By: Claude Opus 5 --- api-generator/generator-interfaces/pom.xml | 4 + .../src/main/xsd-ref/catalog.xml | 17 ++ .../src/main/xsd-ref/xml.xsd | 287 ++++++++++++++++++ 3 files changed, 308 insertions(+) create mode 100644 api-generator/generator-interfaces/src/main/xsd-ref/catalog.xml create mode 100644 api-generator/generator-interfaces/src/main/xsd-ref/xml.xsd diff --git a/api-generator/generator-interfaces/pom.xml b/api-generator/generator-interfaces/pom.xml index d038db73..3aea71d8 100644 --- a/api-generator/generator-interfaces/pom.xml +++ b/api-generator/generator-interfaces/pom.xml @@ -132,6 +132,10 @@ false w3c.xsd true + + ${basedir}/src/main/xsd-ref/catalog.xml ${basedir}/src/main/xsd-ref/XMLSchema.xsd diff --git a/api-generator/generator-interfaces/src/main/xsd-ref/catalog.xml b/api-generator/generator-interfaces/src/main/xsd-ref/catalog.xml new file mode 100644 index 00000000..d19a0b20 --- /dev/null +++ b/api-generator/generator-interfaces/src/main/xsd-ref/catalog.xml @@ -0,0 +1,17 @@ + + + + + + + + diff --git a/api-generator/generator-interfaces/src/main/xsd-ref/xml.xsd b/api-generator/generator-interfaces/src/main/xsd-ref/xml.xsd new file mode 100644 index 00000000..aea7d0db --- /dev/null +++ b/api-generator/generator-interfaces/src/main/xsd-ref/xml.xsd @@ -0,0 +1,287 @@ + + + + + + +
+

About the XML namespace

+ +
+

+ This schema document describes the XML namespace, in a form + suitable for import by other schema documents. +

+

+ See + http://www.w3.org/XML/1998/namespace.html and + + http://www.w3.org/TR/REC-xml for information + about this namespace. +

+

+ Note that local names in this namespace are intended to be + defined only by the World Wide Web Consortium or its subgroups. + The names currently defined in this namespace are listed below. + They should not be used with conflicting semantics by any Working + Group, specification, or document instance. +

+

+ See further below in this document for more information about how to refer to this schema document from your own + XSD schema documents and about the + namespace-versioning policy governing this schema document. +

+
+
+
+
+ + + + +
+ +

lang (as an attribute name)

+

+ denotes an attribute whose value + is a language code for the natural language of the content of + any element; its value is inherited. This name is reserved + by virtue of its definition in the XML specification.

+ +
+
+

Notes

+

+ Attempting to install the relevant ISO 2- and 3-letter + codes as the enumerated possible values is probably never + going to be a realistic possibility. +

+

+ See BCP 47 at + http://www.rfc-editor.org/rfc/bcp/bcp47.txt + and the IANA language subtag registry at + + http://www.iana.org/assignments/language-subtag-registry + for further information. +

+

+ The union allows for the 'un-declaration' of xml:lang with + the empty string. +

+
+
+
+ + + + + + + + + +
+ + + + +
+ +

space (as an attribute name)

+

+ denotes an attribute whose + value is a keyword indicating what whitespace processing + discipline is intended for the content of the element; its + value is inherited. This name is reserved by virtue of its + definition in the XML specification.

+ +
+
+
+ + + + + + +
+ + + +
+ +

base (as an attribute name)

+

+ denotes an attribute whose value + provides a URI to be used as the base for interpreting any + relative URIs in the scope of the element on which it + appears; its value is inherited. This name is reserved + by virtue of its definition in the XML Base specification.

+ +

+ See http://www.w3.org/TR/xmlbase/ + for information about this attribute. +

+
+
+
+
+ + + + +
+ +

id (as an attribute name)

+

+ denotes an attribute whose value + should be interpreted as if declared to be of type ID. + This name is reserved by virtue of its definition in the + xml:id specification.

+ +

+ See http://www.w3.org/TR/xml-id/ + for information about this attribute. +

+
+
+
+
+ + + + + + + + + + +
+ +

Father (in any context at all)

+ +
+

+ denotes Jon Bosak, the chair of + the original XML Working Group. This name is reserved by + the following decision of the W3C XML Plenary and + XML Coordination groups: +

+
+

+ In appreciation for his vision, leadership and + dedication the W3C XML Plenary on this 10th day of + February, 2000, reserves for Jon Bosak in perpetuity + the XML name "xml:Father". +

+
+
+
+
+
+ + + +
+

About this schema document

+ +
+

+ This schema defines attributes and an attribute group suitable + for use by schemas wishing to allow xml:base, + xml:lang, xml:space or + xml:id attributes on elements they define. +

+

+ To enable this, such a schema must import this schema for + the XML namespace, e.g. as follows: +

+
+          <schema . . .>
+           . . .
+           <import namespace="http://www.w3.org/XML/1998/namespace"
+                      schemaLocation="http://www.w3.org/2001/xml.xsd"/>
+     
+

+ or +

+
+           <import namespace="http://www.w3.org/XML/1998/namespace"
+                      schemaLocation="http://www.w3.org/2009/01/xml.xsd"/>
+     
+

+ Subsequently, qualified reference to any of the attributes or the + group defined below will have the desired effect, e.g. +

+
+          <type . . .>
+           . . .
+           <attributeGroup ref="xml:specialAttrs"/>
+     
+

+ will define a type which will schema-validate an instance element + with any of those attributes. +

+
+
+
+
+ + + +
+

Versioning policy for this schema document

+
+

+ In keeping with the XML Schema WG's standard versioning + policy, this schema document will persist at + + http://www.w3.org/2009/01/xml.xsd. +

+

+ At the date of issue it can also be found at + + http://www.w3.org/2001/xml.xsd. +

+

+ The schema document at that URI may however change in the future, + in order to remain compatible with the latest version of XML + Schema itself, or with the XML namespace itself. In other words, + if the XML Schema or XML namespaces change, the version of this + document at + http://www.w3.org/2001/xml.xsd + + will change accordingly; the version at + + http://www.w3.org/2009/01/xml.xsd + + will not change. +

+

+ Previous dated (and unchanging) versions of this schema + document are at: +

+ +
+
+
+
+ +
+ From 77d68f893f2408de3dbec566f845d7b37407c668 Mon Sep 17 00:00:00 2001 From: Cesar Coelho Date: Sat, 1 Aug 2026 14:14:44 +0200 Subject: [PATCH 23/45] Leave out HTTP headers that have no value A header with no value was sent carrying the string instead. The MAL HTTP binding does not define it, so a peer has no way to tell it apart from a real value. An empty authentication id, for one, arrived as a string that is not the hexadecimal representation of a Blob. Leave the header out instead. The placeholder is still understood on reception, so deployments that still send it keep working, and the constant is kept and deprecated for that reason alone. The placeholder was also load bearing: it guaranteed that every header was present, and four of the five readers dereferenced the value without checking for null first. Absent headers are now normal, so they read back as an empty value, which is what an empty header already produced. Closes #35 Co-Authored-By: Claude Opus 5 --- .../mo/mal/transport/http/api/IHttpRequest.java | 2 +- .../mo/mal/transport/http/api/IHttpResponse.java | 2 +- .../mo/mal/transport/http/api/IPostClient.java | 16 ++++++++++++---- .../transport/http/api/jetty/JettyClient.java | 10 +++++++--- .../http/api/jetty/JettyHttpRequest.java | 4 +++- .../http/api/jetty/JettyHttpResponse.java | 6 ++++-- .../mal/transport/http/connection/JdkClient.java | 6 ++++-- .../http/connection/JdkHttpRequest.java | 6 +++--- .../http/connection/JdkHttpResponse.java | 6 ++++-- .../transport/http/connection/JdkTestClient.java | 10 +++++++--- .../http/test/HTTPMessageSenderBaseTest.java | 14 ++++++++++++++ 11 files changed, 60 insertions(+), 22 deletions(-) diff --git a/transports/transport-http/src/main/java/esa/mo/mal/transport/http/api/IHttpRequest.java b/transports/transport-http/src/main/java/esa/mo/mal/transport/http/api/IHttpRequest.java index 16a0ca9f..161eb65a 100644 --- a/transports/transport-http/src/main/java/esa/mo/mal/transport/http/api/IHttpRequest.java +++ b/transports/transport-http/src/main/java/esa/mo/mal/transport/http/api/IHttpRequest.java @@ -48,7 +48,7 @@ public interface IHttpRequest { /** * Gets the header field value of the given header field name. * - * Needs to consider AbstractPostClient.EMPTY_STRING_PLACEHOLDER. + * A header that was not set reads back as an empty value. * * @param headerName the header field name * @return the header field value diff --git a/transports/transport-http/src/main/java/esa/mo/mal/transport/http/api/IHttpResponse.java b/transports/transport-http/src/main/java/esa/mo/mal/transport/http/api/IHttpResponse.java index 60664448..8946275f 100644 --- a/transports/transport-http/src/main/java/esa/mo/mal/transport/http/api/IHttpResponse.java +++ b/transports/transport-http/src/main/java/esa/mo/mal/transport/http/api/IHttpResponse.java @@ -48,7 +48,7 @@ public interface IHttpResponse { /** * Sets the header field value of the given header field name. * - * Needs to consider AbstractPostClient.EMPTY_STRING_PLACEHOLDER. + * A value that is null or empty is not sent, the header is left out. * * @param headerName the header field name * @param headerValue the header field value diff --git a/transports/transport-http/src/main/java/esa/mo/mal/transport/http/api/IPostClient.java b/transports/transport-http/src/main/java/esa/mo/mal/transport/http/api/IPostClient.java index 657bf004..eaf01bdc 100644 --- a/transports/transport-http/src/main/java/esa/mo/mal/transport/http/api/IPostClient.java +++ b/transports/transport-http/src/main/java/esa/mo/mal/transport/http/api/IPostClient.java @@ -32,9 +32,17 @@ public interface IPostClient { /** - * Placeholder to use for empty string header values instead, in order to be - * sure that the header field will be transmitted and not dropped. + * Placeholder that older versions of this transport sent as the value of a + * header that had no value. + * + * It is not defined by the MAL HTTP binding and is no longer sent, because + * a peer that does not know it cannot tell it apart from a real value. A + * header with no value is now left out altogether. The constant is kept so + * that messages from those older versions are still understood. + * + * @deprecated Only accepted on reception, never sent. */ + @Deprecated public static final String EMPTY_STRING_PLACEHOLDER = ""; /** @@ -61,7 +69,7 @@ public void initAndConnectClient(String remoteUrl, boolean useHttps, String keys /** * Sets the header field value of the given header field name. * - * Needs to consider EMPTY_STRING_PLACEHOLDER. + * A value that is null or empty is not sent, the header is left out. * * @param headerName the header field name * @param headerValue the header field value @@ -106,7 +114,7 @@ public void initAndConnectClient(String remoteUrl, boolean useHttps, String keys /** * Gets the header field value of the given header field name. * - * Needs to consider EMPTY_STRING_PLACEHOLDER. + * A header that was not set reads back as an empty value. * * @param headerName the header field name * @return the header field value diff --git a/transports/transport-http/src/main/java/esa/mo/mal/transport/http/api/jetty/JettyClient.java b/transports/transport-http/src/main/java/esa/mo/mal/transport/http/api/jetty/JettyClient.java index a192e998..725aa3ef 100644 --- a/transports/transport-http/src/main/java/esa/mo/mal/transport/http/api/jetty/JettyClient.java +++ b/transports/transport-http/src/main/java/esa/mo/mal/transport/http/api/jetty/JettyClient.java @@ -70,8 +70,10 @@ public void setRequestReferer(String referer) { @Override public void setRequestHeader(String headerName, String headerValue) { - if (headerValue.equals("")) { - headerValue = EMPTY_STRING_PLACEHOLDER; + if (headerValue == null || headerValue.isEmpty()) { + // A header with no value is left out rather than given one that + // the MAL HTTP binding does not define. + return; } request.header(headerName, headerValue); } @@ -107,7 +109,9 @@ public String getResponseReferer() { @Override public String getResponseHeader(String headerName) { String headerValue = response.getHeaders().get(headerName); - if (headerValue.equals(EMPTY_STRING_PLACEHOLDER)) { + // A header carrying no value is left out by this transport, and older + // versions of it sent a placeholder instead. Both mean an empty value. + if (headerValue == null || headerValue.equals(EMPTY_STRING_PLACEHOLDER)) { headerValue = ""; } return headerValue; diff --git a/transports/transport-http/src/main/java/esa/mo/mal/transport/http/api/jetty/JettyHttpRequest.java b/transports/transport-http/src/main/java/esa/mo/mal/transport/http/api/jetty/JettyHttpRequest.java index 50421c7c..0ce61d86 100644 --- a/transports/transport-http/src/main/java/esa/mo/mal/transport/http/api/jetty/JettyHttpRequest.java +++ b/transports/transport-http/src/main/java/esa/mo/mal/transport/http/api/jetty/JettyHttpRequest.java @@ -58,7 +58,9 @@ public String getReferer() { @Override public String getRequestHeader(String headerName) { String headerValue = request.getHeader(headerName); - if (headerValue.equals(EMPTY_STRING_PLACEHOLDER)) { + // A header carrying no value is left out by this transport, and older + // versions of it sent a placeholder instead. Both mean an empty value. + if (headerValue == null || headerValue.equals(EMPTY_STRING_PLACEHOLDER)) { headerValue = ""; } return headerValue; diff --git a/transports/transport-http/src/main/java/esa/mo/mal/transport/http/api/jetty/JettyHttpResponse.java b/transports/transport-http/src/main/java/esa/mo/mal/transport/http/api/jetty/JettyHttpResponse.java index f5b1fd4e..8ff3cac2 100644 --- a/transports/transport-http/src/main/java/esa/mo/mal/transport/http/api/jetty/JettyHttpResponse.java +++ b/transports/transport-http/src/main/java/esa/mo/mal/transport/http/api/jetty/JettyHttpResponse.java @@ -62,8 +62,10 @@ public void setReferer(String referer) { @Override public void setResponseHeader(String headerName, String headerValue) { - if (headerValue.equals("")) { - headerValue = EMPTY_STRING_PLACEHOLDER; + if (headerValue == null || headerValue.isEmpty()) { + // A header with no value is left out rather than given one that + // the MAL HTTP binding does not define. + return; } response.setHeader(headerName, headerValue); } diff --git a/transports/transport-http/src/main/java/esa/mo/mal/transport/http/connection/JdkClient.java b/transports/transport-http/src/main/java/esa/mo/mal/transport/http/connection/JdkClient.java index 6e13f28d..a0f2a2cc 100644 --- a/transports/transport-http/src/main/java/esa/mo/mal/transport/http/connection/JdkClient.java +++ b/transports/transport-http/src/main/java/esa/mo/mal/transport/http/connection/JdkClient.java @@ -81,8 +81,10 @@ public void setRequestReferer(String referer) { // US-ASCII encoding @Override public void setRequestHeader(String headerName, String headerValue) { - if (headerValue == null || headerValue.equals("")) { - headerValue = EMPTY_STRING_PLACEHOLDER; + if (headerValue == null || headerValue.isEmpty()) { + // A header with no value is left out rather than given one that + // the MAL HTTP binding does not define. + return; } if (Arrays.asList(asciiHeaders).contains(headerName)) { diff --git a/transports/transport-http/src/main/java/esa/mo/mal/transport/http/connection/JdkHttpRequest.java b/transports/transport-http/src/main/java/esa/mo/mal/transport/http/connection/JdkHttpRequest.java index 9128189d..a4af160a 100644 --- a/transports/transport-http/src/main/java/esa/mo/mal/transport/http/connection/JdkHttpRequest.java +++ b/transports/transport-http/src/main/java/esa/mo/mal/transport/http/connection/JdkHttpRequest.java @@ -80,10 +80,10 @@ public String getReferer() { @Override public String getRequestHeader(String headerName) { String headerValue = httpExchange.getRequestHeaders().getFirst(headerName); + // A header carrying no value is left out by this transport, and older + // versions of it sent a placeholder instead. Both mean an empty value. if (headerValue == null || headerValue.equals(EMPTY_STRING_PLACEHOLDER)) { - HTTPTransport.RLOGGER.log(Level.WARNING, "Header not found: {0}", headerName); - } - if (headerValue.equals(EMPTY_STRING_PLACEHOLDER)) { + HTTPTransport.RLOGGER.log(Level.FINE, "Header not set: {0}", headerName); headerValue = ""; } diff --git a/transports/transport-http/src/main/java/esa/mo/mal/transport/http/connection/JdkHttpResponse.java b/transports/transport-http/src/main/java/esa/mo/mal/transport/http/connection/JdkHttpResponse.java index ab53b9f9..e4016cc7 100644 --- a/transports/transport-http/src/main/java/esa/mo/mal/transport/http/connection/JdkHttpResponse.java +++ b/transports/transport-http/src/main/java/esa/mo/mal/transport/http/connection/JdkHttpResponse.java @@ -64,8 +64,10 @@ public void setReferer(String referer) { @Override public void setResponseHeader(String headerName, String headerValue) { - if (headerValue.equals("")) { - headerValue = EMPTY_STRING_PLACEHOLDER; + if (headerValue == null || headerValue.isEmpty()) { + // A header with no value is left out rather than given one that + // the MAL HTTP binding does not define. + return; } if (Arrays.asList(asciiHeaders).contains(headerName)) { diff --git a/transports/transport-http/src/main/java/esa/mo/mal/transport/http/connection/JdkTestClient.java b/transports/transport-http/src/main/java/esa/mo/mal/transport/http/connection/JdkTestClient.java index 5a5f6618..93eed482 100644 --- a/transports/transport-http/src/main/java/esa/mo/mal/transport/http/connection/JdkTestClient.java +++ b/transports/transport-http/src/main/java/esa/mo/mal/transport/http/connection/JdkTestClient.java @@ -81,8 +81,10 @@ public void setRequestReferer(String referer) { @Override public void setRequestHeader(String headerName, String headerValue) { - if (headerValue == null || headerValue.equals("")) { - headerValue = EMPTY_STRING_PLACEHOLDER; + if (headerValue == null || headerValue.isEmpty()) { + // A header with no value is left out rather than given one that + // the MAL HTTP binding does not define. + return; } if (Arrays.asList(asciiHeaders).contains(headerName)) { @@ -125,7 +127,9 @@ public String getResponseReferer() { @Override public String getResponseHeader(String headerName) { String headerValue = connection.getHeaderField(headerName); - if (headerValue.equals(EMPTY_STRING_PLACEHOLDER)) { + // A header carrying no value is left out by this transport, and older + // versions of it sent a placeholder instead. Both mean an empty value. + if (headerValue == null || headerValue.equals(EMPTY_STRING_PLACEHOLDER)) { headerValue = ""; } if (Arrays.asList(asciiHeaders).contains(headerName)) { diff --git a/transports/transport-http/src/test/java/esa/mo/mal/transport/http/test/HTTPMessageSenderBaseTest.java b/transports/transport-http/src/test/java/esa/mo/mal/transport/http/test/HTTPMessageSenderBaseTest.java index fd934136..cd526abe 100644 --- a/transports/transport-http/src/test/java/esa/mo/mal/transport/http/test/HTTPMessageSenderBaseTest.java +++ b/transports/transport-http/src/test/java/esa/mo/mal/transport/http/test/HTTPMessageSenderBaseTest.java @@ -16,6 +16,7 @@ import org.ccsds.moims.mo.mal.transport.MALMessage; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; @@ -63,6 +64,19 @@ public void testAuthenticationHeader() throws Exception { assertEquals("http://www.esa.int", authenticationId); } + @Test + public void testEmptyHeaderIsNotSent() throws Exception { + + // An empty authentication id encodes to an empty hex string. The header + // is then left out rather than sent with a placeholder value, which a + // peer would not be able to tell apart from a real one. + message = messageBuilder.authenticationId(new Blob(new byte[0])).build(); + HttpURLConnection connection = createClient(message); + + assertNotNull(connection); + assertNull(connection.getRequestProperty("X-MAL-Authentication-Id")); + } + @Test public void testTo() throws Exception { From 3a82dfc7ae4b7792b48f1b0fca0d8b08d0c2944d Mon Sep 17 00:00:00 2001 From: Cesar Coelho Date: Sat, 1 Aug 2026 16:30:57 +0200 Subject: [PATCH 24/45] Serve each HTTP request with its own context handler A server registered one context handler and drove processRequest, processResponse and finishHandling on it for every request, while the handler keeps the decoded header and the body of the request it is serving in fields. Requests are served concurrently, so two of them overwrote each other, and processResponse then decided what to answer from a header that belonged to another request, or to none yet. The symptom was a 204 sent where a MAL message was expected. The client then read a response with no MAL headers and failed with Unknown Enumeration for the provided string: which killed the thread processing the response, and the interaction that was waiting for it never completed. Let a handler answer with the instance to serve one request with, and have both servers ask for one. The default answers with itself, which stays correct for a handler that holds nothing between the three calls, so handlers outside this repository are unaffected. Report a missing mandatory header by its name while here. The absence of a header used to surface as whatever the parser of that particular field threw, naming neither the header nor the message it arrived with, which is what made the above hard to read. Co-Authored-By: Claude Opus 5 --- .../transport/http/api/IContextHandler.java | 18 ++++++ .../http/api/jetty/JettyServlet.java | 9 ++- .../transport/http/connection/JdkServer.java | 9 ++- .../receiving/HTTPClientProcessResponse.java | 26 ++++++--- .../HTTPContextHandlerNoEncoding.java | 7 +++ .../HTTPContextHandlerNoResponse.java | 36 ++++++++---- .../HTTPContextHandlerRequestResponse.java | 8 +++ .../transport/http/util/MALHttpHeaders.java | 55 +++++++++++++++++++ .../HTTPMessageHandlerNoResponse.java | 2 +- 9 files changed, 144 insertions(+), 26 deletions(-) create mode 100644 transports/transport-http/src/main/java/esa/mo/mal/transport/http/util/MALHttpHeaders.java diff --git a/transports/transport-http/src/main/java/esa/mo/mal/transport/http/api/IContextHandler.java b/transports/transport-http/src/main/java/esa/mo/mal/transport/http/api/IContextHandler.java index eac90a35..d76a2970 100644 --- a/transports/transport-http/src/main/java/esa/mo/mal/transport/http/api/IContextHandler.java +++ b/transports/transport-http/src/main/java/esa/mo/mal/transport/http/api/IContextHandler.java @@ -29,6 +29,24 @@ */ public interface IContextHandler { + /** + * Returns the handler that shall serve one single request. + * + * The three methods below are called in turn for one request and carry + * state from one to the next, so a handler that holds that state in fields + * has to answer with a fresh instance here. A server registers one handler + * and serves requests concurrently, so returning the same instance lets + * two requests overwrite each other's state. + * + * The default answers with this handler, which is only correct for a + * handler that holds no state between the three calls. + * + * @return The handler to serve one request with. + */ + default IContextHandler forRequest() { + return this; + } + /** * Routine handling the AbstractHttpRequest object, e.g. reading header * fields and body data. diff --git a/transports/transport-http/src/main/java/esa/mo/mal/transport/http/api/jetty/JettyServlet.java b/transports/transport-http/src/main/java/esa/mo/mal/transport/http/api/jetty/JettyServlet.java index 40e91478..4e4737b7 100644 --- a/transports/transport-http/src/main/java/esa/mo/mal/transport/http/api/jetty/JettyServlet.java +++ b/transports/transport-http/src/main/java/esa/mo/mal/transport/http/api/jetty/JettyServlet.java @@ -42,9 +42,12 @@ public void doPost(HttpServletRequest request, HttpServletResponse response) thr try { final Continuation continuation = ContinuationSupport.getContinuation(request); continuation.suspend(response); - contextHandler.processRequest(new JettyHttpRequest(request)); - contextHandler.processResponse(new JettyHttpResponse(response, continuation)); - contextHandler.finishHandling(); + // One handler per request: they carry state between the three calls + // below, and requests are served concurrently. + IContextHandler handler = contextHandler.forRequest(); + handler.processRequest(new JettyHttpRequest(request)); + handler.processResponse(new JettyHttpResponse(response, continuation)); + handler.finishHandling(); } catch (HttpApiImplException ex) { throw new IOException("JettyServlet: HttpApiImplException at doPost", ex); } diff --git a/transports/transport-http/src/main/java/esa/mo/mal/transport/http/connection/JdkServer.java b/transports/transport-http/src/main/java/esa/mo/mal/transport/http/connection/JdkServer.java index 90eca2bf..159d2a89 100644 --- a/transports/transport-http/src/main/java/esa/mo/mal/transport/http/connection/JdkServer.java +++ b/transports/transport-http/src/main/java/esa/mo/mal/transport/http/connection/JdkServer.java @@ -71,9 +71,12 @@ public void addContextHandler(final IContextHandler contextHandler) { @Override public void handle(HttpExchange httpExchange) throws IOException { try { - contextHandler.processRequest(new JdkHttpRequest(httpExchange)); - contextHandler.processResponse(new JdkHttpResponse(httpExchange)); - contextHandler.finishHandling(); + // One handler per request: they carry state between the + // three calls below, and requests are served concurrently. + IContextHandler handler = contextHandler.forRequest(); + handler.processRequest(new JdkHttpRequest(httpExchange)); + handler.processResponse(new JdkHttpResponse(httpExchange)); + handler.finishHandling(); } catch (HttpApiImplException ex) { RLOGGER.severe(ex.getMessage()); throw new IOException("JdkServer.addContextHandler(): HttpApiImplException at HttpHandler.handle()", ex); diff --git a/transports/transport-http/src/main/java/esa/mo/mal/transport/http/receiving/HTTPClientProcessResponse.java b/transports/transport-http/src/main/java/esa/mo/mal/transport/http/receiving/HTTPClientProcessResponse.java index a91823d2..96e9ec8b 100644 --- a/transports/transport-http/src/main/java/esa/mo/mal/transport/http/receiving/HTTPClientProcessResponse.java +++ b/transports/transport-http/src/main/java/esa/mo/mal/transport/http/receiving/HTTPClientProcessResponse.java @@ -24,6 +24,7 @@ import static esa.mo.mal.transport.http.HTTPTransport.RLOGGER; import esa.mo.mal.transport.http.api.IPostClient; import esa.mo.mal.transport.http.util.HttpApiImplException; +import esa.mo.mal.transport.http.util.MALHttpHeaders; import esa.mo.mal.transport.http.util.SupplementsEncoder; import esa.mo.mal.transport.http.util.UriHelper; import java.io.IOException; @@ -110,7 +111,8 @@ protected void processHttpResponse(IPostClient client) throws HttpApiImplExcepti * @param uriFrom the URIfrom field * @return the GENMessageHeader corresponding to the HTTP headers */ - protected MALMessageHeader createMALHeaderFromHttp(IPostClient client, Identifier uriTo, Identifier uriFrom) { + protected MALMessageHeader createMALHeaderFromHttp(IPostClient client, + Identifier uriTo, Identifier uriFrom) throws HttpApiImplException { SimpleDateFormat TIMESTAMP_FORMAT = new SimpleDateFormat(HTTPTransport.TIMESTAMP_STRING_FORMAT); TIMESTAMP_FORMAT.setTimeZone(TimeZone.getTimeZone("UTC")); @@ -128,18 +130,24 @@ protected MALMessageHeader createMALHeaderFromHttp(IPostClient client, Identifie RLOGGER.severe(e.getMessage()); e.printStackTrace(); } - String iType = client.getResponseHeader("X-MAL-Interaction-Type"); + String iType = MALHttpHeaders.required("X-MAL-Interaction-Type", + client.getResponseHeader("X-MAL-Interaction-Type")); InteractionType interactionType = InteractionType.fromString(iType); UOctet interactionStage = null; if (interactionType.getValue() != InteractionType.SEND_VALUE) { - interactionStage = new UOctet( - Short.parseShort(client.getResponseHeader("X-MAL-Interaction-Stage"))); + interactionStage = new UOctet(Short.parseShort(MALHttpHeaders.required( + "X-MAL-Interaction-Stage", client.getResponseHeader("X-MAL-Interaction-Stage")))); } - Long transactionId = Long.parseLong(client.getResponseHeader("X-MAL-Transaction-Id")); - UShort serviceArea = new UShort(Integer.parseInt(client.getResponseHeader("X-MAL-Service-Area"))); - UShort service = new UShort(Integer.parseInt(client.getResponseHeader("X-MAL-Service"))); - UShort operation = new UShort(Integer.parseInt(client.getResponseHeader("X-MAL-Operation"))); - UOctet serviceVersion = new UOctet(Short.parseShort(client.getResponseHeader("X-MAL-Area-Version"))); + Long transactionId = Long.parseLong(MALHttpHeaders.required("X-MAL-Transaction-Id", + client.getResponseHeader("X-MAL-Transaction-Id"))); + UShort serviceArea = new UShort(Integer.parseInt(MALHttpHeaders.required("X-MAL-Service-Area", + client.getResponseHeader("X-MAL-Service-Area")))); + UShort service = new UShort(Integer.parseInt(MALHttpHeaders.required("X-MAL-Service", + client.getResponseHeader("X-MAL-Service")))); + UShort operation = new UShort(Integer.parseInt(MALHttpHeaders.required("X-MAL-Operation", + client.getResponseHeader("X-MAL-Operation")))); + UOctet serviceVersion = new UOctet(Short.parseShort(MALHttpHeaders.required("X-MAL-Area-Version", + client.getResponseHeader("X-MAL-Area-Version")))); Boolean isErrorMessage = client.getResponseHeader("X-MAL-Is-Error-Message") .equalsIgnoreCase("true") ? Boolean.TRUE : Boolean.FALSE; diff --git a/transports/transport-http/src/main/java/esa/mo/mal/transport/http/receiving/HTTPContextHandlerNoEncoding.java b/transports/transport-http/src/main/java/esa/mo/mal/transport/http/receiving/HTTPContextHandlerNoEncoding.java index fdd8fa95..39085b6a 100644 --- a/transports/transport-http/src/main/java/esa/mo/mal/transport/http/receiving/HTTPContextHandlerNoEncoding.java +++ b/transports/transport-http/src/main/java/esa/mo/mal/transport/http/receiving/HTTPContextHandlerNoEncoding.java @@ -57,6 +57,13 @@ public HTTPContextHandlerNoEncoding(HTTPTransport transport) { this.transport = transport; } + @Override + public IContextHandler forRequest() { + // The body read in processRequest is held for finishHandling, so each + // request needs its own handler. + return new HTTPContextHandlerNoEncoding(transport); + } + @Override public void processRequest(IHttpRequest request) throws HttpApiImplException { data = request.readFullBody(); diff --git a/transports/transport-http/src/main/java/esa/mo/mal/transport/http/receiving/HTTPContextHandlerNoResponse.java b/transports/transport-http/src/main/java/esa/mo/mal/transport/http/receiving/HTTPContextHandlerNoResponse.java index 8105b529..05ab5d94 100644 --- a/transports/transport-http/src/main/java/esa/mo/mal/transport/http/receiving/HTTPContextHandlerNoResponse.java +++ b/transports/transport-http/src/main/java/esa/mo/mal/transport/http/receiving/HTTPContextHandlerNoResponse.java @@ -22,8 +22,10 @@ import esa.mo.mal.transport.http.HTTPTransport; import static esa.mo.mal.transport.http.HTTPTransport.RLOGGER; +import esa.mo.mal.transport.http.api.IContextHandler; import esa.mo.mal.transport.http.api.IHttpRequest; import esa.mo.mal.transport.http.util.HttpApiImplException; +import esa.mo.mal.transport.http.util.MALHttpHeaders; import esa.mo.mal.transport.http.util.SupplementsEncoder; import java.io.IOException; import java.text.ParseException; @@ -56,6 +58,13 @@ public HTTPContextHandlerNoResponse(HTTPTransport transport) { super(transport); } + @Override + public IContextHandler forRequest() { + // The decoded header and the body are held between the three calls, so + // each request needs its own handler. + return new HTTPContextHandlerNoResponse(transport); + } + @Override public void processRequest(IHttpRequest request) throws HttpApiImplException { String requestUrl = request.getRequestUrl(); @@ -87,7 +96,8 @@ public void processRequest(IHttpRequest request) throws HttpApiImplException { * @param uriFrom the URIfrom field * @return the GENMessageHeader corresponding to the HTTP headers */ - protected MALMessageHeader createMALHeaderFromHttp(IHttpRequest request, Identifier uriTo, Identifier uriFrom) { + protected MALMessageHeader createMALHeaderFromHttp(IHttpRequest request, + Identifier uriTo, Identifier uriFrom) throws HttpApiImplException { SimpleDateFormat TIMESTAMP_FORMAT = new SimpleDateFormat(HTTPTransport.TIMESTAMP_STRING_FORMAT); TIMESTAMP_FORMAT.setTimeZone(TimeZone.getTimeZone("UTC")); Identifier from = new Identifier(uriFrom.getValue()); @@ -104,18 +114,24 @@ protected MALMessageHeader createMALHeaderFromHttp(IHttpRequest request, Identif RLOGGER.severe(e.getMessage()); e.printStackTrace(); } - InteractionType interactionType = InteractionType.fromString(request.getRequestHeader("X-MAL-Interaction-Type")); + InteractionType interactionType = InteractionType.fromString(MALHttpHeaders.required( + "X-MAL-Interaction-Type", request.getRequestHeader("X-MAL-Interaction-Type"))); UOctet interactionStage = null; if (interactionType.getValue() != InteractionType.SEND_VALUE) { - interactionStage = new UOctet( - Short.parseShort(decodeAscii(request.getRequestHeader("X-MAL-Interaction-Stage")))); + interactionStage = new UOctet(Short.parseShort(MALHttpHeaders.required( + "X-MAL-Interaction-Stage", + decodeAscii(request.getRequestHeader("X-MAL-Interaction-Stage"))))); } - Long transactionId = Long.parseLong(decodeAscii(request.getRequestHeader("X-MAL-Transaction-Id"))); - UShort serviceArea = new UShort(Integer.parseInt(decodeAscii(request.getRequestHeader("X-MAL-Service-Area")))); - UShort service = new UShort(Integer.parseInt(decodeAscii(request.getRequestHeader("X-MAL-Service")))); - UShort operation = new UShort(Integer.parseInt(decodeAscii(request.getRequestHeader("X-MAL-Operation")))); - UOctet serviceVersion = new UOctet( - Short.parseShort(decodeAscii(request.getRequestHeader("X-MAL-Area-Version")))); + Long transactionId = Long.parseLong(MALHttpHeaders.required("X-MAL-Transaction-Id", + decodeAscii(request.getRequestHeader("X-MAL-Transaction-Id")))); + UShort serviceArea = new UShort(Integer.parseInt(MALHttpHeaders.required("X-MAL-Service-Area", + decodeAscii(request.getRequestHeader("X-MAL-Service-Area"))))); + UShort service = new UShort(Integer.parseInt(MALHttpHeaders.required("X-MAL-Service", + decodeAscii(request.getRequestHeader("X-MAL-Service"))))); + UShort operation = new UShort(Integer.parseInt(MALHttpHeaders.required("X-MAL-Operation", + decodeAscii(request.getRequestHeader("X-MAL-Operation"))))); + UOctet serviceVersion = new UOctet(Short.parseShort(MALHttpHeaders.required("X-MAL-Area-Version", + decodeAscii(request.getRequestHeader("X-MAL-Area-Version"))))); Boolean isErrorMessage = request.getRequestHeader("X-MAL-Is-Error-Message") .equalsIgnoreCase("true") ? Boolean.TRUE : Boolean.FALSE; diff --git a/transports/transport-http/src/main/java/esa/mo/mal/transport/http/receiving/HTTPContextHandlerRequestResponse.java b/transports/transport-http/src/main/java/esa/mo/mal/transport/http/receiving/HTTPContextHandlerRequestResponse.java index 2f271bd0..ef42313f 100644 --- a/transports/transport-http/src/main/java/esa/mo/mal/transport/http/receiving/HTTPContextHandlerRequestResponse.java +++ b/transports/transport-http/src/main/java/esa/mo/mal/transport/http/receiving/HTTPContextHandlerRequestResponse.java @@ -20,6 +20,7 @@ */ package esa.mo.mal.transport.http.receiving; +import esa.mo.mal.transport.http.api.IContextHandler; import esa.mo.mal.transport.http.api.IHttpResponse; import esa.mo.mal.transport.http.HTTPTransport; import esa.mo.mal.transport.http.util.HttpApiImplException; @@ -40,6 +41,13 @@ public HTTPContextHandlerRequestResponse(HTTPTransport transport) { super(transport); } + @Override + public IContextHandler forRequest() { + // processResponse decides what to answer from the header decoded in + // processRequest, so each request needs its own handler. + return new HTTPContextHandlerRequestResponse(transport); + } + @Override public void processResponse(IHttpResponse response) throws HttpApiImplException { if (HTTPTransport.messageHasEmtpyHttpResponse(malMessageHeader)) { diff --git a/transports/transport-http/src/main/java/esa/mo/mal/transport/http/util/MALHttpHeaders.java b/transports/transport-http/src/main/java/esa/mo/mal/transport/http/util/MALHttpHeaders.java new file mode 100644 index 00000000..eb176e69 --- /dev/null +++ b/transports/transport-http/src/main/java/esa/mo/mal/transport/http/util/MALHttpHeaders.java @@ -0,0 +1,55 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2024 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO Transport - HTTP + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.mal.transport.http.util; + +/** + * Helpers for reading the MAL header fields carried over HTTP headers. + */ +public abstract class MALHttpHeaders { + + private MALHttpHeaders() { + } + + /** + * Returns the value of a header that the MAL HTTP binding requires, and + * fails with the name of the header when it carries no value. + * + * Without this the absence of a header surfaces further down as whatever + * the parser of that particular field happens to throw, such as an unknown + * enumeration or an unparsable number, naming neither the header nor the + * message it came with. + * + * @param headerName The name of the header. + * @param headerValue The value read for it, possibly null or empty. + * @return The value of the header. + * @throws HttpApiImplException if the header carries no value. + */ + public static String required(final String headerName, final String headerValue) + throws HttpApiImplException { + if (headerValue == null || headerValue.isEmpty()) { + throw new HttpApiImplException("The MAL message cannot be decoded because the " + + headerName + " header carries no value. Either it was not sent, or the " + + "message is not a MAL message.", null); + } + + return headerValue; + } +} diff --git a/transports/transport-http/src/test/java/esa/mo/mal/transport/http/receiving/HTTPMessageHandlerNoResponse.java b/transports/transport-http/src/test/java/esa/mo/mal/transport/http/receiving/HTTPMessageHandlerNoResponse.java index 1cba52c7..addb2c23 100644 --- a/transports/transport-http/src/test/java/esa/mo/mal/transport/http/receiving/HTTPMessageHandlerNoResponse.java +++ b/transports/transport-http/src/test/java/esa/mo/mal/transport/http/receiving/HTTPMessageHandlerNoResponse.java @@ -48,7 +48,7 @@ public void setUp() throws Exception { } @Test - public void testSupplementsHeader() { + public void testSupplementsHeader() throws Exception { IdentifierList domain = new IdentifierList(); domain.add(new Identifier("domain")); From 89e3247071f0f33dcd4e8cad6ff146a90f3ca4fc Mon Sep 17 00:00:00 2001 From: Cesar Coelho Date: Sat, 1 Aug 2026 17:28:48 +0200 Subject: [PATCH 25/45] Drop the subscriptions of a consumer as soon as it disconnects The transport noticed a consumer closing its connection and tore down its side of it, but told the MAL nothing. A broker therefore kept every subscription that consumer had made, and only learnt of the loss one subscription at a time, each after a NOTIFY had failed to reach a consumer that was no longer there. Every one of them cost a failed delivery, a reconnection attempt by the transport, and a pair of warnings. Report the loss instead. MALMessageListener gains a method for it, with a body that does nothing, so that listeners which hold no state per peer, and listeners outside this repository, are unaffected. The transport calls it from closeConnection, which is where every transport in this repository ends up when a connection goes, whether it was closed cleanly or lost to an error. The peer is named by the prefix its endpoint URIs share, ending at the delimiter, so that a peer on port 1025 is not mistaken for one on port 10250. Co-Authored-By: Claude Opus 5 --- .../mo/mal/transport/MALMessageListener.java | 21 ++ .../java/esa/mo/mal/impl/MALReceiver.java | 16 ++ .../mal/impl/broker/MALBrokerHandlerImpl.java | 90 ++++++-- .../impl/broker/MALBrokerHandlerImplTest.java | 210 ++++++++++++++++++ .../esa/mo/mal/transport/gen/Endpoint.java | 15 ++ .../mal/transport/gen/EndpointRegistry.java | 13 ++ .../esa/mo/mal/transport/gen/Transport.java | 25 +++ 7 files changed, 366 insertions(+), 24 deletions(-) create mode 100644 mal-impl/src/test/java/esa/mo/mal/impl/broker/MALBrokerHandlerImplTest.java diff --git a/apis/api-area001-v003-mal/src/main/java/org/ccsds/moims/mo/mal/transport/MALMessageListener.java b/apis/api-area001-v003-mal/src/main/java/org/ccsds/moims/mo/mal/transport/MALMessageListener.java index 1c2c73b0..b85ba9c2 100644 --- a/apis/api-area001-v003-mal/src/main/java/org/ccsds/moims/mo/mal/transport/MALMessageListener.java +++ b/apis/api-area001-v003-mal/src/main/java/org/ccsds/moims/mo/mal/transport/MALMessageListener.java @@ -52,4 +52,25 @@ public interface MALMessageListener extends MALTransmitErrorListener { * @param err Error to be received by the listener */ void onInternalError(MALEndpoint callingEndpoint, Throwable err); + + /** + * The method reports that the transport has lost the connection to a remote + * peer, so that the MAL layer can release the state it was holding for it + * rather than discovering the loss one failed message at a time. + * + * The peer is identified by the prefix that its endpoint URIs share, which + * is the part of the URI that addresses the peer itself rather than an + * endpoint within it, terminated by the delimiter that separates the two. A + * URI belongs to the peer that was lost if, and only if, it starts with + * that prefix. + * + * Listeners that hold no state per peer do not need to do anything, which + * is why this method does nothing by default. + * + * @param callingEndpoint MALEndpoint calling the MALMessageListener + * @param remoteUriPrefix The prefix shared by the URIs of the lost peer + */ + default void onConnectionLost(MALEndpoint callingEndpoint, String remoteUriPrefix) { + // Nothing by default: only listeners that keep state per peer care. + } } diff --git a/mal-impl/src/main/java/esa/mo/mal/impl/MALReceiver.java b/mal-impl/src/main/java/esa/mo/mal/impl/MALReceiver.java index daef0fed..feeeb96d 100644 --- a/mal-impl/src/main/java/esa/mo/mal/impl/MALReceiver.java +++ b/mal-impl/src/main/java/esa/mo/mal/impl/MALReceiver.java @@ -21,6 +21,8 @@ package esa.mo.mal.impl; import esa.mo.mal.impl.broker.MALBrokerBindingImpl; +import esa.mo.mal.impl.broker.MALBrokerHandlerImpl; +import org.ccsds.moims.mo.mal.broker.MALBrokerHandler; import esa.mo.mal.impl.interactionpatterns.InvokeIPProviderHandler; import esa.mo.mal.impl.interactionpatterns.ProgressIPProviderHandler; import esa.mo.mal.impl.interactionpatterns.PubSubIPProviderHandler; @@ -86,6 +88,20 @@ public void onTransmitError(final MALEndpoint callingEndpoint, consumersMap.handleError(srcMessageHeader, err, qosMap); } + @Override + public void onConnectionLost(final MALEndpoint callingEndpoint, final String remoteUriPrefix) { + // A consumer that is gone cannot be notified, so let the brokers drop + // the subscriptions they are still holding on its behalf. Otherwise + // each one is only dropped after a NOTIFY has failed to reach it. + for (MALBrokerBindingImpl binding : brokers.values()) { + MALBrokerHandler handler = binding.getBrokerImpl().getHandler(); + + if (handler instanceof MALBrokerHandlerImpl) { + ((MALBrokerHandlerImpl) handler).removeConsumerSubscriptions(remoteUriPrefix); + } + } + } + @Override public void onMessages(final MALEndpoint callingEndpoint, final MALMessage[] msgList) { for (MALMessage msgList1 : msgList) { diff --git a/mal-impl/src/main/java/esa/mo/mal/impl/broker/MALBrokerHandlerImpl.java b/mal-impl/src/main/java/esa/mo/mal/impl/broker/MALBrokerHandlerImpl.java index 15f74e1d..0340d7fc 100644 --- a/mal-impl/src/main/java/esa/mo/mal/impl/broker/MALBrokerHandlerImpl.java +++ b/mal-impl/src/main/java/esa/mo/mal/impl/broker/MALBrokerHandlerImpl.java @@ -39,21 +39,8 @@ import org.ccsds.moims.mo.mal.broker.MALBrokerBinding; import org.ccsds.moims.mo.mal.broker.MALBrokerHandler; import org.ccsds.moims.mo.mal.provider.MALInteraction; -import org.ccsds.moims.mo.mal.structures.Attribute; -import org.ccsds.moims.mo.mal.structures.Identifier; -import org.ccsds.moims.mo.mal.structures.IdentifierList; -import org.ccsds.moims.mo.mal.structures.NamedValue; -import org.ccsds.moims.mo.mal.structures.NamedValueList; -import org.ccsds.moims.mo.mal.structures.NullableAttributeList; -import org.ccsds.moims.mo.mal.structures.Subscription; -import org.ccsds.moims.mo.mal.structures.URI; -import org.ccsds.moims.mo.mal.structures.UpdateHeader; -import org.ccsds.moims.mo.mal.transport.MALDeregisterBody; -import org.ccsds.moims.mo.mal.transport.MALMessageHeader; -import org.ccsds.moims.mo.mal.transport.MALPublishBody; -import org.ccsds.moims.mo.mal.transport.MALPublishRegisterBody; -import org.ccsds.moims.mo.mal.transport.MALRegisterBody; -import org.ccsds.moims.mo.mal.transport.MALTransmitErrorException; +import org.ccsds.moims.mo.mal.structures.*; +import org.ccsds.moims.mo.mal.transport.*; /** * Base implementation of the MALBrokerHandler class that should be extended by @@ -287,6 +274,20 @@ private synchronized void report(final String key) { } } + /** + * Returns true if subscriptions are still held for a consumer on a broker. + * Package private, for the tests in this package. + * + * @param brokerKey The URI of the broker. + * @param consumerURI The URI of the consumer. + * @return True if subscriptions are held for that consumer. + */ + synchronized boolean hasSubscriptions(final String brokerKey, final String consumerURI) { + final Map subs = consumers.get(brokerKey); + + return subs != null && subs.containsKey(consumerURI); + } + private Map getConsumerSubscriptions(final String brokerKey) { Map subs = consumers.get(brokerKey); @@ -353,17 +354,58 @@ private void handleConsumerCommunicationError(final String brokerKey, final Stri } } + /** + * Removes every subscription held on behalf of the consumers of a peer that + * the transport reports as gone. + * + * Without this the subscriptions are only dropped one at a time, each after + * a NOTIFY has failed to reach a consumer that is no longer there. + * + * @param remoteUriPrefix The prefix shared by the URIs of the lost peer. + */ + public synchronized void removeConsumerSubscriptions(final String remoteUriPrefix) { + if (remoteUriPrefix == null) { + return; + } + + // Collected first, because deregistering removes entries from the very + // maps that are being walked. + final List lost = new LinkedList<>(); + + for (Map.Entry> broker : consumers.entrySet()) { + for (String consumerURI : broker.getValue().keySet()) { + if (consumerURI.startsWith(remoteUriPrefix)) { + lost.add(new String[]{broker.getKey(), consumerURI}); + } + } + } + + for (String[] entry : lost) { + final String brokerKey = entry[0]; + final String consumerURI = entry[1]; + final SubscriptionSource subSource = getConsumerSubscriptions(brokerKey).get(consumerURI); + + if (subSource != null) { + MALBrokerImpl.LOGGER.log(Level.FINE, + "Removing the Subscriptions of a Consumer that is gone: {0}", consumerURI); + internalDeregisterSubscriptions(brokerKey, subSource, null); + } + } + } + private void internalDeregisterSubscriptions(final String brokerKey, final SubscriptionSource subSource, final IdentifierList subscriptionIds) { - if (subSource != null) { - subSource.removeSubscriptions(subscriptionIds); - if (!subSource.active()) { - Map subs = getConsumerSubscriptions(brokerKey); - subs.remove(subSource.getSignature()); - - if (subs.isEmpty()) { - consumers.remove(brokerKey); - } + if (subSource == null) { + return; + } + + subSource.removeSubscriptions(subscriptionIds); + if (!subSource.active()) { + Map subs = getConsumerSubscriptions(brokerKey); + subs.remove(subSource.getSignature()); + + if (subs.isEmpty()) { + consumers.remove(brokerKey); } } } diff --git a/mal-impl/src/test/java/esa/mo/mal/impl/broker/MALBrokerHandlerImplTest.java b/mal-impl/src/test/java/esa/mo/mal/impl/broker/MALBrokerHandlerImplTest.java new file mode 100644 index 00000000..b4f21e46 --- /dev/null +++ b/mal-impl/src/test/java/esa/mo/mal/impl/broker/MALBrokerHandlerImplTest.java @@ -0,0 +1,210 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2024 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO MAL Java Implementation + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.mal.impl.broker; + +import java.util.Map; +import org.ccsds.moims.mo.mal.MALException; +import org.ccsds.moims.mo.mal.MALOperation; +import org.ccsds.moims.mo.mal.provider.MALInteraction; +import org.ccsds.moims.mo.mal.structures.Blob; +import org.ccsds.moims.mo.mal.structures.Identifier; +import org.ccsds.moims.mo.mal.structures.InteractionType; +import org.ccsds.moims.mo.mal.structures.NamedValueList; +import org.ccsds.moims.mo.mal.structures.Subscription; +import org.ccsds.moims.mo.mal.structures.Time; +import org.ccsds.moims.mo.mal.structures.UOctet; +import org.ccsds.moims.mo.mal.structures.UShort; +import org.ccsds.moims.mo.mal.transport.MALMessageHeader; +import org.ccsds.moims.mo.mal.transport.MALRegisterBody; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import org.junit.Test; + +/** + * Tests the removal of the subscriptions of consumers that the transport + * reports as gone. + */ +public class MALBrokerHandlerImplTest { + + private static final String BROKER_URI = "maltcp://10.0.0.1:1024/broker"; + + /** + * A consumer that disconnects has all of its subscriptions removed, not + * just the one that happens to be published to next. + */ + @Test + public void testLostConsumerLosesEveryOneOfItsSubscriptions() throws Exception { + MALBrokerHandlerImpl handler = new MALBrokerHandlerImpl(); + + register(handler, "maltcp://10.0.0.1:1025/896229975", "SUB-A"); + register(handler, "maltcp://10.0.0.1:1025/672864643", "SUB-B"); + + assertTrue(isRegistered(handler, "maltcp://10.0.0.1:1025/896229975")); + assertTrue(isRegistered(handler, "maltcp://10.0.0.1:1025/672864643")); + + handler.removeConsumerSubscriptions("maltcp://10.0.0.1:1025/"); + + assertFalse(isRegistered(handler, "maltcp://10.0.0.1:1025/896229975")); + assertFalse(isRegistered(handler, "maltcp://10.0.0.1:1025/672864643")); + } + + /** + * The consumers of a peer that is still connected are left alone. + */ + @Test + public void testOtherConsumersAreKept() throws Exception { + MALBrokerHandlerImpl handler = new MALBrokerHandlerImpl(); + + register(handler, "maltcp://10.0.0.1:1025/896229975", "SUB-A"); + register(handler, "maltcp://10.0.0.1:2048/111111111", "SUB-B"); + + handler.removeConsumerSubscriptions("maltcp://10.0.0.1:1025/"); + + assertFalse(isRegistered(handler, "maltcp://10.0.0.1:1025/896229975")); + assertTrue(isRegistered(handler, "maltcp://10.0.0.1:2048/111111111")); + } + + /** + * A peer on port 10250 is not a peer on port 1025, even though one URI + * starts with the other. This is why the prefix carries the delimiter. + */ + @Test + public void testPeerOnALongerPortIsNotMatched() throws Exception { + MALBrokerHandlerImpl handler = new MALBrokerHandlerImpl(); + + register(handler, "maltcp://10.0.0.1:1025/896229975", "SUB-A"); + register(handler, "maltcp://10.0.0.1:10250/222222222", "SUB-B"); + + handler.removeConsumerSubscriptions("maltcp://10.0.0.1:1025/"); + + assertFalse(isRegistered(handler, "maltcp://10.0.0.1:1025/896229975")); + assertTrue(isRegistered(handler, "maltcp://10.0.0.1:10250/222222222")); + } + + /** + * A prefix that matches nothing, and a null one, are harmless. + */ + @Test + public void testUnknownAndNullPrefixesAreHarmless() throws Exception { + MALBrokerHandlerImpl handler = new MALBrokerHandlerImpl(); + + register(handler, "maltcp://10.0.0.1:1025/896229975", "SUB-A"); + + handler.removeConsumerSubscriptions("maltcp://10.0.0.1:9999/"); + handler.removeConsumerSubscriptions(null); + + assertTrue(isRegistered(handler, "maltcp://10.0.0.1:1025/896229975")); + } + + /** + * Registers a subscription for a consumer against the broker. + */ + private void register(MALBrokerHandlerImpl handler, + String consumerURI, String subscriptionId) throws Exception { + MALMessageHeader header = new MALMessageHeader( + new Identifier(consumerURI), + new Blob("".getBytes()), + new Identifier(BROKER_URI), + Time.now(), + InteractionType.PUBSUB, + new UOctet((short) 1), + 0L, + new UShort(1), + new UShort(1), + new UShort(1), + new UOctet((short) 1), + Boolean.FALSE, + new NamedValueList()); + + handler.handleRegister(new InteractionStub(header), + new RegisterBodyStub(new Subscription(new Identifier(subscriptionId)))); + } + + /** + * Returns true if the broker still holds subscriptions for a consumer. + */ + private boolean isRegistered(MALBrokerHandlerImpl handler, String consumerURI) { + return handler.hasSubscriptions(BROKER_URI, consumerURI); + } + + /** + * The smallest MALInteraction that handleRegister needs. + */ + private static final class InteractionStub implements MALInteraction { + + private final MALMessageHeader header; + + InteractionStub(MALMessageHeader header) { + this.header = header; + } + + @Override + public MALMessageHeader getMessageHeader() { + return header; + } + + @Override + public MALOperation getOperation() { + return null; + } + + @Override + public void setQoSProperty(String name, Object value) { + } + + @Override + public Object getQoSProperty(String name) { + return null; + } + + @Override + public Map getQoSProperties() { + return null; + } + } + + /** + * The smallest MALRegisterBody that handleRegister needs. + */ + private static final class RegisterBodyStub implements MALRegisterBody { + + private final Subscription subscription; + + RegisterBodyStub(Subscription subscription) { + this.subscription = subscription; + } + + @Override + public Subscription getSubscription() { + return subscription; + } + + @Override + public int getElementCount() { + return 1; + } + + @Override + public Object getBodyElement(int index, Object element) throws MALException { + return subscription; + } + } +} diff --git a/transports/transport-generic/src/main/java/esa/mo/mal/transport/gen/Endpoint.java b/transports/transport-generic/src/main/java/esa/mo/mal/transport/gen/Endpoint.java index 2d1e25d6..c228d461 100644 --- a/transports/transport-generic/src/main/java/esa/mo/mal/transport/gen/Endpoint.java +++ b/transports/transport-generic/src/main/java/esa/mo/mal/transport/gen/Endpoint.java @@ -167,6 +167,21 @@ public void setMessageListener(final MALMessageListener list) throws MALExceptio this.messageListener = list; } + /** + * Callback method when the transport has lost the connection to a remote + * peer, passed on to the listener so that it can release the state it holds + * for that peer. + * + * @param remoteUriPrefix The prefix shared by the URIs of the lost peer. + */ + public void connectionLost(final String remoteUriPrefix) { + MALMessageListener listener = this.messageListener; + + if (listener != null) { + listener.onConnectionLost(this, remoteUriPrefix); + } + } + /** * Callback method when a message is received for this endpoint. * diff --git a/transports/transport-generic/src/main/java/esa/mo/mal/transport/gen/EndpointRegistry.java b/transports/transport-generic/src/main/java/esa/mo/mal/transport/gen/EndpointRegistry.java index acffe651..8f7980c4 100644 --- a/transports/transport-generic/src/main/java/esa/mo/mal/transport/gen/EndpointRegistry.java +++ b/transports/transport-generic/src/main/java/esa/mo/mal/transport/gen/EndpointRegistry.java @@ -20,6 +20,8 @@ */ package esa.mo.mal.transport.gen; +import java.util.ArrayList; +import java.util.Collection; import java.util.HashMap; import java.util.Map; import org.ccsds.moims.mo.mal.MALException; @@ -115,6 +117,17 @@ public Endpoint any() { return null; } + /** + * Returns every registered endpoint. + * + * @return The registered endpoints. + */ + public Collection all() { + // A copy: the caller walks this while a disconnect may be registering + // or removing endpoints, and the maps here are not synchronised. + return new ArrayList<>(endpointMalMap.values()); + } + /** * Closes every registered endpoint and empties the registry. * diff --git a/transports/transport-generic/src/main/java/esa/mo/mal/transport/gen/Transport.java b/transports/transport-generic/src/main/java/esa/mo/mal/transport/gen/Transport.java index ade90c9c..c63704ff 100644 --- a/transports/transport-generic/src/main/java/esa/mo/mal/transport/gen/Transport.java +++ b/transports/transport-generic/src/main/java/esa/mo/mal/transport/gen/Transport.java @@ -355,6 +355,7 @@ public void closeConnection(final String uriTo, final ReceptionHandler reception if (localUriTo != null) { outgoingDataChannelsManager.closeConnection(localUriTo); + notifyConnectionLost(localUriTo); } if (receptionHandler != null) { @@ -362,6 +363,30 @@ public void closeConnection(final String uriTo, final ReceptionHandler reception } } + /** + * Tells the MAL layer that a remote peer is gone, so that it can release + * the state it holds for it, such as the subscriptions a broker is still + * holding on behalf of a consumer that disconnected. Without this the loss + * is only discovered one failed message at a time. + * + * @param remoteRootURI The root URI of the peer that was lost. + */ + protected void notifyConnectionLost(final String remoteRootURI) { + // The endpoints of the peer all start with its root URI followed by the + // service delimiter. Comparing against the delimiter too keeps a peer + // on port 1025 from matching one on port 10250. + String prefix = remoteRootURI + addressing.getServiceDelim(); + + for (Endpoint endpoint : endpoints.all()) { + try { + endpoint.connectionLost(prefix); + } catch (Throwable ex) { + LOGGER.log(Level.WARNING, + "Error informing the endpoint that a connection was lost", ex); + } + } + } + /** * Used to inform the transport about communication problems with clients. * In this case the transport will terminate all communication channels with From 7840a1724a134af4ceea695ebcf45efa5c7d8bb4 Mon Sep 17 00:00:00 2001 From: Cesar Coelho Date: Sat, 1 Aug 2026 19:20:45 +0200 Subject: [PATCH 26/45] Remove the leftover element factories of the malspp testbed LargeEnumerationFactory and MediumEnumerationFactory are left over from an earlier design, where an element was registered through a factory of its own. They extend MALElementsRegistry and declare a createElement() that takes no argument, so they override nothing on it, and nothing refers to either of them. They were also the only classes extending MALElementsRegistry, so removing them leaves it free to change. Co-Authored-By: Claude Opus 5 --- .../datatype/LargeEnumerationFactory.java | 40 ------------------- .../datatype/MediumEnumerationFactory.java | 40 ------------------- 2 files changed, 80 deletions(-) delete mode 100644 testbeds/testbed-malspp-framework/src/main/java/org/ccsds/moims/mo/malspp/test/datatype/LargeEnumerationFactory.java delete mode 100644 testbeds/testbed-malspp-framework/src/main/java/org/ccsds/moims/mo/malspp/test/datatype/MediumEnumerationFactory.java diff --git a/testbeds/testbed-malspp-framework/src/main/java/org/ccsds/moims/mo/malspp/test/datatype/LargeEnumerationFactory.java b/testbeds/testbed-malspp-framework/src/main/java/org/ccsds/moims/mo/malspp/test/datatype/LargeEnumerationFactory.java deleted file mode 100644 index 99b425a2..00000000 --- a/testbeds/testbed-malspp-framework/src/main/java/org/ccsds/moims/mo/malspp/test/datatype/LargeEnumerationFactory.java +++ /dev/null @@ -1,40 +0,0 @@ -/** ***************************************************************************** - * Copyright or © or Copr. CNES - * - * This software is a computer program whose purpose is to provide a - * framework for the CCSDS Mission Operations services. - * - * This software is governed by the CeCILL-C license under French law and - * abiding by the rules of distribution of free software. You can use, - * modify and/ or redistribute the software under the terms of the CeCILL-C - * license as circulated by CEA, CNRS and INRIA at the following URL - * "http://www.cecill.info". - * - * As a counterpart to the access to the source code and rights to copy, - * modify and redistribute granted by the license, users are provided only - * with a limited warranty and the software's author, the holder of the - * economic rights, and the successive licensors have only limited - * liability. - * - * In this respect, the user's attention is drawn to the risks associated - * with loading, using, modifying and/or developing or reproducing the - * software by the user in light of its specific status of free software, - * that may mean that it is complicated to manipulate, and that also - * therefore means that it is reserved for developers and experienced - * professionals having in-depth computer knowledge. Users are therefore - * encouraged to load and test the software's suitability as regards their - * requirements in conditions enabling the security of their systems and/or - * data to be ensured and, more generally, to use and operate it in the - * same conditions as regards security. - * - * The fact that you are presently reading this means that you have had - * knowledge of the CeCILL-C license and that you accept its terms. - ****************************************************************************** */ -package org.ccsds.moims.mo.malspp.test.datatype; - -public final class LargeEnumerationFactory extends org.ccsds.moims.mo.mal.MALElementsRegistry { - - public org.ccsds.moims.mo.mal.structures.Element createElement() { - return new LargeEnumeration(0); - } -} diff --git a/testbeds/testbed-malspp-framework/src/main/java/org/ccsds/moims/mo/malspp/test/datatype/MediumEnumerationFactory.java b/testbeds/testbed-malspp-framework/src/main/java/org/ccsds/moims/mo/malspp/test/datatype/MediumEnumerationFactory.java deleted file mode 100644 index aeae4afe..00000000 --- a/testbeds/testbed-malspp-framework/src/main/java/org/ccsds/moims/mo/malspp/test/datatype/MediumEnumerationFactory.java +++ /dev/null @@ -1,40 +0,0 @@ -/** ***************************************************************************** - * Copyright or © or Copr. CNES - * - * This software is a computer program whose purpose is to provide a - * framework for the CCSDS Mission Operations services. - * - * This software is governed by the CeCILL-C license under French law and - * abiding by the rules of distribution of free software. You can use, - * modify and/ or redistribute the software under the terms of the CeCILL-C - * license as circulated by CEA, CNRS and INRIA at the following URL - * "http://www.cecill.info". - * - * As a counterpart to the access to the source code and rights to copy, - * modify and redistribute granted by the license, users are provided only - * with a limited warranty and the software's author, the holder of the - * economic rights, and the successive licensors have only limited - * liability. - * - * In this respect, the user's attention is drawn to the risks associated - * with loading, using, modifying and/or developing or reproducing the - * software by the user in light of its specific status of free software, - * that may mean that it is complicated to manipulate, and that also - * therefore means that it is reserved for developers and experienced - * professionals having in-depth computer knowledge. Users are therefore - * encouraged to load and test the software's suitability as regards their - * requirements in conditions enabling the security of their systems and/or - * data to be ensured and, more generally, to use and operate it in the - * same conditions as regards security. - * - * The fact that you are presently reading this means that you have had - * knowledge of the CeCILL-C license and that you accept its terms. - ****************************************************************************** */ -package org.ccsds.moims.mo.malspp.test.datatype; - -public final class MediumEnumerationFactory extends org.ccsds.moims.mo.mal.MALElementsRegistry { - - public org.ccsds.moims.mo.mal.structures.Element createElement() { - return new MediumEnumeration(0); - } -} From 7a387dbd8a70d087a48c8c3d3170b9c66df0643f Mon Sep 17 00:00:00 2001 From: Cesar Coelho Date: Sun, 2 Aug 2026 18:00:24 +0200 Subject: [PATCH 27/45] Create the Elements of an Area on demand instead of holding one of each Every Area held a live instance of each of its types, only so that createElement() could be called on it to make a copy. That meant the class of every type was loaded as soon as the Area was, whether or not a deployment ever exchanged that type. The generator now writes an ElementFactory for each Area, which switches on the service number and then on the type number, so a class is loaded only once a message carries that type. The element arrays of the Areas and Services are left empty. The type numbers of an Area are handed out from 1 upwards, so the switch takes the widest band that starts at 1 and still compiles to a jump table. What lies past that band goes to a second method. Where those numbers lie far from zero, each side of zero is switched on its own: together they would have to span the whole way across zero and would fall back to a binary search. On a Raspberry Pi the Areas now load in 411 ms rather than 1199 ms. MALElementsRegistry no longer keeps a map of live Elements, so addElement(), removeCallableElement() and howMany() are gone with it. More than one factory can be registered for the same Area, which is how the MAL/SPP testbed reaches its two hand written enumerations: their type numbers are past what the XML schema allows, so no generated factory can know about them. Co-Authored-By: Claude Opus 5 --- api-generator/generator-java/pom.xml | 5 + .../esa/mo/tools/stubgen/GeneratorLangs.java | 5 + .../stubgen/java/JavaElementFactory.java | 429 ++++++++++++++++++ .../mo/tools/stubgen/java/JavaHelpers.java | 9 +- .../tools/stubgen/java/JavaServiceInfo.java | 6 +- .../stubgen/java/TestJavaElementFactory.java | 241 ++++++++++ .../moims/mo/mal/AreaElementFactory.java | 61 +++ .../java/org/ccsds/moims/mo/mal/MALArea.java | 28 ++ .../moims/mo/mal/MALElementsRegistry.java | 131 +++--- .../java/org/ccsds/moims/mo/mal/TypeId.java | 56 ++- .../moims/mo/mal/TestAreaElementFactory.java | 176 +++++++ .../datatype/HandWrittenElementFactory.java | 65 +++ .../mo/malspp/test/util/BufferReader.java | 10 +- 13 files changed, 1155 insertions(+), 67 deletions(-) create mode 100644 api-generator/generator-java/src/main/java/esa/mo/tools/stubgen/java/JavaElementFactory.java create mode 100644 api-generator/generator-java/src/test/java/esa/mo/tools/stubgen/java/TestJavaElementFactory.java create mode 100644 apis/api-area001-v003-mal/src/main/java/org/ccsds/moims/mo/mal/AreaElementFactory.java create mode 100644 apis/api-area001-v003-mal/src/test/java/org/ccsds/moims/mo/mal/TestAreaElementFactory.java create mode 100644 testbeds/testbed-malspp-framework/src/main/java/org/ccsds/moims/mo/malspp/test/datatype/HandWrittenElementFactory.java diff --git a/api-generator/generator-java/pom.xml b/api-generator/generator-java/pom.xml index cacc1997..33e9a832 100644 --- a/api-generator/generator-java/pom.xml +++ b/api-generator/generator-java/pom.xml @@ -80,6 +80,11 @@ com.sun.xml.bind jaxb-impl
+ + junit + junit + test + diff --git a/api-generator/generator-java/src/main/java/esa/mo/tools/stubgen/GeneratorLangs.java b/api-generator/generator-java/src/main/java/esa/mo/tools/stubgen/GeneratorLangs.java index b01ccb0b..cb0a7984 100644 --- a/api-generator/generator-java/src/main/java/esa/mo/tools/stubgen/GeneratorLangs.java +++ b/api-generator/generator-java/src/main/java/esa/mo/tools/stubgen/GeneratorLangs.java @@ -21,6 +21,7 @@ package esa.mo.tools.stubgen; import esa.mo.tools.stubgen.java.JavaCompositeClass; +import esa.mo.tools.stubgen.java.JavaElementFactory; import esa.mo.tools.stubgen.java.JavaServiceInfo; import esa.mo.tools.stubgen.java.JavaExceptions; import esa.mo.tools.stubgen.java.JavaConsumer; @@ -354,6 +355,10 @@ public void run() { logger.info(" > Creating Area Helper class: " + area.getName()); helper.createAreaHelperClass(areaFolder, area); + logger.info(" > Creating Area Element Factory class: " + area.getName()); + JavaElementFactory elementFactory = new JavaElementFactory(this, typeInformation); + elementFactory.createAreaElementFactoryClass(areaFolder, area); + // Create Area Exceptions JavaExceptions exceptions = new JavaExceptions(this); logger.info(" > Creating Area Exceptions for area: " + area.getName()); diff --git a/api-generator/generator-java/src/main/java/esa/mo/tools/stubgen/java/JavaElementFactory.java b/api-generator/generator-java/src/main/java/esa/mo/tools/stubgen/java/JavaElementFactory.java new file mode 100644 index 00000000..9cb5117b --- /dev/null +++ b/api-generator/generator-java/src/main/java/esa/mo/tools/stubgen/java/JavaElementFactory.java @@ -0,0 +1,429 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2022 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO Service Stub Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.tools.stubgen.java; + +import esa.mo.tools.stubgen.GeneratorLangs; +import esa.mo.tools.stubgen.MOTypeInformation; +import esa.mo.tools.stubgen.specification.AttributeTypeDetails; +import esa.mo.tools.stubgen.specification.CompositeField; +import esa.mo.tools.stubgen.specification.StdStrings; +import esa.mo.tools.stubgen.specification.TypeUtils; +import esa.mo.tools.stubgen.writers.ClassWriter; +import esa.mo.tools.stubgen.writers.MethodWriter; +import esa.mo.xsd.AreaType; +import esa.mo.xsd.AttributeType; +import esa.mo.xsd.CompositeType; +import esa.mo.xsd.EnumerationType; +import esa.mo.xsd.ServiceType; +import java.io.File; +import java.io.IOException; +import java.util.Arrays; +import java.util.Collection; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.SortedSet; +import java.util.TreeMap; +import java.util.TreeSet; + +/** + * Generates the factory that creates the Elements of an area. + * + * The factory switches on the service number and then on the type number, so + * that the class of a type is only loaded once a message carries that type. + * The type numbers of an area are handed out from 1 upwards, so a switch over + * the band that starts at 1 compiles to a jump table. Where an area also + * declares numbers far above that band, they are moved to a second method, + * which keeps the jump table of the first one from being stretched to span the + * gap between them. + */ +public class JavaElementFactory { + + private final GeneratorLangs generator; + + private final MOTypeInformation typeInformation; + + public JavaElementFactory(GeneratorLangs generator, MOTypeInformation typeInformation) { + this.generator = generator; + this.typeInformation = typeInformation; + } + + /** + * Collects the types of a set of data types, as pairs of type number and + * the expression that creates one. A list type takes the negative of the + * type number of the type it holds. + * + * @param areaName The name of the area the types belong to. + * @param serviceName The name of the service, or null for area level types. + * @param dataTypes The declared data types. + * @return The pairs, in declaration order. + */ + List collectTypes(String areaName, String serviceName, List dataTypes) { + List types = new LinkedList<>(); + + for (Object oType : dataTypes) { + String name; + int number; + + if (oType instanceof AttributeType) { + AttributeType dt = (AttributeType) oType; + AttributeTypeDetails details = typeInformation.getAttributeDetails(areaName, dt.getName()); + number = dt.getShortFormPart(); + name = dt.getName(); + + // A native attribute is carried by a Union rather than by a class of its own + String created = details.isNativeType() + ? typeInformation.createElementType(StdStrings.MAL, null, StdStrings.UNION) + + "(" + details.getDefaultValue() + ")" + : typeInformation.createElementType(areaName, serviceName, dt.getName()) + "()"; + types.add(new String[]{String.valueOf(number), "new " + created}); + types.add(new String[]{String.valueOf(-number), + "new " + typeInformation.createElementType(areaName, serviceName, name + "List") + "()"}); + continue; + } else if (oType instanceof CompositeType) { + CompositeType dt = (CompositeType) oType; + + if (dt.getShortFormPart() == null) { + continue; // Abstract: it is never created + } + + number = dt.getShortFormPart(); + name = dt.getName(); + } else if (oType instanceof EnumerationType) { + EnumerationType dt = (EnumerationType) oType; + number = dt.getShortFormPart(); + name = dt.getName(); + } else { + continue; + } + + types.add(new String[]{String.valueOf(number), + "new " + typeInformation.createElementType(areaName, serviceName, name) + "()"}); + types.add(new String[]{String.valueOf(-number), + "new " + typeInformation.createElementType(areaName, serviceName, name + "List") + "()"}); + } + + return types; + } + + /** + * Returns true when a switch over these numbers compiles to a jump table + * rather than to a binary search. This is the rule the Java compiler itself + * applies, comparing the size of a table that spans the whole range against + * the size of a list of the labels that are actually used. + * + * @param count How many labels there are. + * @param span The distance from the lowest to the highest label. + * @return True if a jump table is emitted. + */ + static boolean compilesToJumpTable(int count, long span) { + return (4 + span) + 3L * 3L <= (3 + 2L * count) + 3L * count; + } + + /** + * Returns the highest type number, counted out from 1 in both directions, + * up to which a switch over the type numbers still compiles to a jump + * table. Zero when no band does. + * + * The band is anchored at 1 rather than placed on the longest unbroken run, + * because type numbers are handed out from 1 upwards, so a band that starts + * anywhere else leaves behind the numbers that are most likely to be asked + * for. Every candidate is tried rather than stopping at the first that + * fails: a group of numbers further out can be dense enough to pay for the + * gap in front of it. + * + * @param numbers The type numbers of the switch. + * @return The highest type number of the band, or zero if there is none. + */ + static int widestJumpTableBand(Collection numbers) { + // A type and the list that holds it share a number, save for the sign, + // so the band has to widen by the same step on both sides at once. + SortedSet magnitudes = new TreeSet<>(); + + for (Integer number : numbers) { + magnitudes.add(Math.abs(number)); + } + + int widest = 0; + + for (Integer magnitude : magnitudes) { + int count = 0; + + for (Integer number : numbers) { + if (Math.abs(number) <= magnitude) { + count++; + } + } + + if (compilesToJumpTable(count, 2L * magnitude + 1L)) { + widest = magnitude; + } + } + + return widest; + } + + /** + * Writes the method, or the pair of methods, that create the Element of a + * type number. The class of a type is named only inside its own branch, so + * it is loaded when a message first carries that type, and not before. + */ + private void addTypeSwitch(ClassWriter file, String methodName, + List types, String comment) throws IOException { + Map byNumber = new TreeMap<>(); + + for (String[] type : types) { + byNumber.put(Integer.valueOf(type[0]), type[1]); + } + + int band = widestJumpTableBand(byNumber.keySet()); + Map inBand = new TreeMap<>(); + Map outOfBand = new TreeMap<>(); + + for (Map.Entry entry : byNumber.entrySet()) { + boolean fits = Math.abs(entry.getKey()) <= band; + (fits ? inBand : outOfBand).put(entry.getKey(), entry.getValue()); + } + + // Splitting the types over two methods only pays off when there is a + // jump table to keep and something that would otherwise stretch it. + if (inBand.isEmpty() || outOfBand.isEmpty()) { + addSwitchMethod(file, methodName, comment, byNumber, null); + return; + } + + String outside = methodName + "OutOfBand"; + addSwitchMethod(file, methodName, comment, inBand, outside); + addSwitchMethod(file, outside, "Creates an Element whose type number lies too" + + " far out to be held in the jump table of " + methodName + "()." + + " This says nothing about how often the type is asked for: the" + + " numbers of an Area are not handed out in the order of use.", + outOfBand, null); + } + + /** + * Returns true when the numbers are better switched on one side of zero at + * a time than all together. + * + * A type and the list that holds it take the same number with opposite + * signs, so numbers that lie far from zero leave the whole distance across + * zero empty between them. A switch over both sides at once has to span + * that emptiness and falls back to a binary search, while each side on its + * own is tight enough for a jump table. + * + * @param numbers The type numbers of the switch. + * @return True if each side of zero should be switched on its own. + */ + static boolean shouldSplitOnSign(Collection numbers) { + int positives = 0; + int negatives = 0; + int highest = Integer.MIN_VALUE; + int lowest = Integer.MAX_VALUE; + int highestPositive = Integer.MIN_VALUE; + int lowestPositive = Integer.MAX_VALUE; + int highestNegative = Integer.MIN_VALUE; + int lowestNegative = Integer.MAX_VALUE; + + for (Integer number : numbers) { + highest = Math.max(highest, number); + lowest = Math.min(lowest, number); + + if (number > 0) { + positives++; + highestPositive = Math.max(highestPositive, number); + lowestPositive = Math.min(lowestPositive, number); + } else { + negatives++; + highestNegative = Math.max(highestNegative, number); + lowestNegative = Math.min(lowestNegative, number); + } + } + + if (positives == 0 || negatives == 0) { + return false; // There is only one side to switch on + } + + // Nothing is gained by splitting numbers that already answer with a + // jump table, and a side that stays a binary search is not worth the + // test that reaches it. + return !compilesToJumpTable(numbers.size(), (long) highest - lowest + 1L) + && compilesToJumpTable(positives, (long) highestPositive - lowestPositive + 1L) + && compilesToJumpTable(negatives, (long) highestNegative - lowestNegative + 1L); + } + + /** + * Writes one method holding a switch over type numbers. + * + * @param file The file to write the method to. + * @param methodName The name of the method. + * @param comment The comment of the method. + * @param types The types the switch answers for, by type number. + * @param fallback The method the switch falls back on for a type number it + * does not answer for, or null to answer with nothing. + */ + private void addSwitchMethod(ClassWriter file, String methodName, String comment, + Map types, String fallback) throws IOException { + CompositeField rtype = generator.createCompositeElementsDetails(file, false, "return", + TypeUtils.createTypeReference(StdStrings.MAL, null, "structures.Element", false), + false, true, null); + CompositeField arg = generator.createCompositeElementsDetails(file, false, "typeNumber", + TypeUtils.createTypeReference(null, null, "int", false), false, false, null); + + MethodWriter method = file.addMethodOpenStatement(false, true, StdStrings.PRIVATE, + rtype, methodName, Arrays.asList(arg), null, comment, null, null, false); + + String missing = (fallback == null) ? "null" : fallback + "(typeNumber)"; + + if (types.isEmpty()) { + method.addLine("return " + missing + ";"); + method.addMethodCloseStatement(); + return; + } + + if (shouldSplitOnSign(types.keySet())) { + Map positives = new TreeMap<>(); + Map negatives = new TreeMap<>(); + + for (Map.Entry entry : types.entrySet()) { + boolean positive = entry.getKey() > 0; + (positive ? positives : negatives).put(entry.getKey(), entry.getValue()); + } + + // These numbers lie far from zero, so the types and their lists are + // reached apart: together they would span the whole way across zero + method.addLine("if (typeNumber > 0) {"); + addSwitchLines(method, positives, missing, " "); + method.addLine("}"); + method.addLine(""); + addSwitchLines(method, negatives, missing, ""); + method.addMethodCloseStatement(); + return; + } + + addSwitchLines(method, types, missing, ""); + method.addMethodCloseStatement(); + } + + /** + * Writes the lines of one switch over type numbers. + * + * @param method The method to write the switch to. + * @param types The types the switch answers for, by type number. + * @param missing What the switch answers with for a type number it does not + * answer for. + * @param indent The step this switch takes past the body of the method. + */ + private void addSwitchLines(MethodWriter method, Map types, + String missing, String indent) throws IOException { + // The writer indents each line by itself, so only the step that the + // body of the switch takes past the switch is added here. + method.addLine(indent + "switch (typeNumber) {"); + + for (Map.Entry entry : types.entrySet()) { + method.addLine(indent + " case " + entry.getKey() + + ": return " + entry.getValue() + ";"); + } + + method.addLine(indent + " default: return " + missing + ";"); + method.addLine(indent + "}"); + } + + /** + * Creates the factory that makes the Elements of an area. + * + * The factory switches on the service number and then on the type number, + * rather than holding an instance of every type of the area. Holding the + * instances meant that every class of the area was loaded as soon as the + * area was, which on a small computer costs a noticeable part of the start + * up time, for types that a given deployment may never exchange. + * + * @param areaFolder The folder to write the factory to. + * @param area The area to write the factory of. + * @throws IOException If the file could not be written. + */ + public void createAreaElementFactoryClass(File areaFolder, AreaType area) throws IOException { + String areaName = area.getName(); + String className = areaName + "ElementFactory"; + ClassWriter file = generator.createClassFile(areaFolder, className); + + file.addPackageStatement(areaName, null, null); + file.addClassOpenStatement(className, true, false, null, + "org.ccsds.moims.mo.mal.AreaElementFactory", + "Creates the Elements of the " + areaName + " area, without holding an" + + " instance of each of them, so that the class of a type is only loaded" + + " once a message carries that type."); + + // The types declared by the area itself answer to service number 0 + List areaTypes = (area.getDataTypes() == null) ? new LinkedList<>() + : collectTypes(areaName, null, area.getDataTypes().getFundamentalOrAttributeOrComposite()); + + CompositeField rtype = generator.createCompositeElementsDetails(file, false, "return", + TypeUtils.createTypeReference(StdStrings.MAL, null, "structures.Element", false), + false, true, null); + CompositeField argService = generator.createCompositeElementsDetails(file, false, "serviceNumber", + TypeUtils.createTypeReference(null, null, "int", false), false, false, null); + CompositeField argType = generator.createCompositeElementsDetails(file, false, "typeNumber", + TypeUtils.createTypeReference(null, null, "int", false), false, false, null); + + MethodWriter method = file.addMethodOpenStatementOverride(rtype, "createElement", + Arrays.asList(argService, argType), null, false); + method.addLine("switch (serviceNumber) {"); + method.addLine(" case 0: return createAreaElement(typeNumber);"); + + for (ServiceType service : area.getService()) { + method.addLine(" case " + service.getNumber() + ": return create" + + service.getName() + "Element(typeNumber);"); + } + + method.addLine(" default: return null;"); + method.addLine("}"); + method.addMethodCloseStatement(); + + // The factory says which Area it belongs to, so that registering it + // cannot associate it with the wrong number or version. + CompositeField intReturn = generator.createCompositeElementsDetails(file, false, "return", + TypeUtils.createTypeReference(null, null, "int", false), false, false, null); + + MethodWriter areaNumber = file.addMethodOpenStatementOverride(intReturn, + "getAreaNumber", Arrays.asList(), null, false); + areaNumber.addLine("return " + area.getNumber() + ";"); + areaNumber.addMethodCloseStatement(); + + MethodWriter areaVersion = file.addMethodOpenStatementOverride(intReturn, + "getAreaVersion", Arrays.asList(), null, false); + areaVersion.addLine("return " + area.getVersion() + ";"); + areaVersion.addMethodCloseStatement(); + + addTypeSwitch(file, "createAreaElement", areaTypes, + "Creates an Element declared by the area itself."); + + for (ServiceType service : area.getService()) { + List serviceTypes = (service.getDataTypes() == null) ? new LinkedList<>() + : collectTypes(areaName, service.getName(), + service.getDataTypes().getCompositeOrEnumeration()); + addTypeSwitch(file, "create" + service.getName() + "Element", serviceTypes, + "Creates an Element declared by the " + service.getName() + " service."); + } + + file.addClassCloseStatement(); + file.flush(); + } +} diff --git a/api-generator/generator-java/src/main/java/esa/mo/tools/stubgen/java/JavaHelpers.java b/api-generator/generator-java/src/main/java/esa/mo/tools/stubgen/java/JavaHelpers.java index 92e1af17..5cd753e1 100644 --- a/api-generator/generator-java/src/main/java/esa/mo/tools/stubgen/java/JavaHelpers.java +++ b/api-generator/generator-java/src/main/java/esa/mo/tools/stubgen/java/JavaHelpers.java @@ -172,10 +172,10 @@ public void createAreaHelperClass(File areaFolder, AreaType area) throws IOExcep } } + // Left empty on purpose: the Area factory creates these on demand, so + // that the class of a type is only loaded once a message carries it. StringBuilder buf = new StringBuilder(); - for (String objectCall : elementList) { - buf.append("\n ").append(objectCall).append(","); - } + elementList.clear(); CompositeField objectInstVar = generator.createCompositeElementsDetails(file, false, areaNameCAPS + "_AREA_ELEMENTS", TypeUtils.createTypeReference(null, null, "org.ccsds.moims.mo.mal.structures.Element", false), false, true, "Area Elements."); @@ -196,6 +196,8 @@ public void createAreaHelperClass(File areaFolder, AreaType area) throws IOExcep false, true, buf_2.toString(), false); String areaObjectInitialValue = createAreaHelperClassInitialValue(areaNameCAPS, area.getVersion()); + areaObjectInitialValue = areaObjectInitialValue.substring(0, areaObjectInitialValue.length() - 1) + + ", new " + areaName + "ElementFactory())"; file.addClassVariable(true, true, StdStrings.PUBLIC, areaVar, true, areaObjectInitialValue); // create error numbers @@ -221,6 +223,7 @@ public void createAreaHelperClass(File areaFolder, AreaType area) throws IOExcep file.flush(); } + public String createAreaHelperClassInitialValue(String areaVar, short areaVersion) { return "(" + areaVar + "_AREA_NUMBER, " + areaVar + "_AREA_NAME, " + areaVar + "_AREA_VERSION, " + areaVar + "_AREA_ELEMENTS, " + areaVar + "_AREA_SERVICES)"; diff --git a/api-generator/generator-java/src/main/java/esa/mo/tools/stubgen/java/JavaServiceInfo.java b/api-generator/generator-java/src/main/java/esa/mo/tools/stubgen/java/JavaServiceInfo.java index 09ada569..460a6e61 100644 --- a/api-generator/generator-java/src/main/java/esa/mo/tools/stubgen/java/JavaServiceInfo.java +++ b/api-generator/generator-java/src/main/java/esa/mo/tools/stubgen/java/JavaServiceInfo.java @@ -184,10 +184,10 @@ public void createServiceInfoClass(File serviceFolder, AreaType area, } } + // Left empty on purpose: the Area factory creates these on demand, so + // that the class of a type is only loaded once a message carries it. StringBuilder buf = new StringBuilder(); - for (String objectCall : elementInstantiations) { - buf.append("\n ").append(objectCall).append(","); - } + elementInstantiations.clear(); CompositeField objectInstVar = generator.createCompositeElementsDetails(file, false, serviceCAPS + "_SERVICE_ELEMENTS", TypeUtils.createTypeReference(null, null, "org.ccsds.moims.mo.mal.structures.Element", false), false, true, "Area elements."); diff --git a/api-generator/generator-java/src/test/java/esa/mo/tools/stubgen/java/TestJavaElementFactory.java b/api-generator/generator-java/src/test/java/esa/mo/tools/stubgen/java/TestJavaElementFactory.java new file mode 100644 index 00000000..9110ef4c --- /dev/null +++ b/api-generator/generator-java/src/test/java/esa/mo/tools/stubgen/java/TestJavaElementFactory.java @@ -0,0 +1,241 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2024 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO Service Stub Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.tools.stubgen.java; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import org.junit.Test; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +/** + * Tests the rule that decides how far the switch of an area factory reaches + * before the rest of the type numbers are moved out to a second method. + */ +public class TestJavaElementFactory { + + /** + * Builds the type numbers of an area the way the generator sees them: a + * type and the list that holds it, which takes the same number negated. + * + * @param magnitudes The declared type numbers. + * @return The type numbers with the numbers of their lists. + */ + private static Collection withLists(int... magnitudes) { + List numbers = new ArrayList<>(); + + for (int magnitude : magnitudes) { + numbers.add(magnitude); + numbers.add(-magnitude); + } + + return numbers; + } + + private static int[] range(int first, int last) { + int[] numbers = new int[last - first + 1]; + + for (int i = 0; i < numbers.length; i++) { + numbers[i] = first + i; + } + + return numbers; + } + + /** + * An area whose numbers run without a gap is answered by one switch, so the + * band has to reach the last of them. + */ + @Test + public void bandCoversAnAreaThatHasNoGaps() { + assertEquals(12, JavaElementFactory.widestJumpTableBand(withLists(range(1, 12)))); + assertEquals(45, JavaElementFactory.widestJumpTableBand(withLists(range(1, 45)))); + } + + /** + * The numbers of the MAL run 1 to 19, then 101 to 105, then 1001 to 1010. + * The first two groups are close enough to be held together, the last one + * is not, so it is left for the second method. + */ + @Test + public void bandStopsBeforeAGapThatIsTooWideToPayFor() { + List mal = new ArrayList<>(); + mal.addAll(withLists(range(1, 19))); + mal.addAll(withLists(range(101, 105))); + mal.addAll(withLists(range(1001, 1010))); + + assertEquals(105, JavaElementFactory.widestJumpTableBand(mal)); + } + + /** + * A group of numbers that lies past a gap is still taken in when it is + * dense enough to pay for the gap in front of it. Stopping at the first + * candidate that fails would leave it out. + */ + @Test + public void bandReachesPastAGapThatTheNumbersBehindItPayFor() { + List numbers = new ArrayList<>(); + numbers.addAll(withLists(1, 2, 3)); + numbers.addAll(withLists(range(20, 60))); + + assertEquals(60, JavaElementFactory.widestJumpTableBand(numbers)); + } + + /** + * The band is counted out from 1, not placed on the longest run of numbers + * that follow one another. An area that starts with a gap would otherwise + * leave its first types out of the jump table. + */ + @Test + public void bandIsAnchoredAtOneAndNotOnTheLongestRun() { + // The run 10 to 15 is the longest, but 1 and 6 come first + List numbers = new ArrayList<>(); + numbers.addAll(withLists(1, 6)); + numbers.addAll(withLists(range(10, 15))); + + int band = JavaElementFactory.widestJumpTableBand(numbers); + assertEquals(15, band); + assertTrue("Type number 1 has to be inside the band", band >= 1); + } + + /** + * A single type is answered by a lookup rather than by a jump table, so + * there is no band and the types are left in one switch. + */ + @Test + public void aSingleTypeHasNoBand() { + assertEquals(0, JavaElementFactory.widestJumpTableBand(withLists(1))); + } + + /** + * A number that lies on its own far from the rest cannot widen the band, + * whatever else the area declares. + */ + @Test + public void aLoneNumberFarOutIsLeftOutOfTheBand() { + List numbers = new ArrayList<>(); + numbers.addAll(withLists(range(1, 20))); + numbers.addAll(withLists(5000)); + + assertEquals(20, JavaElementFactory.widestJumpTableBand(numbers)); + } + + /** + * The band that is chosen has to be one the Java compiler really answers + * with a jump table, and the one past it must not be. + */ + @Test + public void chosenBandIsTheWidestThatStillCompilesToAJumpTable() { + List numbers = new ArrayList<>(); + numbers.addAll(withLists(range(1, 19))); + numbers.addAll(withLists(range(101, 105))); + numbers.addAll(withLists(range(1001, 1010))); + + int band = JavaElementFactory.widestJumpTableBand(numbers); + int inside = 0; + + for (Integer number : numbers) { + if (Math.abs(number) <= band) { + inside++; + } + } + + assertTrue("The chosen band is not a jump table", + JavaElementFactory.compilesToJumpTable(inside, 2L * band + 1L)); + assertTrue("The whole area would still be a jump table", + !JavaElementFactory.compilesToJumpTable(numbers.size(), 2L * 1010 + 1L)); + } + + /** + * Nothing to switch over is answered with no band, rather than with an + * empty one that the generator would then try to split. + */ + @Test + public void noTypesGiveNoBand() { + assertEquals(0, JavaElementFactory.widestJumpTableBand(new ArrayList<>())); + } + + /** + * Numbers that lie far from zero leave the whole way across zero empty + * between the types and their lists, so each side is switched on its own. + */ + @Test + public void numbersFarFromZeroAreSwitchedOneSideAtATime() { + assertTrue(JavaElementFactory.shouldSplitOnSign(withLists(range(1001, 1010)))); + } + + /** + * Numbers that already answer with a jump table gain nothing from being + * taken apart, and would only pay for the test that reaches each side. + */ + @Test + public void numbersThatAreAlreadyAJumpTableAreLeftWhole() { + assertFalse(JavaElementFactory.shouldSplitOnSign(withLists(range(1, 19)))); + assertFalse(JavaElementFactory.shouldSplitOnSign(withLists(range(1, 105)))); + } + + /** + * A single type far from zero is reached faster by one lookup over both of + * its numbers than by a test and a jump table holding one entry each. + */ + @Test + public void aSingleTypeFarFromZeroIsLeftWhole() { + assertFalse(JavaElementFactory.shouldSplitOnSign(withLists(90))); + } + + /** + * There is nothing to take apart when the numbers all fall on one side of + * zero. + */ + @Test + public void numbersOnOneSideOfZeroAreLeftWhole() { + List positives = new ArrayList<>(); + + for (int number = 1001; number <= 1010; number++) { + positives.add(number); + } + + assertFalse(JavaElementFactory.shouldSplitOnSign(positives)); + assertFalse(JavaElementFactory.shouldSplitOnSign(new ArrayList<>())); + } + + /** + * Both sides have to be worth a jump table on their own. One side that + * stays a binary search is not worth the test that reaches it. + */ + @Test + public void bothSidesHaveToBeWorthAJumpTable() { + // The lists follow one another, the types themselves do not + List lopsided = new ArrayList<>(); + + for (int number = 1001; number <= 1010; number++) { + lopsided.add(-number); + } + + lopsided.add(1001); + lopsided.add(3000); + lopsided.add(9000); + + assertFalse(JavaElementFactory.shouldSplitOnSign(lopsided)); + } +} diff --git a/apis/api-area001-v003-mal/src/main/java/org/ccsds/moims/mo/mal/AreaElementFactory.java b/apis/api-area001-v003-mal/src/main/java/org/ccsds/moims/mo/mal/AreaElementFactory.java new file mode 100644 index 00000000..5bb0e6a5 --- /dev/null +++ b/apis/api-area001-v003-mal/src/main/java/org/ccsds/moims/mo/mal/AreaElementFactory.java @@ -0,0 +1,61 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2024 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO MAL Java API + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package org.ccsds.moims.mo.mal; + +import org.ccsds.moims.mo.mal.structures.Element; + +/** + * Creates the Elements of one Area. + * + * One of these is generated for each Area, and answers with a new Element for a + * service number and a type number of that Area. The generated implementation + * is a switch on the service number, and then a switch on the type number, so + * that the class of a type is only ever loaded when a message actually carries + * that type. Holding an instance of every type instead, only to be able to ask + * it for a copy of itself, made every one of them load at start up. + */ +public interface AreaElementFactory { + + /** + * Returns a new Element of the given type, or null if this Area does not + * define it. + * + * @param serviceNumber The service the type belongs to, or 0 for the types + * defined by the Area itself. + * @param typeNumber The type number, negative for the list of a type. + * @return A new Element, or null if this Area does not define that type. + */ + Element createElement(int serviceNumber, int typeNumber); + + /** + * Returns the number of the Area this factory creates the Elements of. + * + * @return The Area number. + */ + int getAreaNumber(); + + /** + * Returns the version of the Area this factory creates the Elements of. + * + * @return The Area version. + */ + int getAreaVersion(); +} diff --git a/apis/api-area001-v003-mal/src/main/java/org/ccsds/moims/mo/mal/MALArea.java b/apis/api-area001-v003-mal/src/main/java/org/ccsds/moims/mo/mal/MALArea.java index bb38ab94..73708a33 100644 --- a/apis/api-area001-v003-mal/src/main/java/org/ccsds/moims/mo/mal/MALArea.java +++ b/apis/api-area001-v003-mal/src/main/java/org/ccsds/moims/mo/mal/MALArea.java @@ -38,6 +38,7 @@ public class MALArea { private final UOctet version; private final Element[] elements; private final ServiceInfo[] services; + private final AreaElementFactory elementFactory; /** * MALArea constructor. @@ -51,6 +52,23 @@ public class MALArea { */ public MALArea(UShort number, Identifier name, UOctet version, Element[] elements, ServiceInfo[] services) { + this(number, name, version, elements, services, null); + } + + /** + * MALArea constructor. + * + * @param number The number of the Area. + * @param name The name of the Area. + * @param version The Area version. + * @param elements The elements in this Area. + * @param services The services in this Area. + * @param elementFactory Creates the elements of this Area on demand, so + * that their classes do not all have to be loaded up front. May be null. + * @throws IllegalArgumentException If either argument is null. + */ + public MALArea(UShort number, Identifier name, UOctet version, + Element[] elements, ServiceInfo[] services, AreaElementFactory elementFactory) { if (number == null) { throw new IllegalArgumentException("Number argument must not be NULL"); } @@ -66,6 +84,16 @@ public MALArea(UShort number, Identifier name, UOctet version, this.version = version; this.elements = elements; this.services = services; + this.elementFactory = elementFactory; + } + + /** + * Returns the factory that creates the Elements of this Area on demand. + * + * @return The factory, or null if this Area does not provide one. + */ + public final AreaElementFactory getElementFactory() { + return elementFactory; } /** diff --git a/apis/api-area001-v003-mal/src/main/java/org/ccsds/moims/mo/mal/MALElementsRegistry.java b/apis/api-area001-v003-mal/src/main/java/org/ccsds/moims/mo/mal/MALElementsRegistry.java index 86bf0a65..d405abd5 100644 --- a/apis/api-area001-v003-mal/src/main/java/org/ccsds/moims/mo/mal/MALElementsRegistry.java +++ b/apis/api-area001-v003-mal/src/main/java/org/ccsds/moims/mo/mal/MALElementsRegistry.java @@ -20,8 +20,7 @@ */ package org.ccsds.moims.mo.mal; -import java.util.HashMap; -import java.util.concurrent.Callable; +import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import org.ccsds.moims.mo.mal.structures.Element; @@ -29,43 +28,77 @@ import org.ccsds.moims.mo.mal.structures.HeterogeneousList; /** - * Holds a map of MAL Elements indexed on the absolute short form part. Used to - * lookup the correct elements for a supplied absolute short form part. + * Holds the factory of each registered Area, and asks them for the Element of a + * Type Id. A factory creates the Element of a type without an instance of every + * other type of its Area having to be held, so the class of a type is only + * loaded once a message actually carries that type. */ public class MALElementsRegistry { - private final HashMap> ELEMENTS = new java.util.HashMap<>(270); // 262! - /** - * Adds an Element to the map of Elements. - * - * @param element The Element to be added. - * @return True if already previously loaded else false. + * The registered factories. There are a handful in total, one per Area plus + * the occasional one for types that are written by hand rather than + * generated, which is why a scan is enough and no map is needed. Each one + * says which Area it belongs to, so nothing here can register a factory + * against the wrong number or version. */ - public boolean addElement(Element element) { - Long typeId = element.getTypeId().getTypeId(); - Callable callable = () -> element.createElement(); - - Callable previous = ELEMENTS.put(typeId, callable); - return previous != null; // Not the first time? - } + private final List AREA_FACTORIES = new java.util.ArrayList<>(); /** - * Removes an Element from the map of Elements. + * Registers a factory, so that the Elements it creates can be reached + * without every one of their classes having to be loaded first. * - * @param absoluteSFP The absolute short form part. + * More than one factory can be registered for the same Area. Types whose + * numbers the XML schema cannot express are written by hand, and their + * factory is registered alongside the generated one of that Area. + * + * @param factory The factory that creates the Elements. */ - public synchronized void removeCallableElement(Long absoluteSFP) { - ELEMENTS.remove(absoluteSFP); + public synchronized void registerAreaFactory(final AreaElementFactory factory) { + if (factory == null) { + return; + } + + for (AreaElementFactory registered : AREA_FACTORIES) { + if (registered.getClass() == factory.getClass()) { + return; // Already registered + } + } + + AREA_FACTORIES.add(factory); } /** - * Returns the number of elements available on the registry. + * Asks the factories of the Area addressed by a Type Id for the Element, + * without loading the classes of the types that are not asked for. * - * @return The number of elements. + * @param typeId The Type Id. + * @return The created Element, or null if no factory claims that Type Id. */ - public int howMany() { - return ELEMENTS.size(); + private Element createFromAreaFactory(final long typeId) { + // Read once, up front: a Type Id that no Area claims is the rare case, + // so there is nothing to be saved by reading the last two only after a + // factory has been found. + final int areaNumber = TypeId.areaNumberOf(typeId); + final int areaVersion = TypeId.areaVersionOf(typeId); + final int serviceNumber = TypeId.serviceNumberOf(typeId); + final int typeNumber = TypeId.typeNumberOf(typeId); + + for (int i = 0; i < AREA_FACTORIES.size(); i++) { + AreaElementFactory factory = AREA_FACTORIES.get(i); + + if (factory.getAreaNumber() == areaNumber && factory.getAreaVersion() == areaVersion) { + Element element = factory.createElement(serviceNumber, typeNumber); + + // An Area can hold more than one factory, so a factory that + // does not know the type is asked past, not taken as an answer + if (element != null) { + return element; + } + } + } + + return null; } /** @@ -80,9 +113,9 @@ public Element createElement(Long typeIdLong) throws Exception { return new HeterogeneousList(); } - Callable callable = ELEMENTS.get(typeIdLong); + Element element = createFromAreaFactory(typeIdLong); - if (callable == null) { + if (element == null) { TypeId typeId = new TypeId(typeIdLong); if (typeId.isOldMAL()) { @@ -94,7 +127,7 @@ public Element createElement(Long typeIdLong) throws Exception { + typeIdLong + " - " + typeId.toString()); } - return callable.call(); + return element; } /** @@ -156,32 +189,15 @@ public static Element elementListToElement(ElementList obj) throws NotFoundExcep } /** - * Registers the Elements for a certain area. + * Registers the factory of a certain Area. * - * @param malArea The Area with the Elements to be registered. + * @param malArea The Area whose factory is to be registered. */ private synchronized void registerElementsForArea(MALArea malArea) { - Element[] elements = malArea.getElements(); - - for (Element element : elements) { - if (this.addElement(element)) { - break; - } - } - } - - /** - * Registers the Elements for a certain service. - * - * @param malService The Service with the Elements to be registered. - */ - private synchronized void registerElementsForService(ServiceInfo malService) { - Element[] elements = malService.getElements(); - - for (Element element : elements) { - if (this.addElement(element)) { - break; - } + // Any area that brings a factory has it registered here, so that every + // route into this class registers it, including the MAL area itself. + if (malArea.getElementFactory() != null) { + this.registerAreaFactory(malArea.getElementFactory()); } } @@ -191,9 +207,14 @@ private synchronized void registerElementsForService(ServiceInfo malService) { * @param service The Service to be loaded. */ public void loadServiceAndAreaElements(ServiceInfo service) { + MALArea parent = service.getArea(); + + if (parent != null && parent.getElementFactory() != null) { + this.registerAreaFactory(parent.getElementFactory()); + } + // Load the elements here: this.registerElementsForArea(MALHelper.MAL_AREA); - this.registerElementsForService(service); // The Top-level Area loading also needs to be loaded this.registerElementsForArea(service.getArea()); @@ -211,6 +232,12 @@ public void loadServiceAndAreaElements(ServiceInfo service) { * @param area The Area to be loaded. */ public void loadFullArea(MALArea area) { + // The factory creates the Elements of this Area on demand, so that the + // class of a type is only loaded once a message carries that type. + if (area.getElementFactory() != null) { + this.registerAreaFactory(area.getElementFactory()); + } + this.registerElementsForArea(MALHelper.MAL_AREA); // The Top-level Area loading also needs to be loaded this.registerElementsForArea(area); diff --git a/apis/api-area001-v003-mal/src/main/java/org/ccsds/moims/mo/mal/TypeId.java b/apis/api-area001-v003-mal/src/main/java/org/ccsds/moims/mo/mal/TypeId.java index cd26af8e..d59e4e86 100644 --- a/apis/api-area001-v003-mal/src/main/java/org/ccsds/moims/mo/mal/TypeId.java +++ b/apis/api-area001-v003-mal/src/main/java/org/ccsds/moims/mo/mal/TypeId.java @@ -41,6 +41,56 @@ public class TypeId { private final static long MASK_08 = 0xFF; private final static long MASK_16 = 0xFFFF; private final static long MASK_24 = 0xFFFFFF; + /** + * The bit that carries the sign of the type number, which is set on the + * type numbers of the lists. + */ + private final static int TYPE_NUMBER_SIGN_BIT = 0x800000; + + /** + * Reads the area number out of a Type Id. + * + * @param typeId The Type Id. + * @return The area number. + */ + public static int areaNumberOf(final long typeId) { + return (int) ((typeId >> AREA_BIT_SHIFT) & MASK_16); + } + + /** + * Reads the area version out of a Type Id. + * + * @param typeId The Type Id. + * @return The area version. + */ + public static int areaVersionOf(final long typeId) { + return (int) ((typeId >> VERSION_BIT_SHIFT) & MASK_08); + } + + /** + * Reads the service number out of a Type Id. + * + * @param typeId The Type Id. + * @return The service number. + */ + public static int serviceNumberOf(final long typeId) { + return (int) ((typeId >> SERVICE_BIT_SHIFT) & MASK_16); + } + + /** + * Reads the type number out of a Type Id, over the full width of the field + * that carries it. The type number of a list is the negative of the type + * number of the type it holds. + * + * @param typeId The Type Id. + * @return The type number. + */ + public static int typeNumberOf(final long typeId) { + final int typeNumber = (int) (typeId & MASK_24); + + return ((typeNumber & TYPE_NUMBER_SIGN_BIT) != 0) + ? typeNumber - (TYPE_NUMBER_SIGN_BIT << 1) : typeNumber; + } /** * Area number (defined as UShort by the MAL). @@ -106,9 +156,9 @@ public TypeId(final int areaNumber, final int areaVersion, private void calculateIfNeeded() { if (areaNumber == null) { - areaNumber = (short) ((typeId >> AREA_BIT_SHIFT) & MASK_16); - areaVersion = (short) ((typeId >> VERSION_BIT_SHIFT) & MASK_08); - serviceNumber = (short) ((typeId >> SERVICE_BIT_SHIFT) & MASK_16); + areaNumber = (short) areaNumberOf(typeId); + areaVersion = (short) areaVersionOf(typeId); + serviceNumber = (short) serviceNumberOf(typeId); sfp = (short) (typeId & MASK_24); } } diff --git a/apis/api-area001-v003-mal/src/test/java/org/ccsds/moims/mo/mal/TestAreaElementFactory.java b/apis/api-area001-v003-mal/src/test/java/org/ccsds/moims/mo/mal/TestAreaElementFactory.java new file mode 100644 index 00000000..8284433b --- /dev/null +++ b/apis/api-area001-v003-mal/src/test/java/org/ccsds/moims/mo/mal/TestAreaElementFactory.java @@ -0,0 +1,176 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2024 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO MAL Java API + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package org.ccsds.moims.mo.mal; + +import org.ccsds.moims.mo.mal.structures.Blob; +import org.ccsds.moims.mo.mal.structures.BlobList; +import org.ccsds.moims.mo.mal.structures.Element; +import org.ccsds.moims.mo.mal.structures.ElementList; +import org.junit.Test; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; + +/** + * Tests the factory that the generator writes for the MAL area. + * + * The factory is a switch over the type numbers, and the generator is free to + * split that switch over more than one method to keep it compiling to a jump + * table. These tests hold the switch to what it must answer whatever shape the + * generator gives it. + */ +public class TestAreaElementFactory { + + private static final int MAL_AREA_NUMBER = 1; + + private static final int MAL_AREA_VERSION = 3; + + /** + * The type numbers of the MAL reach past 1000, so the sweep has to go + * further out than that to cover the whole area. + */ + private static final int SWEEP = 2000; + + private final AreaElementFactory factory = new MALElementFactory(); + + private static long typeIdOf(int typeNumber) { + return new TypeId(MAL_AREA_NUMBER, MAL_AREA_VERSION, 0, typeNumber).getTypeId(); + } + + /** + * Every Element the factory hands out has to be the type that was asked + * for. A switch label that names the wrong class, or a type number that + * reaches the branch of another one, is caught here. + */ + @Test + public void createdElementIsOfTheTypeThatWasAskedFor() { + for (int typeNumber = -SWEEP; typeNumber <= SWEEP; typeNumber++) { + if (typeNumber == 0) { + continue; // Not a type number: it stands for a heterogeneous list + } + + Element element = factory.createElement(0, typeNumber); + + if (element == null) { + continue; // The MAL does not declare this one + } + + assertEquals("The factory answered type number " + typeNumber + " with " + + element.getClass().getSimpleName(), + typeIdOf(typeNumber), element.getTypeId().getTypeId()); + } + } + + /** + * A type number that the MAL does not declare has to be answered with + * nothing, rather than with the Element of a number that lies near it. + */ + @Test + public void undeclaredTypeNumberIsAnsweredWithNothing() { + for (int typeNumber : new int[]{20, 21, 50, 99, 100, 106, 500, 1000, 1011, 1500}) { + assertNull("Type number " + typeNumber + " is not declared by the MAL", + factory.createElement(0, typeNumber)); + assertNull("Type number " + (-typeNumber) + " is not declared by the MAL", + factory.createElement(0, -typeNumber)); + } + } + + /** + * A negative type number stands for the list of the type that holds the + * same number, so the two have to answer as a pair. + */ + @Test + public void everyTypeIsPairedWithItsList() { + int pairs = 0; + + for (int typeNumber = 1; typeNumber <= SWEEP; typeNumber++) { + Element element = factory.createElement(0, typeNumber); + Element list = factory.createElement(0, -typeNumber); + + if (element == null && list == null) { + continue; + } + + assertNotNull("Type number " + typeNumber + " has a list but no type", element); + assertNotNull("Type number " + typeNumber + " has a type but no list", list); + assertTrue("Type number " + (-typeNumber) + " is not a list", + list instanceof ElementList); + pairs++; + } + + // The MAL declares the attributes, the enumerations and the composites + // that every other area builds on, so this is a floor and not a count. + assertTrue("Only " + pairs + " types were found in the MAL area", pairs >= 30); + } + + /** + * The factory only answers for the types of the area itself, which the MAL + * addresses with service number zero. + */ + @Test + public void onlyTheAreaItselfIsAnsweredFor() { + assertNull(factory.createElement(1, 1)); + assertNull(factory.createElement(99, 1)); + } + + /** + * The factory says which area it belongs to, so that it cannot be + * registered against the wrong number or version. + */ + @Test + public void factoryNamesItsOwnArea() { + assertEquals(MAL_AREA_NUMBER, factory.getAreaNumber()); + assertEquals(MAL_AREA_VERSION, factory.getAreaVersion()); + } + + /** + * Spot checks at both ends of the area, so that a change which moves the + * split between the methods of the factory cannot go unnoticed. + */ + @Test + public void bothEndsOfTheAreaAreReachable() { + assertEquals(Blob.class, factory.createElement(0, 1).getClass()); + assertEquals(BlobList.class, factory.createElement(0, -1).getClass()); + + // These lie far above the rest, so the generator holds them apart + assertNotNull(factory.createElement(0, 1001)); + assertNotNull(factory.createElement(0, -1001)); + assertNotNull(factory.createElement(0, 1010)); + assertNotNull(factory.createElement(0, -1010)); + } + + /** + * The registry has to reach the same Elements through the factory of the + * area, which is the path every decoded message takes. + */ + @Test + public void registryReachesTheFactory() throws Exception { + MALElementsRegistry registry = new MALElementsRegistry(); + registry.registerAreaFactory(factory); + + for (int typeNumber : new int[]{1, -1, 19, -19, 105, -105, 1001, -1001, 1010, -1010}) { + Element element = registry.createElement(typeIdOf(typeNumber)); + assertNotNull("The registry did not reach type number " + typeNumber, element); + assertEquals(typeIdOf(typeNumber), element.getTypeId().getTypeId()); + } + } +} diff --git a/testbeds/testbed-malspp-framework/src/main/java/org/ccsds/moims/mo/malspp/test/datatype/HandWrittenElementFactory.java b/testbeds/testbed-malspp-framework/src/main/java/org/ccsds/moims/mo/malspp/test/datatype/HandWrittenElementFactory.java new file mode 100644 index 00000000..3ab7f72a --- /dev/null +++ b/testbeds/testbed-malspp-framework/src/main/java/org/ccsds/moims/mo/malspp/test/datatype/HandWrittenElementFactory.java @@ -0,0 +1,65 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2024 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO MAL/SPP Test bed + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package org.ccsds.moims.mo.malspp.test.datatype; + +import org.ccsds.moims.mo.mal.AreaElementFactory; +import org.ccsds.moims.mo.mal.structures.Element; +import org.ccsds.moims.mo.malprototype.MALPrototypeHelper; + +/** + * Creates the Elements of the MAL Prototype area that are written by hand + * rather than generated. + * + * The type numbers of these two reach the top of the range that a Type Id can + * carry, which is further than the XML schema lets a specification go, so they + * cannot be declared in XML and no generated factory knows about them. This one + * is registered alongside the generated factory of the same area, which is + * asked first and answers with nothing for these two. + */ +public class HandWrittenElementFactory implements AreaElementFactory { + + @Override + public Element createElement(int serviceNumber, int typeNumber) { + if (serviceNumber != 0) { + return null; // Both are declared by the area itself + } + + if (typeNumber == LargeEnumeration.TYPE_SHORT_FORM) { + return new LargeEnumeration(0); + } + + if (typeNumber == MediumEnumeration.TYPE_SHORT_FORM) { + return new MediumEnumeration(0); + } + + return null; + } + + @Override + public int getAreaNumber() { + return MALPrototypeHelper._MALPROTOTYPE_AREA_NUMBER; + } + + @Override + public int getAreaVersion() { + return MALPrototypeHelper._MALPROTOTYPE_AREA_VERSION; + } +} diff --git a/testbeds/testbed-malspp-framework/src/main/java/org/ccsds/moims/mo/malspp/test/util/BufferReader.java b/testbeds/testbed-malspp-framework/src/main/java/org/ccsds/moims/mo/malspp/test/util/BufferReader.java index 263627a6..9663a1f1 100644 --- a/testbeds/testbed-malspp-framework/src/main/java/org/ccsds/moims/mo/malspp/test/util/BufferReader.java +++ b/testbeds/testbed-malspp-framework/src/main/java/org/ccsds/moims/mo/malspp/test/util/BufferReader.java @@ -35,7 +35,6 @@ import java.io.File; import java.io.IOException; import java.math.BigInteger; -import java.util.concurrent.Callable; import org.ccsds.moims.mo.mal.MALContextFactory; import org.ccsds.moims.mo.mal.structures.Blob; @@ -48,8 +47,7 @@ import org.ccsds.moims.mo.mal.structures.UOctet; import org.ccsds.moims.mo.mal.structures.URI; import org.ccsds.moims.mo.mal.structures.UShort; -import org.ccsds.moims.mo.malspp.test.datatype.LargeEnumeration; -import org.ccsds.moims.mo.malspp.test.datatype.MediumEnumeration; +import org.ccsds.moims.mo.malspp.test.datatype.HandWrittenElementFactory; import org.ccsds.moims.mo.testbed.util.LoggingBase; import org.orekit.data.DataProvidersManager; import org.orekit.data.DirectoryCrawler; @@ -82,9 +80,9 @@ public static void init() { fineTimeMalJavaApiEpoch = new AbsoluteDate(epochAsString, TimeScalesFactory.getTAI()); - // Initialize BigEnumeration data type - MALContextFactory.getElementsRegistry().addElement(new LargeEnumeration(0)); - MALContextFactory.getElementsRegistry().addElement(new MediumEnumeration(0)); + // The two enumerations are written by hand, so their factory is + // registered next to the generated one of the same area + MALContextFactory.getElementsRegistry().registerAreaFactory(new HandWrittenElementFactory()); } private static AbsoluteDate fineTimeMalJavaApiEpoch; From c4bb2341cd5254e260e90cd7fa7c2901b597fd3a Mon Sep 17 00:00:00 2001 From: Cesar Coelho Date: Sun, 2 Aug 2026 22:23:14 +0200 Subject: [PATCH 28/45] Answer the types of an Area from createElement() where it declares them all Most Areas declare every one of their types at Area level, and their services declare none. The switch over the service number then had one branch that led anywhere, and a method for each service that only ever returned nothing. Where no service of an Area declares a type, createElement() now holds the switch over the type numbers itself. The MAL reaches its jump table straight away rather than through a call that HotSpot would not have inlined, the switch over the service numbers is gone from twelve of the seventeen generated factories, and about forty methods that returned nothing are no longer written at all. Areas whose services do declare types are written as before. The factories are registered while the messages of the ones already registered are being decoded, so the list they are held in is now one that can be read through at the same time. Which factory answers when two of them claim a type is written down: the first registered. Co-Authored-By: Claude Opus 5 --- .../stubgen/java/JavaElementFactory.java | 166 ++++++++++++++---- .../moims/mo/mal/MALElementsRegistry.java | 19 +- .../moims/mo/mal/TestAreaElementFactory.java | 130 ++++++++++++++ 3 files changed, 276 insertions(+), 39 deletions(-) diff --git a/api-generator/generator-java/src/main/java/esa/mo/tools/stubgen/java/JavaElementFactory.java b/api-generator/generator-java/src/main/java/esa/mo/tools/stubgen/java/JavaElementFactory.java index 9cb5117b..de2c6d33 100644 --- a/api-generator/generator-java/src/main/java/esa/mo/tools/stubgen/java/JavaElementFactory.java +++ b/api-generator/generator-java/src/main/java/esa/mo/tools/stubgen/java/JavaElementFactory.java @@ -37,6 +37,7 @@ import java.io.IOException; import java.util.Arrays; import java.util.Collection; +import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; @@ -188,6 +189,55 @@ static int widestJumpTableBand(Collection numbers) { */ private void addTypeSwitch(ClassWriter file, String methodName, List types, String comment) throws IOException { + TypeSplit split = splitTypes(types); + + // Splitting the types over two methods only pays off when there is a + // jump table to keep and something that would otherwise stretch it. + if (!split.isSplit()) { + addSwitchMethod(file, methodName, comment, split.all(), null); + return; + } + + addSwitchMethod(file, methodName, comment, split.inBand, outOfBandNameOf(methodName)); + addOutOfBandMethod(file, methodName, split); + } + + /** + * The types of one switch, split into the ones a jump table can hold and + * the ones whose numbers lie too far out for it. + */ + private static final class TypeSplit { + + private final Map inBand = new TreeMap<>(); + + private final Map outOfBand = new TreeMap<>(); + + /** + * @return True if the types have to be reached by two switches. + */ + boolean isSplit() { + return !inBand.isEmpty() && !outOfBand.isEmpty(); + } + + /** + * @return Every type, whether or not the jump table can hold it. + */ + Map all() { + Map every = new TreeMap<>(inBand); + every.putAll(outOfBand); + return every; + } + } + + /** + * Splits the types into the ones the widest jump table can hold and the + * ones that lie past it. + * + * @param types The types, as pairs of type number and the expression that + * creates one. + * @return The split. + */ + private static TypeSplit splitTypes(List types) { Map byNumber = new TreeMap<>(); for (String[] type : types) { @@ -195,28 +245,31 @@ private void addTypeSwitch(ClassWriter file, String methodName, } int band = widestJumpTableBand(byNumber.keySet()); - Map inBand = new TreeMap<>(); - Map outOfBand = new TreeMap<>(); + TypeSplit split = new TypeSplit(); for (Map.Entry entry : byNumber.entrySet()) { boolean fits = Math.abs(entry.getKey()) <= band; - (fits ? inBand : outOfBand).put(entry.getKey(), entry.getValue()); + (fits ? split.inBand : split.outOfBand).put(entry.getKey(), entry.getValue()); } - // Splitting the types over two methods only pays off when there is a - // jump table to keep and something that would otherwise stretch it. - if (inBand.isEmpty() || outOfBand.isEmpty()) { - addSwitchMethod(file, methodName, comment, byNumber, null); - return; - } + return split; + } - String outside = methodName + "OutOfBand"; - addSwitchMethod(file, methodName, comment, inBand, outside); - addSwitchMethod(file, outside, "Creates an Element whose type number lies too" - + " far out to be held in the jump table of " + methodName + "()." - + " This says nothing about how often the type is asked for: the" - + " numbers of an Area are not handed out in the order of use.", - outOfBand, null); + private static String outOfBandNameOf(String methodName) { + return methodName + "OutOfBand"; + } + + /** + * Writes the method that answers for the types the jump table could not + * hold. + */ + private void addOutOfBandMethod(ClassWriter file, String methodName, + TypeSplit split) throws IOException { + addSwitchMethod(file, outOfBandNameOf(methodName), + "Creates an Element whose type number lies too far out to be held" + + " in the jump table that is asked first. This says nothing about" + + " how often the type is asked for: the numbers of an Area are not" + + " handed out in the order of use.", split.outOfBand, null); } /** @@ -290,11 +343,26 @@ private void addSwitchMethod(ClassWriter file, String methodName, String comment MethodWriter method = file.addMethodOpenStatement(false, true, StdStrings.PRIVATE, rtype, methodName, Arrays.asList(arg), null, comment, null, null, false); + addSwitchBody(method, types, fallback); + method.addMethodCloseStatement(); + } + + /** + * Writes the body that answers a type number, into a method that is already + * open. The body is one switch, or a switch for each side of zero where the + * numbers lie too far out to be held together. + * + * @param method The method to write the body to. + * @param types The types the body answers for, by type number. + * @param fallback The method the body falls back on for a type number it + * does not answer for, or null to answer with nothing. + */ + private void addSwitchBody(MethodWriter method, Map types, + String fallback) throws IOException { String missing = (fallback == null) ? "null" : fallback + "(typeNumber)"; if (types.isEmpty()) { method.addLine("return " + missing + ";"); - method.addMethodCloseStatement(); return; } @@ -314,12 +382,10 @@ private void addSwitchMethod(ClassWriter file, String methodName, String comment method.addLine("}"); method.addLine(""); addSwitchLines(method, negatives, missing, ""); - method.addMethodCloseStatement(); return; } addSwitchLines(method, types, missing, ""); - method.addMethodCloseStatement(); } /** @@ -383,18 +449,46 @@ public void createAreaElementFactoryClass(File areaFolder, AreaType area) throws CompositeField argType = generator.createCompositeElementsDetails(file, false, "typeNumber", TypeUtils.createTypeReference(null, null, "int", false), false, false, null); + // The types of each service, gathered up front: an Area whose services + // declare none of their own is reached without a switch over them. + Map> typesByService = new LinkedHashMap<>(); + boolean anyServiceHasTypes = false; + + for (ServiceType service : area.getService()) { + List serviceTypes = (service.getDataTypes() == null) ? new LinkedList<>() + : collectTypes(areaName, service.getName(), + service.getDataTypes().getCompositeOrEnumeration()); + typesByService.put(service, serviceTypes); + anyServiceHasTypes = anyServiceHasTypes || !serviceTypes.isEmpty(); + } + MethodWriter method = file.addMethodOpenStatementOverride(rtype, "createElement", Arrays.asList(argService, argType), null, false); - method.addLine("switch (serviceNumber) {"); - method.addLine(" case 0: return createAreaElement(typeNumber);"); + TypeSplit areaSplit = splitTypes(areaTypes); - for (ServiceType service : area.getService()) { - method.addLine(" case " + service.getNumber() + ": return create" - + service.getName() + "Element(typeNumber);"); + if (anyServiceHasTypes) { + method.addLine("switch (serviceNumber) {"); + method.addLine(" case 0: return createAreaElement(typeNumber);"); + + for (ServiceType service : area.getService()) { + method.addLine(" case " + service.getNumber() + ": return create" + + service.getName() + "Element(typeNumber);"); + } + + method.addLine(" default: return null;"); + method.addLine("}"); + } else { + // Every type of this Area is declared by the Area itself, so the + // types are answered here rather than through a switch over + // services that would only ever lead back to the one branch. + method.addLine("if (serviceNumber != 0) {"); + method.addLine(" return null; // This Area declares no types under a service"); + method.addLine("}"); + method.addLine(""); + addSwitchBody(method, areaSplit.inBand, + areaSplit.isSplit() ? outOfBandNameOf("createAreaElement") : null); } - method.addLine(" default: return null;"); - method.addLine("}"); method.addMethodCloseStatement(); // The factory says which Area it belongs to, so that registering it @@ -412,15 +506,19 @@ public void createAreaElementFactoryClass(File areaFolder, AreaType area) throws areaVersion.addLine("return " + area.getVersion() + ";"); areaVersion.addMethodCloseStatement(); - addTypeSwitch(file, "createAreaElement", areaTypes, - "Creates an Element declared by the area itself."); + if (anyServiceHasTypes) { + addTypeSwitch(file, "createAreaElement", areaTypes, + "Creates an Element declared by the area itself."); - for (ServiceType service : area.getService()) { - List serviceTypes = (service.getDataTypes() == null) ? new LinkedList<>() - : collectTypes(areaName, service.getName(), - service.getDataTypes().getCompositeOrEnumeration()); - addTypeSwitch(file, "create" + service.getName() + "Element", serviceTypes, - "Creates an Element declared by the " + service.getName() + " service."); + for (Map.Entry> entry : typesByService.entrySet()) { + addTypeSwitch(file, "create" + entry.getKey().getName() + "Element", + entry.getValue(), "Creates an Element declared by the " + + entry.getKey().getName() + " service."); + } + } else if (areaSplit.isSplit()) { + // createElement() holds the jump table itself, so only the types + // that did not fit in it are left to write out + addOutOfBandMethod(file, "createAreaElement", areaSplit); } file.addClassCloseStatement(); diff --git a/apis/api-area001-v003-mal/src/main/java/org/ccsds/moims/mo/mal/MALElementsRegistry.java b/apis/api-area001-v003-mal/src/main/java/org/ccsds/moims/mo/mal/MALElementsRegistry.java index d405abd5..d982f494 100644 --- a/apis/api-area001-v003-mal/src/main/java/org/ccsds/moims/mo/mal/MALElementsRegistry.java +++ b/apis/api-area001-v003-mal/src/main/java/org/ccsds/moims/mo/mal/MALElementsRegistry.java @@ -21,6 +21,7 @@ package org.ccsds.moims.mo.mal; import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; import java.util.logging.Level; import java.util.logging.Logger; import org.ccsds.moims.mo.mal.structures.Element; @@ -42,7 +43,7 @@ public class MALElementsRegistry { * says which Area it belongs to, so nothing here can register a factory * against the wrong number or version. */ - private final List AREA_FACTORIES = new java.util.ArrayList<>(); + private final List AREA_FACTORIES = new CopyOnWriteArrayList<>(); /** * Registers a factory, so that the Elements it creates can be reached @@ -50,7 +51,14 @@ public class MALElementsRegistry { * * More than one factory can be registered for the same Area. Types whose * numbers the XML schema cannot express are written by hand, and their - * factory is registered alongside the generated one of that Area. + * factory is registered alongside the generated one of that Area. Should + * two of them answer for the same type, the one registered first is the one + * that is asked, so a factory added later cannot take a type away from the + * one that already had it. + * + * Areas are registered while the messages of the ones already registered + * are being decoded, so the list this adds to is one that can be read + * through at the same time. * * @param factory The factory that creates the Elements. */ @@ -84,9 +92,10 @@ private Element createFromAreaFactory(final long typeId) { final int serviceNumber = TypeId.serviceNumberOf(typeId); final int typeNumber = TypeId.typeNumberOf(typeId); - for (int i = 0; i < AREA_FACTORIES.size(); i++) { - AreaElementFactory factory = AREA_FACTORIES.get(i); - + // Walked in one go, over the factories that were there when this + // started: a factory registered halfway through must not be seen for + // some of this scan and not for the rest of it. + for (AreaElementFactory factory : AREA_FACTORIES) { if (factory.getAreaNumber() == areaNumber && factory.getAreaVersion() == areaVersion) { Element element = factory.createElement(serviceNumber, typeNumber); diff --git a/apis/api-area001-v003-mal/src/test/java/org/ccsds/moims/mo/mal/TestAreaElementFactory.java b/apis/api-area001-v003-mal/src/test/java/org/ccsds/moims/mo/mal/TestAreaElementFactory.java index 8284433b..79c455e4 100644 --- a/apis/api-area001-v003-mal/src/test/java/org/ccsds/moims/mo/mal/TestAreaElementFactory.java +++ b/apis/api-area001-v003-mal/src/test/java/org/ccsds/moims/mo/mal/TestAreaElementFactory.java @@ -21,6 +21,8 @@ package org.ccsds.moims.mo.mal; import org.ccsds.moims.mo.mal.structures.Blob; +import org.ccsds.moims.mo.mal.structures.HeterogeneousList; +import org.ccsds.moims.mo.mal.structures.Identifier; import org.ccsds.moims.mo.mal.structures.BlobList; import org.ccsds.moims.mo.mal.structures.Element; import org.ccsds.moims.mo.mal.structures.ElementList; @@ -28,6 +30,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; +import static org.junit.Assert.fail; import static org.junit.Assert.assertTrue; /** @@ -173,4 +176,131 @@ public void registryReachesTheFactory() throws Exception { assertEquals(typeIdOf(typeNumber), element.getTypeId().getTypeId()); } } + + /** + * Builds a Type Id without going through the TypeId constructor that takes + * the parts, which narrows the type number to a short. A type number that + * needs more than that can only be written out in full here. + */ + private static long rawTypeIdOf(int areaNumber, int areaVersion, + int serviceNumber, int typeNumber) { + return ((long) areaNumber << 48) | ((long) serviceNumber << 32) + | ((long) areaVersion << 24) | (typeNumber & 0xFFFFFFL); + } + + /** + * A Type Id of zero stands for a list that holds types of more than one + * kind, and is answered before any factory is asked. + */ + @Test + public void typeIdOfZeroIsAHeterogeneousList() throws Exception { + MALElementsRegistry registry = new MALElementsRegistry(); + registry.registerAreaFactory(factory); + assertTrue(registry.createElement(0L) instanceof HeterogeneousList); + } + + /** + * A Type Id that no registered factory answers for has to be reported, + * rather than answered with nothing for the caller to trip over later. + */ + @Test + public void aTypeIdThatNoFactoryClaimsIsReported() { + MALElementsRegistry registry = new MALElementsRegistry(); + registry.registerAreaFactory(factory); + + long[] unclaimed = new long[]{ + rawTypeIdOf(999, 1, 0, 1), // An area that is not registered + rawTypeIdOf(1, 9, 0, 1), // The MAL area, at a version that is not + rawTypeIdOf(1, 3, 77, 1), // The MAL area, at a service it has not + rawTypeIdOf(1, 3, 0, 0), // Zero is not a type number + rawTypeIdOf(1, 3, 0, 8388607), // The widest a type number can be + rawTypeIdOf(1, 3, 0, -8388607) + }; + + for (long typeId : unclaimed) { + try { + Element element = registry.createElement(typeId); + fail("Type Id " + typeId + " was answered with " + element); + } catch (NotFoundException expected) { + // This is what a Type Id that no factory claims has to give + } catch (Exception ex) { + fail("Type Id " + typeId + " gave " + ex); + } + } + } + + /** + * The type number is read over its full width. A type number written by + * hand can reach further than the XML schema lets a specification go, and + * has to arrive at the factory as it was sent. + */ + @Test + public void theWidestTypeNumbersArriveWhole() { + assertEquals(8388607, TypeId.typeNumberOf(rawTypeIdOf(1, 3, 0, 8388607))); + assertEquals(-8388607, TypeId.typeNumberOf(rawTypeIdOf(1, 3, 0, -8388607))); + assertEquals(1, TypeId.typeNumberOf(rawTypeIdOf(1, 3, 0, 1))); + assertEquals(-1010, TypeId.typeNumberOf(rawTypeIdOf(1, 3, 0, -1010))); + } + + /** + * An Area can hold more than one factory, so that types written by hand are + * reached next to the generated ones. A factory that does not know a type + * has to be asked past rather than end the search. + */ + @Test + public void anAreaCanHoldMoreThanOneFactory() throws Exception { + MALElementsRegistry registry = new MALElementsRegistry(); + registry.registerAreaFactory(factory); + registry.registerAreaFactory(new HandWrittenTypeFactory()); + + // Reached past the generated factory, which does not know this one + Element handWritten = registry.createElement(rawTypeIdOf( + MAL_AREA_NUMBER, MAL_AREA_VERSION, 0, HandWrittenTypeFactory.TYPE_NUMBER)); + assertEquals(Identifier.class, handWritten.getClass()); + + // The generated types are still reached, and are not shadowed + assertEquals(Blob.class, registry.createElement(typeIdOf(1)).getClass()); + assertEquals(BlobList.class, registry.createElement(typeIdOf(-1)).getClass()); + } + + /** + * Registering the same factory again leaves the registry as it was. Every + * route that loads an Area registers its factory, so the same one arrives + * here more than once. + */ + @Test + public void registeringTheSameFactoryAgainChangesNothing() throws Exception { + MALElementsRegistry registry = new MALElementsRegistry(); + registry.registerAreaFactory(factory); + registry.registerAreaFactory(new MALElementFactory()); + registry.registerAreaFactory(factory); + registry.registerAreaFactory(null); + + assertEquals(Blob.class, registry.createElement(typeIdOf(1)).getClass()); + } + + /** + * A factory for a type whose number is wider than the XML schema allows, + * standing for the ones the MAL/SPP testbed writes by hand. + */ + private static final class HandWrittenTypeFactory implements AreaElementFactory { + + private static final int TYPE_NUMBER = 8388607; + + @Override + public Element createElement(int serviceNumber, int typeNumber) { + return (serviceNumber == 0 && typeNumber == TYPE_NUMBER) + ? new Identifier("handWritten") : null; + } + + @Override + public int getAreaNumber() { + return MAL_AREA_NUMBER; + } + + @Override + public int getAreaVersion() { + return MAL_AREA_VERSION; + } + } } From d8fff8dbc0ce543ccce18412eb1f5b01a6c8989a Mon Sep 17 00:00:00 2001 From: Cesar Coelho Date: Mon, 3 Aug 2026 20:02:18 +0200 Subject: [PATCH 29/45] Find the factory of an Area by comparing numbers rather than asking it Every Element that was created walked the registered factories asking each one in turn which Area it belonged to. Those two questions go through an interface that several classes implement, so they could not be bound to any one of them, and answering them cost more than the switch they were there to reach: a profile of the walk put a third of the time in it. Each factory is now asked once, when it is registered, and the answer is kept beside it as a single number that holds the area number and the version together. Finding a factory is then a walk over an array of ints, which is small enough that it is folded into its caller, and only the factory that matches is called into. The factories and their numbers are held in one object that is replaced as a whole, so a walk still reads a set that cannot change underneath it while an Area is being registered on another thread. Creating the Elements of a spread of forty MAL and NMF types, against a map of live Elements as it was before the factories: a stream that carries many types is now reached 12 to 29 percent faster, while asking for one type over and over is 17 percent slower, that being the case where the map collapses into the caller. Co-Authored-By: Claude Opus 5 --- .../moims/mo/mal/MALElementsRegistry.java | 91 ++++++++++++++----- 1 file changed, 68 insertions(+), 23 deletions(-) diff --git a/apis/api-area001-v003-mal/src/main/java/org/ccsds/moims/mo/mal/MALElementsRegistry.java b/apis/api-area001-v003-mal/src/main/java/org/ccsds/moims/mo/mal/MALElementsRegistry.java index d982f494..ea18ae54 100644 --- a/apis/api-area001-v003-mal/src/main/java/org/ccsds/moims/mo/mal/MALElementsRegistry.java +++ b/apis/api-area001-v003-mal/src/main/java/org/ccsds/moims/mo/mal/MALElementsRegistry.java @@ -20,8 +20,6 @@ */ package org.ccsds.moims.mo.mal; -import java.util.List; -import java.util.concurrent.CopyOnWriteArrayList; import java.util.logging.Level; import java.util.logging.Logger; import org.ccsds.moims.mo.mal.structures.Element; @@ -37,13 +35,52 @@ public class MALElementsRegistry { /** - * The registered factories. There are a handful in total, one per Area plus - * the occasional one for types that are written by hand rather than - * generated, which is why a scan is enough and no map is needed. Each one - * says which Area it belongs to, so nothing here can register a factory - * against the wrong number or version. + * The registered factories, with the Area that each one answers for held + * beside it as a plain number. + * + * Finding the right factory is then a walk over an array of ints rather + * than a pair of calls into every factory in turn. Those calls go through + * an interface that a handful of classes implement, so they cannot be + * bound to one of them, and asking each factory which Area it belongs to + * cost more than the switch it was being asked to reach. + */ + private static final class Registered { + + /** + * The Area of each factory, as an area number and an area version + * packed into one int so that a candidate is one comparison. + */ + private final int[] areas; + + private final AreaElementFactory[] factories; + + Registered(int[] areas, AreaElementFactory[] factories) { + this.areas = areas; + this.factories = factories; + } + } + + /** + * Replaced as a whole when a factory is registered, so that a scan reads it + * once and then walks something that cannot change underneath it. Areas are + * registered while the messages of the ones already registered are being + * decoded, so this has to hold while both are happening. */ - private final List AREA_FACTORIES = new CopyOnWriteArrayList<>(); + private volatile Registered registered + = new Registered(new int[0], new AreaElementFactory[0]); + + /** + * Packs an area number and an area version into the one int that the scan + * compares. An area number is 16 bits wide and a version 8, so the two sit + * side by side without either reaching into the other. + * + * @param areaNumber The area number. + * @param areaVersion The area version. + * @return The packed value. + */ + private static int areaKeyOf(final int areaNumber, final int areaVersion) { + return (areaNumber << 8) | (areaVersion & 0xFF); + } /** * Registers a factory, so that the Elements it creates can be reached @@ -56,10 +93,6 @@ public class MALElementsRegistry { * that is asked, so a factory added later cannot take a type away from the * one that already had it. * - * Areas are registered while the messages of the ones already registered - * are being decoded, so the list this adds to is one that can be read - * through at the same time. - * * @param factory The factory that creates the Elements. */ public synchronized void registerAreaFactory(final AreaElementFactory factory) { @@ -67,13 +100,24 @@ public synchronized void registerAreaFactory(final AreaElementFactory factory) { return; } - for (AreaElementFactory registered : AREA_FACTORIES) { - if (registered.getClass() == factory.getClass()) { + final Registered current = this.registered; + + for (AreaElementFactory alreadyThere : current.factories) { + if (alreadyThere.getClass() == factory.getClass()) { return; // Already registered } } - AREA_FACTORIES.add(factory); + final int count = current.factories.length; + final int[] areas = java.util.Arrays.copyOf(current.areas, count + 1); + final AreaElementFactory[] factories + = java.util.Arrays.copyOf(current.factories, count + 1); + + // Asked once, here, rather than on every Element that is created + areas[count] = areaKeyOf(factory.getAreaNumber(), factory.getAreaVersion()); + factories[count] = factory; + + this.registered = new Registered(areas, factories); } /** @@ -87,17 +131,18 @@ private Element createFromAreaFactory(final long typeId) { // Read once, up front: a Type Id that no Area claims is the rare case, // so there is nothing to be saved by reading the last two only after a // factory has been found. - final int areaNumber = TypeId.areaNumberOf(typeId); - final int areaVersion = TypeId.areaVersionOf(typeId); + final int areaKey = areaKeyOf(TypeId.areaNumberOf(typeId), TypeId.areaVersionOf(typeId)); final int serviceNumber = TypeId.serviceNumberOf(typeId); final int typeNumber = TypeId.typeNumberOf(typeId); - // Walked in one go, over the factories that were there when this - // started: a factory registered halfway through must not be seen for - // some of this scan and not for the rest of it. - for (AreaElementFactory factory : AREA_FACTORIES) { - if (factory.getAreaNumber() == areaNumber && factory.getAreaVersion() == areaVersion) { - Element element = factory.createElement(serviceNumber, typeNumber); + // Read once, so that a factory registered halfway through is not seen + // for some of this scan and not for the rest of it. + final Registered current = this.registered; + final int[] areas = current.areas; + + for (int i = 0; i < areas.length; i++) { + if (areas[i] == areaKey) { + Element element = current.factories[i].createElement(serviceNumber, typeNumber); // An Area can hold more than one factory, so a factory that // does not know the type is asked past, not taken as an answer From 49a7433237958b99955969ca8a5fd664a6edc668 Mon Sep 17 00:00:00 2001 From: Cesar Coelho Date: Sat, 22 Aug 2026 14:57:56 +0200 Subject: [PATCH 30/45] Fix the identifiers that three prototype specifications got wrong The File Management area spells the attribute that names an area as "are" rather than "area" on four type references, so the area of the error each one points at was never given. JAXB drops an attribute it does not recognise without saying so, which is why nothing has ever reported it; the references have been reading as though they named no area at all. The Mission Data Product area gives operation number 3 to both unsubscribe and listSubscriptions in the Delivery service. Numbers have to be unique within a service, and the schema says so, so the file has never satisfied its own schema. listSubscriptions takes the next free number rather than the one it was probably meant to have, so that the operations already numbered 4 and 5 keep the numbers they have. The Basics area was a copy of the COM area that kept its identity, so both declare area COM, number 2, version 1. It was only ever a prototype and is removed. Co-Authored-By: Claude Opus 5 --- .../resources/xml/area002-v002-Basics.xml | 590 ------------------ .../xml/area020-v001-File-Management.xml | 8 +- .../xml/area051-v001-Mission-Data-Product.xml | 2 +- 3 files changed, 5 insertions(+), 595 deletions(-) delete mode 100644 xml-service-specifications/xml-ccsds-mo-prototypes/src/main/resources/xml/area002-v002-Basics.xml diff --git a/xml-service-specifications/xml-ccsds-mo-prototypes/src/main/resources/xml/area002-v002-Basics.xml b/xml-service-specifications/xml-ccsds-mo-prototypes/src/main/resources/xml/area002-v002-Basics.xml deleted file mode 100644 index 03426029..00000000 --- a/xml-service-specifications/xml-ccsds-mo-prototypes/src/main/resources/xml/area002-v002-Basics.xml +++ /dev/null @@ -1,590 +0,0 @@ - - - - The instance identifier of an object must not use the value of '0' for actual object instances as this is the wildcard value. -The related field of an object must not use the value of '0' as this is the wildcard value. -The instance identifier of the source field of an object must not use the value of '0' as this is the wildcard value. -If the MAL data type specification is being used the body of an object shall be a concrete type. -If the MAL data type specification is being used the body of an object shall not be an abstract Attribute. -If the MAL data type specification is being used the body of an object shall not be a list. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/xml-service-specifications/xml-ccsds-mo-prototypes/src/main/resources/xml/area020-v001-File-Management.xml b/xml-service-specifications/xml-ccsds-mo-prototypes/src/main/resources/xml/area020-v001-File-Management.xml index b303b3e2..9e52c3e1 100644 --- a/xml-service-specifications/xml-ccsds-mo-prototypes/src/main/resources/xml/area020-v001-File-Management.xml +++ b/xml-service-specifications/xml-ccsds-mo-prototypes/src/main/resources/xml/area020-v001-File-Management.xml @@ -31,7 +31,7 @@ File transfers that require the file to leave the file system (e.g. transfer ove - + @@ -75,7 +75,7 @@ File transfers that require the file to leave the file system (e.g. transfer ove - + @@ -119,7 +119,7 @@ File transfers that require the file to leave the file system (e.g. transfer ove - + @@ -163,7 +163,7 @@ File transfers that require the file to leave the file system (e.g. transfer ove - + diff --git a/xml-service-specifications/xml-ccsds-mo-prototypes/src/main/resources/xml/area051-v001-Mission-Data-Product.xml b/xml-service-specifications/xml-ccsds-mo-prototypes/src/main/resources/xml/area051-v001-Mission-Data-Product.xml index 812b1595..786f580d 100644 --- a/xml-service-specifications/xml-ccsds-mo-prototypes/src/main/resources/xml/area051-v001-Mission-Data-Product.xml +++ b/xml-service-specifications/xml-ccsds-mo-prototypes/src/main/resources/xml/area051-v001-Mission-Data-Product.xml @@ -110,7 +110,7 @@ - From 4bf2d84b8b05535a72ceb7321b5927557ddaa656 Mon Sep 17 00:00:00 2001 From: Cesar Coelho Date: Sat, 22 Aug 2026 15:06:23 +0200 Subject: [PATCH 31/45] Give the Subscription structure a short form of its own The Mission Data Product area gives short form part 80 to both the Frequency and the Subscription structures. A short form has to be unique within an area, and the schema says so, so the file did not satisfy it. The duplicate was hidden until now behind the operation numbers that were fixed alongside it, because validation reports the first breach it meets and stops. Subscription is declared last, and the short forms of this area ascend in declaration order, so it is the one that moves. It takes 81, the next free number, rather than a number that would make the ones already given out move with it. Co-Authored-By: Claude Opus 5 --- .../main/resources/xml/area051-v001-Mission-Data-Product.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xml-service-specifications/xml-ccsds-mo-prototypes/src/main/resources/xml/area051-v001-Mission-Data-Product.xml b/xml-service-specifications/xml-ccsds-mo-prototypes/src/main/resources/xml/area051-v001-Mission-Data-Product.xml index 786f580d..d4e2bd63 100644 --- a/xml-service-specifications/xml-ccsds-mo-prototypes/src/main/resources/xml/area051-v001-Mission-Data-Product.xml +++ b/xml-service-specifications/xml-ccsds-mo-prototypes/src/main/resources/xml/area051-v001-Mission-Data-Product.xml @@ -477,7 +477,7 @@ - + From db0ccc336def3f9c80b2ac2f5f1473edaa7d5633 Mon Sep 17 00:00:00 2001 From: Cesar Coelho Date: Sat, 22 Aug 2026 15:26:43 +0200 Subject: [PATCH 32/45] Name the attributes the Mission Data Product area was aliasing The area declared ProductToken, ProductPath and SubscriptionId as composites that extend String, URI and Identifier, each with no fields of its own. They were not structures but attempts at naming an attribute, and the MAL data model has no way to say that: Composite and Attribute are separate branches of the type hierarchy, and the set of attributes is closed by the MAL area. The schema could not object, because it types the extends element as a plain reference and only its documentation says the target is meant to be a Composite. The document generator could, and did: it looks a super type up among the composites, finds nothing, and abandons the whole area. ProductToken is the first type declared, so the area has been producing no document at all, while the run that produced nothing reported success. The three are removed and the eighteen fields that used them now name String, URI and Identifier directly, which is what they carried anyway. Co-Authored-By: Claude Opus 5 --- .../xml/area051-v001-Mission-Data-Product.xml | 54 ++++++------------- 1 file changed, 16 insertions(+), 38 deletions(-) diff --git a/xml-service-specifications/xml-ccsds-mo-prototypes/src/main/resources/xml/area051-v001-Mission-Data-Product.xml b/xml-service-specifications/xml-ccsds-mo-prototypes/src/main/resources/xml/area051-v001-Mission-Data-Product.xml index d4e2bd63..94147900 100644 --- a/xml-service-specifications/xml-ccsds-mo-prototypes/src/main/resources/xml/area051-v001-Mission-Data-Product.xml +++ b/xml-service-specifications/xml-ccsds-mo-prototypes/src/main/resources/xml/area051-v001-Mission-Data-Product.xml @@ -11,7 +11,7 @@ - + @@ -35,7 +35,7 @@ - + @@ -70,7 +70,7 @@ - + @@ -96,7 +96,7 @@ - + @@ -132,7 +132,7 @@ - + @@ -171,7 +171,7 @@ - + - + - + @@ -215,7 +215,7 @@ - + @@ -236,7 +236,7 @@ - + @@ -262,7 +262,7 @@ - + @@ -333,7 +333,7 @@ - + @@ -353,35 +353,13 @@ - - - - - - - - - - - - - - - - - - + @@ -393,7 +371,7 @@ - + @@ -441,7 +419,7 @@ - + @@ -483,7 +461,7 @@ - + Date: Sat, 22 Aug 2026 15:28:26 +0200 Subject: [PATCH 33/45] Load every specification before generating any document The document generator was given each specification and asked to write its document in the same breath. An area may name a type that another area declares, and a type is only known once the area declaring it has been loaded, so a reference across areas resolved only when the file declaring it happened to be read first. The order the files are read in is the order the file system lists them. The Mission Data Product area names a type of the COM area and is listed before it, so it found nothing and abandoned the area. The run that produced no document for it still reported success, because each file is caught on its own. The specifications are now all loaded, and only then generated, which is what the Maven plugin has always done. Thirteen prototype areas produce a document where twelve did before. Co-Authored-By: Claude Opus 5 --- .../java/esa/mo/navigator/AppGenerateDocx.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/tooling/mo-navigator/src/main/java/esa/mo/navigator/AppGenerateDocx.java b/tooling/mo-navigator/src/main/java/esa/mo/navigator/AppGenerateDocx.java index 812e6940..d9a6dbe9 100644 --- a/tooling/mo-navigator/src/main/java/esa/mo/navigator/AppGenerateDocx.java +++ b/tooling/mo-navigator/src/main/java/esa/mo/navigator/AppGenerateDocx.java @@ -70,9 +70,24 @@ public static void main(String[] args) { File xmlRefDirectory = new File(sourFolder); List specs = XmlHelper.loadSpecifications(xmlRefDirectory); + // Every specification is loaded before any is generated. An area may name a + // type of another area, and the type is only known once the area that + // declares it has been loaded, so generating while still loading resolves a + // reference only when the file that declares it happens to be read first. + // The order files are read in is the order the file system lists them, which + // is why the Mission Data Product area could not find a type of the COM area. for (XmlSpecification spec : specs) { try { generator.loadXML(spec); + } catch (Exception ex) { + Logger.getLogger(AppGenerateDocx.class.getName()).log(Level.SEVERE, + "Exception thrown while loading the XML file: " + + spec.getFile().getPath(), ex); + } + } + + for (XmlSpecification spec : specs) { + try { generator.generate(destFolder, spec, spec.getRootElement()); } catch (Exception ex) { Logger.getLogger(AppGenerateDocx.class.getName()).log(Level.SEVERE, From ff95a1eb904defc014226d12e23c0744890f0b37 Mon Sep 17 00:00:00 2001 From: Cesar Coelho Date: Sat, 22 Aug 2026 16:00:34 +0200 Subject: [PATCH 34/45] Remove the Edge Monitor and Control prototype The area was a prototype that nothing builds and nothing refers to. No pom names it, no workflow names it, and no other specification names a type or an error of it; the only thing it produced was a document of its own. It also declared itself as area MC, taking the name the Monitor and Control area already has under number 4. Nothing resolved the two the wrong way round, because nothing referred to either of them by name from outside, but a reference carries no area number and so could not have said which was meant. Co-Authored-By: Claude Opus 5 --- .../area104-v001-Edge-Monitor-and-Control.xml | 1166 ----------------- 1 file changed, 1166 deletions(-) delete mode 100644 xml-service-specifications/xml-ccsds-mo-prototypes/src/main/resources/xml/area104-v001-Edge-Monitor-and-Control.xml diff --git a/xml-service-specifications/xml-ccsds-mo-prototypes/src/main/resources/xml/area104-v001-Edge-Monitor-and-Control.xml b/xml-service-specifications/xml-ccsds-mo-prototypes/src/main/resources/xml/area104-v001-Edge-Monitor-and-Control.xml deleted file mode 100644 index bf841e02..00000000 --- a/xml-service-specifications/xml-ccsds-mo-prototypes/src/main/resources/xml/area104-v001-Edge-Monitor-and-Control.xml +++ /dev/null @@ -1,1166 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file From b28cf64391ef52f0e7bbb92811269f3fe0fa1629 Mon Sep 17 00:00:00 2001 From: Cesar Coelho Date: Sat, 22 Aug 2026 20:24:10 +0200 Subject: [PATCH 35/45] Add the api-generator-lib, which will replace the three generators The existing generators are built on a model that xjc derives from the XSD and that external libraries populate, so the shape of the specifications is decided outside this repository and everything downstream inherits it. This library carries its own model of areas, services, operations and fields, reads and writes the XML itself, and generates from the model rather than from a parse tree. The Java generator is complete. It is held against the output of the existing one file by file, and reproduces all 950 files of the seven api modules byte for byte, plus the 546 files of the four NanoSat MO Framework modules, whose specifications this repository has never generated from. The module is deliberately outside the reactor for now: the existing generators continue to build the APIs throughout 14.x, and the two are swapped over at v15.0. golden.sh captures and compares the output of the two in the meantime; the captured baseline is regenerable and stays out of version control. DESIGN.md records the model, the four invariants it holds to, and a log of the decisions behind them. Co-Authored-By: Claude Opus 5 --- api-generator/api-generator-lib/DESIGN.md | 1666 +++++++++++++++++ api-generator/api-generator-lib/pom.xml | 109 ++ .../mo/apigen/exporters/ExportException.java | 37 + .../esa/mo/apigen/exporters/Exporter.java | 44 + .../exporters/xml/SchemaValidation.java | 145 ++ .../mo/apigen/exporters/xml/XmlExporter.java | 444 +++++ .../mo/apigen/exporters/xml/XmlWriter.java | 150 ++ .../esa/mo/apigen/generators/Generator.java | 59 + .../generators/java/JavaClassBuilder.java | 196 ++ .../apigen/generators/java/JavaComment.java | 124 ++ .../generators/java/JavaFieldBuilder.java | 190 ++ .../apigen/generators/java/JavaGenerator.java | 315 ++++ .../generators/java/JavaMethodBuilder.java | 378 ++++ .../mo/apigen/generators/java/JavaNaming.java | 85 + .../mo/apigen/generators/java/JavaSource.java | 85 + .../apigen/generators/java/JavaTypeName.java | 210 +++ .../mo/apigen/generators/java/JavaTypes.java | 127 ++ .../mo/apigen/generators/java/JumpTable.java | 177 ++ .../mo/apigen/generators/java/ShortForm.java | 76 + .../java/writers/CompositeWriter.java | 403 ++++ .../java/writers/ConsumerAdapterWriter.java | 470 +++++ .../java/writers/ConsumerStubWriter.java | 431 +++++ .../java/writers/ElementFactoryWriter.java | 318 ++++ .../java/writers/EnumerationWriter.java | 189 ++ .../java/writers/ExceptionWriter.java | 105 ++ .../generators/java/writers/HelperWriter.java | 157 ++ .../generators/java/writers/ListWriter.java | 200 ++ .../java/writers/MultiReturnBodyWriter.java | 143 ++ .../java/writers/ProviderHandlerWriter.java | 194 ++ .../ProviderInheritanceSkeletonWriter.java | 373 ++++ .../writers/ProviderInteractionWriter.java | 192 ++ .../java/writers/ProviderPublisherWriter.java | 216 +++ .../java/writers/ProviderSkeletonWriter.java | 87 + .../java/writers/ServiceInfoWriter.java | 432 +++++ .../java/writers/SubscriptionKeysWriter.java | 181 ++ .../mo/apigen/importers/ImportException.java | 42 + .../esa/mo/apigen/importers/Importer.java | 45 + .../mo/apigen/importers/xml/StaxCursor.java | 261 +++ .../mo/apigen/importers/xml/XmlImporter.java | 545 ++++++ .../esa/mo/apigen/importers/xml/XmlNames.java | 56 + .../main/java/esa/mo/apigen/link/Linker.java | 228 +++ .../main/java/esa/mo/apigen/model/Area.java | 148 ++ .../java/esa/mo/apigen/model/AreaKey.java | 92 + .../esa/mo/apigen/model/CapabilitySet.java | 87 + .../esa/mo/apigen/model/ErrorDefinition.java | 81 + .../esa/mo/apigen/model/ErrorReference.java | 74 + .../main/java/esa/mo/apigen/model/Field.java | 81 + .../mo/apigen/model/InteractionPattern.java | 63 + .../esa/mo/apigen/model/InteractionStage.java | 82 + .../java/esa/mo/apigen/model/MOModel.java | 280 +++ .../java/esa/mo/apigen/model/MessageBody.java | 52 + .../java/esa/mo/apigen/model/Operation.java | 148 ++ .../esa/mo/apigen/model/SchemaVersion.java | 84 + .../java/esa/mo/apigen/model/Service.java | 171 ++ .../esa/mo/apigen/model/SourceLocation.java | 69 + .../java/esa/mo/apigen/model/SourceRef.java | 61 + .../esa/mo/apigen/model/Specification.java | 92 + .../esa/mo/apigen/model/com/COMFeatures.java | 101 + .../esa/mo/apigen/model/com/COMObject.java | 106 ++ .../esa/mo/apigen/model/com/ObjectLink.java | 62 + .../mo/apigen/model/com/ObjectReference.java | 102 + .../esa/mo/apigen/model/docs/Diagram.java | 68 + .../esa/mo/apigen/model/docs/DocSection.java | 84 + .../mo/apigen/model/docs/Documentation.java | 48 + .../esa/mo/apigen/model/docs/Requirement.java | 74 + .../mo/apigen/model/types/AttributeType.java | 42 + .../mo/apigen/model/types/CompositeType.java | 77 + .../apigen/model/types/EnumerationItem.java | 74 + .../apigen/model/types/EnumerationType.java | 50 + .../apigen/model/types/FundamentalType.java | 46 + .../mo/apigen/model/types/TypeDefinition.java | 96 + .../esa/mo/apigen/model/types/TypeRef.java | 167 ++ .../esa/mo/apigen/validation/Severity.java | 38 + .../mo/apigen/validation/ValidationIssue.java | 70 + .../apigen/validation/ValidationResult.java | 89 + .../esa/mo/apigen/validation/Validator.java | 425 +++++ .../apigen/exporters/xml/ModelComparison.java | 293 +++ .../exporters/xml/XmlRoundTripTest.java | 162 ++ .../mo/apigen/generators/java/GoldenTree.java | 212 +++ .../generators/java/JavaClassBuilderTest.java | 146 ++ .../generators/java/JavaFieldBuilderTest.java | 135 ++ .../java/JavaGeneratorGoldenTest.java | 172 ++ .../java/JavaMethodBuilderTest.java | 229 +++ .../apigen/generators/java/JumpTableTest.java | 242 +++ .../esa/mo/apigen/importers/xml/Corpus.java | 122 ++ .../importers/xml/XmlImporterCorpusTest.java | 315 ++++ .../java/esa/mo/apigen/model/AreaKeyTest.java | 54 + .../apigen/model/InteractionPatternTest.java | 46 + .../java/esa/mo/apigen/model/MOModelTest.java | 126 ++ .../esa/mo/apigen/model/ModelFixtures.java | 88 + .../mo/apigen/model/TypeDefinitionTest.java | 60 + .../java/esa/mo/apigen/model/TypeRefTest.java | 77 + .../validation/ValidatorCorpusTest.java | 266 +++ .../mo/apigen/validation/ValidatorTest.java | 193 ++ api-generator/golden/.gitignore | 2 + api-generator/golden/README.md | 61 + api-generator/golden/golden.sh | 174 ++ api-generator/golden/intended-differences.txt | 16 + 98 files changed, 16560 insertions(+) create mode 100644 api-generator/api-generator-lib/DESIGN.md create mode 100644 api-generator/api-generator-lib/pom.xml create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/exporters/ExportException.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/exporters/Exporter.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/exporters/xml/SchemaValidation.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/exporters/xml/XmlExporter.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/exporters/xml/XmlWriter.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/Generator.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/JavaClassBuilder.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/JavaComment.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/JavaFieldBuilder.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/JavaGenerator.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/JavaMethodBuilder.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/JavaNaming.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/JavaSource.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/JavaTypeName.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/JavaTypes.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/JumpTable.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/ShortForm.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/writers/CompositeWriter.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/writers/ConsumerAdapterWriter.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/writers/ConsumerStubWriter.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/writers/ElementFactoryWriter.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/writers/EnumerationWriter.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/writers/ExceptionWriter.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/writers/HelperWriter.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/writers/ListWriter.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/writers/MultiReturnBodyWriter.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/writers/ProviderHandlerWriter.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/writers/ProviderInheritanceSkeletonWriter.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/writers/ProviderInteractionWriter.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/writers/ProviderPublisherWriter.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/writers/ProviderSkeletonWriter.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/writers/ServiceInfoWriter.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/writers/SubscriptionKeysWriter.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/importers/ImportException.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/importers/Importer.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/importers/xml/StaxCursor.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/importers/xml/XmlImporter.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/importers/xml/XmlNames.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/link/Linker.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/Area.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/AreaKey.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/CapabilitySet.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/ErrorDefinition.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/ErrorReference.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/Field.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/InteractionPattern.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/InteractionStage.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/MOModel.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/MessageBody.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/Operation.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/SchemaVersion.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/Service.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/SourceLocation.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/SourceRef.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/Specification.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/com/COMFeatures.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/com/COMObject.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/com/ObjectLink.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/com/ObjectReference.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/docs/Diagram.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/docs/DocSection.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/docs/Documentation.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/docs/Requirement.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/types/AttributeType.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/types/CompositeType.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/types/EnumerationItem.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/types/EnumerationType.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/types/FundamentalType.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/types/TypeDefinition.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/types/TypeRef.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/validation/Severity.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/validation/ValidationIssue.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/validation/ValidationResult.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/validation/Validator.java create mode 100644 api-generator/api-generator-lib/src/test/java/esa/mo/apigen/exporters/xml/ModelComparison.java create mode 100644 api-generator/api-generator-lib/src/test/java/esa/mo/apigen/exporters/xml/XmlRoundTripTest.java create mode 100644 api-generator/api-generator-lib/src/test/java/esa/mo/apigen/generators/java/GoldenTree.java create mode 100644 api-generator/api-generator-lib/src/test/java/esa/mo/apigen/generators/java/JavaClassBuilderTest.java create mode 100644 api-generator/api-generator-lib/src/test/java/esa/mo/apigen/generators/java/JavaFieldBuilderTest.java create mode 100644 api-generator/api-generator-lib/src/test/java/esa/mo/apigen/generators/java/JavaGeneratorGoldenTest.java create mode 100644 api-generator/api-generator-lib/src/test/java/esa/mo/apigen/generators/java/JavaMethodBuilderTest.java create mode 100644 api-generator/api-generator-lib/src/test/java/esa/mo/apigen/generators/java/JumpTableTest.java create mode 100644 api-generator/api-generator-lib/src/test/java/esa/mo/apigen/importers/xml/Corpus.java create mode 100644 api-generator/api-generator-lib/src/test/java/esa/mo/apigen/importers/xml/XmlImporterCorpusTest.java create mode 100644 api-generator/api-generator-lib/src/test/java/esa/mo/apigen/model/AreaKeyTest.java create mode 100644 api-generator/api-generator-lib/src/test/java/esa/mo/apigen/model/InteractionPatternTest.java create mode 100644 api-generator/api-generator-lib/src/test/java/esa/mo/apigen/model/MOModelTest.java create mode 100644 api-generator/api-generator-lib/src/test/java/esa/mo/apigen/model/ModelFixtures.java create mode 100644 api-generator/api-generator-lib/src/test/java/esa/mo/apigen/model/TypeDefinitionTest.java create mode 100644 api-generator/api-generator-lib/src/test/java/esa/mo/apigen/model/TypeRefTest.java create mode 100644 api-generator/api-generator-lib/src/test/java/esa/mo/apigen/validation/ValidatorCorpusTest.java create mode 100644 api-generator/api-generator-lib/src/test/java/esa/mo/apigen/validation/ValidatorTest.java create mode 100644 api-generator/golden/.gitignore create mode 100644 api-generator/golden/README.md create mode 100755 api-generator/golden/golden.sh create mode 100644 api-generator/golden/intended-differences.txt diff --git a/api-generator/api-generator-lib/DESIGN.md b/api-generator/api-generator-lib/DESIGN.md new file mode 100644 index 00000000..52a9e76c --- /dev/null +++ b/api-generator/api-generator-lib/DESIGN.md @@ -0,0 +1,1666 @@ +# api-generator-lib — Design + +Status: **proposal** · New module: 14.x · Cut-over: **v15.0** + +`api-generator-lib` is built and matured **alongside** `generator-interfaces`, `generator-java` and +`generator-docs`, which stay in place and keep driving the build throughout 14.x. The three old +modules are removed only at the v15.0 cut-over (§10.3). Nothing in 14.x depends on the new library +being finished. + +## 1. Purpose + +Introduce a single library, `api-generator-lib`, holding **our own data model** of MO service +specifications, with pluggable importers, exporters and generators around it: + +```mermaid +flowchart LR + XML[".xml
ServiceSchema"] -->|import| M(("MO model")) + TXT[".mospec
MOSpec text"] -->|import| M + M -->|export| XML2[".xml"] + M -->|export| TXT2[".mospec"] + M -->|generate| J["Java API"] + M -->|generate| D["docx + svg"] +``` + +The model is the centre. Formats and outputs are peripheral and independently replaceable. + +## 2. What is wrong today + +The current generators do not have a data model of their own. They operate directly on JAXB +classes generated by `xjc` from `ServiceSchema-v003-backwards-compatible-hybrid.xsd` at build +time, and those classes are populated either by JAXB unmarshalling or by a third-party library. +Concretely: + +| Symptom | Evidence | +| --- | --- | +| The model is a build artifact | `generator-interfaces/pom.xml` runs `jaxb2-maven-plugin:xjc` twice, to `esa.mo.xsd` and `w3c.xsd`. The classes exist only in `target/`. | +| The model shape is dictated by XSD | `OperationType` subclasses per interaction pattern, `getSendIPOrSubmitIPOrRequestIP()`, `JAXBElement` wrappers, `getAny()` lists. | +| A second, derived model exists to compensate | `OperationSummary`, `ServiceSummary`, `FieldInfo`, `CompositeField`, `TypeKey` — built by walking the JAXB tree, then passed to the generators instead of it. | +| Target-language data sits in the "neutral" layer | `GeneratorBase` owns `AttributeTypeDetails`, `NativeTypeDetails`, package bindings — all Java-specific. | +| A third copy of the model arrives with MOSDL | `mosdl-0.1.1.jar` ships its own `ServiceSchema.xsd`, `COMSchema.xsd`, `bindings.xjb` and `org.ccsds.schema.serviceschema.*` classes — an older, divergent snapshot of the same schema. | +| Format hacks patch over the mismatch | `XmlSpecification.modifyFileToBeBackwardsCompatible()` string-replaces `ServiceSchema-v003` → `ServiceSchema` before parsing. `ParserMOSDL.parseMOSDL()` string-replaces `/**` → `"""` before parsing. | + +Scale of the code involved: ~15.3k lines across the three modules, the largest units being +`GeneratorLangs` (1754), `GeneratorDocx` (1176), `GeneratorSvg` (1155), `JavaConsumer` (961); +plus `MosdlSpecLoader` (1247) and `GeneratorMOSDL` (972) vendored into `mo-navigator`. + +## 3. Module layout + +``` +api-generator/ +├── api-generator-lib/ NEW — model, all import/export, all generators +├── api-generator-maven-plugin/ kept — thin Mojo, drives both paths during 14.x +├── generator-interfaces/ kept through 14.x, deleted at v15.0 +├── generator-java/ kept through 14.x, deleted at v15.0 +└── generator-docs/ kept through 14.x, deleted at v15.0 +``` + +**One new module, not several.** Model, XML, MOSpec, Java, docx and svg all live in +`api-generator-lib`. Splitting the text format into its own artifact was considered and rejected: +the only argument for it was isolating a parser dependency, and since the MOSpec parser is +hand-written (§7.2) there is no dependency to isolate. One library is the point of the exercise. + +All five modules are in the reactor at once during 14.x. What makes that painless is the new root +package `esa.mo.apigen` (below) — no class, package or artifact name collides with the old modules, +so both can sit on the same classpath. + +`parent/pom.xml:367` keeps its `generator-java` dependency throughout 14.x. Swapping it for +`api-generator-lib` **is** the cut-over and happens once, in v15.0. + +### Running both in parallel + +Throughout 14.x the new path can be **exercised end to end** — up to and including building every +`apis/*` module through the new library, compiling the result and running the full test suite — +while the **default stays the old generators**. A clean checkout, and every release cut from 14.x, +builds exactly as it does today. Flipping that default is the cut-over, and it happens once, at +v15.0 (§10.3). + +The plugin already selects a generator by short name, so the new generators register under distinct +names. Making the choice a property turns a per-module edit into a whole-build switch — +`parent/pom.xml:356` currently hardcodes it: + +```xml + + ${esa.stubgen.generator} + +``` + +with `esa.stubgen.generator` defaulting to `Java` (the old path) and a profile selecting the new +one. Three ways to exercise it then fall out of the same mechanism: + +- **one module** — override the property in that module's pom, for a first pilot; +- **the whole build** — `mvn -Pnew-generator install`, which is what CI runs as a second job; +- **both, compared** — build each way and diff the two `generated-sources/stub` trees, which is the + golden-tree check (§10.1) applied to a live build rather than a stored snapshot. + +That last one is the strongest form of the parallel-run contract, and it is why the two +implementations coexisting is worth the duplication rather than merely tolerable. + +Cost to accept for the duration: fixes made to the old generators must be mirrored into the new +ones, or the difference consciously accepted. Running both in CI is what keeps that honest — a +change to either side that moves the output shows up as a diff on the next build. + +**Dependencies:** `api-generator-lib` has **zero** third-party dependencies — the model is plain +Java, XML I/O uses StAX from the JDK, the MOSpec parser is hand-written (§7.2), and docx/svg output +is written as text. This removes `jaxb-api`, `jaxb-runtime`, `activation`, `reflections`, +`maven-plugin-api`, `de.dlr.gsoc.mcds:mosdl` and both `xjc` executions. Keeping the library +dependency-free is what makes putting everything in it cost nothing. + +`api-generator-maven-plugin` stays a separate module — it is the Maven binding, not part of the +library, and it must go on depending on the old generators throughout 14.x. + +**Java level: 1.8**, matching `parent/pom.xml`. No records, no sealed types, no `var`. The Maven +plugin has to run under whatever JDK a consumer builds with, so raising the level here would raise +the floor for everyone building the project. Revisit separately from this work. + +The build-time XSD download from `xml-ccsds-mo-standards` / `-prototypes` stays, but its purpose +changes completely: the schemas are copied in as **resources for validating output** (§6.1), not +fed to `xjc` to generate the model. Nothing is code-generated from them any more. + +### Package layout + +``` +esa.mo.apigen +├── model/ Specification, MOModel, Area, Service, CapabilitySet, +│ Operation, MessageBody, Field, ErrorDefinition, ErrorReference +│ ├── types/ TypeDefinition → Fundamental|Attribute|Composite|Enumeration, TypeRef +│ ├── com/ COMFeatures, COMObject, ObjectReference +│ └── docs/ Documentation, Diagram +├── validation/ Validator, ValidationIssue, SourceLocation +├── importers/ Importer (SPI) +│ ├── xml/ XmlImporter +│ └── mospec/ MOSpecImporter, MOSpecLexer, MOSpecParser +├── exporters/ Exporter (SPI) +│ ├── xml/ XmlExporter +│ └── mospec/ MOSpecExporter, SourceFormatter +└── generators/ Generator (SPI), java/, docx/, svg/ +``` + +A new root package (`esa.mo.apigen`, not `esa.mo.tools.stubgen`) so old and new coexist during +migration. + +### Four invariants + +1. **`model/` imports nothing but `java.*`.** No JAXB, no StAX, no ANTLR. Importers own their + parsing technology; nothing of it escapes into the model. +2. **No target-language data in the model.** `AttributeTypeDetails`, `NativeTypeDetails`, package + bindings and reserved words move into `generators/java/`. +3. **Import is lenient; validation is separate.** Importers record a `SourceLocation` on every + element and never throw on semantic problems. `Validator` reports issues with locations. This is + what makes the editor's lax mode fall out of the design rather than being a special path. +4. **There is no configuration.** The working assumption is that none is needed. If a real need + appears later, an option gets added then, for that need. + +The fourth is not a matter of taste. The existing plugin exposes **fourteen** options — +`generateStructures`, `generateCOM`, `forceGeneration`, `packageBindings`, `xsdRefDirectory` and the +nine `extraProperties` keys (§5.2) — and **every one of them sits at its default in every pom in +this repository**. A pom is written once when a service is added and then never touched again, so +each option is pure surface: something to document, thread through five call signatures, test, and +keep working, in exchange for behaviour nobody has ever selected. + +Removing them is provably safe rather than a judgement call. The golden tree (§10.1) was produced +with exactly those defaults, so writing each default into the code is byte-for-byte +output-preserving, and the harness verifies it. + +What remains are **arguments, not options**: where the specifications are, where the output goes, +which of them are generation targets rather than references, and which generator to run. A caller +has to supply those or there is nothing to do; none of them selects between behaviours. So the +library has no configuration surface at all — no config object, no properties map, no `init` phase. + +This is the same reasoning as §8.1 on adding a target language. Both resist generalising ahead of a +real case, because each generalisation made in advance is a guess, and the current code is what the +guesses accumulated into. Adding an option later, once someone actually needs it, is a small and +well-informed change; carrying fourteen that nobody needs is a permanent tax. + +## 4. The data model + +```java +Specification { List areas; // one file; today always exactly one area, + SchemaVersion schemaVersion; // but the schema permits several — keep the list + String comment; // + SourceRef source; } + +MOModel { // all loaded specs + index + List specifications; + TypeDefinition resolve(TypeRef); // self-contained — see §4.1 + COMObject resolve(ObjectReference); + Area findArea(AreaKey key); // (name, number, version) +} + +Area { int number, version; String name, comment; + Specification specification; // back-reference + List services; List dataTypes; + List errors; Documentation documentation; } + +Service { int number; String name, comment; + Area area; // back-reference + List capabilitySets; + List dataTypes; // v001 only ⟵ §4.5 + List errors; // v001 only ⟵ §4.5 + COMFeatures com; Documentation documentation; } + +CapabilitySet { int number; String comment; List operations; } + +Operation { String name; int number; String comment; + boolean supportInReplay; // v001 only ⟵ §4.5 + InteractionPattern pattern; // SEND … PUBSUB + Map messages; // SUBSCRIPTION_KEYS is v003 only + List errors; + Documentation documentation; // v003 only ⟵ §4.5 + CapabilitySet parent; } + +MessageBody { String comment; List fields; } +Field { String name, comment; boolean canBeNull; TypeRef type; } + +TypeRef { String area; int areaVersion; // version filled in at import — §4.1 + String service; // v001 only ⟵ §4.5 + String name; + boolean isList; + boolean isObjectRef; } // v003 only ⟵ §4.5 (value object) +``` + +The model is the **union of the two schema versions** (§4.5); fields marked above exist in only +one. Nothing is conditional at the type level — a v003 model simply leaves `supportInReplay` at its +default — but the exporter refuses to write a field the target version does not have, rather than +dropping it. + +`Operation` carrying its own body is the change that removes `OperationSummary`, `ServiceSummary` +and `FieldInfo` — today's derived shadow model. `TypeRef` with proper `equals`/`hashCode` subsumes +`TypeKey`. Back-references (`Service.getArea()`) remove the parameter tunnelling that produces +signatures like `processService(File, AreaType, ServiceType, …)`. + +**The model captures what the specifications say, and nothing about what anyone intends to do with +them.** In particular there is no "is this a generation target" flag anywhere in §4. A build loads +more specifications than it generates — `apis/api-area003-v001-common` declares Common as its +target and MAL and COM as references: + +```xml +**/area003-v001-Common.xml +**/area001-v003-MAL.xml, **/area002-v001-COM.xml +``` + +Common needs MAL loaded so `MAL::Identifier` resolves, but must not emit MAL's Java classes — those +already ship in the `api-area001-v003-mal` artifact it depends on, and generating them again puts +the same classes on the classpath twice. + +But that is a fact about *this build*, not about the file: the same `area001-v003-MAL.xml` is a +reference here and the target in `apis/api-area001-v003-mal`. Recording it on `Specification` would +make two builds produce different models from identical input, and would add a field that neither +format can represent. So the model holds every loaded specification identically, all imported, +linked and validated the same way, and **the caller says what to generate** by passing the target +areas to `Generator.generate` (§5.2). + +`Specification.areas` stays a list even though every file in the corpus contains exactly one area. +The schema allows more, and multi-area files are considered a live possibility — so nothing may +assume one. For MOSpec export that means a multi-area specification produces one `.mospec` per +area into the output directory (§5.2). + +### 4.1 Area identity and version resolution + +Areas already carry a `version` attribute (``). What +*cross-area type references* lack is any version at all: + +```xml + + + + +``` + +So `` does not say which MAL. The missing information is supplied +by the **referencing file's schema namespace**, which every specification in the corpus declares: + +```xml + +``` + +`Specification.schemaVersion` carries which schema the file conforms to. That governs which +constructs are legal in it (§4.5), and it is also what a MAL reference resolves against. + +**A reference to the MAL means the MAL of the referring specification's own generation.** +That is the one thing in a file which says so: the namespace it declares. A document in the +`ServiceSchema` namespace is written against MAL 1 and one in `ServiceSchema-v003` against MAL 3, +and everything in it follows — v001 raises `UNKNOWN`, v003 raises `Unknown`, and the two carry +different numbers as well as different names, because v001 read errors as codes and v003 reads them +as exceptions. Pair a specification with the MAL of its generation and every reference in it +resolves; pair it with the other and none of the renamed errors does. + +Any other area is taken to be whichever version of it is loaded, there being nothing in a reference +to say otherwise. If two versions of such an area are loaded the reference is genuinely ambiguous, +and the validator reports it against the referencing element. + +The six specifications still on the v001 schema are nonetheless **built** against MAL v3, because +`api-area001-v003-mal` is the only MAL with a Java API. That is a fact about the build rather than +about any file, so the validator states it once for each specification (§9) instead of once for +every name that does not match. + +**The version is written into the `TypeRef` at import**, not supplied at every lookup — the importer +fills in `areaVersion` from the generation above, or from the loaded area, as it reads each +reference. + +Doing it at import rather than at lookup matters for three reasons: + +- `TypeRef` is a value object used as a map key. If the version lived outside it, + `MAL::Blob`-from-v1 and `MAL::Blob`-from-v3 would compare **equal** while resolving to different + definitions — a latent bug in anything keyed by `TypeRef`. +- `TypeRef` is carried by every field, message body, `extends` clause and error extra-information + element. Threading a `Specification from` through every resolution call is the same parameter + tunnelling this design removes elsewhere. +- Resolution then belongs to a **link step**, run as part of validation (§5.1): after it, every + reference in the model is resolved and the model is fully immutable, which is what §8.2's + parallelism relies on. Generators never call `resolve` at all — they follow an already-linked + reference. + +The exporter writes the unversioned form back, since the schema has no version attribute on a type +reference; nothing is lost, because the version is recoverable from the specification's own schema +version on the next import. + +This is also what turns `XmlSpecification.modifyFileToBeBackwardsCompatible()` from a hack into +data: the namespace stops being something to string-replace away and becomes a field. + +**Area identity is not unique, and the model must say so rather than silently overwrite.** Three +real collisions exist in `xml-service-specifications` today: + +| Collision | Files | +| --- | --- | +| Identical `name="COM" number="2" version="1"` on two different specs | `area002-v001-COM.xml`, `area002-v002-Basics.xml` | +| Same number 9, different names — `MPD` vs `distribution` | `area009-v001-…`, `area052-v001-…` | +| Same name `MC`, different numbers — 4 vs 104 | `area004-v001-…`, `area104-v001-…` | + +None of these is reachable today: each `apis/*` module names the specifications it loads explicitly +— at most a target plus two references — and none of the three colliding files is referenced by any +module. But a `Map` keyed on area name, which is what the current registry effectively does, would +resolve a future pairing by last-one-wins and silently. `MOModel` therefore keys on +`AreaKey(name, number, version)` and reports a conflicting identity as a `WARNING` naming both +source files (§5.3). + +`area002-v002-Basics.xml` is a separate matter: it declares `name="COM" number="2" version="1"`, +identical to `area002-v001-COM.xml`, because it began as a copy of it. Nothing references it. It is +a candidate for deletion rather than something the validator needs to accommodate. + +### 4.2 Where the MAL attribute types come from + +Today there are two sources of truth. `GeneratorJava` hardcodes all nineteen: + +```java +addAttributeType(StdStrings.MAL, StdStrings.BLOB, false, "Blob", ""); +addAttributeType(StdStrings.MAL, StdStrings.BOOLEAN, true, "Boolean", "Boolean.FALSE"); +``` + +while `area001-*-MAL.xml` declares the same types as `` elements — and the two are +merged into one registry, so it is not obvious which one is authoritative. + +The split follows §3's second invariant. The **model** takes the attribute types from the loaded MAL +specification, in the version selected by §4.1. The **Java generator** holds only the Java-side +mapping keyed by type name — target type, native-or-not, default value — and nothing that +identifies the type itself. If MAL is not among the loaded specifications, that is an error rather +than a fallback to a built-in table: a model that cannot resolve `MAL::Blob` cannot generate +anything correct, and failing loudly beats generating against a stale hardcoded list. + +### 4.3 Type definitions + +```java +abstract TypeDefinition { String name, comment; + Area area; Service service; } // back-references; service may be null + +FundamentalType extends TypeDefinition { TypeRef superType; } // always abstract +AttributeType extends TypeDefinition { int shortFormPart; } +CompositeType extends TypeDefinition { Integer shortFormPart; // null → abstract + TypeRef superType; // never null — see below + List fields; } +EnumerationType extends TypeDefinition { int shortFormPart; + List items; } +Item { String value, comment; long nvalue; } + +ErrorDefinition { String name; long number; String comment; Field extraInformation; } +ErrorReference { TypeRef error; String comment; Field extraInformation; } +``` + +A `TypeDefinition` points at its owning `Area` and `Service` rather than naming them as strings, +matching `Service.area` — so the defining area's version is directly available and there is no +second copy of the name to keep consistent. `service` is null for area-level types. + +**`CompositeType.superType` is always set.** The XML carries two spellings of one meaning: of 326 +composites in the corpus, 215 declare `extends MAL::Composite` explicitly and 23 declare no +`extends` at all, which the schema defines as identical — *"if this is not present then the base +Composite is implied"*. (The remaining 88 extend a genuine supertype.) The importer resolves the +implied case, so the model never holds a null supertype and no reader has to know the rule; both +exporters then write the clause every time. + +The consequence is deliberate: on re-export, those 23 composites **gain** an explicit +`` they did not have. That is an intended difference for §10.1's list — it normalises +a redundancy the schema itself documents, in the direction that leaves nothing implicit. + +`CompositeType.isAbstract()` returns `shortFormPart == null` rather than making every caller test +it. Absence is the only thing that means abstract: the schema says so explicitly ("If no short form +part is provided then this is an Abstract composite type"), `ShortFormPart` is `minInclusive="1"` in +every schema version so `0` was never a legal value, and no specification in the corpus uses it. +`GeneratorMOSDL:615` additionally tests `shortFormPart == 0`; that is dead code guarding an +impossible value and is not carried over. + +### 4.4 COM + +Per decision, COM is **first-class**: `Service` holds `COMFeatures` directly, rather than the XSD's +`ExtendedServiceType` subclass-and-cast arrangement. + +The types are named for what they are rather than after the schema: `COMObject` where the XSD says +`ModelObjectType`, and `COMFeatures` for `SupportedFeatures`. `COMObject` covers events too — the +schema's `ModelEventTypeList` holds elements of the same `ModelObjectType` — so an event is a COM +object that happens to live in the `events` list. + +```java +COMFeatures { String objectsComment, eventsComment; // list-level comments, both substantial + List objects; + List events; + String archiveUsage, activityUsage; + Documentation documentation; } + +COMObject { String name; int number; String comment; + TypeRef bodyType; // null → no body + ObjectLink related, source; } + +ObjectLink { String comment; ObjectReference target; } // either part may be absent +ObjectReference { String area; int areaVersion; // as TypeRef — filled in at import + String service; int number; } // numeric — see §7.4 +``` + +`ObjectReference` carries `areaVersion` for exactly the reasons `TypeRef` does (§4.1): the XML +form — `` — has no version, it is +resolved at link time, and it is a value object that would otherwise compare equal across two +versions of the same area. + +COM is always modelled and always generated. The old `generateCOM` flag, which skipped the COM +area entirely, is not carried over — it sat at its default `true` in every pom (§3, invariant 4). + +### 4.5 Round-trip completeness + +`xml → model → xml` has to be lossless, so §4 was audited element by element against +**both** `ServiceSchema.xsd` (v001) and `ServiceSchema-v003.xsd`, and against the corpus. Two +omissions were found and are fixed above: + +| Omission | Schema | Corpus | +| --- | --- | --- | +| `Specification.comment` | `` on `SpecificationType` | used by 4 of 14 specs | +| `Operation.documentation` | `OperationType` extends `DocumentationBaseType` | 36 `` elements inside operations in MPD | + +**Two constructs the schema allows and nothing uses.** Both are deliberately *not* modelled, and +the importer must **reject** them rather than drop them silently — a parser that ignores what it +does not understand is how data disappears: + +- `AreaDataTypeList` and `DataTypeList` also extend `DocumentationBaseType`, so `` + may itself carry documentation and diagrams. Zero occurrences. +- The **v001** `OperationErrorList` permits an inline `` definition inside an operation, + not just an `errorRef`. Zero occurrences; v003 dropped the option. +- **v001 message bodies are ``**, so the schema + permits arbitrary elements inside a message. All 434 body children in the v001 corpus are + ``, which is exactly what v003 types explicitly — so `MessageBody` models fields and + nothing else. + +**The model is the union of v001 and v003**, which differ more than the shared namespace suggests. +A structural diff of the two schemas, checked against the corpus: + +| Construct | v001 | v003 | In the corpus | +| --- | --- | --- | --- | +| `Service.dataTypes` | ✓ | — | v001 files only; v003 puts all types at area level | +| `Service.errors` | ✓ | — | v001 files only | +| `Operation.supportInReplay` | ✓ | — | 0 in v003 files | +| `Operation.documentation` (`OperationType` extends `DocumentationBaseType`) | — | ✓ | 36, all in MPD | +| `TypeRef.service` | ✓ | — | 0 in v003 files | +| `TypeRef.isObjectRef` | — | ✓ | 582 attributes, 95 of them `true`; v003 only | +| `subscriptionKeys` on PUBSUB | — | ✓ | 13 uses | +| inline `` in an operation | ✓ | — | 0 uses | +| message body element type | `AnyTypeReference` — `` | `MessageBodyType` — typed `field` | all 434 v001 body children are `field` | + +**Every specification in the corpus is version-clean**: no v001-only construct appears in a v003 +file, and none of the v003-only ones appears in a v001 file. Two consequences. + +First, the exporter targets exactly one version and must **refuse** to write a construct the target +lacks, rather than dropping it — writing a v003 model into a v001 file would silently lose +`subscriptionKeys`. The validator reports the mismatch, and §6.1's schema check is the backstop. + +`supportInReplay` shows why the model has to carry v001-only fields even though v003 has dropped +them. In v001 the attribute is `use="required"`, so it appears on all 176 operations across the +nine v001 specifications (32 `true`, 144 `false`) and a v001 file exported without it is invalid. +Yet **no generator consumes it**: the Java generator's only reference is commented out +(`JavaServiceInfo:337`), and the sole live reader is the MOSpec writer emitting `replayable`. It is +therefore round-trip data rather than generation input — carried faithfully, influencing no output. +`replayable` consequently only ever appears in MOSpec files derived from v001 specifications. + +Second, **the new library does not need the hybrid schema at all.** +`ServiceSchema-v003-backwards-compatible-hybrid.xsd` exists so that a single `xjc` run can produce +one set of JAXB classes able to read both dialects. Nothing is generated from XSD any more, so +§6.1 validates each specification against its *real* schema — `ServiceSchema.xsd` or +`ServiceSchema-v003.xsd` — which is strictly more informative, since the hybrid accepts documents +neither version does. + +`InteractionStage` therefore enumerates the union: `SEND`, `SUBMIT`, `REQUEST`, `RESPONSE`, +`INVOKE`, `ACK`, `PROGRESS`, `UPDATE`, `SUBSCRIPTION_KEYS`, `PUBLISH_NOTIFY` — with +`SUBSCRIPTION_KEYS` present only in v003 models. + +**Model fields with no XML representation**, all intentional and none of them lost on export: + +- `schemaVersion` — *is* the root namespace, written back as such (§4.1). +- `areaVersion` on `TypeRef` and `ObjectReference` — recomputed at import, dropped at export (§4.1). +- `Requirement` — derived from `DocSection`, never serialised (§4.6). +- Back-references (`Area.specification`, `Service.area`, `TypeDefinition.area/service`, + `Operation.parent`) and `SourceRef` / `SourceLocation` — structure and provenance, not content. + +So the answer is yes, with the two additions above. The §7.3 round-trip test and the §6.1 schema +validation are what keep it true rather than merely intended. + +### 4.6 Documentation and requirements + +`` is where every normative requirement in the +specifications lives — 91 elements across 8 of the 14 prototype specs, 44 in MPD alone. It is +modelled faithfully, plus a derived view for requirements: + +```java +Documentation { List sections; List diagrams; } + +DocSection { String name; int order; String content; SourceLocation location; } + +Requirement { String id; // null unless the source authored one — see below + String text; + DocSection origin; // provenance + SourceLocation location; } +``` + +`DocSection` mirrors `DocumentationType` exactly, so XML round-trips byte-for-byte including the +blob style. `Requirement` is **derived**, produced by an explicit `RequirementExtractor` and exposed +as `getRequirements()` on `Area`, `Service` and `Operation`. Because it is derived it never touches +the exporters and cannot break the round-trip. + +**Only authored requirements get an identifier.** The corpus has two conventions, and only one of +them can support a stable ID: + +- **One requirement per element** — MPD's ``. The + number is *authored*, so `MPD.ProductRetrieval.listProducts.3` names that requirement for as long + as the specification says `order="3"`. `Requirement.id` is set. +- **Several requirements in one blob** — Common, Software Management, COM and MC, where a single + element holds many `shall` statements and the individual requirements are recovered by splitting + the text. Their position within the blob is the only thing distinguishing them, so inserting a + sentence renumbers everything after it. `Requirement.id` is **null**, and the consumer numbers + them positionally exactly as the docx generator does today. + +The model therefore never claims a stability it cannot deliver: an ID means the specification +authored it. Roughly half the corpus's 91 documentation elements are blob-style, so this is the +normal case rather than an exception, and it is the reason the extraction rule below has to +be written down rather than left to a regex. If CCSDS converges on the one-per-element convention, +every requirement gains an ID with no model change. + +Two things make this worth modelling rather than leaving as prose: + +**Requirement numbering is currently a side effect of string splitting.** `GeneratorDocx` +derives it by calling `GeneratorUtils.addSplitStrings`, which does +`str.split("( |\n)")` and then numbers whatever comes out. In MPD `ProductRetrieval`, +Service-level Requirement 2 has a second line beginning `Note:` — which is published as its own +numbered requirement. And because numbers are positional, inserting a requirement renumbers every +one after it, which is untenable for a book whose requirements are cited in compliance matrices. + +**The corpus uses two incompatible conventions.** MPD writes one requirement per element +(`name="Requirement"`, `order` = its number); Common, Software Management and COM put several +`shall` statements in a single blob under `name="High Level Requirements"` and similar. Both must +survive, so the extraction rule is a written, tested part of the format rather than a regex inside +the docx generator. + +**Documentation content is itself a little markup language**, and the existing behaviour is +normative — reverse-engineered from `DocxBaseWriter` and reproduced exactly. The corpus contains 272 +`
  • `, 68 `
      ` and 8 `
        ` tags, escaped inside attribute values. What the code actually does, +after `GeneratorUtils.addSplitStrings` has split the content on `\n` or a double space: + +| Token | `addNumberedComment` (requirements) | `addComment` (prose) | +| --- | --- | --- | +| a line that is exactly `
          ` | opens a nested numbering level | — | +| a line that is exactly `
        ` | closes one level and returns | — | +| a line that is exactly `
          ` or `
        ` | not handled — emitted as text | dropped | +| a line *containing* `
      • ` | not handled — emitted as text | text between `
      • ` and `
      • ` becomes a `ListParagraph` | +| blank line | skipped | skipped | +| anything else | one numbered item at the current level | one paragraph | + +Two consequences worth knowing before it is reproduced: the tokens must be **alone on their line** +to be recognised, since they are matched with `contentEquals` after splitting; and the two readers +disagree — `
          `/`
        • ` mean something to prose and nothing to requirements, `
            ` the reverse. +That is the behaviour to preserve, quirks included. §7.5 renders it as a numbered list in MOSpec, +with the XML markup remaining the normative form. + +If CCSDS later converges on the one-requirement-per-element style, `Requirement` is promoted from +derived to stored with no model churn, because the class and its stable ID already exist. + +## 5. SPIs + +### 5.1 The pipeline + +Four ordered stages, never interleaved: + +``` +import → link → validate → generate +``` + +**Link** resolves every `TypeRef`, `ObjectReference` and error reference in the model against the +definitions it names (§4.1). Unresolvable references are reported like any other issue rather than +thrown. After linking, nothing in the model needs a lookup context and nothing mutates — which is +what lets §8.2 parallelise generation freely. + +**Validate** runs to completion **before** any generator starts. Nothing is written to disk until +the model has been checked, so a failed run cannot leave a half-generated source tree behind — +which is what happens today, since the current generators discover problems while writing. + +### 5.2 Interfaces + +```java +interface Importer { Specification read(Reader in, SourceRef src) throws ImportException; } +interface Exporter { void write(Specification spec, Path outputDir) throws IOException; } +interface Generator { String getShortName(); String getDescription(); + void generate(MOModel model, List targets, Path outputDir) + throws IOException; } +``` + +Changes from today's `Generator` interface: + +- `init` + `postinit`, each carrying the same five parameters, are gone. Generators are constructed + and then called; there is no configuration phase, because per invariant 4 (§3) there is + essentially nothing to configure — the Maven plugin builds a `JavaGenerator()` and calls + `generate(model, outputDir)`. +- **Targets are an argument, not model state.** The caller passes the areas to generate; the model + itself says nothing about anyone's intent to generate (§4). Passing the whole list rather than + calling once per area keeps work distribution inside the generator, which §8.2 needs. +- **No shared config object.** `packageBindings` was meaningful only to the Java generator and + `extraProperties` only to the docs generators, so neither belonged in a type they shared. Anything + that does survive as an option belongs to the one generator that reads it. +- `loadXML`/`loadXSD` disappear — loading is the importer's job, and the generator receives a + finished `MOModel`. +- Generator discovery uses an explicit registry mapping short name → factory, instead of + `org.reflections` classpath scanning in `StubGenerator.loadGenerators()`. A factory rather than a + bare class because generators now carry construction-time configuration. +- Exporters write to a **directory**, not to a single stream. + +**The plugin's existing configuration options are kept for 14.x**, then reviewed at the cut-over +(§10.4). None of them is set anywhere in this repository: + +| Option | Set in | Behaviour behind it | +| --- | --- | --- | +| `extraProperties` | 0 poms | **live, and substantial** — carries nine real generator options (below) | +| `generateCOM` | 0 poms | live; defaults `true`, gates the COM area at `GeneratorLangs:241,:325`, `GeneratorSvg:125`, `GeneratorDocx:163` | +| `generateStructures` | 0 poms | live; defaults `true`, branched on at `GeneratorLangs:368,:449` | +| `forceGeneration` | 0 poms | live; drives the input-timestamp skip in `execute()` | +| `packageBindings` | 0 poms | inert in practice — an empty map means `addAreaPackage` is never called | +| `xsdRefDirectory` | 0 poms | inert — no module has such a directory, and the `loadXSD` path behind it goes (§10.4) | +| `targetLanguages` | 1 pom | in active use — always `Java` | + +`extraProperties` deserves attention because it is not a vestigial escape hatch. It is how the docs +and Java generators are configured, through nine untyped string keys — each shown here with the +value it actually has, everywhere, because none is ever set: + +| Key | Effective value | +| --- | --- | +| `java.requiresDefaultConstructors` | `false` | +| `svg.includeDescriptiveText`, `svg.includeIndexes`, `svg.includeCollapsedMessages`, `svg.includeExpandedMessages` | `true` | +| `svg.splitOutSvg` | `false` | +| `docx.includeMessageFieldNames`, `docx.includeDiagrams` | `true` | +| `docx.oldStyle` | `false` | + +Per invariant 4 (§3), the new library **does not carry these forward as options at all**. Each +generator is written to do the one thing the default already selects. That is not a typed-config +exercise — the aim is that there is nothing to configure. + +Removing the options from the *plugin* is a separate matter and cannot be done in 14.x: Maven fails +the build on unknown plugin configuration (`Cannot find 'packageBindings' in class …`), so any +external pom setting one would break on upgrade. The plugin is published to Maven Central, so that +risk is real even though nothing in this repository sets them. It is queued for v15.0 (§10.4). + +Note that the plugin can in fact keep its surface indefinitely at no cost to the library: at +cut-over it simply maps its `@Parameter` fields onto the typed generator constructors. + +**The library takes no Maven types.** `generator-java` and `generator-docs` currently depend on +`maven-plugin-api` for one reason: their constructors accept +`org.apache.maven.plugin.logging.Log`, used in seven places. That is why `mo-navigator` — a Swing +application — constructs a `SystemStreamLog` in order to generate a docx. The new library logs +through `java.util.logging` and the Maven binding lives in the plugin, where it belongs. + +The last one matters because no export is necessarily one document: a MOSpec specification is a +`.mospec` file plus sidecar `.svg` diagrams (§7.6) — the Software Management conversion produces +three files (§7.6). A directory +covers all of it with no abstraction over `java.nio.file.Path`. + +An earlier draft of this design put an `OutputSink` interface here so that output could also be +produced in memory. It is deliberately not in scope: its only prospective caller was +`mo-navigator`, and a directory is already a collection of named documents, so the interface would +have had exactly one implementation. + +Importers take a `Reader` rather than a path so that text held in an editor can be parsed directly, +which is what `mo-navigator` does today for XML. `SourceRef` carries the origin, and when that +origin is a file it is also what sidecar resolution uses to find a `.mospec`'s diagrams. Text with +no file behind it therefore imports fine but carries no sidecars — an acceptable limit, since XML +has no sidecars at all and stores its diagrams inline. + +Today's `xmlDirectory` versus `xmlRefDirectory` split in the Mojo stays entirely on the Mojo's side +of the boundary: it loads both into one model, then passes the areas from `xmlDirectory` as +`targets`. The library never learns that the distinction existed (§4). + +This is what removes the duplication in `GeneratorMOSDL`, which has two diverged copies of its +traversal — `generateMOSDL(spec)` returning a `String` (lines 212–354) and `generate(spec, File)` +(lines 433–568). One holds the readability edits; the other does not. + +### 5.3 What a validation failure does + +`Validator` produces `ValidationIssue(severity, message, SourceLocation)`. Severity decides the +outcome: + +| Severity | Effect | +| --- | --- | +| `ERROR` | Generation does not start. The build fails, reporting every error found — not just the first. | +| `WARNING` | Reported and generation proceeds. | + +Collecting all errors before stopping matters for the editor as much as the build: `mo-navigator` +wants every problem in the file highlighted at once, not a fix-one-recompile loop. + +Severity is a per-rule property, not fixed by category, so individual rules can be tightened or +relaxed as the corpus is cleaned up. The three area-identity collisions in §4.1 are a `WARNING` +rather than an `ERROR`, and cost nothing today: every `apis/*` module names the specifications it +loads explicitly, at most three of them, and **no build loads a colliding pair** — none of +`area002-v002-Basics.xml`, `area052` or `area104` is referenced by any module. The rule is a guard +against a future pairing, not a description of a current problem. + +## 6. XML format + +The XML importer/exporter is hand-written over StAX against `ServiceSchema-v003.xsd` + +`COMSchema.xsd`, handling both the `ServiceSchema` and `ServiceSchema-v003` namespaces natively — +so it has no equivalent of `XmlSpecification.modifyFileToBeBackwardsCompatible()` and its string +replacement, which stay in the old modules until those are deleted. + +XML remains the **normative interchange format** and the one the Maven build consumes. + +### 6.1 Schema validation on export + +The schema sets needed are coherent, which was not obvious in advance: `COMSchema.xsd` imports the +**v001** service schema, and no v003 specification in the corpus uses `com:features` — so a v001 +document validates against `ServiceSchema.xsd` plus `COMSchema.xsd`, and a v003 document against +`ServiceSchema-v003.xsd` alone. + +**Turning it on found four defects in the specifications**, none of which the current toolchain +notices, because JAXB accepts what it is given and nothing checks afterwards. All four are now +fixed, and every specification satisfies its own schema: + +| Specification | Defect | +| --- | --- | +| `area020-v001-File-Management.xml` | `are="FM"` instead of `area="FM"` on four `` elements, so those references had no area at all | +| `area051-v001-Mission-Data-Product.xml` | operation number 3 given to both `unsubscribe` and `listSubscriptions` | +| `area051-v001-Mission-Data-Product.xml` | short form part 80 given to both `Frequency` and `Subscription`, which only became visible once the first duplicate was fixed | +| `area051-v001-Mission-Data-Product.xml` | three composites extending a MAL attribute with no fields of their own, which is not expressible in the MAL data model and stopped the area producing any document | + +Every XML export is validated against the normative schema before it is written, using +`javax.xml.validation` — JAXP, part of the JDK since Java 5, so this adds no third-party +dependency. The schema version comes from `Specification.schemaVersion` (§4.1), so a v001 +specification is checked against `ServiceSchema.xsd` and a v003 one against +`ServiceSchema-v003.xsd`. + +**Against the real schemas, not the hybrid.** `ServiceSchema-v003-backwards-compatible-hybrid.xsd` +exists so a single `xjc` run can produce JAXB classes that read both dialects, and it therefore +accepts documents that neither version does — service-level `dataTypes` together with +`subscriptionKeys`, for instance. Since nothing is generated from XSD any more, the library can +hold both real schemas and check each specification against its own, which is strictly more +informative. Every file in the corpus passes: none mixes constructs across versions (§4.5). + +This is worth having because the XSD already encodes constraints a hand-written validator would +otherwise have to duplicate — `ShortFormPart` being `minInclusive="1"` is exactly the rule that +settled the abstract-composite question in §4. Checking against the schema keeps one source of +truth for anything the schema can express, and leaves §9 to cover only what it cannot. + +The schemas must therefore be on the classpath at runtime. They are small — `ServiceSchema-v003.xsd` +is 24 KB, `ServiceSchema.xsd` 28 KB, `COMSchema.xsd` 8 KB — and are **copied into the library's +resources at build time from the existing `xml-ccsds-mo-*` artifacts**, using the +`ccsds.specification.download` mechanism the build already has. Copying rather than hand-maintaining +matters: a hand-kept copy is precisely how `mosdl-0.1.1.jar` ended up shipping a divergent snapshot +of this schema (§2). Note also that `COMSchema.xsd` imports the service schema by relative +`schemaLocation`, so the resolver must serve both from the same place. + +This does reintroduce a build-time dependency on `xml-ccsds-mo-standards` / `-prototypes` that §3 +otherwise removes — but for validating output against the normative schema, rather than for +generating a model from it. + +## 7. MOSpec — the text format + +### 7.1 Name + +The format is **MOSpec**, files `.mospec`. The name follows the vocabulary the specifications +already use: the schema's root element is ``, and the XML lives in +`xml-service-specifications`. One `.mospec` file *is* one specification, holding one or more areas +— the same unit the XML uses (§7.9). + +It is *not* named as a version of MOSDL. A version number would advertise a lineage we are +deliberately cutting and permanently reference a 0.1.1 library we no longer depend on. Two names +were rejected for concrete reasons: anything one letter from MOSDL (`MOSL`, `MOSD`) is a +near-homophone, which is the worst outcome when the point is a clean break; and bare `SDL` collides +with ITU-T SDL (Specification and Description Language), an actual telecom standard and a genuine +source of confusion in a CCSDS setting. + +**Backward compatibility with MOSDL is an explicit non-goal.** There is no deployed body of `.mosdl` +files and no third-party tooling to keep working, so nothing is owed to the old syntax. MOSpec +borrows MOSDL's shape because that shape is good, and changes it wherever there is a reason to. + +| | MOSDL (DLR) | MOSpec | +| --- | --- | --- | +| Doc comments | `"""…"""` | `///` and `/** … **/` — the `"""` form is not accepted | +| COM objects and events | not represented | first-class syntax (§7.4) | +| `` / requirements | not represented | first-class syntax — first-class syntax (§7.5) | +| Diagrams | not represented | sidecar reference (§7.6) | +| Parser | ANTLR grammar in `mosdl-0.1.1.jar` | hand-written (§7.2) | +| Numbering, formatting | upstream's | our formatting spec (§7.6) | + +Practical consequences of dropping compatibility: + +- The lexer has one doc-comment syntax to implement instead of three, and there is no reason for + `ParserMOSDL`'s `text.replace("/**", "\"\"\"")` patch to exist in any form. +- Syntax that reads awkwardly can simply be fixed rather than preserved. Settled so far (§7.8): + field declarations are type-first, nullability is postfix on the type, and `replayable` replaces + the bare `*` prefix. Still open: the repeated `-> ` arrows separating interaction stages. +- No compatibility test suite, no dual-dialect mode, no migration tooling for existing files. + +**File extension: `.mospec`**, simply because it is a different language and should be named as +one — not to protect anyone from misparsing a v1 file, since there are none to misparse. + +### 7.2 Parser + +Hand-written lexer + recursive-descent parser, no ANTLR. The language is LL(1) throughout: +keyword-led, brace-delimited, no expression grammar, no precedence. Estimated ~250 lines of lexer +and ~600 of parser, against the 1247-line vendored `MosdlSpecLoader` it replaces. + +Reasons specific to this project: + +- The ANTLR route means keeping `mosdl-0.1.1.jar`, which drags in its own JAXB shadow model — the + exact coupling being removed. +- The lexer defines `///` and `/** … **/` as *the* doc-comment forms, so the readable syntax is the + parsed syntax and `ParserMOSDL`'s `text.replace("/**", "\"\"\"")` patch has nothing to do. +- Source locations and error recovery for the editor's lax mode come for free instead of via a + custom `ErrorListener`. + +Cost: the grammar is ours to maintain. Since no `.g4` ships in the jar and the library is at +0.1.1, that is already effectively true. + +### 7.3 The exporter defines the dialect + +**The grammar must accept everything the exporter emits.** Enforced by a round-trip closure test in +the build, over all 20 specifications in `xml-service-specifications`, in `BULK` and `INLINE`. +`SUPPRESS` is excluded because it strips documentation by design, so it cannot preserve the model — +for it the test asserts only that the text re-parses and that everything except documentation +survives: + +``` +xml → model → text → model' → text' + assert model == model' (no semantic loss) + assert text == text' (formatting is idempotent) +``` + +and, end to end, that the XML survives a trip through the text format unchanged: + +``` +xml → model → text → model' → xml' + assert xml == xml' (canonicalised; §7.9 for what this requires) +``` + +With that test, "I don't like how the output reads" becomes: change the formatter, run the test. +Today it means changing the writer and then patching the parser with a `String.replace`. + +### 7.4 COM syntax + +MOSDL has no COM representation; `GeneratorMOSDL.writeCOMFeatures()` is an invention and is +commented out at its call site (line 320) because nothing can read it back. Proposed syntax, in +the style of the rest of the language: + +``` +service Action [1] { + + capability [1] { ... } + + com { + /// Each action of a provider shall be represented by an ActionIdentity COM object. + /// The body of the ActionIdentity COM object shall hold the name of the action. + objects { + object ActionIdentity [1] (MAL::Identifier) { + /// The object that caused it to be created, most likely a COM + /// OperationActivity object or an operator login. + source - + } + + object ActionDefinition [2] (ActionDefinitionDetails) { + related ActionIdentity + /// The object that caused it to be created… + source - + } + } + + /// Execution progress of an action shall be reported using COM + /// ActivityTracking Execution events. + events { + /// The body holds a numeric failure code. + event ActionFailure [6] (MAL::UInteger) { + related ActionInstance + source COM::ActivityTracking.Execution + } + } + + /// ActionIdentity objects should be stored in the COM archive. + archiveUsage + + /// The COM Activity service should be used to monitor the transfer and + /// execution of the submitAction operation. + activityUsage + } +} +``` + +Rules: + +- `object` and `event` are the same production under two keywords. +- Body type in parentheses, using the existing type-reference syntax (`MAL::Identifier`, + `MC::Action.ActionInstanceDetails`, unqualified within the same service). No body → omit the + parentheses. +- Braces omitted when there are no links: `object OperationActivity [6] (OperationActivity)`. +- `related` / `source` take a target or `-` for "unspecified" — the dominant case in the real + specs, where the link is documented in prose but not named. Prose attaches as an ordinary `///` + doc comment, reusing the language's existing documentation mechanism. +- `archiveUsage` / `activityUsage` are bare keywords whose only content is the doc comment above. +- The `objects { }` / `events { }` grouping is kept because the XML carries a `comment` on the + *list* (the MC ones run to 10+ sentences); flattening would lose it and fail §7.3. + +**Object references are numeric in XML** — `` +— but should read by name. Resolution fails routinely: `mo-navigator` edits one area per tab, so a +cross-area link such as `COM::ActivityTracking` #5 is unresolvable whenever the COM area is not +loaded. Both forms are therefore part of the grammar: + +``` +source COM::ActivityTracking.Execution # resolved +source COM::ActivityTracking#5 # unresolved — numeric, always round-trips +``` + +The exporter emits the name when it can resolve and `#n` when it cannot; the importer accepts +both. `ObjectReference` stores area + service + number as the truth, with the name as a lookup — +never the reverse, or specifications whose target area is absent become unrepresentable. + +### 7.5 Documentation and requirements + +`` (§4.3) gets a `doc` production carrying `name` verbatim and `order` in the +usual bracket position: + +``` +service ProductRetrieval [1] { + + doc "Service-level Requirements" [1] """ + The Product Retrieval service provider may provide the capability to list mission data + products, to get mission data products, and/or to remotely deliver them as files. + """ + + doc "Functional Requirements" [2] +``` + +Three rules, each driven by something real in the corpus: + +- **`name` is preserved verbatim**, so `"Requirement"`, `"Requirements"`, `"High Level + Requirements"`, `"Functional Requirements"` and `"Service-level Requirements"` all survive + unchanged. MOSpec takes no view on which convention is right. +- **A `doc` may have no body.** `` + occurs three times in Software Management alone, and is written as a bare declaration. +- **Embedded `
              `/`
            1. ` markup becomes a numbered list.** The source stores requirement lists as + escaped XML inside an attribute value (`<ol><li>…`); rendering them as a plain + numbered list is the single largest readability gain in a converted file. The exporter must + reproduce the markup exactly on the way back — which requires knowing what the markup language + actually is — §4.6 documents it, reverse-engineered from `DocxBaseWriter`, and the XML markup + remains the normative form. + +### 7.6 Diagrams + +`` wraps raw SVG — over 100 lines of ``/`` in MC alone. +Inlining that in a human-readable format defeats its purpose: + +``` +diagram ActionObjects "ActionObjects.svg" +``` + +with the SVG written to a sibling file. **Decided: sidecars**, precisely so the conversion to MOSpec +stays lossless — dropping diagrams from the text format would make it the one place the round-trip +leaks. The accepted consequence is that a MOSpec specification is a **directory** (one `.mospec` +plus sidecar SVGs), not a single file. `GeneratorMOSDL`'s current placeholder +(`"This is a test 3 --> We need to code the diagrams part!"`, line 427) is replaced. + +### 7.7 Formatting specification + +Readability rules live in one `SourceFormatter` layer, separate from the exporter's traversal, so +they are tunable without touching the writer. The behaviours below are carried over from the +current fork (`GeneratorMOSDL` is a modified copy of DLR's `MosdlGenerator` — its logger on line +82 still names the original class) and each becomes a formatter rule with a test: + +| Rule | Origin | +| --- | --- | +| Java-style doc comments: `/** … **/` for multi-line, `///` for single | `writeDoc()`, `javaComments` | +| Blank line after each operation, capability block, data type, and the area header | added `writeLine()` calls | +| Tab indentation | `writeIndent()` | +| Type qualification suppressed only when area **and** service both match | `resolveType()` | +| Nullability postfix on the type — `List?`, not `List?` | `resolveType()`, respelled (§7.8) | +| Keywords quoted when used as identifiers | `getId()` | + +Also carried over, but into the **importer** rather than the formatter: auto-numbering (`[n]` may +be omitted and is assigned from the highest existing number — for COM it must draw from the +**shared** object/event counter, §9) and the implicit import of MAL fundamental types. + +**`BULK` is the default export mode.** `INLINE` and `SUPPRESS` remain supported options. In `BULK`, +an operation's message and field documentation is hoisted into a single doc block above the +signature, which keeps the signature scannable in one glance: + +``` +/** + * The findPackage operation allows a consumer to find the available packages on the provider. + * + * @requestparam names: The names field contains the names of the packages. + * @responseparam installed: The installed field shall hold the status of the package. + * @error MAL::UNKNOWN: One or more of the requested packages is unknown. + * @errorinfo MAL::UNKNOWN: A list of the indexes of the error values shall be contained in the extra information field. + **/ +replayable request findPackage [1] (List? names) + -> (List? names, List? installed) + throws MAL::UNKNOWN: List +``` + +Because it is the default, the tag scheme is a normative part of the format and must be written +down rather than inherited from the DLR library's `OperationDoc`. The rules: + +| Tag | Attaches to | +| --- | --- | +| `@` | the message for that interaction stage | +| `@param ` | a field of that stage's message | +| `@error ` | an error of the operation | +| `@errorinfo ` | that error's extra-information element | + +`` is the interaction stage lowercased and reduced to its final word — `request`, +`response`, `invoke`, `ack`, `progress`, `update`, `submit`, `send`, `publish` — matching +`stageToTagMap` in the current writer. + +Two rules the current implementation leaves implicit and which the round-trip test will require: + +1. **Continuation lines.** A line inside the doc block that does not begin with `@` continues the + preceding tag. This is what makes multi-line field documentation — such as `monitorExecution`'s + eight-line `outputStream` comment — reconstruct exactly. +2. **Untagged leading text** is the operation's own comment. Everything before the first `@` tag + belongs to the operation, everything after belongs to the tag it follows. + +### 7.8 Declaration syntax + +**Fields are declared type-first**, with nullability postfix on the type: + +``` +composite PackageDefinition [7] extends Composite { + /// The name of the package. + Identifier name + /// The path of the file where the package is located. + MAL::File path + /// The publisher of the package. + String? publisher +} + +request findPackage [1] (List? names) + -> (List? names, List? installed) + throws MAL::UNKNOWN: List +``` + +MOSDL used `name: Type` with the nullable marker inside the list brackets (`List?`). +Type-first matches the Java that this toolchain generates and that its authors read, and it frees +`:` for the one place it still means something — the extra-information type on an error reference. + +**Operations carry `replayable` as a modifier** rather than MOSDL's bare `*` prefix on the name: + +``` +replayable request findPackage [1] (…) +``` + +This parallels `abstract composite`, which the language already has, and frees `*` from double duty +— it also marks the repeating PROGRESS update, which now attaches to the message it qualifies. + +**The `-> ` stage arrows stay as MOSDL had them.** Naming each stage explicitly (`ack (…)`, +`update (…)*`, `response (…)`) was considered and rejected: the arrow form is compact, and the cost +— that an empty acknowledgement and an empty response look alike and are told apart by position — +is accepted. + +``` +progress stopApp [4] (List? appInstIds) + -> () + -> (Long? appClosing)* + -> () +``` + +None of this affects the grammar's LL(1) property: a field always begins with a type, and a +declaration's leading keyword still determines the production. + +### 7.9 Round-trip completeness + +§4.5 established that `xml → model → xml` is lossless. The longer path, +`xml → model → .mospec → model → xml`, additionally requires MOSpec syntax for **everything the +model holds**. Auditing §7 against §4 found four gaps; all four are closed by the additions below. + +**Object references.** `` appears **101 times** — 95 in MPS, 6 in MC v2 +— and had no spelling. It becomes a type wrapper, matching what the docx generator already prints: + +``` +ObjectRef objectRef="true" +List>? list="true" objectRef="true", nullable +``` + +No ambiguity with MAL's own `ObjectRef` attribute type: the wrapper always takes a type argument, +the attribute type never does. + +**The specification header.** `Specification.schemaVersion` and `Specification.comment` are +properties of the file, not of the area, and neither had anywhere to live. Without the first the +exporter cannot choose the target namespace, nor decide whether `supportInReplay` (v001 only) or +`objectRef` (v003 only) may be written at all — so it is not optional: + +``` +/// Optional comment carried on . +specification [v003] + +/** The area's own documentation. **/ +area MPS [5] +``` + +`[v003]` or `[v001]`, in the same bracket position every other number occupies. + +**`doc` on operations.** §7.5 shows `doc` at area and service level; it must also attach to an +operation, since `OperationType` extends `DocumentationBaseType` and MPD uses it **36 times**. The +rule is simply that `doc` is legal wherever the model has a `Documentation` — area, service, +capability set, operation, and inside `com`. + +**A `.mospec` file is a specification, not an area.** MOSDL made the file an area because `area X {}` +was its top-level production and it had no notion of a specification at all. MOSpec has one — the +header above — so the file matches the XML's unit exactly, and `area` may simply repeat: + +``` +/// Optional comment carried on . +specification [v003] + +/** … **/ +area MAL [1.3] { … } + +/** … **/ +area COM [2] { … } +``` + +Every specification in the corpus has exactly one area, so every file today looks precisely as it +would have under a one-area-per-file rule. What this buys is that a multi-area specification +round-trips as itself rather than fragmenting into N specifications, and that the `specification` +header stops being a value duplicated across files that share it. + +## 8. Generators + +**Rewritten against the new model — not ported.** The old generators are the reference for *what* +comes out, never for *how* it is produced. The golden tree (§10.1) pins the output; it says nothing +about the implementation, and that distinction is what makes it safe to be ruthless inside. If a +file in the new library ends up recognisably shaped like its predecessor, that should be because +the shape was right, not because it was there. + +Most of the existing structure exists to serve requirements that are gone: + +| Existing | Why it is there | Now | +| --- | --- | --- | +| `GeneratorLangs` (1754) as a "language-neutral" base with `GeneratorJava` (429) subclassing it | multiple target languages | one language — collapse the split | +| `writers/` hierarchy — `TargetWriter` → `LanguageWriter` → `AbstractLanguageWriter` → `ClassWriter`/`InterfaceWriter`/`MethodWriter`, plus `MethodBuilder`/`InterfaceMethodBuilder` (~1.2k lines) and `JavaClassWriter` (572) | abstracting Java/C#/C++ source emission behind one API | emitting Java source is a concrete problem; write it directly | +| `GeneratorGwt` (305) | a GWT target | deleted — nothing in the repository references GWT, and `parent/pom.xml:356` requests only `Java` | +| `StdStrings` (67) — string constants for `"MAL"`, `"Blob"`, `"Composite"`… | untyped identification of MAL types | the model resolves types; constants that survive belong to the Java mapping (§4.2) | +| `AttributeTypeDetails`, `NativeTypeDetails`, `MultiReturnType`, `RequiredPublisher`, `CompositeField` | scattered carriers between the shadow model and the writers | re-derive from what the Java generator actually needs; none is a given | + +The two generators in scope: + +- **java** — currently `GeneratorLangs` + `JavaConsumer` + the `java/` writers, ~4.5k lines. Expect + the rewrite to be substantially smaller, since a large part of that mass is the language + abstraction and the shadow-model plumbing rather than Java generation. +- **docx** and **svg** — `GeneratorDocx` (1176) and `GeneratorSvg` (1155). Between them these carry + eight of the nine `extraProperties` options (§5.2); per invariant 4 none is reproduced, and each + generator simply does what the default already does — descriptive text, indexes, collapsed and + expanded messages, message field names and diagrams all included; SVG not split out; `oldStyle` + off. `docx.oldStyle` changes only how a field is labelled in the type tables — `name : (List)` + instead of `List name` (`DocxBaseWriter.createTypeHyperLink`). It has never been selected and + is not reproduced; deleting that branch is the largest single simplification available here. + + The three commented-out `styles.xml` variants **are** kept, as resource files (below). + +**The docx generator is the exception to "rewritten, not ported".** Its output has to look the same +as before, and reproducing intricate OOXML — styles, numbering, tables — from scratch is far riskier +than adapting what already works. The existing code splits cleanly enough to make that practical: + +| File | Lines | JAXB imports | Treatment | +| --- | --- | --- | --- | +| `DocxWriter` | 164 | **0** | OOXML emission — lift as is | +| `DocxNumberingWriter` | 59 | **0** | lift as is | +| `DocxBaseWriter` | 526 | 4 | `addTitle`, `addComment`, `addNumberedComment`, signature rendering — lift, swapping `AreaType`/`ServiceType`/`TypeReference`/`NamedElementReference…` for the model's types | +| `GeneratorDocx` | 1176 | many | the traversal — this is what is rewritten against the new model | + +So roughly 750 lines of document-writing machinery transfer with minimal change, and the adaptation +is concentrated in the traversal. That is the same rule as everywhere else — the old code is the +reference for *what* comes out — applied to a case where the "what" is detailed enough that reusing +the mechanism producing it is the lower-risk route. + +**The OOXML boilerplate moves to resource files.** `GeneratorDocx.java` contains **271,910 +characters of string literals** — its five largest are 56,888, 43,175, 38,722, 38,702 and 38,002 +characters. These are the `styles.xml` blobs, and there are **four variants of them, three +commented out**: + +```java +// Original Calibri Style +//StubUtils.createResource(folder, "styles", ext, "param` + must name a field that exists in that stage's message, and every `@error` / `@errorinfo` an error + the operation actually declares. This rule exists specifically because `BULK` is the default + (§7.7); `INLINE` cannot desync. + +## 10. Migration + +### 10.1 Phase 0 — regression harness ✅ done + +Implemented in **`api-generator/golden/`** — `golden.sh capture | compare`, with +`intended-differences.txt` for agreed deviations and a `README.md` covering both. The baseline is +git-ignored and regenerable. + +Verified end to end: with all seven `apis/*` generated-source trees deleted and rebuilt from +scratch, the harness reported **no differences** against the baseline. Generation is reproducible. + +| | | +| --- | --- | +| Java | 950 files, ~116 000 lines, 7 modules | +| docx | 18 documents, unzipped so `word/document.xml` diffs as text | +| Baseline size | ~20 MB | + +**Two pre-existing defects surfaced on the first capture.** Neither is caused by this migration, and +both should be fixed independently of it: + +- **`area051-v001-Mission-Data-Product.xml` produces no docx at all.** Generation throws + `IllegalStateException: Unknown composite super type: String`, and `AppGenerateDocx` catches per + file — so the run reports success while silently emitting nothing for that specification. +- **`area002-v002-Basics.xml` silently overwrites `area002-v001-COM.xml`'s document.** Both declare + `name="COM" number="2" version="1"`, and the docx filename is built from area number, version and + name (`GeneratorDocx:365`). This is the §4.1 area-identity collision causing real data loss today, + and it is the strongest argument for that validation rule existing at all. + +Also noted: `area052-…-Mission-Data-Product-Distribution.xml` is written as +`Service_Specification_area009-v001-distribution.docx`, because the name comes from the *declared* +area number (9) rather than the filename (052) — one attribute away from colliding with MPD. + +The rest of this section describes what the harness does and why. + +A script that builds every `apis/*` module with the current plugin and snapshots +`target/generated-sources/stub` into a golden tree, plus the docx/svg output for the six samples in +`mo-navigator/_docx`. The Java side of that tree is **950 files and about 116 000 lines** across the +seven `apis/*` modules, from 73 files for MAL up to 342 for MPS — so Phase 0 is largely a matter of +freezing what a build already produces and scripting the comparison. + +**The golden tree detects change; it does not define correctness.** The old generator is not a +specification — its output has accumulated its own quirks, in indentation, spacing and javadoc among +other places, and reproducing those exactly is not a goal. Every difference the harness reports +falls into one of two buckets: + +- **a defect in the new generator** — fix it; +- **a deliberate improvement** — record it, with the reason, in the intended-differences list. + +That list is reviewed, not grown silently. When an improvement is agreed, the right move is to make +it once, **re-baseline the golden tree, and return the diff to zero** — a permanently fuzzy diff is +no safety net at all, because the next real regression hides in the noise. + +One entry is already known: 23 composites gain an explicit `` on XML re-export, +because the model resolves the implied base type rather than storing the absence (§4.3). + +Two tiers of check, because a diff alone is not enough once differences are intentional: + +1. **Per-file textual diff** against the baseline — fast, precise, and it names the files to look + at rather than giving one pass/fail. +2. **Compile the regenerated tree and run the existing test suites.** `apis/*` is compiled against + by `mal-impl`, `services-impl`, the transports and the testbeds, so this is what actually + establishes that a deliberate difference is harmless. + +Because the old generators keep running throughout 14.x, this harness is not a one-off: it is the +contract between the two implementations for the whole parallel period. + +### 10.2 Phases — all within 14.x + +Phase 3 is the bulk of the work and is being built category by category, each verified against the +baseline before the next is started. `JavaGeneratorGoldenTest` generates all seven `apis/*` modules +and compares only the files the generator claims to produce, so it stays green as categories are +added rather than being red until the end. What remains, by count: + +Done so far: package documentation, all 32 enumerations, and all 278 list classes — including the +heterogeneous lists that abstract composites get, which extend `HeterogeneousList` and type-check on +insertion rather than carrying a short form. What remains, measured rather than estimated: + +The **structures layer is done**: package documentation, enumerations, list classes and composites +all match the reference output exactly, across all seven modules. `JavaGeneratorGoldenTest` keeps a +per-module budget of differing files, now zero everywhere, which fails on a regression and also when +a budget is left standing after a difference is fixed. + +Two rules found late are worth recording, because both look like generator bugs until you read the +old code: + +- The non-nullable constructor is written only when there is at least one non-nullable field **and** + at least one nullable one. With no non-nullable fields it would take no arguments and collide with + the default constructor; with none nullable it would repeat the first constructor. +- Angle brackets in a comment become underscores — `>=` reads `_=` — but only inside a class. Package + documentation goes through a different path and keeps its `
                ` and `
              • ` markup. + +Exceptions and helpers followed the structures layer, each matching first time. The element +factories came next: their cases are laid out for a jump table — numbers close enough together are +switched as one and the rest answered by a second method, so a lookup is a jump rather than a binary +search — and the rules that decide the layout were carried over from `JavaElementFactory` into +`JumpTable`, rule for rule, along with the 13 tests that pin them. + +Every method is then emitted through **`JavaMethodBuilder`** rather than written line by line. It is the +one idea worth keeping from the old `MethodBuilder`, adapted rather than copied: it holds no +`ClassWriter`, only the text it produces, and each argument is given *with the description that +documents it*, so the `@param` block and the signature cannot drift apart. The body is held with the +signature, so a method is one expression from its javadoc to its closing brace. Three rules of the +reference output live there and nowhere else — arguments past the first are carried onto their own +line at a fixed step whatever the length of the signature; the blank line between the description +and the tags is written even when there is no description above it; and an override is never +documented, because javadoc carries that documentation down on its own. `JavaMethodBuilderTest` pins ten +shapes against text taken from the captured output. The six writers built so far were moved onto it +with the golden tree green throughout, which is what says the emitter reproduces what they wrote by +hand. One method resists it and stays hand-written with a note saying why: an enumeration's +no-argument constructor takes its comment verbatim — unwrapped, no trailing period, no blank line +under it — where every other method wraps it. + +Fields go the same way, through **`JavaFieldBuilder`**. It is smaller, and it carries the one rule +that is easy to get wrong by hand: a field is separated from what came before it by a blank line +*unless* it was asked to stay with it, and the reference output keeps the three fields that carry a +type's identity — `serialVersionUID`, `SHORT_FORM`, `TYPE_ID` — packed together as one block while +separating everything else. Those three appear identically in composites, enumerations and lists, so +they are written once, by `ShortForm.writeIdentity`, rather than three times. A value spanning +several lines is written as it is given, which is the same rule the method builder uses for a body +line, so an array of services or of enumeration instances lays out its own continuation. +`JavaFieldBuilderTest` pins six shapes. + +**`JavaClassBuilder`** closes the set. It is the outermost of the three: `open()` writes the package +statement, the javadoc and the declaration and hands back the source to write the members into; +`close()` writes the brace that ends the class and returns the finished text. It owns the blank line +that stands before that brace, which each writer used to repeat. Every class this generator writes is +public, so unlike the other two it offers nothing for scope. `JavaClassBuilderTest` pins five shapes. + +With all three in place a writer says only what is particular to the file it produces — no writer +now spells out a package statement, a javadoc block, a field, a signature or a closing brace. + +The builders sit either side of a package boundary that says which is which. `generators/java/` holds the +entry point and the toolkit — `JavaGenerator`, the naming and type mapping (`JavaNaming`, +`JavaTypes`, `JavaTypeName`), comment normalisation, the source buffer, `ShortForm`, `JumpTable`, +and the three builders. `generators/java/writers/` holds one class per kind of file that comes out: +`CompositeWriter`, `ListWriter`, `EnumerationWriter`, `ExceptionWriter`, `HelperWriter`, +`ElementFactoryWriter`, `ServiceInfoWriter`, `ConsumerStubWriter`, `ConsumerAdapterWriter`, +`SubscriptionKeysWriter`, `ProviderHandlerWriter`, `ProviderSkeletonWriter`, +`ProviderInheritanceSkeletonWriter`, `ProviderInteractionWriter`, `ProviderPublisherWriter`, +`MultiReturnBodyWriter`. The dependency runs one way — a writer reaches into the toolkit, never the +reverse — and the provider, consumer and `ServiceInfo` writers join the second package as they are +built. + +The `ServiceInfo` classes followed, and brought two corrections to what sits underneath them. + +- **An empty comment is not an absent one.** The importer was collapsing `comment=""` to null, and + the specifications carry over 800 of them. Everywhere a comment is *shown* the two read alike — a + generator substitutes a plain description for either — but an `OperationField` records the comment + as a Java string literal, so `""` and `null` are different source. `StaxCursor.comment()` now keeps + the three states apart: absent, empty, written. +- **A list of an abstract type has no short form**, the same as the type itself. What is on the wire + is decided per message either way. + +The consumer followed: 27 stubs, 27 adapters and 17 subscription-key classes. Three rules of the +reference output were not obvious and are now written down where they belong. + +- **A message with no fields is sent as `(Object[]) null`**, cast so the empty case picks the + varargs overload rather than reading as one null array. +- **An argument the specification did not describe is documented by its place in the message** — + ` Argument number as defined by the service operation`. A notify callback numbers from + 2, because the MAL always sends the subscription identifier and the update header first. +- **What a decoder is handed** is in `JavaTypeName.expectedTypeOf`, shared by both consumer + writers: an abstract type gets nothing, a list of abstract things still gets an empty list, and a + list of the base Element gets nothing again — the rule matches on the name, and before the Java + mapping renames it that type is called `ElementList`. + +The provider side closed it out: 27 handler interfaces, 27 skeleton interfaces, 27 inheritance +skeletons, 17 interaction classes and 17 publishers, then the 3 multi-return body classes and the +two `package-info` files that come with them. Two more rules of the reference output were written +down on the way: + +- **An interface packs its declarations**, with no blank line between them and none before the brace + that closes it. `JavaClassBuilder.asInterface()` owns that, and `JavaMethodBuilder.asDeclaration()` + no longer writes a leading blank. +- **A dispatch wraps its switch in a try only where an operation of that pattern declares errors of + its own**, so that a provider can raise them directly and have them arrive as an interaction + exception. + +**Phase 3 is complete: 950 of 950 files, byte for byte.** + +### 10.3 The plugin swap, tried in v14 + +The maven plugin finds its generators by scanning for implementations of its own `Generator` +interface, so reaching the library needs an adapter: **`NewJavaGenerator`**, in the plugin module +where that interface already lives, not in the library — the library imports only `java.*` and that +does not change for a plugin's convenience. It answers to the name **`Java2`**, so both generators +sit on the classpath at once and a build picks between them with a one-line change; nothing has to +be taken away to try it. + +Two things about the adapter are worth stating. The library reads XML itself rather than being +handed a parsed tree, so what the plugin passes is used for the *file* it names and nothing else. +And generation is deferred to `close`: the library links every specification before generating any +of them, which is what a reference across two files needs, whereas the old interface expects a +generator to emit one specification at a time. + +The trial: point `apis/*` at `Java2`, build the whole repository clean, and compare. + +- **950 of 950 generated files identical** to the baseline, through the plugin rather than a test + harness. +- **41 modules built, 534 tests, no failures.** `mal-impl`, the services, all six transports, the + three encodings, the demos and `mo-navigator` all compile and pass against the regenerated API. +- Reverted afterwards; the old path still builds and still produces the same 950 files. + +The one-line change that makes the swap, kept out of the committed pom for now: + +```xml +Java2 +``` + +...together with swapping `generator-java` for `api-generator-lib` in the plugin's dependencies in +`parent/pom.xml`. + +### 10.4 Held against a specification set from outside this repository + +The golden tree pins the CCSDS specifications, which are the ones the library was written against. +The NanoSat MO Framework carries its own — four areas of its own numbering (COM 51, Monitor and +Control 52, Software Management 53, Platform 54), generated by the same maven plugin — so running +both generators over those is a check the library never had a chance to overfit to. + +**546 files, no differences.** It took two fixes to get there, and both were model gaps rather than +generator defects, which is exactly what an outside corpus is for: + +- **A COM extended service does not have to declare any features.** Extended-ness was inferred from + the presence of ``, and NMF has services — `Archive`, `AutonomousADCS` and others — + that are `xsi:type="com:ExtendedServiceType"` with no features at all. Their `ServiceInfo` must + still extend `COMService`. `Service.isExtended()` now records it from the element itself, and the + XML exporter writes the attribute from that flag rather than from the features. The CCSDS corpus + has the same case in `area051-v001-Mission-Data-Product.xml`, which is now a test. +- **A specification named twice is not a conflict.** A module commonly lists its own specification + among its references as well as its target — NMF's COM module does. Both copies were being + indexed, `findArea(name, version)` refused to answer an ambiguous lookup, and *every* type in that + area silently failed to resolve: enumerations lost their singleton, abstract types gained a short + form. `MOModel.add` now recognises the same file arriving twice and leaves the second out of the + index. + + +| # | Deliverable | Verified by | +| --- | --- | --- | +| 1 ✅ | Module skeleton, model, validator | 31 unit tests | +| 2 ✅ | XML importer, linker, exporter, schema validation | round-trip over 18 of 20 specs; the other 2 are refused because they break their own schema (§6.1) | +| 3 ✅ | Java generator | golden tree from Phase 0 — **950 of 950 files, all byte-identical** | +| 4 | docx + svg generators | golden docx/svg from Phase 0 — **same zero-diff standard as Java**: the documents must come out looking as they do today (§8) | +| 5 | MOSpec importer + exporter, incl. COM, documentation and diagrams | §7.3 closure test over all 20 specs, both text-level and `xml → … → xml` (§7.9) | + +Phase 2 comes first because everything else depends on it. Phase 5 comes last because nothing in +the Maven build depends on it — MOSpec's only consumer is the `mo-navigator` editor. + +None of these phases changes how `apis/*` is built. Each lands as a new module with its own tests +while `generator-java` keeps generating the shipped code. + +One thing can adopt the new library ahead of the cut-over, because nothing downstream consumes its +output: **a pilot `apis/*` module**, switched by generator name (§3), generated and compiled by the +new library as a standing integration test. + +**`mo-navigator` waits for v15.0** and moves with everything else. It keeps +`de.dlr.gsoc.mcds:mosdl`, the vendored `MosdlSpecLoader` (1247 lines) and `GeneratorMOSDL` (972 +lines) throughout 14.x, all of which are retired at the cut-over. The cost of waiting is that MOSpec +gets no interactive editing use before then — its correctness rests entirely on the §7.3 and §7.9 +round-trip tests, which is a reason to keep those thorough rather than to move the navigator early. + +### 10.3 Cut-over — v15.0 + +The cut-over is **flipping the default**, not proving the new path works — that has been +demonstrable since Phase 3, by building the whole reactor with `-Pnew-generator` (§3). By this point +the two implementations should have been producing agreed output in CI for some time, so v15.0 is +bookkeeping rather than a leap: + +- `esa.stubgen.generator` defaults to the new generator, and the profile disappears; +- `parent/pom.xml` points the plugin's dependency at `api-generator-lib`; +- `generator-interfaces`, `generator-java` and `generator-docs` are deleted, along with everything + in §10.4; +- the golden tree is re-baselined from the new library, since there is no longer a second + implementation to agree with. + +If the new path is not producing agreed output by then, the correct response is to leave the default +alone and ship 15.0 without the deletion — nothing else in the release depends on it. + +### 10.4 Removed at cut-over (v15.0) + +The new library never carries any of these; they disappear from the repository when the old modules +are deleted. Until then they stay exactly as they are — no clean-up of the old code during 14.x, +since the whole point of keeping it is that it goes on working untouched. + +- `GeneratorGwt` — dead (§8). +- `Generator.loadXSD()`, `XsdSpecification`, the `w3c.xsd` package, `src/main/xsd-ref/` and + `MOTypeRegistry.loadTypesFromXsdList()`. The only `xsd-ref` directory in the repository is the + generator's own, so no module feeds this path. Removing it deletes the second `xjc` execution and + the checked-in `XMLSchema.xsd`/DTD copies. +- `org.reflections` generator discovery. +- **The plugin's configuration options** — `packageBindings`, `generateStructures`, `generateCOM`, + `extraProperties`, `forceGeneration`, `xsdRefDirectory`. Two independent reasons they cannot go + earlier: + 1. **They are still wired to live code during 14.x.** The plugin goes on driving the old + generators, which genuinely read all six (§5.2). They are not vestigial parameters being kept + for compatibility — they still do exactly what they do today. Only when the old generators are + deleted is there nothing behind them, and that is the cut-over by definition. + 2. Removing a Mojo `@Parameter` breaks any external pom that sets one, since Maven fails on + unknown plugin configuration. That is a major-version change, announced in the release notes. + + Note the removal is then optional rather than required: the plugin may keep its surface and + quietly ignore the options, at no cost to the library, which never had them (§3, invariant 4). +- `XmlSpecification.modifyFileToBeBackwardsCompatible()`. +- `ParserMOSDL`'s comment string-replacement. +- `OperationSummary`, `ServiceSummary`, `FieldInfo`, `TypeKey` — superseded by the model. + `CompositeField` is not carried over either — whatever the Java generator needs to render a field + is re-derived from the model rather than inherited (§8). + +## 11. Decisions taken + +No open points outstanding. Decisions taken while writing this document are recorded where they apply, with +the evidence that settled them, so that they are not silently reopened: + +| Decision | Where | +| --- | --- | +| One library, not several; the Maven plugin stays separate | §3 | +| No configuration — invariant 4 | §3 | +| Java 1.8 | §3 | +| Area identity keyed on `(name, number, version)`; collisions are a `WARNING` | §4.1 | +| Type references resolve against the loaded area version, not the schema version | §4.1 | +| MAL attribute types come from the MAL specification; the Java mapping stays in the generator | §4.2 | +| `CompositeType.superType` always set — `extends` written explicitly | §4.3 | +| COM first-class, always generated | §4.4 | +| The model is the union of v001 and v003; the exporter refuses cross-version constructs | §4.5 | +| Requirement IDs only where the specification authored them | §4.6 | +| Documentation markup: existing `DocxBaseWriter` behaviour is normative | §4.6 | +| `import → link → validate → generate`; ERROR halts, WARNING proceeds | §5.1, §5.3 | +| Targets are an argument to `generate`, not model state | §5.2 | +| Schema validation on export, against the real v001/v003 schemas | §6.1 | +| MOSpec: name, hand-written parser, no MOSDL compatibility | §7.1, §7.2 | +| A `.mospec` file is a specification, holding one or more areas | §7.1, §7.9 | +| Diagrams as sidecar SVGs | §7.6 | +| `BULK` the default doc mode | §7.7 | +| Type-first field declarations, `replayable`, arrows unchanged | §7.8 | +| docx: output unchanged, OOXML layer lifted, styles to resource files | §8 | +| Rewrite rather than port; no language abstraction before a second language | §8, §8.1 | +| Parallel generation, with determinism as the binding constraint | §8.2 | +| Parallel running through 14.x, cut-over at v15.0 | §3, §10.3 | diff --git a/api-generator/api-generator-lib/pom.xml b/api-generator/api-generator-lib/pom.xml new file mode 100644 index 00000000..2c35d065 --- /dev/null +++ b/api-generator/api-generator-lib/pom.xml @@ -0,0 +1,109 @@ + + + + + + 4.0.0 + + + int.esa.ccsds.mo + parent + 14.2-SNAPSHOT + ../../parent/pom.xml + + + api-generator-lib + 14.2-SNAPSHOT + jar + + ESA MO API Generator - Library + Model of MO service specifications, with importers, exporters and generators + + + ESA + http://www.esa.int + + + + + The European Space Agency Public License, Version 2.0 + https://raw.githubusercontent.com/esa/mo-services-java/master/LICENCE.md + repo + + + + + scm:git:git@github.com:esa/mo-services-java.git + scm:git:git@github.com:esa/mo-services-java.git + https://github.com/esa/mo-services-java + + + + GitHub + https://github.com/esa/mo-services-java/issues + + + + + false + xml-ccsds-mo-standards + ${project.build.outputDirectory} + **/*.xsd + + + + + + + int.esa.ccsds.mo + xml-ccsds-mo-standards + 14.2-SNAPSHOT + provided + + + junit + junit + test + + + + + + + ${basedir}/.. + + LICENCE.md + + + + + + org.apache.maven.plugins + maven-dependency-plugin + + + org.apache.maven.plugins + maven-compiler-plugin + + + + diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/exporters/ExportException.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/exporters/ExportException.java new file mode 100644 index 00000000..86452c71 --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/exporters/ExportException.java @@ -0,0 +1,37 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.exporters; + +/** + * Thrown when a model cannot be written in the requested format. + *

                + * The commonest cause is a construct the target schema version does not have. An exporter + * refuses rather than dropping it: writing a v003 model into a v001 file would silently + * lose its subscription keys. + */ +public class ExportException extends Exception { + + private static final long serialVersionUID = 1L; + + public ExportException(String message) { + super(message); + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/exporters/Exporter.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/exporters/Exporter.java new file mode 100644 index 00000000..d6d43eb8 --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/exporters/Exporter.java @@ -0,0 +1,44 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.exporters; + +import esa.mo.apigen.model.Specification; +import java.io.IOException; +import java.nio.file.Path; + +/** + * Writes a specification out. + *

                + * Exporters write to a directory rather than to a stream because no export is necessarily + * one document: a MOSpec specification is a text file plus a sidecar for each diagram. + */ +public interface Exporter { + + /** + * Writes a specification. + * + * @param spec The specification to write. + * @param outputDir The directory to write into. Created if it does not exist. + * @throws IOException if writing fails. + * @throws ExportException if the specification cannot be represented in this format. + */ + void write(Specification spec, Path outputDir) throws IOException, ExportException; +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/exporters/xml/SchemaValidation.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/exporters/xml/SchemaValidation.java new file mode 100644 index 00000000..ef196526 --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/exporters/xml/SchemaValidation.java @@ -0,0 +1,145 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.exporters.xml; + +import esa.mo.apigen.model.SchemaVersion; +import java.io.IOException; +import java.io.InputStream; +import java.io.StringReader; +import java.util.EnumMap; +import java.util.Map; +import javax.xml.XMLConstants; +import javax.xml.transform.Source; +import javax.xml.transform.stream.StreamSource; +import javax.xml.validation.Schema; +import javax.xml.validation.SchemaFactory; +import javax.xml.validation.Validator; +import org.xml.sax.ErrorHandler; +import org.xml.sax.SAXException; +import org.xml.sax.SAXParseException; + +/** + * Validates exported XML against the normative schema, using JAXP - part of the JDK, so + * this adds no dependency. + *

                + * The schema encodes constraints a hand-written validator would otherwise have to + * duplicate, so anything the XSD can state is left to it. Each specification is checked + * against its own version rather than against the backwards-compatible hybrid, which + * accepts documents neither version does. + *

                + * The schemas are unpacked into this library's resources at build time from + * {@code xml-ccsds-mo-standards}. Copying rather than keeping a hand-maintained copy + * matters: a hand-kept copy is how a divergent snapshot of this schema came to be shipped + * elsewhere. + */ +public final class SchemaValidation { + + private static final Map CACHE + = new EnumMap(SchemaVersion.class); + + private SchemaValidation() { + } + + /** + * Validates a document. + * + * @param xml The document. + * @param version The schema version to check it against. + * @return null if the document is valid, otherwise a description of the first problem. + */ + public static synchronized String check(String xml, SchemaVersion version) { + Schema schema; + try { + schema = schemaFor(version); + } catch (SAXException ex) { + return "the " + version + " schema could not be loaded: " + ex.getMessage(); + } catch (IOException ex) { + return "the " + version + " schema could not be read: " + ex.getMessage(); + } + if (schema == null) { + return null; // no schema available; nothing to check against + } + final StringBuilder first = new StringBuilder(); + try { + Validator validator = schema.newValidator(); + validator.setErrorHandler(new ErrorHandler() { + @Override + public void warning(SAXParseException ex) { + // not a failure + } + + @Override + public void error(SAXParseException ex) throws SAXException { + record(ex); + } + + @Override + public void fatalError(SAXParseException ex) throws SAXException { + record(ex); + } + + private void record(SAXParseException ex) throws SAXException { + if (first.length() == 0) { + first.append("line ").append(ex.getLineNumber()) + .append(", column ").append(ex.getColumnNumber()) + .append(": ").append(ex.getMessage()); + } + throw ex; + } + }); + validator.validate(new StreamSource(new StringReader(xml))); + } catch (SAXException ex) { + return first.length() > 0 ? first.toString() : ex.getMessage(); + } catch (IOException ex) { + return "could not read the document: " + ex.getMessage(); + } + return null; + } + + private static Schema schemaFor(SchemaVersion version) throws SAXException, IOException { + Schema cached = CACHE.get(version); + if (cached != null) { + return cached; + } + // v001 documents may carry COM features; no v003 specification does, which is + // consistent with COMSchema importing the v001 service schema. + String[] resources = version == SchemaVersion.V001 + ? new String[]{"/xsd/ServiceSchema.xsd", "/xsd/COMSchema.xsd"} + : new String[]{"/xsd/ServiceSchema-v003.xsd"}; + + Source[] sources = new Source[resources.length]; + for (int i = 0; i < resources.length; i++) { + InputStream in = SchemaValidation.class.getResourceAsStream(resources[i]); + if (in == null) { + return null; // schemas not on the classpath in this build + } + StreamSource source = new StreamSource(in); + // A system id so that COMSchema's relative import of the service schema + // resolves against its sibling. + source.setSystemId(SchemaValidation.class.getResource(resources[i]).toExternalForm()); + sources[i] = source; + } + SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); + Schema schema = factory.newSchema(sources); + CACHE.put(version, schema); + return schema; + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/exporters/xml/XmlExporter.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/exporters/xml/XmlExporter.java new file mode 100644 index 00000000..b9045d6e --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/exporters/xml/XmlExporter.java @@ -0,0 +1,444 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.exporters.xml; + +import esa.mo.apigen.exporters.ExportException; +import esa.mo.apigen.exporters.Exporter; +import esa.mo.apigen.importers.xml.XmlNames; +import esa.mo.apigen.model.*; +import esa.mo.apigen.model.com.COMFeatures; +import esa.mo.apigen.model.com.COMObject; +import esa.mo.apigen.model.com.ObjectLink; +import esa.mo.apigen.model.docs.Diagram; +import esa.mo.apigen.model.docs.DocSection; +import esa.mo.apigen.model.docs.Documentation; +import esa.mo.apigen.model.types.*; +import java.io.IOException; +import java.io.OutputStreamWriter; +import java.io.StringWriter; +import java.io.Writer; +import java.nio.charset.Charset; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.List; + +/** + * Writes a specification back to the CCSDS service schema XML, in the version the + * specification declares. + *

                + * Constructs the target version does not have are refused rather than dropped: writing a + * v003 model into a v001 file would silently lose its subscription keys, and a silent + * loss is worse than a failed export. + */ +public final class XmlExporter implements Exporter { + + @Override + public void write(Specification spec, Path outputDir) throws IOException, ExportException { + Files.createDirectories(outputDir); + String name = spec.getSource() == null ? "specification.xml" : spec.getSource().getName(); + Writer out = new OutputStreamWriter( + Files.newOutputStream(outputDir.resolve(name)), Charset.forName("UTF-8")); + try { + writeTo(spec, out); + } finally { + out.close(); + } + } + + /** + * Writes a specification to any writer. The directory form above is a wrapper over + * this, so that in-memory use and file use are the same code. + * + * @param spec The specification to write. + * @param out Where to write it. + * @throws IOException if writing fails. + * @throws ExportException if the model cannot be represented in its schema version. + */ + public void writeTo(Specification spec, Writer out) throws IOException, ExportException { + SchemaVersion version = spec.getSchemaVersion(); + if (version == null) { + throw new ExportException("The specification does not say which schema it uses"); + } + StringWriter buffered = new StringWriter(); + XmlWriter xml = new XmlWriter(buffered); + xml.start("mal:specification"); + xml.attr("xmlns:mal", version.getNamespace()); + xml.attr("xmlns:com", XmlNames.COM); + xml.attr("xmlns:svg", XmlNames.SVG); + xml.attr("xmlns:xsi", XmlNames.XSI); + xml.attr("comment", spec.getComment()); + for (Area area : spec.getAreas()) { + writeArea(xml, version, area); + } + xml.end(); + xml.flush(); + + // Validated before it is written, so a failed export cannot leave an invalid + // document behind (design section 6.1). + String document = buffered.toString(); + String problem = SchemaValidation.check(document, version); + if (problem != null) { + throw new ExportException("The exported document does not satisfy the " + + version + " schema - " + problem); + } + out.write(document); + out.flush(); + } + + /** + * Returns the specification as a string. + * + * @param spec The specification to write. + * @return the XML document. + * @throws ExportException if the model cannot be represented in its schema version. + */ + public String toXml(Specification spec) throws ExportException { + StringWriter out = new StringWriter(); + try { + writeTo(spec, out); + } catch (IOException ex) { + throw new IllegalStateException("a StringWriter cannot fail", ex); + } + return out.toString(); + } + + // ----------------------------------------------------------------- area + + private void writeArea(XmlWriter xml, SchemaVersion version, Area area) + throws IOException, ExportException { + xml.start("mal:area"); + xml.attr("name", area.getName()); + xml.attr("number", area.getNumber()); + xml.attr("version", area.getVersion()); + xml.attr("comment", area.getComment()); + writeDocumentation(xml, area.getDocumentation()); + for (Service service : area.getServices()) { + writeService(xml, version, service); + } + writeDataTypes(xml, version, area.getDataTypes(), true); + writeErrorDefinitions(xml, area.getErrors()); + xml.end(); + } + + // -------------------------------------------------------------- service + + private void writeService(XmlWriter xml, SchemaVersion version, Service service) + throws IOException, ExportException { + if (version == SchemaVersion.V003) { + if (!service.getDataTypes().isEmpty()) { + throw new ExportException("Service '" + service.getName() + "' declares data " + + "types, which the v003 schema does not have"); + } + if (!service.getErrors().isEmpty()) { + throw new ExportException("Service '" + service.getName() + "' declares errors, " + + "which the v003 schema does not have"); + } + } + xml.start("mal:service"); + xml.attr("name", service.getName()); + xml.attr("number", service.getNumber()); + xml.attr("comment", service.getComment()); + if (service.isExtended()) { + xml.attr("xsi:type", "com:ExtendedServiceType"); + } + writeDocumentation(xml, service.getDocumentation()); + for (CapabilitySet set : service.getCapabilitySets()) { + writeCapabilitySet(xml, version, set); + } + writeDataTypes(xml, version, service.getDataTypes(), false); + writeErrorDefinitions(xml, service.getErrors()); + if (service.getCom() != null) { + writeCom(xml, service.getCom()); + } + xml.end(); + } + + private void writeCapabilitySet(XmlWriter xml, SchemaVersion version, CapabilitySet set) + throws IOException, ExportException { + xml.start("mal:capabilitySet"); + xml.attr("number", set.getNumber()); + xml.attr("comment", set.getComment()); + for (Operation op : set.getOperations()) { + writeOperation(xml, version, op); + } + xml.end(); + } + + // ------------------------------------------------------------ operation + + private void writeOperation(XmlWriter xml, SchemaVersion version, Operation op) + throws IOException, ExportException { + if (op.getPattern() == null) { + throw new ExportException("Operation '" + op.getName() + "' has no interaction pattern"); + } + if (version == SchemaVersion.V003 && op.isSupportInReplay()) { + throw new ExportException("Operation '" + op.getName() + "' sets supportInReplay, " + + "which the v003 schema does not have"); + } + if (version == SchemaVersion.V001 && !op.getDocumentation().isEmpty()) { + throw new ExportException("Operation '" + op.getName() + "' carries documentation, " + + "which the v001 schema does not have"); + } + String element = "mal:" + op.getPattern().name().toLowerCase() + "IP"; + xml.start(element); + xml.attr("name", op.getName()); + xml.attr("number", op.getNumber()); + if (version == SchemaVersion.V001) { + xml.attr("supportInReplay", op.isSupportInReplay()); + } + xml.attr("comment", op.getComment()); + writeDocumentation(xml, op.getDocumentation()); + + xml.start("mal:messages"); + for (InteractionStage stage : op.getPattern().getStages()) { + MessageBody body = op.getMessage(stage); + if (body == null) { + continue; + } + if (stage == InteractionStage.SUBSCRIPTION_KEYS && version == SchemaVersion.V001) { + throw new ExportException("Operation '" + op.getName() + "' declares subscription " + + "keys, which the v001 schema does not have"); + } + xml.start("mal:" + stage.getXmlName()); + xml.attr("comment", body.getComment()); + for (Field field : body.getFields()) { + writeField(xml, field); + } + xml.end(); + } + xml.end(); + + if (!op.getErrors().isEmpty()) { + xml.start("mal:errors"); + for (ErrorReference ref : op.getErrors()) { + xml.start("mal:errorRef"); + xml.attr("comment", ref.getComment()); + writeTypeRef(xml, ref.getError()); + writeExtraInformation(xml, ref.getExtraInformation()); + xml.end(); + } + xml.end(); + } + xml.end(); + } + + private void writeField(XmlWriter xml, Field field) throws IOException { + xml.start("mal:field"); + xml.attr("name", field.getName()); + xml.attr("canBeNull", field.isCanBeNull()); + xml.attr("comment", field.getComment()); + writeTypeRef(xml, field.getType()); + xml.end(); + } + + private void writeTypeRef(XmlWriter xml, TypeRef ref) throws IOException { + if (ref == null) { + return; + } + xml.start("mal:type"); + xml.attr("area", ref.getArea()); + if (ref.getService() != null) { + xml.attr("service", ref.getService()); + } + xml.attr("name", ref.getName()); + xml.attr("list", ref.isList()); + if (ref.isObjectRef()) { + xml.attr("objectRef", true); + } + xml.end(); + } + + private void writeExtraInformation(XmlWriter xml, Field extra) throws IOException { + if (extra == null) { + return; + } + xml.start("mal:extraInformation"); + xml.attr("comment", extra.getComment()); + writeTypeRef(xml, extra.getType()); + xml.end(); + } + + // ---------------------------------------------------------------- types + + private void writeDataTypes(XmlWriter xml, SchemaVersion version, + List types, boolean areaLevel) throws IOException, ExportException { + if (types.isEmpty()) { + return; + } + xml.start("mal:dataTypes"); + for (TypeDefinition type : types) { + if (type instanceof FundamentalType) { + FundamentalType fundamental = (FundamentalType) type; + xml.start("mal:fundamental"); + xml.attr("name", type.getName()); + xml.attr("comment", type.getComment()); + writeExtends(xml, fundamental.getSuperType()); + xml.end(); + } else if (type instanceof AttributeType) { + xml.start("mal:attribute"); + xml.attr("name", type.getName()); + xml.attr("shortFormPart", ((AttributeType) type).getShortFormPart()); + xml.attr("comment", type.getComment()); + xml.end(); + } else if (type instanceof CompositeType) { + CompositeType composite = (CompositeType) type; + xml.start("mal:composite"); + xml.attr("name", type.getName()); + if (composite.getShortFormPart() != null) { + xml.attr("shortFormPart", composite.getShortFormPart().intValue()); + } + xml.attr("comment", type.getComment()); + writeExtends(xml, composite.getSuperType()); + for (Field field : composite.getFields()) { + writeField(xml, field); + } + xml.end(); + } else if (type instanceof EnumerationType) { + EnumerationType enumeration = (EnumerationType) type; + xml.start("mal:enumeration"); + xml.attr("name", type.getName()); + xml.attr("shortFormPart", enumeration.getShortFormPart()); + xml.attr("comment", type.getComment()); + for (EnumerationItem item : enumeration.getItems()) { + xml.start("mal:item"); + xml.attr("value", item.getValue()); + xml.attr("nvalue", item.getNumericValue()); + xml.attr("comment", item.getComment()); + xml.end(); + } + xml.end(); + } + } + xml.end(); + } + + private void writeExtends(XmlWriter xml, TypeRef superType) throws IOException { + if (superType == null) { + return; + } + xml.start("mal:extends"); + writeTypeRef(xml, superType); + xml.end(); + } + + private void writeErrorDefinitions(XmlWriter xml, List errors) + throws IOException { + if (errors.isEmpty()) { + return; + } + xml.start("mal:errors"); + for (ErrorDefinition error : errors) { + xml.start("mal:error"); + xml.attr("name", error.getName()); + xml.attr("number", error.getNumber()); + xml.attr("comment", error.getComment()); + writeExtraInformation(xml, error.getExtraInformation()); + xml.end(); + } + xml.end(); + } + + // ------------------------------------------------------------------ COM + + private void writeCom(XmlWriter xml, COMFeatures com) throws IOException { + xml.start("com:features"); + writeDocumentation(xml, com.getDocumentation()); + if (!com.getObjects().isEmpty() || com.getObjectsComment() != null) { + xml.start("com:objects"); + xml.attr("comment", com.getObjectsComment()); + writeComObjects(xml, "object", com.getObjects()); + xml.end(); + } + if (!com.getEvents().isEmpty() || com.getEventsComment() != null) { + xml.start("com:events"); + xml.attr("comment", com.getEventsComment()); + writeComObjects(xml, "event", com.getEvents()); + xml.end(); + } + if (com.getArchiveUsage() != null) { + xml.start("com:archiveUsage"); + xml.attr("comment", com.getArchiveUsage()); + xml.end(); + } + if (com.getActivityUsage() != null) { + xml.start("com:activityUsage"); + xml.attr("comment", com.getActivityUsage()); + xml.end(); + } + xml.end(); + } + + private void writeComObjects(XmlWriter xml, String element, List objects) + throws IOException { + for (COMObject object : objects) { + xml.start("com:" + element); + xml.attr("name", object.getName()); + xml.attr("number", object.getNumber()); + xml.attr("comment", object.getComment()); + if (object.getBodyType() != null) { + xml.start("com:objectType"); + writeTypeRef(xml, object.getBodyType()); + xml.end(); + } + writeObjectLink(xml, "relatedObject", object.getRelated()); + writeObjectLink(xml, "sourceObject", object.getSource()); + xml.end(); + } + } + + private void writeObjectLink(XmlWriter xml, String element, ObjectLink link) + throws IOException { + if (link == null) { + return; + } + xml.start("com:" + element); + xml.attr("comment", link.getComment()); + if (link.getTarget() != null) { + xml.start("com:objectType"); + xml.attr("area", link.getTarget().getArea()); + xml.attr("service", link.getTarget().getService()); + xml.attr("number", link.getTarget().getNumber()); + xml.end(); + } + xml.end(); + } + + // -------------------------------------------------------- documentation + + private void writeDocumentation(XmlWriter xml, Documentation docs) throws IOException { + if (docs == null) { + return; + } + for (DocSection section : docs.getSections()) { + xml.start("mal:documentation"); + xml.attr("name", section.getName()); + xml.attr("order", section.getOrder()); + xml.text(section.getContent()); + xml.end(); + } + for (Diagram diagram : docs.getDiagrams()) { + xml.start("mal:diagram"); + xml.attr("name", diagram.getName()); + xml.raw(diagram.getSvg()); + xml.end(); + } + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/exporters/xml/XmlWriter.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/exporters/xml/XmlWriter.java new file mode 100644 index 00000000..7408742a --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/exporters/xml/XmlWriter.java @@ -0,0 +1,150 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.exporters.xml; + +import java.io.IOException; +import java.io.Writer; +import java.util.ArrayDeque; +import java.util.Deque; + +/** + * A small indenting XML writer. + *

                + * Hand-written rather than StAX because the output has to be laid out predictably: the + * round-trip test compares documents, and a writer that decides its own line breaks makes + * every comparison a negotiation. + */ +public final class XmlWriter { + + private final Writer out; + private final Deque open = new ArrayDeque(); + private boolean elementOpen; + private boolean hasChildren; + + public XmlWriter(Writer out) throws IOException { + this.out = out; + out.write("\n"); + } + + public void start(String name) throws IOException { + closeStartTag(true); + indent(open.size()); + out.write("<" + name); + open.push(name); + elementOpen = true; + hasChildren = false; + } + + public void attr(String name, String value) throws IOException { + if (value != null) { + out.write(" " + name + "=\"" + escapeAttr(value) + "\""); + } + } + + public void attr(String name, int value) throws IOException { + out.write(" " + name + "=\"" + value + "\""); + } + + public void attr(String name, long value) throws IOException { + out.write(" " + name + "=\"" + value + "\""); + } + + public void attr(String name, boolean value) throws IOException { + out.write(" " + name + "=\"" + value + "\""); + } + + /** + * Writes the element's text content. Must be called before any child element. + * + * @param text The content, written escaped. + * @throws IOException if writing fails. + */ + public void text(String text) throws IOException { + if (text == null) { + return; + } + closeStartTag(false); + out.write(escapeText(text)); + hasChildren = true; + } + + /** + * Writes pre-serialised markup as-is - used for diagrams, whose SVG the model carries + * as text. + * + * @param markup The markup to write verbatim. + * @throws IOException if writing fails. + */ + public void raw(String markup) throws IOException { + if (markup == null) { + return; + } + closeStartTag(false); + out.write(markup); + hasChildren = true; + } + + public void end() throws IOException { + String name = open.pop(); + if (elementOpen) { + out.write("/>\n"); + elementOpen = false; + } else { + if (!hasChildren) { + indent(open.size()); + } + out.write("\n"); + } + hasChildren = false; + } + + private void closeStartTag(boolean newline) throws IOException { + if (elementOpen) { + out.write(">"); + if (newline) { + out.write("\n"); + } + elementOpen = false; + } + } + + private void indent(int depth) throws IOException { + for (int i = 0; i < depth; i++) { + out.write(" "); + } + } + + public void flush() throws IOException { + out.flush(); + } + + private static String escapeText(String text) { + return text.replace("&", "&").replace("<", "<").replace(">", ">"); + } + + private static String escapeAttr(String text) { + return escapeText(text) + .replace("\"", """) + .replace("\n", " ") + .replace("\r", " ") + .replace("\t", " "); + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/Generator.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/Generator.java new file mode 100644 index 00000000..0bc0bd75 --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/Generator.java @@ -0,0 +1,59 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.generators; + +import esa.mo.apigen.model.Area; +import esa.mo.apigen.model.MOModel; +import java.io.IOException; +import java.nio.file.Path; +import java.util.List; + +/** + * Turns a model into output of some kind. + *

                + * The caller says which areas to generate: the model itself holds every specification + * loaded, including those present only so that references resolve, and which of them are + * wanted is a property of the build rather than of the model. + *

                + * There is no configuration phase. A generator is constructed and then called. + */ +public interface Generator { + + /** + * @return the short name used to select this generator, for example "Java". + */ + String getShortName(); + + /** + * @return a one-line description. + */ + String getDescription(); + + /** + * Generates output for the given areas. + * + * @param model Every loaded specification, linked and validated. + * @param targets The areas to generate. Others are available for reference only. + * @param outputDir The directory to write into. + * @throws IOException if writing fails. + */ + void generate(MOModel model, List targets, Path outputDir) throws IOException; +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/JavaClassBuilder.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/JavaClassBuilder.java new file mode 100644 index 00000000..c9d96950 --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/JavaClassBuilder.java @@ -0,0 +1,196 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.generators.java; + +import java.util.ArrayList; +import java.util.List; + +/** + * One Java class, from its package statement to its closing brace. + *

                + * The outermost of the three builders. {@link #open} writes the package statement, the + * javadoc and the declaration and hands back the source to write the members into; + * {@link #close} writes the brace that ends the class and returns the finished text. The + * members in between are written with {@link JavaFieldBuilder} and + * {@link JavaMethodBuilder}, which is why the class does not hold them itself: a writer + * decides what goes in and in what order, and this decides how the class around them reads. + *

                + * Every class this generator writes is public, so there is nothing to say about scope. + */ +public final class JavaClassBuilder { + + private final String name; + + private final List interfaces = new ArrayList(); + + private final JavaSource out = new JavaSource(); + + private String packageName = null; + + private String comment = null; + + private String superClass = null; + + private boolean isFinal = false; + + private boolean isAbstract = false; + + private boolean isInterface = false; + + private JavaClassBuilder(String name) { + this.name = name; + } + + /** + * @param name The name of the class. + * @return a public class, extending nothing and implementing nothing. + */ + public static JavaClassBuilder named(String name) { + return new JavaClassBuilder(name); + } + + /** + * Sets the package the class belongs to. + * + * @param name The package name. + * @return this class. + */ + public JavaClassBuilder inPackage(String name) { + this.packageName = name; + return this; + } + + /** + * Sets the comment of the class. + * + * @param text The comment, may be null. + * @return this class. + */ + public JavaClassBuilder comment(String text) { + this.comment = text; + return this; + } + + /** + * Sets the class this one extends. + * + * @param type The super class. + * @return this class. + */ + public JavaClassBuilder extending(String type) { + this.superClass = type; + return this; + } + + /** + * Adds an interface the class implements, in order. + * + * @param type The interface. + * @return this class. + */ + public JavaClassBuilder implementing(String type) { + interfaces.add(type); + return this; + } + + /** + * @return this class, marked final. + */ + public JavaClassBuilder asFinal() { + this.isFinal = true; + return this; + } + + /** + * @return this class, marked abstract. + */ + public JavaClassBuilder asAbstract() { + this.isAbstract = true; + return this; + } + + /** + * Marks this as an interface rather than a class. Its members are declarations, so they + * are written packed together rather than a blank line apart, and the blank line that + * separates them from the declaration is written here instead. + * + * @return this class. + */ + public JavaClassBuilder asInterface() { + this.isInterface = true; + return this; + } + + /** + * Writes everything down to the brace that opens the class. + * + * @return the source to write the members into. + */ + public JavaSource open() { + out.line("package " + packageName + ";"); + out.blank(); + + List lines = JavaComment.normaliseInClass(comment); + if (!lines.isEmpty()) { + out.line("/**"); + for (String line : lines) { + out.line(" * " + line); + } + out.line(" */"); + } + + StringBuilder buf = new StringBuilder("public "); + if (isFinal) { + buf.append("final "); + } + if (isAbstract) { + buf.append("abstract "); + } + buf.append(isInterface ? "interface " : "class ").append(name); + if (superClass != null) { + buf.append(" extends ").append(superClass); + } + for (int i = 0; i < interfaces.size(); i++) { + // An interface extends what a class implements. + buf.append(i == 0 ? (isInterface ? " extends " : " implements ") : ", ") + .append(interfaces.get(i)); + } + out.line(buf.append(" {").toString()); + if (isInterface) { + out.blank(); + } + return out; + } + + /** + * Writes the brace that ends the class, under the blank line that separates it from the + * last member. An interface has no such line: its declarations are packed. + * + * @return the finished source. + */ + public String close() { + if (!isInterface) { + out.blank(); + } + out.line("}"); + return out.toString(); + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/JavaComment.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/JavaComment.java new file mode 100644 index 00000000..6fb5bb73 --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/JavaComment.java @@ -0,0 +1,124 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.generators.java; + +import java.util.ArrayList; +import java.util.List; + +/** + * Turns a specification comment into javadoc lines. + *

                + * This reproduces the existing generator's behaviour exactly, including where that + * behaviour is odd, because the generated API is compiled against by every api module and + * its javadoc is part of what people read. Two quirks are deliberate: + *

                  + *
                • an apostrophe becomes {@code "} rather than {@code '};
                • + *
                • an angle bracket becomes an underscore, so a comment mentioning {@code >=} reads + * {@code _=};
                • + *
                • the line-length check happens before a word is added rather than after, so lines + * routinely run past the threshold - up to 92 characters in the current output.
                • + *
                + * Changing either would be an improvement, and would show up in the golden tree as a + * deliberate difference to be agreed rather than something to slip in here. + */ +public final class JavaComment { + + private static final int LENGTH_THRESHOLD = 70; + + private JavaComment() { + } + + /** + * Normalises a comment into the lines of a javadoc block. + * + * @param comment The comment, may be null. + * @return the lines, empty if there is no comment. + */ + public static List normalise(String comment) { + List output = new ArrayList(); + if (comment == null || comment.isEmpty()) { + return output; + } + String text = comment; + if (!text.endsWith(".")) { + text += "."; + } + text = text.replace("&", "&"); + text = text.replace("'", """); + output.addAll(wrap(text)); + return output; + } + + /** + * Normalises a comment for a javadoc block inside a class, where angle brackets would + * be read as markup. Package documentation goes through {@link #normalise} instead and + * keeps its {@code
                  } and {@code
                • } tags. + * + * @param comment The comment, may be null. + * @return the lines, empty if there is no comment. + */ + public static List normaliseInClass(String comment) { + List output = new ArrayList(); + for (String line : normalise(comment)) { + output.add(escape(line)); + } + return output; + } + + /** + * Removes the angle brackets that would otherwise be read as javadoc markup. + * + * @param text The comment text. + * @return the text with angle brackets replaced by underscores. + */ + public static String escape(String text) { + return text == null ? null : text.replace("<", "_").replace(">", "_"); + } + + /** + * Breaks text into lines at roughly the threshold, paragraph by paragraph. + * + * @param text The text to wrap. + * @return the lines. + */ + public static List wrap(String text) { + List output = new ArrayList(); + if (text.length() < LENGTH_THRESHOLD) { + output.add(text); + return output; + } + for (String paragraph : text.split("\n")) { + StringBuilder line = new StringBuilder(); + int counter = 0; + for (String word : paragraph.split(" ")) { + if (counter > LENGTH_THRESHOLD) { + output.add(line.toString().trim()); + line.setLength(0); + counter = 0; + } + line.append(word).append(' '); + counter += 1 + word.length(); + } + output.add(line.toString().trim()); + } + return output; + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/JavaFieldBuilder.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/JavaFieldBuilder.java new file mode 100644 index 00000000..131074d8 --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/JavaFieldBuilder.java @@ -0,0 +1,190 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.generators.java; + +import java.util.List; + +/** + * One Java field, from its javadoc to its semicolon. + *

                  + * The counterpart of {@link JavaMethodBuilder}, and built the same way: the comment is held + * with the declaration it documents, and {@code write} is the only thing that produces + * text. A value spanning more than one line is written as it is given, so the caller that + * lays out an array lays out its own continuation, as it does for the body of a method. + */ +public final class JavaFieldBuilder { + + /** + * The step a field takes past the class. + */ + private static final String INDENT = " "; + + private final String name; + + private String scope = "public"; + + private String type = null; + + private String value = null; + + private String comment = null; + + private boolean isStatic = false; + + private boolean isFinal = false; + + private boolean isDeprecated = false; + + private boolean joined = false; + + private JavaFieldBuilder(String name) { + this.name = name; + } + + /** + * @param name The name of the field. + * @return a public field, with no type yet and no value. + */ + public static JavaFieldBuilder named(String name) { + return new JavaFieldBuilder(name); + } + + /** + * Sets the scope. Public unless said otherwise. + * + * @param scope The scope keyword. + * @return this field. + */ + public JavaFieldBuilder scope(String scope) { + this.scope = scope; + return this; + } + + /** + * Sets the declared type. + * + * @param typeName The type of the field. + * @return this field. + */ + public JavaFieldBuilder ofType(String typeName) { + this.type = typeName; + return this; + } + + /** + * Sets what the field is initialised to. A field with no value is declared and left + * unset. + * + * @param expression The initialiser, which may span several lines. + * @return this field. + */ + public JavaFieldBuilder value(String expression) { + this.value = expression; + return this; + } + + /** + * Sets the comment of the field. + * + * @param text The comment, may be null. + * @return this field. + */ + public JavaFieldBuilder comment(String text) { + this.comment = text; + return this; + } + + /** + * @return this field, marked static. + */ + public JavaFieldBuilder asStatic() { + this.isStatic = true; + return this; + } + + /** + * @return this field, marked final. + */ + public JavaFieldBuilder asFinal() { + this.isFinal = true; + return this; + } + + /** + * @return this field, marked deprecated. + */ + public JavaFieldBuilder asDeprecated() { + this.isDeprecated = true; + return this; + } + + /** + * Writes the field directly under the one before it, with no blank line between them. + * The reference output keeps the fields that carry a type's identity together as one + * block, and separates everything else. + * + * @return this field. + */ + public JavaFieldBuilder joinedToPrevious() { + this.joined = true; + return this; + } + + /** + * Writes the field, preceded by the blank line that separates it from what came before + * it unless it was asked to stay with it. + * + * @param out The source to write to. + */ + public void write(JavaSource out) { + if (!joined) { + out.blank(); + } + + List lines = JavaComment.normaliseInClass(comment); + if (!lines.isEmpty()) { + out.line(INDENT + "/**"); + for (String line : lines) { + out.line(INDENT + " * " + line); + } + out.line(INDENT + " */"); + } + + if (isDeprecated) { + out.line(INDENT + "@Deprecated"); + } + + StringBuilder buf = new StringBuilder(INDENT); + buf.append(scope).append(' '); + if (isStatic) { + buf.append("static "); + } + if (isFinal) { + buf.append("final "); + } + buf.append(type).append(' ').append(name); + if (value != null) { + buf.append(" = ").append(value); + } + buf.append(';'); + out.line(buf.toString()); + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/JavaGenerator.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/JavaGenerator.java new file mode 100644 index 00000000..19ffe2fb --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/JavaGenerator.java @@ -0,0 +1,315 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.generators.java; + +import esa.mo.apigen.generators.Generator; +import esa.mo.apigen.generators.java.writers.CompositeWriter; +import esa.mo.apigen.generators.java.writers.ConsumerAdapterWriter; +import esa.mo.apigen.generators.java.writers.ConsumerStubWriter; +import esa.mo.apigen.generators.java.writers.ElementFactoryWriter; +import esa.mo.apigen.generators.java.writers.EnumerationWriter; +import esa.mo.apigen.generators.java.writers.ExceptionWriter; +import esa.mo.apigen.generators.java.writers.HelperWriter; +import esa.mo.apigen.generators.java.writers.ListWriter; +import esa.mo.apigen.generators.java.writers.MultiReturnBodyWriter; +import esa.mo.apigen.generators.java.writers.ProviderHandlerWriter; +import esa.mo.apigen.generators.java.writers.ProviderInheritanceSkeletonWriter; +import esa.mo.apigen.generators.java.writers.ProviderInteractionWriter; +import esa.mo.apigen.generators.java.writers.ProviderPublisherWriter; +import esa.mo.apigen.generators.java.writers.ProviderSkeletonWriter; +import esa.mo.apigen.generators.java.writers.ServiceInfoWriter; +import esa.mo.apigen.generators.java.writers.SubscriptionKeysWriter; +import esa.mo.apigen.model.Area; +import esa.mo.apigen.model.MOModel; +import esa.mo.apigen.model.Service; +import esa.mo.apigen.model.types.CompositeType; +import esa.mo.apigen.model.types.EnumerationType; +import esa.mo.apigen.model.types.TypeDefinition; +import java.io.IOException; +import java.nio.charset.Charset; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.List; + +/** + * Generates the Java API. + *

                  + * Written against the model directly. The old generator is the reference for what comes + * out - the generated API is compiled against by every api module and by user code, so + * its shape is a compatibility surface - but not for how it is produced. + *

                  + * Incomplete: it writes the structures, the exceptions, the helpers, the element factories + * and the package documentation - verified byte for byte against the reference output. The + * provider skeletons, the consumer stubs, the {@code ServiceInfo} classes and the + * multiple-return bodies are still to come; the last of those also brings the two + * {@code package-info.java} files that the old generator writes as a side effect of it. + */ +public final class JavaGenerator implements Generator { + + private static final Charset UTF8 = Charset.forName("UTF-8"); + + @Override + public String getShortName() { + return "Java"; + } + + @Override + public String getDescription() { + return "Generates the Java API for a set of MO service specifications"; + } + + @Override + public void generate(MOModel model, List targets, Path outputDir) throws IOException { + for (Area area : targets) { + generateArea(model, area, outputDir); + } + } + + private void generateArea(MOModel model, Area area, Path outputDir) throws IOException { + PackageInfoWriter packages = new PackageInfoWriter(outputDir); + // An area without a comment still gets one: the package documentation would + // otherwise be an empty javadoc block. + String areaComment = area.getComment() != null && !area.getComment().isEmpty() + ? area.getComment() : "The " + area.getName() + " area"; + packages.write(JavaNaming.packageOf(area), areaComment); + if (!area.getDataTypes().isEmpty()) { + packages.write(JavaNaming.packageOf(area, JavaNaming.STRUCTURES), + "Package containing types defined in the " + area.getName() + " area"); + } + writeTypes(model, area, null, area.getDataTypes(), outputDir); + writeExceptions(area, outputDir); + writeHelpers(area, outputDir); + writeElementFactory(area, outputDir); + for (Service service : area.getServices()) { + writeTypes(model, area, service, service.getDataTypes(), outputDir); + writeServiceInfo(model, area, service, outputDir); + writeSubscriptionKeys(model, service, outputDir); + writeConsumer(model, area, service, outputDir); + writeProvider(model, service, outputDir); + writeMultiReturnBodies(model, service, packages, outputDir); + packages.write(JavaNaming.packageOf(service), service.getComment()); + packages.write(JavaNaming.packageOf(service, JavaNaming.CONSUMER), + "Package containing the consumer stubs for the " + + service.getName() + " service"); + packages.write(JavaNaming.packageOf(service, JavaNaming.PROVIDER), + "Package containing the provider skeletons for the " + + service.getName() + " service"); + if (!service.getDataTypes().isEmpty()) { + packages.write(JavaNaming.packageOf(service, JavaNaming.STRUCTURES), + "Package containing types defined in the " + + service.getName() + " service"); + } + } + } + + /** + * Every error the area declares becomes an exception in the area's own package, + * whether it was declared by the area or by one of its services. + */ + private void writeExceptions(Area area, Path outputDir) throws IOException { + java.util.List errors + = new java.util.ArrayList(area.getErrors()); + for (Service service : area.getServices()) { + errors.addAll(service.getErrors()); + } + if (errors.isEmpty()) { + return; + } + Path dir = outputDir.resolve(JavaNaming.directoryOf(JavaNaming.packageOf(area))); + Files.createDirectories(dir); + for (esa.mo.apigen.model.ErrorDefinition error : errors) { + Files.write(dir.resolve(ExceptionWriter.classNameOf(error.getName()) + ".java"), + ExceptionWriter.write(area, error).getBytes(UTF8)); + } + } + + /** + * The area's helper, and one for each of its services. + */ + private void writeHelpers(Area area, Path outputDir) throws IOException { + Path areaDir = outputDir.resolve(JavaNaming.directoryOf(JavaNaming.packageOf(area))); + Files.createDirectories(areaDir); + Files.write(areaDir.resolve(area.getName() + "Helper.java"), + HelperWriter.writeArea(area).getBytes(UTF8)); + for (Service service : area.getServices()) { + Path dir = outputDir.resolve(JavaNaming.directoryOf(JavaNaming.packageOf(service))); + Files.createDirectories(dir); + Files.write(dir.resolve(service.getName() + "Helper.java"), + HelperWriter.writeService(service).getBytes(UTF8)); + } + } + + /** + * The factory that creates the Elements of the area, one per area. + */ + private void writeElementFactory(Area area, Path outputDir) throws IOException { + Path dir = outputDir.resolve(JavaNaming.directoryOf(JavaNaming.packageOf(area))); + Files.createDirectories(dir); + Files.write(dir.resolve(area.getName() + "ElementFactory.java"), + ElementFactoryWriter.write(area).getBytes(UTF8)); + } + + /** + * The ServiceInfo of a service, which is what its stubs and skeletons name their + * operations through. + */ + private void writeServiceInfo(MOModel model, Area area, Service service, Path outputDir) + throws IOException { + Path dir = outputDir.resolve(JavaNaming.directoryOf(JavaNaming.packageOf(service))); + Files.createDirectories(dir); + Files.write(dir.resolve(service.getName() + "ServiceInfo.java"), + ServiceInfoWriter.write(model, area, service).getBytes(UTF8)); + } + + /** + * One class per publish-subscribe operation, for reading the keys of a notify message. + */ + private void writeSubscriptionKeys(MOModel model, Service service, Path outputDir) + throws IOException { + Path dir = outputDir.resolve( + JavaNaming.directoryOf(JavaNaming.packageOf(service, JavaNaming.CONSUMER))); + for (esa.mo.apigen.model.Operation operation : service.getOperations()) { + if (operation.getPattern() != esa.mo.apigen.model.InteractionPattern.PUBSUB) { + continue; + } + Files.createDirectories(dir); + Files.write(dir.resolve(SubscriptionKeysWriter.classNameOf(operation) + ".java"), + SubscriptionKeysWriter.write(model, service, operation).getBytes(UTF8)); + } + } + + /** + * The consumer stub of a service, and the adapter its answers arrive through. + */ + private void writeConsumer(MOModel model, Area area, Service service, Path outputDir) + throws IOException { + Path dir = outputDir.resolve( + JavaNaming.directoryOf(JavaNaming.packageOf(service, JavaNaming.CONSUMER))); + Files.createDirectories(dir); + Files.write(dir.resolve(service.getName() + "Stub.java"), + ConsumerStubWriter.write(model, service).getBytes(UTF8)); + Files.write(dir.resolve(service.getName() + "Adapter.java"), + ConsumerAdapterWriter.write(model, area, service).getBytes(UTF8)); + } + + /** + * The provider side of a service: what a provider implements, and how it reaches its + * publishers. + */ + private void writeProvider(MOModel model, Service service, Path outputDir) + throws IOException { + Path dir = outputDir.resolve( + JavaNaming.directoryOf(JavaNaming.packageOf(service, JavaNaming.PROVIDER))); + Files.createDirectories(dir); + Files.write(dir.resolve(service.getName() + "Handler.java"), + ProviderHandlerWriter.write(model, service).getBytes(UTF8)); + Files.write(dir.resolve(service.getName() + "Skeleton.java"), + ProviderSkeletonWriter.write(service).getBytes(UTF8)); + Files.write(dir.resolve(service.getName() + "InheritanceSkeleton.java"), + ProviderInheritanceSkeletonWriter.write(model, service).getBytes(UTF8)); + // An operation that reports back over time is answered through an object of its + // own, so that what it can send is named and typed. + for (esa.mo.apigen.model.Operation operation : service.getOperations()) { + if (operation.getPattern() == esa.mo.apigen.model.InteractionPattern.INVOKE + || operation.getPattern() == esa.mo.apigen.model.InteractionPattern.PROGRESS) { + Files.write(dir.resolve(ProviderInteractionWriter.classNameOf(operation) + ".java"), + ProviderInteractionWriter.write(model, service, operation).getBytes(UTF8)); + } + if (operation.getPattern() == esa.mo.apigen.model.InteractionPattern.PUBSUB) { + Files.write(dir.resolve(ProviderPublisherWriter.classNameOf(operation) + ".java"), + ProviderPublisherWriter.write(model, service, operation).getBytes(UTF8)); + } + } + } + + /** + * An operation that answers with more than one field needs a class to hold the answer, + * since a Java method can only return one thing. + */ + private void writeMultiReturnBodies(MOModel model, Service service, + PackageInfoWriter packages, Path outputDir) throws IOException { + java.util.List operations + = MultiReturnBodyWriter.operationsOf(service); + if (operations.isEmpty()) { + return; + } + String pkg = JavaNaming.packageOf(service, MultiReturnBodyWriter.BODY); + packages.write(pkg, "Package containing the types for holding compound messages"); + Path dir = outputDir.resolve(JavaNaming.directoryOf(pkg)); + Files.createDirectories(dir); + for (esa.mo.apigen.model.Operation operation : operations) { + Files.write(dir.resolve(MultiReturnBodyWriter.classNameOf(operation) + ".java"), + MultiReturnBodyWriter.write(model, service, operation).getBytes(UTF8)); + } + } + + private void writeTypes(MOModel model, Area area, Service service, + java.util.List types, Path outputDir) throws IOException { + String pkg = service == null + ? JavaNaming.packageOf(area, JavaNaming.STRUCTURES) + : JavaNaming.packageOf(service, JavaNaming.STRUCTURES); + Path dir = outputDir.resolve(JavaNaming.directoryOf(pkg)); + for (TypeDefinition type : types) { + if (type instanceof EnumerationType) { + Files.createDirectories(dir); + Files.write(dir.resolve(type.getName() + ".java"), + EnumerationWriter.write(area, service, (EnumerationType) type) + .getBytes(UTF8)); + } + if (type instanceof CompositeType) { + Files.createDirectories(dir); + Files.write(dir.resolve(type.getName() + ".java"), + CompositeWriter.write(model, area, service, (CompositeType) type) + .getBytes(UTF8)); + } + String list = ListWriter.write(area, service, type); + if (list != null) { + Files.createDirectories(dir); + Files.write(dir.resolve(type.getName() + "List.java"), list.getBytes(UTF8)); + } + } + } + + /** + * Writes the package-info.java files. + */ + private static final class PackageInfoWriter { + + private final Path root; + + private PackageInfoWriter(Path root) { + this.root = root; + } + + private void write(String packageName, String comment) throws IOException { + Path dir = root.resolve(JavaNaming.directoryOf(packageName)); + Files.createDirectories(dir); + StringBuilder buf = new StringBuilder(); + buf.append("/**\n"); + for (String line : JavaComment.normalise(comment)) { + buf.append(" * ").append(line).append('\n'); + } + buf.append("*/\n"); + buf.append("package ").append(packageName).append(";\n"); + Files.write(dir.resolve("package-info.java"), buf.toString().getBytes(UTF8)); + } + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/JavaMethodBuilder.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/JavaMethodBuilder.java new file mode 100644 index 00000000..121311d3 --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/JavaMethodBuilder.java @@ -0,0 +1,378 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.generators.java; + +import java.util.ArrayList; +import java.util.List; + +/** + * One Java method, from its javadoc to its closing brace. + *

                  + * Written out in the order the pieces are declared here rather than in the order they end + * up on the page: an argument is given with the description that documents it, so the + * {@code @param} block and the signature cannot drift apart, and the body is held with the + * signature so that a method is one expression from end to end. + *

                  + * Everything a method can be is set through the same object, so a writer never has to + * decide between "the one with the comment" and "the one that overrides". A method the + * language has no word for - a static override, say - is simply never asked for. + */ +public final class JavaMethodBuilder { + + /** + * The step a method takes past the class, and the step its body takes past it. + */ + private static final String INDENT = " "; + + private static final String BODY_INDENT = INDENT + INDENT; + + /** + * Arguments past the first are carried onto their own line, at the step the reference + * output uses regardless of how long the signature is. + */ + private static final String ARGUMENT_INDENT = " "; + + private final String name; + + private final List arguments = new ArrayList(); + + private final List thrown = new ArrayList(); + + private final List body = new ArrayList(); + + private String scope = "public"; + + private String returnType = null; + + private String returnComment = null; + + private String comment = null; + + private boolean constructor = false; + + private boolean isStatic = false; + + private boolean isFinal = false; + + private boolean isOverride = false; + + private boolean isDeprecated = false; + + private boolean declarationOnly = false; + + private JavaMethodBuilder(String name) { + this.name = name; + } + + /** + * @param name The name of the method. + * @return a method that returns nothing, is public, and has no arguments. + */ + public static JavaMethodBuilder named(String name) { + return new JavaMethodBuilder(name); + } + + /** + * @param className The name of the class being constructed. + * @return a constructor, which is written without a return type. + */ + public static JavaMethodBuilder constructor(String className) { + JavaMethodBuilder method = new JavaMethodBuilder(className); + method.constructor = true; + return method; + } + + /** + * Sets the scope. Public unless said otherwise. + * + * @param scope The scope keyword. + * @return this method. + */ + public JavaMethodBuilder scope(String scope) { + this.scope = scope; + return this; + } + + /** + * Sets what the method returns. Void unless said otherwise. + * + * @param type The returned type. + * @param description What is returned, or null to leave it undocumented. + * @return this method. + */ + public JavaMethodBuilder returns(String type, String description) { + this.returnType = type; + this.returnComment = description; + return this; + } + + /** + * Adds an argument, in declaration order, with the description that documents it. + * + * @param type The type of the argument. + * @param argumentName The name of the argument. + * @param description What the argument is, or null for a plain description of it. + * @return this method. + */ + public JavaMethodBuilder argument(String type, String argumentName, + String description) { + arguments.add(new Argument(type, argumentName, description)); + return this; + } + + /** + * Adds a thrown type, in order, with the description that documents it. + * + * @param type The thrown type. + * @param description When it is thrown, or null to leave it undocumented. + * @return this method. + */ + public JavaMethodBuilder throwing(String type, String description) { + thrown.add(new Thrown(type, description)); + return this; + } + + /** + * Sets the comment of the method. + * + * @param text The comment, may be null. + * @return this method. + */ + public JavaMethodBuilder comment(String text) { + this.comment = text; + return this; + } + + /** + * @return this method, marked static. + */ + public JavaMethodBuilder asStatic() { + this.isStatic = true; + return this; + } + + /** + * @return this method, marked final. + */ + public JavaMethodBuilder asFinal() { + this.isFinal = true; + return this; + } + + /** + * Marks the method as overriding another, which carries the annotation. + * + * @return this method. + */ + public JavaMethodBuilder asOverride() { + this.isOverride = true; + return this; + } + + /** + * @return this method, marked deprecated. + */ + public JavaMethodBuilder asDeprecated() { + this.isDeprecated = true; + return this; + } + + /** + * Marks the method as a declaration without a body, for an interface. The scope goes + * unwritten: an interface method has no keyword in front of it. + * + * @return this method. + */ + public JavaMethodBuilder asDeclaration() { + this.declarationOnly = true; + return this; + } + + /** + * Adds a line to the body, indented past the method. A line that steps further in says + * so itself, as the reference output does. + * + * @param text The line, without the indentation of the body. + * @return this method. + */ + public JavaMethodBuilder line(String text) { + body.add(text); + return this; + } + + /** + * Adds the lines of the body, in order. + * + * @param lines The lines, without the indentation of the body. + * @return this method. + */ + public JavaMethodBuilder lines(List lines) { + body.addAll(lines); + return this; + } + + /** + * Writes the method, preceded by the blank line that separates it from what came + * before it. A declaration has no such line. + * + * @param out The source to write to. + */ + public void write(JavaSource out) { + // A declaration follows the one before it without a gap, the way an interface reads + // in the reference output. + if (!declarationOnly) { + out.blank(); + } + writeComment(out); + if (isDeprecated) { + out.line(INDENT + "@Deprecated"); + } + if (isOverride) { + out.line(INDENT + "@Override"); + } + out.line(INDENT + signature()); + if (declarationOnly) { + return; + } + for (String line : body) { + out.line(line.isEmpty() ? "" : BODY_INDENT + line); + } + out.line(INDENT + "}"); + } + + /** + * Writes the javadoc, which is left out entirely when there would be nothing in it. + *

                  + * An override is never documented: it says the same thing as the method it overrides, + * and javadoc carries that documentation down on its own. + */ + private void writeComment(JavaSource out) { + if (isOverride) { + return; + } + + List lines = JavaComment.normaliseInClass(comment); + List tags = new ArrayList(); + + for (Argument argument : arguments) { + tags.add("@param " + argument.name + " " + argument.describe()); + } + if (returnComment != null && !returnComment.isEmpty()) { + tags.add("@return " + returnComment); + } + for (Thrown item : thrown) { + if (item.description != null && !item.description.isEmpty()) { + tags.add("@throws " + item.type + " " + item.description); + } + } + if (lines.isEmpty() && tags.isEmpty()) { + return; + } + + out.line(INDENT + "/**"); + for (String line : lines) { + out.line(INDENT + " * " + line); + } + // The blank line stands between the description and the tags whether or not there + // is a description above it, which is what the reference output does. + out.line(INDENT + " * "); + for (String tag : tags) { + out.line(INDENT + " * " + JavaComment.escape(tag)); + } + out.line(INDENT + " */"); + } + + /** + * @return the signature, from the scope to the brace that opens the body. + */ + private String signature() { + StringBuilder buf = new StringBuilder(); + + if (!declarationOnly) { + // An override is public whatever else it is: so is the method it overrides + buf.append(isOverride ? "public" : scope).append(' '); + } + if (isStatic) { + buf.append("static "); + } + if (isFinal) { + buf.append("final "); + } + if (!constructor) { + buf.append(returnType == null ? "void" : returnType).append(' '); + } + + buf.append(name).append('('); + for (int i = 0; i < arguments.size(); i++) { + if (i != 0) { + buf.append(",\n").append(ARGUMENT_INDENT); + } + Argument argument = arguments.get(i); + buf.append(argument.type).append(' ').append(argument.name); + } + buf.append(')'); + + for (int i = 0; i < thrown.size(); i++) { + buf.append(i == 0 ? " throws " : ", ").append(thrown.get(i).type); + } + + buf.append(declarationOnly ? ";" : " {"); + return buf.toString(); + } + + /** + * One argument, held with the description that documents it. + */ + private static final class Argument { + + private final String type; + private final String name; + private final String description; + + private Argument(String type, String name, String description) { + this.type = type; + this.name = name; + this.description = description; + } + + /** + * @return the description, or a plain one naming the argument. + */ + private String describe() { + return (description == null || description.isEmpty()) + ? "The " + name + " field." : description; + } + } + + /** + * One thrown type, held with the description that documents it. + */ + private static final class Thrown { + + private final String type; + private final String description; + + private Thrown(String type, String description) { + this.type = type; + this.description = description; + } + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/JavaNaming.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/JavaNaming.java new file mode 100644 index 00000000..270de2a6 --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/JavaNaming.java @@ -0,0 +1,85 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.generators.java; + +import esa.mo.apigen.model.Area; +import esa.mo.apigen.model.Service; + +/** + * Where generated Java lands: package names and their directories. + */ +public final class JavaNaming { + + /** + * The root package of every generated API. + */ + public static final String ROOT = "org.ccsds.moims.mo."; + /** + * The folder that holds an area's or a service's data types. + */ + public static final String STRUCTURES = "structures"; + /** + * The MAL area's package. Generated code refers to it constantly - every element, + * encoder and type id lives there - so it is named once here. + */ + public static final String MAL = ROOT + "mal."; + /** + * The package holding the MAL's own data types. + */ + public static final String MAL_STRUCTURES = MAL + STRUCTURES + "."; + /** + * The folder that holds a service's consumer stubs. + */ + public static final String CONSUMER = "consumer"; + /** + * The folder that holds a service's provider skeletons. + */ + public static final String PROVIDER = "provider"; + + private JavaNaming() { + } + + public static String packageOf(Area area) { + return ROOT + area.getName().toLowerCase(); + } + + public static String packageOf(Area area, String folder) { + return packageOf(area) + "." + folder; + } + + public static String packageOf(Service service) { + return packageOf(service.getArea()) + "." + service.getName().toLowerCase(); + } + + public static String packageOf(Service service, String folder) { + return packageOf(service) + "." + folder; + } + + /** + * Returns the directory a package maps to, relative to the output root. + * + * @param packageName The package. + * @return the relative path, using '/' as separator. + */ + public static String directoryOf(String packageName) { + return packageName.replace('.', '/'); + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/JavaSource.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/JavaSource.java new file mode 100644 index 00000000..17d473e8 --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/JavaSource.java @@ -0,0 +1,85 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.generators.java; + +/** + * Accumulates the text of a Java source file. + */ +public final class JavaSource { + + private final StringBuilder buf = new StringBuilder(); + + public void line(String text) { + buf.append(text).append('\n'); + } + + public void blank() { + buf.append('\n'); + } + + /** + * Writes a single-line javadoc block at the given indentation. + * + * @param indent Number of four-space levels. + * @param text The comment, already normalised. + */ + public void javadoc(int indent, String text) { + String pad = pad(indent); + line(pad + "/**"); + line(pad + " * " + JavaComment.escape(text)); + line(pad + " */"); + } + + private static String pad(int indent) { + StringBuilder p = new StringBuilder(); + for (int i = 0; i < indent; i++) { + p.append(" "); + } + return p.toString(); + } + + /** + * @return the last line written, without its line separator. + */ + public String lastLine() { + int end = buf.length() - 1; + int start = buf.lastIndexOf("\n", end - 1) + 1; + return buf.substring(start, end); + } + + /** + * Replaces the last line written, for the rare case where a line can only be finished + * once the next is known - a list that closes on the line of its last entry. + * + * @param text The replacement line. + */ + public void replaceLast(String text) { + int end = buf.length() - 1; + int start = buf.lastIndexOf("\n", end - 1) + 1; + buf.setLength(start); + line(text); + } + + @Override + public String toString() { + return buf.toString(); + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/JavaTypeName.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/JavaTypeName.java new file mode 100644 index 00000000..4b819904 --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/JavaTypeName.java @@ -0,0 +1,210 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.generators.java; + +import esa.mo.apigen.model.MOModel; +import esa.mo.apigen.model.types.AttributeType; +import esa.mo.apigen.model.types.EnumerationType; +import esa.mo.apigen.model.types.TypeDefinition; +import esa.mo.apigen.model.types.TypeRef; + +/** + * Renders a type reference as the Java type that represents it. + */ +public final class JavaTypeName { + + private JavaTypeName() { + } + + /** + * @return the Java type for a field or parameter of this type. + */ + public static String of(MOModel model, TypeRef reference) { + if (reference == null) { + return "java.lang.Object"; + } + // The older spelling of an object reference, ObjectRef(Product), means the same as + // objectRef="true"; unwrapping here lets everything below see just the one form. + TypeRef ref = reference.unwrapped(); + if (ref.isList()) { + // A list of object references is a list of references, not of the target type. + return ref.isObjectRef() + ? JavaNaming.MAL_STRUCTURES + "ObjectRefList" : qualifiedList(ref); + } + if (ref.isObjectRef()) { + return JavaNaming.MAL_STRUCTURES + "ObjectRef<" + qualified(ref) + ">"; + } + if (isNativeAttribute(model, ref)) { + return JavaTypes.nativeName(ref.getName()); + } + return qualified(ref); + } + + /** + * @return the expression that creates an empty instance, for decoding. + */ + public static String newInstance(MOModel model, TypeRef ref) { + // An enumeration cannot be constructed empty, so its first singleton stands in. + if (ref != null && !ref.isList() && !ref.isObjectRef()) { + TypeDefinition definition = model.resolve(ref); + if (definition instanceof EnumerationType) { + EnumerationType enumeration = (EnumerationType) definition; + if (!enumeration.getItems().isEmpty()) { + return qualified(ref) + "." + enumeration.getItems().get(0).getValue(); + } + } + } + return "new " + of(model, ref) + "()"; + } + + /** + * @return the fully qualified name of the type itself, ignoring list and reference + * wrapping. + */ + public static String qualified(TypeRef ref) { + StringBuilder pkg = new StringBuilder("org.ccsds.moims.mo."); + pkg.append(ref.getArea().toLowerCase()); + if (ref.getService() != null) { + pkg.append('.').append(ref.getService().toLowerCase()); + } + pkg.append('.').append(JavaNaming.STRUCTURES).append('.') + .append(JavaTypes.className(ref.getArea(), ref.getName())); + return pkg.toString(); + } + + /** + * Returns the Java type of a list of this type. Usually the element's name with + * "List" appended, but a list of MAL Elements is the hand-written HeterogeneousList + * rather than a generated ElementList. + */ + private static String qualifiedList(TypeRef ref) { + String listName = JavaTypes.className(ref.getArea(), ref.getName() + "List"); + int lastDot = qualified(ref).lastIndexOf('.'); + return qualified(ref).substring(0, lastDot + 1) + listName; + } + + /** + * Returns true if the reference names a MAL attribute type that is represented by a + * plain Java type. + */ + public static boolean isNativeAttribute(MOModel model, TypeRef ref) { + return !ref.isList() && !ref.isObjectRef() + && JavaTypes.isNative(ref.getArea(), ref.getName()) + && isAttribute(model, ref); + } + + /** + * Returns the MAL attribute type this reference names, or null if it names something + * else. Attributes have their own encoder methods; everything else is encoded as an + * element. + */ + public static String attributeName(MOModel model, TypeRef ref) { + if (ref == null || ref.isList() || ref.isObjectRef()) { + return null; + } + // The abstract Attribute type has its own encoder method, like the concrete ones. + if ("MAL".equals(ref.getArea()) && "Attribute".equals(ref.getName())) { + return "Attribute"; + } + return isAttribute(model, ref) ? ref.getName() : null; + } + + /** + * Returns true if the reference names a type that cannot be instantiated, so the + * encoder has to record which concrete type it is writing. + */ + public static boolean isAbstractElement(MOModel model, TypeRef ref) { + if (ref == null || ref.isList()) { + return false; + } + // A reference to an abstract type is itself abstract: ObjectRef can hold + // a reference to anything, so the encoder has to record what it wrote. + TypeDefinition definition = model.resolve(ref); + return definition != null && definition.isAbstract(); + } + + /** + * Returns the expression that names the short form of a type, as a message body needs + * it to say what it carries. An abstract type has none - what is on the wire is decided + * per message - and neither has the base Element. + * + * @param model The model the reference is resolved against. + * @param reference The type, may be null. + * @return the short form expression, or the literal null. + */ + public static String shortFormOf(MOModel model, TypeRef reference) { + if (reference == null) { + return "null"; + } + TypeRef ref = reference.unwrapped(); + // What is on the wire is decided per message, whether the field holds one of them + // or a list of them. + TypeDefinition definition = model.resolve(ref); + if (definition != null && definition.isAbstract()) { + return "null"; + } + // An attribute carries the short form of the attribute type, not of a class: the + // concrete ones are constants on Attribute itself. + if (!ref.isList() && isAttribute(model, ref)) { + return JavaNaming.MAL_STRUCTURES + "Attribute." + + ref.getName().toUpperCase() + "_SHORT_FORM"; + } + if (ref.isObjectRef()) { + return ref.isList() + ? JavaNaming.MAL_STRUCTURES + "ObjectRefList.SHORT_FORM" + : JavaNaming.MAL_STRUCTURES + "ObjectRef.OBJECTREF_SHORT_FORM"; + } + String java = of(model, ref); + return (JavaNaming.MAL_STRUCTURES + "Element").equals(java) ? "null" : java + ".SHORT_FORM"; + } + + /** + * Returns what a decoder is handed so it knows what to build. An abstract type carries + * its own identity on the wire, so nothing is handed over for it - except a list of + * abstract things, which is still a list and can be built empty. A list of the base + * Element is the one exception to that exception: the reference output leaves it + * undecided, because before the Java mapping renames it the type is called ElementList + * and the rule matches on the name. + * + * @param model The model the reference is resolved against. + * @param reference The type of the field being decoded. + * @return the expression handed to the decoder, or the literal null. + */ + public static String expectedTypeOf(MOModel model, TypeRef reference) { + TypeRef ref = reference.unwrapped(); + String raw = qualified(ref) + (ref.isList() ? "List" : ""); + if (raw.contains(".MOObject")) { + return "null"; + } + TypeDefinition definition = model.resolve(ref); + boolean isAbstract = definition != null && definition.isAbstract(); + if (isAbstract) { + return raw.contains("List") && !raw.contains(".Element") + ? "new " + of(model, reference) + "()" : "null"; + } + return newInstance(model, reference); + } + + private static boolean isAttribute(MOModel model, TypeRef ref) { + TypeDefinition definition = model.resolve(ref); + return definition instanceof AttributeType; + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/JavaTypes.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/JavaTypes.java new file mode 100644 index 00000000..9d833a9f --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/JavaTypes.java @@ -0,0 +1,127 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.generators.java; + +import java.util.HashMap; +import java.util.Map; + +/** + * How the MAL's attribute types are represented in Java. + *

                  + * The model takes the attribute types themselves from the MAL specification; this holds + * only the Java side of the mapping, which belongs to this generator and nowhere else. + *

                  + * Seven of them are plain Java types rather than generated classes, and the name is not + * always the MAL one - an Octet is a {@code Byte}. + */ +public final class JavaTypes { + + private static final Map NATIVE = new HashMap(); + + static { + NATIVE.put("Boolean", "Boolean"); + NATIVE.put("Double", "Double"); + NATIVE.put("Float", "Float"); + NATIVE.put("Integer", "Integer"); + NATIVE.put("Long", "Long"); + NATIVE.put("Octet", "Byte"); + NATIVE.put("Short", "Short"); + NATIVE.put("String", "String"); + } + + /** + * The value a native attribute is created with where one has to be created without + * knowing anything about it - the Union that carries it has no empty constructor. + */ + private static final Map NATIVE_DEFAULT = new HashMap(); + + static { + NATIVE_DEFAULT.put("Boolean", "Boolean.FALSE"); + NATIVE_DEFAULT.put("Double", "Double.MAX_VALUE"); + NATIVE_DEFAULT.put("Float", "Float.MAX_VALUE"); + NATIVE_DEFAULT.put("Integer", "Integer.MAX_VALUE"); + NATIVE_DEFAULT.put("Long", "Long.MAX_VALUE"); + NATIVE_DEFAULT.put("Octet", "Byte.MAX_VALUE"); + NATIVE_DEFAULT.put("Short", "Short.MAX_VALUE"); + NATIVE_DEFAULT.put("String", "\"\""); + } + + /** + * MAL types whose Java class is named differently, to avoid colliding with a Java + * built-in: MAL's Object would otherwise shadow java.lang.Object. + */ + private static final Map RENAMED = new HashMap(); + + static { + RENAMED.put("Object", "MOObject"); + RENAMED.put("ElementList", "HeterogeneousList"); + } + + private JavaTypes() { + } + + /** + * Returns the Java class name for a MAL type, which is usually its own name. + * + * @param malArea The area the type belongs to. + * @param typeName The MAL type name. + * @return the Java class name. + */ + public static String className(String malArea, String typeName) { + if ("MAL".equals(malArea) && RENAMED.containsKey(typeName)) { + return RENAMED.get(typeName); + } + return typeName; + } + + /** + * Returns true if the MAL attribute type is a plain Java type rather than a class this + * generator produces. + * + * @param malArea The area the type belongs to. + * @param typeName The MAL type name. + * @return true if it maps to a Java built-in. + */ + public static boolean isNative(String malArea, String typeName) { + return "MAL".equals(malArea) && NATIVE.containsKey(typeName); + } + + /** + * Returns the Java name of a native MAL attribute type. + * + * @param typeName The MAL type name. + * @return the Java type name. + */ + public static String nativeName(String typeName) { + return NATIVE.get(typeName); + } + + /** + * Returns the value a native MAL attribute type is created with when nothing is known + * about the value it is going to carry. + * + * @param typeName The MAL type name. + * @return the Java expression of the default value. + */ + public static String nativeDefault(String typeName) { + return NATIVE_DEFAULT.get(typeName); + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/JumpTable.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/JumpTable.java new file mode 100644 index 00000000..480de6f2 --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/JumpTable.java @@ -0,0 +1,177 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.generators.java; + +import java.util.Collection; +import java.util.Map; +import java.util.SortedSet; +import java.util.TreeMap; +import java.util.TreeSet; + +/** + * Decides how the type numbers of an element factory are laid out, so that a lookup + * compiles to a jump rather than to a binary search. + *

                  + * Carried over from the generator this replaces, rule for rule. A type and the list that + * holds it share a number save for the sign, so numbers far from zero leave the whole + * distance across zero empty between them, and a switch spanning that emptiness falls back + * to a binary search. Two things follow: numbers that lie past the widest table worth + * building are answered by a second method, and where each side of zero would answer with + * a table of its own but the two together would not, the sides are switched apart. + */ +public final class JumpTable { + + private JumpTable() { + } + + /** + * Returns true when a switch over this many numbers, spanning this far, is worth + * compiling to a jump table rather than to a binary search. + * + * @param count How many numbers the switch answers for. + * @param span The distance from the lowest number to the highest, inclusive. + * @return true if a jump table pays. + */ + public static boolean compilesToJumpTable(int count, long span) { + return (4 + span) + 3L * 3L <= (3 + 2L * count) + 3L * count; + } + + /** + * Returns the widest distance from zero within which the numbers still pay for a jump + * table. A type and its list share a number save for the sign, so the band widens by + * the same step on both sides at once. + * + * @param numbers The type numbers. + * @return the widest band, or zero if no table pays. + */ + public static int widestJumpTableBand(Collection numbers) { + SortedSet magnitudes = new TreeSet(); + for (Integer number : numbers) { + magnitudes.add(Math.abs(number)); + } + + int widest = 0; + for (Integer magnitude : magnitudes) { + int count = 0; + for (Integer number : numbers) { + if (Math.abs(number) <= magnitude) { + count++; + } + } + if (compilesToJumpTable(count, 2L * magnitude + 1L)) { + widest = magnitude; + } + } + return widest; + } + + /** + * Returns true when the numbers are better switched on one side of zero at a time than + * all together: neither side is worth it unless both sides answer with a table of + * their own and the two together would not. + * + * @param numbers The type numbers of the switch. + * @return true if each side of zero should be switched on its own. + */ + public static boolean shouldSplitOnSign(Collection numbers) { + int positives = 0; + int negatives = 0; + int highest = Integer.MIN_VALUE; + int lowest = Integer.MAX_VALUE; + int highestPositive = Integer.MIN_VALUE; + int lowestPositive = Integer.MAX_VALUE; + int highestNegative = Integer.MIN_VALUE; + int lowestNegative = Integer.MAX_VALUE; + + for (Integer number : numbers) { + highest = Math.max(highest, number); + lowest = Math.min(lowest, number); + if (number > 0) { + positives++; + highestPositive = Math.max(highestPositive, number); + lowestPositive = Math.min(lowestPositive, number); + } else { + negatives++; + highestNegative = Math.max(highestNegative, number); + lowestNegative = Math.min(lowestNegative, number); + } + } + + if (positives == 0 || negatives == 0) { + return false; // There is only one side to switch on + } + + return !compilesToJumpTable(numbers.size(), (long) highest - lowest + 1L) + && compilesToJumpTable(positives, (long) highestPositive - lowestPositive + 1L) + && compilesToJumpTable(negatives, (long) highestNegative - lowestNegative + 1L); + } + + /** + * The types of one switch, split into the ones a jump table can hold and the ones + * whose numbers lie too far out for it. + */ + public static final class Split { + + private final Map inBand = new TreeMap(); + private final Map outOfBand = new TreeMap(); + + /** + * @return true if the types have to be reached by two switches. + */ + public boolean isSplit() { + return !inBand.isEmpty() && !outOfBand.isEmpty(); + } + + public Map getInBand() { + return inBand; + } + + public Map getOutOfBand() { + return outOfBand; + } + + /** + * @return every type, whether or not the jump table can hold it. + */ + public Map all() { + Map every = new TreeMap(inBand); + every.putAll(outOfBand); + return every; + } + } + + /** + * Splits the types into the ones the widest jump table can hold and the ones past it. + * + * @param types The types, by number, in declaration order. + * @return the split. + */ + public static Split splitTypes(Map types) { + Map byNumber = new TreeMap(types); + int band = widestJumpTableBand(byNumber.keySet()); + Split split = new Split(); + for (Map.Entry entry : byNumber.entrySet()) { + boolean fits = Math.abs(entry.getKey()) <= band; + (fits ? split.inBand : split.outOfBand).put(entry.getKey(), entry.getValue()); + } + return split; + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/ShortForm.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/ShortForm.java new file mode 100644 index 00000000..bca55708 --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/ShortForm.java @@ -0,0 +1,76 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.generators.java; + +import esa.mo.apigen.model.Area; +import esa.mo.apigen.model.Service; + +/** + * The absolute short form of a type: the number that identifies it on the wire. + *

                  + * Area number, service number, area version and the type's own short form part, packed + * into one long. + */ +public final class ShortForm { + + private ShortForm() { + } + + /** + * Computes the absolute short form. + * + * @param area The area defining the type. + * @param service The service defining it, or null for an area-level type. + * @param shortFormPart The type's short form part. + * @return the absolute short form. + */ + public static long of(Area area, Service service, long shortFormPart) { + long serviceNumber = service == null ? 0 : service.getNumber(); + return ((long) area.getNumber() << 48) + + (serviceNumber << 32) + + ((long) area.getVersion() << 24) + + shortFormPart; + } + + /** + * Writes the three fields that carry a type's identity: the version the class was + * serialised under, the short form as a Long, and the TypeId built from it. Composites, + * enumerations and lists all open with them, written as one block with no blank line + * between them. + * + * @param out The source to write to. + * @param shortForm The absolute short form of the type. + */ + public static void writeIdentity(JavaSource out, long shortForm) { + JavaFieldBuilder.named("serialVersionUID").scope("private").asStatic().asFinal() + .ofType("long").value(shortForm + "L") + .write(out); + JavaFieldBuilder.named("SHORT_FORM").asStatic().asFinal() + .ofType("Long").value(shortForm + "L") + .comment("The TypeId of this Element as a long.") + .joinedToPrevious().write(out); + JavaFieldBuilder.named("TYPE_ID").asStatic().asFinal() + .ofType(JavaNaming.MAL + "TypeId") + .value("new " + JavaNaming.MAL + "TypeId(SHORT_FORM)") + .comment("The TypeId of this Element.") + .joinedToPrevious().write(out); + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/writers/CompositeWriter.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/writers/CompositeWriter.java new file mode 100644 index 00000000..b9807cde --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/writers/CompositeWriter.java @@ -0,0 +1,403 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.generators.java.writers; + +import esa.mo.apigen.generators.java.JavaClassBuilder; +import esa.mo.apigen.generators.java.JavaFieldBuilder; +import esa.mo.apigen.generators.java.JavaMethodBuilder; +import esa.mo.apigen.generators.java.JavaNaming; +import esa.mo.apigen.generators.java.JavaSource; +import esa.mo.apigen.generators.java.JavaTypeName; +import esa.mo.apigen.generators.java.ShortForm; +import esa.mo.apigen.model.Area; +import esa.mo.apigen.model.Field; +import esa.mo.apigen.model.MOModel; +import esa.mo.apigen.model.Service; +import esa.mo.apigen.model.types.CompositeType; +import esa.mo.apigen.model.types.TypeRef; +import java.util.ArrayList; +import java.util.List; + +/** + * Writes the Java class for a composite. + */ +public final class CompositeWriter { + + private static final String COMPOSITE = JavaNaming.MAL_STRUCTURES + "Composite"; + + private CompositeWriter() { + } + + public static String write(MOModel model, Area area, Service service, CompositeType type) { + String name = type.getName(); + String pkg = service == null + ? JavaNaming.packageOf(area, JavaNaming.STRUCTURES) + : JavaNaming.packageOf(service, JavaNaming.STRUCTURES); + String fq = pkg + "." + name; + List own = type.getFields(); + List inherited = inheritedFields(model, type); + List all = new ArrayList(inherited); + all.addAll(own); + + String superFq = superClassOf(type); + boolean isAbstract = type.isAbstract(); + + JavaClassBuilder clazz = JavaClassBuilder.named(name).inPackage(pkg) + .comment(isBlank(type.getComment()) + ? "The " + name + " structure." : type.getComment()); + if (isAbstract) { + clazz.asAbstract(); + } else { + clazz.asFinal(); + } + // A composite that extends the base Composite implements the interface instead; + // anything else extends its super type. + if (superFq == null) { + clazz.implementing(COMPOSITE); + } else { + clazz.extending(superFq); + } + JavaSource out = clazz.open(); + + if (type.getShortFormPart() != null) { + ShortForm.writeIdentity(out, ShortForm.of(area, service, type.getShortFormPart())); + } + + for (Field field : own) { + JavaFieldBuilder.named(field.getName()).scope("private") + .ofType(JavaTypeName.of(model, field.getType())) + .comment(isBlank(field.getComment()) + ? "The " + field.getName() + " field." : field.getComment()) + .write(out); + } + + JavaMethodBuilder.constructor(name).comment("Default constructor for " + name + ".") + .write(out); + + if (!all.isEmpty()) { + writeConstructor(out, model, name, all, inherited, own, + "Constructor that initialises the values of the structure."); + // The second constructor is suppressed in two cases: with no non-nullable + // fields it would take no arguments and collide with the default constructor, + // and with nothing but non-nullable fields it would repeat the first one. + List required = requiredOf(all); + if (!required.isEmpty() && required.size() != all.size()) { + writeConstructor(out, model, name, required, + retain(inherited, required), own, + "Constructor that initialises the non-nullable values of the structure.", + omitted(own, required)); + } + } + + if (!isAbstract) { + JavaMethodBuilder.named("createElement").asOverride() + .returns(JavaNaming.MAL_STRUCTURES + "Element", null) + .line("return new " + fq + "();") + .write(out); + } + + for (Field field : own) { + JavaMethodBuilder.named("get" + capitalise(field.getName())) + .comment("Returns the field " + field.getName() + ".") + .returns(JavaTypeName.of(model, field.getType()), + "The field " + field.getName()) + .line("return " + field.getName() + ";") + .write(out); + } + + writeEquals(out, name, own, superFq != null); + writeHashCode(out, own, superFq != null); + writeToString(out, name, own, superFq != null); + writeEncode(out, model, own, superFq != null); + writeDecode(out, model, own, superFq != null); + + if (type.getShortFormPart() != null) { + JavaMethodBuilder.named("getTypeId").asOverride() + .returns(JavaNaming.MAL + "TypeId", null) + .line("return TYPE_ID;") + .write(out); + } + + return clazz.close(); + } + + // --------------------------------------------------------- constructors + + private static void writeConstructor(JavaSource out, MOModel model, String name, + List parameters, List superArgs, List ownArgs, String title) { + writeConstructor(out, model, name, parameters, superArgs, ownArgs, title, + new ArrayList()); + } + + private static void writeConstructor(JavaSource out, MOModel model, String name, + List parameters, List superArgs, List ownArgs, String title, + List nulled) { + JavaMethodBuilder constructor = JavaMethodBuilder.constructor(name).comment(title); + + for (Field field : parameters) { + // A field with no comment still gets a parameter description. + constructor.argument(JavaTypeName.of(model, field.getType()), field.getName(), + field.getComment()); + } + if (!superArgs.isEmpty()) { + StringBuilder call = new StringBuilder("super("); + for (int i = 0; i < superArgs.size(); i++) { + if (i > 0) { + call.append(",\n "); + } + call.append(superArgs.get(i).getName()); + } + call.append(");"); + constructor.line(call.toString()); + } + // Assignments follow declaration order; a constructor that omits the nullable + // fields still sets them, in place, to null. + for (Field field : ownArgs) { + boolean omitted = nulled.contains(field); + constructor.line("this." + field.getName() + " = " + + (omitted ? "null" : field.getName()) + ";"); + } + constructor.write(out); + } + + // ------------------------------------------------------------- equality + + private static void writeEquals(JavaSource out, String name, List fields, + boolean hasSuper) { + JavaMethodBuilder method = JavaMethodBuilder.named("equals").asOverride() + .returns("boolean", null) + .argument("Object", "obj", null); + + method.line("if (obj instanceof " + name + ") {"); + if (hasSuper) { + // A subclass compares its own fields only after the inherited ones agree. + method.line(" if (! super.equals(obj)) {"); + method.line(" return false;"); + method.line(" }"); + } + if (!fields.isEmpty()) { + method.line(" " + name + " other = (" + name + ") obj;"); + } + for (Field field : fields) { + String f = field.getName(); + method.line(" if (" + f + " == null) {"); + method.line(" if (other." + f + " != null) {"); + method.line(" return false;"); + method.line(" }"); + method.line(" } else {"); + method.line(" if (! " + f + ".equals(other." + f + ")) {"); + method.line(" return false;"); + method.line(" }"); + method.line(" }"); + } + method.line(" return true;"); + method.line("}"); + method.line("return false;"); + method.write(out); + } + + private static void writeHashCode(JavaSource out, List fields, + boolean hasSuper) { + JavaMethodBuilder method = JavaMethodBuilder.named("hashCode").asOverride() + .returns("int", null); + + method.line("int hash = " + (hasSuper ? "super.hashCode()" : "7") + ";"); + for (Field field : fields) { + method.line("hash = 83 * hash + (" + field.getName() + " != null ? " + + field.getName() + ".hashCode() : 0);"); + } + method.line("return hash;"); + method.write(out); + } + + private static void writeToString(JavaSource out, String name, List fields, + boolean hasSuper) { + JavaMethodBuilder method = JavaMethodBuilder.named("toString").asOverride() + .returns("String", null); + + method.line("StringBuilder buf = new StringBuilder();"); + method.line("buf.append(\"(" + name + ": \");"); + if (hasSuper) { + method.line("buf.append(super.toString());"); + } + for (int i = 0; i < fields.size(); i++) { + String f = fields.get(i).getName(); + String separator = (i == 0 && !hasSuper) ? "" : ", "; + method.line("buf.append(\"" + separator + f + "=\").append(" + f + ");"); + } + method.line("buf.append(')');"); + method.line("return buf.toString();"); + method.write(out); + } + + // ------------------------------------------------------ encode / decode + + private static void writeEncode(JavaSource out, MOModel model, List fields, + boolean hasSuper) { + JavaMethodBuilder method = JavaMethodBuilder.named("encode").asOverride() + .argument(JavaNaming.MAL + "MALEncoder", "encoder", null) + .throwing(JavaNaming.MAL + "MALException", null); + + if (hasSuper) { + // Inherited fields are written by the super type, before this one's. + method.line("super.encode(encoder);"); + } + for (Field field : fields) { + if (!field.isCanBeNull()) { + method.line("if (" + field.getName() + " == null) {"); + method.line(" throw new " + JavaNaming.MAL + "MALException(\"The field '" + + field.getName() + "' cannot be null!\");"); + method.line("}"); + } + } + for (Field field : fields) { + String nullable = field.isCanBeNull() ? "Nullable" : ""; + String attribute = JavaTypeName.attributeName(model, field.getType()); + String encoded = attribute == null + ? (JavaTypeName.isAbstractElement(model, field.getType()) + ? "AbstractElement" : "Element") + : attribute; + method.line("encoder.encode" + nullable + encoded + "(" + field.getName() + ");"); + } + method.write(out); + } + + private static void writeDecode(JavaSource out, MOModel model, List fields, + boolean hasSuper) { + JavaMethodBuilder method = JavaMethodBuilder.named("decode").asOverride() + .returns(JavaNaming.MAL_STRUCTURES + "Element", null) + .argument(JavaNaming.MAL + "MALDecoder", "decoder", null) + .throwing(JavaNaming.MAL + "MALException", null); + + if (hasSuper) { + method.line("super.decode(decoder);"); + } + for (Field field : fields) { + String nullable = field.isCanBeNull() ? "Nullable" : ""; + String attribute = JavaTypeName.attributeName(model, field.getType()); + if (attribute != null) { + // The abstract Attribute decodes to a general type and is cast back. + String cast = "Attribute".equals(attribute) + ? "(" + JavaNaming.MAL_STRUCTURES + "Attribute) " : ""; + method.line(field.getName() + " = " + cast + "decoder.decode" + + nullable + attribute + "();"); + } else if (JavaTypeName.isAbstractElement(model, field.getType())) { + // An abstract element carries its own type on the wire, so nothing needs + // to be handed to the decoder. + String java = JavaTypeName.of(model, field.getType()); + method.line(field.getName() + " = (" + java + ") decoder.decode" + + nullable + "AbstractElement();"); + } else { + String java = JavaTypeName.of(model, field.getType()); + method.line(field.getName() + " = (" + java + ") decoder.decode" + + nullable + "Element(" + + JavaTypeName.newInstance(model, field.getType()) + ");"); + } + } + method.line("return this;"); + method.write(out); + } + + // ---------------------------------------------------------------- utils + + /** + * A composite that extends the base Composite implements the interface; anything else + * extends its super type and inherits its fields. + */ + /** + * A comment that was written empty says as little as one that was not written at all, + * so both are replaced by a plain description of what is being declared. + */ + private static boolean isBlank(String comment) { + return comment == null || comment.isEmpty(); + } + + private static String superClassOf(CompositeType type) { + TypeRef superType = type.getSuperType(); + if (superType == null + || ("MAL".equals(superType.getArea()) && "Composite".equals(superType.getName()))) { + return null; + } + return JavaTypeName.qualified(superType); + } + + private static List inheritedFields(MOModel model, CompositeType type) { + List inherited = new ArrayList(); + TypeRef superType = type.getSuperType(); + if (superClassOf(type) == null) { + return inherited; + } + // MOObject is hand-written in the MAL API rather than generated - the schema + // declares MAL::Object as a fundamental - so the one field it contributes is + // known here rather than read from the model. + if ("MAL".equals(superType.getArea()) && "Object".equals(superType.getName())) { + Field identity = new Field(); + identity.setName("objectIdentity"); + identity.setComment("The identity of the MO Object."); + identity.setCanBeNull(false); + identity.setType(new TypeRef("MAL", superType.getAreaVersion(), null, + "ObjectIdentity", false, false)); + inherited.add(identity); + return inherited; + } + Object resolved = model.resolve(superType); + if (resolved instanceof CompositeType) { + CompositeType parent = (CompositeType) resolved; + inherited.addAll(inheritedFields(model, parent)); + inherited.addAll(parent.getFields()); + } + return inherited; + } + + private static List requiredOf(List fields) { + List required = new ArrayList(); + for (Field field : fields) { + if (!field.isCanBeNull()) { + required.add(field); + } + } + return required; + } + + private static List omitted(List source, List keep) { + List result = new ArrayList(); + for (Field field : source) { + if (!keep.contains(field)) { + result.add(field); + } + } + return result; + } + + private static List retain(List source, List keep) { + List result = new ArrayList(); + for (Field field : source) { + if (keep.contains(field)) { + result.add(field); + } + } + return result; + } + + private static String capitalise(String name) { + return Character.toUpperCase(name.charAt(0)) + name.substring(1); + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/writers/ConsumerAdapterWriter.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/writers/ConsumerAdapterWriter.java new file mode 100644 index 00000000..8d8dcf39 --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/writers/ConsumerAdapterWriter.java @@ -0,0 +1,470 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.generators.java.writers; + +import esa.mo.apigen.generators.java.JavaClassBuilder; +import esa.mo.apigen.generators.java.JavaMethodBuilder; +import esa.mo.apigen.generators.java.JavaNaming; +import esa.mo.apigen.generators.java.JavaSource; +import esa.mo.apigen.generators.java.JavaTypeName; +import esa.mo.apigen.generators.java.JavaTypes; +import esa.mo.apigen.model.Area; +import esa.mo.apigen.model.Field; +import esa.mo.apigen.model.InteractionPattern; +import esa.mo.apigen.model.InteractionStage; +import esa.mo.apigen.model.MOModel; +import esa.mo.apigen.model.MessageBody; +import esa.mo.apigen.model.Operation; +import esa.mo.apigen.model.Service; +import java.util.ArrayList; +import java.util.List; + +/** + * Writes the consumer adapter of a service: one empty method per message a consumer can + * receive, for the consumer to override, and one dispatch method per kind of message, which + * reads the operation number off the header and calls the right one. + *

                  + * The dispatch methods are final: what arrives is decided by the specification, so a + * consumer overrides what it wants to hear about, never how the message is routed. + */ +public final class ConsumerAdapterWriter { + + private static final String HEADER = JavaNaming.MAL + "transport.MALMessageHeader"; + + private static final String BODY = JavaNaming.MAL + "transport.MALMessageBody"; + + private static final String NOTIFY_BODY = JavaNaming.MAL + "transport.MALNotifyBody"; + + private static final String ERROR_BODY = JavaNaming.MAL + "transport.MALErrorBody"; + + private static final String MAL_EXCEPTION = JavaNaming.MAL + "MALException"; + + private static final String HEADER_COMMENT = "msgHeader The header of the received message"; + + private static final String BODY_COMMENT = "body The body of the received message"; + + private static final String QOS_COMMENT = + "qosProperties The QoS properties associated with the message"; + + private static final String THROWN = "if an error is detected processing the message."; + + /** + * The step an argument of a dispatched call takes past the line it starts on. + */ + private static final String ARGUMENT = ",\n "; + + private ConsumerAdapterWriter() { + } + + /** + * @return the source of the service's consumer adapter. + */ + public static String write(MOModel model, Area area, Service service) { + String name = service.getName(); + + JavaClassBuilder clazz = JavaClassBuilder.named(name + "Adapter").asAbstract() + .inPackage(JavaNaming.packageOf(service, JavaNaming.CONSUMER)) + .extending(JavaNaming.MAL + "consumer.MALInteractionAdapter") + .comment("Consumer adapter for " + name + " service."); + JavaSource out = clazz.open(); + + boolean submits = false; + boolean requests = false; + boolean invokes = false; + boolean progresses = false; + boolean pubsubs = false; + + for (Operation operation : service.getOperations()) { + String opName = operation.getName(); + switch (operation.getPattern()) { + case SUBMIT: + callback(out, opName + "AckReceived") + .comment("Called by the MAL when a SUBMIT acknowledgement is received" + + " from a provider for the operation " + opName) + .write(out); + error(out, opName + "ErrorReceived", + "Called by the MAL when a SUBMIT acknowledgement error is received" + + " from a provider for the operation " + opName); + submits = true; + break; + case REQUEST: + received(out, model, operation, "ResponseReceived", InteractionStage.RESPONSE, + "Called by the MAL when a REQUEST response is received from a" + + " provider for the operation " + opName); + error(out, opName + "ErrorReceived", + "Called by the MAL when a REQUEST response error is received from a" + + " provider for the operation " + opName); + requests = true; + break; + case INVOKE: + received(out, model, operation, "AckReceived", InteractionStage.ACK, + "Called by the MAL when an INVOKE acknowledgement is received from a" + + " provider for the operation " + opName); + received(out, model, operation, "ResponseReceived", InteractionStage.RESPONSE, + "Called by the MAL when an INVOKE response is received from a" + + " provider for the operation " + opName); + error(out, opName + "AckErrorReceived", + "Called by the MAL when an INVOKE acknowledgement error is received" + + " from a provider for the operation " + opName); + error(out, opName + "ResponseErrorReceived", + "Called by the MAL when an INVOKE response error is received from a" + + " provider for the operation " + opName); + invokes = true; + break; + case PROGRESS: + received(out, model, operation, "AckReceived", InteractionStage.ACK, + "Called by the MAL when a PROGRESS acknowledgement is received from a" + + " provider for the operation " + opName); + received(out, model, operation, "UpdateReceived", InteractionStage.UPDATE, + "Called by the MAL when a PROGRESS update is received from a provider" + + " for the operation " + opName); + received(out, model, operation, "ResponseReceived", InteractionStage.RESPONSE, + "Called by the MAL when a PROGRESS response is received from a" + + " provider for the operation " + opName); + error(out, opName + "AckErrorReceived", + "Called by the MAL when a PROGRESS acknowledgement error is received" + + " from a provider for the operation " + opName); + error(out, opName + "UpdateErrorReceived", + "Called by the MAL when a PROGRESS update error is received from a" + + " provider for the operation " + opName); + error(out, opName + "ResponseErrorReceived", + "Called by the MAL when a PROGRESS response error is received from a" + + " provider for the operation " + opName); + progresses = true; + break; + case PUBSUB: + callback(out, opName + "RegisterAckReceived") + .comment("Called by the MAL when a PubSub register acknowledgement is" + + " received from a broker for the operation " + opName) + .write(out); + error(out, opName + "RegisterErrorReceived", + "Called by the MAL when a PubSub register acknowledgement error is" + + " received from a broker for the operation " + opName); + callback(out, opName + "DeregisterAckReceived") + .comment("Called by the MAL when a PubSub deregister acknowledgement" + + " is received from a broker for the operation " + opName) + .write(out); + writeNotifyCallback(out, model, operation); + error(out, opName + "NotifyErrorReceived", + "Called by the MAL when a PubSub update error is received from a" + + " broker for the operation " + opName); + pubsubs = true; + break; + default: + break; + } + } + + if (submits) { + dispatch(out, model, service, InteractionPattern.SUBMIT, "submitAck", "Ack", null, false, + "Called by the MAL when a SUBMIT acknowledgement is received from a provider."); + dispatchError(out, service, InteractionPattern.SUBMIT, "submit", "", + "Called by the MAL when a SUBMIT acknowledgement error is received from a provider."); + } + if (requests) { + dispatch(out, model, service, InteractionPattern.REQUEST, "requestResponse", "Response", + InteractionStage.RESPONSE, true, + "Called by the MAL when a REQUEST response is received from a provider."); + dispatchError(out, service, InteractionPattern.REQUEST, "request", "", + "Called by the MAL when a REQUEST response error is received from a provider."); + } + if (invokes) { + dispatch(out, model, service, InteractionPattern.INVOKE, "invokeAck", "Ack", + InteractionStage.ACK, true, + "Called by the MAL when an INVOKE acknowledgement is received from a provider."); + dispatchError(out, service, InteractionPattern.INVOKE, "invokeAck", "Ack", + "Called by the MAL when an INVOKE acknowledgement error is received from a provider."); + dispatch(out, model, service, InteractionPattern.INVOKE, "invokeResponse", "Response", + InteractionStage.RESPONSE, true, + "Called by the MAL when an INVOKE response is received from a provider."); + dispatchError(out, service, InteractionPattern.INVOKE, "invokeResponse", "Response", + "Called by the MAL when an INVOKE response error is received from a provider."); + } + if (progresses) { + dispatch(out, model, service, InteractionPattern.PROGRESS, "progressAck", "Ack", + InteractionStage.ACK, true, + "Called by the MAL when a PROGRESS acknowledgement is received from a provider."); + dispatchError(out, service, InteractionPattern.PROGRESS, "progressAck", "Ack", + "Called by the MAL when a PROGRESS acknowledgement error is received from a provider."); + dispatch(out, model, service, InteractionPattern.PROGRESS, "progressUpdate", "Update", + InteractionStage.UPDATE, true, + "Called by the MAL when a PROGRESS update is received from a provider."); + dispatchError(out, service, InteractionPattern.PROGRESS, "progressUpdate", "Update", + "Called by the MAL when a PROGRESS update error is received from a provider."); + dispatch(out, model, service, InteractionPattern.PROGRESS, "progressResponse", "Response", + InteractionStage.RESPONSE, true, + "Called by the MAL when a PROGRESS response is received from a provider."); + dispatchError(out, service, InteractionPattern.PROGRESS, "progressResponse", "Response", + "Called by the MAL when a PROGRESS response error is received from a provider."); + } + if (pubsubs) { + dispatch(out, model, service, InteractionPattern.PUBSUB, "registerAck", "RegisterAck", + InteractionStage.ACK, false, + "Called by the MAL when a PubSub register acknowledgement is received from a broker."); + dispatchError(out, service, InteractionPattern.PUBSUB, "register", "Register", + "Called by the MAL when a PubSub register acknowledgement error is received from a broker."); + writeNotifyDispatch(out, model, area, service); + dispatchError(out, service, InteractionPattern.PUBSUB, "notify", "Notify", + "Called by the MAL when a PubSub update error is received from a broker."); + dispatch(out, model, service, InteractionPattern.PUBSUB, "deregisterAck", "DeregisterAck", + InteractionStage.ACK, false, + "Called by the MAL when a PubSub deregister acknowledgement is received from a broker."); + + JavaMethodBuilder.named("notifyReceivedFromOtherService") + .comment("Called by the MAL when a PubSub update from another service is" + + " received from a broker.") + .argument(HEADER, "msgHeader", HEADER_COMMENT) + .argument(NOTIFY_BODY, "body", BODY_COMMENT) + .argument("java.util.Map", "qosProperties", QOS_COMMENT) + .throwing(MAL_EXCEPTION, THROWN) + .write(out); + } + + return clazz.close(); + } + + /** + * A callback that carries nothing but the header. + */ + private static JavaMethodBuilder callback(JavaSource out, String name) { + return JavaMethodBuilder.named(name) + .argument(HEADER, "msgHeader", HEADER_COMMENT) + .argument("java.util.Map", "qosProperties", QOS_COMMENT); + } + + /** + * A callback that carries the fields of one stage of the interaction. + */ + private static void received(JavaSource out, MOModel model, Operation operation, + String suffix, InteractionStage stage, String comment) { + JavaMethodBuilder method = JavaMethodBuilder.named(operation.getName() + suffix) + .comment(comment) + .argument(HEADER, "msgHeader", HEADER_COMMENT); + addFields(method, model, fieldsOf(operation.getMessage(stage))); + method.argument("java.util.Map", "qosProperties", QOS_COMMENT).write(out); + } + + /** + * A callback that carries an error instead of a body. + */ + private static void error(JavaSource out, String name, String comment) { + JavaMethodBuilder.named(name).comment(comment) + .argument(HEADER, "msgHeader", HEADER_COMMENT) + .argument(JavaNaming.MAL + "MOErrorException", "error", + "error The received error message") + .argument("java.util.Map", "qosProperties", QOS_COMMENT) + .write(out); + } + + /** + * The notify callback carries what every update carries - which subscription it answers + * and the header of the update - then the typed keys, then the published fields. + */ + private static void writeNotifyCallback(JavaSource out, MOModel model, Operation operation) { + JavaMethodBuilder method = JavaMethodBuilder.named(operation.getName() + "NotifyReceived") + .comment("Called by the MAL when a PubSub update is received from a broker for" + + " the operation " + operation.getName()) + .argument(HEADER, "msgHeader", HEADER_COMMENT) + .argument(JavaNaming.MAL_STRUCTURES + "Identifier", "subscriptionId", + "The subscriptionId of the subscription.") + .argument(JavaNaming.MAL_STRUCTURES + "UpdateHeader", "updateHeader", + "The Update header.") + .argument(SubscriptionKeysWriter.classNameOf(operation), "keys", + "The typed Subscription Key accessors for this update"); + // The published fields are numbered after the two the MAL always sends first. + addFields(method, model, + fieldsOf(operation.getMessage(InteractionStage.PUBLISH_NOTIFY)), 2); + method.argument("java.util.Map", "qosProperties", QOS_COMMENT).write(out); + } + + /** + * Writes one dispatch method: it reads the operation number off the header and calls the + * callback of that operation, unpacking the body as it goes. + */ + private static void dispatch(JavaSource out, MOModel model, Service service, + InteractionPattern pattern, String name, String suffix, InteractionStage stage, + boolean carriesBody, String comment) { + JavaMethodBuilder method = JavaMethodBuilder.named(name + "Received").asFinal().asOverride() + .comment(comment) + .argument(HEADER, "msgHeader", HEADER_COMMENT); + if (carriesBody) { + method.argument(BODY, "body", BODY_COMMENT); + } + method.argument("java.util.Map", "qosProperties", QOS_COMMENT) + .throwing(MAL_EXCEPTION, THROWN); + + method.line("switch (msgHeader.getOperation().getValue()) {"); + for (Operation operation : service.getOperations()) { + if (operation.getPattern() != pattern) { + continue; + } + method.line(" case " + operationNumberOf(service, operation) + ":"); + String arguments = stage == null ? "" + : unpacked(model, fieldsOf(operation.getMessage(stage)), 0); + method.line(" " + operation.getName() + suffix + "Received(msgHeader" + + arguments + ", qosProperties);"); + method.line(" break;"); + } + method.line(" default:"); + method.line(" throw new " + MAL_EXCEPTION + "(\"Consumer adapter was not expecting" + + " operation number \" + msgHeader.getOperation().getValue());"); + method.line("}"); + method.write(out); + } + + /** + * Writes the dispatch method for errors, which have no body to unpack. + */ + private static void dispatchError(JavaSource out, Service service, InteractionPattern pattern, + String name, String suffix, String comment) { + JavaMethodBuilder method = JavaMethodBuilder.named(name + "ErrorReceived") + .asFinal().asOverride().comment(comment) + .argument(HEADER, "msgHeader", HEADER_COMMENT) + .argument(ERROR_BODY, "body", BODY_COMMENT) + .argument("java.util.Map", "qosProperties", QOS_COMMENT) + .throwing(MAL_EXCEPTION, THROWN); + + method.line("switch (msgHeader.getOperation().getValue()) {"); + for (Operation operation : service.getOperations()) { + if (operation.getPattern() != pattern) { + continue; + } + method.line(" case " + operationNumberOf(service, operation) + ":"); + method.line(" " + operation.getName() + suffix + + "ErrorReceived(msgHeader, body.getError(), qosProperties);"); + method.line(" break;"); + } + method.line(" default:"); + method.line(" throw new " + MAL_EXCEPTION + "(\"Consumer adapter was not expecting" + + " operation number \" + msgHeader.getOperation().getValue());"); + method.line("}"); + method.write(out); + } + + /** + * The notify dispatch also checks the update belongs to this service: a broker may hold + * subscriptions of several, and an update of another one is handed on rather than + * misread. + */ + private static void writeNotifyDispatch(JavaSource out, MOModel model, Area area, + Service service) { + String areaHelper = JavaNaming.packageOf(area) + "." + area.getName() + "Helper"; + String serviceInfo = JavaNaming.packageOf(service) + "." + service.getName() + "ServiceInfo"; + + JavaMethodBuilder method = JavaMethodBuilder.named("notifyReceived").asFinal().asOverride() + .comment("Called by the MAL when a PubSub update is received from a broker.") + .argument(HEADER, "msgHeader", HEADER_COMMENT) + .argument(NOTIFY_BODY, "body", BODY_COMMENT) + .argument(JavaNaming.MAL_STRUCTURES + "IdentifierList", "selectedKeys", + "selectedKeys The selected Subscription Key names, or null if trimming" + + " was not enabled") + .argument("java.util.Map", "qosProperties", QOS_COMMENT) + .throwing(MAL_EXCEPTION, THROWN); + + method.line("if ((" + areaHelper + "." + area.getName().toUpperCase() + + "_AREA_NUMBER.equals(msgHeader.getServiceArea())) && (" + serviceInfo + "." + + service.getName().toUpperCase() + + "_SERVICE_NUMBER.equals(msgHeader.getService()))) {"); + method.line(" switch (msgHeader.getOperation().getValue()) {"); + + for (Operation operation : service.getOperations()) { + if (operation.getPattern() != InteractionPattern.PUBSUB) { + continue; + } + method.line(" case " + operationNumberOf(service, operation) + ":"); + // The subscription identifier and the update header come first, then the keys + // built from that same header, then what was published. + String head = ARGUMENT + "(" + JavaNaming.MAL_STRUCTURES + + "Identifier) body.getBodyElement(0, new " + JavaNaming.MAL_STRUCTURES + + "Identifier())" + ARGUMENT + "(" + JavaNaming.MAL_STRUCTURES + + "UpdateHeader) body.getBodyElement(1, new " + JavaNaming.MAL_STRUCTURES + + "UpdateHeader())"; + String keys = ARGUMENT + "new " + SubscriptionKeysWriter.classNameOf(operation) + + "((" + JavaNaming.MAL_STRUCTURES + "UpdateHeader) body.getBodyElement(1, new " + + JavaNaming.MAL_STRUCTURES + "UpdateHeader()), selectedKeys)"; + String published = unpacked(model, + fieldsOf(operation.getMessage(InteractionStage.PUBLISH_NOTIFY)), 2); + method.line(" " + operation.getName() + "NotifyReceived(msgHeader" + + head + keys + published + ", qosProperties);"); + method.line(" break;"); + } + method.line(" default:"); + method.line(" throw new " + MAL_EXCEPTION + "(\"Consumer adapter was not expecting" + + " operation number \" + msgHeader.getOperation().getValue());"); + method.line(" }"); + method.line("}"); + method.line("else {"); + method.line(" notifyReceivedFromOtherService(msgHeader, body, qosProperties);"); + method.line("}"); + method.write(out); + } + + /** + * @return the fields taken out of the body, each on its own line, starting at the given + * position in it. + */ + private static String unpacked(MOModel model, List fields, int first) { + StringBuilder buf = new StringBuilder(); + for (int i = 0; i < fields.size(); i++) { + Field field = fields.get(i); + int index = first + i; + buf.append(ARGUMENT); + if (JavaTypeName.isNativeAttribute(model, field.getType())) { + String union = JavaNaming.MAL_STRUCTURES + "Union"; + String element = "body.getBodyElement(" + index + ", new " + union + "(" + + JavaTypes.nativeDefault(field.getType().getName()) + "))"; + buf.append("(").append(element).append(" == null) ? null : ((").append(union) + .append(") ").append(element).append(").get") + .append(field.getType().getName()).append("Value()"); + } else { + buf.append("(").append(JavaTypeName.of(model, field.getType())) + .append(") body.getBodyElement(").append(index).append(", ") + .append(JavaTypeName.expectedTypeOf(model, field.getType())).append(")"); + } + } + return buf.toString(); + } + + + private static void addFields(JavaMethodBuilder method, MOModel model, List fields) { + addFields(method, model, fields, 0); + } + + private static void addFields(JavaMethodBuilder method, MOModel model, List fields, + int first) { + for (int i = 0; i < fields.size(); i++) { + Field field = fields.get(i); + String comment = field.getComment() != null ? field.getComment() + : field.getName() + " Argument number " + (first + i) + + " as defined by the service operation"; + method.argument(JavaTypeName.of(model, field.getType()), field.getName(), comment); + } + } + + private static List fieldsOf(MessageBody body) { + return body == null ? new ArrayList() : body.getFields(); + } + + private static String operationNumberOf(Service service, Operation operation) { + return JavaNaming.packageOf(service) + "." + service.getName() + "ServiceInfo._" + + operation.getName().toUpperCase() + "_OP_NUMBER"; + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/writers/ConsumerStubWriter.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/writers/ConsumerStubWriter.java new file mode 100644 index 00000000..ef1fc75e --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/writers/ConsumerStubWriter.java @@ -0,0 +1,431 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.generators.java.writers; + +import esa.mo.apigen.generators.java.JavaClassBuilder; +import esa.mo.apigen.generators.java.JavaFieldBuilder; +import esa.mo.apigen.generators.java.JavaMethodBuilder; +import esa.mo.apigen.generators.java.JavaNaming; +import esa.mo.apigen.generators.java.JavaSource; +import esa.mo.apigen.generators.java.JavaTypeName; +import esa.mo.apigen.generators.java.JavaTypes; +import esa.mo.apigen.model.Field; +import esa.mo.apigen.model.InteractionStage; +import esa.mo.apigen.model.MOModel; +import esa.mo.apigen.model.MessageBody; +import esa.mo.apigen.model.Operation; +import esa.mo.apigen.model.Service; +import java.util.ArrayList; +import java.util.List; + +/** + * Writes the consumer stub of a service: one method per operation, taking the fields the + * operation sends and answering with the ones it sends back. + *

                  + * The stub is a thin mapping onto the generic MAL consumer - it names the operation and + * hands over the arguments - so every method is a single call, plus the unpacking of + * whatever came back. + */ +public final class ConsumerStubWriter { + + private static final String CONSUMER = JavaNaming.MAL + "consumer.MALConsumer"; + + private static final String MESSAGE = JavaNaming.MAL + "transport.MALMessage"; + + private static final String MESSAGE_BODY = JavaNaming.MAL + "transport.MALMessageBody"; + + private static final String INTERACTION_EXCEPTION = JavaNaming.MAL + "MALInteractionException"; + + private static final String MAL_EXCEPTION = JavaNaming.MAL + "MALException"; + + private static final String INTERACTION_THROWN = + "if there is a problem during the interaction as defined by the MAL specification."; + + private static final String EXCEPTION_THROWN = "if there is an implementation exception"; + + private static final String SENT = "the MAL message sent to initiate the interaction"; + + private ConsumerStubWriter() { + } + + /** + * @return the source of the service's consumer stub. + */ + public static String write(MOModel model, Service service) { + String name = service.getName(); + String adapterType = JavaNaming.packageOf(service, JavaNaming.CONSUMER) + "." + name + "Adapter"; + + JavaClassBuilder clazz = JavaClassBuilder.named(name + "Stub") + .inPackage(JavaNaming.packageOf(service, JavaNaming.CONSUMER)) + .comment("Consumer stub for " + name + " service."); + JavaSource out = clazz.open(); + + JavaFieldBuilder.named("consumer").scope("private").asFinal().ofType(CONSUMER) + .comment("The consumer field.").write(out); + + JavaMethodBuilder.constructor(name + "Stub") + .comment("Wraps a MALconsumer connection with service specific methods that" + + " map from the high level service API to the generic MAL API.") + .argument(CONSUMER, "consumer", "consumer The MALConsumer to use in this stub.") + .line("this.consumer = consumer;") + .write(out); + + JavaMethodBuilder.named("getConsumer").returns(CONSUMER, "The MAL consumer object.") + .comment("Returns the internal MAL consumer object used for sending of messages" + + " from this interface") + .line("return consumer;") + .write(out); + + for (Operation operation : service.getOperations()) { + switch (operation.getPattern()) { + case SEND: + writeSend(out, model, service, operation); + break; + case SUBMIT: + case REQUEST: + writeRequest(out, model, service, operation, adapterType); + break; + case INVOKE: + case PROGRESS: + writeInvoke(out, model, service, operation, adapterType); + break; + case PUBSUB: + writePubSub(out, service, operation, adapterType); + break; + default: + break; + } + } + + return clazz.close(); + } + + /** + * A send has nothing to wait for, so it answers with the message it sent. + */ + private static void writeSend(JavaSource out, MOModel model, Service service, + Operation operation) { + JavaMethodBuilder method = JavaMethodBuilder.named(operation.getName()) + .returns(MESSAGE, SENT).comment(operation.getComment()); + addArguments(method, model, requestBodyOf(operation)); + addThrows(method); + method.line("return consumer.send(" + operationOf(service, operation) + ", " + + arguments(model, requestBodyOf(operation)) + ");"); + method.write(out); + } + + /** + * A submit or a request is answered in one go, so the stub waits for the answer and + * unpacks it. Both also get an asynchronous form and a way to pick an interaction back + * up. + */ + private static void writeRequest(JavaSource out, MOModel model, Service service, + Operation operation, String adapterType) { + List sent = requestBodyOf(operation); + List received = fieldsOf(operation.getMessage(InteractionStage.RESPONSE)); + String returnType = returnTypeOf(model, service, operation, received, "Response"); + + JavaMethodBuilder method = JavaMethodBuilder.named(operation.getName()) + .comment(operation.getComment()); + if (returnType != null) { + method.returns(returnType, "The return value of the interaction"); + } + addArguments(method, model, sent); + addThrows(method); + method.line((returnType == null ? "" : MESSAGE_BODY + " body = ") + "consumer." + + patternCallOf(operation) + "(" + operationOf(service, operation) + ", " + + arguments(model, sent) + ");"); + addReturn(method, model, service, operation, received, returnType); + method.write(out); + + JavaMethodBuilder async = JavaMethodBuilder.named("async" + capitalise(operation.getName())) + .returns(MESSAGE, SENT) + .comment("Asynchronous version of method " + operation.getName()); + addArguments(async, model, sent); + async.argument(adapterType, "adapter", + "adapter Listener in charge of receiving the messages from the service provider"); + addThrows(async); + async.line("return consumer.async" + capitalise(patternCallOf(operation)) + "(" + + operationOf(service, operation) + ", adapter, " + arguments(model, sent) + ");"); + async.write(out); + + writeContinue(out, service, operation, adapterType); + } + + /** + * An invoke or a progress reports back over time, so the adapter is handed over with + * the call and the stub answers only with the acknowledgement. + */ + private static void writeInvoke(JavaSource out, MOModel model, Service service, + Operation operation, String adapterType) { + List sent = requestBodyOf(operation); + List acknowledged = fieldsOf(operation.getMessage(InteractionStage.ACK)); + String returnType = returnTypeOf(model, service, operation, acknowledged, "Ack"); + + JavaMethodBuilder method = JavaMethodBuilder.named(operation.getName()) + .comment(operation.getComment()); + if (returnType != null) { + method.returns(returnType, "The acknowledge value of the interaction"); + } + addArguments(method, model, sent); + method.argument(adapterType, "adapter", + "adapter Listener in charge of receiving the messages from the service provider"); + addThrows(method); + method.line((returnType == null ? "" : MESSAGE_BODY + " body = ") + "consumer." + + patternCallOf(operation) + "(" + operationOf(service, operation) + + ", adapter, " + arguments(model, sent) + ");"); + addReturn(method, model, service, operation, acknowledged, returnType); + method.write(out); + + JavaMethodBuilder async = JavaMethodBuilder.named("async" + capitalise(operation.getName())) + .returns(MESSAGE, SENT) + .comment("Asynchronous version of method " + operation.getName()); + addArguments(async, model, sent); + async.argument(adapterType, "adapter", + "adapter Listener in charge of receiving the messages from the service provider"); + addThrows(async); + async.line("return consumer.async" + capitalise(patternCallOf(operation)) + "(" + + operationOf(service, operation) + ", adapter, " + arguments(model, sent) + ");"); + async.write(out); + + writeContinue(out, service, operation, adapterType); + } + + /** + * Registering says what to listen for; deregistering says to stop. + */ + private static void writePubSub(JavaSource out, Service service, Operation operation, + String adapterType) { + String name = operation.getName(); + String subscription = JavaNaming.MAL_STRUCTURES + "Subscription"; + String identifiers = JavaNaming.MAL_STRUCTURES + "IdentifierList"; + String adapterComment = + "adapter Listener in charge of receiving the messages from the service provider"; + + JavaMethodBuilder register = JavaMethodBuilder.named(name + "Register") + .comment("Register method for the " + name + " PubSub interaction") + .argument(subscription, "subscription", "subscription the subscription to register for") + .argument(adapterType, "adapter", adapterComment); + addThrows(register); + register.line("consumer.register(" + operationOf(service, operation) + + ", subscription, adapter);"); + register.write(out); + + JavaMethodBuilder asyncRegister = JavaMethodBuilder.named("async" + capitalise(name) + "Register") + .returns(MESSAGE, SENT) + .comment("Asynchronous version of method " + name + "Register") + .argument(subscription, "subscription", "subscription the subscription to register for") + .argument(adapterType, "adapter", adapterComment); + addThrows(asyncRegister); + asyncRegister.line("return consumer.asyncRegister(" + operationOf(service, operation) + + ", subscription, adapter);"); + asyncRegister.write(out); + + JavaMethodBuilder deregister = JavaMethodBuilder.named(name + "Deregister") + .comment("Deregister method for the " + name + " PubSub interaction") + .argument(identifiers, "identifierList", + "identifierList the subscription identifiers to deregister"); + addThrows(deregister); + deregister.line("consumer.deregister(" + operationOf(service, operation) + + ", identifierList);"); + deregister.write(out); + + JavaMethodBuilder asyncDeregister = JavaMethodBuilder.named("async" + capitalise(name) + "Deregister") + .returns(MESSAGE, SENT) + .comment("Asynchronous version of method " + name + "Deregister") + .argument(identifiers, "identifierList", + "identifierList the subscription identifiers to deregister") + .argument(adapterType, "adapter", adapterComment); + addThrows(asyncDeregister); + asyncDeregister.line("return consumer.asyncDeregister(" + operationOf(service, operation) + + ", identifierList, adapter);"); + asyncDeregister.write(out); + } + + /** + * Picks an interaction back up where it was left, which is how a consumer that was + * restarted carries on. + */ + private static void writeContinue(JavaSource out, Service service, Operation operation, + String adapterType) { + JavaMethodBuilder method = JavaMethodBuilder.named("continue" + capitalise(operation.getName())) + .comment("Continues a previously started interaction") + .argument(JavaNaming.MAL_STRUCTURES + "UOctet", "lastInteractionStage", + "lastInteractionStage The last stage of the interaction to continue") + .argument(JavaNaming.MAL_STRUCTURES + "Time", "initiationTimestamp", + "initiationTimestamp Timestamp of the interaction initiation message") + .argument("Long", "transactionId", + "transactionId Transaction identifier of the interaction to continue") + .argument(adapterType, "adapter", + "adapter Listener in charge of receiving the messages from the service provider"); + addThrows(method); + method.line("consumer.continueInteraction(" + operationOf(service, operation) + + ", lastInteractionStage, initiationTimestamp, transactionId, adapter);"); + method.write(out); + } + + /** + * Unpacks what came back. Each field is taken out of the body under its own name before + * it is answered with, so that the cast reads next to the type it is casting to. + */ + private static void addReturn(JavaMethodBuilder method, MOModel model, Service service, + Operation operation, List fields, String returnType) { + if (returnType == null || fields.isEmpty()) { + return; + } + List answers = new ArrayList(); + for (int i = 0; i < fields.size(); i++) { + Field field = fields.get(i); + if (JavaTypeName.isNativeAttribute(model, field.getType())) { + String union = JavaNaming.MAL_STRUCTURES + "Union"; + method.line("Object body" + i + " = (Object) body.getBodyElement(" + i + ", new " + + union + "(" + JavaTypes.nativeDefault(field.getType().getName()) + "));"); + answers.add("(body" + i + " == null) ? null : ((" + union + ") body" + i + ").get" + + field.getType().getName() + "Value()"); + } else { + method.line("Object body" + i + " = (Object) body.getBodyElement(" + i + ", " + + JavaTypeName.expectedTypeOf(model, field.getType()) + ");"); + answers.add("(" + JavaTypeName.of(model, field.getType()) + ") body" + i); + } + } + if (answers.size() == 1) { + method.line("return " + answers.get(0) + ";"); + return; + } + StringBuilder buf = new StringBuilder(); + for (int i = 0; i < answers.size(); i++) { + buf.append(i == 0 ? "" : ", ").append(answers.get(i)); + } + method.line("return new " + returnType + "(" + buf + ");"); + } + + + /** + * @return the type the stub answers with, or null when the operation answers with + * nothing. More than one field is answered with the class that holds them together. + */ + private static String returnTypeOf(MOModel model, Service service, Operation operation, + List fields, String messageType) { + if (fields.isEmpty()) { + return null; + } + if (fields.size() == 1) { + return JavaTypeName.of(model, fields.get(0).getType()); + } + return JavaNaming.packageOf(service, "body") + "." + + capitalise(operation.getName()) + messageType; + } + + private static void addArguments(JavaMethodBuilder method, MOModel model, List fields) { + for (int i = 0; i < fields.size(); i++) { + Field field = fields.get(i); + // A field the specification did not describe is documented by its place in the + // message, which is the only thing there is to say about it. + String comment = field.getComment() != null ? field.getComment() + : field.getName() + " Argument number " + i + + " as defined by the service operation"; + method.argument(JavaTypeName.of(model, field.getType()), field.getName(), comment); + } + } + + /** + * @return the arguments handed to the MAL, with a native attribute wrapped in the Union + * that carries it, or the literal null where there are none. + */ + private static String arguments(MOModel model, List fields) { + if (fields.isEmpty()) { + // Cast so that the empty case picks the varargs overload rather than reading as + // a single null array. + return "(Object[]) null"; + } + StringBuilder buf = new StringBuilder(); + for (int i = 0; i < fields.size(); i++) { + Field field = fields.get(i); + buf.append(i == 0 ? "" : ", "); + if (JavaTypeName.isNativeAttribute(model, field.getType())) { + buf.append("(").append(field.getName()).append(" == null) ? null : new ") + .append(JavaNaming.MAL_STRUCTURES).append("Union(") + .append(field.getName()).append(")"); + } else { + buf.append(field.getName()); + } + } + return buf.toString(); + } + + private static void addThrows(JavaMethodBuilder method) { + method.throwing(INTERACTION_EXCEPTION, INTERACTION_THROWN) + .throwing(MAL_EXCEPTION, EXCEPTION_THROWN); + } + + /** + * @return the fields the consumer sends to start the interaction. + */ + private static List requestBodyOf(Operation operation) { + switch (operation.getPattern()) { + case SEND: + return fieldsOf(operation.getMessage(InteractionStage.SEND)); + case SUBMIT: + return fieldsOf(operation.getMessage(InteractionStage.SUBMIT)); + case REQUEST: + return fieldsOf(operation.getMessage(InteractionStage.REQUEST)); + case INVOKE: + return fieldsOf(operation.getMessage(InteractionStage.INVOKE)); + case PROGRESS: + return fieldsOf(operation.getMessage(InteractionStage.PROGRESS)); + default: + return new ArrayList(); + } + } + + private static List fieldsOf(MessageBody body) { + return body == null ? new ArrayList() : body.getFields(); + } + + private static String operationOf(Service service, Operation operation) { + return JavaNaming.packageOf(service) + "." + service.getName() + "ServiceInfo." + + operation.getName().toUpperCase() + "_OP"; + } + + /** + * @return the name of the MAL consumer method that starts this kind of interaction. + */ + private static String patternCallOf(Operation operation) { + switch (operation.getPattern()) { + case SEND: + return "send"; + case SUBMIT: + return "submit"; + case REQUEST: + return "request"; + case INVOKE: + return "invoke"; + case PROGRESS: + return "progress"; + default: + return null; + } + } + + private static String capitalise(String text) { + return Character.toUpperCase(text.charAt(0)) + text.substring(1); + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/writers/ElementFactoryWriter.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/writers/ElementFactoryWriter.java new file mode 100644 index 00000000..11f0c147 --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/writers/ElementFactoryWriter.java @@ -0,0 +1,318 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.generators.java.writers; + +import esa.mo.apigen.generators.java.JavaClassBuilder; +import esa.mo.apigen.generators.java.JavaMethodBuilder; +import esa.mo.apigen.generators.java.JavaNaming; +import esa.mo.apigen.generators.java.JavaSource; +import esa.mo.apigen.generators.java.JavaTypes; +import esa.mo.apigen.generators.java.JumpTable; +import esa.mo.apigen.model.Area; +import esa.mo.apigen.model.Service; +import esa.mo.apigen.model.types.AttributeType; +import esa.mo.apigen.model.types.CompositeType; +import esa.mo.apigen.model.types.EnumerationType; +import esa.mo.apigen.model.types.TypeDefinition; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.TreeMap; + +/** + * Writes the factory that creates the Elements of an area. + *

                  + * A type is reached by its number: the type itself under its short form part, and its list + * under the negative of it. Nothing is held, so the class of a type is only loaded once a + * message carries that type. + *

                  + * The cases are laid out so that a lookup is a jump rather than a binary search, following + * the rules in {@link JumpTable}: the numbers close enough together to be spanned by one + * table are switched together, and the ones that lie past it are answered by a second + * method, so that they do not stretch the table over the gap in front of them. + */ +public final class ElementFactoryWriter { + + /** + * The Element the factory answers with, and the one argument every switch takes. + */ + private static final String ELEMENT = JavaNaming.MAL_STRUCTURES + "Element"; + + private static final String AREA_METHOD = "createAreaElement"; + + private ElementFactoryWriter() { + } + + /** + * @return the source of the area's element factory. + */ + public static String write(Area area) { + String name = area.getName(); + JavaClassBuilder clazz = JavaClassBuilder.named(name + "ElementFactory") + .inPackage(JavaNaming.packageOf(area)).asFinal() + .implementing(JavaNaming.MAL + "AreaElementFactory") + .comment("Creates the Elements of the " + name + " area, without holding an" + + " instance of each of them, so that the class of a type is only" + + " loaded once a message carries that type."); + JavaSource out = clazz.open(); + + // The types declared by the area itself answer to service number 0 + Map areaTypes = collectTypes(area, null); + JumpTable.Split areaSplit = JumpTable.splitTypes(areaTypes); + + // The types of each service, gathered up front: an Area whose services declare + // none of their own is reached without a switch over them. + Map> typesByService + = new LinkedHashMap>(); + boolean anyServiceHasTypes = false; + + for (Service service : area.getServices()) { + Map serviceTypes = collectTypes(area, service); + typesByService.put(service, serviceTypes); + anyServiceHasTypes = anyServiceHasTypes || !serviceTypes.isEmpty(); + } + + JavaMethodBuilder createElement = JavaMethodBuilder.named("createElement") + .asOverride() + .returns(ELEMENT, null) + .argument("int", "serviceNumber", null) + .argument("int", "typeNumber", null); + + if (anyServiceHasTypes) { + createElement.line("switch (serviceNumber) {"); + createElement.line(" case 0: return " + AREA_METHOD + "(typeNumber);"); + for (Service service : area.getServices()) { + createElement.line(" case " + service.getNumber() + ": return " + + methodNameOf(service) + "(typeNumber);"); + } + createElement.line(" default: return null;"); + createElement.line("}"); + } else { + // Every type of this Area is declared by the Area itself, so the types are + // answered here rather than through a switch over services that would only + // ever lead back to the one branch. + createElement.line("if (serviceNumber != 0) {"); + createElement.line(" return null; // This Area declares no types under a service"); + createElement.line("}"); + createElement.lines(switchBody(areaSplit.getInBand(), + areaSplit.isSplit() ? outOfBandNameOf(AREA_METHOD) : null)); + } + createElement.write(out); + + // The factory says which Area it belongs to, so that registering it cannot + // associate it with the wrong number or version. + JavaMethodBuilder.named("getAreaNumber").asOverride().returns("int", null) + .line("return " + area.getNumber() + ";").write(out); + JavaMethodBuilder.named("getAreaVersion").asOverride().returns("int", null) + .line("return " + area.getVersion() + ";").write(out); + + if (anyServiceHasTypes) { + writeTypeSwitch(out, AREA_METHOD, areaTypes, + "Creates an Element declared by the area itself."); + for (Map.Entry> entry : typesByService.entrySet()) { + writeTypeSwitch(out, methodNameOf(entry.getKey()), entry.getValue(), + "Creates an Element declared by the " + entry.getKey().getName() + + " service."); + } + } else if (areaSplit.isSplit()) { + // createElement() holds the jump table itself, so only the types that did not + // fit in it are left to write out + writeOutOfBandMethod(out, AREA_METHOD, areaSplit); + } + + return clazz.close(); + } + + /** + * Collects the types of an area or of one of its services, as the expression that + * creates one, by type number. The list of a type takes the negative of its number. + * + * @param area The area the types belong to. + * @param service The service, or null for the types of the area itself. + * @return the expressions, by type number. + */ + private static Map collectTypes(Area area, Service service) { + Map types = new TreeMap(); + String pkg = (service == null) + ? JavaNaming.packageOf(area, JavaNaming.STRUCTURES) + : JavaNaming.packageOf(service, JavaNaming.STRUCTURES); + List declared = (service == null) + ? area.getDataTypes() : service.getDataTypes(); + + for (TypeDefinition type : declared) { + Integer number = shortFormPartOf(type); + + if (number == null) { + continue; // Abstract, or a fundamental: it is never created + } + + String name = type.getName(); + String created; + + if (type instanceof AttributeType && JavaTypes.isNative(area.getName(), name)) { + // A native attribute is carried by a Union rather than by a class of its own + created = "new " + JavaNaming.MAL_STRUCTURES + "Union(" + + JavaTypes.nativeDefault(name) + ")"; + } else { + created = "new " + pkg + "." + JavaTypes.className(area.getName(), name) + "()"; + } + + types.put(number, created); + types.put(-number, "new " + pkg + "." + + JavaTypes.className(area.getName(), name + "List") + "()"); + } + + return types; + } + + /** + * Writes the method, or the pair of methods, that create the Element of a type number. + * The class of a type is named only inside its own branch, so it is loaded when a + * message first carries that type, and not before. + */ + private static void writeTypeSwitch(JavaSource out, String methodName, + Map types, String comment) { + JumpTable.Split split = JumpTable.splitTypes(types); + + // Splitting the types over two methods only pays off when there is a jump table to + // keep and something that would otherwise stretch it. + if (!split.isSplit()) { + writeSwitchMethod(out, methodName, comment, split.all(), null); + return; + } + + writeSwitchMethod(out, methodName, comment, split.getInBand(), outOfBandNameOf(methodName)); + writeOutOfBandMethod(out, methodName, split); + } + + /** + * Writes the method that answers for the types the jump table could not hold. + */ + private static void writeOutOfBandMethod(JavaSource out, String methodName, + JumpTable.Split split) { + writeSwitchMethod(out, outOfBandNameOf(methodName), + "Creates an Element whose type number lies too far out to be held in the" + + " jump table that is asked first. This says nothing about how often the" + + " type is asked for: the numbers of an Area are not handed out in the" + + " order of use.", split.getOutOfBand(), null); + } + + /** + * Writes one method holding a switch over type numbers. + * + * @param out The source to write the method to. + * @param methodName The name of the method. + * @param comment The comment of the method. + * @param types The types the switch answers for, by type number. + * @param fallback The method the switch falls back on for a type number it does not + * answer for, or null to answer with nothing. + */ + private static void writeSwitchMethod(JavaSource out, String methodName, String comment, + Map types, String fallback) { + JavaMethodBuilder.named(methodName).scope("private").asStatic() + .comment(comment) + .returns(ELEMENT, null) + .argument("int", "typeNumber", null) + .lines(switchBody(types, fallback)) + .write(out); + } + + /** + * Builds the body that answers a type number: one switch, or a switch for each side of + * zero where the numbers lie too far out to be held together. + * + * @param types The types the body answers for, by type number. + * @param fallback The method the body falls back on for a type number it does not + * answer for, or null to answer with nothing. + * @return the lines of the body, indented relative to it. + */ + private static List switchBody(Map types, String fallback) { + String missing = (fallback == null) ? "null" : fallback + "(typeNumber)"; + List lines = new ArrayList(); + + if (types.isEmpty()) { + lines.add("return " + missing + ";"); + return lines; + } + + if (JumpTable.shouldSplitOnSign(types.keySet())) { + Map positives = new TreeMap(); + Map negatives = new TreeMap(); + + for (Map.Entry entry : types.entrySet()) { + boolean positive = entry.getKey() > 0; + (positive ? positives : negatives).put(entry.getKey(), entry.getValue()); + } + + // These numbers lie far from zero, so the types and their lists are reached + // apart: together they would span the whole way across zero + lines.add("if (typeNumber > 0) {"); + addSwitchLines(lines, positives, missing, " "); + lines.add("}"); + addSwitchLines(lines, negatives, missing, ""); + return lines; + } + + addSwitchLines(lines, types, missing, ""); + return lines; + } + + /** + * Adds the lines of one switch over type numbers. + * + * @param lines The body being built. + * @param types The types the switch answers for, by type number. + * @param missing What the switch answers with for a type number it does not answer for. + * @param indent The step this switch takes past the body of the method. + */ + private static void addSwitchLines(List lines, Map types, + String missing, String indent) { + lines.add(indent + "switch (typeNumber) {"); + for (Map.Entry entry : types.entrySet()) { + lines.add(indent + " case " + entry.getKey() + ": return " + + entry.getValue() + ";"); + } + lines.add(indent + " default: return " + missing + ";"); + lines.add(indent + "}"); + } + + private static String methodNameOf(Service service) { + return "create" + service.getName() + "Element"; + } + + private static String outOfBandNameOf(String methodName) { + return methodName + "OutOfBand"; + } + + private static Integer shortFormPartOf(TypeDefinition type) { + if (type instanceof EnumerationType) { + return ((EnumerationType) type).getShortFormPart(); + } + if (type instanceof AttributeType) { + return ((AttributeType) type).getShortFormPart(); + } + if (type instanceof CompositeType) { + return ((CompositeType) type).getShortFormPart(); + } + return null; + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/writers/EnumerationWriter.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/writers/EnumerationWriter.java new file mode 100644 index 00000000..6bf7d271 --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/writers/EnumerationWriter.java @@ -0,0 +1,189 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.generators.java.writers; + +import esa.mo.apigen.generators.java.JavaClassBuilder; +import esa.mo.apigen.generators.java.JavaComment; +import esa.mo.apigen.generators.java.JavaFieldBuilder; +import esa.mo.apigen.generators.java.JavaMethodBuilder; +import esa.mo.apigen.generators.java.JavaNaming; +import esa.mo.apigen.generators.java.JavaSource; +import esa.mo.apigen.generators.java.ShortForm; +import esa.mo.apigen.model.Area; +import esa.mo.apigen.model.Service; +import esa.mo.apigen.model.types.EnumerationItem; +import esa.mo.apigen.model.types.EnumerationType; +import java.util.List; + +/** + * Writes the Java class for an enumeration. + */ +public final class EnumerationWriter { + + + private EnumerationWriter() { + } + + /** + * Renders the class. + * + * @param area The area defining the enumeration. + * @param service The service defining it, or null for an area-level type. + * @param type The enumeration. + * @return the source of the class. + */ + public static String write(Area area, Service service, EnumerationType type) { + String name = type.getName(); + String pkg = service == null + ? JavaNaming.packageOf(area, JavaNaming.STRUCTURES) + : JavaNaming.packageOf(service, JavaNaming.STRUCTURES); + String fq = pkg + "." + name; + long shortForm = ShortForm.of(area, service, type.getShortFormPart()); + List items = type.getItems(); + + JavaClassBuilder clazz = JavaClassBuilder.named(name).inPackage(pkg).asFinal() + .extending(JavaNaming.MAL + "structures.Enumeration") + .comment("Enumeration class for " + name + "."); + JavaSource out = clazz.open(); + ShortForm.writeIdentity(out, shortForm); + + for (EnumerationItem item : items) { + String value = item.getValue(); + JavaFieldBuilder.named(value + "_VALUE").asStatic().asFinal() + .ofType("int").value(String.valueOf(item.getNumericValue())) + .comment("Enumeration value for " + value + ".") + .write(out); + JavaFieldBuilder.named(value).asStatic().asFinal() + .ofType(fq).value("new " + fq + "(" + fq + "." + value + "_VALUE)") + .comment("Enumeration singleton for value " + value + ".") + .write(out); + } + + JavaFieldBuilder.named("_ENUMERATIONS").scope("private").asStatic().asFinal() + .ofType(fq + "[]").value(enumerationsOf(items)) + .comment("Set of enumeration instances.") + .write(out); + + // The no-argument constructor takes the comment verbatim - unwrapped, with no + // trailing period and no blank line under it - where every other method wraps it. + // The difference is in the existing generator and is reproduced here, which is why + // this one method is written out rather than built like the rest. + out.blank(); + out.line(" /**"); + out.line(" * " + type.getComment()); + out.line(" */"); + out.line(" public " + name + "() {"); + out.line(" super(-1);"); + out.line(" }"); + + String comment = type.getComment(); + if (comment == null || comment.isEmpty()) { + comment = "Creates an instance of the " + name + " Enumeration."; + } + JavaMethodBuilder.constructor(name).comment(comment) + .argument("int", "value", "The value of the Enumeration.") + .line("super(value);") + .write(out); + + JavaMethodBuilder toString = JavaMethodBuilder.named("toString").asOverride() + .returns("String", null); + toString.line("switch (getValue()) {"); + for (EnumerationItem item : items) { + toString.line(" case " + item.getValue() + "_VALUE:"); + toString.line(" return \"" + item.getValue() + "\";"); + } + toString.line(" default:"); + toString.line(" throw new RuntimeException(\"Unknown ordinal!\");"); + toString.line("}"); + toString.write(out); + + JavaMethodBuilder fromString = JavaMethodBuilder.named("fromString").asStatic() + .comment("Returns the enumeration element represented by the supplied string," + + " or null if not matched.") + .returns(fq, "The matched enumeration element, or null if not matched.") + .argument("String", "s", "s The string to search for."); + fromString.line("switch (s) {"); + for (EnumerationItem item : items) { + fromString.line(" case \"" + item.getValue() + "\":"); + fromString.line(" return " + name + "." + item.getValue() + ";"); + } + fromString.line(" default:"); + fromString.line(" throw new RuntimeException(\"Unknown Enumeration for the " + + "provided string: \" + s);"); + fromString.line("}"); + fromString.write(out); + + JavaMethodBuilder fromValue = JavaMethodBuilder.named("fromValue").asOverride() + .returns(JavaNaming.MAL_STRUCTURES + "Enumeration", null) + .argument("Integer", "value", null); + fromValue.line("switch (value) {"); + for (EnumerationItem item : items) { + fromValue.line(" case " + item.getValue() + "_VALUE:"); + fromValue.line(" return " + name + "." + item.getValue() + ";"); + } + fromValue.line(" default:"); + fromValue.line(" throw new RuntimeException(\"Unknown Enumeration for the " + + "provided value: \" + value);"); + fromValue.line("}"); + fromValue.write(out); + + JavaMethodBuilder.named("createElement").asOverride() + .returns(JavaNaming.MAL_STRUCTURES + "Element", null) + .line("return _ENUMERATIONS[0];") + .write(out); + + JavaMethodBuilder.named("getEnumSize").asOverride().returns("int", null) + .line("return " + items.size() + ";") + .write(out); + + JavaMethodBuilder.named("getTypeId").asOverride() + .returns(JavaNaming.MAL + "TypeId", null) + .line("return TYPE_ID;") + .write(out); + + return clazz.close(); + } + /** + * The instances are listed in one run that wraps at the same threshold as a comment, + * each line indented by eight spaces, and the array closes on the line of the last of + * them. + * + * @param items The items of the enumeration. + * @return the initialiser of the array of instances. + */ + private static String enumerationsOf(List items) { + StringBuilder values = new StringBuilder(); + for (int i = 0; i < items.size(); i++) { + values.append(i == 0 ? "" : ", ").append(items.get(i).getValue()); + } + + StringBuilder buf = new StringBuilder("{"); + List lines = JavaComment.wrap(values.toString()); + for (int i = 0; i < lines.size(); i++) { + buf.append("\n ").append(lines.get(i)); + if (i == lines.size() - 1) { + buf.append('}'); + } + } + return buf.toString(); + } + +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/writers/ExceptionWriter.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/writers/ExceptionWriter.java new file mode 100644 index 00000000..c9f72d06 --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/writers/ExceptionWriter.java @@ -0,0 +1,105 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.generators.java.writers; + +import esa.mo.apigen.generators.java.JavaClassBuilder; +import esa.mo.apigen.generators.java.JavaFieldBuilder; +import esa.mo.apigen.generators.java.JavaMethodBuilder; +import esa.mo.apigen.generators.java.JavaNaming; +import esa.mo.apigen.generators.java.JavaSource; +import esa.mo.apigen.model.Area; +import esa.mo.apigen.model.ErrorDefinition; + +/** + * Writes the Java exception class for an error an area declares. + *

                  + * Every error becomes an exception in the area's own package, whether the area or one of + * its services declared it. The name it was declared under is kept verbatim in the class, + * and the number is read from the area's helper, so an error renamed between MAL + * generations still says which name it was raised under. + */ +public final class ExceptionWriter { + + private ExceptionWriter() { + } + + /** + * @return the source of the exception class. + */ + public static String write(Area area, ErrorDefinition error) { + String className = classNameOf(error.getName()); + String pkg = JavaNaming.packageOf(area); + + JavaClassBuilder clazz = JavaClassBuilder.named(className).inPackage(pkg).asFinal() + .extending(JavaNaming.MAL + "MOErrorException") + .comment("The " + className + " exception." + + (error.getComment() == null || error.getComment().isEmpty() + ? "" : " " + error.getComment())); + JavaSource out = clazz.open(); + JavaFieldBuilder.named("MO_ERROR_NAME").scope("private").asStatic().asFinal() + .ofType("String").value("\"" + error.getName() + "\"") + .write(out); + + String number = area.getName() + "Helper." + constantOf(error.getName()) + "_ERROR_NUMBER"; + + JavaMethodBuilder.constructor(className) + .comment("Constructs a new " + className + " exception.") + .line("super(MO_ERROR_NAME, " + number + ", \"\");") + .write(out); + + JavaMethodBuilder.constructor(className) + .comment("Constructs a new " + className + " exception.") + .argument("Object", "extraInformation", "The extraInformation of the exception.") + .line("super(MO_ERROR_NAME, " + number + ", extraInformation);") + .write(out); + + return clazz.close(); + } + + /** + * Returns the class name for an error: the words of its name run together, however it + * was spelled. DUPLICATE and "Delivery Failed" give DuplicateException and + * DeliveryFailedException. + * + * @param errorName The declared name. + * @return the class name. + */ + public static String classNameOf(String errorName) { + StringBuilder buf = new StringBuilder(); + for (String word : errorName.split("[ _]")) { + if (!word.isEmpty()) { + buf.append(Character.toUpperCase(word.charAt(0))) + .append(word.substring(1).toLowerCase()); + } + } + return buf + "Exception"; + } + + /** + * Returns the name of the helper constant holding the error's number. + * + * @param errorName The declared name. + * @return the constant name, without the trailing _ERROR_NUMBER. + */ + public static String constantOf(String errorName) { + return errorName.replace(' ', '_').toUpperCase(); + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/writers/HelperWriter.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/writers/HelperWriter.java new file mode 100644 index 00000000..20113785 --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/writers/HelperWriter.java @@ -0,0 +1,157 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.generators.java.writers; + +import esa.mo.apigen.generators.java.JavaClassBuilder; +import esa.mo.apigen.generators.java.JavaFieldBuilder; +import esa.mo.apigen.generators.java.JavaMethodBuilder; +import esa.mo.apigen.generators.java.JavaNaming; +import esa.mo.apigen.generators.java.JavaSource; +import esa.mo.apigen.model.Area; +import esa.mo.apigen.model.ErrorDefinition; +import esa.mo.apigen.model.Service; +import java.util.ArrayList; +import java.util.List; + +/** + * Writes the helper classes: one for an area, holding its identity and the numbers of the + * errors it declares, and one for each service, holding the service singleton. + */ +public final class HelperWriter { + + private static final String STRUCTURES = JavaNaming.MAL_STRUCTURES; + + private HelperWriter() { + } + + /** + * @return the source of the area helper. + */ + public static String writeArea(Area area) { + String name = area.getName(); + String upper = name.toUpperCase(); + JavaClassBuilder clazz = JavaClassBuilder.named(name + "Helper") + .inPackage(JavaNaming.packageOf(area)) + .comment("Helper class for " + name + " area."); + JavaSource out = clazz.open(); + + constant("_" + upper + "_AREA_NUMBER", "int", String.valueOf(area.getNumber())) + .comment("Area number literal.").write(out); + constant(upper + "_AREA_NUMBER", STRUCTURES + "UShort", + "new " + STRUCTURES + "UShort(_" + upper + "_AREA_NUMBER)") + .comment("Area number instance.").write(out); + constant(upper + "_AREA_NAME", STRUCTURES + "Identifier", + "new " + STRUCTURES + "Identifier(\"" + name + "\")") + .comment("Area name constant.").write(out); + constant("_" + upper + "_AREA_VERSION", "short", String.valueOf(area.getVersion())) + .comment("Area version literal.").write(out); + constant(upper + "_AREA_VERSION", STRUCTURES + "UOctet", + "new " + STRUCTURES + "UOctet(_" + upper + "_AREA_VERSION)") + .comment("Area version instance.").write(out); + + // Always empty: the elements of an area are reached through its factory instead. + constant(upper + "_AREA_ELEMENTS", STRUCTURES + "Element[]", "{}") + .comment("Area Elements.").write(out); + + constant(upper + "_AREA_SERVICES", JavaNaming.MAL + "ServiceInfo[]", + servicesOf(area)).comment("Services in this Area.").write(out); + + constant(upper + "_AREA", JavaNaming.MAL + "MALArea", + "new " + JavaNaming.MAL + "MALArea(" + upper + "_AREA_NUMBER, " + upper + + "_AREA_NAME, " + upper + "_AREA_VERSION, " + upper + "_AREA_ELEMENTS, " + + upper + "_AREA_SERVICES, new " + name + "ElementFactory())") + .comment("Area singleton instance.").write(out); + + for (ErrorDefinition error : errorsOf(area)) { + String constant = ExceptionWriter.constantOf(error.getName()); + constant("_" + constant + "_ERROR_NUMBER", "long", String.valueOf(error.getNumber())) + .comment("Error literal for error " + constant + ".").write(out); + constant(constant + "_ERROR_NUMBER", STRUCTURES + "UInteger", + "new " + STRUCTURES + "UInteger(_" + constant + "_ERROR_NUMBER)") + .comment("Error instance for error " + constant + ".").write(out); + } + + JavaMethodBuilder.constructor(name + "Helper").scope("private") + .line("// Utility class; not meant to be instantiated.") + .write(out); + return clazz.close(); + } + + /** + * @param fieldName The name of the constant. + * @param type The type of the constant. + * @param value What it is initialised to. + * @return a public static final field, which is all a helper holds. + */ + private static JavaFieldBuilder constant(String fieldName, String type, String value) { + return JavaFieldBuilder.named(fieldName).asStatic().asFinal() + .ofType(type).value(value); + } + + /** + * The services are laid out one per line, and the array closes on the line of the last + * of them, after its trailing comma. + * + * @param area The area being written. + * @return the initialiser of the array of services. + */ + private static String servicesOf(Area area) { + if (area.getServices().isEmpty()) { + return "{}"; + } + StringBuilder buf = new StringBuilder("{"); + for (Service service : area.getServices()) { + buf.append("\n ").append(JavaNaming.packageOf(service)).append('.') + .append(service.getName()).append("Helper.") + .append(service.getName().toUpperCase()).append("_SERVICE,"); + } + return buf.append('}').toString(); + } + + /** + * @return the source of a service helper. + */ + public static String writeService(Service service) { + String name = service.getName(); + String pkg = JavaNaming.packageOf(service); + JavaClassBuilder clazz = JavaClassBuilder.named(name + "Helper").inPackage(pkg) + .comment("Helper class for " + name + " service."); + JavaSource out = clazz.open(); + constant(name.toUpperCase() + "_SERVICE", pkg + "." + name + "ServiceInfo", + "new " + pkg + "." + name + "ServiceInfo()") + .comment("Service singleton instance.").write(out); + JavaMethodBuilder.constructor(name + "Helper").scope("private") + .line("// Utility class; not meant to be instantiated.") + .write(out); + return clazz.close(); + } + + /** + * @return every error the area declares, its own and its services'. + */ + public static List errorsOf(Area area) { + List errors = new ArrayList(area.getErrors()); + for (Service service : area.getServices()) { + errors.addAll(service.getErrors()); + } + return errors; + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/writers/ListWriter.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/writers/ListWriter.java new file mode 100644 index 00000000..ee1da208 --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/writers/ListWriter.java @@ -0,0 +1,200 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.generators.java.writers; + +import esa.mo.apigen.generators.java.JavaClassBuilder; +import esa.mo.apigen.generators.java.JavaMethodBuilder; +import esa.mo.apigen.generators.java.JavaNaming; +import esa.mo.apigen.generators.java.JavaSource; +import esa.mo.apigen.generators.java.JavaTypes; +import esa.mo.apigen.generators.java.ShortForm; +import esa.mo.apigen.model.Area; +import esa.mo.apigen.model.Service; +import esa.mo.apigen.model.types.AttributeType; +import esa.mo.apigen.model.types.CompositeType; +import esa.mo.apigen.model.types.EnumerationType; +import esa.mo.apigen.model.types.TypeDefinition; + +/** + * Writes the list class that accompanies every concrete type. + *

                  + * A list's short form part is the negation of its element's, in three bytes - so a type + * with part 12 has a list with part {@code 0xFFFFFF - 11}. + */ +public final class ListWriter { + + + private ListWriter() { + } + + /** + * @return the source of the list class, or null if the type has no list. + */ + public static String write(Area area, Service service, TypeDefinition type) { + Integer shortFormPart = shortFormPartOf(type); + if (shortFormPart == null) { + return type instanceof CompositeType + ? writeHeterogeneous(area, service, type) : null; + } + String name = type.getName(); + String listName = name + "List"; + String pkg = service == null + ? JavaNaming.packageOf(area, JavaNaming.STRUCTURES) + : JavaNaming.packageOf(service, JavaNaming.STRUCTURES); + boolean isNative = JavaTypes.isNative(area.getName(), name); + // A native attribute type is a plain Java type: the list holds Boolean, not a + // generated class. + String element = isNative ? JavaTypes.nativeName(name) : pkg + "." + name; + String fq = pkg + "." + name; + long shortForm = ShortForm.of(area, service, 0xFFFFFFL & -shortFormPart.longValue()); + + JavaClassBuilder clazz = JavaClassBuilder.named(listName).inPackage(pkg).asFinal() + .extending("java.util.ArrayList<" + element + ">") + .implementing(JavaNaming.MAL_STRUCTURES + "HomogeneousList<" + element + ">") + .comment("List class for " + name + "."); + JavaSource out = clazz.open(); + ShortForm.writeIdentity(out, shortForm); + + JavaMethodBuilder.constructor(listName) + .comment("Default constructor for " + listName + ".") + .write(out); + + JavaMethodBuilder.constructor(listName) + .comment("Constructor that initialises the capacity of the list.") + .argument("int", "initialCapacity", "The required initial capacity.") + .line("super(initialCapacity);") + .write(out); + + JavaMethodBuilder.constructor(listName) + .comment("Constructor that uses an ArrayList for initialization.") + .argument("java.util.ArrayList<" + element + ">", "elementList", + "The ArrayList that is used for initialization.") + .line("for(" + element + " element : elementList) {") + .line(" this.add(element);") + .line("}") + .write(out); + + JavaMethodBuilder.named("add").asOverride().returns("boolean", null) + .argument(element, "element", null) + .line("if (element == null) {") + .line(" throw new IllegalArgumentException(\"The added argument cannot " + + "be null!\");") + .line("}") + .line("return super.add(element);") + .write(out); + + JavaMethodBuilder.named("createElement").asOverride() + .returns(JavaNaming.MAL_STRUCTURES + "Element", null) + .line("return new " + listName + "();") + .write(out); + + JavaMethodBuilder createTyped = JavaMethodBuilder.named("createTypedElement") + .asOverride() + .returns(JavaNaming.MAL_STRUCTURES + "Element", null); + if (isNative) { + // Nothing can be instantiated for a Java built-in, so the list hands back a + // Union carrying its own type id instead. + createTyped.line(JavaNaming.MAL + "TypeId typeId = this.getTypeId();"); + createTyped.line("return new Union(typeId.generateTypeIdPositive());"); + } else { + createTyped.line("return " + typedElement(type, fq) + ";"); + } + createTyped.write(out); + + JavaMethodBuilder.named("encode").asOverride() + .argument(JavaNaming.MAL + "MALEncoder", "encoder", null) + .throwing(JavaNaming.MAL + "MALException", null) + .line("encoder.encodeHomogeneousList(this);") + .write(out); + + JavaMethodBuilder.named("decode").asOverride() + .returns(JavaNaming.MAL_STRUCTURES + "Element", null) + .argument(JavaNaming.MAL + "MALDecoder", "decoder", null) + .throwing(JavaNaming.MAL + "MALException", null) + .line("decoder.decodeHomogeneousList(this);") + .line("return this;") + .write(out); + + JavaMethodBuilder.named("getTypeId").asOverride() + .returns(JavaNaming.MAL + "TypeId", null) + .line("return TYPE_ID;") + .write(out); + + return clazz.close(); + } + + /** + * An abstract composite has no short form and cannot be instantiated, so its list + * holds whatever extends it and checks the type on the way in. + */ + private static String writeHeterogeneous(Area area, Service service, TypeDefinition type) { + String name = type.getName(); + String listName = name + "List"; + String pkg = service == null + ? JavaNaming.packageOf(area, JavaNaming.STRUCTURES) + : JavaNaming.packageOf(service, JavaNaming.STRUCTURES); + + JavaClassBuilder clazz = JavaClassBuilder.named(listName).inPackage(pkg).asFinal() + .extending(JavaNaming.MAL + "structures.HeterogeneousList") + .comment("List class for " + name + "."); + JavaSource out = clazz.open(); + JavaMethodBuilder.constructor(listName) + .comment("Default constructor for " + listName + ".") + .write(out); + + JavaMethodBuilder.named("add").asOverride().returns("boolean", null) + .argument(JavaNaming.MAL_STRUCTURES + "Element", "element", null) + .line("if (element != null && !(element instanceof " + name + ")) {") + .line(" throw new java.lang.ClassCastException(\"The added element does " + + "not extend the type: " + name + "\");") + .line("}") + .line("return super.add(element);") + .write(out); + return clazz.close(); + } + + /** + * An enumeration has no no-argument value to hand back, so the list offers its first + * singleton instead. + */ + private static String typedElement(TypeDefinition type, String fq) { + if (type instanceof EnumerationType) { + EnumerationType enumeration = (EnumerationType) type; + if (!enumeration.getItems().isEmpty()) { + return fq + "." + enumeration.getItems().get(0).getValue(); + } + } + return "new " + fq + "()"; + } + + private static Integer shortFormPartOf(TypeDefinition type) { + if (type instanceof EnumerationType) { + return ((EnumerationType) type).getShortFormPart(); + } + if (type instanceof AttributeType) { + return ((AttributeType) type).getShortFormPart(); + } + if (type instanceof CompositeType) { + return ((CompositeType) type).getShortFormPart(); + } + return null; + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/writers/MultiReturnBodyWriter.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/writers/MultiReturnBodyWriter.java new file mode 100644 index 00000000..aaceade4 --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/writers/MultiReturnBodyWriter.java @@ -0,0 +1,143 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.generators.java.writers; + +import esa.mo.apigen.generators.java.JavaClassBuilder; +import esa.mo.apigen.generators.java.JavaFieldBuilder; +import esa.mo.apigen.generators.java.JavaMethodBuilder; +import esa.mo.apigen.generators.java.JavaNaming; +import esa.mo.apigen.generators.java.JavaSource; +import esa.mo.apigen.generators.java.JavaTypeName; +import esa.mo.apigen.model.Field; +import esa.mo.apigen.model.InteractionPattern; +import esa.mo.apigen.model.InteractionStage; +import esa.mo.apigen.model.MOModel; +import esa.mo.apigen.model.MessageBody; +import esa.mo.apigen.model.Operation; +import esa.mo.apigen.model.Service; +import java.util.ArrayList; +import java.util.List; + +/** + * Writes the class that holds the answer of an operation that answers with more than one + * field, since a Java method can only return one thing. + */ +public final class MultiReturnBodyWriter { + + /** + * The package the classes live in, which is neither the consumer's nor the provider's: + * both sides of the interaction name them. + */ + public static final String BODY = "body"; + + private MultiReturnBodyWriter() { + } + + /** + * @return the operations of a service that answer with more than one field, and so need + * a class to hold the answer. + */ + public static List operationsOf(Service service) { + List found = new ArrayList(); + for (Operation operation : service.getOperations()) { + if (operation.getPattern() == InteractionPattern.REQUEST + && fieldsOf(operation.getMessage(InteractionStage.RESPONSE)).size() > 1) { + found.add(operation); + } + } + return found; + } + + /** + * @return the name of the class that holds the answer of this operation. + */ + public static String classNameOf(Operation operation) { + String name = operation.getName(); + return Character.toUpperCase(name.charAt(0)) + name.substring(1) + "Response"; + } + + /** + * @return the source of the class holding the answer. + */ + public static String write(MOModel model, Service service, Operation operation) { + String className = classNameOf(operation); + List fields = fieldsOf(operation.getMessage(InteractionStage.RESPONSE)); + + JavaClassBuilder clazz = JavaClassBuilder.named(className).asFinal() + .inPackage(JavaNaming.packageOf(service, BODY)) + .comment("Multi body return class for " + className + "."); + JavaSource out = clazz.open(); + + for (int i = 0; i < fields.size(); i++) { + Field field = fields.get(i); + // The field is documented by its name and then by what it holds, because a + // reader of this class has only the names to go by. + JavaFieldBuilder.named(field.getName()).scope("private") + .ofType(JavaTypeName.of(model, field.getType())) + .comment(field.getName() + ": " + describe(field, i)) + .write(out); + } + + JavaMethodBuilder.constructor(className) + .comment("Default constructor for " + className + ".") + .write(out); + + JavaMethodBuilder constructor = JavaMethodBuilder.constructor(className) + .comment("Constructs an instance of this type using provided values."); + for (int i = 0; i < fields.size(); i++) { + Field field = fields.get(i); + constructor.argument(JavaTypeName.of(model, field.getType()), field.getName(), + describe(field, i)); + } + for (Field field : fields) { + constructor.line("this." + field.getName() + " = " + field.getName() + ";"); + } + constructor.write(out); + + for (Field field : fields) { + JavaMethodBuilder.named("get" + capitalise(field.getName())) + .comment("Returns the field " + field.getName() + ".") + .returns(JavaTypeName.of(model, field.getType()), + "The field " + field.getName()) + .line("return " + field.getName() + ";") + .write(out); + } + + return clazz.close(); + } + + /** + * @return what the field holds, or its place in the message where nothing was said. + */ + private static String describe(Field field, int index) { + return field.getComment() != null ? field.getComment() + : field.getName() + " Argument number " + index + + " as defined by the service operation"; + } + + private static List fieldsOf(MessageBody body) { + return body == null ? new ArrayList() : body.getFields(); + } + + private static String capitalise(String text) { + return Character.toUpperCase(text.charAt(0)) + text.substring(1); + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/writers/ProviderHandlerWriter.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/writers/ProviderHandlerWriter.java new file mode 100644 index 00000000..e5024acc --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/writers/ProviderHandlerWriter.java @@ -0,0 +1,194 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.generators.java.writers; + +import esa.mo.apigen.generators.java.JavaClassBuilder; +import esa.mo.apigen.generators.java.JavaMethodBuilder; +import esa.mo.apigen.generators.java.JavaNaming; +import esa.mo.apigen.generators.java.JavaSource; +import esa.mo.apigen.generators.java.JavaTypeName; +import esa.mo.apigen.model.ErrorDefinition; +import esa.mo.apigen.model.ErrorReference; +import esa.mo.apigen.model.Field; +import esa.mo.apigen.model.InteractionStage; +import esa.mo.apigen.model.MOModel; +import esa.mo.apigen.model.MessageBody; +import esa.mo.apigen.model.Operation; +import esa.mo.apigen.model.Service; +import java.util.ArrayList; +import java.util.List; + +/** + * Writes the handler interface of a service: the one method a provider has to implement per + * operation, and nothing else. + *

                  + * The errors an operation declares are on the throws clause, so a provider raises them + * directly and the layer above wraps them into an interaction exception. + */ +public final class ProviderHandlerWriter { + + private static final String INTERACTION_EXCEPTION = JavaNaming.MAL + "MALInteractionException"; + + private static final String MAL_EXCEPTION = JavaNaming.MAL + "MALException"; + + private static final String INTERACTION_COMMENT = + "The MAL object representing the interaction in the provider."; + + private ProviderHandlerWriter() { + } + + /** + * @return the source of the service's handler interface. + */ + public static String write(MOModel model, Service service) { + String name = service.getName(); + JavaClassBuilder clazz = JavaClassBuilder.named(name + "Handler").asInterface() + .inPackage(JavaNaming.packageOf(service, JavaNaming.PROVIDER)) + .comment("Interface that providers of the " + name + " service must implement" + + " to handle the operations of that service."); + JavaSource out = clazz.open(); + + for (Operation operation : service.getOperations()) { + if (operation.getPattern() == esa.mo.apigen.model.InteractionPattern.PUBSUB) { + continue; // A provider publishes rather than answers, so there is nothing to implement + } + writeOperation(out, model, service, operation); + } + + JavaMethodBuilder.named("setSkeleton").asDeclaration() + .comment("Sets the skeleton to be used for creation of publishers.") + .argument(JavaNaming.packageOf(service, JavaNaming.PROVIDER) + "." + name + + "Skeleton", "skeleton", "The skeleton to be used.") + .write(out); + + return clazz.close(); + } + + /** + * One operation, taking what the consumer sent and, where the interaction reports back + * over time, the object the provider reports through. + */ + private static void writeOperation(JavaSource out, MOModel model, Service service, + Operation operation) { + JavaMethodBuilder method = JavaMethodBuilder.named(operation.getName()).asDeclaration() + .comment("Implements the operation " + operation.getName()); + + List sent = fieldsOf(operation.getMessage(requestStageOf(operation))); + for (int i = 0; i < sent.size(); i++) { + Field field = sent.get(i); + String comment = field.getComment() != null ? field.getComment() + : field.getName() + " Argument number " + i + + " as defined by the service operation"; + method.argument(JavaTypeName.of(model, field.getType()), field.getName(), comment); + } + + if (operation.getPattern() == esa.mo.apigen.model.InteractionPattern.REQUEST) { + List answered = fieldsOf(operation.getMessage(InteractionStage.RESPONSE)); + String returnType = returnTypeOf(model, service, operation, answered); + if (returnType != null) { + method.returns(returnType, "The return value of the operation"); + } + } + + method.argument(interactionTypeOf(service, operation), "interaction", INTERACTION_COMMENT); + addErrors(method, model, operation); + method.throwing(INTERACTION_EXCEPTION, + "if there is a problem during the interaction as defined by the MAL specification.") + .throwing(MAL_EXCEPTION, "if there is an implementation exception") + .write(out); + } + + /** + * The errors of the operation, each with the description that says when it is raised. + * A reference rarely carries its own, so the definition it names answers for it. + */ + private static void addErrors(JavaMethodBuilder method, MOModel model, Operation operation) { + for (ErrorReference reference : operation.getErrors()) { + String comment = reference.getComment(); + if (comment == null || comment.isEmpty()) { + ErrorDefinition definition = model.resolveError(reference.getError()); + comment = definition != null && definition.getComment() != null + && !definition.getComment().isEmpty() + ? definition.getComment() : "if the corresponding MO error occurs"; + } + method.throwing(JavaNaming.ROOT + reference.getError().getArea().toLowerCase() + "." + + ExceptionWriter.classNameOf(reference.getError().getName()), comment); + } + } + + /** + * @return the type of the interaction object: the plain one where the provider answers + * in one go, and the operation's own where it reports back over time. + */ + private static String interactionTypeOf(Service service, Operation operation) { + switch (operation.getPattern()) { + case INVOKE: + case PROGRESS: + return JavaNaming.packageOf(service, JavaNaming.PROVIDER) + "." + + capitalise(operation.getName()) + "Interaction"; + default: + return JavaNaming.MAL + "provider.MALInteraction"; + } + } + + /** + * @return the type the provider answers with, or null when it answers with nothing. + */ + private static String returnTypeOf(MOModel model, Service service, Operation operation, + List fields) { + if (fields.isEmpty()) { + return null; + } + if (fields.size() == 1) { + return JavaTypeName.of(model, fields.get(0).getType()); + } + return JavaNaming.packageOf(service, "body") + "." + + capitalise(operation.getName()) + "Response"; + } + + /** + * @return the stage that carries what the consumer sent to start the interaction. + */ + private static InteractionStage requestStageOf(Operation operation) { + switch (operation.getPattern()) { + case SEND: + return InteractionStage.SEND; + case SUBMIT: + return InteractionStage.SUBMIT; + case REQUEST: + return InteractionStage.REQUEST; + case INVOKE: + return InteractionStage.INVOKE; + case PROGRESS: + return InteractionStage.PROGRESS; + default: + return null; + } + } + + private static List fieldsOf(MessageBody body) { + return body == null ? new ArrayList() : body.getFields(); + } + + private static String capitalise(String text) { + return Character.toUpperCase(text.charAt(0)) + text.substring(1); + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/writers/ProviderInheritanceSkeletonWriter.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/writers/ProviderInheritanceSkeletonWriter.java new file mode 100644 index 00000000..63f56eed --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/writers/ProviderInheritanceSkeletonWriter.java @@ -0,0 +1,373 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.generators.java.writers; + +import esa.mo.apigen.generators.java.JavaClassBuilder; +import esa.mo.apigen.generators.java.JavaFieldBuilder; +import esa.mo.apigen.generators.java.JavaMethodBuilder; +import esa.mo.apigen.generators.java.JavaNaming; +import esa.mo.apigen.generators.java.JavaSource; +import esa.mo.apigen.generators.java.JavaTypeName; +import esa.mo.apigen.generators.java.JavaTypes; +import esa.mo.apigen.model.Field; +import esa.mo.apigen.model.InteractionPattern; +import esa.mo.apigen.model.InteractionStage; +import esa.mo.apigen.model.MOModel; +import esa.mo.apigen.model.MessageBody; +import esa.mo.apigen.model.Operation; +import esa.mo.apigen.model.Service; +import java.util.ArrayList; +import java.util.List; + +/** + * Writes the inheritance skeleton of a service: the class a provider extends, which turns + * an incoming message into a call on the handler method that answers for it. + *

                  + * One dispatch method per interaction pattern, each switching on the operation number. An + * operation that declares errors of its own is wrapped in a try, so that a provider can + * raise them directly and have them arrive at the consumer as an interaction exception. + */ +public final class ProviderInheritanceSkeletonWriter { + + private static final String MAL_EXCEPTION = JavaNaming.MAL + "MALException"; + + private static final String INTERACTION_EXCEPTION = JavaNaming.MAL + "MALInteractionException"; + + private static final String BODY = JavaNaming.MAL + "transport.MALMessageBody"; + + private static final String HANDLE_COMMENT = + "Called by the provider MAL layer on reception of a message to handle the interaction"; + + /** + * The message of the error raised for an operation number the service does not have. + */ + private static final String UNSUPPORTED = JavaNaming.MAL + + "provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber"; + + /** + * The step the arguments of a dispatched call take past the line they start on. + */ + private static final String ARGUMENT = ",\n "; + + private ProviderInheritanceSkeletonWriter() { + } + + /** + * @return the source of the service's inheritance skeleton. + */ + public static String write(MOModel model, Service service) { + String name = service.getName(); + String className = name + "InheritanceSkeleton"; + String provider = JavaNaming.packageOf(service, JavaNaming.PROVIDER); + + JavaClassBuilder clazz = JavaClassBuilder.named(className).asAbstract() + .inPackage(provider) + .implementing(JavaNaming.MAL + "provider.MALInteractionHandler") + .implementing(provider + "." + name + "Skeleton") + .implementing(provider + "." + name + "Handler") + .comment("Provider Inheritance skeleton for " + className + " service."); + JavaSource out = clazz.open(); + + JavaFieldBuilder.named("providerSet").scope("private") + .ofType(JavaNaming.MAL + "provider.MALProviderSet") + .value("new " + JavaNaming.MAL + "provider.MALProviderSet(" + + JavaNaming.packageOf(service) + "." + name + "Helper." + + name.toUpperCase() + "_SERVICE)") + .comment("The providerSet field.").write(out); + + JavaMethodBuilder.named("getConnection") + .returns(JavaNaming.MAL + "helpertools.connections.ConnectionProvider", + "the connection object for this provider") + .comment("Returns the connection object for this provider.") + .throwing("java.io.IOException", "if the method was not implemented yet.") + .line("throw new java.io.IOException(\"This method needs to be overridden!\");") + .write(out); + + JavaMethodBuilder.named("setSkeleton").asOverride() + .argument(provider + "." + name + "Skeleton", "skeleton", "The skeleton (not used)") + .line("// Not used in the inheritance pattern (the skeleton is 'this');") + .write(out); + + JavaMethodBuilder.named("malInitialize").asOverride() + .argument(JavaNaming.MAL + "provider.MALProvider", "provider", "The provider to be added.") + .throwing(MAL_EXCEPTION, "If an error is detected.") + .line("providerSet.addProvider(provider);") + .write(out); + + JavaMethodBuilder.named("malFinalize").asOverride() + .argument(JavaNaming.MAL + "provider.MALProvider", "provider", "The provider to be added.") + .throwing(MAL_EXCEPTION, "If an error is detected.") + .line("providerSet.removeProvider(provider);") + .write(out); + + for (Operation operation : service.getOperations()) { + if (operation.getPattern() == InteractionPattern.PUBSUB) { + writeCreatePublisher(out, service, operation); + } + } + + handle(out, model, service, InteractionPattern.SEND, "handleSend", + JavaNaming.MAL + "provider.MALInteraction", "The interaction object", false); + handle(out, model, service, InteractionPattern.SUBMIT, "handleSubmit", + JavaNaming.MAL + "provider.MALSubmit", "The interaction object", true); + handle(out, model, service, InteractionPattern.REQUEST, "handleRequest", + JavaNaming.MAL + "provider.MALRequest", "The interaction object", true); + handle(out, model, service, InteractionPattern.INVOKE, "handleInvoke", + JavaNaming.MAL + "provider.MALInvoke", "The interaction object", true); + handle(out, model, service, InteractionPattern.PROGRESS, "handleProgress", + JavaNaming.MAL + "provider.MALProgress", "The interaction object", true); + + return clazz.close(); + } + + /** + * How a provider reaches the publisher of one of its publish-subscribe operations. + */ + private static void writeCreatePublisher(JavaSource out, Service service, Operation operation) { + String publisher = JavaNaming.packageOf(service, JavaNaming.PROVIDER) + "." + + ProviderPublisherWriter.classNameOf(operation); + JavaMethodBuilder.named("create" + capitalise(operation.getName()) + "Publisher") + .asOverride().returns(publisher, "The new publisher object.") + .comment("Creates a publisher object using the current registered provider set" + + " for the PubSub operation " + operation.getName()) + .argument(JavaNaming.MAL_STRUCTURES + "IdentifierList", "domain", + "The domain used for publishing") + .argument(JavaNaming.MAL_STRUCTURES + "Identifier", "networkZone", + "The network zone used for publishing") + .argument(JavaNaming.MAL_STRUCTURES + "SessionType", "sessionType", + "The session used for publishing") + .argument(JavaNaming.MAL_STRUCTURES + "Identifier", "sessionName", + "The session name used for publishing") + .argument(JavaNaming.MAL_STRUCTURES + "QoSLevel", "qos", + "The QoS used for publishing") + .argument("java.util.Map", "qosProps", "The QoS properties used for publishing") + .argument(JavaNaming.MAL_STRUCTURES + "UInteger", "priority", + "The priority used for publishing") + .throwing(MAL_EXCEPTION, "if a problem is detected during creation of the publisher") + .line("return new " + publisher + "(providerSet.createPublisherSet(" + + JavaNaming.packageOf(service) + "." + service.getName() + "ServiceInfo." + + operation.getName().toUpperCase() + + "_OP, domain, sessionType, sessionName, qos, qosProps, null));") + .write(out); + } + + /** + * One dispatch method: it reads the operation number off the interaction and calls the + * handler method of that operation, unpacking the body as it goes. + * + * @param answers True where the interaction can be told about an operation it does not + * have. A send has nobody to tell. + */ + private static void handle(JavaSource out, MOModel model, Service service, + InteractionPattern pattern, String name, String interactionType, + String interactionComment, boolean answers) { + JavaMethodBuilder method = JavaMethodBuilder.named(name).asOverride() + .comment(HANDLE_COMMENT) + .argument(interactionType, "interaction", interactionComment) + .argument(BODY, "body", "The message body") + .throwing(MAL_EXCEPTION, "if there is a internal error") + .throwing(INTERACTION_EXCEPTION, "if there is a operation interaction error"); + + // An operation that declares errors of its own is wrapped, so that the provider can + // raise them directly rather than wrapping each one itself. + boolean wrapErrors = declaresErrors(service, pattern); + + method.line("int opNumber = interaction.getOperation().getNumber().getValue();"); + if (wrapErrors) { + method.line("try {"); + } + method.line("switch (opNumber) {"); + + for (Operation operation : service.getOperations()) { + if (operation.getPattern() != pattern) { + continue; + } + method.line(" case " + JavaNaming.packageOf(service) + "." + service.getName() + + "ServiceInfo._" + operation.getName().toUpperCase() + "_OP_NUMBER:"); + writeCase(method, model, service, operation); + method.line(" break;"); + } + + method.line(" default:"); + if (answers) { + method.line(" interaction.sendError(new " + JavaNaming.MAL + + "UnsupportedOperationException(\n " + UNSUPPORTED + "));"); + } + method.line(" throw new " + INTERACTION_EXCEPTION + "(new " + JavaNaming.MAL + + "UnsupportedOperationException(\n " + UNSUPPORTED + "));"); + method.line("}"); + if (wrapErrors) { + method.line("} catch (" + JavaNaming.MAL + "MOErrorException error) {"); + method.line(" throw new " + INTERACTION_EXCEPTION + "(error);"); + method.line("}"); + } + method.write(out); + } + + /** + * The body of one case: the call on the handler, and whatever has to happen around it + * for the interaction to be answered. + */ + private static void writeCase(JavaMethodBuilder method, MOModel model, Service service, + Operation operation) { + String arguments = unpacked(model, fieldsOf(operation.getMessage(requestStageOf(operation)))); + + switch (operation.getPattern()) { + case SEND: + method.line(" " + operation.getName() + "(" + arguments + "interaction);"); + break; + case SUBMIT: + method.line(" " + operation.getName() + "(" + arguments + "interaction);"); + method.line(" interaction.sendAcknowledgement();"); + break; + case REQUEST: + writeRequestCase(method, model, service, operation, arguments); + break; + case INVOKE: + case PROGRESS: + method.line(" " + operation.getName() + "(" + arguments + "new " + + ProviderInteractionWriter.classNameOf(operation) + "(interaction));"); + break; + default: + break; + } + } + + /** + * A request is answered on the spot, so what the handler returns is taken apart and + * handed straight back. + */ + private static void writeRequestCase(JavaMethodBuilder method, MOModel model, Service service, + Operation operation, String arguments) { + List answered = fieldsOf(operation.getMessage(InteractionStage.RESPONSE)); + String call = operation.getName() + "(" + arguments + "interaction)"; + + if (answered.isEmpty()) { + method.line(" " + call + ";"); + method.line(" interaction.sendResponse();"); + return; + } + + if (answered.size() == 1) { + Field field = answered.get(0); + if (JavaTypeName.isNativeAttribute(model, field.getType())) { + // A native attribute has to be wrapped before it can be sent, so it is named + // first rather than wrapped inside the call. + String variable = operation.getName() + "Rt"; + method.line(" " + JavaTypeName.of(model, field.getType()) + " " + variable + + " = " + call + ";"); + method.line(" interaction.sendResponse((" + variable + " == null) ? null : new " + + JavaNaming.MAL_STRUCTURES + "Union(" + variable + "));"); + } else { + method.line(" interaction.sendResponse(" + call + ");"); + } + return; + } + + String variable = operation.getName() + "Rt"; + String returnType = JavaNaming.packageOf(service, "body") + "." + + capitalise(operation.getName()) + "Response"; + method.line(" " + returnType + " " + variable + " = " + call + ";"); + StringBuilder buf = new StringBuilder("\n "); + for (int i = 0; i < answered.size(); i++) { + Field field = answered.get(i); + String getter = variable + ".get" + capitalise(field.getName()) + "()"; + if (i > 0) { + buf.append(",\n "); + } + if (JavaTypeName.isNativeAttribute(model, field.getType())) { + buf.append("(").append(getter).append(" == null) ? null : new ") + .append(JavaNaming.MAL_STRUCTURES).append("Union(").append(getter).append(")"); + } else { + buf.append(getter); + } + } + method.line(" interaction.sendResponse(" + buf); + method.line(" );"); + } + + /** + * @return the fields taken out of the body, each on its own line, and each followed by + * the comma that separates it from the interaction that comes last. + */ + private static String unpacked(MOModel model, List fields) { + StringBuilder buf = new StringBuilder(); + for (int i = 0; i < fields.size(); i++) { + Field field = fields.get(i); + if (i != 0) { + buf.append(ARGUMENT); + } + if (JavaTypeName.isNativeAttribute(model, field.getType())) { + String union = JavaNaming.MAL_STRUCTURES + "Union"; + String element = "body.getBodyElement(" + i + ", new " + union + "(" + + JavaTypes.nativeDefault(field.getType().getName()) + "))"; + buf.append("(").append(element).append(" == null) ? null : ((").append(union) + .append(") ").append(element).append(").get") + .append(field.getType().getName()).append("Value()"); + } else { + buf.append("(").append(JavaTypeName.of(model, field.getType())) + .append(") body.getBodyElement(").append(i).append(", ") + .append(JavaTypeName.expectedTypeOf(model, field.getType())).append(")"); + } + } + return fields.isEmpty() ? "" : buf.append(ARGUMENT).toString(); + } + + /** + * @return true if any operation of this pattern declares an error of its own. + */ + private static boolean declaresErrors(Service service, InteractionPattern pattern) { + for (Operation operation : service.getOperations()) { + if (operation.getPattern() == pattern && !operation.getErrors().isEmpty()) { + return true; + } + } + return false; + } + + /** + * @return the stage that carries what the consumer sent to start the interaction. + */ + private static InteractionStage requestStageOf(Operation operation) { + switch (operation.getPattern()) { + case SEND: + return InteractionStage.SEND; + case SUBMIT: + return InteractionStage.SUBMIT; + case REQUEST: + return InteractionStage.REQUEST; + case INVOKE: + return InteractionStage.INVOKE; + case PROGRESS: + return InteractionStage.PROGRESS; + default: + return null; + } + } + + private static List fieldsOf(MessageBody body) { + return body == null ? new ArrayList() : body.getFields(); + } + + private static String capitalise(String text) { + return Character.toUpperCase(text.charAt(0)) + text.substring(1); + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/writers/ProviderInteractionWriter.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/writers/ProviderInteractionWriter.java new file mode 100644 index 00000000..a2c3b6b3 --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/writers/ProviderInteractionWriter.java @@ -0,0 +1,192 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.generators.java.writers; + +import esa.mo.apigen.generators.java.JavaClassBuilder; +import esa.mo.apigen.generators.java.JavaFieldBuilder; +import esa.mo.apigen.generators.java.JavaMethodBuilder; +import esa.mo.apigen.generators.java.JavaNaming; +import esa.mo.apigen.generators.java.JavaSource; +import esa.mo.apigen.generators.java.JavaTypeName; +import esa.mo.apigen.model.Field; +import esa.mo.apigen.model.InteractionPattern; +import esa.mo.apigen.model.InteractionStage; +import esa.mo.apigen.model.MOModel; +import esa.mo.apigen.model.MessageBody; +import esa.mo.apigen.model.Operation; +import esa.mo.apigen.model.Service; +import java.util.ArrayList; +import java.util.List; + +/** + * Writes the interaction class of an operation that reports back over time. + *

                  + * A provider handling an invoke or a progress is handed one of these instead of the plain + * MAL interaction, so that the messages it can send back are named and typed: it sends an + * acknowledgement, then updates, then a response, and the fields of each are the ones the + * operation declared. + */ +public final class ProviderInteractionWriter { + + private static final String MESSAGE = JavaNaming.MAL + "transport.MALMessage"; + + private static final String INTERACTION_EXCEPTION = JavaNaming.MAL + "MALInteractionException"; + + private static final String MAL_EXCEPTION = JavaNaming.MAL + "MALException"; + + private static final String INTERACTION_THROWN = + "if there is a problem during the interaction as defined by the MAL specification."; + + private static final String EXCEPTION_THROWN = "if there is an implementation exception"; + + private ProviderInteractionWriter() { + } + + /** + * @return the name of the class, which is the operation's with the kind appended. + */ + public static String classNameOf(Operation operation) { + String name = operation.getName(); + return Character.toUpperCase(name.charAt(0)) + name.substring(1) + "Interaction"; + } + + /** + * @return the source of the operation's interaction class. + */ + public static String write(MOModel model, Service service, Operation operation) { + boolean isProgress = operation.getPattern() == InteractionPattern.PROGRESS; + String pattern = isProgress ? "PROGRESS" : "INVOKE"; + String malType = JavaNaming.MAL + "provider." + (isProgress ? "MALProgress" : "MALInvoke"); + String className = classNameOf(operation); + + JavaClassBuilder clazz = JavaClassBuilder.named(className) + .inPackage(JavaNaming.packageOf(service, JavaNaming.PROVIDER)) + .comment("Provider " + pattern + " interaction class for " + service.getName() + + "::" + operation.getName() + " operation."); + JavaSource out = clazz.open(); + + JavaFieldBuilder.named("interaction").scope("private").ofType(malType) + .comment("The interaction field.").write(out); + + JavaMethodBuilder.constructor(className) + .comment("Wraps the provided MAL interaction object with methods for sending" + + " responses to an " + pattern + " interaction from a provider.") + .argument(malType, "interaction", "The MAL interaction action object to use.") + .line("this.interaction = interaction;") + .write(out); + + JavaMethodBuilder.named("getInteraction") + .returns(malType, "The MAL interaction object provided in the constructor") + .comment("Returns the MAL interaction object used for returning messages from" + + " the provider.") + .line("return interaction;") + .write(out); + + send(out, model, operation, "sendAcknowledgement", InteractionStage.ACK, + "Sends a " + pattern + " acknowledge to the consumer", + "Returns the MAL message created by the acknowledge"); + if (isProgress) { + send(out, model, operation, "sendUpdate", InteractionStage.UPDATE, + "Sends a " + pattern + " update to the consumer", + "Returns the MAL message created by the update"); + } + send(out, model, operation, "sendResponse", InteractionStage.RESPONSE, + "Sends a " + pattern + " response to the consumer", + "Returns the MAL message created by the response"); + + // The invoke class describes the error it is handed, the progress class repeats the + // name in front of it. The difference is in the existing generator and is kept. + String errorComment = isProgress ? "error The MAL error to send to the consumer." + : "The MAL error to send to the consumer."; + sendError(out, "sendError", "Sends an error to the consumer", errorComment); + if (isProgress) { + sendError(out, "sendUpdateError", "Sends an update error to the consumer", + errorComment); + } + + return clazz.close(); + } + + /** + * One of the messages a provider can send back, carrying the fields of that stage. + */ + private static void send(JavaSource out, MOModel model, Operation operation, String name, + InteractionStage stage, String comment, String returnComment) { + List fields = fieldsOf(operation.getMessage(stage)); + JavaMethodBuilder method = JavaMethodBuilder.named(name) + .returns(MESSAGE, returnComment).comment(comment); + + for (int i = 0; i < fields.size(); i++) { + Field field = fields.get(i); + String fieldComment = field.getComment() != null ? field.getComment() + : field.getName() + " Argument number " + i + + " as defined by the service operation"; + method.argument(JavaTypeName.of(model, field.getType()), field.getName(), fieldComment); + } + + method.throwing(INTERACTION_EXCEPTION, INTERACTION_THROWN) + .throwing(MAL_EXCEPTION, EXCEPTION_THROWN) + .line("return interaction." + name + "(" + arguments(model, fields) + ");") + .write(out); + } + + /** + * The error a provider sends when it cannot go on. + */ + private static void sendError(JavaSource out, String name, String comment, + String errorComment) { + JavaMethodBuilder.named(name) + .returns(MESSAGE, "Returns the MAL message created by the error") + .comment(comment) + .argument(JavaNaming.MAL + "MOErrorException", "error", errorComment) + .throwing(INTERACTION_EXCEPTION, INTERACTION_THROWN) + .throwing(MAL_EXCEPTION, EXCEPTION_THROWN) + .line("return interaction." + name + "(error);") + .write(out); + } + + /** + * @return the arguments handed to the MAL, with a native attribute wrapped in the Union + * that carries it, or a cast null where there are none. + */ + private static String arguments(MOModel model, List fields) { + if (fields.isEmpty()) { + return "(Object[]) null"; + } + StringBuilder buf = new StringBuilder(); + for (int i = 0; i < fields.size(); i++) { + Field field = fields.get(i); + buf.append(i == 0 ? "" : ", "); + if (JavaTypeName.isNativeAttribute(model, field.getType())) { + buf.append("(").append(field.getName()).append(" == null) ? null : new ") + .append(JavaNaming.MAL_STRUCTURES).append("Union(") + .append(field.getName()).append(")"); + } else { + buf.append(field.getName()); + } + } + return buf.toString(); + } + + private static List fieldsOf(MessageBody body) { + return body == null ? new ArrayList() : body.getFields(); + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/writers/ProviderPublisherWriter.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/writers/ProviderPublisherWriter.java new file mode 100644 index 00000000..d4f7779e --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/writers/ProviderPublisherWriter.java @@ -0,0 +1,216 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.generators.java.writers; + +import esa.mo.apigen.generators.java.JavaClassBuilder; +import esa.mo.apigen.generators.java.JavaFieldBuilder; +import esa.mo.apigen.generators.java.JavaMethodBuilder; +import esa.mo.apigen.generators.java.JavaNaming; +import esa.mo.apigen.generators.java.JavaSource; +import esa.mo.apigen.generators.java.JavaTypeName; +import esa.mo.apigen.model.Field; +import esa.mo.apigen.model.InteractionStage; +import esa.mo.apigen.model.MOModel; +import esa.mo.apigen.model.MessageBody; +import esa.mo.apigen.model.Operation; +import esa.mo.apigen.model.Service; +import esa.mo.apigen.model.types.EnumerationType; +import esa.mo.apigen.model.types.TypeDefinition; +import java.util.ArrayList; +import java.util.List; + +/** + * Writes the publisher of a publish-subscribe operation: how a provider registers with the + * brokers it publishes through, and what one update looks like. + */ +public final class ProviderPublisherWriter { + + private static final String PUBLISHER_SET = JavaNaming.MAL + "provider.MALPublisherSet"; + + private static final String LISTENER = JavaNaming.MAL + "provider.MALPublishInteractionListener"; + + private static final String INTERACTION_EXCEPTION = JavaNaming.MAL + "MALInteractionException"; + + private static final String MAL_EXCEPTION = JavaNaming.MAL + "MALException"; + + private static final String INTERACTION_THROWN = + "if there is a problem during the interaction as defined by the MAL specification."; + + private static final String EXCEPTION_THROWN = "if there is an implementation exception"; + + private static final String ARGUMENT_THROWN = "If any supplied argument is invalid"; + + private static final String LISTENER_COMMENT = + "The listener object to use for callback from the publisher"; + + private ProviderPublisherWriter() { + } + + /** + * @return the name of the class, which is the operation's with the kind appended. + */ + public static String classNameOf(Operation operation) { + String name = operation.getName(); + return Character.toUpperCase(name.charAt(0)) + name.substring(1) + "Publisher"; + } + + /** + * @return the source of the operation's publisher. + */ + public static String write(MOModel model, Service service, Operation operation) { + String className = classNameOf(operation); + JavaClassBuilder clazz = JavaClassBuilder.named(className).asFinal() + .inPackage(JavaNaming.packageOf(service, JavaNaming.PROVIDER)) + .comment("Publisher class for the " + operation.getName() + " operation."); + JavaSource out = clazz.open(); + + JavaFieldBuilder.named("publisherSet").scope("private").ofType(PUBLISHER_SET) + .comment("The publisherSet field.").write(out); + + JavaMethodBuilder.constructor(className) + .comment("Creates an instance of this class using the supplied publisher set.") + .argument(PUBLISHER_SET, "publisherSet", + "The set of broker connections to use when registering and publishing.") + .line("this.publisherSet = publisherSet;") + .write(out); + + register(out, "register", "Registers this provider implementation to the set of broker" + + " connections", "publisherSet.register(keyNames, keyTypes, listener);"); + + writeRegisterWithDefaultKeys(out, model, operation); + + register(out, "asyncRegister", "Asynchronously registers this provider implementation to" + + " the set of broker connections", + "publisherSet.asyncRegister(keyNames, keyTypes, listener);"); + + writePublish(out, model, operation); + + JavaMethodBuilder.named("deregister") + .comment("Deregisters this provider implementation from the set of broker" + + " connections") + .throwing(INTERACTION_EXCEPTION, INTERACTION_THROWN) + .throwing(MAL_EXCEPTION, EXCEPTION_THROWN) + .line("publisherSet.deregister();") + .write(out); + + JavaMethodBuilder.named("asyncDeregister") + .comment("Asynchronously deregisters this provider implementation from the set" + + " of broker connections") + .argument(LISTENER, "listener", LISTENER_COMMENT) + .throwing("java.lang.IllegalArgumentException", ARGUMENT_THROWN) + .throwing(INTERACTION_EXCEPTION, INTERACTION_THROWN) + .throwing(MAL_EXCEPTION, EXCEPTION_THROWN) + .line("publisherSet.asyncDeregister(listener);") + .write(out); + + JavaMethodBuilder.named("close").comment("Closes this publisher") + .throwing(MAL_EXCEPTION, EXCEPTION_THROWN) + .line("publisherSet.close();") + .write(out); + + return clazz.close(); + } + + /** + * Registering says which keys the updates of this provider will be identified by. + */ + private static void register(JavaSource out, String name, String comment, String body) { + JavaMethodBuilder.named(name).comment(comment) + .argument(JavaNaming.MAL_STRUCTURES + "IdentifierList", "keyNames", + "The key names to use in the method") + .argument(JavaNaming.MAL_STRUCTURES + "AttributeTypeList", "keyTypes", + "The key types to use in the method") + .argument(LISTENER, "listener", LISTENER_COMMENT) + .throwing("java.lang.IllegalArgumentException", ARGUMENT_THROWN) + .throwing(INTERACTION_EXCEPTION, INTERACTION_THROWN) + .throwing(MAL_EXCEPTION, EXCEPTION_THROWN) + .line(body) + .write(out); + } + + /** + * Registering with the keys the operation itself declared, which is what a provider that + * has nothing of its own to add does. + */ + private static void writeRegisterWithDefaultKeys(JavaSource out, MOModel model, + Operation operation) { + JavaMethodBuilder method = JavaMethodBuilder.named("registerWithDefaultKeys") + .comment("Registers this provider implementation to the set of broker" + + " connections with the default subscription keys") + .argument(LISTENER, "listener", LISTENER_COMMENT) + .throwing(INTERACTION_EXCEPTION, INTERACTION_THROWN) + .throwing(MAL_EXCEPTION, EXCEPTION_THROWN); + + method.line(JavaNaming.MAL_STRUCTURES + "IdentifierList keyNames = new " + + JavaNaming.MAL_STRUCTURES + "IdentifierList();"); + method.line(JavaNaming.MAL_STRUCTURES + "AttributeTypeList keyTypes = new " + + JavaNaming.MAL_STRUCTURES + "AttributeTypeList();"); + for (Field key : fieldsOf(operation.getMessage(InteractionStage.SUBSCRIPTION_KEYS))) { + method.line("keyNames.add(new " + JavaNaming.MAL_STRUCTURES + "Identifier(\"" + + key.getName() + "\"));"); + method.line("keyTypes.add(" + JavaNaming.MAL_STRUCTURES + "AttributeType." + + attributeTypeOf(model, key) + ");"); + } + method.line("publisherSet.register(keyNames, keyTypes, listener);"); + method.write(out); + } + + /** + * One update: the header that identifies it, then the fields the operation publishes. + */ + private static void writePublish(JavaSource out, MOModel model, Operation operation) { + List published = fieldsOf(operation.getMessage(InteractionStage.PUBLISH_NOTIFY)); + JavaMethodBuilder method = JavaMethodBuilder.named("publish") + .comment("Publishes updates to the set of registered broker connections") + .argument(JavaNaming.MAL_STRUCTURES + "UpdateHeader", "updateHeader", + "The headers of the updates being added"); + + StringBuilder arguments = new StringBuilder("updateHeader"); + for (int i = 0; i < published.size(); i++) { + Field field = published.get(i); + String comment = field.getComment() != null ? field.getComment() + : field.getName() + " Argument number " + i + + " as defined by the service operation"; + method.argument(JavaTypeName.of(model, field.getType()), field.getName(), comment); + arguments.append(", ").append(field.getName()); + } + + method.throwing("java.lang.IllegalArgumentException", ARGUMENT_THROWN) + .throwing(INTERACTION_EXCEPTION, INTERACTION_THROWN) + .throwing(MAL_EXCEPTION, EXCEPTION_THROWN) + .line("publisherSet.publish(" + arguments + ");") + .write(out); + } + + /** + * @return the attribute type a key is carried as. An enumeration travels as the number + * that stands for it, so it is keyed as a UShort. + */ + private static String attributeTypeOf(MOModel model, Field key) { + TypeDefinition definition = model.resolve(key.getType()); + return definition instanceof EnumerationType + ? "USHORT" : key.getType().getName().toUpperCase(); + } + + private static List fieldsOf(MessageBody body) { + return body == null ? new ArrayList() : body.getFields(); + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/writers/ProviderSkeletonWriter.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/writers/ProviderSkeletonWriter.java new file mode 100644 index 00000000..017b5854 --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/writers/ProviderSkeletonWriter.java @@ -0,0 +1,87 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.generators.java.writers; + +import esa.mo.apigen.generators.java.JavaClassBuilder; +import esa.mo.apigen.generators.java.JavaMethodBuilder; +import esa.mo.apigen.generators.java.JavaNaming; +import esa.mo.apigen.generators.java.JavaSource; +import esa.mo.apigen.model.InteractionPattern; +import esa.mo.apigen.model.Operation; +import esa.mo.apigen.model.Service; + +/** + * Writes the skeleton interface of a service: how a provider reaches the publishers of its + * publish-subscribe operations, and nothing else. A service that publishes nothing has an + * empty one. + */ +public final class ProviderSkeletonWriter { + + private ProviderSkeletonWriter() { + } + + /** + * @return the source of the service's skeleton interface. + */ + public static String write(Service service) { + String name = service.getName(); + JavaClassBuilder clazz = JavaClassBuilder.named(name + "Skeleton").asInterface() + .inPackage(JavaNaming.packageOf(service, JavaNaming.PROVIDER)) + .comment("The skeleton interface for the " + name + " service."); + JavaSource out = clazz.open(); + + for (Operation operation : service.getOperations()) { + if (operation.getPattern() != InteractionPattern.PUBSUB) { + continue; + } + String publisher = JavaNaming.packageOf(service, JavaNaming.PROVIDER) + "." + + capitalise(operation.getName()) + "Publisher"; + JavaMethodBuilder.named("create" + capitalise(operation.getName()) + "Publisher") + .asDeclaration() + .comment("Creates a publisher object using the current registered provider" + + " set for the PubSub operation " + operation.getName()) + .returns(publisher, "The new publisher object.") + .argument(JavaNaming.MAL_STRUCTURES + "IdentifierList", "domain", + "The domain used for publishing") + .argument(JavaNaming.MAL_STRUCTURES + "Identifier", "networkZone", + "~The network zone used for publishing") + .argument(JavaNaming.MAL_STRUCTURES + "SessionType", "sessionType", + "The session used for publishing") + .argument(JavaNaming.MAL_STRUCTURES + "Identifier", "sessionName", + "The session name used for publishing") + .argument(JavaNaming.MAL_STRUCTURES + "QoSLevel", "qos", + "The QoS used for publishing") + .argument("java.util.Map", "qosProps", + "The QoS properties used for publishing") + .argument(JavaNaming.MAL_STRUCTURES + "UInteger", "priority", + "The priority used for publishing") + .throwing(JavaNaming.MAL + "MALException", + "if a problem is detected during creation of the publisher") + .write(out); + } + + return clazz.close(); + } + + private static String capitalise(String text) { + return Character.toUpperCase(text.charAt(0)) + text.substring(1); + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/writers/ServiceInfoWriter.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/writers/ServiceInfoWriter.java new file mode 100644 index 00000000..b16bafe7 --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/writers/ServiceInfoWriter.java @@ -0,0 +1,432 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.generators.java.writers; + +import esa.mo.apigen.generators.java.JavaClassBuilder; +import esa.mo.apigen.generators.java.JavaFieldBuilder; +import esa.mo.apigen.generators.java.JavaMethodBuilder; +import esa.mo.apigen.generators.java.JavaNaming; +import esa.mo.apigen.generators.java.JavaSource; +import esa.mo.apigen.generators.java.JavaTypeName; +import esa.mo.apigen.model.Area; +import esa.mo.apigen.model.ErrorDefinition; +import esa.mo.apigen.model.Field; +import esa.mo.apigen.model.InteractionStage; +import esa.mo.apigen.model.MOModel; +import esa.mo.apigen.model.MessageBody; +import esa.mo.apigen.model.Operation; +import esa.mo.apigen.model.Service; +import esa.mo.apigen.model.com.COMObject; +import esa.mo.apigen.model.com.ObjectLink; +import esa.mo.apigen.model.com.ObjectReference; +import java.util.ArrayList; +import java.util.List; + +/** + * Writes the ServiceInfo class of a service: what the service is called and numbered, one + * constant per operation describing the messages it exchanges, and the errors it can raise. + *

                  + * This is what the consumer stubs and provider skeletons name their operations through, so + * it is written before either of them. + */ +public final class ServiceInfoWriter { + + private static final String OPERATION_FIELD = JavaNaming.MAL + "OperationField"; + + /** + * The step the arguments of an operation take, and the step the fields of a message + * take past them. + */ + private static final String ARGUMENT = "\n "; + + private static final String FIELD = "\n "; + + private ServiceInfoWriter() { + } + + /** + * @return the source of the service's ServiceInfo class. + */ + public static String write(MOModel model, Area area, Service service) { + String name = service.getName(); + String upper = name.toUpperCase(); + boolean isCom = service.isExtended(); + + JavaClassBuilder clazz = JavaClassBuilder.named(name + "ServiceInfo") + .inPackage(JavaNaming.packageOf(service)) + .extending(isCom ? JavaNaming.ROOT + "com.COMService" : JavaNaming.MAL + "ServiceInfo") + .comment("Helper class for " + name + " service."); + JavaSource out = clazz.open(); + + constant("_" + upper + "_SERVICE_NUMBER", "int", String.valueOf(service.getNumber())) + .comment("Service number literal.").write(out); + constant(upper + "_SERVICE_NUMBER", JavaNaming.MAL_STRUCTURES + "UShort", + "new " + JavaNaming.MAL_STRUCTURES + "UShort(_" + upper + "_SERVICE_NUMBER)") + .comment("Service number instance.").write(out); + constant(upper + "_SERVICE_NAME", JavaNaming.MAL_STRUCTURES + "Identifier", + "new " + JavaNaming.MAL_STRUCTURES + "Identifier(\"" + name + "\")") + .comment("Service name constant.").write(out); + + // The key is what a message is addressed by, so it is built from the numbers rather + // than from the names. + constant("SERVICE_KEY", JavaNaming.MAL + "ServiceKey", + "new " + JavaNaming.MAL + "ServiceKey(" + ARGUMENT + area.getNumber() + ", " + + area.getVersion() + ", " + upper + "_SERVICE_NUMBER)") + .scope("private").comment("The service key of this service.").write(out); + + List operations = service.getOperations(); + for (Operation operation : operations) { + writeOperation(out, model, operation); + } + + // Left empty on purpose: the Area factory creates the elements on demand, so that + // the class of a type is only loaded once a message carries it. + constant(upper + "_SERVICE_ELEMENTS", JavaNaming.MAL_STRUCTURES + "Element[]", "{}") + .comment("Area elements.").write(out); + + constant("OPERATIONS", JavaNaming.MAL + "MALOperation[]", + "new " + JavaNaming.MAL + "MALOperation[]{" + operationList(operations) + "}") + .comment("The set of operations for this service.").write(out); + + List comObjects = writeComObjects(out, model, area, service); + boolean hasComObjects = !comObjects.isEmpty(); + + if (hasComObjects) { + StringBuilder buf = new StringBuilder("{"); + for (String object : comObjects) { + buf.append("\n ").append(object).append("_OBJECT,"); + } + constant("COM_OBJECTS", JavaNaming.ROOT + "com.COMObject[]", buf.append('}').toString()) + .comment("Object instance.").write(out); + } + + JavaMethodBuilder.constructor(name + "ServiceInfo") + .comment("Creates an instance of the " + name + " ServiceInfo.") + .line("super(SERVICE_KEY, " + upper + "_SERVICE_NAME, " + upper + + "_SERVICE_ELEMENTS, OPERATIONS" + (hasComObjects ? ", COM_OBJECTS" : "") + + ");") + .write(out); + + JavaMethodBuilder.named("getArea").asOverride().returns(JavaNaming.MAL + "MALArea", null) + .line("return " + JavaNaming.packageOf(area) + "." + area.getName() + "Helper." + + area.getName().toUpperCase() + "_AREA;") + .write(out); + + writeGenerateMOError(out, area); + return clazz.close(); + } + + /** + * Writes the three constants that describe one operation: its number as a literal, its + * number as a UShort, and the operation itself with every message it exchanges. + */ + private static void writeOperation(JavaSource out, MOModel model, Operation operation) { + String upper = operation.getName().toUpperCase(); + + constant("_" + upper + "_OP_NUMBER", "int", String.valueOf(operation.getNumber())) + .comment("Operation number literal for operation " + upper).write(out); + constant(upper + "_OP_NUMBER", JavaNaming.MAL_STRUCTURES + "UShort", + "new " + JavaNaming.MAL_STRUCTURES + "UShort(_" + upper + "_OP_NUMBER)") + .scope("private").comment("Operation number instance for operation " + upper) + .write(out); + + constant(upper + "_OP", JavaNaming.MAL + operationTypeOf(operation), + operationValue(model, operation)) + .comment("Operation instance for operation " + upper).write(out); + + if (operation.getPattern() == esa.mo.apigen.model.InteractionPattern.PUBSUB) { + writeSubscriptionKeys(out, operation, upper); + } + } + + /** + * The names a subscription is keyed by, as an array and as the list built from it. + */ + private static void writeSubscriptionKeys(JavaSource out, Operation operation, String upper) { + String comment = "Key names instance for " + upper + + " operation of pubsub interaction pattern"; + MessageBody keys = operation.getMessage(InteractionStage.SUBSCRIPTION_KEYS); + StringBuilder buf = new StringBuilder("{"); + String separator = ""; + + if (keys != null) { + for (Field field : keys.getFields()) { + buf.append(separator).append("new ").append(JavaNaming.MAL_STRUCTURES) + .append("Identifier(\"").append(field.getName()).append("\")"); + separator = ",\n "; + } + } + + constant("_" + upper + "_OP_KEY_NAMES", JavaNaming.MAL_STRUCTURES + "Identifier []", + buf.append('}').toString()).scope("private").comment(comment).write(out); + constant(upper + "_OP_KEY_NAMES", JavaNaming.MAL_STRUCTURES + "IdentifierList", + "new " + JavaNaming.MAL_STRUCTURES + "IdentifierList(new java.util.ArrayList<>(" + + "java.util.Arrays.asList(_" + upper + "_OP_KEY_NAMES)))") + .scope("private").comment(comment).write(out); + } + + /** + * @return the expression that creates the operation, message by message. + */ + private static String operationValue(MOModel model, Operation operation) { + String upper = operation.getName().toUpperCase(); + StringBuilder buf = new StringBuilder("new "); + buf.append(JavaNaming.MAL).append(operationTypeOf(operation)).append("(SERVICE_KEY, "); + buf.append(ARGUMENT).append(upper).append("_OP_NUMBER, "); + buf.append(ARGUMENT).append("new ").append(JavaNaming.MAL_STRUCTURES) + .append("Identifier(\"").append(operation.getName()).append("\"), "); + buf.append(ARGUMENT).append("new ").append(JavaNaming.MAL_STRUCTURES) + .append("UShort(").append(operation.getParent().getNumber()).append("), "); + + for (InteractionStage stage : bodyStagesOf(operation)) { + buf.append(ARGUMENT).append(messageBody(model, operation.getMessage(stage))).append(", "); + } + + buf.append(ARGUMENT).append(literal(operation.getComment())).append(')'); + return buf.toString(); + } + + /** + * The stages an operation declares a body for, in the order the operation takes them as + * arguments. A publish-subscribe operation is described by what it publishes alone. + */ + private static List bodyStagesOf(Operation operation) { + List stages = new ArrayList(); + switch (operation.getPattern()) { + case SEND: + stages.add(InteractionStage.SEND); + break; + case SUBMIT: + stages.add(InteractionStage.SUBMIT); + break; + case REQUEST: + stages.add(InteractionStage.REQUEST); + stages.add(InteractionStage.RESPONSE); + break; + case INVOKE: + stages.add(InteractionStage.INVOKE); + stages.add(InteractionStage.ACK); + stages.add(InteractionStage.RESPONSE); + break; + case PROGRESS: + stages.add(InteractionStage.PROGRESS); + stages.add(InteractionStage.ACK); + stages.add(InteractionStage.UPDATE); + stages.add(InteractionStage.RESPONSE); + break; + case PUBSUB: + stages.add(InteractionStage.PUBLISH_NOTIFY); + break; + default: + break; + } + return stages; + } + + /** + * @return the array of fields one message carries, empty if it carries none. + */ + private static String messageBody(MOModel model, MessageBody body) { + StringBuilder buf = new StringBuilder("new " + OPERATION_FIELD + "[] {"); + if (body != null) { + List fields = body.getFields(); + for (int i = 0; i < fields.size(); i++) { + Field field = fields.get(i); + buf.append(FIELD).append("new ").append(OPERATION_FIELD).append("(\"") + .append(field.getName()).append("\", ").append(field.isCanBeNull()) + .append(", ").append(JavaTypeName.shortFormOf(model, field.getType())) + .append(", ").append(literal(field.getComment())).append(')'); + if (i != fields.size() - 1) { + buf.append(','); + } + } + } + return buf.append('}').toString(); + } + + /** + * Writes the constants describing the COM objects and events of a service. + * + * @return the names of the objects written, in order. + */ + private static List writeComObjects(JavaSource out, MOModel model, Area area, + Service service) { + List written = new ArrayList(); + if (service.getCom() == null) { + return written; + } + for (COMObject object : service.getCom().getObjects()) { + written.add(writeComObject(out, model, area, service, object, false)); + } + for (COMObject event : service.getCom().getEvents()) { + written.add(writeComObject(out, model, area, service, event, true)); + } + return written; + } + + /** + * Writes the five constants that describe one COM object. They are deprecated: a COM + * object is reached through the service rather than through the ServiceInfo. + * + * @return the name of the object, in capitals. + */ + private static String writeComObject(JavaSource out, MOModel model, Area area, + Service service, COMObject object, boolean isEvent) { + String upper = object.getName().toUpperCase(); + String serviceUpper = service.getName().toUpperCase(); + + constant("_" + upper + "_OBJECT_NUMBER", "int", String.valueOf(object.getNumber())) + .asDeprecated().comment("Literal for object " + upper).write(out); + constant(upper + "_OBJECT_NUMBER", JavaNaming.MAL_STRUCTURES + "UShort", + "new " + JavaNaming.MAL_STRUCTURES + "UShort(_" + upper + "_OBJECT_NUMBER)") + .asDeprecated().comment("Instance for object " + upper).write(out); + constant(upper + "_OBJECT_NAME", JavaNaming.MAL_STRUCTURES + "Identifier", + "new " + JavaNaming.MAL_STRUCTURES + "Identifier(\"" + object.getName() + "\")") + .asDeprecated().comment("Object name constant.").write(out); + constant(upper + "_OBJECT_TYPE", JavaNaming.ROOT + "com.structures.ObjectType", + "new " + JavaNaming.ROOT + "com.structures.ObjectType(new " + + JavaNaming.MAL_STRUCTURES + "UShort(" + area.getNumber() + "), " + + serviceUpper + "_SERVICE_NUMBER, new " + JavaNaming.MAL_STRUCTURES + + "UOctet(" + area.getVersion() + "), " + upper + "_OBJECT_NUMBER)") + .asDeprecated().comment("Object type constant.").write(out); + + String related = objectTypeOf(model, object.getRelated()); + String source = objectTypeOf(model, object.getSource()); + JavaFieldBuilder.named(upper + "_OBJECT").asStatic() + .ofType(JavaNaming.ROOT + "com.COMObject") + .value("new " + JavaNaming.ROOT + "com.COMObject(" + upper + "_OBJECT_TYPE, " + + upper + "_OBJECT_NAME, " + + JavaTypeName.shortFormOf(model, object.getBodyType()) + ", " + + (object.getRelated() != null) + ", " + related + ", " + + (object.getSource() != null) + ", " + source + ", " + isEvent + ")") + .asDeprecated().comment("Object instance.").write(out); + return upper; + } + + /** + * Names the object type constant a link points at. A link into an object this model + * does not hold is left unresolved rather than named, which is what the reference does. + * + * @param model The model to look the object up in. + * @param link The link, may be null. + * @return the constant, or the literal null. + */ + private static String objectTypeOf(MOModel model, ObjectLink link) { + if (link == null || link.getTarget() == null) { + return "null"; + } + ObjectReference reference = link.getTarget(); + for (Area area : model.getAreas()) { + if (!area.getName().equals(reference.getArea())) { + continue; + } + for (Service service : area.getServices()) { + if (!service.getName().equals(reference.getService()) || service.getCom() == null) { + continue; + } + for (COMObject object : allObjectsOf(service)) { + if (object.getNumber() == reference.getNumber()) { + return JavaNaming.packageOf(service) + "." + service.getName() + + "ServiceInfo." + object.getName().toUpperCase() + "_OBJECT_TYPE"; + } + } + } + } + return "null"; + } + + private static List allObjectsOf(Service service) { + List all = new ArrayList(service.getCom().getObjects()); + all.addAll(service.getCom().getEvents()); + return all; + } + + /** + * Writes the method that turns an error number back into the exception it stands for. + * Only the errors of the area are answered for: a service's own errors are not reached + * this way. + */ + private static void writeGenerateMOError(JavaSource out, Area area) { + JavaMethodBuilder method = JavaMethodBuilder.named("generateMOError").asOverride() + .returns(JavaNaming.MAL + "MOErrorException", null) + .argument("int", "errorNumber", null) + .argument("Object", "extraInfo", null); + + method.line("switch (errorNumber) {"); + for (ErrorDefinition error : area.getErrors()) { + method.line(" case " + error.getNumber() + ":"); + method.line(" return new " + JavaNaming.packageOf(area) + "." + + ExceptionWriter.classNameOf(error.getName()) + "(extraInfo);"); + } + method.line("}"); + method.line("return null;"); + method.write(out); + } + + /** + * @return the names of the operations, one per line after the first. + */ + private static String operationList(List operations) { + StringBuilder buf = new StringBuilder(); + for (int i = 0; i < operations.size(); i++) { + buf.append(i == 0 ? "" : ",\n ") + .append(operations.get(i).getName().toUpperCase()).append("_OP"); + } + return buf.toString(); + } + + /** + * @return the MAL class that stands for the operation's interaction pattern. + */ + private static String operationTypeOf(Operation operation) { + switch (operation.getPattern()) { + case SEND: + return "MALSendOperation"; + case SUBMIT: + return "MALSubmitOperation"; + case REQUEST: + return "MALRequestOperation"; + case INVOKE: + return "MALInvokeOperation"; + case PROGRESS: + return "MALProgressOperation"; + case PUBSUB: + return "MALPubSubOperation"; + default: + return null; + } + } + + /** + * @return the comment as a Java string literal, or the literal null where there is none. + */ + private static String literal(String comment) { + if (comment == null) { + return "null"; + } + return "\"" + comment.replace("\\", "\\\\").replace("\"", "\\\"") + .replace("\n", "\\n").replace("\r", "\\r") + "\""; + } + + private static JavaFieldBuilder constant(String name, String type, String value) { + return JavaFieldBuilder.named(name).asStatic().asFinal().ofType(type).value(value); + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/writers/SubscriptionKeysWriter.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/writers/SubscriptionKeysWriter.java new file mode 100644 index 00000000..1d7eeb14 --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/writers/SubscriptionKeysWriter.java @@ -0,0 +1,181 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.generators.java.writers; + +import esa.mo.apigen.generators.java.JavaClassBuilder; +import esa.mo.apigen.generators.java.JavaFieldBuilder; +import esa.mo.apigen.generators.java.JavaMethodBuilder; +import esa.mo.apigen.generators.java.JavaNaming; +import esa.mo.apigen.generators.java.JavaSource; +import esa.mo.apigen.generators.java.JavaTypeName; +import esa.mo.apigen.model.Field; +import esa.mo.apigen.model.InteractionStage; +import esa.mo.apigen.model.MOModel; +import esa.mo.apigen.model.MessageBody; +import esa.mo.apigen.model.Operation; +import esa.mo.apigen.model.Service; +import esa.mo.apigen.model.types.EnumerationType; +import esa.mo.apigen.model.types.TypeDefinition; +import java.util.ArrayList; +import java.util.List; + +/** + * Writes the class that reads the subscription keys of one publish-subscribe operation. + *

                  + * A notify message carries its key values in the UpdateHeader, in the order the operation + * declared them - but a subscription may have asked for only some of them, in which case + * the values that arrive are fewer and the names that go with them come from the + * subscription rather than from the operation. This class holds both and pairs them up by + * name, so a consumer asks for a key rather than for an index. The UpdateHeader itself is + * never modified. + */ +public final class SubscriptionKeysWriter { + + private static final String ATTRIBUTE = JavaNaming.MAL_STRUCTURES + "Attribute"; + + private SubscriptionKeysWriter() { + } + + /** + * @return the name of the class, which is the operation's with the kind appended. + */ + public static String classNameOf(Operation operation) { + String name = operation.getName(); + return Character.toUpperCase(name.charAt(0)) + name.substring(1) + "SubscriptionKeys"; + } + + /** + * @return the source of the subscription key accessors. + */ + public static String write(MOModel model, Service service, Operation operation) { + String className = classNameOf(operation); + List keys = keysOf(operation); + + JavaClassBuilder clazz = JavaClassBuilder.named(className).asFinal() + .inPackage(JavaNaming.packageOf(service, JavaNaming.CONSUMER)) + .comment("Typed accessors for the Subscription Keys of the " + + operation.getName() + " PubSub operation."); + JavaSource out = clazz.open(); + + JavaFieldBuilder.named("keyValues").scope("private") + .ofType(JavaNaming.MAL_STRUCTURES + "NullableAttributeList") + .comment("The key values as received in the UpdateHeader").write(out); + JavaFieldBuilder.named("keyNames").scope("private") + .ofType(JavaNaming.MAL_STRUCTURES + "IdentifierList") + .comment("The effective key names for the received key values").write(out); + + StringBuilder canonical = new StringBuilder("new " + JavaNaming.MAL_STRUCTURES + + "IdentifierList(new java.util.ArrayList<>(java.util.Arrays.asList("); + for (int i = 0; i < keys.size(); i++) { + canonical.append(i == 0 ? "" : ", ").append("new ").append(JavaNaming.MAL_STRUCTURES) + .append("Identifier(\"").append(keys.get(i).getName()).append("\")"); + } + JavaFieldBuilder.named("CANONICAL_KEY_NAMES").scope("private").asStatic().asFinal() + .ofType(JavaNaming.MAL_STRUCTURES + "IdentifierList") + .value(canonical.append(")))").toString()) + .comment("The Subscription Key names defined by the operation, in order") + .write(out); + + JavaMethodBuilder.constructor(className) + .comment("Creates an instance from the received UpdateHeader and the" + + " subscription selectedKeys.") + .argument(JavaNaming.MAL_STRUCTURES + "UpdateHeader", "updateHeader", + "The UpdateHeader received in the NOTIFY message") + .argument(JavaNaming.MAL_STRUCTURES + "IdentifierList", "selectedKeys", + "The selectedKeys of the subscription, or null if trimming was not enabled") + .line("this.keyValues = (updateHeader == null) ? null : updateHeader.getKeyValues();") + .line("this.keyNames = (selectedKeys != null) ? selectedKeys : CANONICAL_KEY_NAMES;") + .write(out); + + for (Field key : keys) { + writeGetter(out, model, key); + } + + JavaMethodBuilder.named("getByName").returns(ATTRIBUTE, "The key value, or null if not present") + .comment("Returns the Subscription Key value with the given name, or null if it" + + " is not present (for example when it was trimmed away or is a custom" + + " key that is not part of this subscription).") + .argument("String", "name", "The Subscription Key name") + .line("return valueByName(name);") + .write(out); + + JavaMethodBuilder.named("valueByName").scope("private").returns(ATTRIBUTE, null) + .argument("String", "name", "The Subscription Key name") + .line("if (keyNames == null || keyValues == null) {") + .line(" return null;") + .line("}") + .line("for (int i = 0; i < keyNames.size(); i++) {") + .line(" if (name.equals(keyNames.get(i).getValue())) {") + .line(" if (i >= keyValues.size()) {") + .line(" return null;") + .line(" }") + .line(" " + JavaNaming.MAL_STRUCTURES + "NullableAttribute na = keyValues.get(i);") + .line(" return (na == null) ? null : na.getValue();") + .line(" }") + .line("}") + .line("return null;") + .write(out); + + return clazz.close(); + } + + /** + * Writes the accessor of one key, which answers in the type the key was declared as + * rather than in the Attribute it arrived as. + */ + private static void writeGetter(JavaSource out, MOModel model, Field key) { + String name = key.getName(); + String getter = "get" + Character.toUpperCase(name.charAt(0)) + name.substring(1); + String comment = "Returns the value of the \"" + name + + "\" Subscription Key, or null if not present."; + String type = JavaTypeName.of(model, key.getType()); + JavaMethodBuilder method = JavaMethodBuilder.named(getter) + .returns(type, "The key value, or null if not present"); + + TypeDefinition definition = model.resolve(key.getType()); + if (definition instanceof EnumerationType) { + // An enumeration travels as the number that stands for it, so it is rebuilt + // rather than cast. + method.comment(comment + " Enumeration keys are transmitted as their UShort" + + " numeric value.") + .line(JavaNaming.MAL_STRUCTURES + "UShort v = (" + + JavaNaming.MAL_STRUCTURES + "UShort) valueByName(\"" + name + "\");") + .line("return (v == null) ? null : new " + type + "(v.getValue());"); + } else if (JavaTypeName.isNativeAttribute(model, key.getType())) { + // A native attribute is a plain Java type, so it is unwrapped rather than cast. + method.comment(comment) + .line(ATTRIBUTE + " v = valueByName(\"" + name + "\");") + .line("return (v == null) ? null : (" + type + ") " + ATTRIBUTE + + ".attribute2JavaType(v);"); + } else { + method.comment(comment).line("return (" + type + ") valueByName(\"" + name + "\");"); + } + method.write(out); + } + + /** + * @return the keys the operation declares, in order, empty if it declares none. + */ + private static List keysOf(Operation operation) { + MessageBody keys = operation.getMessage(InteractionStage.SUBSCRIPTION_KEYS); + return keys == null ? new ArrayList() : keys.getFields(); + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/importers/ImportException.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/importers/ImportException.java new file mode 100644 index 00000000..e52ef186 --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/importers/ImportException.java @@ -0,0 +1,42 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.importers; + +/** + * Thrown when a source cannot be read at all - malformed XML, an unreadable stream. + *

                  + * Semantic problems are not reported this way: importers are lenient by design, and + * anything wrong with the content of an otherwise well-formed source is left to the + * linker and the validator, so that a user sees every problem at once rather than one + * per run. + */ +public class ImportException extends Exception { + + private static final long serialVersionUID = 1L; + + public ImportException(String message) { + super(message); + } + + public ImportException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/importers/Importer.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/importers/Importer.java new file mode 100644 index 00000000..14b8609b --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/importers/Importer.java @@ -0,0 +1,45 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.importers; + +import esa.mo.apigen.model.SourceRef; +import esa.mo.apigen.model.Specification; +import java.io.Reader; + +/** + * Reads a specification from a source. + *

                  + * Importers take a {@link Reader} rather than a path so that text held in an editor can be + * parsed directly. Where the source does have a file behind it, {@link SourceRef} carries + * the location, which is also what locates sidecar files. + */ +public interface Importer { + + /** + * Reads one specification. + * + * @param in The source text. + * @param source Where it came from, for diagnostics and sidecar resolution. + * @return the specification. + * @throws ImportException if the source cannot be read at all. + */ + Specification read(Reader in, SourceRef source) throws ImportException; +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/importers/xml/StaxCursor.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/importers/xml/StaxCursor.java new file mode 100644 index 00000000..96b8cccf --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/importers/xml/StaxCursor.java @@ -0,0 +1,261 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.importers.xml; + +import esa.mo.apigen.model.SourceLocation; +import esa.mo.apigen.model.SourceRef; +import java.io.StringWriter; +import javax.xml.stream.XMLStreamConstants; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; + +/** + * Thin conveniences over a StAX cursor: attribute access, child iteration, subtree + * capture and source locations. + *

                  + * StAX rather than a DOM because the reader gives line and column for free, and every + * element in the model records where it came from. + */ +public final class StaxCursor { + + private final XMLStreamReader in; + private final SourceRef source; + + public StaxCursor(XMLStreamReader in, SourceRef source) { + this.in = in; + this.source = source; + } + + public XMLStreamReader reader() { + return in; + } + + public String localName() { + return in.getLocalName(); + } + + public String namespace() { + return in.getNamespaceURI() == null ? "" : in.getNamespaceURI(); + } + + /** + * Returns an attribute of the current element, ignoring its namespace. Attributes in + * these documents are unqualified, and being lenient about it costs nothing. + * + * @param name The attribute name. + * @return the value, or null if absent. + */ + public String attr(String name) { + for (int i = 0; i < in.getAttributeCount(); i++) { + if (name.equals(in.getAttributeLocalName(i))) { + return in.getAttributeValue(i); + } + } + return null; + } + + public String attr(String name, String fallback) { + String value = attr(name); + return value == null ? fallback : value; + } + + public int intAttr(String name, int fallback) { + String value = attr(name); + if (value == null) { + return fallback; + } + try { + return Integer.parseInt(value.trim()); + } catch (NumberFormatException ex) { + return fallback; + } + } + + public long longAttr(String name, long fallback) { + String value = attr(name); + if (value == null) { + return fallback; + } + try { + return Long.parseLong(value.trim()); + } catch (NumberFormatException ex) { + return fallback; + } + } + + public Integer integerAttr(String name) { + String value = attr(name); + if (value == null) { + return null; + } + try { + return Integer.valueOf(value.trim()); + } catch (NumberFormatException ex) { + return null; + } + } + + public boolean boolAttr(String name, boolean fallback) { + String value = attr(name); + return value == null ? fallback : Boolean.parseBoolean(value.trim()); + } + + /** + * Returns the comment attribute, treating the empty string as absent. The + * specifications are full of {@code comment=""}, which carries no information and + * would otherwise become an empty documentation comment in every output. + * + * @return the comment, null if there is none, empty if it was written empty. + */ + public String comment() { + // An empty comment is kept apart from an absent one. The two read the same + // everywhere a comment is shown, but a message body records which of them a field + // carried, so the difference has to survive the import. + return attr("comment"); + } + + public SourceLocation location() { + javax.xml.stream.Location loc = in.getLocation(); + return new SourceLocation(source, loc.getLineNumber(), loc.getColumnNumber()); + } + + /** + * Advances to the next child element of the current element, or returns false when + * the element ends. The cursor must be on a START_ELEMENT. + * + * @return true if positioned on a child START_ELEMENT. + * @throws XMLStreamException if the document is malformed. + */ + public boolean nextChild() throws XMLStreamException { + int depth = 0; + while (in.hasNext()) { + int event = in.next(); + if (event == XMLStreamConstants.START_ELEMENT) { + if (depth == 0) { + return true; + } + depth++; + } else if (event == XMLStreamConstants.END_ELEMENT) { + if (depth == 0) { + return false; + } + depth--; + } + } + return false; + } + + /** + * Consumes the rest of the current element, leaving the cursor on its END_ELEMENT. + * + * @throws XMLStreamException if the document is malformed. + */ + public void skip() throws XMLStreamException { + int depth = 1; + while (in.hasNext() && depth > 0) { + int event = in.next(); + if (event == XMLStreamConstants.START_ELEMENT) { + depth++; + } else if (event == XMLStreamConstants.END_ELEMENT) { + depth--; + } + } + } + + /** + * Returns the mixed text content of the current element, consuming it. + * + * @return the text, with no trimming, or null if there was none. + * @throws XMLStreamException if the document is malformed. + */ + public String text() throws XMLStreamException { + StringBuilder buf = new StringBuilder(); + int depth = 1; + while (in.hasNext() && depth > 0) { + int event = in.next(); + if (event == XMLStreamConstants.CHARACTERS || event == XMLStreamConstants.CDATA) { + if (depth == 1) { + buf.append(in.getText()); + } + } else if (event == XMLStreamConstants.START_ELEMENT) { + depth++; + } else if (event == XMLStreamConstants.END_ELEMENT) { + depth--; + } + } + return buf.length() == 0 ? null : buf.toString(); + } + + /** + * Serialises the child elements of the current element, consuming them. Used for + * diagrams, whose SVG is carried through the model as text rather than parsed. + * + * @return the serialised children, or null if there were none. + * @throws XMLStreamException if the document is malformed. + */ + public String captureChildren() throws XMLStreamException { + StringWriter out = new StringWriter(); + int depth = 1; + boolean wrote = false; + while (in.hasNext() && depth > 0) { + int event = in.next(); + switch (event) { + case XMLStreamConstants.START_ELEMENT: + depth++; + writeStart(out); + wrote = true; + break; + case XMLStreamConstants.END_ELEMENT: + depth--; + if (depth > 0) { + out.write(""); + } + break; + case XMLStreamConstants.CHARACTERS: + case XMLStreamConstants.CDATA: + if (depth > 1) { + out.write(escapeText(in.getText())); + } + break; + default: + break; + } + } + return wrote ? out.toString() : null; + } + + private void writeStart(StringWriter out) { + out.write("<" + in.getLocalName()); + for (int i = 0; i < in.getAttributeCount(); i++) { + out.write(" " + in.getAttributeLocalName(i) + "=\"" + + escapeAttr(in.getAttributeValue(i)) + "\""); + } + out.write(">"); + } + + private static String escapeText(String text) { + return text.replace("&", "&").replace("<", "<").replace(">", ">"); + } + + private static String escapeAttr(String text) { + return escapeText(text).replace("\"", """); + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/importers/xml/XmlImporter.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/importers/xml/XmlImporter.java new file mode 100644 index 00000000..65ed9fd2 --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/importers/xml/XmlImporter.java @@ -0,0 +1,545 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.importers.xml; + +import esa.mo.apigen.importers.ImportException; +import esa.mo.apigen.importers.Importer; +import esa.mo.apigen.model.*; +import esa.mo.apigen.model.com.COMFeatures; +import esa.mo.apigen.model.com.COMObject; +import esa.mo.apigen.model.com.ObjectLink; +import esa.mo.apigen.model.com.ObjectReference; +import esa.mo.apigen.model.docs.Diagram; +import esa.mo.apigen.model.docs.DocSection; +import esa.mo.apigen.model.docs.Documentation; +import esa.mo.apigen.model.types.*; +import java.io.Reader; +import java.util.List; +import javax.xml.stream.XMLInputFactory; +import javax.xml.stream.XMLStreamConstants; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; + +/** + * Reads a specification from the CCSDS service schema XML, in either version. + *

                  + * Which version a file uses is taken from the root element's namespace, and recorded on + * the specification: it decides which constructs are legal, and which the exporter may + * write back. Nothing here resolves references - that is the linker's job. + *

                  + * The reader is lenient. An element it does not understand is skipped rather than + * rejected, so that a half-written file still produces a model to look at; whether the + * result makes sense is the validator's question. + */ +public final class XmlImporter implements Importer { + + @Override + public Specification read(Reader in, SourceRef source) throws ImportException { + XMLStreamReader reader = null; + try { + XMLInputFactory factory = XMLInputFactory.newInstance(); + factory.setProperty(XMLInputFactory.IS_COALESCING, Boolean.TRUE); + factory.setProperty(XMLInputFactory.SUPPORT_DTD, Boolean.FALSE); + factory.setProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, Boolean.FALSE); + reader = factory.createXMLStreamReader(in); + return readSpecification(new StaxCursor(reader, source), source); + } catch (XMLStreamException ex) { + throw new ImportException("Could not read " + source + ": " + ex.getMessage(), ex); + } finally { + if (reader != null) { + try { + reader.close(); + } catch (XMLStreamException ignored) { + // nothing useful to do while unwinding + } + } + } + } + + private Specification readSpecification(StaxCursor c, SourceRef source) + throws XMLStreamException, ImportException { + while (c.reader().hasNext()) { + if (c.reader().next() == XMLStreamConstants.START_ELEMENT) { + break; + } + } + if (!"specification".equals(c.localName())) { + throw new ImportException("Not a service specification: root element is <" + + c.localName() + ">"); + } + SchemaVersion version = SchemaVersion.fromNamespace(c.namespace()); + if (version == null) { + throw new ImportException("Unknown service schema namespace: " + c.namespace()); + } + + Specification spec = new Specification(); + spec.setSource(source); + spec.setSchemaVersion(version); + spec.setComment(c.comment()); + + while (c.nextChild()) { + if (XmlNames.isMal(c.namespace()) && "area".equals(c.localName())) { + spec.addArea(readArea(c)); + } else { + c.skip(); + } + } + return spec; + } + + // ----------------------------------------------------------------- area + + private Area readArea(StaxCursor c) throws XMLStreamException { + Area area = new Area(); + area.setLocation(c.location()); + area.setName(c.attr("name")); + area.setNumber(c.intAttr("number", 0)); + area.setVersion(c.intAttr("version", 1)); + area.setComment(c.comment()); + + while (c.nextChild()) { + String name = c.localName(); + if ("service".equals(name)) { + area.addService(readService(c)); + } else if ("dataTypes".equals(name)) { + readDataTypes(c, area.getDataTypes()); + } else if ("errors".equals(name)) { + readErrorDefinitions(c, area.getErrors()); + } else if ("documentation".equals(name)) { + area.getDocumentation().getSections().add(readDocSection(c)); + } else if ("diagram".equals(name)) { + area.getDocumentation().getDiagrams().add(readDiagram(c)); + } else { + c.skip(); + } + } + return area; + } + + // -------------------------------------------------------------- service + + private Service readService(StaxCursor c) throws XMLStreamException { + Service service = new Service(); + service.setLocation(c.location()); + service.setName(c.attr("name")); + service.setNumber(c.intAttr("number", 0)); + service.setComment(c.comment()); + // A COM extended service says so on the element itself. It is recorded here rather + // than inferred from the features it declares, because a service can be extended + // and declare none. + String type = c.attr("type"); + service.setExtended(type != null && type.endsWith("ExtendedServiceType")); + + while (c.nextChild()) { + String name = c.localName(); + if (XmlNames.isCom(c.namespace()) && "features".equals(name)) { + service.setExtended(true); + service.setCom(readComFeatures(c)); + } else if ("capabilitySet".equals(name)) { + service.addCapabilitySet(readCapabilitySet(c)); + } else if ("dataTypes".equals(name)) { + readDataTypes(c, service.getDataTypes()); + } else if ("errors".equals(name)) { + readErrorDefinitions(c, service.getErrors()); + } else if ("documentation".equals(name)) { + service.getDocumentation().getSections().add(readDocSection(c)); + } else if ("diagram".equals(name)) { + service.getDocumentation().getDiagrams().add(readDiagram(c)); + } else { + c.skip(); + } + } + return service; + } + + private CapabilitySet readCapabilitySet(StaxCursor c) throws XMLStreamException { + CapabilitySet set = new CapabilitySet(); + set.setLocation(c.location()); + set.setNumber(c.intAttr("number", 0)); + set.setComment(c.comment()); + + while (c.nextChild()) { + InteractionPattern pattern = patternOf(c.localName()); + if (pattern != null) { + set.addOperation(readOperation(c, pattern)); + } else { + c.skip(); + } + } + return set; + } + + private static InteractionPattern patternOf(String elementName) { + if (elementName.endsWith("IP")) { + String base = elementName.substring(0, elementName.length() - 2); + for (InteractionPattern pattern : InteractionPattern.values()) { + if (pattern.name().equalsIgnoreCase(base)) { + return pattern; + } + } + } + return null; + } + + // ------------------------------------------------------------ operation + + private Operation readOperation(StaxCursor c, InteractionPattern pattern) + throws XMLStreamException { + Operation op = new Operation(); + op.setLocation(c.location()); + op.setPattern(pattern); + op.setName(c.attr("name")); + op.setNumber(c.intAttr("number", 0)); + op.setComment(c.comment()); + op.setSupportInReplay(c.boolAttr("supportInReplay", false)); + + while (c.nextChild()) { + String name = c.localName(); + if ("messages".equals(name)) { + readMessages(c, op); + } else if ("errors".equals(name)) { + readErrorReferences(c, op.getErrors()); + } else if ("documentation".equals(name)) { + op.getDocumentation().getSections().add(readDocSection(c)); + } else if ("diagram".equals(name)) { + op.getDocumentation().getDiagrams().add(readDiagram(c)); + } else { + c.skip(); + } + } + return op; + } + + private void readMessages(StaxCursor c, Operation op) throws XMLStreamException { + while (c.nextChild()) { + InteractionStage stage = InteractionStage.fromXmlName(c.localName()); + if (stage != null) { + op.getMessages().put(stage, readMessageBody(c)); + } else { + c.skip(); + } + } + } + + private MessageBody readMessageBody(StaxCursor c) throws XMLStreamException { + MessageBody body = new MessageBody(); + body.setComment(c.comment()); + while (c.nextChild()) { + if ("field".equals(c.localName())) { + body.getFields().add(readField(c)); + } else { + c.skip(); + } + } + return body; + } + + private Field readField(StaxCursor c) throws XMLStreamException { + Field field = new Field(); + field.setLocation(c.location()); + field.setName(c.attr("name")); + field.setComment(c.comment()); + field.setCanBeNull(c.boolAttr("canBeNull", true)); + while (c.nextChild()) { + if ("type".equals(c.localName())) { + field.setType(readTypeRef(c)); + c.skip(); + } else { + c.skip(); + } + } + return field; + } + + /** + * Reads a type reference. The area version is left at 0: the XML does not carry it, + * and filling it in is the linker's job. + */ + private TypeRef readTypeRef(StaxCursor c) { + return new TypeRef(c.attr("area"), 0, c.attr("service"), c.attr("name"), + c.boolAttr("list", false), c.boolAttr("objectRef", false)); + } + + // ---------------------------------------------------------------- types + + private void readDataTypes(StaxCursor c, List into) + throws XMLStreamException { + while (c.nextChild()) { + String name = c.localName(); + if ("fundamental".equals(name)) { + into.add(readFundamental(c)); + } else if ("attribute".equals(name)) { + into.add(readAttribute(c)); + } else if ("composite".equals(name)) { + into.add(readComposite(c)); + } else if ("enumeration".equals(name)) { + into.add(readEnumeration(c)); + } else { + c.skip(); + } + } + } + + private FundamentalType readFundamental(StaxCursor c) throws XMLStreamException { + FundamentalType type = new FundamentalType(); + type.setLocation(c.location()); + type.setName(c.attr("name")); + type.setComment(c.comment()); + while (c.nextChild()) { + if ("extends".equals(c.localName())) { + type.setSuperType(readExtends(c)); + } else { + c.skip(); + } + } + return type; + } + + private AttributeType readAttribute(StaxCursor c) throws XMLStreamException { + AttributeType type = new AttributeType(); + type.setLocation(c.location()); + type.setName(c.attr("name")); + type.setComment(c.comment()); + type.setShortFormPart(c.intAttr("shortFormPart", 0)); + c.skip(); + return type; + } + + private CompositeType readComposite(StaxCursor c) throws XMLStreamException { + CompositeType type = new CompositeType(); + type.setLocation(c.location()); + type.setName(c.attr("name")); + type.setComment(c.comment()); + type.setShortFormPart(c.integerAttr("shortFormPart")); + while (c.nextChild()) { + String name = c.localName(); + if ("extends".equals(name)) { + type.setSuperType(readExtends(c)); + } else if ("field".equals(name)) { + type.getFields().add(readField(c)); + } else { + c.skip(); + } + } + return type; + } + + private EnumerationType readEnumeration(StaxCursor c) throws XMLStreamException { + EnumerationType type = new EnumerationType(); + type.setLocation(c.location()); + type.setName(c.attr("name")); + type.setComment(c.comment()); + type.setShortFormPart(c.intAttr("shortFormPart", 0)); + while (c.nextChild()) { + if ("item".equals(c.localName())) { + EnumerationItem item = new EnumerationItem(); + item.setLocation(c.location()); + item.setValue(c.attr("value")); + item.setNumericValue(c.longAttr("nvalue", 0)); + item.setComment(c.comment()); + type.getItems().add(item); + c.skip(); + } else { + c.skip(); + } + } + return type; + } + + private TypeRef readExtends(StaxCursor c) throws XMLStreamException { + TypeRef ref = null; + while (c.nextChild()) { + if ("type".equals(c.localName())) { + ref = readTypeRef(c); + } + c.skip(); + } + return ref; + } + + // --------------------------------------------------------------- errors + + private void readErrorDefinitions(StaxCursor c, List into) + throws XMLStreamException { + while (c.nextChild()) { + if ("error".equals(c.localName())) { + ErrorDefinition error = new ErrorDefinition(); + error.setLocation(c.location()); + error.setName(c.attr("name")); + error.setNumber(c.longAttr("number", 0)); + error.setComment(c.comment()); + while (c.nextChild()) { + if ("extraInformation".equals(c.localName())) { + error.setExtraInformation(readExtraInformation(c)); + } else { + c.skip(); + } + } + into.add(error); + } else { + c.skip(); + } + } + } + + private void readErrorReferences(StaxCursor c, List into) + throws XMLStreamException { + while (c.nextChild()) { + if ("errorRef".equals(c.localName())) { + ErrorReference ref = new ErrorReference(); + ref.setLocation(c.location()); + ref.setComment(c.comment()); + while (c.nextChild()) { + String name = c.localName(); + if ("type".equals(name)) { + ref.setError(readTypeRef(c)); + c.skip(); + } else if ("extraInformation".equals(name)) { + ref.setExtraInformation(readExtraInformation(c)); + } else { + c.skip(); + } + } + into.add(ref); + } else { + c.skip(); + } + } + } + + private Field readExtraInformation(StaxCursor c) throws XMLStreamException { + Field extra = new Field(); + extra.setLocation(c.location()); + extra.setComment(c.comment()); + extra.setCanBeNull(false); + while (c.nextChild()) { + if ("type".equals(c.localName())) { + extra.setType(readTypeRef(c)); + } + c.skip(); + } + return extra; + } + + // ------------------------------------------------------------------ COM + + private COMFeatures readComFeatures(StaxCursor c) throws XMLStreamException { + COMFeatures com = new COMFeatures(); + while (c.nextChild()) { + String name = c.localName(); + if ("objects".equals(name)) { + com.setObjectsComment(c.comment()); + readComObjects(c, com.getObjects()); + } else if ("events".equals(name)) { + com.setEventsComment(c.comment()); + readComObjects(c, com.getEvents()); + } else if ("archiveUsage".equals(name)) { + com.setArchiveUsage(c.comment()); + c.skip(); + } else if ("activityUsage".equals(name)) { + com.setActivityUsage(c.comment()); + c.skip(); + } else if ("documentation".equals(name)) { + com.getDocumentation().getSections().add(readDocSection(c)); + } else if ("diagram".equals(name)) { + com.getDocumentation().getDiagrams().add(readDiagram(c)); + } else { + c.skip(); + } + } + return com; + } + + private void readComObjects(StaxCursor c, List into) throws XMLStreamException { + while (c.nextChild()) { + String name = c.localName(); + if ("object".equals(name) || "event".equals(name)) { + COMObject object = new COMObject(); + object.setLocation(c.location()); + object.setName(c.attr("name")); + object.setNumber(c.intAttr("number", 0)); + object.setComment(c.comment()); + while (c.nextChild()) { + String child = c.localName(); + if ("objectType".equals(child)) { + object.setBodyType(readBodyType(c)); + } else if ("relatedObject".equals(child)) { + object.setRelated(readObjectLink(c)); + } else if ("sourceObject".equals(child)) { + object.setSource(readObjectLink(c)); + } else { + c.skip(); + } + } + into.add(object); + } else { + c.skip(); + } + } + } + + /** + * The body of a COM object is a {@code } wrapping a {@code }; + * an empty wrapper means the object has no body. + */ + private TypeRef readBodyType(StaxCursor c) throws XMLStreamException { + TypeRef ref = null; + while (c.nextChild()) { + if ("type".equals(c.localName())) { + ref = readTypeRef(c); + } + c.skip(); + } + return ref; + } + + private ObjectLink readObjectLink(StaxCursor c) throws XMLStreamException { + ObjectLink link = new ObjectLink(); + link.setComment(c.comment()); + while (c.nextChild()) { + if ("objectType".equals(c.localName())) { + link.setTarget(new ObjectReference(c.attr("area"), 0, c.attr("service"), + c.intAttr("number", 0))); + } + c.skip(); + } + return link; + } + + // -------------------------------------------------------- documentation + + private DocSection readDocSection(StaxCursor c) throws XMLStreamException { + DocSection section = new DocSection(); + section.setLocation(c.location()); + section.setName(c.attr("name")); + section.setOrder(c.intAttr("order", 0)); + section.setContent(c.text()); + return section; + } + + private Diagram readDiagram(StaxCursor c) throws XMLStreamException { + Diagram diagram = new Diagram(); + diagram.setLocation(c.location()); + diagram.setName(c.attr("name")); + diagram.setSvg(c.captureChildren()); + return diagram; + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/importers/xml/XmlNames.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/importers/xml/XmlNames.java new file mode 100644 index 00000000..66bb88a1 --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/importers/xml/XmlNames.java @@ -0,0 +1,56 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.importers.xml; + +/** + * Namespaces and element names of the service schema. + */ +public final class XmlNames { + + public static final String MAL_V001 = "http://www.ccsds.org/schema/ServiceSchema"; + public static final String MAL_V003 = "http://www.ccsds.org/schema/ServiceSchema-v003"; + public static final String COM = "http://www.ccsds.org/schema/COMSchema"; + public static final String SVG = "http://www.w3.org/2000/svg"; + public static final String XSI = "http://www.w3.org/2001/XMLSchema-instance"; + + private XmlNames() { + } + + /** + * Returns true if the namespace is one of the service schema versions. + * + * @param namespace The namespace URI. + * @return true if it is a MAL service schema namespace. + */ + public static boolean isMal(String namespace) { + return MAL_V001.equals(namespace) || MAL_V003.equals(namespace); + } + + /** + * Returns true if the namespace is the COM schema. + * + * @param namespace The namespace URI. + * @return true if it is the COM namespace. + */ + public static boolean isCom(String namespace) { + return COM.equals(namespace); + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/link/Linker.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/link/Linker.java new file mode 100644 index 00000000..045afbfe --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/link/Linker.java @@ -0,0 +1,228 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.link; + +import esa.mo.apigen.model.*; +import esa.mo.apigen.model.com.COMFeatures; +import esa.mo.apigen.model.com.COMObject; +import esa.mo.apigen.model.com.ObjectLink; +import esa.mo.apigen.model.com.ObjectReference; +import esa.mo.apigen.model.types.CompositeType; +import esa.mo.apigen.model.types.FundamentalType; +import esa.mo.apigen.model.types.TypeDefinition; +import esa.mo.apigen.model.types.TypeRef; +import esa.mo.apigen.validation.Severity; +import esa.mo.apigen.validation.ValidationIssue; +import esa.mo.apigen.validation.ValidationResult; +import java.util.List; + +/** + * Fills in what the XML leaves out, between import and validation. + *

                  + * Two things are missing from the file and have to be recovered from the model as a + * whole: + *

                    + *
                  • A type reference carries no version - {@code } + * does not say which MAL - so the version of the area actually loaded is written into the + * reference. Doing it here, once, is what lets resolution need no lookup context and lets + * the same name in two versions of an area compare unequal.
                  • + *
                  • A composite may omit {@code }, which the schema defines as implying the + * base Composite. Resolving that here means no later reader has to know the rule.
                  • + *
                  + * After linking the model does not change again, which is what lets generation run in + * parallel over it. + */ +public final class Linker { + + private static final String MAL = "MAL"; + private static final String COMPOSITE = "Composite"; + + /** + * Links every reference in the model. + * + * @param model The model to link. + * @return anything that could not be linked. + */ + public ValidationResult link(MOModel model) { + ValidationResult result = new ValidationResult(); + Area mal = model.findUniqueArea(MAL); + if (mal == null) { + result.add(new ValidationIssue(Severity.ERROR, "link.mal.missing", + model.findAreas(MAL).isEmpty() + ? "The MAL area is not loaded, so no type can be resolved" + : "More than one version of the MAL area is loaded, so type " + + "references to it are ambiguous", null)); + } + int malVersion = mal == null ? 0 : mal.getVersion(); + + for (Specification spec : model.getSpecifications()) { + for (Area area : spec.getAreas()) { + linkArea(model, area, malVersion, result); + } + } + return result; + } + + private void linkArea(MOModel model, Area area, int malVersion, ValidationResult result) { + linkTypes(model, area, area.getDataTypes(), malVersion, result); + for (ErrorDefinition error : area.getErrors()) { + linkField(model, area, error.getExtraInformation(), result); + } + for (Service service : area.getServices()) { + linkTypes(model, area, service.getDataTypes(), malVersion, result); + for (ErrorDefinition error : service.getErrors()) { + linkField(model, area, error.getExtraInformation(), result); + } + for (Operation op : service.getOperations()) { + linkOperation(model, area, op, result); + } + if (service.getCom() != null) { + linkCom(model, area, service.getCom(), result); + } + } + } + + private void linkTypes(MOModel model, Area area, List types, + int malVersion, ValidationResult result) { + for (TypeDefinition type : types) { + type.setArea(area); + if (type instanceof CompositeType) { + CompositeType composite = (CompositeType) type; + if (composite.getSuperType() == null) { + // The schema: "if this is not present then the base Composite is implied". + composite.setSuperType(new TypeRef(MAL, malVersion, null, COMPOSITE, false, false)); + } else { + composite.setSuperType(linkRef(model, area, composite.getSuperType(), + composite.getLocation(), result)); + } + for (Field field : composite.getFields()) { + linkField(model, area, field, result); + } + } else if (type instanceof FundamentalType) { + FundamentalType fundamental = (FundamentalType) type; + if (fundamental.getSuperType() != null) { + fundamental.setSuperType(linkRef(model, area, fundamental.getSuperType(), + fundamental.getLocation(), result)); + } + } + } + } + + private void linkOperation(MOModel model, Area area, Operation op, ValidationResult result) { + for (MessageBody body : op.getMessages().values()) { + for (Field field : body.getFields()) { + linkField(model, area, field, result); + } + } + for (ErrorReference ref : op.getErrors()) { + if (ref.getError() != null) { + ref.setError(linkRef(model, area, ref.getError(), ref.getLocation(), result)); + } + linkField(model, area, ref.getExtraInformation(), result); + } + } + + private void linkCom(MOModel model, Area area, COMFeatures com, ValidationResult result) { + linkComObjects(model, area, com.getObjects(), result); + linkComObjects(model, area, com.getEvents(), result); + } + + private void linkComObjects(MOModel model, Area area, List objects, + ValidationResult result) { + for (COMObject object : objects) { + if (object.getBodyType() != null) { + object.setBodyType(linkRef(model, area, object.getBodyType(), + object.getLocation(), result)); + } + linkObjectLink(model, area, object, object.getRelated(), result); + linkObjectLink(model, area, object, object.getSource(), result); + } + } + + private void linkObjectLink(MOModel model, Area area, COMObject object, ObjectLink link, + ValidationResult result) { + if (link == null || link.getTarget() == null) { + return; + } + ObjectReference ref = link.getTarget(); + int version = versionOf(model, area, ref.getArea(), object.getLocation(), result); + if (version > 0) { + link.setTarget(ref.withAreaVersion(version)); + } + } + + private void linkField(MOModel model, Area area, Field field, ValidationResult result) { + if (field == null || field.getType() == null) { + return; + } + field.setType(linkRef(model, area, field.getType(), field.getLocation(), result)); + } + + private TypeRef linkRef(MOModel model, Area area, TypeRef ref, SourceLocation location, + ValidationResult result) { + int version = versionOf(model, area, ref.getArea(), location, result); + return version > 0 ? ref.withAreaVersion(version) : ref; + } + + /** + * Works out which version of an area a reference means. + *

                  + * A reference to the referring area's own name means that area. A reference to the + * MAL means the MAL of the referring specification's own generation, which its + * namespace declares (see {@link SchemaVersion#getMalVersion()}); pairing a + * specification with the MAL of its generation resolves every reference it makes. + * Any other area is taken to be whichever version of it is loaded, there being + * nothing in a reference to say otherwise. + */ + private int versionOf(MOModel model, Area context, String areaName, + SourceLocation location, ValidationResult result) { + if (areaName == null) { + return 0; + } + if (context != null && areaName.equals(context.getName())) { + return context.getVersion(); + } + if (MAL.equals(areaName) && context != null && context.getSpecification() != null + && context.getSpecification().getSchemaVersion() != null) { + int wanted = context.getSpecification().getSchemaVersion().getMalVersion(); + if (model.findArea(MAL, wanted) != null) { + return wanted; + } + // The MAL of this specification's generation is not loaded. Whatever is + // loaded is used instead, so that the rest of the model still links, and the + // validator says so once for the specification rather than once for every + // name that does not match. + } + Area target = model.findUniqueArea(areaName); + if (target != null) { + return target.getVersion(); + } + if (model.findAreas(areaName).isEmpty()) { + result.add(new ValidationIssue(Severity.ERROR, "link.area.missing", + "Area '" + areaName + "' is referenced but not loaded", location)); + } else { + result.add(new ValidationIssue(Severity.ERROR, "link.area.ambiguous", + "Area '" + areaName + "' is loaded in more than one version, so the " + + "reference cannot say which is meant", location)); + } + return 0; + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/Area.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/Area.java new file mode 100644 index 00000000..ccd1b748 --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/Area.java @@ -0,0 +1,148 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.model; + +import esa.mo.apigen.model.docs.Documentation; +import esa.mo.apigen.model.types.TypeDefinition; +import java.util.ArrayList; +import java.util.List; + +/** + * An area: the top-level unit of an MO specification. + */ +public final class Area { + + private int number; + private int version; + private String name; + private String comment; + private Specification specification; + private final List services = new ArrayList(); + private final List dataTypes = new ArrayList(); + private final List errors = new ArrayList(); + private Documentation documentation = new Documentation(); + private SourceLocation location; + + public int getNumber() { + return number; + } + + public void setNumber(int number) { + this.number = number; + } + + public int getVersion() { + return version; + } + + public void setVersion(int version) { + this.version = version; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getComment() { + return comment; + } + + public void setComment(String comment) { + this.comment = comment; + } + + /** + * @return the identity of this area: name, number and version together. + */ + public AreaKey getKey() { + return new AreaKey(name, number, version); + } + + public Specification getSpecification() { + return specification; + } + + public void setSpecification(Specification specification) { + this.specification = specification; + } + + public List getServices() { + return services; + } + + /** + * Adds a service and sets its back-reference. + * + * @param service The service to add. + */ + public void addService(Service service) { + service.setArea(this); + services.add(service); + } + + /** + * Returns a service by name. + * + * @param serviceName The name to look for. + * @return the service, or null if this area has no such service. + */ + public Service getService(String serviceName) { + for (Service s : services) { + if (s.getName() != null && s.getName().equals(serviceName)) { + return s; + } + } + return null; + } + + public List getDataTypes() { + return dataTypes; + } + + public List getErrors() { + return errors; + } + + public Documentation getDocumentation() { + return documentation; + } + + public void setDocumentation(Documentation documentation) { + this.documentation = documentation; + } + + public SourceLocation getLocation() { + return location; + } + + public void setLocation(SourceLocation location) { + this.location = location; + } + + @Override + public String toString() { + return name + " [" + number + "." + version + "]"; + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/AreaKey.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/AreaKey.java new file mode 100644 index 00000000..ed654da7 --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/AreaKey.java @@ -0,0 +1,92 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.model; + +/** + * The identity of an area: name, number and version together. + *

                  + * None of the three is unique on its own. The specifications contain areas that share a + * name under different numbers, and numbers under different names, so anything indexing + * areas has to key on all three - see the design document, section 4.1. + */ +public final class AreaKey implements Comparable { + + private final String name; + private final int number; + private final int version; + + public AreaKey(String name, int number, int version) { + this.name = name; + this.number = number; + this.version = version; + } + + public String getName() { + return name; + } + + public int getNumber() { + return number; + } + + public int getVersion() { + return version; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof AreaKey)) { + return false; + } + AreaKey other = (AreaKey) o; + return number == other.number && version == other.version + && (name == null ? other.name == null : name.equals(other.name)); + } + + @Override + public int hashCode() { + int result = name == null ? 0 : name.hashCode(); + result = 31 * result + number; + result = 31 * result + version; + return result; + } + + @Override + public int compareTo(AreaKey o) { + int c = Integer.compare(number, o.number); + if (c != 0) { + return c; + } + c = Integer.compare(version, o.version); + if (c != 0) { + return c; + } + return String.valueOf(name).compareTo(String.valueOf(o.name)); + } + + @Override + public String toString() { + return name + " [" + number + "." + version + "]"; + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/CapabilitySet.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/CapabilitySet.java new file mode 100644 index 00000000..07f2fcce --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/CapabilitySet.java @@ -0,0 +1,87 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.model; + +import java.util.ArrayList; +import java.util.List; + +/** + * A numbered group of operations within a service. + */ +public final class CapabilitySet { + + private int number; + private String comment; + private final List operations = new ArrayList(); + private Service service; + private SourceLocation location; + + public int getNumber() { + return number; + } + + public void setNumber(int number) { + this.number = number; + } + + public String getComment() { + return comment; + } + + public void setComment(String comment) { + this.comment = comment; + } + + public List getOperations() { + return operations; + } + + /** + * Adds an operation and sets its back-reference. + * + * @param operation The operation to add. + */ + public void addOperation(Operation operation) { + operation.setParent(this); + operations.add(operation); + } + + public Service getService() { + return service; + } + + public void setService(Service service) { + this.service = service; + } + + public SourceLocation getLocation() { + return location; + } + + public void setLocation(SourceLocation location) { + this.location = location; + } + + @Override + public String toString() { + return "capability [" + number + "]"; + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/ErrorDefinition.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/ErrorDefinition.java new file mode 100644 index 00000000..2c50b923 --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/ErrorDefinition.java @@ -0,0 +1,81 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.model; + +/** + * An error defined by an area or a service. + */ +public final class ErrorDefinition { + + private String name; + private long number; + private String comment; + private Field extraInformation; + private SourceLocation location; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public long getNumber() { + return number; + } + + public void setNumber(long number) { + this.number = number; + } + + public String getComment() { + return comment; + } + + public void setComment(String comment) { + this.comment = comment; + } + + /** + * @return the extra information the error carries, or null if it carries none. + */ + public Field getExtraInformation() { + return extraInformation; + } + + public void setExtraInformation(Field extraInformation) { + this.extraInformation = extraInformation; + } + + public SourceLocation getLocation() { + return location; + } + + public void setLocation(SourceLocation location) { + this.location = location; + } + + @Override + public String toString() { + return name + " [" + number + "]"; + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/ErrorReference.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/ErrorReference.java new file mode 100644 index 00000000..ddb20bba --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/ErrorReference.java @@ -0,0 +1,74 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.model; + +import esa.mo.apigen.model.types.TypeRef; + +/** + * An operation's reference to an error defined elsewhere. + */ +public final class ErrorReference { + + private TypeRef error; + private String comment; + private Field extraInformation; + private SourceLocation location; + + public TypeRef getError() { + return error; + } + + public void setError(TypeRef error) { + this.error = error; + } + + public String getComment() { + return comment; + } + + public void setComment(String comment) { + this.comment = comment; + } + + /** + * @return the extra information carried when this operation raises the error, or null. + */ + public Field getExtraInformation() { + return extraInformation; + } + + public void setExtraInformation(Field extraInformation) { + this.extraInformation = extraInformation; + } + + public SourceLocation getLocation() { + return location; + } + + public void setLocation(SourceLocation location) { + this.location = location; + } + + @Override + public String toString() { + return String.valueOf(error); + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/Field.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/Field.java new file mode 100644 index 00000000..a525321e --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/Field.java @@ -0,0 +1,81 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.model; + +import esa.mo.apigen.model.types.TypeRef; + +/** + * A named, typed slot: a field of a composite, a parameter of a message, or the extra + * information carried by an error. + */ +public final class Field { + + private String name; + private String comment; + private boolean canBeNull = true; + private TypeRef type; + private SourceLocation location; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getComment() { + return comment; + } + + public void setComment(String comment) { + this.comment = comment; + } + + public boolean isCanBeNull() { + return canBeNull; + } + + public void setCanBeNull(boolean canBeNull) { + this.canBeNull = canBeNull; + } + + public TypeRef getType() { + return type; + } + + public void setType(TypeRef type) { + this.type = type; + } + + public SourceLocation getLocation() { + return location; + } + + public void setLocation(SourceLocation location) { + this.location = location; + } + + @Override + public String toString() { + return type + " " + name + (canBeNull ? "?" : ""); + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/InteractionPattern.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/InteractionPattern.java new file mode 100644 index 00000000..afa61829 --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/InteractionPattern.java @@ -0,0 +1,63 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.model; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +/** + * The MAL interaction patterns, each with the stages its messages occupy. + */ +public enum InteractionPattern { + SEND(InteractionStage.SEND), + SUBMIT(InteractionStage.SUBMIT), + REQUEST(InteractionStage.REQUEST, InteractionStage.RESPONSE), + INVOKE(InteractionStage.INVOKE, InteractionStage.ACK, InteractionStage.RESPONSE), + PROGRESS(InteractionStage.PROGRESS, InteractionStage.ACK, + InteractionStage.UPDATE, InteractionStage.RESPONSE), + PUBSUB(InteractionStage.SUBSCRIPTION_KEYS, InteractionStage.PUBLISH_NOTIFY); + + private final List stages; + + private InteractionPattern(InteractionStage... stages) { + this.stages = Collections.unmodifiableList(Arrays.asList(stages)); + } + + /** + * Returns the stages of this pattern, in message order. + * + * @return the stages, never null. + */ + public List getStages() { + return stages; + } + + /** + * Returns true if the pattern uses the given stage. + * + * @param stage The stage to look for. + * @return true if the stage belongs to this pattern. + */ + public boolean hasStage(InteractionStage stage) { + return stages.contains(stage); + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/InteractionStage.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/InteractionStage.java new file mode 100644 index 00000000..34bb583c --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/InteractionStage.java @@ -0,0 +1,82 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.model; + +/** + * The stages a message can occupy, across all interaction patterns. + *

                  + * {@link #SUBSCRIPTION_KEYS} exists only in v003 specifications. + */ +public enum InteractionStage { + SEND("send", "send"), + SUBMIT("submit", "submit"), + REQUEST("request", "request"), + RESPONSE("response", "response"), + INVOKE("invoke", "invoke"), + ACK("ack", "acknowledgement"), + PROGRESS("progress", "progress"), + UPDATE("update", "update"), + SUBSCRIPTION_KEYS("subscriptionKeys", "subscriptionKeys"), + PUBLISH_NOTIFY("publishNotify", "publishNotify"); + + private final String tag; + private final String xmlName; + + private InteractionStage(String tag, String xmlName) { + this.tag = tag; + this.xmlName = xmlName; + } + + /** + * Returns the short name used for this stage in documentation tags, for example + * "request" or "ack". + * + * @return the tag name. + */ + public String getTag() { + return tag; + } + + /** + * Returns the XML element name for this stage. It is not always the tag name: the + * schema spells the acknowledgement stage "acknowledgement". + * + * @return the element name. + */ + public String getXmlName() { + return xmlName; + } + + /** + * Returns the stage for an XML element name. + * + * @param xmlName The element name. + * @return the stage, or null if the name is not a message stage. + */ + public static InteractionStage fromXmlName(String xmlName) { + for (InteractionStage stage : values()) { + if (stage.xmlName.equals(xmlName)) { + return stage; + } + } + return null; + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/MOModel.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/MOModel.java new file mode 100644 index 00000000..4d70a258 --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/MOModel.java @@ -0,0 +1,280 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.model; + +import esa.mo.apigen.model.com.COMObject; +import esa.mo.apigen.model.com.ObjectReference; +import esa.mo.apigen.model.types.TypeDefinition; +import esa.mo.apigen.model.types.TypeRef; +import java.util.ArrayList; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +/** + * Every loaded specification, with an index over their areas. + *

                  + * The model captures what the specifications say and nothing about what anyone intends to + * do with them: a build loads more specifications than it generates, but the difference is + * the caller's business, not the model's. + */ +public final class MOModel { + + private final List specifications = new ArrayList(); + private final Map byKey = new LinkedHashMap(); + private final Map> byName = new LinkedHashMap>(); + private final List conflicting = new ArrayList(); + + /** + * Adds a specification and indexes its areas. + *

                  + * An area whose identity is already present is still added to the model, but is + * recorded as conflicting rather than replacing the one already there - silently + * overwriting is exactly the failure this index exists to prevent. + *

                  + * The same file arriving twice is not a conflict. A module commonly names its own + * specification among its references as well as its target, and the two copies say the + * same thing; only the first is indexed, and the second is left out of the index + * entirely so that a lookup by name and version stays unambiguous. + * + * @param specification The specification to add. + */ + public void add(Specification specification) { + specifications.add(specification); + for (Area area : specification.getAreas()) { + AreaKey key = area.getKey(); + Area alreadyThere = byKey.get(key); + + if (alreadyThere != null) { + if (!isSameFile(alreadyThere, area)) { + conflicting.add(area); + } + continue; + } + + byKey.put(key, area); + List sameName = byName.get(area.getName()); + if (sameName == null) { + sameName = new ArrayList(); + byName.put(area.getName(), sameName); + } + sameName.add(area); + } + } + + /** + * @return true if both areas were read from a file of the same name, which is what a + * specification named twice looks like. + */ + private static boolean isSameFile(Area one, Area other) { + String first = sourceNameOf(one); + String second = sourceNameOf(other); + return first != null && first.equals(second); + } + + private static String sourceNameOf(Area area) { + if (area.getSpecification() == null || area.getSpecification().getSource() == null) { + return null; + } + return area.getSpecification().getSource().getName(); + } + + public List getSpecifications() { + return Collections.unmodifiableList(specifications); + } + + /** + * @return every indexed area, in load order. + */ + public List getAreas() { + return Collections.unmodifiableList(new ArrayList(byKey.values())); + } + + /** + * Returns the areas that could not be indexed because their identity was already + * taken. Empty in a healthy model; the validator reports whatever is here. + * + * @return the conflicting areas. + */ + public List getConflictingAreas() { + return Collections.unmodifiableList(conflicting); + } + + /** + * Returns the area with exactly this identity. + * + * @param key The identity to look for. + * @return the area, or null if no such area is loaded. + */ + public Area findArea(AreaKey key) { + return byKey.get(key); + } + + /** + * Returns every loaded area with the given name. More than one is possible: the + * specifications use the same name under different numbers. + * + * @param name The area name. + * @return the matching areas, never null. + */ + public List findAreas(String name) { + List found = byName.get(name); + return found == null ? Collections.emptyList() : Collections.unmodifiableList(found); + } + + /** + * Returns the one area with this name and version. + * + * @param name The area name. + * @param version The area version. + * @return the area, or null if there is no such area or more than one - an ambiguous + * reference cannot be resolved, and saying so is better than guessing. + */ + public Area findArea(String name, int version) { + Area match = null; + for (Area area : findAreas(name)) { + if (area.getVersion() == version) { + if (match != null) { + return null; + } + match = area; + } + } + return match; + } + + /** + * Returns the one area with this name, whatever its version. Used while linking, to + * discover the version an unversioned reference must mean. + * + * @param name The area name. + * @return the area, or null if there is no such area or more than one. + */ + public Area findUniqueArea(String name) { + List found = findAreas(name); + return found.size() == 1 ? found.get(0) : null; + } + + /** + * Resolves a type reference to the type it names. + * + * @param ref The reference, already linked. + * @return the type definition, or null if it cannot be resolved. + */ + public TypeDefinition resolve(TypeRef reference) { + if (reference == null) { + return null; + } + TypeRef ref = reference.unwrapped(); + Area area = findArea(ref.getArea(), ref.getAreaVersion()); + if (area == null) { + return null; + } + if (ref.getService() == null) { + return findType(area.getDataTypes(), ref.getName()); + } + Service service = area.getService(ref.getService()); + return service == null ? null : findType(service.getDataTypes(), ref.getName()); + } + + private static TypeDefinition findType(List types, String name) { + for (TypeDefinition type : types) { + if (type.getName() != null && type.getName().equals(name)) { + return type; + } + } + return null; + } + + /** + * Resolves a reference to the error it names. + *

                  + * Errors are not types, so they are looked up separately. The name is qualified by + * the area alone: the schema requires error names to be unique across a whole + * specification, and the specifications rely on that - an error declared inside a + * service is referred to by its area, with no service named. So both the area's own + * errors and those of every service in it are searched. + * + * @param ref The reference, already linked. + * @return the error definition, or null if it cannot be resolved. + */ + public ErrorDefinition resolveError(TypeRef ref) { + if (ref == null) { + return null; + } + Area area = findArea(ref.getArea(), ref.getAreaVersion()); + if (area == null) { + return null; + } + ErrorDefinition found = findError(area.getErrors(), ref.getName()); + if (found != null) { + return found; + } + for (Service service : area.getServices()) { + found = findError(service.getErrors(), ref.getName()); + if (found != null) { + return found; + } + } + return null; + } + + private static ErrorDefinition findError(List errors, String name) { + for (ErrorDefinition error : errors) { + if (error.getName() != null && error.getName().equals(name)) { + return error; + } + } + return null; + } + + /** + * Resolves a COM object reference to the object it names. + * + * @param ref The reference, already linked. + * @return the COM object or event, or null if it cannot be resolved. + */ + public COMObject resolve(ObjectReference ref) { + if (ref == null) { + return null; + } + Area area = findArea(ref.getArea(), ref.getAreaVersion()); + if (area == null) { + return null; + } + Service service = area.getService(ref.getService()); + if (service == null || service.getCom() == null) { + return null; + } + COMObject found = findObject(service.getCom().getObjects(), ref.getNumber()); + return found != null ? found : findObject(service.getCom().getEvents(), ref.getNumber()); + } + + private static COMObject findObject(List objects, int number) { + for (COMObject object : objects) { + if (object.getNumber() == number) { + return object; + } + } + return null; + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/MessageBody.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/MessageBody.java new file mode 100644 index 00000000..6a746f4f --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/MessageBody.java @@ -0,0 +1,52 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.model; + +import java.util.ArrayList; +import java.util.List; + +/** + * The body of one message of an operation: an ordered list of fields, and a comment. + */ +public final class MessageBody { + + private String comment; + private final List fields = new ArrayList(); + + public String getComment() { + return comment; + } + + public void setComment(String comment) { + this.comment = comment; + } + + public List getFields() { + return fields; + } + + /** + * @return true if the message carries no fields. + */ + public boolean isEmpty() { + return fields.isEmpty(); + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/Operation.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/Operation.java new file mode 100644 index 00000000..8ea11072 --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/Operation.java @@ -0,0 +1,148 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.model; + +import esa.mo.apigen.model.docs.Documentation; +import java.util.ArrayList; +import java.util.EnumMap; +import java.util.List; +import java.util.Map; + +/** + * An operation, carrying its own messages. + *

                  + * Holding the bodies here rather than deriving them is what removes the second, summary + * model the old generators needed. + *

                  + * {@code supportInReplay} exists only in v001 specifications, where it is a required + * attribute; {@code documentation} only in v003. + */ +public final class Operation { + + private String name; + private int number; + private String comment; + private boolean supportInReplay; + private InteractionPattern pattern; + private final Map messages + = new EnumMap(InteractionStage.class); + private final List errors = new ArrayList(); + private Documentation documentation = new Documentation(); + private CapabilitySet parent; + private SourceLocation location; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNumber() { + return number; + } + + public void setNumber(int number) { + this.number = number; + } + + public String getComment() { + return comment; + } + + public void setComment(String comment) { + this.comment = comment; + } + + public boolean isSupportInReplay() { + return supportInReplay; + } + + public void setSupportInReplay(boolean supportInReplay) { + this.supportInReplay = supportInReplay; + } + + public InteractionPattern getPattern() { + return pattern; + } + + public void setPattern(InteractionPattern pattern) { + this.pattern = pattern; + } + + /** + * @return the messages, keyed by the stage each occupies. + */ + public Map getMessages() { + return messages; + } + + /** + * Returns the message at a stage. + * + * @param stage The stage to look for. + * @return the message, or null if the operation has none at that stage. + */ + public MessageBody getMessage(InteractionStage stage) { + return messages.get(stage); + } + + public List getErrors() { + return errors; + } + + public Documentation getDocumentation() { + return documentation; + } + + public void setDocumentation(Documentation documentation) { + this.documentation = documentation; + } + + public CapabilitySet getParent() { + return parent; + } + + public void setParent(CapabilitySet parent) { + this.parent = parent; + } + + /** + * @return the service that declares this operation, or null if it is detached. + */ + public Service getService() { + return parent == null ? null : parent.getService(); + } + + public SourceLocation getLocation() { + return location; + } + + public void setLocation(SourceLocation location) { + this.location = location; + } + + @Override + public String toString() { + return pattern + " " + name + " [" + number + "]"; + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/SchemaVersion.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/SchemaVersion.java new file mode 100644 index 00000000..7adbbb87 --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/SchemaVersion.java @@ -0,0 +1,84 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.model; + +/** + * The version of the service schema a specification conforms to, taken from the root + * element's namespace. + *

                  + * It governs which constructs are legal in the file, not which version of a referenced + * area a type reference resolves against - see the design document, section 4.1. + */ +public enum SchemaVersion { + /** + * http://www.ccsds.org/schema/ServiceSchema + */ + V001("http://www.ccsds.org/schema/ServiceSchema"), + /** + * http://www.ccsds.org/schema/ServiceSchema-v003 + */ + V003("http://www.ccsds.org/schema/ServiceSchema-v003"); + + private final String namespace; + + private SchemaVersion(String namespace) { + this.namespace = namespace; + } + + /** + * Returns the XML namespace that identifies this schema version. + * + * @return the namespace URI. + */ + public String getNamespace() { + return namespace; + } + + /** + * Returns the version of the MAL area this generation of the schema goes with. + *

                  + * A specification says which generation it belongs to by the namespace it declares, + * and that is the only thing in the file which does: a type or error reference names + * an area and never a version. So a document in the {@code ServiceSchema} namespace + * is written against MAL 1 and one in {@code ServiceSchema-v003} against MAL 3, and + * their error names follow accordingly - v001 calls it UNKNOWN, v003 calls it Unknown. + * + * @return the MAL area version of this generation. + */ + public int getMalVersion() { + return this == V001 ? 1 : 3; + } + + /** + * Returns the schema version for an XML namespace. + * + * @param namespace The namespace URI. + * @return the matching version, or null if the namespace is not a service schema. + */ + public static SchemaVersion fromNamespace(String namespace) { + for (SchemaVersion v : values()) { + if (v.namespace.equals(namespace)) { + return v; + } + } + return null; + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/Service.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/Service.java new file mode 100644 index 00000000..c3f30e48 --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/Service.java @@ -0,0 +1,171 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.model; + +import esa.mo.apigen.model.com.COMFeatures; +import esa.mo.apigen.model.docs.Documentation; +import esa.mo.apigen.model.types.TypeDefinition; +import java.util.ArrayList; +import java.util.List; + +/** + * A service. + *

                  + * {@code dataTypes} and {@code errors} at service level exist only in v001 + * specifications; v003 moved both to the area. + */ +public final class Service { + + private int number; + private String name; + private String comment; + + private boolean extended = false; + private Area area; + private final List capabilitySets = new ArrayList(); + private final List dataTypes = new ArrayList(); + private final List errors = new ArrayList(); + private COMFeatures com; + private Documentation documentation = new Documentation(); + private SourceLocation location; + + public int getNumber() { + return number; + } + + public void setNumber(int number) { + this.number = number; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + /** + * Returns true if the service was declared as a COM extended service. + *

                  + * Kept apart from the COM features it may declare: a service can be extended and + * declare no objects or events at all, and the generated code still has to say so. + * + * @return true if the service is a COM extended service. + */ + public boolean isExtended() { + return extended; + } + + public void setExtended(boolean extended) { + this.extended = extended; + } + + public String getComment() { + return comment; + } + + public void setComment(String comment) { + this.comment = comment; + } + + public Area getArea() { + return area; + } + + public void setArea(Area area) { + this.area = area; + } + + public List getCapabilitySets() { + return capabilitySets; + } + + /** + * Adds a capability set and sets its back-reference. + * + * @param set The capability set to add. + */ + public void addCapabilitySet(CapabilitySet set) { + set.setService(this); + capabilitySets.add(set); + } + + /** + * Returns every operation of the service, across all capability sets, in declaration + * order. + * + * @return the operations. + */ + public List getOperations() { + List all = new ArrayList(); + for (CapabilitySet set : capabilitySets) { + all.addAll(set.getOperations()); + } + return all; + } + + /** + * @return the types this service defines. v001 only. + */ + public List getDataTypes() { + return dataTypes; + } + + /** + * @return the errors this service defines. v001 only. + */ + public List getErrors() { + return errors; + } + + /** + * @return the COM features of the service, or null if it declares none. + */ + public COMFeatures getCom() { + return com; + } + + public void setCom(COMFeatures com) { + this.com = com; + } + + public Documentation getDocumentation() { + return documentation; + } + + public void setDocumentation(Documentation documentation) { + this.documentation = documentation; + } + + public SourceLocation getLocation() { + return location; + } + + public void setLocation(SourceLocation location) { + this.location = location; + } + + @Override + public String toString() { + return name + " [" + number + "]"; + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/SourceLocation.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/SourceLocation.java new file mode 100644 index 00000000..6e2c86b2 --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/SourceLocation.java @@ -0,0 +1,69 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.model; + +/** + * A position within a source, recorded by importers so that validation issues can point + * at the text that caused them. + */ +public final class SourceLocation { + + private final SourceRef source; + private final int line; + private final int column; + + public SourceLocation(SourceRef source, int line, int column) { + this.source = source; + this.line = line; + this.column = column; + } + + public SourceRef getSource() { + return source; + } + + /** + * @return the 1-based line number, or 0 if unknown. + */ + public int getLine() { + return line; + } + + /** + * @return the 1-based column number, or 0 if unknown. + */ + public int getColumn() { + return column; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append(source == null ? "" : source.getName()); + if (line > 0) { + buf.append(':').append(line); + if (column > 0) { + buf.append(':').append(column); + } + } + return buf.toString(); + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/SourceRef.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/SourceRef.java new file mode 100644 index 00000000..b4a512db --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/SourceRef.java @@ -0,0 +1,61 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.model; + +/** + * Where a specification came from. Provenance only: never written to any output format. + */ +public final class SourceRef { + + private final String name; + private final String location; + + /** + * Constructor. + * + * @param name A short name for the source, typically the file name. + * @param location The full location, or null when the source has no file behind it - + * text held in an editor, for instance. + */ + public SourceRef(String name, String location) { + this.name = name; + this.location = location; + } + + public String getName() { + return name; + } + + /** + * Returns the full location of the source, or null if it has none. Sidecar files - + * a MOSpec diagram, for example - are resolved relative to this. + * + * @return the location, may be null. + */ + public String getLocation() { + return location; + } + + @Override + public String toString() { + return name; + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/Specification.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/Specification.java new file mode 100644 index 00000000..2d2d8044 --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/Specification.java @@ -0,0 +1,92 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.model; + +import java.util.ArrayList; +import java.util.List; + +/** + * One specification - what a single file holds. + *

                  + * The list of areas stays a list even though every specification in the corpus contains + * exactly one: the schema allows more, and nothing may assume otherwise. + *

                  + * There is deliberately no flag saying whether this specification is to be generated. That + * is a property of a particular build, not of the file - the same specification is a + * generation target in one module and a reference in another - so the caller passes the + * areas it wants to {@code Generator.generate} instead. + */ +public final class Specification { + + private final List areas = new ArrayList(); + private SchemaVersion schemaVersion; + private String comment; + private SourceRef source; + + public List getAreas() { + return areas; + } + + /** + * Adds an area and sets its back-reference. + * + * @param area The area to add. + */ + public void addArea(Area area) { + area.setSpecification(this); + areas.add(area); + } + + /** + * @return which schema this specification conforms to. + */ + public SchemaVersion getSchemaVersion() { + return schemaVersion; + } + + public void setSchemaVersion(SchemaVersion schemaVersion) { + this.schemaVersion = schemaVersion; + } + + /** + * @return the comment carried on the specification element itself, or null. + */ + public String getComment() { + return comment; + } + + public void setComment(String comment) { + this.comment = comment; + } + + public SourceRef getSource() { + return source; + } + + public void setSource(SourceRef source) { + this.source = source; + } + + @Override + public String toString() { + return source == null ? "" : source.toString(); + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/com/COMFeatures.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/com/COMFeatures.java new file mode 100644 index 00000000..0218e082 --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/com/COMFeatures.java @@ -0,0 +1,101 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.model.com; + +import esa.mo.apigen.model.docs.Documentation; +import java.util.ArrayList; +import java.util.List; + +/** + * The COM features a service declares: its objects, its events, and how it expects the + * archive and activity tracking services to be used. + *

                  + * The comments on the object and event lists are not decoration - in the specifications + * they run to many sentences and carry the normative rules for the links. + */ +public final class COMFeatures { + + private String objectsComment; + private String eventsComment; + private final List objects = new ArrayList(); + private final List events = new ArrayList(); + private String archiveUsage; + private String activityUsage; + private Documentation documentation = new Documentation(); + + public String getObjectsComment() { + return objectsComment; + } + + public void setObjectsComment(String objectsComment) { + this.objectsComment = objectsComment; + } + + public String getEventsComment() { + return eventsComment; + } + + public void setEventsComment(String eventsComment) { + this.eventsComment = eventsComment; + } + + public List getObjects() { + return objects; + } + + public List getEvents() { + return events; + } + + public String getArchiveUsage() { + return archiveUsage; + } + + public void setArchiveUsage(String archiveUsage) { + this.archiveUsage = archiveUsage; + } + + public String getActivityUsage() { + return activityUsage; + } + + public void setActivityUsage(String activityUsage) { + this.activityUsage = activityUsage; + } + + public Documentation getDocumentation() { + return documentation; + } + + public void setDocumentation(Documentation documentation) { + this.documentation = documentation; + } + + /** + * @return true if nothing at all is declared. + */ + public boolean isEmpty() { + return objects.isEmpty() && events.isEmpty() + && archiveUsage == null && activityUsage == null + && objectsComment == null && eventsComment == null + && (documentation == null || documentation.isEmpty()); + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/com/COMObject.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/com/COMObject.java new file mode 100644 index 00000000..2f0830b8 --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/com/COMObject.java @@ -0,0 +1,106 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.model.com; + +import esa.mo.apigen.model.SourceLocation; +import esa.mo.apigen.model.types.TypeRef; + +/** + * A COM object or event. + *

                  + * Events use the same shape - the schema's event list holds elements of the same type - so + * an event is a COM object that happens to live in the events list. Object and event + * numbers share one namespace within a service. + */ +public final class COMObject { + + private String name; + private int number; + private String comment; + private TypeRef bodyType; + private ObjectLink related; + private ObjectLink source; + private SourceLocation location; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNumber() { + return number; + } + + public void setNumber(int number) { + this.number = number; + } + + public String getComment() { + return comment; + } + + public void setComment(String comment) { + this.comment = comment; + } + + /** + * @return the type of the object's body, or null if it has no body. + */ + public TypeRef getBodyType() { + return bodyType; + } + + public void setBodyType(TypeRef bodyType) { + this.bodyType = bodyType; + } + + public ObjectLink getRelated() { + return related; + } + + public void setRelated(ObjectLink related) { + this.related = related; + } + + public ObjectLink getSource() { + return source; + } + + public void setSource(ObjectLink source) { + this.source = source; + } + + public SourceLocation getLocation() { + return location; + } + + public void setLocation(SourceLocation location) { + this.location = location; + } + + @Override + public String toString() { + return name + " [" + number + "]"; + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/com/ObjectLink.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/com/ObjectLink.java new file mode 100644 index 00000000..de36da84 --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/com/ObjectLink.java @@ -0,0 +1,62 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.model.com; + +/** + * The related or source link of a COM object. + *

                  + * Either part may be absent, and in the specifications the commonest case by far is a + * comment with no target: the link is described in prose but not named. + */ +public final class ObjectLink { + + private String comment; + private ObjectReference target; + + /** + * @return prose describing the link, or null. + */ + public String getComment() { + return comment; + } + + public void setComment(String comment) { + this.comment = comment; + } + + /** + * @return the object pointed at, or null if the link is unspecified. + */ + public ObjectReference getTarget() { + return target; + } + + public void setTarget(ObjectReference target) { + this.target = target; + } + + /** + * @return true if the link carries neither a target nor a comment, and so says nothing. + */ + public boolean isEmpty() { + return target == null && (comment == null || comment.isEmpty()); + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/com/ObjectReference.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/com/ObjectReference.java new file mode 100644 index 00000000..326c7635 --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/com/ObjectReference.java @@ -0,0 +1,102 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.model.com; + +/** + * A reference to a COM object, by number. + *

                  + * The XML form - {@code } + * - identifies the target by number and carries no version, so the importer fills + * {@code areaVersion} in at link time exactly as it does for a type reference. The number + * is the truth; a name is a lookup, never the other way round, or a specification whose + * target area is absent could not be represented at all. + */ +public final class ObjectReference { + + private final String area; + private final int areaVersion; + private final String service; + private final int number; + + public ObjectReference(String area, int areaVersion, String service, int number) { + this.area = area; + this.areaVersion = areaVersion; + this.service = service; + this.number = number; + } + + public String getArea() { + return area; + } + + /** + * @return the version of the referenced area, or 0 if it has not been linked yet. + */ + public int getAreaVersion() { + return areaVersion; + } + + public String getService() { + return service; + } + + public int getNumber() { + return number; + } + + /** + * Returns a copy of this reference with the area version filled in. + * + * @param version The version of the referenced area. + * @return the linked reference. + */ + public ObjectReference withAreaVersion(int version) { + return new ObjectReference(area, version, service, number); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof ObjectReference)) { + return false; + } + ObjectReference other = (ObjectReference) o; + return number == other.number && areaVersion == other.areaVersion + && (area == null ? other.area == null : area.equals(other.area)) + && (service == null ? other.service == null : service.equals(other.service)); + } + + @Override + public int hashCode() { + int result = area == null ? 0 : area.hashCode(); + result = 31 * result + areaVersion; + result = 31 * result + (service == null ? 0 : service.hashCode()); + result = 31 * result + number; + return result; + } + + @Override + public String toString() { + return area + "::" + service + "#" + number; + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/docs/Diagram.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/docs/Diagram.java new file mode 100644 index 00000000..6a6c9dcf --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/docs/Diagram.java @@ -0,0 +1,68 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.model.docs; + +import esa.mo.apigen.model.SourceLocation; + +/** + * A diagram: a name and the SVG that draws it. + *

                  + * The SVG is held as text rather than parsed. In XML it is inline; in MOSpec it lives in a + * sidecar file next to the specification. + */ +public final class Diagram { + + private String name; + private String svg; + private SourceLocation location; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + /** + * @return the SVG document, as text. + */ + public String getSvg() { + return svg; + } + + public void setSvg(String svg) { + this.svg = svg; + } + + public SourceLocation getLocation() { + return location; + } + + public void setLocation(SourceLocation location) { + this.location = location; + } + + @Override + public String toString() { + return name; + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/docs/DocSection.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/docs/DocSection.java new file mode 100644 index 00000000..99d429fc --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/docs/DocSection.java @@ -0,0 +1,84 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.model.docs; + +import esa.mo.apigen.model.SourceLocation; + +/** + * One {@code } element, mirrored exactly so that XML round-trips + * unchanged - including the convention where a single section holds several requirements + * as prose. + *

                  + * The content is a small markup language of its own: lines that are exactly {@code

                    } + * or {@code
                  } open and close numbering levels, a line containing {@code
                • } becomes + * a list paragraph, and {@code
                    }/{@code
                  } are dropped. That behaviour is + * normative, reverse-engineered from the existing document writer. + */ +public final class DocSection { + + private String name; + private int order; + private String content; + private SourceLocation location; + + /** + * @return the section name, verbatim: "Requirement", "High Level Requirements", and so on. + */ + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getOrder() { + return order; + } + + public void setOrder(int order) { + this.order = order; + } + + /** + * @return the section body, or null when the element is empty. + */ + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public SourceLocation getLocation() { + return location; + } + + public void setLocation(SourceLocation location) { + this.location = location; + } + + @Override + public String toString() { + return name + " [" + order + "]"; + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/docs/Documentation.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/docs/Documentation.java new file mode 100644 index 00000000..3b7a1a46 --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/docs/Documentation.java @@ -0,0 +1,48 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.model.docs; + +import java.util.ArrayList; +import java.util.List; + +/** + * The documentation attached to an area, service, operation or COM feature set. + */ +public final class Documentation { + + private final List sections = new ArrayList(); + private final List diagrams = new ArrayList(); + + public List getSections() { + return sections; + } + + public List getDiagrams() { + return diagrams; + } + + /** + * @return true if there is nothing here at all. + */ + public boolean isEmpty() { + return sections.isEmpty() && diagrams.isEmpty(); + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/docs/Requirement.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/docs/Requirement.java new file mode 100644 index 00000000..3ab28757 --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/docs/Requirement.java @@ -0,0 +1,74 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.model.docs; + +import esa.mo.apigen.model.SourceLocation; + +/** + * A single normative statement, derived from a {@link DocSection} rather than stored. + * Because it is derived it never reaches an exporter and cannot affect a round trip. + *

                  + * {@link #getId()} is set only where the specification authored the number - the + * convention of one requirement per element, with {@code order} naming it. Where a section + * holds several statements as prose, their position is the only thing distinguishing them, + * so no identifier is claimed: inserting a sentence would renumber everything after it. + */ +public final class Requirement { + + private final String id; + private final String text; + private final DocSection origin; + private final SourceLocation location; + + public Requirement(String id, String text, DocSection origin, SourceLocation location) { + this.id = id; + this.text = text; + this.origin = origin; + this.location = location; + } + + /** + * @return the authored identifier, or null when the source did not provide one. + */ + public String getId() { + return id; + } + + public String getText() { + return text; + } + + /** + * @return the documentation section this requirement was taken from. + */ + public DocSection getOrigin() { + return origin; + } + + public SourceLocation getLocation() { + return location; + } + + @Override + public String toString() { + return (id == null ? "(unnumbered)" : id) + ": " + text; + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/types/AttributeType.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/types/AttributeType.java new file mode 100644 index 00000000..0eff1a03 --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/types/AttributeType.java @@ -0,0 +1,42 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.model.types; + +/** + * An attribute type - one of the MAL's primitive types, such as Blob or Identifier. + */ +public final class AttributeType extends TypeDefinition { + + private int shortFormPart; + + public int getShortFormPart() { + return shortFormPart; + } + + public void setShortFormPart(int shortFormPart) { + this.shortFormPart = shortFormPart; + } + + @Override + public boolean isAbstract() { + return false; + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/types/CompositeType.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/types/CompositeType.java new file mode 100644 index 00000000..28e1f3ef --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/types/CompositeType.java @@ -0,0 +1,77 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.model.types; + +import esa.mo.apigen.model.Field; +import java.util.ArrayList; +import java.util.List; + +/** + * A structured type with named fields. + *

                  + * A composite with no short form part is abstract. That is the only thing which makes it + * abstract: the schema states it outright, and a short form part of 0 was never legal + * (the type is restricted to 1 and above in every schema version). + *

                  + * {@link #getSuperType()} is never null once the specification has been imported. The XML + * may omit {@code }, which the schema defines as implying the base Composite; the + * importer resolves that, so no reader has to know the rule. + */ +public final class CompositeType extends TypeDefinition { + + private Integer shortFormPart; + private TypeRef superType; + private final List fields = new ArrayList(); + + /** + * @return the short form part, or null if the composite is abstract. + */ + public Integer getShortFormPart() { + return shortFormPart; + } + + public void setShortFormPart(Integer shortFormPart) { + this.shortFormPart = shortFormPart; + } + + /** + * @return the type this composite extends. Never null after import. + */ + public TypeRef getSuperType() { + return superType; + } + + public void setSuperType(TypeRef superType) { + this.superType = superType; + } + + /** + * @return the fields this composite declares, not including inherited ones. + */ + public List getFields() { + return fields; + } + + @Override + public boolean isAbstract() { + return shortFormPart == null; + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/types/EnumerationItem.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/types/EnumerationItem.java new file mode 100644 index 00000000..a902049c --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/types/EnumerationItem.java @@ -0,0 +1,74 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.model.types; + +import esa.mo.apigen.model.SourceLocation; + +/** + * One value of an {@link EnumerationType}. + */ +public final class EnumerationItem { + + private String value; + private long numericValue; + private String comment; + private SourceLocation location; + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + /** + * @return the numeric value carried on the wire. + */ + public long getNumericValue() { + return numericValue; + } + + public void setNumericValue(long numericValue) { + this.numericValue = numericValue; + } + + public String getComment() { + return comment; + } + + public void setComment(String comment) { + this.comment = comment; + } + + public SourceLocation getLocation() { + return location; + } + + public void setLocation(SourceLocation location) { + this.location = location; + } + + @Override + public String toString() { + return value + " [" + numericValue + "]"; + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/types/EnumerationType.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/types/EnumerationType.java new file mode 100644 index 00000000..c4ac0d7c --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/types/EnumerationType.java @@ -0,0 +1,50 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.model.types; + +import java.util.ArrayList; +import java.util.List; + +/** + * An enumeration. + */ +public final class EnumerationType extends TypeDefinition { + + private int shortFormPart; + private final List items = new ArrayList(); + + public int getShortFormPart() { + return shortFormPart; + } + + public void setShortFormPart(int shortFormPart) { + this.shortFormPart = shortFormPart; + } + + public List getItems() { + return items; + } + + @Override + public boolean isAbstract() { + return false; + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/types/FundamentalType.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/types/FundamentalType.java new file mode 100644 index 00000000..7a270f20 --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/types/FundamentalType.java @@ -0,0 +1,46 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.model.types; + +/** + * A fundamental type. Only Element, Attribute and Composite are fundamental, and only the + * MAL area may define them. Always abstract. + */ +public final class FundamentalType extends TypeDefinition { + + private TypeRef superType; + + /** + * @return the type this one extends, or null if it extends nothing. + */ + public TypeRef getSuperType() { + return superType; + } + + public void setSuperType(TypeRef superType) { + this.superType = superType; + } + + @Override + public boolean isAbstract() { + return true; + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/types/TypeDefinition.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/types/TypeDefinition.java new file mode 100644 index 00000000..cb1a2aa4 --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/types/TypeDefinition.java @@ -0,0 +1,96 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.model.types; + +import esa.mo.apigen.model.Area; +import esa.mo.apigen.model.Service; +import esa.mo.apigen.model.SourceLocation; + +/** + * Base of every type a specification defines. + *

                  + * The owning area and service are held as back-references rather than as names, so that + * the defining area's version is directly available and there is no second copy of the + * name to keep consistent. + */ +public abstract class TypeDefinition { + + private String name; + private String comment; + private Area area; + private Service service; + private SourceLocation location; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getComment() { + return comment; + } + + public void setComment(String comment) { + this.comment = comment; + } + + public Area getArea() { + return area; + } + + public void setArea(Area area) { + this.area = area; + } + + /** + * @return the service that defines this type, or null for an area-level type. + */ + public Service getService() { + return service; + } + + public void setService(Service service) { + this.service = service; + } + + public SourceLocation getLocation() { + return location; + } + + public void setLocation(SourceLocation location) { + this.location = location; + } + + /** + * Returns true if the type cannot be instantiated, and so has no short form part. + * + * @return true if abstract. + */ + public abstract boolean isAbstract(); + + @Override + public String toString() { + return getClass().getSimpleName() + " " + name; + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/types/TypeRef.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/types/TypeRef.java new file mode 100644 index 00000000..9bd562f0 --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/types/TypeRef.java @@ -0,0 +1,167 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.model.types; + +/** + * A reference to a type, resolved at link time. + *

                  + * The XML form carries no version - {@code } does not + * say which MAL - so the importer fills {@code areaVersion} in from the area actually + * loaded. Keeping it inside the reference is what lets the same name in two versions of + * an area compare unequal, and is why resolution needs no lookup context. See the design + * document, section 4.1. + *

                  + * {@code service} exists only in v001 specifications, {@code objectRef} only in v003. + */ +public final class TypeRef { + + private final String area; + private final int areaVersion; + private final String service; + private final String name; + private final boolean list; + private final boolean objectRef; + + public TypeRef(String area, int areaVersion, String service, String name, + boolean list, boolean objectRef) { + this.area = area; + this.areaVersion = areaVersion; + this.service = service; + this.name = name; + this.list = list; + this.objectRef = objectRef; + } + + public String getArea() { + return area; + } + + /** + * @return the version of the referenced area, or 0 if it has not been linked yet. + */ + public int getAreaVersion() { + return areaVersion; + } + + /** + * @return the service that owns the type, or null for an area-level type. + */ + public String getService() { + return service; + } + + public String getName() { + return name; + } + + public boolean isList() { + return list; + } + + public boolean isObjectRef() { + return objectRef; + } + + /** + * Returns the reference this one really names, unwrapping the older spelling of an + * object reference. + *

                  + * Most specifications mark an object reference with {@code objectRef="true"}, but the + * Mission Product Distribution area writes the target into the name instead, as + * {@code ObjectRef(Product)}. Both mean the same thing. + * + * @return this reference, or the reference it spells out. + */ + public TypeRef unwrapped() { + if (name != null && name.startsWith("ObjectRef(") && name.endsWith(")")) { + return new TypeRef(area, areaVersion, service, + name.substring("ObjectRef(".length(), name.length() - 1), list, true); + } + return this; + } + + /** + * Returns a copy of this reference with the area version filled in. + * + * @param version The version of the referenced area. + * @return the linked reference. + */ + public TypeRef withAreaVersion(int version) { + return new TypeRef(area, version, service, name, list, objectRef); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof TypeRef)) { + return false; + } + TypeRef other = (TypeRef) o; + return areaVersion == other.areaVersion + && list == other.list + && objectRef == other.objectRef + && eq(area, other.area) && eq(service, other.service) && eq(name, other.name); + } + + private static boolean eq(String a, String b) { + return a == null ? b == null : a.equals(b); + } + + @Override + public int hashCode() { + int result = area == null ? 0 : area.hashCode(); + result = 31 * result + areaVersion; + result = 31 * result + (service == null ? 0 : service.hashCode()); + result = 31 * result + (name == null ? 0 : name.hashCode()); + result = 31 * result + (list ? 1 : 0); + result = 31 * result + (objectRef ? 1 : 0); + return result; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + if (list) { + buf.append("List<"); + } + if (objectRef) { + buf.append("ObjectRef<"); + } + buf.append(area); + if (areaVersion > 0) { + buf.append('.').append(areaVersion); + } + buf.append("::"); + if (service != null) { + buf.append(service).append('.'); + } + buf.append(name); + if (objectRef) { + buf.append('>'); + } + if (list) { + buf.append('>'); + } + return buf.toString(); + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/validation/Severity.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/validation/Severity.java new file mode 100644 index 00000000..b2f128bf --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/validation/Severity.java @@ -0,0 +1,38 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.validation; + +/** + * How much a validation issue matters. + *

                  + * Severity is a property of the rule, not of the category, so individual rules can be + * tightened as the specifications are cleaned up. + */ +public enum Severity { + /** + * Generation does not start. Every error found is reported, not just the first. + */ + ERROR, + /** + * Reported; generation proceeds. + */ + WARNING +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/validation/ValidationIssue.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/validation/ValidationIssue.java new file mode 100644 index 00000000..d0d74484 --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/validation/ValidationIssue.java @@ -0,0 +1,70 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.validation; + +import esa.mo.apigen.model.SourceLocation; + +/** + * One problem found in a model. + */ +public final class ValidationIssue { + + private final Severity severity; + private final String rule; + private final String message; + private final SourceLocation location; + + public ValidationIssue(Severity severity, String rule, String message, SourceLocation location) { + this.severity = severity; + this.rule = rule; + this.message = message; + this.location = location; + } + + public Severity getSeverity() { + return severity; + } + + /** + * @return a short identifier for the rule that fired, so issues can be grouped or + * suppressed by rule rather than by message text. + */ + public String getRule() { + return rule; + } + + public String getMessage() { + return message; + } + + /** + * @return where the problem is, or null if it cannot be pinned to a location. + */ + public SourceLocation getLocation() { + return location; + } + + @Override + public String toString() { + return severity + " [" + rule + "] " + + (location == null ? "" : location + ": ") + message; + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/validation/ValidationResult.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/validation/ValidationResult.java new file mode 100644 index 00000000..43494f4b --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/validation/ValidationResult.java @@ -0,0 +1,89 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.validation; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * Everything one validation run found. + *

                  + * All issues are collected before anything stops, which matters for the editor as much as + * for the build: a user wants every problem in a file highlighted at once, not a + * fix-one-recompile loop. + */ +public final class ValidationResult { + + private final List issues = new ArrayList(); + + public void add(ValidationIssue issue) { + issues.add(issue); + } + + public List getIssues() { + return Collections.unmodifiableList(issues); + } + + /** + * Returns the issues of one severity. + * + * @param severity The severity to filter on. + * @return the matching issues. + */ + public List getIssues(Severity severity) { + List found = new ArrayList(); + for (ValidationIssue issue : issues) { + if (issue.getSeverity() == severity) { + found.add(issue); + } + } + return found; + } + + /** + * @return true if anything at all was reported. + */ + public boolean hasIssues() { + return !issues.isEmpty(); + } + + /** + * @return true if generation must not start. + */ + public boolean hasErrors() { + for (ValidationIssue issue : issues) { + if (issue.getSeverity() == Severity.ERROR) { + return true; + } + } + return false; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + for (ValidationIssue issue : issues) { + buf.append(issue).append(System.getProperty("line.separator")); + } + return buf.toString(); + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/validation/Validator.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/validation/Validator.java new file mode 100644 index 00000000..ea335cee --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/validation/Validator.java @@ -0,0 +1,425 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.validation; + +import esa.mo.apigen.model.Area; +import esa.mo.apigen.model.CapabilitySet; +import esa.mo.apigen.model.ErrorDefinition; +import esa.mo.apigen.model.Field; +import esa.mo.apigen.model.MOModel; +import esa.mo.apigen.model.MessageBody; +import esa.mo.apigen.model.Operation; +import esa.mo.apigen.model.SchemaVersion; +import esa.mo.apigen.model.Service; +import esa.mo.apigen.model.Specification; +import esa.mo.apigen.model.com.COMFeatures; +import esa.mo.apigen.model.com.COMObject; +import esa.mo.apigen.model.com.ObjectLink; +import esa.mo.apigen.model.types.CompositeType; +import esa.mo.apigen.model.types.TypeDefinition; +import esa.mo.apigen.model.types.TypeRef; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * Checks a model, reporting everything it finds rather than stopping at the first problem. + *

                  + * Only rules the schema cannot express belong here. Anything the XSD already states - + * that a short form part is at least 1, for instance - is left to schema validation on + * export, so there is one source of truth for it. + */ +public final class Validator { + + private static final String MAL = "MAL"; + + /** + * Validates a model. + * + * @param model The model to check. + * @return everything found. + */ + public ValidationResult validate(MOModel model) { + ValidationResult result = new ValidationResult(); + checkAreaIdentities(model, result); + for (Specification spec : model.getSpecifications()) { + checkMalGeneration(model, spec, result); + for (Area area : spec.getAreas()) { + checkArea(model, spec, area, result); + } + } + return result; + } + + /** + * Reports a specification being built against a MAL of a different generation than + * its own. + *

                  + * A specification says which generation it belongs to by its namespace, and names its + * errors accordingly: v001 raises UNKNOWN, v003 raises Unknown. Give it the MAL of its + * own generation and every reference resolves. Give it the other one and none of the + * renamed errors does - so this is said once, for the specification, rather than once + * for each name that fails to match. + */ + private void checkMalGeneration(MOModel model, Specification spec, ValidationResult result) { + if (spec.getSchemaVersion() == null || spec.getAreas().isEmpty()) { + return; + } + int wanted = spec.getSchemaVersion().getMalVersion(); + if (model.findArea(MAL, wanted) != null || model.findAreas(MAL).isEmpty()) { + return; + } + Area loaded = model.findUniqueArea(MAL); + if (loaded == null || loaded.getVersion() == wanted) { + return; + } + result.add(new ValidationIssue(Severity.WARNING, "specification.malGeneration", + "This specification is written against the " + spec.getSchemaVersion() + + " schema, so it names the errors of MAL " + wanted + ", but is built " + + "against MAL " + loaded.getVersion() + ", which names them differently", + spec.getAreas().get(0).getLocation())); + } + + // ---------------------------------------------------------------- areas + + private void checkAreaIdentities(MOModel model, ValidationResult result) { + for (Area area : model.getConflictingAreas()) { + Area existing = model.findArea(area.getKey()); + result.add(new ValidationIssue(Severity.WARNING, "area.identity.duplicate", + "Area " + area.getKey() + " is declared twice: in " + + describe(existing) + " and in " + describe(area) + + ". Only the first is indexed.", area.getLocation())); + } + Map byNumber = new HashMap(); + for (Area area : model.getAreas()) { + Area clash = byNumber.put(area.getNumber(), area); + if (clash != null && !String.valueOf(clash.getName()).equals(area.getName())) { + result.add(new ValidationIssue(Severity.WARNING, "area.number.reused", + "Area number " + area.getNumber() + " is used by both '" + + clash.getName() + "' and '" + area.getName() + "'.", + area.getLocation())); + } + } + } + + private static String describe(Area area) { + if (area == null || area.getSpecification() == null + || area.getSpecification().getSource() == null) { + return ""; + } + return area.getSpecification().getSource().getName(); + } + + private void checkArea(MOModel model, Specification spec, Area area, ValidationResult result) { + Set serviceNames = new HashSet(); + Set serviceNumbers = new HashSet(); + for (Service service : area.getServices()) { + if (!serviceNames.add(service.getName())) { + result.add(issue(Severity.ERROR, "service.name.duplicate", + "Duplicate service name '" + service.getName() + "' in area " + + area.getName(), service.getLocation())); + } + if (!serviceNumbers.add(service.getNumber())) { + result.add(issue(Severity.ERROR, "service.number.duplicate", + "Duplicate service number " + service.getNumber() + " in area " + + area.getName(), service.getLocation())); + } + checkService(model, spec, service, result); + } + checkTypes(model, area.getDataTypes(), result); + checkErrors(area.getErrors(), "area " + area.getName(), result); + } + + // ------------------------------------------------------------- services + + private void checkService(MOModel model, Specification spec, Service service, + ValidationResult result) { + if (spec.getSchemaVersion() == SchemaVersion.V003) { + if (!service.getDataTypes().isEmpty()) { + result.add(issue(Severity.ERROR, "version.serviceDataTypes", + "Service-level data types are not part of the v003 schema; " + + "v003 declares all types at area level", service.getLocation())); + } + if (!service.getErrors().isEmpty()) { + result.add(issue(Severity.ERROR, "version.serviceErrors", + "Service-level errors are not part of the v003 schema", + service.getLocation())); + } + } + + Set capabilityNumbers = new HashSet(); + Set operationNames = new HashSet(); + Set operationNumbers = new HashSet(); + for (CapabilitySet set : service.getCapabilitySets()) { + if (!capabilityNumbers.add(set.getNumber())) { + result.add(issue(Severity.ERROR, "capability.number.duplicate", + "Duplicate capability set number " + set.getNumber() + + " in service " + service.getName(), set.getLocation())); + } + for (Operation op : set.getOperations()) { + if (!operationNames.add(op.getName())) { + result.add(issue(Severity.ERROR, "operation.name.duplicate", + "Duplicate operation name '" + op.getName() + "' in service " + + service.getName(), op.getLocation())); + } + if (!operationNumbers.add(op.getNumber())) { + result.add(issue(Severity.ERROR, "operation.number.duplicate", + "Duplicate operation number " + op.getNumber() + + " in service " + service.getName(), op.getLocation())); + } + checkOperation(model, spec, op, result); + } + } + checkTypes(model, service.getDataTypes(), result); + checkErrors(service.getErrors(), "service " + service.getName(), result); + if (service.getCom() != null) { + checkCom(model, service, service.getCom(), result); + } + } + + // ----------------------------------------------------------- operations + + private void checkOperation(MOModel model, Specification spec, Operation op, + ValidationResult result) { + if (op.getPattern() == null) { + result.add(issue(Severity.ERROR, "operation.pattern.missing", + "Operation '" + op.getName() + "' has no interaction pattern", + op.getLocation())); + return; + } + for (Map.Entry entry + : op.getMessages().entrySet()) { + if (!op.getPattern().hasStage(entry.getKey())) { + result.add(issue(Severity.ERROR, "operation.stage.unexpected", + "Operation '" + op.getName() + "' is a " + op.getPattern() + + " but carries a " + entry.getKey() + " message", op.getLocation())); + } + for (Field field : entry.getValue().getFields()) { + checkType(model, field.getType(), "field '" + field.getName() + + "' of operation '" + op.getName() + "'", field.getLocation(), result); + } + } + if (spec.getSchemaVersion() == SchemaVersion.V003 && op.isSupportInReplay()) { + result.add(issue(Severity.ERROR, "version.supportInReplay", + "supportInReplay is not part of the v003 schema", op.getLocation())); + } + if (spec.getSchemaVersion() == SchemaVersion.V001 + && op.getDocumentation() != null && !op.getDocumentation().isEmpty()) { + result.add(issue(Severity.ERROR, "version.operationDocumentation", + "Operation-level documentation is not part of the v001 schema", + op.getLocation())); + } + for (esa.mo.apigen.model.ErrorReference ref : op.getErrors()) { + checkError(model, ref.getError(), "operation '" + op.getName() + "'", + ref.getLocation(), result); + // The extra information an error carries is an ordinary type. + if (ref.getExtraInformation() != null) { + checkType(model, ref.getExtraInformation().getType(), + "extra information of an error of operation '" + op.getName() + "'", + ref.getLocation(), result); + } + } + } + + // ---------------------------------------------------------------- types + + private void checkTypes(MOModel model, List types, ValidationResult result) { + for (TypeDefinition type : types) { + if (type instanceof CompositeType) { + CompositeType composite = (CompositeType) type; + if (composite.getSuperType() == null) { + result.add(issue(Severity.ERROR, "composite.superType.missing", + "Composite '" + composite.getName() + "' has no super type; " + + "the implied base Composite should have been resolved at import", + composite.getLocation())); + } else { + checkType(model, composite.getSuperType(), + "super type of '" + composite.getName() + "'", + composite.getLocation(), result); + } + for (Field field : composite.getFields()) { + checkType(model, field.getType(), "field '" + field.getName() + + "' of '" + composite.getName() + "'", field.getLocation(), result); + } + } + } + } + + /** + * Checks that an error reference names an error that exists. Errors live in their own + * namespace, so they are resolved separately from types. + */ + private void checkError(MOModel model, TypeRef ref, String what, + esa.mo.apigen.model.SourceLocation location, ValidationResult result) { + if (ref == null) { + result.add(issue(Severity.ERROR, "error.missing", + "No error given for " + what, location)); + return; + } + if (ref.getAreaVersion() == 0) { + result.add(issue(Severity.ERROR, "error.unlinked", + "Error " + ref + " raised by " + what + " was never linked to an area version", + location)); + return; + } + if (model.resolveError(ref) == null) { + // A warning rather than an error. The MAL renamed its errors between v001 and + // v003 - UNKNOWN became Unknown - because v001 treated them as error codes and + // v003 treats them as exceptions. A specification of one generation given the + // MAL of the other therefore names errors the loaded MAL does not declare, and + // the build has always done exactly that without harm. + String renamed = renaming(model, ref); + if (!renamed.isEmpty()) { + // The generation gap accounts for it, and is reported once above. + return; + } + result.add(issue(Severity.WARNING, "error.unresolved", + "Cannot resolve error " + ref + " raised by " + what, location)); + } + } + + /** + * Looks for an error the target area declares under a different convention, so that + * the warning says what was probably meant rather than only what was not found. + */ + private String renaming(MOModel model, TypeRef ref) { + Area area = model.findArea(ref.getArea(), ref.getAreaVersion()); + if (area == null) { + return ""; + } + String wanted = flatten(ref.getName()); + for (ErrorDefinition error : allErrorsOf(area)) { + if (flatten(error.getName()).equals(wanted)) { + return "; the area declares it as '" + error.getName() + "'"; + } + } + return ""; + } + + private static List allErrorsOf(Area area) { + List all = new java.util.ArrayList(area.getErrors()); + for (Service service : area.getServices()) { + all.addAll(service.getErrors()); + } + return all; + } + + /** + * Reduces a name to what it says, ignoring how it is spelled: UNKNOWN, Unknown and + * "Too Many" against TOO_MANY. + */ + private static String flatten(String name) { + return name == null ? "" : name.replace("_", "").replace(" ", "").toLowerCase(); + } + + private void checkType(MOModel model, TypeRef ref, String what, + esa.mo.apigen.model.SourceLocation location, ValidationResult result) { + if (ref == null) { + result.add(issue(Severity.ERROR, "type.missing", "No type given for " + what, location)); + return; + } + if (ref.getAreaVersion() == 0) { + result.add(issue(Severity.ERROR, "type.unlinked", + "Type " + ref + " used by " + what + " was never linked to an area version", + location)); + return; + } + if (model.resolve(ref) == null) { + result.add(issue(Severity.ERROR, "type.unresolved", + "Cannot resolve type " + ref + " used by " + what, location)); + } + } + + // --------------------------------------------------------------- errors + + private void checkErrors(List errors, String owner, ValidationResult result) { + Set numbers = new HashSet(); + Set names = new HashSet(); + for (ErrorDefinition error : errors) { + if (!numbers.add(error.getNumber())) { + result.add(issue(Severity.ERROR, "error.number.duplicate", + "Duplicate error number " + error.getNumber() + " in " + owner, + error.getLocation())); + } + if (!names.add(error.getName())) { + result.add(issue(Severity.ERROR, "error.name.duplicate", + "Duplicate error name '" + error.getName() + "' in " + owner, + error.getLocation())); + } + } + } + + // ------------------------------------------------------------------ COM + + private void checkCom(MOModel model, Service service, COMFeatures com, + ValidationResult result) { + // Objects and events share one numbering space within a service: the schema's + // uniqueness constraint selects both lists on a single number field. + Set numbers = new HashSet(); + checkComObjects(model, service, com.getObjects(), "object", numbers, result); + checkComObjects(model, service, com.getEvents(), "event", numbers, result); + } + + private void checkComObjects(MOModel model, Service service, List objects, + String kind, Set numbers, ValidationResult result) { + for (COMObject object : objects) { + if (!numbers.add(object.getNumber())) { + result.add(issue(Severity.ERROR, "com.number.duplicate", + "COM " + kind + " '" + object.getName() + "' reuses number " + + object.getNumber() + " in service " + service.getName() + + "; objects and events share one numbering space", + object.getLocation())); + } + if (object.getBodyType() != null) { + checkType(model, object.getBodyType(), "body of COM " + kind + " '" + + object.getName() + "'", object.getLocation(), result); + } + checkLink(model, object, object.getRelated(), "related", result); + checkLink(model, object, object.getSource(), "source", result); + } + } + + private void checkLink(MOModel model, COMObject object, ObjectLink link, String which, + ValidationResult result) { + if (link == null) { + return; + } + if (link.isEmpty()) { + result.add(issue(Severity.WARNING, "com.link.empty", + "The " + which + " link of '" + object.getName() + + "' has neither a target nor a comment, and so says nothing", + object.getLocation())); + return; + } + if (link.getTarget() != null && model.resolve(link.getTarget()) == null) { + result.add(issue(Severity.ERROR, "com.link.unresolved", + "Cannot resolve the " + which + " link of '" + object.getName() + + "': " + link.getTarget(), object.getLocation())); + } + } + + private static ValidationIssue issue(Severity severity, String rule, String message, + esa.mo.apigen.model.SourceLocation location) { + return new ValidationIssue(severity, rule, message, location); + } +} diff --git a/api-generator/api-generator-lib/src/test/java/esa/mo/apigen/exporters/xml/ModelComparison.java b/api-generator/api-generator-lib/src/test/java/esa/mo/apigen/exporters/xml/ModelComparison.java new file mode 100644 index 00000000..c8e2bb87 --- /dev/null +++ b/api-generator/api-generator-lib/src/test/java/esa/mo/apigen/exporters/xml/ModelComparison.java @@ -0,0 +1,293 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.exporters.xml; + +import esa.mo.apigen.model.*; +import esa.mo.apigen.model.com.COMFeatures; +import esa.mo.apigen.model.com.COMObject; +import esa.mo.apigen.model.com.ObjectLink; +import esa.mo.apigen.model.docs.Diagram; +import esa.mo.apigen.model.docs.DocSection; +import esa.mo.apigen.model.docs.Documentation; +import esa.mo.apigen.model.types.*; +import java.util.ArrayList; +import java.util.List; + +/** + * Compares two models field by field, describing every difference. + *

                  + * The round-trip test needs to know not merely that two models differ but where, or a + * failure says nothing useful about which importer or exporter is at fault. + */ +public final class ModelComparison { + + private final List differences = new ArrayList(); + + public List getDifferences() { + return differences; + } + + public boolean isEqual() { + return differences.isEmpty(); + } + + private void diff(String where, Object a, Object b) { + if (a == null ? b != null : !a.equals(b)) { + differences.add(where + ": " + a + " != " + b); + } + } + + private boolean sizes(String where, List a, List b) { + if (a.size() != b.size()) { + differences.add(where + ": " + a.size() + " entries != " + b.size()); + return false; + } + return true; + } + + public void compare(Specification a, Specification b) { + diff("schemaVersion", a.getSchemaVersion(), b.getSchemaVersion()); + diff("comment", a.getComment(), b.getComment()); + if (sizes("areas", a.getAreas(), b.getAreas())) { + for (int i = 0; i < a.getAreas().size(); i++) { + compareArea(a.getAreas().get(i), b.getAreas().get(i)); + } + } + } + + private void compareArea(Area a, Area b) { + String at = "area " + a.getName(); + diff(at + ".name", a.getName(), b.getName()); + diff(at + ".number", a.getNumber(), b.getNumber()); + diff(at + ".version", a.getVersion(), b.getVersion()); + diff(at + ".comment", a.getComment(), b.getComment()); + compareDocs(at, a.getDocumentation(), b.getDocumentation()); + compareTypes(at, a.getDataTypes(), b.getDataTypes()); + compareErrorDefs(at, a.getErrors(), b.getErrors()); + if (sizes(at + ".services", a.getServices(), b.getServices())) { + for (int i = 0; i < a.getServices().size(); i++) { + compareService(at, a.getServices().get(i), b.getServices().get(i)); + } + } + } + + private void compareService(String parent, Service a, Service b) { + String at = parent + "/service " + a.getName(); + diff(at + ".name", a.getName(), b.getName()); + diff(at + ".number", a.getNumber(), b.getNumber()); + diff(at + ".comment", a.getComment(), b.getComment()); + compareDocs(at, a.getDocumentation(), b.getDocumentation()); + compareTypes(at, a.getDataTypes(), b.getDataTypes()); + compareErrorDefs(at, a.getErrors(), b.getErrors()); + compareCom(at, a.getCom(), b.getCom()); + if (sizes(at + ".capabilitySets", a.getCapabilitySets(), b.getCapabilitySets())) { + for (int i = 0; i < a.getCapabilitySets().size(); i++) { + CapabilitySet x = a.getCapabilitySets().get(i); + CapabilitySet y = b.getCapabilitySets().get(i); + diff(at + ".capability.number", x.getNumber(), y.getNumber()); + diff(at + ".capability.comment", x.getComment(), y.getComment()); + if (sizes(at + ".operations", x.getOperations(), y.getOperations())) { + for (int j = 0; j < x.getOperations().size(); j++) { + compareOperation(at, x.getOperations().get(j), y.getOperations().get(j)); + } + } + } + } + } + + private void compareOperation(String parent, Operation a, Operation b) { + String at = parent + "/op " + a.getName(); + diff(at + ".name", a.getName(), b.getName()); + diff(at + ".number", a.getNumber(), b.getNumber()); + diff(at + ".pattern", a.getPattern(), b.getPattern()); + diff(at + ".comment", a.getComment(), b.getComment()); + diff(at + ".supportInReplay", a.isSupportInReplay(), b.isSupportInReplay()); + compareDocs(at, a.getDocumentation(), b.getDocumentation()); + diff(at + ".stages", a.getMessages().keySet(), b.getMessages().keySet()); + for (InteractionStage stage : a.getMessages().keySet()) { + MessageBody x = a.getMessage(stage); + MessageBody y = b.getMessage(stage); + if (y == null) { + differences.add(at + "." + stage + ": missing"); + continue; + } + diff(at + "." + stage + ".comment", x.getComment(), y.getComment()); + compareFields(at + "." + stage, x.getFields(), y.getFields()); + } + if (sizes(at + ".errors", a.getErrors(), b.getErrors())) { + for (int i = 0; i < a.getErrors().size(); i++) { + ErrorReference x = a.getErrors().get(i); + ErrorReference y = b.getErrors().get(i); + diff(at + ".error.type", x.getError(), y.getError()); + diff(at + ".error.comment", x.getComment(), y.getComment()); + compareField(at + ".error.extra", x.getExtraInformation(), y.getExtraInformation()); + } + } + } + + private void compareFields(String at, List a, List b) { + if (sizes(at + ".fields", a, b)) { + for (int i = 0; i < a.size(); i++) { + compareField(at + ".field[" + i + "]", a.get(i), b.get(i)); + } + } + } + + private void compareField(String at, Field a, Field b) { + if (a == null || b == null) { + if (a != b) { + differences.add(at + ": " + (a == null ? "absent" : "present") + " != " + + (b == null ? "absent" : "present")); + } + return; + } + diff(at + ".name", a.getName(), b.getName()); + diff(at + ".comment", a.getComment(), b.getComment()); + diff(at + ".canBeNull", a.isCanBeNull(), b.isCanBeNull()); + diff(at + ".type", a.getType(), b.getType()); + } + + private void compareTypes(String at, List a, List b) { + if (!sizes(at + ".dataTypes", a, b)) { + return; + } + for (int i = 0; i < a.size(); i++) { + TypeDefinition x = a.get(i); + TypeDefinition y = b.get(i); + String where = at + "/type " + x.getName(); + diff(where + ".class", x.getClass().getName(), y.getClass().getName()); + diff(where + ".name", x.getName(), y.getName()); + diff(where + ".comment", x.getComment(), y.getComment()); + if (x instanceof CompositeType && y instanceof CompositeType) { + CompositeType cx = (CompositeType) x; + CompositeType cy = (CompositeType) y; + diff(where + ".shortFormPart", cx.getShortFormPart(), cy.getShortFormPart()); + diff(where + ".superType", cx.getSuperType(), cy.getSuperType()); + compareFields(where, cx.getFields(), cy.getFields()); + } else if (x instanceof EnumerationType && y instanceof EnumerationType) { + EnumerationType ex = (EnumerationType) x; + EnumerationType ey = (EnumerationType) y; + diff(where + ".shortFormPart", ex.getShortFormPart(), ey.getShortFormPart()); + if (sizes(where + ".items", ex.getItems(), ey.getItems())) { + for (int j = 0; j < ex.getItems().size(); j++) { + EnumerationItem ix = ex.getItems().get(j); + EnumerationItem iy = ey.getItems().get(j); + diff(where + ".item.value", ix.getValue(), iy.getValue()); + diff(where + ".item.nvalue", ix.getNumericValue(), iy.getNumericValue()); + diff(where + ".item.comment", ix.getComment(), iy.getComment()); + } + } + } else if (x instanceof AttributeType && y instanceof AttributeType) { + diff(where + ".shortFormPart", ((AttributeType) x).getShortFormPart(), + ((AttributeType) y).getShortFormPart()); + } else if (x instanceof FundamentalType && y instanceof FundamentalType) { + diff(where + ".superType", ((FundamentalType) x).getSuperType(), + ((FundamentalType) y).getSuperType()); + } + } + } + + private void compareErrorDefs(String at, List a, List b) { + if (!sizes(at + ".errors", a, b)) { + return; + } + for (int i = 0; i < a.size(); i++) { + ErrorDefinition x = a.get(i); + ErrorDefinition y = b.get(i); + diff(at + ".error.name", x.getName(), y.getName()); + diff(at + ".error.number", x.getNumber(), y.getNumber()); + diff(at + ".error.comment", x.getComment(), y.getComment()); + compareField(at + ".error.extra", x.getExtraInformation(), y.getExtraInformation()); + } + } + + private void compareCom(String at, COMFeatures a, COMFeatures b) { + if (a == null || b == null) { + if (a != b) { + differences.add(at + ".com: " + (a == null ? "absent" : "present") + " != " + + (b == null ? "absent" : "present")); + } + return; + } + diff(at + ".com.objectsComment", a.getObjectsComment(), b.getObjectsComment()); + diff(at + ".com.eventsComment", a.getEventsComment(), b.getEventsComment()); + diff(at + ".com.archiveUsage", a.getArchiveUsage(), b.getArchiveUsage()); + diff(at + ".com.activityUsage", a.getActivityUsage(), b.getActivityUsage()); + compareDocs(at + ".com", a.getDocumentation(), b.getDocumentation()); + compareComObjects(at + ".com.objects", a.getObjects(), b.getObjects()); + compareComObjects(at + ".com.events", a.getEvents(), b.getEvents()); + } + + private void compareComObjects(String at, List a, List b) { + if (!sizes(at, a, b)) { + return; + } + for (int i = 0; i < a.size(); i++) { + COMObject x = a.get(i); + COMObject y = b.get(i); + String where = at + "/" + x.getName(); + diff(where + ".name", x.getName(), y.getName()); + diff(where + ".number", x.getNumber(), y.getNumber()); + diff(where + ".comment", x.getComment(), y.getComment()); + diff(where + ".bodyType", x.getBodyType(), y.getBodyType()); + compareLink(where + ".related", x.getRelated(), y.getRelated()); + compareLink(where + ".source", x.getSource(), y.getSource()); + } + } + + private void compareLink(String at, ObjectLink a, ObjectLink b) { + if (a == null || b == null) { + if (a != b) { + differences.add(at + ": " + (a == null ? "absent" : "present") + " != " + + (b == null ? "absent" : "present")); + } + return; + } + diff(at + ".comment", a.getComment(), b.getComment()); + diff(at + ".target", a.getTarget(), b.getTarget()); + } + + private void compareDocs(String at, Documentation a, Documentation b) { + if (a == null || b == null) { + if (a != b) { + differences.add(at + ".documentation: presence differs"); + } + return; + } + if (sizes(at + ".docSections", a.getSections(), b.getSections())) { + for (int i = 0; i < a.getSections().size(); i++) { + DocSection x = a.getSections().get(i); + DocSection y = b.getSections().get(i); + diff(at + ".doc.name", x.getName(), y.getName()); + diff(at + ".doc.order", x.getOrder(), y.getOrder()); + diff(at + ".doc.content", x.getContent(), y.getContent()); + } + } + if (sizes(at + ".diagrams", a.getDiagrams(), b.getDiagrams())) { + for (int i = 0; i < a.getDiagrams().size(); i++) { + Diagram x = a.getDiagrams().get(i); + Diagram y = b.getDiagrams().get(i); + diff(at + ".diagram.name", x.getName(), y.getName()); + diff(at + ".diagram.svg", x.getSvg(), y.getSvg()); + } + } + } +} diff --git a/api-generator/api-generator-lib/src/test/java/esa/mo/apigen/exporters/xml/XmlRoundTripTest.java b/api-generator/api-generator-lib/src/test/java/esa/mo/apigen/exporters/xml/XmlRoundTripTest.java new file mode 100644 index 00000000..bd72c21e --- /dev/null +++ b/api-generator/api-generator-lib/src/test/java/esa/mo/apigen/exporters/xml/XmlRoundTripTest.java @@ -0,0 +1,162 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.exporters.xml; + +import esa.mo.apigen.importers.xml.XmlImporter; +import esa.mo.apigen.model.SourceRef; +import esa.mo.apigen.model.Specification; +import java.io.File; +import java.io.FileInputStream; +import java.io.InputStreamReader; +import java.io.Reader; +import java.io.StringReader; +import java.nio.charset.Charset; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import static org.junit.Assert.*; +import org.junit.Assume; +import org.junit.Before; +import org.junit.Test; + +/** + * The Phase 2 acceptance criterion: every specification survives + * {@code xml -> model -> xml -> model} unchanged, and what comes out satisfies the schema. + *

                  + * The comparison is between the two models rather than between the two documents. + * Comparing text would test the writer's layout, which is not what has to be preserved; + * comparing models tests that nothing was lost, which is. + */ +public class XmlRoundTripTest { + + private List files; + + @Before + public void findCorpus() { + files = corpus(); + Assume.assumeFalse("specifications not found", files.isEmpty()); + } + + private static List corpus() { + List all = new ArrayList(); + for (String set : new String[]{"prototypes", "standards"}) { + File here = new File(System.getProperty("user.dir")).getAbsoluteFile(); + while (here != null) { + File dir = new File(here, + "xml-service-specifications/xml-ccsds-mo-" + set + "/src/main/resources/xml"); + if (dir.isDirectory()) { + File[] found = dir.listFiles(); + if (found != null) { + for (File f : found) { + if (f.isFile() && f.getName().endsWith(".xml")) { + all.add(f); + } + } + } + break; + } + here = here.getParentFile(); + } + } + Collections.sort(all); + return all; + } + + private static Specification read(File file) throws Exception { + Reader in = new InputStreamReader(new FileInputStream(file), Charset.forName("UTF-8")); + try { + return new XmlImporter().read(in, new SourceRef(file.getName(), file.getPath())); + } finally { + in.close(); + } + } + + @Test + public void everySpecificationSurvivesTheRoundTrip() throws Exception { + List failures = new ArrayList(); + int checked = 0; + for (File file : files) { + Specification original = read(file); + String xml = new XmlExporter().toXml(original); + Specification reread = new XmlImporter().read(new StringReader(xml), + new SourceRef(file.getName(), null)); + + ModelComparison comparison = new ModelComparison(); + comparison.compare(original, reread); + if (!comparison.isEqual()) { + failures.add(file.getName() + ":"); + for (String difference : comparison.getDifferences()) { + failures.add(" " + difference); + } + } + checked++; + } + assertEquals("every specification should round trip", files.size(), checked); + if (!failures.isEmpty()) { + StringBuilder message = new StringBuilder("round trip lost information:\n"); + for (String line : failures) { + message.append(line).append('\n'); + } + fail(message.toString()); + } + } + + @Test + public void exportedDocumentsSatisfyTheirSchema() throws Exception { + // toXml validates before returning, so reaching the end is the assertion. + for (File file : files) { + assertNotNull(file.getName(), new XmlExporter().toXml(read(file))); + } + } + + /** + * Every specification satisfies its own schema. This was not true until the + * misspelled area attribute, the duplicate operation number and the duplicate short + * form were fixed, each of which was found by turning this check on. + */ + @Test + public void everySpecificationSatisfiesItsSchema() throws Exception { + for (File file : files) { + assertNotNull(file.getName(), new XmlExporter().toXml(read(file))); + } + } + + @Test + public void exportIsStable() throws Exception { + for (File file : files) { + Specification spec = read(file); + assertEquals(file.getName(), + new XmlExporter().toXml(spec), new XmlExporter().toXml(spec)); + } + } + + @Test + public void reExportOfAReadModelIsIdempotent() throws Exception { + for (File file : files) { + Specification original = read(file); + String once = new XmlExporter().toXml(original); + Specification reread = new XmlImporter().read(new StringReader(once), + new SourceRef(file.getName(), null)); + String twice = new XmlExporter().toXml(reread); + assertEquals(file.getName() + " is not idempotent", once, twice); + } + } +} diff --git a/api-generator/api-generator-lib/src/test/java/esa/mo/apigen/generators/java/GoldenTree.java b/api-generator/api-generator-lib/src/test/java/esa/mo/apigen/generators/java/GoldenTree.java new file mode 100644 index 00000000..3726a2e7 --- /dev/null +++ b/api-generator/api-generator-lib/src/test/java/esa/mo/apigen/generators/java/GoldenTree.java @@ -0,0 +1,212 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.generators.java; + +import esa.mo.apigen.importers.xml.XmlImporter; +import esa.mo.apigen.link.Linker; +import esa.mo.apigen.model.Area; +import esa.mo.apigen.model.MOModel; +import esa.mo.apigen.model.SourceRef; +import esa.mo.apigen.model.Specification; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.Reader; +import java.nio.charset.Charset; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +/** + * Reaches the output of the existing generators, captured by the Phase 0 harness, so the + * new generator can be held against it file by file. + *

                  + * The baseline is regenerable and not in version control, so everything here degrades to + * a skipped test when it is absent rather than to a failure. + */ +public final class GoldenTree { + + private GoldenTree() { + } + + public static File repoRoot() { + File here = new File(System.getProperty("user.dir")).getAbsoluteFile(); + while (here != null) { + if (new File(here, "xml-service-specifications").isDirectory()) { + return here; + } + here = here.getParentFile(); + } + return null; + } + + /** + * @return the captured output for a module, or null if the baseline has not been taken. + */ + public static File baselineFor(String module) { + File root = repoRoot(); + if (root == null) { + return null; + } + File dir = new File(root, "api-generator/golden/baseline/java/" + module); + return dir.isDirectory() ? dir : null; + } + + public static File spec(String fileName) { + File root = repoRoot(); + if (root == null) { + return null; + } + for (String set : new String[]{"prototypes", "standards"}) { + File f = new File(root, "xml-service-specifications/xml-ccsds-mo-" + set + + "/src/main/resources/xml/" + fileName); + if (f.isFile()) { + return f; + } + } + return null; + } + + public static Specification read(File file) throws Exception { + Reader in = new InputStreamReader(new FileInputStream(file), Charset.forName("UTF-8")); + try { + return new XmlImporter().read(in, new SourceRef(file.getName(), file.getPath())); + } finally { + in.close(); + } + } + + /** + * Builds a model the way an api module's build does: one target specification, plus + * the references it names. + * + * @param target The specification to generate. + * @param references The specifications loaded only so that references resolve. + * @return the target's areas, with the model behind them linked. + */ + public static Result load(String target, String... references) throws Exception { + MOModel model = new MOModel(); + for (String reference : references) { + model.add(read(spec(reference))); + } + Specification spec = read(spec(target)); + model.add(spec); + new Linker().link(model); + return new Result(model, spec.getAreas()); + } + + public static final class Result { + + final MOModel model; + final List targets; + + private Result(MOModel model, List targets) { + this.model = model; + this.targets = targets; + } + } + + /** + * Compares generated files against the baseline, considering only the files the new + * generator claims to produce. Everything it does not yet write is simply not looked + * at - the point is that what it does write is right, not that it is complete. + * + * @param generated The directory just written. + * @param baseline The captured output. + * @return a description of every difference, empty if there are none. + */ + public static List compare(Path generated, File baseline) throws IOException { + List differences = new ArrayList(); + List produced = new ArrayList(); + collect(generated, produced); + Collections.sort(produced); + + for (Path file : produced) { + String relative = generated.relativize(file).toString(); + File expected = new File(baseline, relative); + if (!expected.isFile()) { + differences.add("only generated: " + relative); + continue; + } + String actualText = new String(Files.readAllBytes(file), Charset.forName("UTF-8")); + String expectedText = new String( + Files.readAllBytes(expected.toPath()), Charset.forName("UTF-8")); + if (!expectedText.equals(actualText)) { + differences.add("differs: " + relative + describe(expectedText, actualText)); + } + } + return differences; + } + + private static String describe(String expected, String actual) { + List a = Arrays.asList(expected.split("\n", -1)); + List b = Arrays.asList(actual.split("\n", -1)); + for (int i = 0; i < Math.max(a.size(), b.size()); i++) { + String x = i < a.size() ? a.get(i) : ""; + String y = i < b.size() ? b.get(i) : ""; + if (!x.equals(y)) { + return "\n line " + (i + 1) + " expected: " + x + "\n" + + " line " + (i + 1) + " actual: " + y; + } + } + return ""; + } + + private static void collect(Path dir, List into) throws IOException { + File[] entries = dir.toFile().listFiles(); + if (entries == null) { + return; + } + for (File entry : entries) { + if (entry.isDirectory()) { + collect(entry.toPath(), into); + } else { + into.add(entry.toPath()); + } + } + } + + /** + * @return how many files were just written, for reporting progress. + */ + public static int countGenerated(Path generated) throws IOException { + List all = new ArrayList(); + collect(generated, all); + return all.size(); + } + + /** + * @return how many files the baseline holds, for reporting progress. + */ + public static int countBaseline(File baseline) { + List all = new ArrayList(); + try { + collect(baseline.toPath(), all); + } catch (IOException ex) { + return 0; + } + return all.size(); + } +} diff --git a/api-generator/api-generator-lib/src/test/java/esa/mo/apigen/generators/java/JavaClassBuilderTest.java b/api-generator/api-generator-lib/src/test/java/esa/mo/apigen/generators/java/JavaClassBuilderTest.java new file mode 100644 index 00000000..cd44cb16 --- /dev/null +++ b/api-generator/api-generator-lib/src/test/java/esa/mo/apigen/generators/java/JavaClassBuilderTest.java @@ -0,0 +1,146 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.generators.java; + +import org.junit.Test; +import static org.junit.Assert.assertEquals; + +/** + * Tests the shape a class comes out in, held against the reference output line for line. + *

                  + * As with {@link JavaMethodBuilderTest}, the examples are taken from the captured output of + * the generator this replaces. + */ +public class JavaClassBuilderTest { + + /** + * A class that implements an interface, and holds nothing at all. + */ + @Test + public void anEmptyClassIsAPackageAJavadocAndTwoBraces() { + JavaClassBuilder clazz = JavaClassBuilder.named("MPDElementFactory") + .inPackage("org.ccsds.moims.mo.mpd").asFinal() + .implementing("org.ccsds.moims.mo.mal.AreaElementFactory") + .comment("Creates the Elements of the MPD area."); + clazz.open(); + + assertEquals("package org.ccsds.moims.mo.mpd;\n" + + "\n" + + "/**\n" + + " * Creates the Elements of the MPD area.\n" + + " */\n" + + "public final class MPDElementFactory implements " + + "org.ccsds.moims.mo.mal.AreaElementFactory {\n" + + "\n" + + "}\n", clazz.close()); + } + + /** + * A class can both extend and implement, which is how a list reaches an ArrayList while + * still answering as an Element. + */ + @Test + public void aClassCanBothExtendAndImplement() { + JavaClassBuilder clazz = JavaClassBuilder.named("ProductList") + .inPackage("org.ccsds.moims.mo.mpd.structures").asFinal() + .extending("java.util.ArrayList") + .implementing("org.ccsds.moims.mo.mal.structures.HomogeneousList" + + "") + .comment("List class for Product."); + JavaSource out = clazz.open(); + out.line(" // members"); + + assertEquals("package org.ccsds.moims.mo.mpd.structures;\n" + + "\n" + + "/**\n" + + " * List class for Product.\n" + + " */\n" + + "public final class ProductList extends " + + "java.util.ArrayList implements " + + "org.ccsds.moims.mo.mal.structures.HomogeneousList" + + " {\n" + + " // members\n" + + "\n" + + "}\n", clazz.close()); + } + + /** + * An abstract composite is declared abstract, and its comment out of the specification + * is wrapped the same as any other comment in a class. + */ + @Test + public void anAbstractClassSaysSoAndItsCommentIsNormalised() { + JavaClassBuilder clazz = JavaClassBuilder.named("ObjectAttribute") + .inPackage("org.ccsds.moims.mo.mal.structures").asAbstract() + .implementing("org.ccsds.moims.mo.mal.structures.Composite") + .comment("The base of every attribute that carries an rather than" + + " a value of its own"); + clazz.open(); + + assertEquals("package org.ccsds.moims.mo.mal.structures;\n" + + "\n" + + "/**\n" + + " * The base of every attribute that carries an _Object_ rather than a value\n" + + " * of its own.\n" + + " */\n" + + "public abstract class ObjectAttribute implements " + + "org.ccsds.moims.mo.mal.structures.Composite {\n" + + "\n" + + "}\n", clazz.close()); + } + + /** + * A helper is neither final nor abstract and extends nothing, so the declaration is + * left as bare as it can be. + */ + @Test + public void aPlainClassCarriesNoModifiersOfItsOwn() { + JavaClassBuilder clazz = JavaClassBuilder.named("MPDHelper") + .inPackage("org.ccsds.moims.mo.mpd") + .comment("Helper class for MPD area."); + clazz.open(); + + assertEquals("package org.ccsds.moims.mo.mpd;\n" + + "\n" + + "/**\n" + + " * Helper class for MPD area.\n" + + " */\n" + + "public class MPDHelper {\n" + + "\n" + + "}\n", clazz.close()); + } + + /** + * A class with nothing to say is written without javadoc, the same as a method or a + * field. + */ + @Test + public void aClassWithNothingToSayIsWrittenWithoutJavadoc() { + JavaClassBuilder clazz = JavaClassBuilder.named("Anonymous").inPackage("a.b"); + clazz.open(); + + assertEquals("package a.b;\n" + + "\n" + + "public class Anonymous {\n" + + "\n" + + "}\n", clazz.close()); + } +} diff --git a/api-generator/api-generator-lib/src/test/java/esa/mo/apigen/generators/java/JavaFieldBuilderTest.java b/api-generator/api-generator-lib/src/test/java/esa/mo/apigen/generators/java/JavaFieldBuilderTest.java new file mode 100644 index 00000000..17905c45 --- /dev/null +++ b/api-generator/api-generator-lib/src/test/java/esa/mo/apigen/generators/java/JavaFieldBuilderTest.java @@ -0,0 +1,135 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.generators.java; + +import org.junit.Test; +import static org.junit.Assert.assertEquals; + +/** + * Tests the shape a field comes out in, held against the reference output line for line. + *

                  + * As with {@link JavaMethodBuilderTest}, the examples are taken from the captured output of + * the generator this replaces. + */ +public class JavaFieldBuilderTest { + + private static String write(JavaFieldBuilder field) { + JavaSource out = new JavaSource(); + field.write(out); + return out.toString(); + } + + /** + * The plainest field there is: a blank line to separate it from what came before, and + * no javadoc because there is nothing to say. + */ + @Test + public void aFieldWithNothingToSayIsWrittenWithoutJavadoc() { + assertEquals("\n" + + " private static final long serialVersionUID = 2533274823950335L;\n", + write(JavaFieldBuilder.named("serialVersionUID").scope("private") + .asStatic().asFinal().ofType("long").value("2533274823950335L"))); + } + + /** + * A documented constant, which is what a helper is made of. + */ + @Test + public void aDocumentedConstantCarriesItsJavadoc() { + assertEquals("\n" + + " /**\n" + + " * Area number literal.\n" + + " */\n" + + " public static final int _MPD_AREA_NUMBER = 9;\n", + write(JavaFieldBuilder.named("_MPD_AREA_NUMBER").asStatic().asFinal() + .ofType("int").value("9").comment("Area number literal."))); + } + + /** + * A field with no value is declared and left unset, which is how a composite holds + * what it carries. + */ + @Test + public void aFieldWithoutAValueIsOnlyDeclared() { + assertEquals("\n" + + " /**\n" + + " * The product type definition.\n" + + " */\n" + + " private org.ccsds.moims.mo.mpd.structures.ProductType productType;\n", + write(JavaFieldBuilder.named("productType").scope("private") + .ofType("org.ccsds.moims.mo.mpd.structures.ProductType") + .comment("The product type definition."))); + } + + /** + * A field that belongs with the one above it goes straight under it, with no blank + * line between them. + */ + @Test + public void aJoinedFieldFollowsWithoutABlankLine() { + assertEquals(" /**\n" + + " * The TypeId of this Element as a long.\n" + + " */\n" + + " public static final Long SHORT_FORM = 2533274823950335L;\n", + write(JavaFieldBuilder.named("SHORT_FORM").asStatic().asFinal() + .ofType("Long").value("2533274823950335L") + .comment("The TypeId of this Element as a long.") + .joinedToPrevious())); + } + + /** + * A value spanning more than one line is written as it is given: the caller that lays + * out an array lays out its own continuation. + */ + @Test + public void aMultiLineValueIsWrittenAsItIsGiven() { + assertEquals("\n" + + " /**\n" + + " * Services in this Area.\n" + + " */\n" + + " public static final org.ccsds.moims.mo.mal.ServiceInfo[] MPD_AREA_SERVICES = {\n" + + " ProductRetrievalHelper.PRODUCTRETRIEVAL_SERVICE,\n" + + " OrderManagementHelper.ORDERMANAGEMENT_SERVICE,};\n", + write(JavaFieldBuilder.named("MPD_AREA_SERVICES").asStatic().asFinal() + .ofType("org.ccsds.moims.mo.mal.ServiceInfo[]") + .value("{\n ProductRetrievalHelper.PRODUCTRETRIEVAL_SERVICE," + + "\n OrderManagementHelper.ORDERMANAGEMENT_SERVICE,}") + .comment("Services in this Area."))); + } + + /** + * A comment out of a specification is wrapped and has its angle brackets taken out, + * the same as everywhere else in a class. + */ + @Test + public void aCommentFromASpecificationIsNormalised() { + assertEquals("\n" + + " /**\n" + + " * The references to the _Product_ objects that are held by this standing\n" + + " * order.\n" + + " */\n" + + " private java.util.List references;\n", + write(JavaFieldBuilder.named("references").scope("private") + .ofType("java.util.List") + .comment("The references to the objects that are held by" + + " this standing order"))); + } +} diff --git a/api-generator/api-generator-lib/src/test/java/esa/mo/apigen/generators/java/JavaGeneratorGoldenTest.java b/api-generator/api-generator-lib/src/test/java/esa/mo/apigen/generators/java/JavaGeneratorGoldenTest.java new file mode 100644 index 00000000..2764a9ac --- /dev/null +++ b/api-generator/api-generator-lib/src/test/java/esa/mo/apigen/generators/java/JavaGeneratorGoldenTest.java @@ -0,0 +1,172 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.generators.java; + +import java.io.File; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.List; +import static org.junit.Assert.*; +import org.junit.AfterClass; +import org.junit.Assume; +import org.junit.Test; + +/** + * The new Java generator held against the output of the existing one. + *

                  + * Only the files it claims to produce are compared: the point at this stage is that what + * it writes is right, not that it writes everything. As categories are added they are + * added here, and the count in each test says how far along the module is. + */ +public class JavaGeneratorGoldenTest { + + /** + * How many files each module still renders differently from the reference output. + *

                  + * A budget rather than a pass mark: it must only ever go down, and the test fails both + * when a module regresses and when a budget is left standing after the difference has + * been fixed. Zero everywhere is the end of Phase 3's structures work. + */ + private static final java.util.Map REMAINING + = new java.util.HashMap(); + + static { + REMAINING.put("api-area001-v003-mal", 0); + REMAINING.put("api-area002-v001-com", 0); + REMAINING.put("api-area003-v001-common", 0); + REMAINING.put("api-area004-v001-mc", 0); + REMAINING.put("api-area004-v002-mc", 0); + REMAINING.put("api-area005-v001-mps", 0); + REMAINING.put("api-area009-v001-mpd", 0); + } + + /** + * How many files the new generator writes byte for byte as the old one did, and how + * many the old one wrote in all. Printed once the modules have all run, so that the + * distance still to go is visible without reading every test. + */ + private static int matching = 0; + + private static int expected = 0; + + @AfterClass + public static void reportProgress() { + if (expected != 0) { + System.out.println("Golden tree: " + matching + " of " + expected + + " file(s) are identical to the reference output"); + } + } + + private void check(String module, String target, String... references) throws Exception { + File baseline = GoldenTree.baselineFor(module); + Assume.assumeNotNull("baseline not captured; run api-generator/golden/golden.sh capture", + baseline); + Assume.assumeNotNull(GoldenTree.spec(target)); + + GoldenTree.Result loaded = GoldenTree.load(target, references); + Path out = Files.createTempDirectory("apigen-" + module); + try { + new JavaGenerator().generate(loaded.model, loaded.targets, out); + List differences = GoldenTree.compare(out, baseline); + int budget = REMAINING.containsKey(module) ? REMAINING.get(module) : 0; + int differing = countDifferingFiles(differences); + matching += GoldenTree.countGenerated(out) - differing; + expected += GoldenTree.countBaseline(baseline); + if (differing > budget) { + StringBuilder message = new StringBuilder(module + ": " + differing + + " file(s) differ from the baseline, budget is " + budget + "\n"); + for (String difference : differences) { + message.append(" ").append(difference).append('\n'); + } + fail(message.toString()); + } + assertEquals(module + ": only " + differing + " file(s) now differ - lower the" + + " budget in REMAINING to " + differing, budget, differing); + } finally { + delete(out.toFile()); + } + } + + private static int countDifferingFiles(List differences) { + int count = 0; + for (String difference : differences) { + if (difference.startsWith("differs: ") || difference.startsWith("only generated: ")) { + count++; + } + } + return count; + } + + private static void delete(File file) { + File[] children = file.listFiles(); + if (children != null) { + for (File child : children) { + delete(child); + } + } + file.delete(); + } + + @Test + public void mpd() throws Exception { + check("api-area009-v001-mpd", "area009-v001-Mission-Product-Distribution.xml", + "area001-v003-MAL.xml"); + } + + @Test + public void mal() throws Exception { + check("api-area001-v003-mal", "area001-v003-MAL.xml"); + } + + /** + * COM names no references of its own, but its pom sets {@code ref-skip} to false and + * so inherits the parent's default of MAL v3 - which it needs, since its fields are + * typed with MAL attributes. + */ + @Test + public void com() throws Exception { + check("api-area002-v001-com", "area002-v001-COM.xml", "area001-v003-MAL.xml"); + } + + @Test + public void common() throws Exception { + check("api-area003-v001-common", "area003-v001-Common.xml", + "area001-v003-MAL.xml", "area002-v001-COM.xml"); + } + + @Test + public void monitorAndControlV1() throws Exception { + check("api-area004-v001-mc", "area004-v001-Monitor-and-Control.xml", + "area001-v003-MAL.xml", "area002-v001-COM.xml"); + } + + @Test + public void monitorAndControlV2() throws Exception { + check("api-area004-v002-mc", "area004-v002-Monitor-and-Control.xml", + "area001-v003-MAL.xml"); + } + + @Test + public void missionPlanningAndScheduling() throws Exception { + check("api-area005-v001-mps", "area005-v001-Mission-Planning-and-Scheduling.xml", + "area001-v003-MAL.xml"); + } +} diff --git a/api-generator/api-generator-lib/src/test/java/esa/mo/apigen/generators/java/JavaMethodBuilderTest.java b/api-generator/api-generator-lib/src/test/java/esa/mo/apigen/generators/java/JavaMethodBuilderTest.java new file mode 100644 index 00000000..a6a31515 --- /dev/null +++ b/api-generator/api-generator-lib/src/test/java/esa/mo/apigen/generators/java/JavaMethodBuilderTest.java @@ -0,0 +1,229 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.generators.java; + +import org.junit.Test; +import static org.junit.Assert.assertEquals; + +/** + * Tests the shape a method comes out in, held against the reference output line for line. + *

                  + * The examples are taken from the captured output of the generator this replaces, so that + * the rules the emitter follows are the ones the existing API was written with, and not + * whatever looked reasonable while it was being written. + */ +public class JavaMethodBuilderTest { + + private static String write(JavaMethodBuilder method) { + JavaSource out = new JavaSource(); + method.write(out); + return out.toString(); + } + + /** + * The plainest method there is: a blank line to separate it from what came before, no + * javadoc because there is nothing to say, and the body a step in. + */ + @Test + public void aMethodWithNothingToSayIsWrittenWithoutJavadoc() { + assertEquals("\n" + + " private static void hide() {\n" + + " return;\n" + + " }\n", + write(JavaMethodBuilder.named("hide").scope("private").asStatic().line("return;"))); + } + + /** + * Arguments past the first are carried onto their own line, however short the + * signature is, and the throws clause stays on the line of the last of them. + */ + @Test + public void argumentsPastTheFirstAreCarriedOntoTheirOwnLine() { + String source = write(JavaMethodBuilder.named("getProducts") + .argument("org.ccsds.moims.mo.mal.structures.ObjectRefList", "productRefs", + "The references to the products to be retrieved.") + .argument("org.ccsds.moims.mo.mpd.productretrieval.consumer." + + "ProductRetrievalAdapter", "adapter", + "adapter Listener in charge of receiving the messages from the" + + " service provider") + .throwing("org.ccsds.moims.mo.mal.MALInteractionException", + "if there is a problem during the interaction as defined by the" + + " MAL specification.") + .throwing("org.ccsds.moims.mo.mal.MALException", + "if there is an implementation exception") + .comment("The getProducts operation retrieves the selected mission data" + + " products from the provider") + .line("consumer.progress(GETPRODUCTS_OP, adapter, productRefs);")); + + assertEquals("\n" + + " /**\n" + + " * The getProducts operation retrieves the selected mission data products\n" + + " * from the provider.\n" + + " * \n" + + " * @param productRefs The references to the products to be retrieved.\n" + + " * @param adapter adapter Listener in charge of receiving the messages from the service provider\n" + + " * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification.\n" + + " * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception\n" + + " */\n" + + " public void getProducts(org.ccsds.moims.mo.mal.structures.ObjectRefList productRefs,\n" + + " org.ccsds.moims.mo.mpd.productretrieval.consumer.ProductRetrievalAdapter adapter) " + + "throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException {\n" + + " consumer.progress(GETPRODUCTS_OP, adapter, productRefs);\n" + + " }\n", source); + } + + /** + * An argument nobody described is still documented, by name. + */ + @Test + public void anUndescribedArgumentIsDocumentedByItsName() { + assertEquals("\n" + + " /**\n" + + " * Creates an Element declared by the area itself.\n" + + " * \n" + + " * @param typeNumber The typeNumber field.\n" + + " */\n" + + " private static Element createAreaElement(int typeNumber) {\n" + + " return null;\n" + + " }\n", + write(JavaMethodBuilder.named("createAreaElement").scope("private").asStatic() + .comment("Creates an Element declared by the area itself.") + .returns("Element", null) + .argument("int", "typeNumber", null) + .line("return null;"))); + } + + /** + * The blank line between the description and the tags is written even when there is no + * description above it. + */ + @Test + public void theTagsAreSeparatedEvenWithNothingToSeparateThemFrom() { + assertEquals("\n" + + " /**\n" + + " * \n" + + " * @param name The Subscription Key name\n" + + " */\n" + + " public void add(String name) {\n" + + " }\n", + write(JavaMethodBuilder.named("add") + .argument("String", "name", "The Subscription Key name"))); + } + + /** + * An override says the same thing as the method it overrides, so it is left + * undocumented however much is known about its arguments. + */ + @Test + public void anOverrideIsWrittenWithoutJavadoc() { + assertEquals("\n" + + " @Override\n" + + " public int getAreaNumber() {\n" + + " return 9;\n" + + " }\n", + write(JavaMethodBuilder.named("getAreaNumber").asOverride().returns("int", null) + .line("return 9;"))); + } + + /** + * An override is public whatever the scope it was given, because the method it + * overrides is. + */ + @Test + public void anOverrideIsPublic() { + assertEquals("\n" + + " @Override\n" + + " public void run() {\n" + + " }\n", + write(JavaMethodBuilder.named("run").scope("protected").asOverride())); + } + + /** + * A constructor is written without a return type, void or otherwise. + */ + @Test + public void aConstructorHasNoReturnType() { + assertEquals("\n" + + " /**\n" + + " * Constructs a new UnknownException exception.\n" + + " * \n" + + " * @param extraInformation The extraInformation of the exception.\n" + + " */\n" + + " public UnknownException(Object extraInformation) {\n" + + " super(MO_ERROR_NAME, UNKNOWN_ERROR_NUMBER, extraInformation);\n" + + " }\n", + write(JavaMethodBuilder.constructor("UnknownException") + .comment("Constructs a new UnknownException exception.") + .argument("Object", "extraInformation", + "The extraInformation of the exception.") + .line("super(MO_ERROR_NAME, UNKNOWN_ERROR_NUMBER, extraInformation);"))); + } + + /** + * A method of an interface is a declaration: no scope in front of it, a semicolon + * instead of a body. + */ + @Test + public void aDeclarationEndsAtTheSemicolon() { + // No blank line in front of it: an interface packs its declarations together, and + // the one that separates the first from the declaration is written by the class. + assertEquals(" /**\n" + + " * \n" + + " * @param interaction The interaction field.\n" + + " * @return The returned value.\n" + + " */\n" + + " Long listProducts(MALInteraction interaction) throws MALException;\n", + write(JavaMethodBuilder.named("listProducts").asDeclaration() + .returns("Long", "The returned value.") + .argument("MALInteraction", "interaction", null) + .throwing("MALException", null))); + } + + /** + * Angle brackets would be read as markup, so they are taken out of every line of the + * javadoc and not only out of the description. + */ + @Test + public void angleBracketsAreTakenOutOfTheWholeJavadoc() { + assertEquals("\n" + + " /**\n" + + " * \n" + + " * @param names The _Identifier_ names.\n" + + " */\n" + + " public void setNames(java.util.List names) {\n" + + " }\n", + write(JavaMethodBuilder.named("setNames") + .argument("java.util.List", "names", "The names."))); + } + + /** + * A deprecated method carries the annotation, under its javadoc and above whatever + * else it is. + */ + @Test + public void aDeprecatedMethodCarriesTheAnnotation() { + assertEquals("\n" + + " @Deprecated\n" + + " public final void gone() {\n" + + " }\n", + write(JavaMethodBuilder.named("gone").asDeprecated().asFinal())); + } +} diff --git a/api-generator/api-generator-lib/src/test/java/esa/mo/apigen/generators/java/JumpTableTest.java b/api-generator/api-generator-lib/src/test/java/esa/mo/apigen/generators/java/JumpTableTest.java new file mode 100644 index 00000000..b9ce59e9 --- /dev/null +++ b/api-generator/api-generator-lib/src/test/java/esa/mo/apigen/generators/java/JumpTableTest.java @@ -0,0 +1,242 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2024 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO Service Stub Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.generators.java; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import org.junit.Test; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +/** + * Tests the rules that decide how far the switch of an area factory reaches + * before the rest of the type numbers are moved out to a second method. Carried over + * from the generator this replaces, so that the two lay their cases out alike. + */ +public class JumpTableTest { + + /** + * Builds the type numbers of an area the way the generator sees them: a + * type and the list that holds it, which takes the same number negated. + * + * @param magnitudes The declared type numbers. + * @return The type numbers with the numbers of their lists. + */ + private static Collection withLists(int... magnitudes) { + List numbers = new ArrayList(); + + for (int magnitude : magnitudes) { + numbers.add(magnitude); + numbers.add(-magnitude); + } + + return numbers; + } + + private static int[] range(int first, int last) { + int[] numbers = new int[last - first + 1]; + + for (int i = 0; i < numbers.length; i++) { + numbers[i] = first + i; + } + + return numbers; + } + + /** + * An area whose numbers run without a gap is answered by one switch, so the + * band has to reach the last of them. + */ + @Test + public void bandCoversAnAreaThatHasNoGaps() { + assertEquals(12, JumpTable.widestJumpTableBand(withLists(range(1, 12)))); + assertEquals(45, JumpTable.widestJumpTableBand(withLists(range(1, 45)))); + } + + /** + * The numbers of the MAL run 1 to 19, then 101 to 105, then 1001 to 1010. + * The first two groups are close enough to be held together, the last one + * is not, so it is left for the second method. + */ + @Test + public void bandStopsBeforeAGapThatIsTooWideToPayFor() { + List mal = new ArrayList(); + mal.addAll(withLists(range(1, 19))); + mal.addAll(withLists(range(101, 105))); + mal.addAll(withLists(range(1001, 1010))); + + assertEquals(105, JumpTable.widestJumpTableBand(mal)); + } + + /** + * A group of numbers that lies past a gap is still taken in when it is + * dense enough to pay for the gap in front of it. Stopping at the first + * candidate that fails would leave it out. + */ + @Test + public void bandReachesPastAGapThatTheNumbersBehindItPayFor() { + List numbers = new ArrayList(); + numbers.addAll(withLists(1, 2, 3)); + numbers.addAll(withLists(range(20, 60))); + + assertEquals(60, JumpTable.widestJumpTableBand(numbers)); + } + + /** + * The band is counted out from 1, not placed on the longest run of numbers + * that follow one another. An area that starts with a gap would otherwise + * leave its first types out of the jump table. + */ + @Test + public void bandIsAnchoredAtOneAndNotOnTheLongestRun() { + // The run 10 to 15 is the longest, but 1 and 6 come first + List numbers = new ArrayList(); + numbers.addAll(withLists(1, 6)); + numbers.addAll(withLists(range(10, 15))); + + int band = JumpTable.widestJumpTableBand(numbers); + assertEquals(15, band); + assertTrue("Type number 1 has to be inside the band", band >= 1); + } + + /** + * A single type is answered by a lookup rather than by a jump table, so + * there is no band and the types are left in one switch. + */ + @Test + public void aSingleTypeHasNoBand() { + assertEquals(0, JumpTable.widestJumpTableBand(withLists(1))); + } + + /** + * A number that lies on its own far from the rest cannot widen the band, + * whatever else the area declares. + */ + @Test + public void aLoneNumberFarOutIsLeftOutOfTheBand() { + List numbers = new ArrayList(); + numbers.addAll(withLists(range(1, 20))); + numbers.addAll(withLists(5000)); + + assertEquals(20, JumpTable.widestJumpTableBand(numbers)); + } + + /** + * The band that is chosen has to be one the Java compiler really answers + * with a jump table, and the one past it must not be. + */ + @Test + public void chosenBandIsTheWidestThatStillCompilesToAJumpTable() { + List numbers = new ArrayList(); + numbers.addAll(withLists(range(1, 19))); + numbers.addAll(withLists(range(101, 105))); + numbers.addAll(withLists(range(1001, 1010))); + + int band = JumpTable.widestJumpTableBand(numbers); + int inside = 0; + + for (Integer number : numbers) { + if (Math.abs(number) <= band) { + inside++; + } + } + + assertTrue("The chosen band is not a jump table", + JumpTable.compilesToJumpTable(inside, 2L * band + 1L)); + assertTrue("The whole area would still be a jump table", + !JumpTable.compilesToJumpTable(numbers.size(), 2L * 1010 + 1L)); + } + + /** + * Nothing to switch over is answered with no band, rather than with an + * empty one that the generator would then try to split. + */ + @Test + public void noTypesGiveNoBand() { + assertEquals(0, JumpTable.widestJumpTableBand(new ArrayList())); + } + + /** + * Numbers that lie far from zero leave the whole way across zero empty + * between the types and their lists, so each side is switched on its own. + */ + @Test + public void numbersFarFromZeroAreSwitchedOneSideAtATime() { + assertTrue(JumpTable.shouldSplitOnSign(withLists(range(1001, 1010)))); + } + + /** + * Numbers that already answer with a jump table gain nothing from being + * taken apart, and would only pay for the test that reaches each side. + */ + @Test + public void numbersThatAreAlreadyAJumpTableAreLeftWhole() { + assertFalse(JumpTable.shouldSplitOnSign(withLists(range(1, 19)))); + assertFalse(JumpTable.shouldSplitOnSign(withLists(range(1, 105)))); + } + + /** + * A single type far from zero is reached faster by one lookup over both of + * its numbers than by a test and a jump table holding one entry each. + */ + @Test + public void aSingleTypeFarFromZeroIsLeftWhole() { + assertFalse(JumpTable.shouldSplitOnSign(withLists(90))); + } + + /** + * There is nothing to take apart when the numbers all fall on one side of + * zero. + */ + @Test + public void numbersOnOneSideOfZeroAreLeftWhole() { + List positives = new ArrayList(); + + for (int number = 1001; number <= 1010; number++) { + positives.add(number); + } + + assertFalse(JumpTable.shouldSplitOnSign(positives)); + assertFalse(JumpTable.shouldSplitOnSign(new ArrayList())); + } + + /** + * Both sides have to be worth a jump table on their own. One side that + * stays a binary search is not worth the test that reaches it. + */ + @Test + public void bothSidesHaveToBeWorthAJumpTable() { + // The lists follow one another, the types themselves do not + List lopsided = new ArrayList(); + + for (int number = 1001; number <= 1010; number++) { + lopsided.add(-number); + } + + lopsided.add(1001); + lopsided.add(3000); + lopsided.add(9000); + + assertFalse(JumpTable.shouldSplitOnSign(lopsided)); + } +} diff --git a/api-generator/api-generator-lib/src/test/java/esa/mo/apigen/importers/xml/Corpus.java b/api-generator/api-generator-lib/src/test/java/esa/mo/apigen/importers/xml/Corpus.java new file mode 100644 index 00000000..09bf8b98 --- /dev/null +++ b/api-generator/api-generator-lib/src/test/java/esa/mo/apigen/importers/xml/Corpus.java @@ -0,0 +1,122 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.importers.xml; + +import esa.mo.apigen.importers.ImportException; +import esa.mo.apigen.model.SourceRef; +import esa.mo.apigen.model.Specification; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.Reader; +import java.nio.charset.Charset; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +/** + * Locates the specifications in the repository, so the importer can be tested against the + * documents it actually has to read rather than against fixtures written to suit it. + */ +public final class Corpus { + + private Corpus() { + } + + /** + * @return the directory holding a set of specifications, or null if the repository + * layout cannot be found from here. + */ + public static File dir(String set) { + File here = new File(System.getProperty("user.dir")).getAbsoluteFile(); + while (here != null) { + File candidate = new File(here, + "xml-service-specifications/xml-ccsds-mo-" + set + "/src/main/resources/xml"); + if (candidate.isDirectory()) { + return candidate; + } + here = here.getParentFile(); + } + return null; + } + + public static List files(String set) { + File dir = dir(set); + if (dir == null) { + return Collections.emptyList(); + } + File[] found = dir.listFiles(); + if (found == null) { + return Collections.emptyList(); + } + List xml = new ArrayList(); + for (File f : found) { + if (f.isFile() && f.getName().endsWith(".xml")) { + xml.add(f); + } + } + Collections.sort(xml); + return xml; + } + + /** + * @return every specification in the repository, prototypes and standards together. + */ + public static List all() { + List all = new ArrayList(); + all.addAll(files("prototypes")); + all.addAll(files("standards")); + return all; + } + + public static Specification read(File file) throws ImportException, IOException { + Reader in = new InputStreamReader(new FileInputStream(file), Charset.forName("UTF-8")); + try { + return new XmlImporter().read(in, new SourceRef(file.getName(), file.getPath())); + } finally { + in.close(); + } + } + + public static File file(String name) { + for (File f : all()) { + if (f.getName().equals(name)) { + return f; + } + } + return null; + } + + public static List names(List files) { + List names = new ArrayList(); + for (File f : files) { + names.add(f.getName()); + } + return names; + } + + static { + // keep Arrays imported for readability of failure messages in the tests + Arrays.asList(); + } +} diff --git a/api-generator/api-generator-lib/src/test/java/esa/mo/apigen/importers/xml/XmlImporterCorpusTest.java b/api-generator/api-generator-lib/src/test/java/esa/mo/apigen/importers/xml/XmlImporterCorpusTest.java new file mode 100644 index 00000000..5df9007c --- /dev/null +++ b/api-generator/api-generator-lib/src/test/java/esa/mo/apigen/importers/xml/XmlImporterCorpusTest.java @@ -0,0 +1,315 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.importers.xml; + +import esa.mo.apigen.link.Linker; +import esa.mo.apigen.model.*; +import esa.mo.apigen.model.com.COMObject; +import esa.mo.apigen.model.types.CompositeType; +import esa.mo.apigen.model.types.TypeDefinition; +import esa.mo.apigen.validation.ValidationResult; +import java.io.File; +import java.util.List; +import static org.junit.Assert.*; +import org.junit.Assume; +import org.junit.Before; +import org.junit.Test; + +/** + * The importer read against the specifications in this repository. + *

                  + * The counts below were measured from the XML itself, so a change in either the importer + * or the specifications shows up here rather than three phases later. + */ +public class XmlImporterCorpusTest { + + private List files; + + @Before + public void findCorpus() { + files = Corpus.all(); + Assume.assumeFalse("specifications not found from " + System.getProperty("user.dir"), + files.isEmpty()); + } + + @Test + public void everySpecificationParses() throws Exception { + assertEquals("expected 12 prototypes and 6 standards", 18, files.size()); + for (File file : files) { + Specification spec = Corpus.read(file); + assertNotNull(file.getName(), spec.getSchemaVersion()); + assertFalse(file.getName() + " has no areas", spec.getAreas().isEmpty()); + } + } + + @Test + public void everySpecificationHasExactlyOneArea() throws Exception { + for (File file : files) { + assertEquals(file.getName(), 1, Corpus.read(file).getAreas().size()); + } + } + + @Test + public void schemaVersionComesFromTheRootNamespace() throws Exception { + assertEquals(SchemaVersion.V001, + Corpus.read(Corpus.file("area001-v001-MAL.xml")).getSchemaVersion()); + assertEquals(SchemaVersion.V003, + Corpus.read(Corpus.file("area001-v003-MAL.xml")).getSchemaVersion()); + assertEquals(SchemaVersion.V003, + Corpus.read(Corpus.file("area009-v001-Mission-Product-Distribution.xml")) + .getSchemaVersion()); + } + + @Test + public void readsSoftwareManagementCompletely() throws Exception { + Specification spec = Corpus.read(Corpus.file("area007-v001-Software-Management.xml")); + Area area = spec.getAreas().get(0); + + assertEquals("SoftwareManagement", area.getName()); + assertEquals(7, area.getNumber()); + assertEquals(1, area.getVersion()); + assertEquals(4, area.getServices().size()); + + int operations = 0; + int composites = 0; + int comObjects = 0; + int comEvents = 0; + int docSections = 0; + int diagrams = 0; + for (Service service : area.getServices()) { + operations += service.getOperations().size(); + for (TypeDefinition type : service.getDataTypes()) { + if (type instanceof CompositeType) { + composites++; + } + } + docSections += service.getDocumentation().getSections().size(); + if (service.getCom() != null) { + comObjects += service.getCom().getObjects().size(); + comEvents += service.getCom().getEvents().size(); + diagrams += service.getCom().getDocumentation().getDiagrams().size(); + } + } + assertEquals("operations", 13, operations); + assertEquals("composites", 5, composites); + assertEquals("COM objects", 4, comObjects); + assertEquals("COM events", 6, comEvents); + assertEquals("documentation sections", 6, docSections); + assertEquals("diagrams", 2, diagrams); + } + + @Test + public void readsOperationLevelDocumentation() throws Exception { + // MPD is the only specification that documents its operations: 36 sections. + Specification spec = Corpus.read( + Corpus.file("area009-v001-Mission-Product-Distribution.xml")); + int sections = 0; + for (Service service : spec.getAreas().get(0).getServices()) { + for (Operation op : service.getOperations()) { + sections += op.getDocumentation().getSections().size(); + } + } + assertEquals(36, sections); + } + + @Test + public void readsSubscriptionKeysWhichExistOnlyInV003() throws Exception { + int found = 0; + for (File file : Corpus.files("prototypes")) { + Specification spec = Corpus.read(file); + for (Area area : spec.getAreas()) { + for (Service service : area.getServices()) { + for (Operation op : service.getOperations()) { + if (op.getMessages().containsKey(InteractionStage.SUBSCRIPTION_KEYS)) { + found++; + assertEquals(file.getName(), SchemaVersion.V003, spec.getSchemaVersion()); + } + } + } + } + } + assertEquals(13, found); + } + + @Test + public void readsObjectReferencesWhichExistOnlyInV003() throws Exception { + int found = 0; + for (File file : Corpus.files("prototypes")) { + for (Area area : Corpus.read(file).getAreas()) { + for (TypeDefinition type : area.getDataTypes()) { + if (type instanceof CompositeType) { + for (Field field : ((CompositeType) type).getFields()) { + if (field.getType() != null && field.getType().isObjectRef()) { + found++; + } + } + } + } + } + } + assertTrue("expected object references in MPS and MC v2, found " + found, found > 50); + } + + @Test + public void readsDiagramsAsSvgText() throws Exception { + Specification spec = Corpus.read(Corpus.file("area007-v001-Software-Management.xml")); + int diagrams = 0; + for (Service service : spec.getAreas().get(0).getServices()) { + if (service.getCom() == null) { + continue; + } + for (esa.mo.apigen.model.docs.Diagram d : service.getCom().getDocumentation().getDiagrams()) { + diagrams++; + assertNotNull(d.getName(), d.getSvg()); + assertTrue(d.getName() + " should carry SVG", d.getSvg().contains(" 0); + // An attribute that is there and says something is kept as it is, so the three + // states - absent, empty, and written - stay apart. + assertNotNull(spec.getAreas().get(0).getComment()); + } + + @Test + public void anExtendedServiceIsMarkedWhetherOrNotItDeclaresFeatures() throws Exception { + // A service says it is a COM extended service on the element itself. Most of them + // go on to declare objects or events, but not all: this file has two that declare + // none, and the generated ServiceInfo still has to extend COMService. + Specification spec = Corpus.read(Corpus.file("area051-v001-Mission-Data-Product.xml")); + int extended = 0; + for (Service service : spec.getAreas().get(0).getServices()) { + if (service.isExtended()) { + extended++; + assertNull("this file declares no features at all", service.getCom()); + } + } + assertEquals(2, extended); + } + + @Test + public void theSameSpecificationLoadedTwiceStillResolves() throws Exception { + // A module commonly names its own specification among its references as well as + // its target. The two copies say the same thing, so the second is left out of the + // index rather than making every lookup in that area ambiguous. + MOModel model = new MOModel(); + model.add(Corpus.read(Corpus.file("area001-v003-MAL.xml"))); + model.add(Corpus.read(Corpus.file("area002-v001-COM.xml"))); + model.add(Corpus.read(Corpus.file("area002-v001-COM.xml"))); + new Linker().link(model); + + assertTrue("the same file twice is not a conflict", + model.getConflictingAreas().isEmpty()); + Area com = model.findArea("COM", 1); + assertNotNull("the area has to stay reachable by name and version", com); + assertFalse("and it has to still hold its types", com.getDataTypes().isEmpty()); + } + + @Test + public void linkingResolvesTypesForATypicalModuleLoad() throws Exception { + // What apis/api-area003-v001-common actually loads: Common, plus MAL v3 and COM + // as references. Note the v001 specification resolving against MAL v3. + MOModel model = new MOModel(); + model.add(Corpus.read(Corpus.file("area001-v003-MAL.xml"))); + model.add(Corpus.read(Corpus.file("area002-v001-COM.xml"))); + Specification common = Corpus.read(Corpus.file("area003-v001-Common.xml")); + model.add(common); + + ValidationResult linked = new Linker().link(model); + assertFalse(linked.toString(), linked.hasErrors()); + + Area area = common.getAreas().get(0); + for (Service service : area.getServices()) { + for (TypeDefinition type : service.getDataTypes()) { + if (type instanceof CompositeType) { + CompositeType composite = (CompositeType) type; + assertNotNull(composite.getName() + " should have a super type after linking", + composite.getSuperType()); + assertTrue(composite.getName() + " super type should be linked", + composite.getSuperType().getAreaVersion() > 0); + } + } + } + } + + @Test + public void impliedBaseCompositeIsResolvedAtImport() throws Exception { + MOModel model = new MOModel(); + model.add(Corpus.read(Corpus.file("area001-v003-MAL.xml"))); + Specification mps = Corpus.read( + Corpus.file("area005-v001-Mission-Planning-and-Scheduling.xml")); + model.add(mps); + new Linker().link(model); + + for (Area area : mps.getAreas()) { + for (TypeDefinition type : area.getDataTypes()) { + if (type instanceof CompositeType) { + assertNotNull(type.getName(), ((CompositeType) type).getSuperType()); + } + } + } + } + + @Test + public void comObjectsAndEventsAreReadWithTheirLinks() throws Exception { + Specification spec = Corpus.read(Corpus.file("area007-v001-Software-Management.xml")); + Service apps = spec.getAreas().get(0).getService("AppsLauncher"); + assertNotNull(apps); + assertNotNull(apps.getCom()); + + assertEquals(1, apps.getCom().getObjects().size()); + assertEquals(3, apps.getCom().getEvents().size()); + + COMObject app = apps.getCom().getObjects().get(0); + assertEquals("App", app.getName()); + assertEquals(1, app.getNumber()); + assertNotNull("App has a body type", app.getBodyType()); + assertNotNull("App has a source link", app.getSource()); + assertNotNull("the source link names PackageManagement::Installation", + app.getSource().getTarget()); + assertEquals("PackageManagement", app.getSource().getTarget().getService()); + assertEquals(2, app.getSource().getTarget().getNumber()); + + // Stopping and Stopped have no body at all. + for (COMObject event : apps.getCom().getEvents()) { + if ("Stopping".equals(event.getName()) || "Stopped".equals(event.getName())) { + assertNull(event.getName() + " has no body", event.getBodyType()); + } + } + } +} diff --git a/api-generator/api-generator-lib/src/test/java/esa/mo/apigen/model/AreaKeyTest.java b/api-generator/api-generator-lib/src/test/java/esa/mo/apigen/model/AreaKeyTest.java new file mode 100644 index 00000000..bbaf88f5 --- /dev/null +++ b/api-generator/api-generator-lib/src/test/java/esa/mo/apigen/model/AreaKeyTest.java @@ -0,0 +1,54 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.model; + +import static org.junit.Assert.*; +import org.junit.Test; + +/** + * Area identity needs all three of name, number and version. The specifications contain + * areas sharing a name under different numbers, and a number under different names. + */ +public class AreaKeyTest { + + @Test + public void sameNameDifferentNumberIsADifferentArea() { + // MC is area 4; Edge Monitor and Control is also called MC, but is area 104. + assertNotEquals(new AreaKey("MC", 4, 1), new AreaKey("MC", 104, 1)); + } + + @Test + public void sameNumberDifferentNameIsADifferentArea() { + // MPD and 'distribution' both declare area number 9. + assertNotEquals(new AreaKey("MPD", 9, 1), new AreaKey("distribution", 9, 1)); + } + + @Test + public void sameNameAndNumberDifferentVersionIsADifferentArea() { + assertNotEquals(new AreaKey("MAL", 1, 1), new AreaKey("MAL", 1, 3)); + } + + @Test + public void identicalKeysAreEqualAndHashAlike() { + assertEquals(new AreaKey("MAL", 1, 3), new AreaKey("MAL", 1, 3)); + assertEquals(new AreaKey("MAL", 1, 3).hashCode(), new AreaKey("MAL", 1, 3).hashCode()); + } +} diff --git a/api-generator/api-generator-lib/src/test/java/esa/mo/apigen/model/InteractionPatternTest.java b/api-generator/api-generator-lib/src/test/java/esa/mo/apigen/model/InteractionPatternTest.java new file mode 100644 index 00000000..9e17f17b --- /dev/null +++ b/api-generator/api-generator-lib/src/test/java/esa/mo/apigen/model/InteractionPatternTest.java @@ -0,0 +1,46 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.model; + +import static org.junit.Assert.*; +import org.junit.Test; + +public class InteractionPatternTest { + + @Test + public void patternsCarryTheirStagesInMessageOrder() { + assertEquals(java.util.Arrays.asList(InteractionStage.PROGRESS, InteractionStage.ACK, + InteractionStage.UPDATE, InteractionStage.RESPONSE), + InteractionPattern.PROGRESS.getStages()); + } + + @Test + public void subscriptionKeysBelongToPubSub() { + assertTrue(InteractionPattern.PUBSUB.hasStage(InteractionStage.SUBSCRIPTION_KEYS)); + assertFalse(InteractionPattern.REQUEST.hasStage(InteractionStage.SUBSCRIPTION_KEYS)); + } + + @Test + public void aRequestHasNoAcknowledgement() { + assertFalse(InteractionPattern.REQUEST.hasStage(InteractionStage.ACK)); + assertTrue(InteractionPattern.INVOKE.hasStage(InteractionStage.ACK)); + } +} diff --git a/api-generator/api-generator-lib/src/test/java/esa/mo/apigen/model/MOModelTest.java b/api-generator/api-generator-lib/src/test/java/esa/mo/apigen/model/MOModelTest.java new file mode 100644 index 00000000..1a3383aa --- /dev/null +++ b/api-generator/api-generator-lib/src/test/java/esa/mo/apigen/model/MOModelTest.java @@ -0,0 +1,126 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.model; + +import static esa.mo.apigen.model.ModelFixtures.*; +import esa.mo.apigen.model.com.COMFeatures; +import esa.mo.apigen.model.com.COMObject; +import esa.mo.apigen.model.com.ObjectReference; +import esa.mo.apigen.model.types.CompositeType; +import static org.junit.Assert.*; +import org.junit.Test; + +public class MOModelTest { + + @Test + public void resolvesAnAreaLevelType() { + MOModel model = new MOModel(); + Specification spec = spec("mal.xml", SchemaVersion.V003); + Area mal = area(spec, "MAL", 1, 3); + CompositeType blob = composite(mal, "Blob", 1); + model.add(spec); + + assertSame(blob, model.resolve(ref("MAL", 3, "Blob"))); + } + + @Test + public void doesNotResolveAcrossAreaVersions() { + MOModel model = new MOModel(); + Specification spec = spec("mal.xml", SchemaVersion.V003); + Area mal = area(spec, "MAL", 1, 3); + composite(mal, "Blob", 1); + model.add(spec); + + // The v1 reference must not silently pick up the v3 type. + assertNull(model.resolve(ref("MAL", 1, "Blob"))); + } + + @Test + public void bothVersionsOfAnAreaCanBeLoadedAndResolveSeparately() { + MOModel model = new MOModel(); + Specification v1 = spec("mal-v1.xml", SchemaVersion.V001); + CompositeType oldBlob = composite(area(v1, "MAL", 1, 1), "Blob", 1); + Specification v3 = spec("mal-v3.xml", SchemaVersion.V003); + CompositeType newBlob = composite(area(v3, "MAL", 1, 3), "Blob", 1); + model.add(v1); + model.add(v3); + + assertSame(oldBlob, model.resolve(ref("MAL", 1, "Blob"))); + assertSame(newBlob, model.resolve(ref("MAL", 3, "Blob"))); + assertTrue(model.getConflictingAreas().isEmpty()); + } + + @Test + public void aDuplicateAreaIdentityIsRecordedRatherThanOverwriting() { + // area002-v001-COM.xml and area002-v002-Basics.xml both declare COM 2 v1. + MOModel model = new MOModel(); + Specification com = spec("area002-v001-COM.xml", SchemaVersion.V001); + Area first = area(com, "COM", 2, 1); + Specification basics = spec("area002-v002-Basics.xml", SchemaVersion.V001); + Area second = area(basics, "COM", 2, 1); + model.add(com); + model.add(basics); + + assertSame(first, model.findArea(new AreaKey("COM", 2, 1))); + assertEquals(1, model.getConflictingAreas().size()); + assertSame(second, model.getConflictingAreas().get(0)); + } + + @Test + public void anAmbiguousNameAndVersionResolvesToNothing() { + // MC is area 4; Edge Monitor and Control is also MC, area 104. Same name and + // version, so a reference naming only 'MC' cannot be resolved. + MOModel model = new MOModel(); + Specification a = spec("area004.xml", SchemaVersion.V001); + area(a, "MC", 4, 1); + Specification b = spec("area104.xml", SchemaVersion.V001); + area(b, "MC", 104, 1); + model.add(a); + model.add(b); + + assertNull(model.findArea("MC", 1)); + assertNull(model.findUniqueArea("MC")); + assertEquals(2, model.findAreas("MC").size()); + } + + @Test + public void resolvesACOMObjectByNumberAcrossObjectsAndEvents() { + MOModel model = new MOModel(); + Specification spec = spec("sm.xml", SchemaVersion.V001); + Area sm = area(spec, "SoftwareManagement", 7, 1); + Service apps = service(sm, "AppsLauncher", 5); + COMFeatures com = new COMFeatures(); + COMObject app = new COMObject(); + app.setName("App"); + app.setNumber(1); + com.getObjects().add(app); + COMObject stopApp = new COMObject(); + stopApp.setName("StopApp"); + stopApp.setNumber(2); + com.getEvents().add(stopApp); + apps.setCom(com); + model.add(spec); + + assertSame(app, model.resolve(new ObjectReference("SoftwareManagement", 1, "AppsLauncher", 1))); + assertSame(stopApp, model.resolve(new ObjectReference("SoftwareManagement", 1, "AppsLauncher", 2))); + assertNull(model.resolve(new ObjectReference("SoftwareManagement", 1, "AppsLauncher", 9))); + } +} diff --git a/api-generator/api-generator-lib/src/test/java/esa/mo/apigen/model/ModelFixtures.java b/api-generator/api-generator-lib/src/test/java/esa/mo/apigen/model/ModelFixtures.java new file mode 100644 index 00000000..b584f709 --- /dev/null +++ b/api-generator/api-generator-lib/src/test/java/esa/mo/apigen/model/ModelFixtures.java @@ -0,0 +1,88 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.model; + +import esa.mo.apigen.model.types.CompositeType; +import esa.mo.apigen.model.types.TypeRef; + +/** + * Small builders, so the tests read as what they are checking rather than as setup. + */ +public final class ModelFixtures { + + private ModelFixtures() { + } + + public static Specification spec(String name, SchemaVersion version) { + Specification spec = new Specification(); + spec.setSchemaVersion(version); + spec.setSource(new SourceRef(name, null)); + return spec; + } + + public static Area area(Specification spec, String name, int number, int version) { + Area area = new Area(); + area.setName(name); + area.setNumber(number); + area.setVersion(version); + spec.addArea(area); + return area; + } + + public static Service service(Area area, String name, int number) { + Service service = new Service(); + service.setName(name); + service.setNumber(number); + area.addService(service); + return service; + } + + public static CapabilitySet capability(Service service, int number) { + CapabilitySet set = new CapabilitySet(); + set.setNumber(number); + service.addCapabilitySet(set); + return set; + } + + public static Operation operation(CapabilitySet set, String name, int number, + InteractionPattern pattern) { + Operation op = new Operation(); + op.setName(name); + op.setNumber(number); + op.setPattern(pattern); + set.addOperation(op); + return op; + } + + public static CompositeType composite(Area area, String name, Integer shortFormPart) { + CompositeType type = new CompositeType(); + type.setName(name); + type.setShortFormPart(shortFormPart); + type.setArea(area); + type.setSuperType(new TypeRef("MAL", 3, null, "Composite", false, false)); + area.getDataTypes().add(type); + return type; + } + + public static TypeRef ref(String area, int version, String name) { + return new TypeRef(area, version, null, name, false, false); + } +} diff --git a/api-generator/api-generator-lib/src/test/java/esa/mo/apigen/model/TypeDefinitionTest.java b/api-generator/api-generator-lib/src/test/java/esa/mo/apigen/model/TypeDefinitionTest.java new file mode 100644 index 00000000..5f44f9e7 --- /dev/null +++ b/api-generator/api-generator-lib/src/test/java/esa/mo/apigen/model/TypeDefinitionTest.java @@ -0,0 +1,60 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.model; + +import esa.mo.apigen.model.types.AttributeType; +import esa.mo.apigen.model.types.CompositeType; +import esa.mo.apigen.model.types.FundamentalType; +import static org.junit.Assert.*; +import org.junit.Test; + +public class TypeDefinitionTest { + + /** + * Absence of a short form part is the only thing that makes a composite abstract. The + * schema says so outright, and 0 was never a legal value - the type is restricted to + * 1 and above in every schema version - so nothing should treat 0 as a marker. + */ + @Test + public void aCompositeIsAbstractOnlyWhenItHasNoShortFormPart() { + CompositeType abstractComposite = new CompositeType(); + assertNull(abstractComposite.getShortFormPart()); + assertTrue(abstractComposite.isAbstract()); + + CompositeType concrete = new CompositeType(); + concrete.setShortFormPart(7); + assertFalse(concrete.isAbstract()); + + CompositeType zero = new CompositeType(); + zero.setShortFormPart(0); + assertFalse("0 is not a marker for abstract", zero.isAbstract()); + } + + @Test + public void fundamentalTypesAreAlwaysAbstract() { + assertTrue(new FundamentalType().isAbstract()); + } + + @Test + public void attributeTypesAreNeverAbstract() { + assertFalse(new AttributeType().isAbstract()); + } +} diff --git a/api-generator/api-generator-lib/src/test/java/esa/mo/apigen/model/TypeRefTest.java b/api-generator/api-generator-lib/src/test/java/esa/mo/apigen/model/TypeRefTest.java new file mode 100644 index 00000000..bd528e47 --- /dev/null +++ b/api-generator/api-generator-lib/src/test/java/esa/mo/apigen/model/TypeRefTest.java @@ -0,0 +1,77 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.model; + +import esa.mo.apigen.model.types.TypeRef; +import static org.junit.Assert.*; +import org.junit.Test; + +/** + * The area version is part of a type reference's identity. If it were not, the same type + * name in two versions of an area would compare equal while resolving to different + * definitions - which is why the version is carried in the reference rather than supplied + * at each lookup. + */ +public class TypeRefTest { + + private static TypeRef malBlob(int version) { + return new TypeRef("MAL", version, null, "Blob", false, false); + } + + @Test + public void sameNameDifferentAreaVersionIsNotTheSameType() { + assertNotEquals(malBlob(1), malBlob(3)); + assertNotEquals(malBlob(1).hashCode(), malBlob(3).hashCode()); + } + + @Test + public void identicalReferencesAreEqualAndHashAlike() { + assertEquals(malBlob(3), malBlob(3)); + assertEquals(malBlob(3).hashCode(), malBlob(3).hashCode()); + } + + @Test + public void listAndObjectRefChangeIdentity() { + TypeRef plain = new TypeRef("MPS", 1, null, "RequestInstance", false, false); + TypeRef list = new TypeRef("MPS", 1, null, "RequestInstance", true, false); + TypeRef objRef = new TypeRef("MPS", 1, null, "RequestInstance", false, true); + assertNotEquals(plain, list); + assertNotEquals(plain, objRef); + assertNotEquals(list, objRef); + } + + @Test + public void serviceQualifierIsPartOfIdentity() { + TypeRef areaLevel = new TypeRef("MC", 1, null, "Foo", false, false); + TypeRef serviceLevel = new TypeRef("MC", 1, "Action", "Foo", false, false); + assertNotEquals(areaLevel, serviceLevel); + } + + @Test + public void linkingFillsInTheVersionAndChangesNothingElse() { + TypeRef unlinked = new TypeRef("MAL", 0, null, "Blob", true, false); + TypeRef linked = unlinked.withAreaVersion(3); + assertEquals(0, unlinked.getAreaVersion()); + assertEquals(3, linked.getAreaVersion()); + assertEquals(unlinked.getName(), linked.getName()); + assertTrue(linked.isList()); + } +} diff --git a/api-generator/api-generator-lib/src/test/java/esa/mo/apigen/validation/ValidatorCorpusTest.java b/api-generator/api-generator-lib/src/test/java/esa/mo/apigen/validation/ValidatorCorpusTest.java new file mode 100644 index 00000000..e94a95f9 --- /dev/null +++ b/api-generator/api-generator-lib/src/test/java/esa/mo/apigen/validation/ValidatorCorpusTest.java @@ -0,0 +1,266 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.validation; + +import esa.mo.apigen.importers.xml.XmlImporter; +import esa.mo.apigen.link.Linker; +import esa.mo.apigen.model.MOModel; +import esa.mo.apigen.model.SourceRef; +import esa.mo.apigen.model.Specification; +import java.io.File; +import java.io.FileInputStream; +import java.io.InputStreamReader; +import java.io.Reader; +import java.nio.charset.Charset; +import java.util.ArrayList; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import static org.junit.Assert.*; +import org.junit.Assume; +import org.junit.Before; +import org.junit.Test; + +/** + * The validator run over the specifications in this repository. + *

                  + * Every specification is loaded together, as a build does, so that references across + * areas resolve. What is left is either a defect in a specification or a defect in a rule, + * and the difference is worth knowing: this test exists because the validator was for a + * while reporting a hundred problems that were all its own, which buried the two that + * were real. + */ +public class ValidatorCorpusTest { + + private static final String NL = System.getProperty("line.separator"); + + /** + * The one reference that names a type no specification declares: a field of the + * Mission Data Product Distribution area names {@code MC::Check.CheckSummary}, and the + * Check service declares {@code CheckLinkSummary} and {@code CheckResultSummary}. It + * is left as it is until someone decides what it was meant to say, and pinned here so + * that fixing it makes this test fail rather than passing unnoticed. + */ + private static final String KNOWN_DANGLING_TYPE = "MC.1::Check.CheckSummary"; + + /** + * Returns true if the issue says a specification is being built against a MAL of + * another generation. + *

                  + * A specification declares its generation by its namespace and names its errors to + * match: v001 raises {@code UNKNOWN}, v003 raises {@code Unknown}, and the two also + * carry different numbers. Paired with the MAL of its own generation a specification + * resolves completely; the six v001 specifications are built against MAL v3 because + * that is the only MAL with a Java API, and this says so once for each of them. + */ + private static boolean isMalGeneration(ValidationIssue issue) { + return "specification.malGeneration".equals(issue.getRule()); + } + + /** + * What each specification is checked alongside. + *

                  + * The corpus cannot be loaded as one set. It holds two versions of the MAL area and + * three areas called MC, and a reference carries no version, so loading all of them + * together makes almost every reference ambiguous. A build never does that: it loads + * one target and the specifications it names. These are those sets. + */ + private static final String[][] SETS = { + {"area001-v003-MAL.xml"}, + {"area002-v001-COM.xml", "area001-v003-MAL.xml"}, + {"area003-v001-Common.xml", "area001-v003-MAL.xml", "area002-v001-COM.xml"}, + {"area004-v001-Monitor-and-Control.xml", "area001-v003-MAL.xml", "area002-v001-COM.xml"}, + {"area004-v002-Monitor-and-Control.xml", "area001-v003-MAL.xml"}, + {"area005-v001-Mission-Planning-and-Scheduling.xml", "area001-v003-MAL.xml"}, + {"area007-v001-Software-Management.xml", "area001-v003-MAL.xml", "area002-v001-COM.xml"}, + {"area009-v001-Mission-Product-Distribution.xml", "area001-v003-MAL.xml"}, + {"area020-v001-File-Management.xml", "area001-v003-MAL.xml"}, + {"area051-v001-Mission-Data-Product.xml", "area001-v003-MAL.xml", "area002-v001-COM.xml", + "area004-v001-Monitor-and-Control.xml"}, + {"area052-v001-Mission-Data-Product-Distribution.xml", "area001-v003-MAL.xml", + "area002-v001-COM.xml", "area004-v001-Monitor-and-Control.xml"}, + }; + + @Before + public void findCorpus() { + Assume.assumeNotNull(dir()); + } + + private static File dir() { + File here = new File(System.getProperty("user.dir")).getAbsoluteFile(); + while (here != null) { + File d = new File(here, + "xml-service-specifications/xml-ccsds-mo-prototypes/src/main/resources/xml"); + if (d.isDirectory()) { + return d; + } + here = here.getParentFile(); + } + return null; + } + + private static MOModel load(String[] set) throws Exception { + MOModel model = new MOModel(); + // References first, then the target, as a build loads them. + for (int i = set.length - 1; i >= 0; i--) { + File file = new File(dir(), set[i]); + if (!file.isFile()) { + return null; + } + Reader in = new InputStreamReader(new FileInputStream(file), Charset.forName("UTF-8")); + try { + model.add(new XmlImporter().read(in, new SourceRef(file.getName(), file.getPath()))); + } finally { + in.close(); + } + } + new Linker().link(model); + return model; + } + + /** + * Every reported error is one of the two known dangling references, and each is + * reported as often as it occurs. + */ + @Test + public void theOnlyErrorIsTheKnownDanglingType() throws Exception { + List unexpected = new ArrayList(); + int dangling = 0; + + for (String[] set : SETS) { + MOModel model = load(set); + if (model == null) { + continue; + } + for (ValidationIssue issue : new Validator().validate(model).getIssues(Severity.ERROR)) { + if (KNOWN_DANGLING_TYPE.equals(named(issue.getMessage()))) { + dangling++; + } else { + unexpected.add(set[0] + ": " + issue); + } + } + } + + if (!unexpected.isEmpty()) { + StringBuilder message = new StringBuilder(unexpected.size() + + " error(s) that are not the known dangling type:" + NL); + for (String line : unexpected) { + message.append(" ").append(line).append(NL); + } + fail(message.toString()); + } + assertEquals("the known dangling type should still be reported", 1, dangling); + } + + /** + * Being built against another generation of the MAL is reported once for the + * specification, not once for every name that does not match, and the only error + * references left unresolved are the two that no generation explains. + */ + @Test + public void theMalGenerationGapIsReportedOncePerSpecification() throws Exception { + java.util.Set generationGaps = new java.util.TreeSet(); + java.util.Set unexplained = new java.util.TreeSet(); + + for (String[] set : SETS) { + MOModel model = load(set); + if (model == null) { + continue; + } + ValidationResult result = new Validator().validate(model); + for (ValidationIssue issue : result.getIssues(Severity.ERROR)) { + assertFalse("an unresolved error should be a warning: " + issue, + "error.unresolved".equals(issue.getRule())); + } + for (ValidationIssue issue : result.getIssues(Severity.WARNING)) { + if (isMalGeneration(issue)) { + generationGaps.add(String.valueOf(issue.getLocation().getSource())); + } else if ("error.unresolved".equals(issue.getRule())) { + unexplained.add(named(issue.getMessage())); + } + } + } + + // Every specification still on the v001 schema, each said once. That includes + // File Management, which raises no MAL error at all: the gap is a fact about the + // specification, not about whether it happens to name something that differs. + assertEquals("one warning per specification of the older generation", 7, + generationGaps.size()); + + // FM::OTHER_ERROR names nothing at all - File Management declares OTHER. + // MAL::AUTHENTICATION_FAIL is the one MAL error v003 renamed by word rather than + // by spelling, to "Authentication Failed", and so the one whose two generations + // would not even yield the same Java class name. + java.util.Set expected = new java.util.TreeSet( + java.util.Arrays.asList("FM.1::OTHER_ERROR", "MAL.3::AUTHENTICATION_FAIL")); + assertEquals("only these are left unresolved", expected, unexplained); + } + + /** + * A specification paired with the MAL of its own generation resolves completely. + */ + @Test + public void eachGenerationResolvesAgainstItsOwnMal() throws Exception { + MOModel v001 = load(new String[]{"area004-v001-Monitor-and-Control.xml", + "area002-v001-COM.xml", "area001-v001-MAL.xml"}); + MOModel v003 = load(new String[]{"area004-v002-Monitor-and-Control.xml", + "area001-v003-MAL.xml"}); + Assume.assumeNotNull(v001, v003); + + assertFalse("MC v1 with MAL v1 should report nothing", + new Validator().validate(v001).hasIssues()); + assertFalse("MC v2 with MAL v3 should report nothing", + new Validator().validate(v003).hasIssues()); + } + + /** + * An area referring to a type of another area must resolve, which is only true + * because every specification is loaded before anything is checked. + */ + @Test + public void referencesAcrossAreasResolve() throws Exception { + for (String[] set : SETS) { + MOModel model = load(set); + if (model == null) { + continue; + } + for (ValidationIssue issue : new Validator().validate(model).getIssues(Severity.ERROR)) { + assertFalse(set[0] + ": no reference should be left unlinked: " + issue, + "type.unlinked".equals(issue.getRule()) + || "error.unlinked".equals(issue.getRule())); + } + } + } + + private static String named(String message) { + // "Cannot resolve type X used by ..." / "Cannot resolve error X raised by ..." + for (String prefix : new String[]{"Cannot resolve type ", "Cannot resolve error "}) { + int at = message.indexOf(prefix); + if (at >= 0) { + String rest = message.substring(at + prefix.length()); + int end = rest.indexOf(' '); + return end < 0 ? rest : rest.substring(0, end); + } + } + return null; + } +} diff --git a/api-generator/api-generator-lib/src/test/java/esa/mo/apigen/validation/ValidatorTest.java b/api-generator/api-generator-lib/src/test/java/esa/mo/apigen/validation/ValidatorTest.java new file mode 100644 index 00000000..da278696 --- /dev/null +++ b/api-generator/api-generator-lib/src/test/java/esa/mo/apigen/validation/ValidatorTest.java @@ -0,0 +1,193 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.validation; + +import esa.mo.apigen.model.*; +import static esa.mo.apigen.model.ModelFixtures.*; +import esa.mo.apigen.model.com.COMFeatures; +import esa.mo.apigen.model.com.COMObject; +import esa.mo.apigen.model.com.ObjectLink; +import esa.mo.apigen.model.types.CompositeType; +import static org.junit.Assert.*; +import org.junit.Test; + +public class ValidatorTest { + + private static MOModel modelWith(Specification... specs) { + MOModel model = new MOModel(); + for (Specification spec : specs) { + model.add(spec); + } + return model; + } + + private static boolean has(ValidationResult result, String rule) { + for (ValidationIssue issue : result.getIssues()) { + if (issue.getRule().equals(rule)) { + return true; + } + } + return false; + } + + private static Specification mal() { + Specification mal = spec("mal.xml", SchemaVersion.V003); + composite(area(mal, "MAL", 1, 3), "Composite", 1); + return mal; + } + + /** + * COM objects and events share one numbering space within a service - the schema's + * uniqueness constraint selects both lists on a single number field. In Software + * Management, AppsLauncher numbers its object 1 and its events 2, 3 and 4. + */ + @Test + public void comObjectsAndEventsShareOneNumberingSpace() { + Specification spec = spec("sm.xml", SchemaVersion.V001); + Service service = service(area(spec, "SM", 7, 1), "AppsLauncher", 5); + COMFeatures com = new COMFeatures(); + COMObject app = new COMObject(); + app.setName("App"); + app.setNumber(1); + com.getObjects().add(app); + COMObject clash = new COMObject(); + clash.setName("StopApp"); + clash.setNumber(1); + com.getEvents().add(clash); + service.setCom(com); + + assertTrue(has(new Validator().validate(modelWith(spec)), "com.number.duplicate")); + } + + @Test + public void aCOMLinkWithNeitherTargetNorCommentIsPointedOut() { + Specification spec = spec("sm.xml", SchemaVersion.V001); + Service service = service(area(spec, "SM", 7, 1), "PackageManagement", 1); + COMFeatures com = new COMFeatures(); + COMObject pkg = new COMObject(); + pkg.setName("Package"); + pkg.setNumber(1); + pkg.setRelated(new ObjectLink()); + com.getObjects().add(pkg); + service.setCom(com); + + ValidationResult result = new Validator().validate(modelWith(spec)); + assertTrue(has(result, "com.link.empty")); + assertFalse("an empty link is noise, not a build failure", result.hasErrors()); + } + + @Test + public void supportInReplayIsRejectedOnAV003Specification() { + Specification spec = spec("mc.xml", SchemaVersion.V003); + Operation op = operation(capability(service(area(spec, "MC", 4, 2), "Action", 1), 1), + "submitAction", 1, InteractionPattern.SUBMIT); + op.setSupportInReplay(true); + + assertTrue(has(new Validator().validate(modelWith(spec)), "version.supportInReplay")); + } + + @Test + public void serviceLevelDataTypesAreRejectedOnAV003Specification() { + Specification spec = spec("mpd.xml", SchemaVersion.V003); + Service service = service(area(spec, "MPD", 9, 1), "ProductRetrieval", 1); + CompositeType type = new CompositeType(); + type.setName("Stray"); + service.getDataTypes().add(type); + + assertTrue(has(new Validator().validate(modelWith(spec)), "version.serviceDataTypes")); + } + + @Test + public void aMessageAtAStageThePatternDoesNotHaveIsRejected() { + Specification spec = spec("mc.xml", SchemaVersion.V003); + Operation op = operation(capability(service(area(spec, "MC", 4, 2), "Action", 1), 1), + "listAction", 1, InteractionPattern.REQUEST); + op.getMessages().put(InteractionStage.SUBSCRIPTION_KEYS, new MessageBody()); + + assertTrue(has(new Validator().validate(modelWith(spec)), "operation.stage.unexpected")); + } + + @Test + public void duplicateOperationNumbersWithinAServiceAreRejected() { + Specification spec = spec("mc.xml", SchemaVersion.V003); + CapabilitySet set = capability(service(area(spec, "MC", 4, 2), "Action", 1), 1); + operation(set, "one", 1, InteractionPattern.SUBMIT); + operation(set, "two", 1, InteractionPattern.SUBMIT); + + assertTrue(has(new Validator().validate(modelWith(spec)), "operation.number.duplicate")); + } + + @Test + public void anUnresolvableTypeIsReported() { + Specification spec = spec("mc.xml", SchemaVersion.V003); + Area mc = area(spec, "MC", 4, 2); + CompositeType type = composite(mc, "ActionDefinition", 1); + Field field = new Field(); + field.setName("missing"); + field.setType(ref("MAL", 3, "NoSuchType")); + type.getFields().add(field); + + assertTrue(has(new Validator().validate(modelWith(spec, mal())), "type.unresolved")); + } + + @Test + public void anUnlinkedTypeReferenceIsReported() { + Specification spec = spec("mc.xml", SchemaVersion.V003); + Area mc = area(spec, "MC", 4, 2); + CompositeType type = composite(mc, "ActionDefinition", 1); + Field field = new Field(); + field.setName("unlinked"); + field.setType(new esa.mo.apigen.model.types.TypeRef("MAL", 0, null, "Blob", false, false)); + type.getFields().add(field); + + assertTrue(has(new Validator().validate(modelWith(spec, mal())), "type.unlinked")); + } + + @Test + public void aDuplicateAreaIdentityIsAWarningNotAnError() { + // Nothing in the build loads a colliding pair today, so this guards a future + // pairing rather than describing a current failure. + Specification com = spec("area002-v001-COM.xml", SchemaVersion.V001); + area(com, "COM", 2, 1); + Specification basics = spec("area002-v002-Basics.xml", SchemaVersion.V001); + area(basics, "COM", 2, 1); + + ValidationResult result = new Validator().validate(modelWith(com, basics)); + assertTrue(has(result, "area.identity.duplicate")); + assertFalse(result.hasErrors()); + } + + @Test + public void aCleanModelReportsNothing() { + Specification spec = spec("mc.xml", SchemaVersion.V003); + Area mc = area(spec, "MC", 4, 2); + CompositeType details = composite(mc, "ActionDefinition", 1); + Field field = new Field(); + field.setName("name"); + field.setType(ref("MAL", 3, "Composite")); + details.getFields().add(field); + operation(capability(service(mc, "Action", 1), 1), "submitAction", 1, + InteractionPattern.SUBMIT); + + ValidationResult result = new Validator().validate(modelWith(spec, mal())); + assertFalse(result.toString(), result.hasIssues()); + } +} diff --git a/api-generator/golden/.gitignore b/api-generator/golden/.gitignore new file mode 100644 index 00000000..9a8dc65e --- /dev/null +++ b/api-generator/golden/.gitignore @@ -0,0 +1,2 @@ +baseline/ +last-diff.txt diff --git a/api-generator/golden/README.md b/api-generator/golden/README.md new file mode 100644 index 00000000..ec4a5481 --- /dev/null +++ b/api-generator/golden/README.md @@ -0,0 +1,61 @@ +# Golden-tree harness (Phase 0) + +The regression net for replacing the generators with `api-generator-lib`. It captures what the +current generators produce and reports every difference on a later build. + +See `../api-generator-lib/DESIGN.md` §10.1. + +``` +./golden.sh capture build apis/* and mo-navigator, store the result as the baseline +./golden.sh compare build again and report every difference from the baseline +./golden.sh snapshot-only capture from existing target/ output, without rebuilding +./golden.sh compare-only compare without rebuilding +``` + +The baseline lives in `baseline/` (override with `GOLDEN_BASELINE=/some/path`) and is git-ignored: +it is ~20 MB and regenerable. Full diffs are written to `last-diff.txt`; the console shows a +per-file summary. + +## What it captures + +| | | +| --- | --- | +| Java | `apis/*/target/generated-sources/stub` — **950 files, ~116 000 lines** across 7 modules | +| docx | every specification rendered by `AppGenerateDocx`, **unzipped** so `word/document.xml` diffs as text — 18 documents | + +Unzipping matters: a `.docx` is a zip, and zips differ byte-wise on timestamps alone. Comparing the +XML inside is both stable and readable. + +## The baseline is a change detector, not a definition of correctness + +The current output has its own quirks. Every reported difference is one of two things: + +- **a defect in the new generator** — fix it; +- **a deliberate improvement** — record it in `intended-differences.txt` with a reason and a date, + then re-capture so the diff returns to zero. + +A permanently fuzzy diff is no safety net, because the next real regression hides in the noise. + +A textual diff is also not sufficient on its own once differences are intentional. The second tier +is to compile the regenerated tree and run the existing suites — `mal-impl`, `services-impl`, the +transports and the testbeds all compile against `apis/*`. + +## Findings from the first capture + +Two specifications produce **no** docx at all. Both are pre-existing, unrelated to this migration, +and worth fixing independently: + +- **`area051-v001-Mission-Data-Product.xml`** — generation throws + `IllegalStateException: Unknown composite super type: String`, and the exception is caught + per-file, so the run reports success while silently producing nothing for that spec. +- **`area002-v002-Basics.xml`** — declares `name="COM" number="2" version="1"`, identical to + `area002-v001-COM.xml`. The docx filename is built from area number, version and name + (`GeneratorDocx:365`), so both specs map to the same file and one silently overwrites the other. + This is the area-identity collision of design §4.1, causing real data loss today. + +Also worth knowing: **`area052-v001-Mission-Data-Product-Distribution.xml` is written as +`Service_Specification_area009-v001-distribution.docx`** — the name comes from the *declared* area +number (9), not the filename (052), so it sits one character away from colliding with MPD, which is +also area 9. + +Generation is otherwise deterministic: three consecutive runs produced byte-identical output. diff --git a/api-generator/golden/golden.sh b/api-generator/golden/golden.sh new file mode 100755 index 00000000..49ed0898 --- /dev/null +++ b/api-generator/golden/golden.sh @@ -0,0 +1,174 @@ +#!/usr/bin/env bash +# +# Phase 0 regression harness for the api-generator-lib migration. +# +# ./golden.sh capture build with the current generators, store the result as the baseline +# ./golden.sh compare build again and report every difference from the baseline +# +# The baseline detects change; it does not define correctness. A reported difference is +# either a defect in the new generator, or a deliberate improvement — in which case record +# it in intended-differences.txt, then re-capture so the diff returns to zero. +# +# See ../api-generator-lib/DESIGN.md §10.1. + +set -u -o pipefail + +HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +REPO="$(cd "$HERE/../.." && pwd)" +BASELINE="${GOLDEN_BASELINE:-$HERE/baseline}" +IGNORE_FILE="$HERE/intended-differences.txt" +MVN="${MVN:-mvn}" +MVN_FLAGS="${MVN_FLAGS:---batch-mode -DskipTests}" + +API_MODULES=$(cd "$REPO" && ls -d apis/api-*/ 2>/dev/null | sed 's#/$##' | sort) + +log() { printf '\033[1m==>\033[0m %s\n' "$*"; } +warn() { printf '\033[33m !!\033[0m %s\n' "$*"; } +die() { printf '\033[31mERROR\033[0m %s\n' "$*" >&2; exit 1; } + +# ---------------------------------------------------------------- build + +build_java() { + log "Building apis/* with the current generators" + local list; list=$(echo "$API_MODULES" | paste -sd,) + (cd "$REPO" && $MVN $MVN_FLAGS install -pl "$list" --also-make) \ + || die "Maven build failed" +} + +build_navigator() { + log "Building mo-navigator (for docx generation)" + (cd "$REPO" && $MVN $MVN_FLAGS install -pl tooling/mo-navigator --also-make) \ + || die "mo-navigator build failed" +} + +# ------------------------------------------------------------- snapshot + +# snapshot_java — copy every generated Java tree, preserving module layout +snapshot_java() { + local dest="$1"; mkdir -p "$dest" + local n=0 + for m in $API_MODULES; do + local src="$REPO/$m/target/generated-sources/stub" + [ -d "$src" ] || { warn "no generated sources in $m — was it built?"; continue; } + mkdir -p "$dest/$(basename "$m")" + cp -r "$src/." "$dest/$(basename "$m")/" + n=$((n + $(find "$src" -name '*.java' | wc -l))) + done + echo "$n" +} + +# snapshot_docx — generate docx for every spec, unzipped so it diffs as text +snapshot_docx() { + local dest="$1"; mkdir -p "$dest" + local jar="$REPO/tooling/mo-navigator/target/mo-navigator-jar-with-dependencies.jar" + [ -f "$jar" ] || { warn "mo-navigator jar not found — skipping docx"; echo 0; return; } + + local tmp; tmp=$(mktemp -d) + local n=0 + for set_name in prototypes standards; do + local xmldir="$REPO/xml-service-specifications/xml-ccsds-mo-$set_name/src/main/resources/xml" + [ -d "$xmldir" ] || continue + rm -rf "$tmp/$set_name"; mkdir -p "$tmp/$set_name" + java -cp "$jar" esa.mo.navigator.AppGenerateDocx "$xmldir" "$tmp/$set_name" >/dev/null 2>&1 \ + || warn "docx generation reported an error for $set_name" + while IFS= read -r -d '' f; do + local name; name=$(basename "$f" .docx) + local out="$dest/$set_name/$name" + mkdir -p "$out" + (cd "$out" && unzip -oq "$f") # unzip: word/document.xml et al diff as text + n=$((n+1)) + done < <(find "$tmp/$set_name" -name '*.docx' -print0 2>/dev/null) + done + rm -rf "$tmp" + echo "$n" +} + +snapshot_all() { + local dest="$1" + rm -rf "$dest"; mkdir -p "$dest" + local nj nd + nj=$(snapshot_java "$dest/java") + nd=$(snapshot_docx "$dest/docx") + { + echo "captured: $(date -u +%Y-%m-%dT%H:%M:%SZ)" + echo "commit: $(cd "$REPO" && git rev-parse --short HEAD 2>/dev/null || echo unknown)" + echo "branch: $(cd "$REPO" && git rev-parse --abbrev-ref HEAD 2>/dev/null || echo unknown)" + echo "java files: $nj" + echo "docx documents: $nd" + } > "$dest/MANIFEST" + log "Snapshot: $nj Java files, $nd docx documents" +} + +# -------------------------------------------------------------- compare + +compare_to_baseline() { + local fresh="$1" + [ -d "$BASELINE" ] || die "No baseline at $BASELINE — run '$0 capture' first" + + local excludes=() + if [ -f "$IGNORE_FILE" ]; then + while IFS= read -r line; do + line="${line%%#*}"; line="$(echo "$line" | xargs)" + [ -n "$line" ] && excludes+=(--exclude="$line") + done < "$IGNORE_FILE" + fi + + log "Comparing against $BASELINE" + local report="$HERE/last-diff.txt" + diff -r -u "${excludes[@]}" \ + --exclude=MANIFEST \ + "$BASELINE" "$fresh" > "$report" 2>&1 + local rc=$? + + if [ $rc -eq 0 ]; then + log "No differences." + rm -f "$report" + return 0 + fi + + # per-file summary, which is the useful view + echo + warn "Differences found — full diff in $report" + echo + grep -E '^(diff -r|Only in)' "$report" \ + | sed -e 's#^diff -r -u [^ ]* # changed: #' \ + -e "s#$BASELINE/##g" -e "s#$fresh/##g" \ + -e 's#^Only in # only in: #' \ + | sort | uniq -c | sed 's/^ *[0-9]* //' | head -60 + echo + local changed only + changed=$(grep -c '^diff -r' "$report" || true) + only=$(grep -c '^Only in' "$report" || true) + printf ' %s file(s) differ, %s present on one side only\n\n' "$changed" "$only" + return 1 +} + +# ----------------------------------------------------------------- main + +case "${1:-help}" in + capture) + build_java; build_navigator + snapshot_all "$BASELINE" + log "Baseline written to $BASELINE" + ;; + compare) + build_java; build_navigator + fresh=$(mktemp -d) + trap 'rm -rf "$fresh"' EXIT + snapshot_all "$fresh" + compare_to_baseline "$fresh" + ;; + snapshot-only) # capture without rebuilding — uses existing target/ + snapshot_all "$BASELINE" + log "Baseline written to $BASELINE (no rebuild)" + ;; + compare-only) # compare without rebuilding + fresh=$(mktemp -d) + trap 'rm -rf "$fresh"' EXIT + snapshot_all "$fresh" + compare_to_baseline "$fresh" + ;; + *) + sed -n '2,14p' "$0" | sed 's/^# \{0,1\}//' + ;; +esac diff --git a/api-generator/golden/intended-differences.txt b/api-generator/golden/intended-differences.txt new file mode 100644 index 00000000..2da0c03e --- /dev/null +++ b/api-generator/golden/intended-differences.txt @@ -0,0 +1,16 @@ +# Intended differences — paths excluded from the golden-tree comparison. +# +# One glob per line, matched against file or directory names (diff --exclude). +# Every entry needs a reason and a date. This list is reviewed, not grown silently: +# when a difference is agreed, the right move is usually to make the change, re-capture +# the baseline with ./golden.sh capture, and return the diff to zero — a permanently +# fuzzy diff is no safety net, because the next real regression hides in the noise. +# +# See api-generator-lib-DESIGN.md §10.1. +# +# Format: +# # reason — YYYY-MM-DD +# +# --------------------------------------------------------------------------- + +# (none yet) From 3cda8a765b4744f637fe10d3cbb8686eccd7bb82 Mon Sep 17 00:00:00 2001 From: Cesar Coelho Date: Sat, 22 Aug 2026 23:46:00 +0200 Subject: [PATCH 36/45] Look an error up under the area that declares it An error name is not unique across the specifications: MPS declares INVALID as 1 and COM declares it as 70000, MC declares Invalid as 3 and MPD declares it as 1. The registry held error definitions in a map keyed by the name alone, so whichever area was loaded last took the name. An operation always names the area of the error it references, so the document generator asked for something the specification had already made unambiguous and was given whatever answered to the name. MPS::INVALID was documented as 70000 and MC::Invalid as 1. Which document was affected depended on what else was loaded: the standards set holds no MPD, so nothing competed for Invalid there. The Java generator uses the same lookup for the comment on a handler's throws clause. It happens to produce the same result today, because the fallback is only reached where a reference carries no comment of its own and no name collides there, but it was as exposed as the other one. An error is now held under its area as well as its name. The generated Java is unchanged; two documents now state the number their own XML gives. Co-Authored-By: Claude Opus 5 --- .../esa/mo/tools/stubgen/GeneratorDocx.java | 8 +++++- .../esa/mo/tools/stubgen/GeneratorBase.java | 7 +++-- .../mo/tools/stubgen/MOTypeInformation.java | 7 ++--- .../esa/mo/tools/stubgen/MOTypeRegistry.java | 26 +++++++++++++------ .../esa/mo/tools/stubgen/GeneratorLangs.java | 3 ++- 5 files changed, 36 insertions(+), 15 deletions(-) diff --git a/api-generator/generator-docs/src/main/java/esa/mo/tools/stubgen/GeneratorDocx.java b/api-generator/generator-docs/src/main/java/esa/mo/tools/stubgen/GeneratorDocx.java index 8b879784..67a828f7 100644 --- a/api-generator/generator-docs/src/main/java/esa/mo/tools/stubgen/GeneratorDocx.java +++ b/api-generator/generator-docs/src/main/java/esa/mo/tools/stubgen/GeneratorDocx.java @@ -880,7 +880,13 @@ public int compare(String o1, String o2) { String errorNumber = "UNKNOWN ERROR NUMBER!"; String es; if ((err.getType().getArea() == null) || (err.getType().getArea().equals(area.getName()))) { - ErrorDefinitionType edt = typeInformation.getErrorDefinition(err.getType().getName()); + // Looked up in the area the reference names, falling back to the area + // being documented where it names none: the same error name is used by + // several areas, with a different number in each. + String declaredIn = (err.getType().getArea() == null) + ? area.getName() : err.getType().getArea(); + ErrorDefinitionType edt = typeInformation.getErrorDefinition( + declaredIn, err.getType().getName()); if (edt != null) { errorNumber = String.valueOf(edt.getNumber()); } diff --git a/api-generator/generator-interfaces/src/main/java/esa/mo/tools/stubgen/GeneratorBase.java b/api-generator/generator-interfaces/src/main/java/esa/mo/tools/stubgen/GeneratorBase.java index 86f97433..4166ac84 100644 --- a/api-generator/generator-interfaces/src/main/java/esa/mo/tools/stubgen/GeneratorBase.java +++ b/api-generator/generator-interfaces/src/main/java/esa/mo/tools/stubgen/GeneratorBase.java @@ -106,7 +106,7 @@ public void loadXML(XmlSpecification xml) throws IOException, JAXBException { if ((null != area.getErrors()) && (null != area.getErrors().getError())) { for (ErrorDefinitionType error : area.getErrors().getError()) { - registry.registerError(error); + registry.registerError(area.getName(), error); } } @@ -117,8 +117,11 @@ public void loadXML(XmlSpecification xml) throws IOException, JAXBException { } if ((service.getErrors() != null) && (service.getErrors().getError() != null)) { + // Held under the area, not the service: the schema requires an error + // name to be unique across a whole specification, and a reference names + // only the area. for (ErrorDefinitionType error : service.getErrors().getError()) { - registry.registerError(error); + registry.registerError(area.getName(), error); } } } diff --git a/api-generator/generator-interfaces/src/main/java/esa/mo/tools/stubgen/MOTypeInformation.java b/api-generator/generator-interfaces/src/main/java/esa/mo/tools/stubgen/MOTypeInformation.java index 2b17e85c..c4837579 100644 --- a/api-generator/generator-interfaces/src/main/java/esa/mo/tools/stubgen/MOTypeInformation.java +++ b/api-generator/generator-interfaces/src/main/java/esa/mo/tools/stubgen/MOTypeInformation.java @@ -266,11 +266,12 @@ public esa.mo.xsd.CompositeType getCompositeDetails(TypeReference type) { /** * Returns error details if defined. * - * @param error The error to look for. + * @param area The area that declares the error, which is part of its identity. + * @param error The name of the error to look for. * @return the details if found, otherwise null. */ - public esa.mo.xsd.ErrorDefinitionType getErrorDefinition(String error) { - return registry.getErrorDefinition(error); + public esa.mo.xsd.ErrorDefinitionType getErrorDefinition(String area, String error) { + return registry.getErrorDefinition(area, error); } /** diff --git a/api-generator/generator-interfaces/src/main/java/esa/mo/tools/stubgen/MOTypeRegistry.java b/api-generator/generator-interfaces/src/main/java/esa/mo/tools/stubgen/MOTypeRegistry.java index 82f058ec..64885c95 100644 --- a/api-generator/generator-interfaces/src/main/java/esa/mo/tools/stubgen/MOTypeRegistry.java +++ b/api-generator/generator-interfaces/src/main/java/esa/mo/tools/stubgen/MOTypeRegistry.java @@ -77,10 +77,20 @@ public void reset() { /** * Registers an error definition. * + * @param area The area that declares it. * @param error The error definition to register. */ - public void registerError(ErrorDefinitionType error) { - errorDefinitionMap.put(error.getName(), error); + public void registerError(String area, ErrorDefinitionType error) { + errorDefinitionMap.put(keyOf(area, error.getName()), error); + } + + /** + * @param area The area that declares the error. + * @param name The name of the error. + * @return the key an error is held under. + */ + private static String keyOf(String area, String name) { + return area + "::" + name; } /** @@ -352,13 +362,13 @@ public CompositeType getCompositeDetails(TypeReference type) { /** * Returns error details if defined. * - * @param error The error to look for. + * @param area The area that declares the error, which is part of its identity: the + * specifications reuse a name across areas, and a reference always says which one it + * means. + * @param error The name of the error to look for. * @return the details if found, otherwise null. */ - public ErrorDefinitionType getErrorDefinition(String error) { - if (errorDefinitionMap.containsKey(error)) { - return errorDefinitionMap.get(error); - } - return null; + public ErrorDefinitionType getErrorDefinition(String area, String error) { + return errorDefinitionMap.get(keyOf(area, error)); } } diff --git a/api-generator/generator-java/src/main/java/esa/mo/tools/stubgen/GeneratorLangs.java b/api-generator/generator-java/src/main/java/esa/mo/tools/stubgen/GeneratorLangs.java index cb0a7984..33b0678e 100644 --- a/api-generator/generator-java/src/main/java/esa/mo/tools/stubgen/GeneratorLangs.java +++ b/api-generator/generator-java/src/main/java/esa/mo/tools/stubgen/GeneratorLangs.java @@ -546,7 +546,8 @@ protected void addOperationErrorsThrows(OperationSummary op, InterfaceMethodBuil if (comment == null || comment.isEmpty()) { // The error reference rarely carries its own comment, so fall // back to the comment of the referenced error definition. - ErrorDefinitionType def = typeInformation.getErrorDefinition(error.getType().getName()); + ErrorDefinitionType def = typeInformation.getErrorDefinition( + error.getType().getArea(), error.getType().getName()); comment = (def != null && def.getComment() != null && !def.getComment().isEmpty()) ? def.getComment() : "if the corresponding MO error occurs"; } From b2cef8cdd97ab5536f1041b6da7877b4d228c0df Mon Sep 17 00:00:00 2001 From: Cesar Coelho Date: Sun, 23 Aug 2026 12:11:23 +0200 Subject: [PATCH 37/45] Added the docx, MOSpec and XHTML generators to the api-generator-lib - docx: one Word document per area, matching the current output exactly, 126 of 126 parts byte for byte. Adds Batik, to rasterise declared diagrams. - MOSpec: the text format the navigator will edit, with a hand-written lexer, parser and exporter, held to three round-trip tests. - XHTML: the browsable page. The old generator crashed on composites that contain themselves, overwrote pages of areas sharing a name, and had seven broken links. All fixed; the drawings are reproduced (84 of 84 type diagrams, 258 of 260 message diagrams). The linker now records the service that declares a type; the field existed and nothing had ever filled it. The module joins the reactor, and its 39 corpus tests move to testbeds/testbed-api-generator, so building the library stays a compile. The 73 unit tests stay with the code they test. Nine of those 39 are golden trees that need a baseline captured from the old generators, so they skip in CI. To be addressed. Co-Authored-By: Claude Opus 5 --- .github/workflows/testbeds.yml | 110 ++ api-generator/api-generator-lib/DESIGN.md | 319 ++++- api-generator/api-generator-lib/pom.xml | 77 +- .../mo/apigen/exporters/mospec/DocMode.java | 44 + .../exporters/mospec/MOSpecExporter.java | 720 +++++++++++ .../apigen/exporters/mospec/MOSpecTypes.java | 171 +++ .../exporters/mospec/SourceFormatter.java | 188 +++ .../mo/apigen/exporters/xml/XmlExporter.java | 4 +- .../mo/apigen/generators/docx/DocxBody.java | 350 ++++++ .../mo/apigen/generators/docx/DocxCell.java | 166 +++ .../apigen/generators/docx/DocxDocument.java | 221 ++++ .../apigen/generators/docx/DocxGenerator.java | 915 ++++++++++++++ .../apigen/generators/docx/DocxNumbering.java | 80 ++ .../apigen/generators/docx/DocxResources.java | 84 ++ .../mo/apigen/generators/docx/DocxRow.java | 74 ++ .../mo/apigen/generators/docx/DocxTable.java | 99 ++ .../mo/apigen/generators/docx/DocxText.java | 90 ++ .../apigen/generators/docx/DocxTypeLink.java | 206 ++++ .../java/writers/CompositeWriter.java | 30 +- .../java/writers/ConsumerAdapterWriter.java | 5 + .../java/writers/ConsumerStubWriter.java | 4 + .../apigen/generators/xhtml/SvgDiagram.java | 288 +++++ .../mo/apigen/generators/xhtml/TypeNode.java | 340 ++++++ .../mo/apigen/generators/xhtml/XhtmlBody.java | 184 +++ .../generators/xhtml/XhtmlGenerator.java | 423 +++++++ .../mo/apigen/generators/xhtml/XhtmlLink.java | 113 ++ .../mo/apigen/generators/xhtml/XhtmlPage.java | 99 ++ .../mo/apigen/generators/xhtml/XhtmlText.java | 117 ++ .../mo/apigen/importers/mospec/Cursor.java | 134 ++ .../esa/mo/apigen/importers/mospec/Lexer.java | 387 ++++++ .../importers/mospec/MOSpecImporter.java | 1087 +++++++++++++++++ .../esa/mo/apigen/importers/mospec/Token.java | 77 ++ .../mo/apigen/importers/xml/StaxCursor.java | 13 +- .../mo/apigen/importers/xml/XmlImporter.java | 4 + .../main/java/esa/mo/apigen/link/Linker.java | 14 +- .../java/esa/mo/apigen/model/MOModel.java | 42 +- .../esa/mo/apigen/model/com/COMFeatures.java | 62 + .../src/main/resources/docx/content-types.xml | 1 + .../resources/docx/numbering-instance.xml | 1 + .../resources/docx/numbering-preamble.xml | 1 + .../src/main/resources/docx/package.rels | 1 + .../main/resources/docx/styles-calibri.xml | 1 + .../src/main/resources/docx/styles-ccsds.xml | 1 + .../resources/docx/styles-times-mo-table.xml | 1 + .../src/main/resources/docx/styles-times.xml | 1 + .../src/main/resources/docx/styles.xml | 1 + .../src/main/resources/xhtml/page.css | 93 ++ .../apigen/generators/docx/DocxBodyTest.java | 190 +++ .../generators/docx/DocxNumberingTest.java | 84 ++ api-generator/golden/README.md | 10 + api-generator/golden/intended-differences.txt | 11 +- api-generator/pom.xml | 1 + parent/pom.xml | 5 + testbeds/pom.xml | 1 + testbeds/testbed-api-generator/pom.xml | 98 ++ .../exporters/mospec/MOSpecRoundTripTest.java | 377 ++++++ .../apigen/exporters/xml/ModelComparison.java | 18 + .../exporters/xml/XmlRoundTripTest.java | 0 .../docx/DocxGeneratorGoldenTest.java | 259 ++++ .../mo/apigen/generators/java/GoldenTree.java | 0 .../java/JavaGeneratorGoldenTest.java | 0 .../xhtml/XhtmlGeneratorCorpusTest.java | 296 +++++ .../esa/mo/apigen/importers/xml/Corpus.java | 0 .../importers/xml/XmlImporterCorpusTest.java | 22 + .../validation/ValidatorCorpusTest.java | 0 65 files changed, 8735 insertions(+), 80 deletions(-) create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/exporters/mospec/DocMode.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/exporters/mospec/MOSpecExporter.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/exporters/mospec/MOSpecTypes.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/exporters/mospec/SourceFormatter.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/docx/DocxBody.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/docx/DocxCell.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/docx/DocxDocument.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/docx/DocxGenerator.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/docx/DocxNumbering.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/docx/DocxResources.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/docx/DocxRow.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/docx/DocxTable.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/docx/DocxText.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/docx/DocxTypeLink.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/xhtml/SvgDiagram.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/xhtml/TypeNode.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/xhtml/XhtmlBody.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/xhtml/XhtmlGenerator.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/xhtml/XhtmlLink.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/xhtml/XhtmlPage.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/xhtml/XhtmlText.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/importers/mospec/Cursor.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/importers/mospec/Lexer.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/importers/mospec/MOSpecImporter.java create mode 100644 api-generator/api-generator-lib/src/main/java/esa/mo/apigen/importers/mospec/Token.java create mode 100644 api-generator/api-generator-lib/src/main/resources/docx/content-types.xml create mode 100644 api-generator/api-generator-lib/src/main/resources/docx/numbering-instance.xml create mode 100644 api-generator/api-generator-lib/src/main/resources/docx/numbering-preamble.xml create mode 100644 api-generator/api-generator-lib/src/main/resources/docx/package.rels create mode 100644 api-generator/api-generator-lib/src/main/resources/docx/styles-calibri.xml create mode 100644 api-generator/api-generator-lib/src/main/resources/docx/styles-ccsds.xml create mode 100644 api-generator/api-generator-lib/src/main/resources/docx/styles-times-mo-table.xml create mode 100644 api-generator/api-generator-lib/src/main/resources/docx/styles-times.xml create mode 100644 api-generator/api-generator-lib/src/main/resources/docx/styles.xml create mode 100644 api-generator/api-generator-lib/src/main/resources/xhtml/page.css create mode 100644 api-generator/api-generator-lib/src/test/java/esa/mo/apigen/generators/docx/DocxBodyTest.java create mode 100644 api-generator/api-generator-lib/src/test/java/esa/mo/apigen/generators/docx/DocxNumberingTest.java create mode 100644 testbeds/testbed-api-generator/pom.xml create mode 100644 testbeds/testbed-api-generator/src/test/java/esa/mo/apigen/exporters/mospec/MOSpecRoundTripTest.java rename {api-generator/api-generator-lib => testbeds/testbed-api-generator}/src/test/java/esa/mo/apigen/exporters/xml/ModelComparison.java (94%) rename {api-generator/api-generator-lib => testbeds/testbed-api-generator}/src/test/java/esa/mo/apigen/exporters/xml/XmlRoundTripTest.java (100%) create mode 100644 testbeds/testbed-api-generator/src/test/java/esa/mo/apigen/generators/docx/DocxGeneratorGoldenTest.java rename {api-generator/api-generator-lib => testbeds/testbed-api-generator}/src/test/java/esa/mo/apigen/generators/java/GoldenTree.java (100%) rename {api-generator/api-generator-lib => testbeds/testbed-api-generator}/src/test/java/esa/mo/apigen/generators/java/JavaGeneratorGoldenTest.java (100%) create mode 100644 testbeds/testbed-api-generator/src/test/java/esa/mo/apigen/generators/xhtml/XhtmlGeneratorCorpusTest.java rename {api-generator/api-generator-lib => testbeds/testbed-api-generator}/src/test/java/esa/mo/apigen/importers/xml/Corpus.java (100%) rename {api-generator/api-generator-lib => testbeds/testbed-api-generator}/src/test/java/esa/mo/apigen/importers/xml/XmlImporterCorpusTest.java (92%) rename {api-generator/api-generator-lib => testbeds/testbed-api-generator}/src/test/java/esa/mo/apigen/validation/ValidatorCorpusTest.java (100%) diff --git a/.github/workflows/testbeds.yml b/.github/workflows/testbeds.yml index dc6a7b80..0272951c 100644 --- a/.github/workflows/testbeds.yml +++ b/.github/workflows/testbeds.yml @@ -722,4 +722,114 @@ jobs: run: mvn --batch-mode --update-snapshots test working-directory: testbeds/testbed-encoders + testbed-api-generator-jdk11: + needs: build-testbeds-jdk11 + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v5 + - uses: actions/setup-java@v5 + with: + java-version: '11' + distribution: 'temurin' + - name: Restore Maven local repository from cache + uses: actions/cache@v5 + with: + path: ~/.m2/repository + key: ${{ runner.os }}-maven-mo-testbeds-jdk11-${{ github.sha }} + # The golden trees compare the new generators against a baseline captured from the + # old ones. The baseline is not in the repository - it is build output - so those + # tests skip here and the corpus walks and round trips are what run. Capturing it + # first would mean building apis/* twice; see DESIGN.md section 10.8. + - name: Run the Testbed for the API generator + run: mvn --batch-mode --update-snapshots test + working-directory: testbeds/testbed-api-generator + - name: Upload report for the API generator testbed + if: always() + uses: actions/upload-artifact@v5 + with: + name: testbed-api-generator-jdk11-report + path: testbeds/testbed-api-generator/target/surefire-reports/ + + testbed-api-generator-jdk17: + needs: build-testbeds-jdk17 + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v5 + - uses: actions/setup-java@v5 + with: + java-version: '17' + distribution: 'temurin' + - name: Restore Maven local repository from cache + uses: actions/cache@v5 + with: + path: ~/.m2/repository + key: ${{ runner.os }}-maven-mo-testbeds-jdk17-${{ github.sha }} + # The golden trees compare the new generators against a baseline captured from the + # old ones. The baseline is not in the repository - it is build output - so those + # tests skip here and the corpus walks and round trips are what run. Capturing it + # first would mean building apis/* twice; see DESIGN.md section 10.8. + - name: Run the Testbed for the API generator + run: mvn --batch-mode --update-snapshots test + working-directory: testbeds/testbed-api-generator + - name: Upload report for the API generator testbed + if: always() + uses: actions/upload-artifact@v5 + with: + name: testbed-api-generator-jdk17-report + path: testbeds/testbed-api-generator/target/surefire-reports/ + testbed-api-generator-jdk21: + needs: build-testbeds-jdk21 + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v5 + - uses: actions/setup-java@v5 + with: + java-version: '21' + distribution: 'temurin' + - name: Restore Maven local repository from cache + uses: actions/cache@v5 + with: + path: ~/.m2/repository + key: ${{ runner.os }}-maven-mo-testbeds-jdk21-${{ github.sha }} + # The golden trees compare the new generators against a baseline captured from the + # old ones. The baseline is not in the repository - it is build output - so those + # tests skip here and the corpus walks and round trips are what run. Capturing it + # first would mean building apis/* twice; see DESIGN.md section 10.8. + - name: Run the Testbed for the API generator + run: mvn --batch-mode --update-snapshots test + working-directory: testbeds/testbed-api-generator + - name: Upload report for the API generator testbed + if: always() + uses: actions/upload-artifact@v5 + with: + name: testbed-api-generator-jdk21-report + path: testbeds/testbed-api-generator/target/surefire-reports/ + + testbed-api-generator-jdk25: + needs: build-testbeds-jdk25 + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v5 + - uses: actions/setup-java@v5 + with: + java-version: '25' + distribution: 'temurin' + - name: Restore Maven local repository from cache + uses: actions/cache@v5 + with: + path: ~/.m2/repository + key: ${{ runner.os }}-maven-mo-testbeds-jdk25-${{ github.sha }} + # The golden trees compare the new generators against a baseline captured from the + # old ones. The baseline is not in the repository - it is build output - so those + # tests skip here and the corpus walks and round trips are what run. Capturing it + # first would mean building apis/* twice; see DESIGN.md section 10.8. + - name: Run the Testbed for the API generator + run: mvn --batch-mode --update-snapshots test + working-directory: testbeds/testbed-api-generator + - name: Upload report for the API generator testbed + if: always() + uses: actions/upload-artifact@v5 + with: + name: testbed-api-generator-jdk25-report + path: testbeds/testbed-api-generator/target/surefire-reports/ diff --git a/api-generator/api-generator-lib/DESIGN.md b/api-generator/api-generator-lib/DESIGN.md index 52a9e76c..259e7fdc 100644 --- a/api-generator/api-generator-lib/DESIGN.md +++ b/api-generator/api-generator-lib/DESIGN.md @@ -4,7 +4,7 @@ Status: **proposal** · New module: 14.x · Cut-over: **v15.0** `api-generator-lib` is built and matured **alongside** `generator-interfaces`, `generator-java` and `generator-docs`, which stay in place and keep driving the build throughout 14.x. The three old -modules are removed only at the v15.0 cut-over (§10.3). Nothing in 14.x depends on the new library +modules are removed only at the v15.0 cut-over (§10.9). Nothing in 14.x depends on the new library being finished. ## 1. Purpose @@ -19,7 +19,7 @@ flowchart LR M -->|export| XML2[".xml"] M -->|export| TXT2[".mospec"] M -->|generate| J["Java API"] - M -->|generate| D["docx + svg"] + M -->|generate| D["docx"] ``` The model is the centre. Formats and outputs are peripheral and independently replaceable. @@ -55,7 +55,7 @@ api-generator/ └── generator-docs/ kept through 14.x, deleted at v15.0 ``` -**One new module, not several.** Model, XML, MOSpec, Java, docx and svg all live in +**One new module, not several.** Model, XML, MOSpec, Java, docx and XHTML all live in `api-generator-lib`. Splitting the text format into its own artifact was considered and rejected: the only argument for it was isolating a parser dependency, and since the MOSpec parser is hand-written (§7.2) there is no dependency to isolate. One library is the point of the exercise. @@ -73,7 +73,7 @@ Throughout 14.x the new path can be **exercised end to end** — up to and inclu `apis/*` module through the new library, compiling the result and running the full test suite — while the **default stays the old generators**. A clean checkout, and every release cut from 14.x, builds exactly as it does today. Flipping that default is the cut-over, and it happens once, at -v15.0 (§10.3). +v15.0 (§10.9). The plugin already selects a generator by short name, so the new generators register under distinct names. Making the choice a property turns a per-module edit into a whole-build switch — @@ -100,10 +100,15 @@ Cost to accept for the duration: fixes made to the old generators must be mirror ones, or the difference consciously accepted. Running both in CI is what keeps that honest — a change to either side that moves the output shows up as a diff on the next build. -**Dependencies:** `api-generator-lib` has **zero** third-party dependencies — the model is plain -Java, XML I/O uses StAX from the JDK, the MOSpec parser is hand-written (§7.2), and docx/svg output -is written as text. This removes `jaxb-api`, `jaxb-runtime`, `activation`, `reflections`, -`maven-plugin-api`, `de.dlr.gsoc.mcds:mosdl` and both `xjc` executions. Keeping the library +**Dependencies:** `api-generator-lib` has **one** third-party dependency, and it earns it. The model +is plain Java, XML I/O uses StAX from the JDK, the MOSpec parser is hand-written (§7.2), and the +OOXML of a document is written as text — but a diagram declared in a specification is SVG and a +`.docx` embeds a raster image, so the document generator rasterises it with **Apache Batik** +(`batik-rasterizer`, `batik-codec`, `batik-anim`, 1.16, the same version and exclusions the existing +generator uses). Nothing else needs a third party and nothing in `model/` may use one, invariant 1 +being about the model rather than the generators. This still removes `jaxb-api`, `jaxb-runtime`, +`activation`, `reflections`, `maven-plugin-api`, `de.dlr.gsoc.mcds:mosdl` and both `xjc` +executions. Keeping the library dependency-free is what makes putting everything in it cost nothing. `api-generator-maven-plugin` stays a separate module — it is the Maven binding, not part of the @@ -133,7 +138,7 @@ esa.mo.apigen ├── exporters/ Exporter (SPI) │ ├── xml/ XmlExporter │ └── mospec/ MOSpecExporter, SourceFormatter -└── generators/ Generator (SPI), java/, docx/, svg/ +└── generators/ Generator (SPI), java/, docx/ ``` A new root package (`esa.mo.apigen`, not `esa.mo.tools.stubgen`) so old and new coexist during @@ -635,7 +640,7 @@ Changes from today's `Generator` interface: - Exporters write to a **directory**, not to a single stream. **The plugin's existing configuration options are kept for 14.x**, then reviewed at the cut-over -(§10.4). None of them is set anywhere in this repository: +(§10.10). None of them is set anywhere in this repository: | Option | Set in | Behaviour behind it | | --- | --- | --- | @@ -644,7 +649,7 @@ Changes from today's `Generator` interface: | `generateStructures` | 0 poms | live; defaults `true`, branched on at `GeneratorLangs:368,:449` | | `forceGeneration` | 0 poms | live; drives the input-timestamp skip in `execute()` | | `packageBindings` | 0 poms | inert in practice — an empty map means `addAreaPackage` is never called | -| `xsdRefDirectory` | 0 poms | inert — no module has such a directory, and the `loadXSD` path behind it goes (§10.4) | +| `xsdRefDirectory` | 0 poms | inert — no module has such a directory, and the `loadXSD` path behind it goes (§10.10) | | `targetLanguages` | 1 pom | in active use — always `Java` | `extraProperties` deserves attention because it is not a vestigial escape hatch. It is how the docs @@ -666,7 +671,7 @@ exercise — the aim is that there is nothing to configure. Removing the options from the *plugin* is a separate matter and cannot be done in 14.x: Maven fails the build on unknown plugin configuration (`Cannot find 'packageBindings' in class …`), so any external pom setting one would break on upgrade. The plugin is published to Maven Central, so that -risk is real even though nothing in this repository sets them. It is queued for v15.0 (§10.4). +risk is real even though nothing in this repository sets them. It is queued for v15.0 (§10.10). Note that the plugin can in fact keep its surface indefinitely at no cost to the library: at cut-over it simply maps its `@Parameter` fields onto the typed generator constructors. @@ -998,9 +1003,19 @@ current fork (`GeneratorMOSDL` is a modified copy of DLR's `MosdlGenerator` — | Nullability postfix on the type — `List?`, not `List?` | `resolveType()`, respelled (§7.8) | | Keywords quoted when used as identifiers | `getId()` | -Also carried over, but into the **importer** rather than the formatter: auto-numbering (`[n]` may -be omitted and is assigned from the highest existing number — for COM it must draw from the -**shared** object/event counter, §9) and the implicit import of MAL fundamental types. +Also carried over, but into the **importer** rather than the formatter: the implicit import of MAL +fundamental types. A type of the MAL is written unqualified — `Identifier`, not `MAL::Identifier` — +except where the area or service being written declares a type of the same name, which is written +out in full so that an unqualified name never means two things. + +**Numbers are always written.** MOSDL let `[n]` be omitted and assigned one from the highest +existing number; MOSpec does not, and the exporter always emits one. Three reasons, in order of +weight: a number silently assigned is a specification silently changed, and error numbers in +particular carry meaning across areas that `max + 1` would not respect; the absence of `[n]` on a +composite already means something else — that it is abstract — so "no number" cannot also mean +"choose one for me"; and the corpus contains no file that would use it. The convenience it buys is +not scanning a file for the next free number when hand-editing, which is worth less than the +ambiguity it costs. **`BULK` is the default export mode.** `INLINE` and `SUPPRESS` remain supported options. In `BULK`, an operation's message and field documentation is hoisted into a single doc block above the @@ -1164,20 +1179,39 @@ Most of the existing structure exists to serve requirements that are gone: | `StdStrings` (67) — string constants for `"MAL"`, `"Blob"`, `"Composite"`… | untyped identification of MAL types | the model resolves types; constants that survive belong to the Java mapping (§4.2) | | `AttributeTypeDetails`, `NativeTypeDetails`, `MultiReturnType`, `RequiredPublisher`, `CompositeField` | scattered carriers between the shadow model and the writers | re-derive from what the Java generator actually needs; none is a given | -The two generators in scope: +The generators in scope: - **java** — currently `GeneratorLangs` + `JavaConsumer` + the `java/` writers, ~4.5k lines. Expect the rewrite to be substantially smaller, since a large part of that mass is the language abstraction and the shadow-model plumbing rather than Java generation. -- **docx** and **svg** — `GeneratorDocx` (1176) and `GeneratorSvg` (1155). Between them these carry - eight of the nine `extraProperties` options (§5.2); per invariant 4 none is reproduced, and each - generator simply does what the default already does — descriptive text, indexes, collapsed and - expanded messages, message field names and diagrams all included; SVG not split out; `oldStyle` - off. `docx.oldStyle` changes only how a field is labelled in the type tables — `name : (List)` - instead of `List name` (`DocxBaseWriter.createTypeHyperLink`). It has never been selected and - is not reproduced; deleting that branch is the largest single simplification available here. - - The three commented-out `styles.xml` variants **are** kept, as resource files (below). +- **docx** — `GeneratorDocx` (1176), which writes one Word document per area. This is the output + that matters for the specifications, and the one Phase 4 reproduces. + +- **svg** — `GeneratorSvg` (1155) is **not** part of the docx path, despite the name and despite + being in the same module. It writes `output.xhtml`: a navigable browser of a specification + in an ECSS PUS style, with interaction diagrams it draws itself, either inline or split out as + separate `.svg` files. The diagrams that appear *in the documents* are a different thing entirely + — they are SVG declared in the specification's own `` elements, and `DocxWriter` + rasterises those to PNG. So the two share no code path and no output. + + **Nothing in this repository invokes it.** The only file that names `GeneratorSvg` is + `GeneratorSvg.java`; the plugin reaches a generator only through `targetLanguages`, and the one + value configured anywhere is `Java` (`parent/pom.xml:357`). The Phase 0 capture holds no `.xhtml` + and no `.svg` for the same reason: nothing produces any. That is the same position `GeneratorGwt` + is in — with one difference. A navigable browser of a specification is the kind of tool someone + runs by hand rather than from a build, so "no caller in the repository" is weak evidence of + disuse here in a way it was not for GWT. **Decided: ported, as Phase 6** (§10.7). It is + `esa.mo.apigen.generators.xhtml`, registered as `xhtml`. + + Between them the three carry eight of the nine `extraProperties` options (§5.2); per invariant 4 + none is reproduced, and each generator simply does what the default already does — descriptive + text, indexes, collapsed and expanded messages, message field names and diagrams all included; + SVG not split out; `oldStyle` off. `docx.oldStyle` changes only how a field is labelled in the + type tables — `name : (List)` instead of `List name` + (`DocxBaseWriter.createTypeHyperLink`). It has never been selected and is not reproduced; + deleting that branch is the largest single simplification available here. + + The four commented-out `styles.xml` variants **are** kept, as resource files (below). **The docx generator is the exception to "rewritten, not ported".** Its output has to look the same as before, and reproducing intricate OOXML — styles, numbering, tables — from scratch is far riskier @@ -1297,8 +1331,8 @@ Rules include: - Short-form parts unique within an area/service. - **COM object and event numbers share one namespace per service** — the XSD's `serviceObjectShortFormCheck` selects `.//com:object|.//com:event` on a single `@number` field. - This is why MC `Action` numbers its objects 1, 2, 3 and its event 6. Auto-numbering must draw - from the shared counter or it will silently generate colliding short forms. + MC `Check` shows it plainly: objects 1, 2, 3, **5**, 6, 7, 8, 9, with its one event taking **4** + in the gap. A validator that numbered them apart would pass a specification the schema rejects. - COM object body types are concrete or `Attribute` (normative in the COM area's own prose). - A `related`/`source` link with neither target nor comment is meaningless — warn. - Operation numbers unique within a service; capability-set numbers unique. @@ -1362,8 +1396,9 @@ area number (9) rather than the filename (052) — one attribute away from colli The rest of this section describes what the harness does and why. A script that builds every `apis/*` module with the current plugin and snapshots -`target/generated-sources/stub` into a golden tree, plus the docx/svg output for the six samples in -`mo-navigator/_docx`. The Java side of that tree is **950 files and about 116 000 lines** across the +`target/generated-sources/stub` into a golden tree, plus the docx output — 24 documents, unzipped so +that `word/document.xml` diffs as text. There is no `.xhtml` or `.svg` in the tree, because nothing +in the build produces any (§8). The Java side of that tree is **950 files and about 116 000 lines** across the seven `apis/*` modules, from 73 files for MAL up to 342 for MPS — so Phase 0 is largely a matter of freezing what a build already produces and scripting the comparison. @@ -1539,7 +1574,75 @@ The one-line change that makes the swap, kept out of the committed pom for now: ...together with swapping `generator-java` for `api-generator-lib` in the plugin's dependencies in `parent/pom.xml`. -### 10.4 Held against a specification set from outside this repository +### 10.4 Phase 4: the documents + +18 documents, 126 parts, **all identical byte for byte** — every `document.xml`, `numbering.xml`, +`styles.xml`, `[Content_Types].xml`, relationship file and rasterised PNG. + +The OOXML layer was rebuilt rather than transcribed. `DocxBaseWriter` reached a cell through nine +overloads of `addCell` plus three of `addCellWithHyperlink`, each taking a column index, the widths +of every column, and up to four flags in a fixed order. It is now a table that owns its widths, a row +that counts its own columns, and a cell that says what it is: + +```java +table.row().cell("Area Identifier").shaded(HEADER).centered().next() + .cell("Service Identifier").shaded(HEADER).centered().endRow(); +``` + +`vMerge`/`vRestart` — two booleans of which one combination is meaningless — became a three-state +enum. The table and figure captions, nine identical lines apiece differing in two words, are written +once. `oldStyle` and `includeMessageFieldNames` are gone rather than reproduced, per invariant 4. + +Three things about the reference output were not obvious and are now written down where they are +reproduced: + +- **`document.xml` ends its lines with CRLF and `numbering.xml` with LF.** Not a decision anyone + took: `DocxBaseWriter` calls `super("\r\n")` and `DocxNumberingWriter` takes the `"\n"` default. +- **Page breaks, section breaks and drawings are appended without indentation or a line ending**, + because they sit in the run of text rather than on a line of their own. +- **An events section counts as declared as soon as it is written; an objects section counts only + when it lists something.** That decides whether a service is said to have "COM object" or "COM + object and event" relationships, so the model now records that a section was declared, apart from + what it holds. + +Rendering the diagrams found a real defect in the importer: a diagram was captured by writing each +element's *local* name, so `` — bound to the SVG namespace by a declaration at the top of +the specification — became `` bound to nothing. It round-tripped through XML and passed every +test, because nothing had tried to *render* it. Batik found no elements in the SVG namespace and +produced a valid, empty picture. `StaxCursor.captureChildren` now declares the outermost element's +namespace on it, which is also what §7.6's sidecar `.svg` files need. + +### 10.5 An error documented under another area's number + +Two documents came out differing from the captured ones, in one number each, and the new output was +the correct one. + +| Reference in the XML | Definitions of that name | Captured document | Generated Java | +| --- | --- | --- | --- | +| MPS: `` | **MPS = 1**, COM = 70000 | 70000 ✗ | 1 ✓ | +| MC v002: `` | **MC = 3**, MPD = 1 | 1 ✗ | 3 ✓ | + +`MOTypeRegistry` held error definitions in a map keyed by name alone, so whichever area was loaded +last took the name. Which document was affected therefore depended on what else was in the set: the +standards set holds no MPD, so nothing competed for `Invalid` there and MC v002 came out right. + +Two callers used that lookup. `GeneratorDocx` takes the *number*, which is where the wrong numbers +came from. `GeneratorLangs` takes the *comment*, as the fallback for the `@throws` of a provider +handler — so the Java path touched the same fault, but no difference materialised: the fallback only +fires where an `errorRef` carries no comment of its own, and there the names do not collide. The +Java golden tree staying at 950 of 950 through the fix is the evidence for that, not an argument. + +**This was fixed rather than reproduced.** An error is now held under its area as well as its name, +and both call sites pass the area the reference names. The change is confined to +`MOTypeRegistry`, `MOTypeInformation`, `GeneratorBase` and the two lookups; the generated Java is +unchanged, and exactly the two documents changed. Both generators then produced all 18 documents +byte for byte alike, the baseline was re-captured, and the budget in `DocxGeneratorGoldenTest` is +empty. + +That the two independently-written generators agree on all 126 parts, having disagreed on precisely +the two the fix addressed, is the strongest check either of them has had. + +### 10.6 Held against a specification set from outside this repository The golden tree pins the CCSDS specifications, which are the ones the library was written against. The NanoSat MO Framework carries its own — four areas of its own numbering (COM 51, Monitor and @@ -1565,11 +1668,12 @@ generator defects, which is exactly what an outside corpus is for: | # | Deliverable | Verified by | | --- | --- | --- | -| 1 ✅ | Module skeleton, model, validator | 31 unit tests | +| 1 ✅ | Module skeleton, model, validator | 31 unit tests (73 by Phase 6; the corpus tests moved to a testbed, §10.8) | | 2 ✅ | XML importer, linker, exporter, schema validation | round-trip over 18 of 20 specs; the other 2 are refused because they break their own schema (§6.1) | | 3 ✅ | Java generator | golden tree from Phase 0 — **950 of 950 files, all byte-identical** | -| 4 | docx + svg generators | golden docx/svg from Phase 0 — **same zero-diff standard as Java**: the documents must come out looking as they do today (§8) | -| 5 | MOSpec importer + exporter, incl. COM, documentation and diagrams | §7.3 closure test over all 20 specs, both text-level and `xml → … → xml` (§7.9) | +| 4 ✅ | docx generator | golden docx from Phase 0 — **126 of 126 parts byte-identical** (§10.5). The XHTML generator is Phase 6, not this; see §8 | +| 5 ✅ | MOSpec importer + exporter, incl. COM, documentation and diagrams | §7.3 closure test over all 20 specs, both text-level and `xml → … → xml` (§7.9) | +| 6 ✅ | XHTML generator | properties rather than a baseline, since there is no baseline to have (§10.7) — every area produces a page, every page parses, every link arrives | Phase 2 comes first because everything else depends on it. Phase 5 comes last because nothing in the Maven build depends on it — MOSpec's only consumer is the `mo-navigator` editor. @@ -1587,7 +1691,138 @@ lines) throughout 14.x, all of which are retired at the cut-over. The cost of wa gets no interactive editing use before then — its correctness rests entirely on the §7.3 and §7.9 round-trip tests, which is a reason to keep those thorough rather than to move the navigator early. -### 10.3 Cut-over — v15.0 +**Re-run after Phase 4.** The check was repeated once the documents were finished, since the +importer and the model had both changed since: + +| Output | Files | Differing | +| --- | --- | --- | +| Java, four api modules | 546 | **0** | +| Documents, five areas | 30 parts | **0** | + +The documents had never been compared on this corpus before, and came out identical on the first +run with no corrections. What they do not exercise is the diagram path: NMF declares no `` +anywhere, so none of its documents embeds an image and Batik is never reached. The only cover for +that remains the three CCSDS documents that do. + +### 10.7 Phase 6: the XHTML generator + +`GeneratorSvg` was the one open question of §8 — port it or drop it — and it is ported. The +argument for dropping was that nothing invokes it; the argument against was that a browsable page +of a specification is run by hand, so nothing invoking it says little. What settled it is that the +thing is genuinely useful and nothing else in the toolchain does what it does: the Word documents +tabulate a message, this draws it. + +**There is no baseline, and there cannot be one.** The Phase 0 capture holds no `.xhtml`, because +no configuration in the repository produces any. So this phase cannot be verified the way Phases 3 +and 4 were. Two things were done instead. + +First, the old generator was run by hand over both specification sets, and the drawings compared +box by box. That is the part where fidelity matters — the geometry took work to get right, and +none of it is worth re-deriving: + +| Drawings | Compared | Identical | +| --- | --- | --- | +| Types — every composite and enumeration | 84 | **84** | +| Messages — every operation but publish-subscribe | 260 | **258** | + +The two that differ are the same defect: a composite that opens out to nothing was drawn as a box +`width="0"`, which is to say not drawn. Publish-subscribe is drawn deliberately differently, below. + +Second, since agreeing with the old output is not by itself worth much when the old output is +wrong, the test asserts what a page has to be true of rather than what it happens to say: every +area produces a page, every page parses as XHTML, and every link on every page arrives at an anchor +that exists. Those three caught everything below. + +**What the old generator got wrong.** Running it was the first time it had been run, and it does +not work: + +- **It crashes on Mission Planning.** `CompositeContainer.expandType` guards against expanding one + node twice but not against a cycle, and MPS declares six composites that contain themselves — a + Plan names a precursor Plan and a target Plan, an ActivityInstance holds its children, + EventDefinition and EventInstance nest. It recurses until the stack ends, and `outputMPS.xhtml` + is written as **zero bytes**. Here a type already open above is drawn but not opened again; the + name is a link, so the reader follows it instead. +- **It loses half the areas it is given.** The page of an area is `output.xhtml`, which has + no version in it, so MAL 1 is overwritten by MAL 3 and Monitor and Control 1 by 2. Twenty + specifications produced nine files. The page is now named after the specification it comes from, + `area001-v001-MAL.xhtml`, as the documents already were. +- **Seven links arrive nowhere**, in the standards alone. A field of type `List` + linked to `#_ObjectDetailsList`, which is the name of the list rather than of anything a page + describes. A list is drawn as a count and the type in it, so the type in it is what is linked to. +- **A field description was not escaped**, so a `<` or an `&` in one — and the specifications hold + both — produced a page no parser accepts. It also nested `

                  ` inside `

                  `. +- **The index was a `HashMap`**, written out in whatever order it iterated in. +- **Every page had an empty ``.** + +**What is deliberately different beyond those fixes.** + +- **A message field says whether it may be omitted.** The old generator passed `isOptional=false` + for every field of a message, so the expanded drawing showed nullability for the fields of a + composite and never for the fields of the message holding it. The document tables have said it + all along. +- **A publish-subscribe message names its parts.** What a NOTIFY carries is not what the + specification writes — the message holds the subscription it answers and a header per update, and + carries a list of each published value rather than one of each — and the old generator drew that + correctly but labelled all three "Part". +- **A drawing is bounded at 120 fields.** Opening a composite replaces one field with all of its + own, so a message of nested composites grows by multiplication rather than addition: MPS's plan + status report opened to 824 fields, a drawing thirty metres wide, in a page of twenty megabytes. + Types are opened a level at a time and the last level that does not fit is closed again, so what + a reader gets is the first so-many levels of everything rather than the whole of whichever branch + came first. The widest drawing anywhere outside MPS is 46 fields, so nothing else is touched; + within MPS the median is 5 and 24 of 264 reach the limit. +- **The page carries a style sheet**, as a resource rather than a string, and the requirement lists + the specifications write as `<ol>`/`<li>` are rendered as lists — this is the one output format + where that markup is native, and §7.5 was waiting on somewhere to put it. + +**One thing this needed from the model.** `TypeDefinition.getService()` was never set: the field +existed, the linker never filled it, and nothing had read it. A type declared by a service belongs +to that service — two services of one area may each declare a type of the same name — so the linker +now sets it. Nothing else read it, and the Java and document golden trees are unmoved. + +The five `svg.*` options of `extraProperties` are not reproduced, per invariant 4: descriptive +text, indexes, collapsed and expanded messages are all included, and SVG is not split out into +files of its own, which is what every default already said. + +### 10.8 Where the tests live + +The main build compiles; testbeds test. That is not a new rule — `testbeds` is commented out of the +root reactor at `pom.xml:60`, the CI main build runs `-DskipTests clean install`, and every testbed +is run separately against its own `working-directory`. The library follows it like everything else. + +**`api-generator-lib` is in the reactor** (`api-generator/pom.xml`), for compilation. What that +costs the main build is the compile, because the main build skips tests: + +| | Time | +| --- | --- | +| `clean compile` | 2.8 s | +| `clean test`, the 73 unit tests that stayed | 3.5 s | + +**`testbeds/testbed-api-generator` holds the 39 tests that read a corpus** — the Java and document +golden trees, the XML importer and validator corpus walks, the XHTML corpus, and the XML and MOSpec +round trips, together with the `ModelComparison`, `GoldenTree` and `Corpus` helpers they share. The +line between the two is whether a test reads anything outside its own module: a test of +`JumpTable` or `JavaMethodBuilder` stays with the code it tests, a test that walks +`xml-service-specifications/` or `golden/baseline/` does not. + +The point of the split is that building the library is a compile. The point of *not* deleting the +unit tests along with the rest is that they are what fails when someone breaks a builder, and they +cost 70 ms. + +**What CI runs, and what it does not.** `.github/workflows/testbeds.yml` gains a +`testbed-api-generator` job on each of the four JDKs. Thirty of the 39 tests run there — everything +that needs only the specifications, which are in the repository. The nine golden-tree tests +**skip**: they compare against a baseline captured from the old generators, `golden/baseline/` is +build output rather than source, and it is gitignored. They `Assume`-skip rather than fail, so the +job is honest about it, but the effect is that the strongest check in the suite is the one CI does +not perform. + +Making CI run them means `golden.sh capture` first, which builds every `apis/*` module with the old +generators before the testbed builds them again with the new — the parallel-run contract of §3, at +the cost of generating the APIs twice in the same workflow. That is a real cost and an open +decision, not an oversight. + +### 10.9 Cut-over — v15.0 The cut-over is **flipping the default**, not proving the new path works — that has been demonstrable since Phase 3, by building the whole reactor with `-Pnew-generator` (§3). By this point @@ -1597,14 +1832,14 @@ bookkeeping rather than a leap: - `esa.stubgen.generator` defaults to the new generator, and the profile disappears; - `parent/pom.xml` points the plugin's dependency at `api-generator-lib`; - `generator-interfaces`, `generator-java` and `generator-docs` are deleted, along with everything - in §10.4; + in §10.10; - the golden tree is re-baselined from the new library, since there is no longer a second implementation to agree with. If the new path is not producing agreed output by then, the correct response is to leave the default alone and ship 15.0 without the deletion — nothing else in the release depends on it. -### 10.4 Removed at cut-over (v15.0) +### 10.10 Removed at cut-over (v15.0) The new library never carries any of these; they disappear from the repository when the old modules are deleted. Until then they stay exactly as they are — no clean-up of the old code during 14.x, @@ -1660,7 +1895,17 @@ the evidence that settled them, so that they are not silently reopened: | Diagrams as sidecar SVGs | §7.6 | | `BULK` the default doc mode | §7.7 | | Type-first field declarations, `replayable`, arrows unchanged | §7.8 | +| Numbers always explicit; no auto-numbering | §7.7 | +| MOSpec normalises the older `ObjectRef(X)` spelling; the XML comes back modernised | §7.9 | +| A comment written empty stays empty, and is shown as one | §7.5 | | docx: output unchanged, OOXML layer lifted, styles to resource files | §8 | +| Batik is the one third-party dependency, for rasterising declared diagrams | §3, §8 | +| The XHTML generator is ported, not dropped, as Phase 6 | §8, §10.7 | +| The XHTML page is named after its specification, so two versions of an area no longer collide | §10.7 | +| A type that contains itself is drawn once and linked, not expanded | §10.7 | +| A drawing stops at 120 fields, a level at a time | §10.7 | +| A type knows the service that declares it: the linker now sets it | §10.7 | | Rewrite rather than port; no language abstraction before a second language | §8, §8.1 | | Parallel generation, with determinism as the binding constraint | §8.2 | -| Parallel running through 14.x, cut-over at v15.0 | §3, §10.3 | +| Parallel running through 14.x, cut-over at v15.0 | §3, §10.9 | +| The library compiles in the reactor; its corpus tests live in a testbed | §10.8 | diff --git a/api-generator/api-generator-lib/pom.xml b/api-generator/api-generator-lib/pom.xml index 2c35d065..550ed8e5 100644 --- a/api-generator/api-generator-lib/pom.xml +++ b/api-generator/api-generator-lib/pom.xml @@ -67,9 +67,14 @@ </properties> <!-- - No third-party dependencies. The model is plain Java, XML I/O uses StAX from the - JDK, the MOSpec parser is hand-written, and docx/svg output is written as text. - See DESIGN.md, section 3. + One third-party dependency, and it earns it. The model is plain Java, XML I/O uses + StAX from the JDK, the MOSpec parser is hand-written, and docx and XHTML output are + written as text - but a diagram declared in a specification is SVG and a .docx + embeds a raster image, so Batik rasterises it. See DESIGN.md, section 3. + + The heavy tests - the golden trees, the corpus walks and the round trips - live in + testbeds/testbed-api-generator, not here, so that building this module stays a + compile. See DESIGN.md, section 10.8. --> <dependencies> <!-- Build-time only: supplies the XSDs unpacked above, and orders the reactor. --> @@ -84,6 +89,67 @@ <artifactId>junit</artifactId> <scope>test</scope> </dependency> + <!-- The one thing this library cannot do for itself: a diagram declared in a + specification is SVG, and a .docx embeds a raster image, so the document + generator rasterises it. Nothing else here needs a third party, and nothing in + the model may use one - see DESIGN.md, section 3. --> + <dependency> + <groupId>org.apache.xmlgraphics</groupId> + <artifactId>batik-rasterizer</artifactId> + <version>1.16</version> + <exclusions> + <exclusion> + <groupId>xml-apis</groupId> + <artifactId>xml-apis</artifactId> + </exclusion> + <exclusion> + <groupId>xalan</groupId> + <artifactId>xalan</artifactId> + </exclusion> + <exclusion> + <groupId>org.apache.xmlgraphics</groupId> + <artifactId>fop</artifactId> + </exclusion> + <exclusion> + <groupId>org.apache.xmlgraphics</groupId> + <artifactId>batik-bridge</artifactId> + </exclusion> + </exclusions> + </dependency> + <dependency> + <groupId>org.apache.xmlgraphics</groupId> + <artifactId>batik-codec</artifactId> + <version>1.16</version> + <exclusions> + <exclusion> + <groupId>xml-apis</groupId> + <artifactId>xml-apis</artifactId> + </exclusion> + <exclusion> + <groupId>xalan</groupId> + <artifactId>xalan</artifactId> + </exclusion> + <exclusion> + <groupId>org.apache.xmlgraphics</groupId> + <artifactId>batik-js</artifactId> + </exclusion> + </exclusions> + </dependency> + <dependency> + <groupId>org.apache.xmlgraphics</groupId> + <artifactId>batik-anim</artifactId> + <version>1.16</version> + <exclusions> + <exclusion> + <groupId>xml-apis</groupId> + <artifactId>xml-apis</artifactId> + </exclusion> + <exclusion> + <groupId>xalan</groupId> + <artifactId>xalan</artifactId> + </exclusion> + </exclusions> + </dependency> </dependencies> <build> @@ -94,6 +160,11 @@ <include>LICENCE.md</include> </includes> </resource> + <!-- Naming any resource directory replaces the default, so the module's own + has to be named again: it holds the fixed parts of a .docx package. --> + <resource> + <directory>src/main/resources</directory> + </resource> </resources> <plugins> <plugin> diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/exporters/mospec/DocMode.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/exporters/mospec/DocMode.java new file mode 100644 index 00000000..3e019f0c --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/exporters/mospec/DocMode.java @@ -0,0 +1,44 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.exporters.mospec; + +/** + * Where the documentation of an operation's fields and errors is placed. + */ +public enum DocMode { + + /** + * Hoisted into one block above the signature, tagged by what it describes. The default, + * because it keeps the signature scannable in one glance. + */ + BULK, + + /** + * Written beside the field or error it describes, inside the signature. + */ + INLINE, + + /** + * Left out. The only mode that does not preserve the model, and so the only one the + * round-trip test cannot hold to equality. + */ + SUPPRESS +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/exporters/mospec/MOSpecExporter.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/exporters/mospec/MOSpecExporter.java new file mode 100644 index 00000000..5da969ea --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/exporters/mospec/MOSpecExporter.java @@ -0,0 +1,720 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.exporters.mospec; + +import esa.mo.apigen.exporters.ExportException; +import esa.mo.apigen.exporters.Exporter; +import esa.mo.apigen.model.Area; +import esa.mo.apigen.model.CapabilitySet; +import esa.mo.apigen.model.ErrorDefinition; +import esa.mo.apigen.model.ErrorReference; +import esa.mo.apigen.model.Field; +import esa.mo.apigen.model.InteractionPattern; +import esa.mo.apigen.model.InteractionStage; +import esa.mo.apigen.model.MessageBody; +import esa.mo.apigen.model.Operation; +import esa.mo.apigen.model.Service; +import esa.mo.apigen.model.Specification; +import esa.mo.apigen.model.com.COMFeatures; +import esa.mo.apigen.model.com.COMObject; +import esa.mo.apigen.model.com.ObjectLink; +import esa.mo.apigen.model.com.ObjectReference; +import esa.mo.apigen.model.docs.Diagram; +import esa.mo.apigen.model.docs.DocSection; +import esa.mo.apigen.model.types.AttributeType; +import esa.mo.apigen.model.types.CompositeType; +import esa.mo.apigen.model.types.EnumerationItem; +import esa.mo.apigen.model.types.EnumerationType; +import esa.mo.apigen.model.types.FundamentalType; +import esa.mo.apigen.model.types.TypeDefinition; +import esa.mo.apigen.model.types.TypeRef; +import java.io.IOException; +import java.io.OutputStreamWriter; +import java.io.Writer; +import java.nio.charset.Charset; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; + +/** + * Writes a specification as MOSpec. + * <p> + * A MOSpec specification is a directory: one {@code .mospec} file holding the specification, + * and one {@code .svg} beside it per diagram. Inlining a diagram would put a hundred lines of + * drawing in the middle of a readable file, and dropping it would make the text format the + * one place the round trip leaks. + * <p> + * The exporter defines the dialect: whatever it writes, the parser must read back. That is + * what the round-trip test holds it to. + */ +public final class MOSpecExporter implements Exporter { + + private static final Charset UTF8 = Charset.forName("UTF-8"); + + private final DocMode mode; + + /** + * An exporter writing in the default mode, with each operation's documentation gathered + * above its signature. + */ + public MOSpecExporter() { + this(DocMode.BULK); + } + + /** + * @param mode Where to put the documentation of fields and errors. + */ + public MOSpecExporter(DocMode mode) { + this.mode = mode; + } + + @Override + public void write(Specification spec, Path outputDir) throws IOException, ExportException { + Files.createDirectories(outputDir); + SourceFormatter out = new SourceFormatter(); + writeSpecification(out, spec); + + String name = spec.getAreas().isEmpty() ? "specification" + : spec.getAreas().get(0).getName(); + write(outputDir.resolve(name + ".mospec"), out.toText()); + + for (Area area : spec.getAreas()) { + writeDiagrams(outputDir, area.getDocumentation().getDiagrams()); + for (Service service : area.getServices()) { + writeDiagrams(outputDir, service.getDocumentation().getDiagrams()); + if (service.getCom() != null) { + writeDiagrams(outputDir, service.getCom().getDocumentation().getDiagrams()); + } + } + } + } + + /** + * @return the text of a specification, for a caller that wants it without the sidecars. + */ + public String toText(Specification spec) { + SourceFormatter out = new SourceFormatter(); + writeSpecification(out, spec); + return out.toText(); + } + + private void writeSpecification(SourceFormatter out, Specification spec) { + if (mode == DocMode.SUPPRESS) { + out.suppressDocumentation(); + } + out.doc(spec.getComment()); + out.line("specification [" + spec.getSchemaVersion().name().toLowerCase() + "]"); + for (Area area : spec.getAreas()) { + out.blank(); + writeArea(out, area); + } + } + + private void writeArea(SourceFormatter out, Area area) { + out.doc(area.getComment()); + out.line("area " + MOSpecTypes.identifier(area.getName()) + + " [" + area.getNumber() + "." + area.getVersion() + "]"); + writeDocSections(out, area.getDocumentation().getSections()); + writeDiagramReferences(out, area.getDocumentation().getDiagrams()); + writeDataTypes(out, area, null, area.getDataTypes()); + writeErrorDefinitions(out, area.getErrors()); + + for (Service service : area.getServices()) { + out.blank(); + writeService(out, area, service); + } + } + + private void writeService(SourceFormatter out, Area area, Service service) { + out.doc(service.getComment()); + // A service can be a COM extended service and declare nothing at all under com, so + // being one is said on the service rather than inferred from what follows. + out.line((service.isExtended() ? "extended service " : "service ") + + MOSpecTypes.identifier(service.getName()) + + " [" + service.getNumber() + "] {"); + out.in(); + + writeDocSections(out, service.getDocumentation().getSections()); + writeDiagramReferences(out, service.getDocumentation().getDiagrams()); + + for (CapabilitySet set : service.getCapabilitySets()) { + out.blank(); + writeCapabilitySet(out, area, service, set); + } + + writeDataTypes(out, area, service, service.getDataTypes()); + writeErrorDefinitions(out, service.getErrors()); + + if (service.getCom() != null) { + out.blank(); + writeCom(out, area, service, service.getCom()); + } + + out.out(); + out.line("}"); + } + + private void writeCapabilitySet(SourceFormatter out, Area area, Service service, + CapabilitySet set) { + out.doc(set.getComment()); + out.line("capability [" + set.getNumber() + "] {"); + out.in(); + for (Operation operation : set.getOperations()) { + out.blank(); + writeOperation(out, area, service, operation); + } + out.out(); + out.line("}"); + } + + /** + * One operation: its documentation, then the pattern, the name, the number, and the + * messages it exchanges in the order they travel. + */ + private void writeOperation(SourceFormatter out, Area area, Service service, + Operation operation) { + if (mode == DocMode.BULK) { + out.doc(operation.getComment(), bulkTags(area, operation)); + } else if (mode == DocMode.INLINE) { + // A message's own comment stays in the block even inline, tagged by its stage. + // Written inside the parentheses it could not be told from the documentation of + // the first field, which sits in the same place and looks the same. + out.doc(operation.getComment(), messageTags(operation)); + } + writeDocSections(out, operation.getDocumentation().getSections()); + + StringBuilder head = new StringBuilder(); + if (operation.isSupportInReplay()) { + head.append("replayable "); + } + head.append(patternOf(operation)).append(' ') + .append(MOSpecTypes.identifier(operation.getName())) + .append(" [").append(operation.getNumber()).append(']'); + // The opening message is left out where the operation declares none: a + // publish-subscribe operation that keys its subscription on nothing is not the same + // as one that keys it on an empty list. + InteractionStage first = firstStageOf(operation); + boolean opened = operation.getMessage(first) != null; + + if (mode == DocMode.INLINE) { + if (opened) { + writeInlineMessage(out, area, service, operation, first, head + " "); + } else { + out.line(head.toString()); + } + out.in(); + for (InteractionStage stage : replyStagesOf(operation)) { + writeInlineMessage(out, area, service, operation, stage, "-> "); + if (repeats(operation, stage)) { + out.line("*"); + } + } + writeThrows(out, area, service, operation); + out.out(); + return; + } + + if (opened) { + head.append(' ').append(message(area, service, operation, first)); + } + out.line(head.toString()); + + out.in(); + for (InteractionStage stage : replyStagesOf(operation)) { + out.line("-> " + message(area, service, operation, stage) + + (repeats(operation, stage) ? "*" : "")); + } + writeThrows(out, area, service, operation); + out.out(); + } + + /** + * The errors an operation may answer with, each with the type of whatever extra + * information it carries. + */ + private void writeThrows(SourceFormatter out, Area area, Service service, + Operation operation) { + if (operation.getErrors().isEmpty()) { + return; + } + if (mode == DocMode.INLINE) { + out.line("throws"); + out.in(); + List<ErrorReference> errors = operation.getErrors(); + for (int i = 0; i < errors.size(); i++) { + ErrorReference error = errors.get(i); + out.doc(error.getComment()); + String written = errorName(area, error) + (i == errors.size() - 1 ? "" : ","); + if (error.getExtraInformation() == null) { + out.line(written); + continue; + } + out.line(errorName(area, error) + ":"); + out.in(); + out.doc(error.getExtraInformation().getComment()); + out.line(MOSpecTypes.of(area, service, error.getExtraInformation().getType()) + + (i == errors.size() - 1 ? "" : ",")); + out.out(); + } + out.out(); + return; + } + + List<String> raised = new ArrayList<String>(); + for (ErrorReference error : operation.getErrors()) { + String written = errorName(area, error); + if (error.getExtraInformation() != null) { + written += ": " + MOSpecTypes.of(area, service, + error.getExtraInformation().getType()); + } + raised.add(written); + } + out.line("throws " + join(raised, ", ")); + } + + /** + * @return the fields of one message, in parentheses. + */ + private String message(Area area, Service service, Operation operation, + InteractionStage stage) { + if (stage == null) { + return "()"; + } + List<Field> fields = fieldsOf(operation, stage); + List<String> written = new ArrayList<String>(); + for (Field field : fields) { + written.add(MOSpecTypes.field(area, service, field)); + } + return "(" + join(written, ", ") + ")"; + } + + /** + * Writes a message with the documentation of each field beside it, which is what inline + * mode is for: the signature is longer, and nothing about a field is anywhere else. + * + * @return true if anything was written, false where the message is empty and the + * caller should write it on the line it is already on. + */ + private boolean writeInlineMessage(SourceFormatter out, Area area, Service service, + Operation operation, InteractionStage stage, String opening) { + List<Field> fields = stage == null ? new ArrayList<Field>() + : fieldsOf(operation, stage); + + if (fields.isEmpty()) { + out.line(opening + "()"); + return true; + } + out.line(opening + "("); + out.in(); + for (int i = 0; i < fields.size(); i++) { + Field field = fields.get(i); + out.doc(field.getComment()); + out.line(MOSpecTypes.field(area, service, field) + + (i == fields.size() - 1 ? "" : ",")); + } + out.out(); + out.line(")"); + return true; + } + + /** + * The tagged lines of a bulk documentation block: one per documented field, then one + * per error and its extra information. + */ + /** + * @return one tag per message that documents itself, and nothing else. + */ + private List<String> messageTags(Operation operation) { + List<String> tags = new ArrayList<String>(); + for (InteractionStage stage : allStagesOf(operation)) { + MessageBody body = operation.getMessage(stage); + if (body != null && body.getComment() != null) { + tags.add("@" + tagOf(stage) + ": " + body.getComment()); + } + } + return tags; + } + + private List<String> bulkTags(Area area, Operation operation) { + List<String> tags = new ArrayList<String>(); + for (InteractionStage stage : allStagesOf(operation)) { + MessageBody body = operation.getMessage(stage); + if (body != null && body.getComment() != null) { + tags.add("@" + tagOf(stage) + ": " + body.getComment()); + } + for (Field field : fieldsOf(operation, stage)) { + // Written whenever there is a comment at all, empty or not: the empty one + // is a thing the specification says, and it has to come back. + if (field.getComment() != null) { + tags.add("@" + tagOf(stage) + "param " + field.getName() + ": " + + field.getComment()); + } + } + } + for (ErrorReference error : operation.getErrors()) { + String name = errorName(area, error); + if (error.getComment() != null) { + tags.add("@error " + name + ": " + error.getComment()); + } + Field extra = error.getExtraInformation(); + if (extra != null && extra.getComment() != null) { + tags.add("@errorinfo " + name + ": " + extra.getComment()); + } + } + return tags; + } + + private void writeDataTypes(SourceFormatter out, Area area, Service service, + List<TypeDefinition> types) { + for (TypeDefinition type : types) { + out.blank(); + if (type instanceof FundamentalType) { + writeFundamental(out, area, service, (FundamentalType) type); + } else if (type instanceof AttributeType) { + writeAttribute(out, (AttributeType) type); + } else if (type instanceof EnumerationType) { + writeEnumeration(out, (EnumerationType) type); + } else if (type instanceof CompositeType) { + writeComposite(out, area, service, (CompositeType) type); + } + } + } + + private void writeFundamental(SourceFormatter out, Area area, Service service, + FundamentalType type) { + out.doc(type.getComment()); + String head = "fundamental " + MOSpecTypes.identifier(type.getName()); + if (type.getSuperType() != null) { + head += " extends " + MOSpecTypes.of(area, service, type.getSuperType()); + } + out.line(head); + } + + private void writeAttribute(SourceFormatter out, AttributeType type) { + out.doc(type.getComment()); + out.line("attribute " + MOSpecTypes.identifier(type.getName()) + + " [" + type.getShortFormPart() + "]"); + } + + private void writeEnumeration(SourceFormatter out, EnumerationType type) { + out.doc(type.getComment()); + out.line("enumeration " + MOSpecTypes.identifier(type.getName()) + + " [" + type.getShortFormPart() + "] {"); + out.in(); + for (EnumerationItem item : type.getItems()) { + out.doc(item.getComment()); + out.line(MOSpecTypes.identifier(item.getValue()) + + " [" + item.getNumericValue() + "]"); + } + out.out(); + out.line("}"); + } + + private void writeComposite(SourceFormatter out, Area area, Service service, + CompositeType type) { + out.doc(type.getComment()); + StringBuilder head = new StringBuilder(); + if (type.isAbstract()) { + head.append("abstract "); + } + head.append("composite ").append(MOSpecTypes.identifier(type.getName())); + if (type.getShortFormPart() != null) { + head.append(" [").append(type.getShortFormPart()).append(']'); + } + if (type.getSuperType() != null) { + head.append(" extends ").append(MOSpecTypes.of(area, service, type.getSuperType())); + } + out.line(head.append(" {").toString()); + out.in(); + for (Field field : type.getFields()) { + out.doc(field.getComment()); + out.line(MOSpecTypes.field(area, service, field)); + } + out.out(); + out.line("}"); + } + + private void writeErrorDefinitions(SourceFormatter out, List<ErrorDefinition> errors) { + for (ErrorDefinition error : errors) { + out.blank(); + out.doc(error.getComment()); + out.line("error " + MOSpecTypes.identifier(error.getName()) + + " [" + error.getNumber() + "]"); + } + } + + /** + * What the service adds to the COM: the objects it stores, the events it raises, and + * how it uses the archive and the activity tracking. + */ + private void writeCom(SourceFormatter out, Area area, Service service, COMFeatures com) { + out.line("com {"); + out.in(); + writeDiagramReferences(out, com.getDocumentation().getDiagrams()); + writeDocSections(out, com.getDocumentation().getSections()); + + if (com.declaresObjects()) { + out.blank(); + out.doc(com.getObjectsComment()); + out.line("objects {"); + out.in(); + for (COMObject object : com.getObjects()) { + out.blank(); + writeComObject(out, area, service, "object", object); + } + out.out(); + out.line("}"); + } + if (com.declaresEvents()) { + out.blank(); + out.doc(com.getEventsComment()); + out.line("events {"); + out.in(); + for (COMObject event : com.getEvents()) { + out.blank(); + writeComObject(out, area, service, "event", event); + } + out.out(); + out.line("}"); + } + if (com.declaresArchiveUsage()) { + out.blank(); + out.doc(com.getArchiveUsage()); + out.line("archiveUsage"); + } + if (com.declaresActivityUsage()) { + out.blank(); + out.doc(com.getActivityUsage()); + out.line("activityUsage"); + } + out.out(); + out.line("}"); + } + + /** + * One COM object or event. The braces are left off where it links to nothing, which is + * most of them. + */ + private void writeComObject(SourceFormatter out, Area area, Service service, + String keyword, COMObject object) { + out.doc(object.getComment()); + StringBuilder head = new StringBuilder(keyword); + head.append(' ').append(MOSpecTypes.identifier(object.getName())) + .append(" [").append(object.getNumber()).append(']'); + if (object.getBodyType() != null) { + head.append(" (").append(MOSpecTypes.of(area, service, object.getBodyType())) + .append(')'); + } + + boolean hasLinks = object.getRelated() != null || object.getSource() != null; + if (!hasLinks) { + out.line(head.toString()); + return; + } + out.line(head.append(" {").toString()); + out.in(); + writeLink(out, area, "related", object.getRelated()); + writeLink(out, area, "source", object.getSource()); + out.out(); + out.line("}"); + } + + /** + * A link to another COM object, by name where the target is known and by number where + * it is not - a specification whose target area is absent still has to round-trip. + */ + private void writeLink(SourceFormatter out, Area area, String keyword, ObjectLink link) { + if (link == null) { + return; + } + out.doc(link.getComment()); + ObjectReference target = link.getTarget(); + if (target == null) { + out.line(keyword + " -"); + return; + } + StringBuilder written = new StringBuilder(keyword).append(' '); + if (!area.getName().equals(target.getArea())) { + written.append(target.getArea()).append("::"); + } + if (target.getService() != null && !target.getService().isEmpty()) { + written.append(target.getService()); + } + out.line(written.append('#').append(target.getNumber()).toString()); + } + + private void writeDocSections(SourceFormatter out, List<DocSection> sections) { + if (mode == DocMode.SUPPRESS) { + return; + } + for (DocSection section : sections) { + out.blank(); + String head = "doc \"" + section.getName() + "\" [" + section.getOrder() + "]"; + if (section.getContent() == null || section.getContent().isEmpty()) { + out.line(head); + continue; + } + out.line(head + " \"\"\""); + out.in(); + for (String written : section.getContent().split("\n", -1)) { + out.line(written); + } + out.out(); + out.line("\"\"\""); + } + } + + private void writeDiagramReferences(SourceFormatter out, List<Diagram> diagrams) { + for (Diagram diagram : diagrams) { + out.blank(); + out.line("diagram " + MOSpecTypes.identifier(diagram.getName()) + + " \"" + diagram.getName() + ".svg\""); + } + } + + private void writeDiagrams(Path outputDir, List<Diagram> diagrams) throws IOException { + for (Diagram diagram : diagrams) { + write(outputDir.resolve(diagram.getName() + ".svg"), diagram.getSvg()); + } + } + + private static void write(Path file, String content) throws IOException { + Writer out = new OutputStreamWriter(Files.newOutputStream(file), UTF8); + try { + out.write(content == null ? "" : content); + } finally { + out.close(); + } + } + + // ------------------------------------------------------------- the stages + + private static String patternOf(Operation operation) { + return operation.getPattern().name().toLowerCase(); + } + + /** + * @return the stage the consumer starts the interaction with. + */ + private static InteractionStage firstStageOf(Operation operation) { + switch (operation.getPattern()) { + case SEND: + return InteractionStage.SEND; + case SUBMIT: + return InteractionStage.SUBMIT; + case REQUEST: + return InteractionStage.REQUEST; + case INVOKE: + return InteractionStage.INVOKE; + case PROGRESS: + return InteractionStage.PROGRESS; + case PUBSUB: + return InteractionStage.SUBSCRIPTION_KEYS; + default: + return null; + } + } + + /** + * @return the stages the provider answers with, in the order they travel. + */ + private static List<InteractionStage> replyStagesOf(Operation operation) { + List<InteractionStage> stages = new ArrayList<InteractionStage>(); + switch (operation.getPattern()) { + case REQUEST: + stages.add(InteractionStage.RESPONSE); + break; + case INVOKE: + stages.add(InteractionStage.ACK); + stages.add(InteractionStage.RESPONSE); + break; + case PROGRESS: + stages.add(InteractionStage.ACK); + stages.add(InteractionStage.UPDATE); + stages.add(InteractionStage.RESPONSE); + break; + case PUBSUB: + stages.add(InteractionStage.PUBLISH_NOTIFY); + break; + default: + break; + } + return stages; + } + + private static List<InteractionStage> allStagesOf(Operation operation) { + List<InteractionStage> stages = new ArrayList<InteractionStage>(); + InteractionStage first = firstStageOf(operation); + if (first != null) { + stages.add(first); + } + stages.addAll(replyStagesOf(operation)); + return stages; + } + + /** + * @return true where the stage may be sent more than once, which only the update of a + * progress is. + */ + private static boolean repeats(Operation operation, InteractionStage stage) { + return operation.getPattern() == InteractionPattern.PROGRESS + && stage == InteractionStage.UPDATE; + } + + /** + * @return the tag that documents a field of this stage, which is the stage's own name. + */ + private static String tagOf(InteractionStage stage) { + if (stage == InteractionStage.PUBLISH_NOTIFY) { + return "publish"; + } + if (stage == InteractionStage.SUBSCRIPTION_KEYS) { + return "subscriptionkeys"; + } + return stage.name().toLowerCase(); + } + + private static String errorName(Area area, ErrorReference error) { + TypeRef ref = error.getError(); + StringBuilder buf = new StringBuilder(); + if (ref.getArea() != null && !ref.getArea().equals(area.getName())) { + buf.append(ref.getArea()).append("::"); + } + if (ref.getService() != null && !ref.getService().isEmpty()) { + buf.append(ref.getService()).append('.'); + } + return buf.append(MOSpecTypes.identifier(ref.getName())).toString(); + } + + private static List<Field> fieldsOf(Operation operation, InteractionStage stage) { + MessageBody body = operation.getMessage(stage); + return body == null ? new ArrayList<Field>() : body.getFields(); + } + + private static String join(List<String> parts, String separator) { + StringBuilder buf = new StringBuilder(); + for (int i = 0; i < parts.size(); i++) { + buf.append(i == 0 ? "" : separator).append(parts.get(i)); + } + return buf.toString(); + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/exporters/mospec/MOSpecTypes.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/exporters/mospec/MOSpecTypes.java new file mode 100644 index 00000000..d1a360d2 --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/exporters/mospec/MOSpecTypes.java @@ -0,0 +1,171 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.exporters.mospec; + +import esa.mo.apigen.model.Area; +import esa.mo.apigen.model.Field; +import esa.mo.apigen.model.Service; +import esa.mo.apigen.model.types.TypeDefinition; +import esa.mo.apigen.model.types.TypeRef; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; + +/** + * How a type is written in MOSpec. + * <p> + * Type-first, with the list and object-reference wrappers around the name and nullability + * postfix on the whole thing: {@code List<ObjectRef<Product>>? refs}. The area and service + * are left off only when both match where the type is being mentioned, so a name is never + * ambiguous about where it comes from. + */ +public final class MOSpecTypes { + + /** + * Words the grammar gives a meaning to. An identifier that collides with one is quoted, + * so that a specification is never prevented from naming something what it likes. + */ + private static final Set<String> KEYWORDS = new HashSet<String>(Arrays.asList( + "specification", "area", "service", "capability", "com", "objects", "events", + "object", "event", "related", "source", "archiveUsage", "activityUsage", + "diagram", "doc", "composite", "enumeration", "attribute", "fundamental", + "abstract", "extends", "extended", "error", "errors", "throws", "replayable", + "send", "submit", "request", "invoke", "progress", "pubsub", "subscriptionKeys")); + + private MOSpecTypes() { + } + + /** + * Writes a type as it is referred to from somewhere. + * + * @param area The area doing the referring. + * @param service The service doing the referring, or null at area level. + * @param reference The type referred to. + * @return the type, written. + */ + public static String of(Area area, Service service, TypeRef reference) { + TypeRef ref = reference.unwrapped(); + StringBuilder buf = new StringBuilder(qualified(area, service, ref)); + if (ref.isObjectRef()) { + buf.insert(0, "ObjectRef<").append('>'); + } + if (ref.isList()) { + buf.insert(0, "List<").append('>'); + } + return buf.toString(); + } + + /** + * Writes a field: its type, then its name, with the nullable marker between them. + * + * @param area The area the field is declared in. + * @param service The service it is declared in, or null at area level. + * @param field The field. + * @return the declaration. + */ + public static String field(Area area, Service service, Field field) { + return of(area, service, field.getType()) + + (field.isCanBeNull() ? "? " : " ") + identifier(field.getName()); + } + + /** + * Writes a name. + * <p> + * Quoted where the grammar would otherwise read it as a keyword, and where it is not a + * bare name at all: the MAL's own errors are called things like "Authentication Failed", + * and a specification is not going to be told what it may call things. + * + * @param name An identifier out of a specification. + * @return the name, quoted where it has to be. + */ + public static String identifier(String name) { + if (name == null) { + return null; + } + return KEYWORDS.contains(name) || !isBare(name) ? "\"" + name + "\"" : name; + } + + /** + * @return true if the name is one the lexer would read as a single word. + */ + private static boolean isBare(String name) { + if (name.isEmpty() || !(Character.isLetter(name.charAt(0)) || name.charAt(0) == '_')) { + return false; + } + for (int i = 0; i < name.length(); i++) { + char c = name.charAt(i); + if (!Character.isLetterOrDigit(c) && c != '_') { + return false; + } + } + return true; + } + + /** + * Names a type from where it is mentioned. + * <p> + * The area is left off when it is the area doing the mentioning, and the service + * likewise - a type of another service in the same area still says which service. MAL + * is left off as well: its types are named in every specification and the language + * imports them implicitly, exactly as the format it descends from did. The one case + * that would be ambiguous - an area declaring a type of its own with the same name as a + * MAL type - is written out in full. + */ + /** + * @return true if the area or the service being written declares a type of this name, + * in which case an unqualified name would mean that one rather than the MAL's. + */ + private static boolean declaresLocally(Area area, Service service, String name) { + if (area != null) { + for (TypeDefinition type : area.getDataTypes()) { + if (name.equals(type.getName())) { + return true; + } + } + } + if (service != null) { + for (TypeDefinition type : service.getDataTypes()) { + if (name.equals(type.getName())) { + return true; + } + } + } + return false; + } + + private static String qualified(Area area, Service service, TypeRef ref) { + StringBuilder buf = new StringBuilder(); + boolean sameArea = area != null && area.getName().equals(ref.getArea()); + boolean implicitMal = !sameArea && "MAL".equals(ref.getArea()) + && !declaresLocally(area, service, ref.getName()); + if (!sameArea && !implicitMal) { + buf.append(ref.getArea()).append("::"); + } + if (ref.getService() != null && !ref.getService().isEmpty()) { + boolean sameService = sameArea && service != null + && ref.getService().equals(service.getName()); + if (!sameService) { + buf.append(ref.getService()).append('.'); + } + } + return buf.append(identifier(ref.getName())).toString(); + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/exporters/mospec/SourceFormatter.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/exporters/mospec/SourceFormatter.java new file mode 100644 index 00000000..87053db0 --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/exporters/mospec/SourceFormatter.java @@ -0,0 +1,188 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.exporters.mospec; + +import java.util.ArrayList; +import java.util.List; + +/** + * How a MOSpec file is laid out, apart from what it says. + * <p> + * The exporter decides what to write; this decides how it reads - where the indentation + * goes, how a doc comment is written, where the blank lines fall. Keeping them apart means + * the layout can be changed without touching the traversal, and the round-trip test says + * whether the change was safe. + */ +public final class SourceFormatter { + + private final StringBuilder buffer = new StringBuilder(); + + private int indent = 0; + + /** + * True where documentation is left out entirely. The one mode that does not preserve + * the model, and the reason the round-trip test holds it to a weaker standard. + */ + private boolean suppressed = false; + + /** + * Stops anything being written as documentation. + */ + public void suppressDocumentation() { + this.suppressed = true; + } + + /** + * Steps in. Everything written until the matching {@link #out} is indented one further. + */ + public void in() { + indent++; + } + + public void out() { + if (indent > 0) { + indent--; + } + } + + /** + * Writes one line at the current indentation. + * + * @param text The line, which may be empty for a blank one. + */ + public void line(String text) { + if (text.isEmpty()) { + buffer.append('\n'); + return; + } + for (int i = 0; i < indent; i++) { + buffer.append('\t'); + } + buffer.append(text).append('\n'); + } + + /** + * Writes a blank line, unless the last thing written was already one. A traversal that + * separates everything from everything else would otherwise leave gaps of two and three + * lines wherever two rules meet. + */ + public void blank() { + int length = buffer.length(); + if (length == 0 || (length >= 2 && buffer.charAt(length - 1) == '\n' + && buffer.charAt(length - 2) == '\n')) { + return; + } + buffer.append('\n'); + } + + /** + * Writes a documentation comment, as one line where it fits and as a block where it + * does not. + * + * @param text The documentation, may be null or empty for none. + */ + public void doc(String text) { + doc(text, new ArrayList<String>()); + } + + /** + * Writes a documentation comment followed by tagged lines, which is how an operation + * documents its fields and errors in bulk mode. + * + * @param text The documentation of the thing itself, may be null. + * @param tags The tagged lines, each already beginning with its tag. + */ + public void doc(String text, List<String> tags) { + if (suppressed) { + return; + } + // Nothing is re-wrapped. A comment is written with the line breaks it has and no + // others: wrapping a long paragraph would turn one paragraph into several, and the + // text that came back would say something the model no longer does. Long lines are + // the price of a round trip that returns what it was given. + List<String> body = new ArrayList<String>(paragraphs(text)); + if (!tags.isEmpty() && !body.isEmpty()) { + body.add(""); + } + for (String tag : tags) { + body.addAll(paragraphs(tag)); + } + if (body.isEmpty()) { + // An empty comment is written as an empty one. The specifications are full of + // comment="", which says nothing but is not the same as saying nothing, and a + // format that could not tell them apart would not round-trip. + if (text != null) { + line("///"); + } + return; + } + // One line is written as one line; anything longer becomes a block, so that a short + // comment does not cost three lines to say one thing. + if (body.size() == 1) { + line("/// " + body.get(0)); + return; + } + line("/**"); + for (String written : body) { + line(written.isEmpty() ? " *" : " * " + written); + } + line(" **/"); + } + + /** + * Writes text that has to survive exactly as it is - a requirement, or anything else + * whose own line breaks carry meaning. + * + * @param text The text. + */ + public void verbatim(String text) { + line("\"\"\""); + in(); + for (String written : text.split("\n", -1)) { + line(written); + } + out(); + line("\"\"\""); + } + + /** + * @return what has been written. + */ + public String toText() { + return buffer.toString(); + } + + /** + * Splits documentation where the writer put a line break, so that a comment written as + * several paragraphs stays several paragraphs. + */ + private static List<String> paragraphs(String text) { + List<String> found = new ArrayList<String>(); + if (text == null || text.isEmpty()) { + return found; + } + for (String paragraph : text.split("\n", -1)) { + found.add(paragraph); + } + return found; + } + +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/exporters/xml/XmlExporter.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/exporters/xml/XmlExporter.java index b9045d6e..c4fc4345 100644 --- a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/exporters/xml/XmlExporter.java +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/exporters/xml/XmlExporter.java @@ -373,12 +373,12 @@ private void writeCom(XmlWriter xml, COMFeatures com) throws IOException { writeComObjects(xml, "event", com.getEvents()); xml.end(); } - if (com.getArchiveUsage() != null) { + if (com.declaresArchiveUsage()) { xml.start("com:archiveUsage"); xml.attr("comment", com.getArchiveUsage()); xml.end(); } - if (com.getActivityUsage() != null) { + if (com.declaresActivityUsage()) { xml.start("com:activityUsage"); xml.attr("comment", com.getActivityUsage()); xml.end(); diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/docx/DocxBody.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/docx/DocxBody.java new file mode 100644 index 00000000..1b46db01 --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/docx/DocxBody.java @@ -0,0 +1,350 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.generators.docx; + +/** + * The body of a Word document, built up as it is written. + * <p> + * Everything a document is made of goes through here - titles, paragraphs, tables, + * captions - and comes out as the WordprocessingML that says it. Nothing in this class + * knows anything about MO: it is told what to write, not what it means. + */ +public final class DocxBody { + + /** + * The numbering of the document this body belongs to, so that a numbered list can ask + * for one of its own. Null for a body that is built up on the side and appended later, + * which is how the data type sections are assembled. + */ + private final DocxNumbering numbering; + + /** + * A caption is the same construction whether it names a table or a figure: the word, + * the chapter number, a sequence number, and an entry for the table of contents. Only + * the word and the two sequence names differ, so the block is written once. + */ + private static final String CAPTION + = "<w:pPr><w:pStyle w:val=\"TableTitle\"/></w:pPr><w:r>" + + "<w:t xml:space=\"preserve\">${kind} </w:t></w:r>"; + + private final StringBuilder buffer = new StringBuilder(); + + /** + * @param numbering The numbering of the document, which numbered lists draw from. + */ + public DocxBody(DocxNumbering numbering) { + this.numbering = numbering; + } + + /** + * A body that cannot number a list, for text assembled on the side. + */ + public DocxBody() { + this(null); + } + + /** + * Writes a heading. + * + * @param level How deep the heading is, 1 being a chapter. + * @param name What the heading says. + */ + public void title(int level, String name) { + title(level, "", name, null); + } + + /** + * Writes a heading that can be linked to from elsewhere in the document. + * + * @param level How deep the heading is, 1 being a chapter. + * @param section The number in front of the name, empty for none. + * @param name What the heading says. + * @param bookmark What to call the anchor, or null not to place one. + */ + public void title(int level, String section, String name, String bookmark) { + append(2, "<w:p><w:pPr><w:pStyle w:val=\"Heading" + level + "\"/></w:pPr>"); + if (bookmark != null) { + append(3, "<w:bookmarkStart w:id=\"1\" w:name=\"" + bookmark + "_" + name + + "\"/><w:bookmarkEnd w:id=\"1\"/>"); + } + append(3, "<w:r><w:t>" + section + name + "</w:t></w:r>"); + append(2, "</w:p>"); + } + + /** + * Writes a comment out of a specification as running text. + * <p> + * The comments carry a little markup of their own: a line inside {@code _li_} becomes a + * bullet, and the {@code _ul_} around a group of them says nothing a Word document + * needs, so it is dropped. + * + * @param text The comment, may be null. + */ + public void comment(String text) { + for (String line : DocxText.split(text)) { + if ("<ul>".equals(line) || "</ul>".equals(line)) { + continue; + } + if (line.contains("<li>")) { + String item = line.substring(line.indexOf("<li>") + 4, line.indexOf("</li>")); + append(2, "<w:p><w:pPr><w:pStyle w:val=\"ListParagraph\"/><w:numPr>" + + "<w:ilvl w:val=\"0\"/><w:numId w:val=\"1\"/></w:numPr></w:pPr><w:r><w:t>" + + DocxText.escape(item) + "</w:t></w:r></w:p>"); + } else { + append(2, "<w:p><w:pPr><w:keepNext/></w:pPr><w:r><w:t>" + + DocxText.escape(line) + "</w:t></w:r></w:p>"); + } + } + } + + /** + * Writes a numbered list, which gets a numbering of its own so that it starts from the + * top rather than carrying on from the last list. + * + * @param lines The items. An {@code _ol_} among them opens a nested list and the + * matching close ends it. + * @throws java.io.IOException if the numbering template is missing from the build. + */ + public void numberedComment(java.util.List<String> lines) throws java.io.IOException { + if (lines == null || lines.isEmpty()) { + return; + } + int instance = numbering == null ? 0 : numbering.nextInstance(); + numbered(instance, 0, lines.iterator()); + } + + /** + * Writes the items of a list, descending into a nested one where it starts. + */ + private void numbered(int instance, int level, java.util.Iterator<String> lines) { + while (lines.hasNext()) { + String line = lines.next(); + if (line == null || line.trim().isEmpty()) { + continue; + } + if ("<ol>".equalsIgnoreCase(line)) { + numbered(instance, level + 1, lines); + } else if ("</ol>".equalsIgnoreCase(line)) { + return; + } else { + numberedItem(instance, level, line); + } + } + } + + /** + * Writes one item, which may itself be several lines, and which is written as a note + * instead where it announces itself as one. + */ + private void numberedItem(int instance, int level, String text) { + java.util.List<String> parts = DocxText.split(text); + if (parts.size() > 1) { + for (String part : parts) { + numberedItem(instance, level, part); + } + return; + } + if (text.toLowerCase().contains("note:")) { + note(text); + return; + } + for (String part : parts) { + if (!part.isEmpty()) { + append(2, "<w:p><w:pPr><w:numPr><w:ilvl w:val=\"" + level + "\"/><w:numId w:val=\"" + + instance + "\"/></w:numPr></w:pPr><w:r><w:t>" + DocxText.escape(part) + + "</w:t></w:r></w:p>"); + } + } + } + + /** + * Writes a note, which the documents set apart from the text around it. + * + * @param text The note, with or without the word that announces it. + */ + public void note(String text) { + String body = text.replace("Note: ", "").replace("NOTE: ", ""); + append(2, "<w:p w14:paraId=\"7F00DCB7\" w14:textId=\"77777777\" w:rsidR=\"00B06274\"" + + " w:rsidRPr=\"00B06274\" w:rsidRDefault=\"00B06274\" w:rsidP=\"00B06274\">"); + append(3, "<w:pPr><w:keepLines/><w:tabs><w:tab w:val=\"left\" w:pos=\"806\"/></w:tabs>" + + "<w:spacing w:before=\"240\" w:after=\"0\" w:line=\"280\" w:lineRule=\"atLeast\"/>" + + "<w:ind w:left=\"1138\" w:hanging=\"1138\"/><w:jc w:val=\"both\"/><w:rPr>" + + "<w:kern w:val=\"0\"/><w:sz w:val=\"24\"/><w:szCs w:val=\"20\"/>" + + "<w14:ligatures w14:val=\"none\"/></w:rPr></w:pPr>"); + append(3, "<w:r w:rsidRPr=\"00B06274\"><w:t>NOTE</w:t></w:r>"); + append(3, "<w:r w:rsidRPr=\"00B06274\"><w:tab/><w:t>\u2013</w:t></w:r>"); + append(3, "<w:r w:rsidRPr=\"00B06274\"><w:tab/><w:t>" + body + "</w:t></w:r>"); + append(2, "</w:p>"); + } + + /** + * Writes the one field a message carries, named and described. + * + * @param fieldName The name of the field. + * @param fieldComment What the field holds. + */ + public void singleTypeSignature(String fieldName, String fieldComment) { + append(2, "<w:p><w:pPr><w:numPr><w:ilvl w:val=\"0\"/><w:numId w:val=\"1\"/></w:numPr>" + + "</w:pPr><w:r><w:rPr><w:b/><w:bCs/></w:rPr><w:t>" + DocxText.escape(fieldName) + + "</w:t></w:r><w:r><w:t xml:space=\"preserve\"> - " + + DocxText.escape(fieldComment) + "</w:t></w:r></w:p>"); + } + + /** + * Starts a table. + * + * @param widths The width of each column, in twentieths of a point. + * @return the table, to add rows to. + */ + public DocxTable table(int[] widths) { + return new DocxTable(this, widths); + } + + /** + * Starts a table under a caption that names it. + * + * @param widths The width of each column, in twentieths of a point. + * @param caption What the table is called. + * @return the table, to add rows to. + */ + public DocxTable table(int[] widths, String caption) { + if (caption != null) { + caption("Table", caption); + } + return new DocxTable(this, widths); + } + + /** + * Writes the caption of a figure, which follows the figure rather than preceding it. + * + * @param caption What the figure is called. + */ + public void figureCaption(String caption) { + if (caption != null) { + caption("Figure", caption); + } + } + + /** + * Writes a caption: the word, the chapter it is in, its number within the chapter, and + * the field that puts it in the table of contents. + * + * @param kind "Table" or "Figure", which is both the word shown and the sequence the + * number comes from. + * @param caption What is being named. + */ + private void caption(String kind, String caption) { + String bookmark = "Table".equals(kind) ? "T_" : "F_"; + append(2, "<w:p>"); + append(3, CAPTION.replace("${kind}", kind)); + append(3, "<w:bookmarkStart w:id=\"0\" w:name=\"" + bookmark + caption + "\"/>"); + append(3, "<w:r><w:fldChar w:fldCharType=\"begin\"/></w:r><w:r><w:instrText" + + " xml:space=\"preserve\"> STYLEREF \"Heading 1\"\\l \\n \\t \\* MERGEFORMAT" + + " </w:instrText></w:r><w:r><w:fldChar w:fldCharType=\"separate\"/></w:r><w:r>" + + "<w:t>1</w:t></w:r><w:r><w:fldChar w:fldCharType=\"end\"/></w:r><w:r>" + + "<w:noBreakHyphen/></w:r><w:r><w:fldChar w:fldCharType=\"begin\"/></w:r><w:r>" + + "<w:instrText xml:space=\"preserve\"> SEQ " + kind + " \\s 1 </w:instrText>" + + "</w:r><w:r><w:fldChar w:fldCharType=\"separate\"/></w:r><w:r><w:t>1</w:t>" + + "</w:r><w:r><w:fldChar w:fldCharType=\"end\"/></w:r><w:bookmarkEnd w:id=\"0\"/>" + + "<w:r><w:fldChar w:fldCharType=\"begin\"/></w:r><w:r><w:instrText>tc \\f T \"" + + "</w:instrText></w:r><w:fldSimple w:instr=\" STYLEREF "Heading 1"" + + "\\l \\n \\t \\* MERGEFORMAT \">"); + append(3, "<w:bookmarkStart w:id=\"1\" w:name=\"_" + caption + "\"/><w:r><w:instrText>1" + + "</w:instrText></w:r></w:fldSimple>"); + append(3, "<w:r><w:instrText>-</w:instrText></w:r><w:r><w:fldChar" + + " w:fldCharType=\"begin\"/></w:r><w:r><w:instrText xml:space=\"preserve\"> SEQ " + + kind + "_TOC \\s 1 </w:instrText></w:r><w:r><w:fldChar" + + " w:fldCharType=\"separate\"/></w:r><w:r><w:instrText>1</w:instrText></w:r><w:r>" + + "<w:fldChar w:fldCharType=\"end\"/></w:r>"); + append(3, "<w:r><w:instrText>" + caption + "</w:instrText></w:r>"); + append(3, "<w:bookmarkEnd w:id=\"1\"/><w:r><w:instrText>\"</w:instrText></w:r><w:r>" + + "<w:fldChar w:fldCharType=\"end\"/></w:r>"); + append(3, "<w:r><w:t>: " + caption + "</w:t></w:r>"); + append(2, "</w:p>"); + } + + /** + * Starts the next page. + */ + public void pageBreak() { + buffer.append("<w:p><w:r><w:br w:type=\"page\"/></w:r></w:p>"); + } + + /** + * Ends a section without starting a new page, which is what separates one data type + * from the next. + */ + public void sectionBreak() { + buffer.append("<w:p><w:pPr><w:sectPr><w:type w:val=\"continuous\"/></w:sectPr></w:pPr></w:p>"); + } + + /** + * Places a picture in the text, as wide as the page allows. + * + * @param index Which picture this is, which is also what the relationship is named. + * @param height How tall to draw it, in English Metric Units. + * @param width How wide to draw it, in English Metric Units. + */ + void appendDrawing(int index, int height, int width) { + // Appended as it stands, like the breaks: a picture sits in the run of text rather + // than on a line of its own. + buffer.append("<w:p><w:r><w:drawing><wp:inline distT=\"0\" distB=\"0\" distL=\"0\"" + + " distR=\"0\"><wp:extent cx=\"" + width + "\" cy=\"" + height + "\"/>" + + "<wp:effectExtent l=\"0\" t=\"0\" r=\"0\" b=\"0\"/><wp:docPr id=\"" + index + + "\" name=\"Picture " + index + "\"/><wp:cNvGraphicFramePr>" + + "<a:graphicFrameLocks xmlns:a=\"http://schemas.openxmlformats.org/drawingml/" + + "2006/main\" noChangeAspect=\"1\"/></wp:cNvGraphicFramePr><a:graphic" + + " xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\">" + + "<a:graphicData uri=\"http://schemas.openxmlformats.org/drawingml/2006/" + + "picture\"><pic:pic xmlns:pic=\"http://schemas.openxmlformats.org/drawingml/" + + "2006/picture\"><pic:nvPicPr><pic:cNvPr id=\"" + index + "\" name=\"Picture " + + index + "\"/><pic:cNvPicPr><a:picLocks noChangeAspect=\"1\"" + + " noChangeArrowheads=\"1\"/></pic:cNvPicPr></pic:nvPicPr><pic:blipFill>" + + "<a:blip r:embed=\"image" + index + "\"></a:blip><a:srcRect/><a:stretch>" + + "<a:fillRect/></a:stretch></pic:blipFill><pic:spPr bwMode=\"auto\"><a:xfrm>" + + "<a:off x=\"0\" y=\"0\"/><a:ext cx=\"" + width + "\" cy=\"" + height + "\"/>" + + "</a:xfrm><a:prstGeom prst=\"rect\"><a:avLst/></a:prstGeom><a:noFill/><a:ln>" + + "<a:noFill/></a:ln></pic:spPr></pic:pic></a:graphicData></a:graphic>" + + "</wp:inline></w:drawing></w:r></w:p>"); + } + + /** + * @return everything written so far. + */ + public String toXml() { + return buffer.toString(); + } + + /** + * Appends a body built up on the side, as it stands. The data types are gathered while + * the services are walked and land at the end of the document. + * + * @param other The body to append. + */ + public void append(DocxBody other) { + buffer.append(other.buffer); + } + + public void append(int indent, String text) { + buffer.append(DocxText.line(indent, text, DocxText.BODY_SEPARATOR)); + } + +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/docx/DocxCell.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/docx/DocxCell.java new file mode 100644 index 00000000..4d9b4a61 --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/docx/DocxCell.java @@ -0,0 +1,166 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.generators.docx; + +/** + * One cell of a table, described before it is written. + * <p> + * The generator this replaces reached a cell through nine overloads of one method, taking + * a column index, the widths of every column, and four flags in a fixed order. Here a cell + * says what it is: the row knows which column it is in and how wide that is, and anything + * unusual about the cell is named at the point it is asked for. + */ +public final class DocxCell { + + /** + * How a cell takes part in a run of cells merged down the page. + */ + enum Merge { + /** + * Not merged with anything. + */ + NONE, + /** + * The top of a merged run, which is where the content goes. + */ + START, + /** + * Continues the run above it, and so is written empty. + */ + CONTINUE + } + + private final DocxRow row; + + private final String content; + + private String shade = null; + + private boolean centered = false; + + private int span = 1; + + private Merge merge = Merge.NONE; + + DocxCell(DocxRow row, String content) { + this.row = row; + this.content = content; + } + + /** + * Fills the cell with a background colour. + * + * @param colour The colour, as six hexadecimal digits. + * @return this cell. + */ + public DocxCell shaded(String colour) { + this.shade = colour; + return this; + } + + /** + * @return this cell, with its content centred. + */ + public DocxCell centered() { + this.centered = true; + return this; + } + + /** + * Widens the cell over the columns that follow it. + * + * @param columns How many columns the cell covers, including its own. + * @return this cell. + */ + public DocxCell spanning(int columns) { + this.span = columns; + return this; + } + + /** + * @return this cell, as the top of a run merged down the page. + */ + public DocxCell mergeStart() { + this.merge = Merge.START; + return this; + } + + /** + * @return this cell, continuing the merged run above it. + */ + public DocxCell mergeContinue() { + this.merge = Merge.CONTINUE; + return this; + } + + /** + * Finishes the cell and returns to the row, so that cells read one after another. + * + * @return the row this cell belongs to. + */ + public DocxRow next() { + row.write(this); + return row; + } + + /** + * Finishes the cell and the row. + */ + public void endRow() { + row.write(this); + row.end(); + } + + String toXml(int width) { + StringBuilder buf = new StringBuilder("<w:tc><w:tcPr>"); + buf.append("<w:tcW w:w=\"").append(width).append("\" w:type=\"dxa\"/>"); + + if (merge == Merge.START) { + buf.append("<w:vMerge w:val=\"restart\"/><w:vAlign w:val=\"center\"/>"); + } else if (merge == Merge.CONTINUE) { + buf.append("<w:vMerge/>"); + } + if (span > 1) { + buf.append("<w:gridSpan w:val=\"").append(span).append("\"/>"); + } + if (shade != null) { + buf.append("<w:shd w:val=\"clear\" w:color=\"auto\" w:fill=\"").append(shade).append("\"/>"); + } + buf.append("</w:tcPr>"); + + // A cell that only continues the run above it holds nothing: the content sits in + // the cell that started the run. + if (merge == Merge.CONTINUE) { + buf.append("<w:p/>"); + } else { + buf.append("<w:p>"); + if (centered) { + buf.append("<w:pPr><w:jc w:val=\"center\"/></w:pPr>"); + } + buf.append(content).append("</w:p>"); + } + return buf.append("</w:tc>").toString(); + } + + int getSpan() { + return span; + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/docx/DocxDocument.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/docx/DocxDocument.java new file mode 100644 index 00000000..08cded72 --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/docx/DocxDocument.java @@ -0,0 +1,221 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.generators.docx; + +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.io.OutputStreamWriter; +import java.io.Writer; +import java.nio.charset.Charset; +import java.util.ArrayList; +import java.util.List; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import org.apache.batik.anim.dom.SVGDOMImplementation; +import org.apache.batik.transcoder.TranscoderInput; +import org.apache.batik.transcoder.TranscoderOutput; +import org.apache.batik.transcoder.image.PNGTranscoder; +import org.w3c.dom.DOMImplementation; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; + +/** + * One Word document: its body, its numbering, and the parts that go around them. + * <p> + * A .docx is a zip of XML parts. Everything fixed comes out of the module's resources; what + * is left is the body, the numbering, and the relationships that name the images. This + * writes the parts into a directory, which is what the comparison against the reference + * output reads and what a zip is made from. + */ +public final class DocxDocument { + + private static final Charset UTF8 = Charset.forName("UTF-8"); + + /** + * How wide a diagram is drawn, in English Metric Units: the width of the text on the + * page. The height follows from the proportions of the diagram. + */ + private static final int WIDTH_EMU = 5722620; + + private static final String HEADER + = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>" + + DocxText.BODY_SEPARATOR + + "<w:document xmlns:wpc=\"http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas\"" + + " xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"" + + " xmlns:o=\"urn:schemas-microsoft-com:office:office\"" + + " xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"" + + " xmlns:m=\"http://schemas.openxmlformats.org/officeDocument/2006/math\"" + + " xmlns:v=\"urn:schemas-microsoft-com:vml\"" + + " xmlns:wp14=\"http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing\"" + + " xmlns:wp=\"http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing\"" + + " xmlns:w10=\"urn:schemas-microsoft-com:office:word\"" + + " xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\"" + + " xmlns:w14=\"http://schemas.microsoft.com/office/word/2010/wordml\"" + + " xmlns:wpg=\"http://schemas.microsoft.com/office/word/2010/wordprocessingGroup\"" + + " xmlns:wpi=\"http://schemas.microsoft.com/office/word/2010/wordprocessingInk\"" + + " xmlns:wne=\"http://schemas.microsoft.com/office/word/2006/wordml\"" + + " xmlns:wps=\"http://schemas.microsoft.com/office/word/2010/wordprocessingShape\"" + + " mc:Ignorable=\"w14 wp14\">" + DocxText.BODY_SEPARATOR; + + private static final String RELATIONSHIPS + = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>" + + "<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">" + + "<Relationship Id=\"rId2\" Type=\"http://schemas.openxmlformats.org/officeDocument/" + + "2006/relationships/styles\" Target=\"styles.xml\"/>" + + "<Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/" + + "2006/relationships/numbering\" Target=\"numbering.xml\"/>"; + + private final File folder; + + private final DocxNumbering numbering; + + private final DocxBody body; + + private final List<String> images = new ArrayList<String>(); + + /** + * @param folder The directory the parts are written into. + * @throws IOException if the fixed parts are missing from the build. + */ + public DocxDocument(File folder) throws IOException { + this.folder = folder; + this.numbering = new DocxNumbering(); + this.body = new DocxBody(numbering); + } + + /** + * @return the body of the document, to write into. + */ + public DocxBody getBody() { + return body; + } + + /** + * Adds a diagram, rasterised from the SVG the specification declares. + * <p> + * A .docx carries pictures, not drawings, so the SVG is rendered to a PNG beside the + * document and the body points at it. The drawing is set to the width of the text and + * as tall as its own proportions make it. + * + * @param svg The SVG of the diagram, as the specification wrote it. + * @throws IOException if the diagram cannot be read or rendered. + */ + public void addDiagram(String svg) throws IOException { + int index = images.size() + 1; + String name = "image" + index; + int[] size = rasterise(svg, new File(folder, "word/media"), name); + images.add(name); + + int height = size[1] * (WIDTH_EMU / size[0]); + body.appendDrawing(index, height, WIDTH_EMU); + } + + /** + * Writes every part of the document. + * + * @throws IOException if a part cannot be written. + */ + public void write() throws IOException { + write(new File(folder, "[Content_Types].xml"), + DocxResources.read(DocxResources.CONTENT_TYPES)); + write(new File(folder, "_rels/.rels"), + DocxResources.read(DocxResources.PACKAGE_RELS)); + write(new File(folder, "word/styles.xml"), DocxResources.read(DocxResources.STYLES)); + write(new File(folder, "word/numbering.xml"), numbering.toXml()); + write(new File(folder, "word/document.xml"), HEADER + + DocxText.line(1, "<w:body>", DocxText.BODY_SEPARATOR) + + body.toXml() + + DocxText.line(1, "</w:body>", DocxText.BODY_SEPARATOR) + + DocxText.line(0, "</w:document>", DocxText.BODY_SEPARATOR)); + + StringBuilder rels = new StringBuilder(RELATIONSHIPS); + for (String image : images) { + rels.append("<Relationship Id=\"").append(image) + .append("\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/") + .append("relationships/image\" Target=\"media/").append(image).append(".png\"/>"); + } + write(new File(folder, "word/_rels/document.xml.rels"), + rels.append("</Relationships>").toString()); + } + + /** + * Renders an SVG diagram to a PNG. + * + * @param svg The SVG the specification declares. + * @param into The directory to write the image into. + * @param name The name of the image, without its extension. + * @return the width and height the SVG says it is. + * @throws IOException if the diagram cannot be read or rendered. + */ + private static int[] rasterise(String svg, File into, String name) throws IOException { + try { + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + factory.setNamespaceAware(true); + DocumentBuilder builder = factory.newDocumentBuilder(); + Element declared = builder.parse( + new ByteArrayInputStream(svg.getBytes(UTF8))).getDocumentElement(); + + // Rebuilt on Batik's own document rather than rendered where it stands: the + // transcoder reads the size off the root, and the declared SVG is a fragment of + // a specification rather than a document in its own right. + DOMImplementation impl = SVGDOMImplementation.getDOMImplementation(); + Document document = impl.createDocument( + SVGDOMImplementation.SVG_NAMESPACE_URI, "svg", null); + Element root = document.getDocumentElement(); + int[] size = new int[]{ + Integer.parseInt(declared.getAttribute("width")), + Integer.parseInt(declared.getAttribute("height"))}; + root.setAttributeNS(null, "width", declared.getAttribute("width")); + root.setAttributeNS(null, "height", declared.getAttribute("height")); + Node imported = document.importNode(declared, true); + root.appendChild(imported); + + into.mkdirs(); + OutputStream out = new FileOutputStream(new File(into, name + ".png")); + try { + new PNGTranscoder().transcode( + new TranscoderInput(document), new TranscoderOutput(out)); + out.flush(); + } finally { + out.close(); + } + return size; + } catch (IOException ex) { + throw ex; + } catch (Exception ex) { + throw new IOException("Could not render the diagram '" + name + "'", ex); + } + } + + private static void write(File file, String content) throws IOException { + file.getParentFile().mkdirs(); + Writer out = new OutputStreamWriter(new FileOutputStream(file), UTF8); + try { + out.write(content); + } finally { + out.close(); + } + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/docx/DocxGenerator.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/docx/DocxGenerator.java new file mode 100644 index 00000000..f31c7aa2 --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/docx/DocxGenerator.java @@ -0,0 +1,915 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.generators.docx; + +import esa.mo.apigen.generators.Generator; +import esa.mo.apigen.model.Area; +import esa.mo.apigen.model.CapabilitySet; +import esa.mo.apigen.model.ErrorDefinition; +import esa.mo.apigen.model.ErrorReference; +import esa.mo.apigen.model.MOModel; +import esa.mo.apigen.model.Operation; +import esa.mo.apigen.model.Service; +import esa.mo.apigen.model.Field; +import esa.mo.apigen.model.InteractionPattern; +import esa.mo.apigen.model.InteractionStage; +import esa.mo.apigen.model.MessageBody; +import esa.mo.apigen.model.com.COMFeatures; +import esa.mo.apigen.model.com.COMObject; +import esa.mo.apigen.model.com.ObjectLink; +import esa.mo.apigen.model.com.ObjectReference; +import esa.mo.apigen.model.docs.DocSection; +import esa.mo.apigen.model.docs.Diagram; +import esa.mo.apigen.model.types.AttributeType; +import esa.mo.apigen.model.types.CompositeType; +import esa.mo.apigen.model.types.EnumerationItem; +import esa.mo.apigen.model.types.EnumerationType; +import esa.mo.apigen.model.types.FundamentalType; +import esa.mo.apigen.model.types.TypeDefinition; +import esa.mo.apigen.model.types.TypeRef; +import java.io.File; +import java.io.IOException; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; + +/** + * Writes the Word document that describes a specification. + * <p> + * One document per area: what the area is, then a chapter per service and a section per + * operation, then the data types and the errors. The data types are built up in a second + * body as the services are walked and appended at the end, which is why the document is + * assembled rather than written straight through. + */ +public final class DocxGenerator implements Generator { + + /** + * The blue every table header is filled with. + */ + static final String HEADER_COLOUR = "00CCFF"; + + /** + * The grey a fixed part of a message is filled with, as against a field the + * specification chose. + */ + static final String FIXED_COLOUR = "E0E0E0"; + + private static final int[] SERVICE_OVERVIEW_WIDTHS = {2250, 2801, 1382, 1185, 1382}; + + private static final int[] ERROR_TABLE_WIDTHS = {2302, 1430, 5268}; + + private static final int[] OPERATION_OVERVIEW_WIDTHS = {2200, 1700, 800, 4300}; + + private static final int[] OPERATION_ERROR_WIDTHS = {1500, 1000, 2500, 4000}; + + /** + * What is shown where an error carries no extra information. + */ + private static final String NOT_USED = "Not Used"; + + private static final int[] LIST_WIDTHS = {2302, 6698}; + + private static final int[] ENUM_WIDTHS = {2302, 2430, 4268}; + + private static final int[] COMPOSITE_WIDTHS = {2302, 1830, 1100, 3768}; + + private static final int[] COM_TYPES_WIDTHS = {1010, 2250, 2500, 1150, 2196}; + + @Override + public String getShortName() { + return "docx"; + } + + @Override + public String getDescription() { + return "Generates the Word document of a set of MO service specifications"; + } + + @Override + public void generate(MOModel model, List<Area> targets, Path outputDir) throws IOException { + for (Area area : targets) { + generateArea(model, area, outputDir); + } + } + + /** + * @return the name of the document of an area, which says what it documents. + */ + public static String documentNameOf(Area area) { + return String.format("Service_Specification_area%03d-v%03d-%s", + area.getNumber(), area.getVersion(), area.getName()); + } + + private void generateArea(MOModel model, Area area, Path outputDir) throws IOException { + File folder = new File(outputDir.toFile(), documentNameOf(area)); + DocxDocument document = new DocxDocument(folder); + DocxBody body = document.getBody(); + // The data types are described after everything else, but which of them matter is + // only known once the services have been walked, so they are gathered as we go. + DocxBody types = new DocxBody(); + + body.title(1, "Specification: " + area.getName()); + body.title(2, "General"); + body.comment("This section contains the specifications for the " + + area.getName() + " services."); + body.comment(area.getComment()); + body.comment("This area contains the following services:"); + + List<String> names = new ArrayList<String>(); + for (Service service : area.getServices()) { + names.add(service.getName()); + } + body.numberedComment(names); + + for (DocSection section : area.getDocumentation().getSections()) { + body.title(2, section.getName()); + body.numberedComment(DocxText.split(section.getContent())); + } + + for (Service service : area.getServices()) { + writeService(body, document, model, area, service); + } + + writeDataTypes(types, model, area); + writeErrors(types, area); + + body.append(types); + document.write(); + } + + /** + * A chapter per service: what it is, what it must do, and a section per operation. + */ + private void writeService(DocxBody body, DocxDocument document, MOModel model, Area area, + Service service) throws IOException { + body.pageBreak(); + body.title(2, "Service: ", service.getName(), "SERVICE"); + body.title(3, "Overview"); + body.comment(service.getComment()); + writeServiceTable(body, area, service); + body.title(3, "Service-level Requirements"); + writeRequirements(body, service.getDocumentation().getSections()); + writeComUsage(body, document, area, service); + + for (CapabilitySet set : service.getCapabilitySets()) { + for (Operation operation : set.getOperations()) { + body.pageBreak(); + // The bookmark is named after the service number rather than its name: a + // long bookmark name is cut short and the link stops working. + body.title(3, "Operation: ", operation.getName(), + "OPERATION_" + service.getNumber()); + body.title(4, "Overview"); + body.comment(operation.getComment()); + writeOperationTable(body, area, service, operation); + writeSignatureDetails(body, operation); + body.title(4, "Requirements"); + writeRequirements(body, operation.getDocumentation().getSections()); + writeOperationErrors(body, model, area, service, operation); + } + } + } + + /** + * What the service is numbered, and every operation it offers. + */ + private void writeServiceTable(DocxBody body, Area area, Service service) { + DocxTable table = body.table(SERVICE_OVERVIEW_WIDTHS, + service.getName() + " Service Operations"); + table.row() + .cell("Area Identifier").shaded(HEADER_COLOUR).centered().next() + .cell("Service Identifier").shaded(HEADER_COLOUR).centered().next() + .cell("Area Number").shaded(HEADER_COLOUR).centered().next() + .cell("Service Number").shaded(HEADER_COLOUR).centered().next() + .cell("Area Version").shaded(HEADER_COLOUR).centered().endRow(); + table.row() + .cell(area.getName()).centered().next() + .cell(service.getName()).centered().next() + .cell(String.valueOf(area.getNumber())).centered().next() + .cell(String.valueOf(service.getNumber())).centered().next() + .cell(String.valueOf(area.getVersion())).centered().endRow(); + table.row() + .cell("Interaction Pattern").shaded(HEADER_COLOUR).centered().next() + .cell("Operation Identifier").shaded(HEADER_COLOUR).centered().spanning(2).next() + .cell("Operation Number").shaded(HEADER_COLOUR).centered().next() + .cell("Capability Set").shaded(HEADER_COLOUR).centered().endRow(); + + for (CapabilitySet set : service.getCapabilitySets()) { + // The capability set number is written once for the run of operations that + // belong to it, so the cell of the first operation is merged over the rest. + boolean first = true; + for (Operation operation : set.getOperations()) { + String linkTo = "OPERATION_" + service.getNumber() + "_" + operation.getName(); + DocxRow row = table.row(); + row.cell(shortPatternNameOf(operation)).centered().next() + .markedUp(DocxTypeLink.hyperlink("", operation.getName(), "", linkTo, true)) + .centered().spanning(2).next() + .cell(String.valueOf(operation.getNumber())).centered().next(); + DocxCell capability = row.cell(String.valueOf(set.getNumber())).centered(); + if (first) { + capability.mergeStart(); + } else { + capability.mergeContinue(); + } + capability.endRow(); + first = false; + } + } + table.end(); + } + + /** + * What the service adds to the COM: the objects it stores, the events it raises, and + * how it uses the archive and the activity tracking. + */ + private void writeComUsage(DocxBody body, DocxDocument document, Area area, Service service) + throws IOException { + COMFeatures com = service.getCom(); + if (com == null) { + return; + } + + // An objects section counts as saying something only when it lists something; an + // events section counts as soon as it is written at all. The difference is in the + // existing generator and decides which relationships the figure is said to show. + boolean hasObjects = !com.getObjects().isEmpty(); + boolean hasEvents = com.declaresEvents(); + + if (com.declaresObjects()) { + body.title(3, "COM usage"); + body.numberedComment(DocxText.split(com.getObjectsComment())); + if (hasObjects) { + writeComObjects(body, area, service, com.getObjects(), + service.getName() + " Service Object Types", "Object Name"); + } + } + if (hasEvents) { + body.title(3, "COM Event Service usage"); + body.numberedComment(DocxText.split(com.getEventsComment())); + writeComObjects(body, area, service, com.getEvents(), + service.getName() + " Service Events", "Event Name"); + } + + if (hasObjects || hasEvents) { + String what = "COM" + (hasObjects ? " object" : "") + + (hasEvents ? (hasObjects ? " and event" : " event") : "") + " relationships"; + body.title(3, "COM Object Relationships"); + body.comment("The Figure below shows the " + what + " for this service:"); + for (Diagram diagram : com.getDocumentation().getDiagrams()) { + document.addDiagram(diagram.getSvg()); + } + body.figureCaption(service.getName() + " Service " + what); + } + + if (com.getArchiveUsage() != null) { + body.title(3, "COM Archive Service usage"); + body.numberedComment(DocxText.split(com.getArchiveUsage())); + } + if (com.getActivityUsage() != null) { + body.title(3, "COM Activity Service usage"); + body.numberedComment(DocxText.split(com.getActivityUsage())); + } + } + + /** + * The objects or the events of a service, which are described the same way. + */ + private void writeComObjects(DocxBody body, Area area, Service service, + List<COMObject> objects, String caption, String nameColumn) { + DocxTable table = body.table(COM_TYPES_WIDTHS, caption); + table.row() + .cell("Object Number").shaded(HEADER_COLOUR).centered().next() + .cell(nameColumn).shaded(HEADER_COLOUR).centered().next() + .cell("Object Body Type").shaded(HEADER_COLOUR).centered().next() + .cell("Related link").shaded(HEADER_COLOUR).centered().next() + .cell("Source link").shaded(HEADER_COLOUR).centered().endRow(); + + for (COMObject object : objects) { + DocxRow row = table.row(); + row.cell(String.valueOf(object.getNumber())).centered().next() + .cell(object.getName()).centered().next(); + if (object.getBodyType() == null) { + row.cell("No body").centered().next(); + } else { + row.markedUp(DocxTypeLink.forType(area, service, object.getBodyType())) + .centered().next(); + } + row.cell(linkText(area, service, object.getRelated())).centered().next() + .cell(linkText(area, service, object.getSource())).centered().endRow(); + } + table.end(); + } + + /** + * What a link to another object says: the object it points at, whatever the + * specification said instead, or that there is nothing there. + */ + private static String linkText(Area area, Service service, ObjectLink link) { + if (link == null) { + return "Set to NULL"; + } + if (link.getTarget() != null) { + ObjectReference target = link.getTarget(); + StringBuilder buf = new StringBuilder(); + if (!area.getName().equalsIgnoreCase(target.getArea())) { + buf.append(target.getArea()).append("::"); + } + String owning = service == null ? "" : service.getName(); + if (target.getService() != null && !target.getService().isEmpty() + && !target.getService().equalsIgnoreCase(owning)) { + buf.append(target.getService()).append("::"); + } + return buf.append(target.getNumber()).toString(); + } + return link.getComment() != null ? link.getComment() : "Not specified"; + } + + /** + * What one operation exchanges: the pattern it follows, and a row per message with the + * fields it carries. + */ + private void writeOperationTable(DocxBody body, Area area, Service service, + Operation operation) { + DocxTable table = body.table(OPERATION_OVERVIEW_WIDTHS); + table.row() + .cell("Operation Identifier").shaded(HEADER_COLOUR).centered().next() + .cell(operation.getName()).centered().spanning(3).endRow(); + + table.row() + .cell("Interaction Pattern").shaded(HEADER_COLOUR).centered().next() + .cell(patternNameOf(operation)).shaded(FIXED_COLOUR).centered().spanning(3) + .endRow(); + + // Only where the operation says something about its keys: an operation that + // declares none at all is not the same as one that declares an empty set. + if (operation.getPattern() == InteractionPattern.PUBSUB + && operation.getMessage(InteractionStage.SUBSCRIPTION_KEYS) != null) { + writeSubscriptionKeys(table, area, service, operation); + } + + table.row() + .cell("Pattern Sequence").shaded(HEADER_COLOUR).centered().next() + .cell("Message").shaded(HEADER_COLOUR).centered().next() + .cell("Nullable").shaded(HEADER_COLOUR).centered().next() + .cell("Type Signature").shaded(HEADER_COLOUR).centered().endRow(); + + for (Message message : messagesOf(operation)) { + writeMessage(table, area, service, message); + } + table.end(); + } + + /** + * The names a subscription is keyed by, which a publish-subscribe operation states + * before the messages themselves. + */ + private void writeSubscriptionKeys(DocxTable table, Area area, Service service, + Operation operation) { + List<Field> keys = fieldsOf(operation, InteractionStage.SUBSCRIPTION_KEYS); + DocxRow row = table.row(); + row.cell("Subscription Keys").shaded(HEADER_COLOUR).centered().next(); + if (keys.isEmpty()) { + row.cell("Empty").shaded(FIXED_COLOUR).centered().spanning(3).endRow(); + } else { + row.markedUp(signature(area, service, keys)).centered().spanning(3).endRow(); + } + } + + /** + * One message of an interaction: which way it goes, what it is called, and what it + * carries. + */ + private void writeMessage(DocxTable table, Area area, Service service, Message message) { + DocxRow row = table.row(); + row.cell(message.incoming ? "IN" : "OUT").shaded(FIXED_COLOUR).centered().next() + .cell(message.name).shaded(FIXED_COLOUR).centered().next(); + if (message.fields.isEmpty()) { + row.cell("-").shaded(FIXED_COLOUR).centered().next() + .cell("-").shaded(FIXED_COLOUR).centered().endRow(); + } else { + row.markedUp(DocxTypeLink.nullability(message.fields)).centered().next() + .markedUp(signature(area, service, message.fields)).centered().endRow(); + } + } + + /** + * @return the fields of a message, each named and linked to its type. + */ + private static String signature(Area area, Service service, List<Field> fields) { + List<String> parts = new ArrayList<String>(); + for (Field field : fields) { + parts.add(DocxTypeLink.forField(area, service, field)); + } + return DocxTypeLink.join(parts); + } + + /** + * The messages of an interaction, in the order they are exchanged, each knowing which + * way it travels and what the document calls it. + */ + private static List<Message> messagesOf(Operation operation) { + List<Message> messages = new ArrayList<Message>(); + switch (operation.getPattern()) { + case SEND: + messages.add(new Message(true, "SEND", InteractionStage.SEND, + fieldsOf(operation, InteractionStage.SEND))); + break; + case SUBMIT: + messages.add(new Message(true, "SUBMIT", InteractionStage.SUBMIT, + fieldsOf(operation, InteractionStage.SUBMIT))); + break; + case REQUEST: + messages.add(new Message(true, "REQUEST", InteractionStage.REQUEST, + fieldsOf(operation, InteractionStage.REQUEST))); + messages.add(new Message(false, "RESPONSE", InteractionStage.RESPONSE, + fieldsOf(operation, InteractionStage.RESPONSE))); + break; + case INVOKE: + messages.add(new Message(true, "INVOKE", InteractionStage.INVOKE, + fieldsOf(operation, InteractionStage.INVOKE))); + messages.add(new Message(false, "ACK", InteractionStage.ACK, + fieldsOf(operation, InteractionStage.ACK))); + messages.add(new Message(false, "RESPONSE", InteractionStage.RESPONSE, + fieldsOf(operation, InteractionStage.RESPONSE))); + break; + case PROGRESS: + messages.add(new Message(true, "PROGRESS", InteractionStage.PROGRESS, + fieldsOf(operation, InteractionStage.PROGRESS))); + messages.add(new Message(false, "ACK", InteractionStage.ACK, + fieldsOf(operation, InteractionStage.ACK))); + messages.add(new Message(false, "UPDATE", InteractionStage.UPDATE, + fieldsOf(operation, InteractionStage.UPDATE))); + messages.add(new Message(false, "RESPONSE", InteractionStage.RESPONSE, + fieldsOf(operation, InteractionStage.RESPONSE))); + break; + case PUBSUB: + messages.add(new Message(false, "PUBLISH", InteractionStage.PUBLISH_NOTIFY, + fieldsOf(operation, InteractionStage.PUBLISH_NOTIFY))); + break; + default: + break; + } + return messages; + } + + /** + * @return what the operation's own table calls this interaction pattern. + */ + private static String patternNameOf(Operation operation) { + return operation.getPattern() == InteractionPattern.PUBSUB + ? "PUBLISH-SUBSCRIBE" : operation.getPattern().name(); + } + + /** + * @return what the service overview table calls this interaction pattern, which is the + * same as above except that the column is narrow enough to want it shortened. + */ + private static String shortPatternNameOf(Operation operation) { + return operation.getPattern() == InteractionPattern.PUBSUB + ? "PUB-SUB" : operation.getPattern().name(); + } + + private static List<Field> fieldsOf(Operation operation, InteractionStage stage) { + MessageBody body = operation.getMessage(stage); + return body == null ? new ArrayList<Field>() : body.getFields(); + } + + /** + * One error an operation may answer with, gathered from the reference that names it. + * <p> + * The specifications only ever reference an error from an operation, never define one + * there, so the definition is looked up to find its number - and an error of another + * area is named rather than numbered, since its number is that area's business. + */ + private static final class OperationError implements Comparable<OperationError> { + + private final String name; + private final String number; + + /** + * What the error sorts on. Usually its number, but an error of another area sorts + * as zero and one whose number could not be found sorts under the text that says + * so - which is how the reference output orders them. + */ + private final String order; + private final List<String> comments; + private final String extraType; + private final String extraDescription; + + private OperationError(String name, String number, String order, List<String> comments, + String extraType, String extraDescription) { + this.name = name; + this.number = number; + this.order = order; + this.comments = comments; + this.extraType = extraType; + this.extraDescription = extraDescription; + } + + private static OperationError of(MOModel model, Area area, Service service, + ErrorReference reference) { + String name = reference.getError().getName(); + String number = "UNKNOWN ERROR NUMBER!"; + String order; + + String declaredIn = reference.getError().getArea(); + if (declaredIn == null || declaredIn.equals(area.getName())) { + ErrorDefinition definition = model.resolveError(reference.getError()); + if (definition != null) { + number = String.valueOf(definition.getNumber()); + } + order = number; + } else { + number = "Defined in " + declaredIn; + order = "0"; + } + + String extraType = NOT_USED; + String extraDescription = "-"; + Field extra = reference.getExtraInformation(); + if (extra != null) { + extraType = qualify(area, service, extra.getType()); + if (extra.getComment() != null) { + extraDescription = extra.getComment(); + } + } + return new OperationError(name, number, order, + DocxText.split(reference.getComment()), extraType, extraDescription); + } + + /** + * @return the error named and described, a line per thing said about it. + */ + private List<String> describe() { + List<String> lines = new ArrayList<String>(); + if (comments.isEmpty()) { + lines.add(name + ": Not described"); + return lines; + } + for (String comment : comments) { + lines.add(name + ": " + comment); + } + return lines; + } + + @Override + public int compareTo(OperationError other) { + try { + return Long.valueOf(order).compareTo(Long.valueOf(other.order)); + } catch (NumberFormatException ex) { + // One of them is not a number at all, so they are ordered as text. + return order.compareTo(other.order); + } + } + } + + /** + * Names a type from where it is mentioned, leaving off the area and service that are + * being written about. + */ + private static String qualify(Area area, Service service, esa.mo.apigen.model.types.TypeRef type) { + StringBuilder buf = new StringBuilder(); + if (!area.getName().equalsIgnoreCase(type.getArea())) { + buf.append(type.getArea()).append("::"); + } + String owning = service == null ? "" : service.getName(); + if (type.getService() != null && !type.getService().isEmpty() + && !type.getService().equalsIgnoreCase(owning)) { + buf.append(type.getService()).append("::"); + } + buf.append(type.getName()); + // The extra information of an error is named in full, list wrapper and all: unlike + // a message field, there is no separate column to put it in. + return type.isList() ? "List<" + buf + ">" : buf.toString(); + } + + /** + * One message of an interaction, as the table describes it. + */ + private static final class Message { + + private final boolean incoming; + private final String name; + private final InteractionStage stage; + private final List<Field> fields; + + private Message(boolean incoming, String name, InteractionStage stage, + List<Field> fields) { + this.incoming = incoming; + this.name = name; + this.stage = stage; + this.fields = fields; + } + } + + /** + * The errors an operation may answer with: named and described, then tabulated with + * whatever extra information each one carries. + */ + private void writeOperationErrors(DocxBody body, MOModel model, Area area, Service service, + Operation operation) throws IOException { + body.title(4, "MO Errors"); + + if (operation.getPattern() == InteractionPattern.SEND) { + // A send is not answered at all, so there is nowhere to put an error. + body.comment("The operation cannot return any errors."); + return; + } + if (operation.getErrors().isEmpty()) { + body.comment("The operation does not return any errors."); + return; + } + + body.comment(operation.getErrors().size() == 1 + ? "The operation may return the following error:" + : "The operation may return one of the following errors:"); + + List<OperationError> errors = new ArrayList<OperationError>(); + for (ErrorReference reference : operation.getErrors()) { + errors.add(OperationError.of(model, area, service, reference)); + } + java.util.Collections.sort(errors); + + List<String> described = new ArrayList<String>(); + for (OperationError error : errors) { + described.addAll(error.describe()); + } + body.numberedComment(described); + + DocxTable table = body.table(OPERATION_ERROR_WIDTHS); + table.row() + .cell("Error").shaded(HEADER_COLOUR).centered().next() + .cell("Error #").shaded(HEADER_COLOUR).centered().next() + .cell("ExtraInfo Type").shaded(HEADER_COLOUR).centered().next() + .cell("ExtraInfo description").shaded(HEADER_COLOUR).centered().endRow(); + + for (OperationError error : errors) { + DocxRow row = table.row(); + row.cell(error.name).centered().next() + .cell(error.number).centered().next(); + // A type of this area is linked to where it is defined; one that names its own + // area, or none at all, is only shown. + if (error.extraType.contains("::") || NOT_USED.equals(error.extraType)) { + row.cell(error.extraType.replace("MAL::", "")).centered().next(); + } else { + row.markedUp(DocxTypeLink.hyperlink("", error.extraType, "", + "DATATYPE_" + error.extraType, true)).centered().next(); + } + row.cell(error.extraDescription).centered().endRow(); + } + table.end(); + } + + /** + * Describes every field of every message, so that the table above can stay to the + * types and the names. + */ + private void writeSignatureDetails(DocxBody body, Operation operation) { + body.title(4, "Type Signature Details"); + for (InteractionStage stage : detailedStagesOf(operation)) { + for (Field field : fieldsOf(operation, stage)) { + body.singleTypeSignature(field.getName(), field.getComment()); + } + } + } + + /** + * The stages whose fields are described one by one. A publish-subscribe operation + * describes its subscription keys here as well, which the table above only lists. + */ + private static List<InteractionStage> detailedStagesOf(Operation operation) { + List<InteractionStage> stages = new ArrayList<InteractionStage>(); + if (operation.getPattern() == InteractionPattern.PUBSUB) { + stages.add(InteractionStage.SUBSCRIPTION_KEYS); + stages.add(InteractionStage.PUBLISH_NOTIFY); + return stages; + } + for (Message message : messagesOf(operation)) { + stages.add(message.stage); + } + return stages; + } + + /** + * The requirements a service states, numbered as one list however many sections they + * are written in: they are the requirements of the service, not of its sections. + */ + private void writeRequirements(DocxBody body, List<DocSection> sections) throws IOException { + List<String> requirements = new ArrayList<String>(); + for (DocSection section : sections) { + requirements.addAll(DocxText.split(section.getContent())); + } + body.numberedComment(requirements); + } + + /** + * Every type the specification declares, area level first and then service by service. + */ + private void writeDataTypes(DocxBody types, MOModel model, Area area) throws IOException { + types.pageBreak(); + types.title(1, "Data types"); + boolean any = !area.getDataTypes().isEmpty(); + + if (any) { + types.title(2, "Area data types: " + area.getName()); + for (TypeDefinition type : area.getDataTypes()) { + writeDataType(types, model, area, null, type); + } + } + for (Service service : area.getServices()) { + if (!service.getDataTypes().isEmpty()) { + any = true; + types.title(2, "Service data types: " + service.getName()); + for (TypeDefinition type : service.getDataTypes()) { + writeDataType(types, model, area, service, type); + } + } + } + if (!any) { + types.comment("No data types are defined in this specification."); + } + } + + /** + * One declared type, described according to what kind of thing it is. + */ + private void writeDataType(DocxBody types, MOModel model, Area area, Service service, + TypeDefinition type) { + if (type instanceof FundamentalType) { + types.title(3, "Fundamental: ", type.getName(), "DATATYPE"); + if (type.getComment() != null && !type.getComment().isEmpty()) { + types.comment(type.getComment()); + } + } else if (type instanceof AttributeType) { + writeAttribute(types, (AttributeType) type); + } else if (type instanceof EnumerationType) { + writeEnumeration(types, (EnumerationType) type); + } else if (type instanceof CompositeType) { + writeComposite(types, model, area, service, (CompositeType) type); + } + } + + /** + * An attribute is one of the types everything else is built from, so there is little to + * say beyond what it is called and numbered. + */ + private void writeAttribute(DocxBody types, AttributeType attribute) { + types.title(3, "Attribute: ", attribute.getName(), "DATATYPE"); + if (attribute.getComment() != null && !attribute.getComment().isEmpty()) { + types.comment(attribute.getComment()); + } + + DocxTable table = types.table(LIST_WIDTHS); + table.row().cell("Name").shaded(HEADER_COLOUR).centered().next() + .cell(attribute.getName()).centered().endRow(); + table.row().cell("Extends").shaded(HEADER_COLOUR).centered().next() + .cell("Attribute").centered().endRow(); + table.row().cell("Short Form Part").shaded(HEADER_COLOUR).centered().next() + .cell(String.valueOf(attribute.getShortFormPart())).centered().endRow(); + table.end(); + types.sectionBreak(); + } + + /** + * An enumeration is its values, each with the number it travels as. + */ + private void writeEnumeration(DocxBody types, EnumerationType enumeration) { + types.title(3, "Enumeration: ", enumeration.getName(), "DATATYPE"); + if (enumeration.getComment() != null && !enumeration.getComment().isEmpty()) { + types.comment(enumeration.getComment()); + } + + DocxTable table = types.table(ENUM_WIDTHS); + table.row().cell("Name").shaded(HEADER_COLOUR).centered().next() + .cell(enumeration.getName()).centered().spanning(2).endRow(); + table.row().cell("Short Form Part").shaded(HEADER_COLOUR).centered().next() + .cell(String.valueOf(enumeration.getShortFormPart())).centered().spanning(2) + .endRow(); + table.row() + .cell("Enumeration Value").shaded(HEADER_COLOUR).centered().next() + .cell("Numerical Value").shaded(HEADER_COLOUR).centered().next() + .cell("Comment").shaded(HEADER_COLOUR).centered().endRow(); + + for (EnumerationItem item : enumeration.getItems()) { + table.row() + .cell(item.getValue()).centered().next() + .cell(String.valueOf(item.getNumericValue())).centered().next() + .cell(item.getComment()).endRow(); + } + table.end(); + types.sectionBreak(); + } + + /** + * A composite is its fields, and the fields of whatever it extends before them. + */ + private void writeComposite(DocxBody types, MOModel model, Area area, Service service, + CompositeType composite) { + TypeRef parent = composite.getSuperType() != null ? composite.getSuperType() + : new TypeRef("MAL", area.getVersion(), null, "Composite", false, false); + // A composite extending the MAL Object is an object in the COM sense: something + // that is stored and referred to, rather than only carried in a message. + boolean isObject = "Object".equals(parent.getName()); + + types.title(3, isObject ? "MO Object: " : "Composite: ", composite.getName(), "DATATYPE"); + if (composite.getComment() != null && !composite.getComment().isEmpty()) { + types.comment(composite.getComment()); + } + + DocxTable table = types.table(COMPOSITE_WIDTHS); + table.row().cell("Name").shaded(HEADER_COLOUR).centered().next() + .cell(composite.getName()).centered().spanning(3).endRow(); + table.row().cell("Extends").shaded(HEADER_COLOUR).centered().next() + .markedUp(DocxTypeLink.forType(area, service, parent)).centered().spanning(3) + .endRow(); + + if (composite.getShortFormPart() == null) { + table.row().cell("Abstract").shaded(HEADER_COLOUR).centered().spanning(4).endRow(); + } else { + table.row().cell("Short Form Part").shaded(HEADER_COLOUR).centered().next() + .cell(String.valueOf(composite.getShortFormPart())).centered().spanning(3) + .endRow(); + } + + List<Field> inherited = model.inheritedFields(composite); + List<Field> own = composite.getFields(); + + if (!own.isEmpty()) { + table.row() + .cell("Field").shaded(HEADER_COLOUR).centered().next() + .cell("Type").shaded(HEADER_COLOUR).centered().next() + .cell("Nullable").shaded(HEADER_COLOUR).centered().next() + .cell("Comment").shaded(HEADER_COLOUR).centered().endRow(); + + for (Field field : inherited) { + writeCompositeField(table, area, service, field, FIXED_COLOUR); + } + for (Field field : own) { + writeCompositeField(table, area, service, field, null); + } + } + table.end(); + types.sectionBreak(); + } + + /** + * One field of a composite. A field it inherits is filled in, to set it apart from the + * ones the composite declares itself. + */ + private void writeCompositeField(DocxTable table, Area area, Service service, Field field, + String shade) { + DocxRow row = table.row(); + row.cell(field.getName()).shaded(shade).centered().next() + .markedUp(DocxTypeLink.forType(area, service, field.getType())).shaded(shade) + .centered().next() + .cell(field.isCanBeNull() ? "Yes" : "No").shaded(shade).centered().next() + .cell(field.getComment()).shaded(shade).endRow(); + } + + /** + * Every error the specification declares, wherever it declares it. + */ + private void writeErrors(DocxBody types, Area area) throws IOException { + types.title(1, "MO Errors"); + List<ErrorDefinition> errors = new ArrayList<ErrorDefinition>(area.getErrors()); + for (Service service : area.getServices()) { + errors.addAll(service.getErrors()); + } + + if (errors.isEmpty()) { + types.comment("No errors are defined in this specification."); + return; + } + + types.comment("The following table lists the errors defined in this specification:"); + DocxTable table = types.table(ERROR_TABLE_WIDTHS, area.getName() + " MO Errors"); + table.row() + .cell("Error").shaded(HEADER_COLOUR).centered().next() + .cell("Error #").shaded(HEADER_COLOUR).centered().next() + .cell("Comment").shaded(HEADER_COLOUR).centered().endRow(); + for (ErrorDefinition error : errors) { + table.row() + .cell(error.getName()).centered().next() + .cell(String.valueOf(error.getNumber())).centered().next() + .cell(error.getComment()).endRow(); + } + table.end(); + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/docx/DocxNumbering.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/docx/DocxNumbering.java new file mode 100644 index 00000000..2dc40e48 --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/docx/DocxNumbering.java @@ -0,0 +1,80 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.generators.docx; + +import java.io.IOException; + +/** + * The numbering definitions of one document. + * <p> + * A Word document keeps its list numbering apart from its body: the body says which + * numbering an item belongs to, and the numbering part says what that looks like. Two are + * defined up front - a dash bullet and a symbol bullet - and a further one is defined each + * time a numbered list is started, so that lists number from the top rather than continuing + * one another. That is why this is not a fixed resource like the style sheet, and why every + * document ends up with a numbering part of its own. + */ +public final class DocxNumbering { + + private final StringBuilder definitions = new StringBuilder(); + + private final StringBuilder instances = new StringBuilder(); + + /** + * Counts the numberings handed out. The preamble defines 0 and 1, so the first one + * asked for is 2. + */ + private int lastInstance = 1; + + /** + * @throws IOException if the fixed part of the numbering is missing from the build. + */ + public DocxNumbering() throws IOException { + definitions.append(DocxResources.read(DocxResources.NUMBERING_PREAMBLE)) + .append(DocxText.SEPARATOR); + instances.append(DocxText.line(2, + "<w:num w:numId=\"1\"><w:abstractNumId w:val=\"1\"/></w:num>", DocxText.SEPARATOR)); + } + + /** + * Defines a numbering for a list that is about to start. + * + * @return the identifier the body refers to it by. + * @throws IOException if the template is missing from the build. + */ + public int nextInstance() throws IOException { + int instance = ++lastInstance; + String id = String.valueOf(instance); + definitions.append(DocxResources.read(DocxResources.NUMBERING_INSTANCE) + .replace("${id}", id)).append(DocxText.SEPARATOR); + instances.append(DocxText.line(2, "<w:num w:numId=\"" + id + + "\"><w:abstractNumId w:val=\"" + id + "\"/></w:num>", DocxText.SEPARATOR)); + return instance; + } + + /** + * @return the numbering part of the document: every definition, then every instance + * that refers to one. + */ + public String toXml() { + return definitions.toString() + instances + "</w:numbering>" + DocxText.SEPARATOR; + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/docx/DocxResources.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/docx/DocxResources.java new file mode 100644 index 00000000..8f48214a --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/docx/DocxResources.java @@ -0,0 +1,84 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.generators.docx; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.Charset; + +/** + * Reads the fixed parts of a Word document out of the module's resources. + * <p> + * A .docx carries a good deal of XML that says nothing about the specification being + * documented - the style sheet, the content types, the package relationships, the numbering + * definitions. It was 270 000 characters of escaped string literal in the generator this + * replaces; here it is the files it actually is, so that a style can be read, diffed and + * edited as XML. + */ +public final class DocxResources { + + private static final Charset UTF8 = Charset.forName("UTF-8"); + + /** + * The style sheet in use: Times New Roman at 12 point, with the MO table style. Four + * others are kept beside it - Calibri, plain Times, Times with the MO table style, and + * the CCSDS sheet - none of them selected by anything. They are carried because they + * were carried before, not because anything reaches them. + */ + public static final String STYLES = "styles.xml"; + + public static final String CONTENT_TYPES = "content-types.xml"; + + public static final String PACKAGE_RELS = "package.rels"; + + public static final String NUMBERING_PREAMBLE = "numbering-preamble.xml"; + + public static final String NUMBERING_INSTANCE = "numbering-instance.xml"; + + private DocxResources() { + } + + /** + * Reads one of the fixed parts. + * + * @param name The resource name, one of the constants here. + * @return the contents. + * @throws IOException if the resource is missing from the build. + */ + public static String read(String name) throws IOException { + InputStream in = DocxResources.class.getResourceAsStream("/docx/" + name); + if (in == null) { + throw new IOException("The docx resource '" + name + "' is not on the classpath"); + } + try { + ByteArrayOutputStream buf = new ByteArrayOutputStream(); + byte[] chunk = new byte[8192]; + int read; + while ((read = in.read(chunk)) != -1) { + buf.write(chunk, 0, read); + } + return new String(buf.toByteArray(), UTF8); + } finally { + in.close(); + } + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/docx/DocxRow.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/docx/DocxRow.java new file mode 100644 index 00000000..19b377d6 --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/docx/DocxRow.java @@ -0,0 +1,74 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.generators.docx; + +/** + * One row of a table, which knows where it has got to across the columns. + * <p> + * A cell is as wide as the column it sits in, and a cell that spans is as wide as the + * columns it covers together. The row keeps the count, so that nothing has to be told its + * own position. + */ +public final class DocxRow { + + private final DocxTable table; + + private int column = 0; + + DocxRow(DocxTable table) { + this.table = table; + table.append(3, "<w:tr>"); + } + + /** + * Adds a cell holding text, in the table's own style. + * + * @param text The text, which is escaped. + * @return the cell, for saying anything else about it. + */ + public DocxCell cell(String text) { + return new DocxCell(this, "<w:pPr><w:pStyle w:val=\"MOTable\"/></w:pPr><w:r><w:t>" + + DocxText.escape(text) + "</w:t></w:r>"); + } + + /** + * Adds a cell holding content that is already marked up - a hyperlink, or a signature + * built out of several runs. + * + * @param xml The content of the cell, inside its paragraph. + * @return the cell, for saying anything else about it. + */ + public DocxCell markedUp(String xml) { + return new DocxCell(this, xml); + } + + /** + * Ends the row. + */ + public void end() { + table.append(3, "</w:tr>"); + } + + void write(DocxCell cell) { + table.append(4, cell.toXml(table.widthOf(column, cell.getSpan()))); + column += cell.getSpan(); + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/docx/DocxTable.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/docx/DocxTable.java new file mode 100644 index 00000000..c5cdfc90 --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/docx/DocxTable.java @@ -0,0 +1,99 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.generators.docx; + +/** + * One table: the widths of its columns, and the rows written into it. + * <p> + * The borders and the sizing are the same for every table in these documents, so they are + * not something a caller says anything about. + */ +public final class DocxTable { + + /** + * The borders every table in these documents has. Written through the same indent + * helper as everything else rather than as a block of pre-indented text, so that one + * place decides what a level of indentation is. + */ + private static final String[] BORDERS = {"top", "left", "bottom", "right", "insideH", "insideV"}; + + private final DocxBody body; + + private final int[] widths; + + DocxTable(DocxBody body, int[] widths) { + this.body = body; + this.widths = widths; + body.append(2, "<w:tbl>"); + body.append(3, "<w:tblPr>"); + body.append(4, "<w:tblW w:w=\"00\" w:type=\"auto\"/>"); + body.append(4, "<w:tblBorders>"); + for (String edge : BORDERS) { + body.append(5, "<w:" + edge + " w:val=\"single\" w:sz=\"4\" w:space=\"0\"" + + " w:color=\"000000\"/>"); + } + body.append(4, "</w:tblBorders>"); + body.append(3, "</w:tblPr>"); + if (widths != null) { + body.append(3, "<w:tblGrid>"); + for (int width : widths) { + body.append(4, "<w:gridCol w:w=\"" + width + "\"/>"); + } + body.append(3, "</w:tblGrid>"); + } + } + + /** + * Starts a row. + * + * @return the row, to add cells to. + */ + public DocxRow row() { + return new DocxRow(this); + } + + /** + * Ends the table. + */ + public void end() { + body.append(2, "</w:tbl>"); + } + + /** + * @param column The column the cell starts in. + * @param span How many columns it covers. + * @return how wide the cell is, which is the columns it covers taken together. + */ + int widthOf(int column, int span) { + if (widths == null) { + return 0; + } + int width = 0; + for (int i = column; i < column + span && i < widths.length; i++) { + width += widths[i]; + } + return width; + } + + void append(int indent, String text) { + body.append(indent, text); + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/docx/DocxText.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/docx/DocxText.java new file mode 100644 index 00000000..42647c3f --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/docx/DocxText.java @@ -0,0 +1,90 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.generators.docx; + +/** + * The text side of a document: what has to be escaped, and how a line is indented. + */ +public final class DocxText { + + private DocxText() { + } + + /** + * Prepares text written by a specification for a document. + * <p> + * The list item markup a few comments carry is dropped rather than escaped: the + * documents show those comments as running text, so a literal {@code _li_} in the middle + * of a sentence would be worse than nothing. Everything else XML reserves is escaped, + * and the order matters - the ampersands have to go first, or the escapes escape + * themselves. + * + * @param text The text to put in the document, may be null. + * @return the text, ready to sit inside an element. + */ + public static String escape(String text) { + if (text == null) { + return ""; + } + return text.replace("<li>", "").replace("</li>", "") + .replace("&", "&").replace("<", "<").replace(">", ">"); + } + + /** + * The body of a document ends its lines the way Word does, and the numbering part ends + * them the way everything else here does. That is not a decision anyone took - the two + * writers of the existing generator were built with different separators, one passing + * "\r\n" and the other taking the default - but the documents are compared byte for + * byte, so both are reproduced as they are. + */ + public static final String BODY_SEPARATOR = "\r\n"; + + public static final String SEPARATOR = "\n"; + + /** + * Splits a comment where a document starts a new paragraph: at a line break, or at the + * double space the specifications use to mean one. + * + * @param text The comment, may be null. + * @return the paragraphs, empty if there is no text. + */ + public static java.util.List<String> split(String text) { + java.util.List<String> parts = new java.util.ArrayList<String>(); + if (text != null) { + parts.addAll(java.util.Arrays.asList(text.split("( |\n)"))); + } + return parts; + } + + /** + * @param indent How many steps in, at four spaces a step. + * @param text The line. + * @param separator How the line ends. + * @return the line, indented and ended. + */ + public static String line(int indent, String text, String separator) { + StringBuilder buf = new StringBuilder(); + for (int i = 0; i < indent; i++) { + buf.append(" "); + } + return buf.append(text).append(separator).toString(); + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/docx/DocxTypeLink.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/docx/DocxTypeLink.java new file mode 100644 index 00000000..2c3325c7 --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/docx/DocxTypeLink.java @@ -0,0 +1,206 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.generators.docx; + +import esa.mo.apigen.model.Area; +import esa.mo.apigen.model.Field; +import esa.mo.apigen.model.Service; +import esa.mo.apigen.model.types.TypeRef; +import java.util.ArrayList; +import java.util.List; + +/** + * Names a type inside a table cell, linking to where it is defined when the document that + * mentions it is also the document that defines it. + * <p> + * The generator this replaces took two flags through every call - whether to show the name + * of the field and whether to use the older layout - and branched on them here. Neither has + * ever been set to anything but its default, so neither is carried over: a field is always + * shown as {@code List_Type_ name}, never as {@code name : (List_Type_)}. + */ +public final class DocxTypeLink { + + /** + * Separates two type names sharing a cell: the cell holds a paragraph each. + */ + private static final String NEXT_LINE + = "</w:p><w:p><w:pPr><w:jc w:val=\"center\"/></w:pPr>"; + + private DocxTypeLink() { + } + + /** + * Names the type of a field, with the field's own name after it. + * + * @param area The area of the document being written. + * @param service The service being written, or null at area level. + * @param field The field to name. + * @return the content of a cell. + */ + public static String forField(Area area, Service service, Field field) { + TypeRef type = field.getType(); + String prefix = type.isList() ? "List<" : ""; + String postfix = (type.isList() ? "> " : " ") + field.getName(); + return link(area, service, type, prefix, postfix); + } + + /** + * Names a type on its own. + * + * @param area The area of the document being written. + * @param service The service being written, or null at area level. + * @param type The type to name. + * @return the content of a cell. + */ + public static String forType(Area area, Service service, TypeRef type) { + String prefix = type.isList() ? "List<" : ""; + String postfix = type.isList() ? ">" : ""; + return link(area, service, type, prefix, postfix); + } + + /** + * Says of each field whether it may be left out. + * + * @param fields The fields of a message. + * @return the content of a cell, one answer per line. + */ + public static String nullability(List<Field> fields) { + List<String> answers = new ArrayList<String>(); + for (Field field : fields) { + answers.add("<w:pPr><w:pStyle w:val=\"MOTable\"/></w:pPr><w:r><w:t>" + + (field.isCanBeNull() ? "Yes" : "No") + "</w:t></w:r>"); + } + return join(answers); + } + + /** + * @param fragments What each line of the cell holds. + * @return the fragments as the lines of one cell. + */ + public static String join(List<String> fragments) { + StringBuilder buf = new StringBuilder(); + for (int i = 0; i < fragments.size(); i++) { + buf.append(fragments.get(i)); + if (i != fragments.size() - 1) { + buf.append(NEXT_LINE); + } + } + return buf.toString(); + } + + /** + * Writes the name, linked to its definition when that definition is in this document. + */ + private static String link(Area area, Service service, TypeRef type, + String prefix, String postfix) { + String name = qualify(area, service, type); + // The MAL types are mentioned everywhere and defined in a document of their own, so + // naming their area every time would say nothing. + if (name.startsWith("MAL::")) { + name = name.substring("MAL::".length()); + } + boolean sameArea = area.getName().equalsIgnoreCase(type.getArea()); + return hyperlink(prefix, name, postfix, "DATATYPE_" + name, sameArea); + } + + /** + * Names a type from where it is being mentioned: the area is left off when it is the + * area being written, and so is the service. + */ + private static String qualify(Area area, Service service, TypeRef reference) { + // The older spelling of an object reference, ObjectRef(Product), means the same as + // the newer one; unwrapping lets both be named the same way. + TypeRef type = reference.unwrapped(); + StringBuilder buf = new StringBuilder(); + if (!area.getName().equalsIgnoreCase(type.getArea())) { + buf.append(type.getArea()).append("::"); + } + String owning = service == null ? "" : service.getName(); + if (type.getService() != null && !type.getService().isEmpty() + && !type.getService().equalsIgnoreCase(owning)) { + buf.append(type.getService()).append("::"); + } + return buf.append(type.isObjectRef() + ? "ObjectRef<" + type.getName() + ">" : type.getName()).toString(); + } + + /** + * Writes a name, as a link to a bookmark where there is one to link to. + * + * @param prefix What comes before the name. + * @param typeName The name shown. + * @param postfix What comes after the name. + * @param linkTo The bookmark to link to. + * @param withHyperlink Whether to link at all. + * @return the content of a cell. + */ + public static String hyperlink(String prefix, String typeName, String postfix, + String linkTo, boolean withHyperlink) { + // An object reference is shown as ObjectRef_Product_, but what is linked to is + // Product: the reference is not a type anyone documents. + boolean isObjectRef = typeName.startsWith("ObjectRef"); + String target = linkTo.replace("ObjectRef<", "").replace(">", "") + .replace("ObjectRef(", "").replace(")", ""); + String shown = isObjectRef ? insideObjectRef(typeName) : typeName; + + StringBuilder buf = new StringBuilder(); + buf.append("<w:pPr><w:pStyle w:val=\"MOTable\"/></w:pPr><w:r><w:t>"); + buf.append(DocxText.escape(prefix)); + if (isObjectRef) { + buf.append(DocxText.escape("ObjectRef<")); + } + buf.append("</w:t></w:r>"); + + if (withHyperlink) { + buf.append("<w:r><w:fldChar w:fldCharType=\"begin\"/></w:r>"); + buf.append("<w:r><w:instrText xml:space=\"preserve\"> HYPERLINK \\l \""); + buf.append(DocxText.escape(isObjectRef ? target : linkTo)); + buf.append("\" </w:instrText></w:r>"); + buf.append("<w:r><w:fldChar w:fldCharType=\"separate\"/></w:r>"); + } + + buf.append("<w:r>"); + if (withHyperlink) { + buf.append("<w:rPr><w:rStyle w:val=\"Hyperlink\"/></w:rPr>"); + } + buf.append("<w:t>").append(DocxText.escape(shown)).append("</w:t></w:r>"); + + if (withHyperlink) { + buf.append("<w:r><w:fldChar w:fldCharType=\"end\"/></w:r>"); + } + + buf.append("<w:r><w:t xml:space=\"preserve\">"); + if (isObjectRef) { + buf.append(DocxText.escape(">")); + } + return buf.append(DocxText.escape(postfix)).append("</w:t></w:r>").toString(); + } + + /** + * @param typeName A name of the form ObjectRef_Something_. + * @return what the reference points at. + */ + private static String insideObjectRef(String typeName) { + int open = typeName.indexOf('<'); + int close = typeName.lastIndexOf('>'); + return open >= 0 && close > open ? typeName.substring(open + 1, close) : typeName; + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/writers/CompositeWriter.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/writers/CompositeWriter.java index b9807cde..82488bfc 100644 --- a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/writers/CompositeWriter.java +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/writers/CompositeWriter.java @@ -53,7 +53,7 @@ public static String write(MOModel model, Area area, Service service, CompositeT : JavaNaming.packageOf(service, JavaNaming.STRUCTURES); String fq = pkg + "." + name; List<Field> own = type.getFields(); - List<Field> inherited = inheritedFields(model, type); + List<Field> inherited = model.inheritedFields(type); List<Field> all = new ArrayList<Field>(inherited); all.addAll(own); @@ -339,34 +339,6 @@ private static String superClassOf(CompositeType type) { return JavaTypeName.qualified(superType); } - private static List<Field> inheritedFields(MOModel model, CompositeType type) { - List<Field> inherited = new ArrayList<Field>(); - TypeRef superType = type.getSuperType(); - if (superClassOf(type) == null) { - return inherited; - } - // MOObject is hand-written in the MAL API rather than generated - the schema - // declares MAL::Object as a fundamental - so the one field it contributes is - // known here rather than read from the model. - if ("MAL".equals(superType.getArea()) && "Object".equals(superType.getName())) { - Field identity = new Field(); - identity.setName("objectIdentity"); - identity.setComment("The identity of the MO Object."); - identity.setCanBeNull(false); - identity.setType(new TypeRef("MAL", superType.getAreaVersion(), null, - "ObjectIdentity", false, false)); - inherited.add(identity); - return inherited; - } - Object resolved = model.resolve(superType); - if (resolved instanceof CompositeType) { - CompositeType parent = (CompositeType) resolved; - inherited.addAll(inheritedFields(model, parent)); - inherited.addAll(parent.getFields()); - } - return inherited; - } - private static List<Field> requiredOf(List<Field> fields) { List<Field> required = new ArrayList<Field>(); for (Field field : fields) { diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/writers/ConsumerAdapterWriter.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/writers/ConsumerAdapterWriter.java index 8d8dcf39..900d596f 100644 --- a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/writers/ConsumerAdapterWriter.java +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/writers/ConsumerAdapterWriter.java @@ -75,6 +75,11 @@ private ConsumerAdapterWriter() { } /** + * Writes the adapter a consumer subclasses to receive what a provider sends back. + * + * @param model Every loaded specification. + * @param area The area the service belongs to. + * @param service The service to write the adapter of. * @return the source of the service's consumer adapter. */ public static String write(MOModel model, Area area, Service service) { diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/writers/ConsumerStubWriter.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/writers/ConsumerStubWriter.java index ef1fc75e..a0a1f741 100644 --- a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/writers/ConsumerStubWriter.java +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/java/writers/ConsumerStubWriter.java @@ -67,6 +67,10 @@ private ConsumerStubWriter() { } /** + * Writes the stub a consumer calls to invoke the operations of a service. + * + * @param model Every loaded specification. + * @param service The service to write the stub of. * @return the source of the service's consumer stub. */ public static String write(MOModel model, Service service) { diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/xhtml/SvgDiagram.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/xhtml/SvgDiagram.java new file mode 100644 index 00000000..4955953e --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/xhtml/SvgDiagram.java @@ -0,0 +1,288 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.generators.xhtml; + +/** + * One drawing: boxes for fields, each naming the field over the type in it. + * <p> + * The surface is a grid rather than a canvas. A column is one field wide and a row is a + * name over a type, so everything is placed in column and row units and multiplied up on + * the way out. The drawing sizes itself: the extent of what has been placed is what the + * {@code svg} element ends up declaring. + * <p> + * Two kinds of drawing share it. A message is drawn flat, one field per column, with what + * applies to a field bracketed underneath it. A type is drawn expanded, each composite + * opened out into the fields it holds on the row below, so a field spans as many columns + * as its contents need and as many rows as it has left above the bottom. + */ +public final class SvgDiagram { + + /** + * The width of one field. + */ + static final int WIDTH = 160; + + /** + * The height of the box naming the field. + */ + static final int PRIMARY_HEIGHT = 30; + + /** + * The height of the box naming its type. + */ + static final int SECONDARY_HEIGHT = 20; + + static final int ROW_HEIGHT = PRIMARY_HEIGHT + SECONDARY_HEIGHT; + + /** + * How far a bracket sits below one drawn over the same fields. + */ + private static final int SPAN_STEP = 16; + + /** + * The height of a bracket. + */ + private static final int SPAN_HEIGHT = 10; + + private static final int HALF_TEXT_HEIGHT = 4; + + private static final int MARGIN = 10; + + private static final String PARENT_COLOUR = "grey"; + + private static final String HEADER_COLOUR = "yellow"; + + private static final String COMPOSITE_COLOUR = "lavender"; + + private static final String FIELD_COLOUR = "lightsteelblue"; + + private static final String STROKE = "navy"; + + private final StringBuilder buf = new StringBuilder(); + + private final int baseLine = MARGIN; + + private int column = 1; + + private int maxWidth = 2; + + private int maxHeight = MARGIN; + + /** + * Draws the type a composite extends, ahead of the fields it adds. + * + * @param type The name of the parent type. + * @param href Where it is described, or null if nothing loaded describes it. + */ + public void parent(String type, String href) { + box(column * WIDTH, baseLine, WIDTH, PRIMARY_HEIGHT, PARENT_COLOUR, "EXTENDS", null, + false, false, true); + box(column * WIDTH, baseLine + PRIMARY_HEIGHT, WIDTH, SECONDARY_HEIGHT, PARENT_COLOUR, + type, href, true, false, true); + column++; + widen(); + } + + /** + * Draws one field: its name over the name of its type. + * + * @param name The field name. + * @param type The name of its type. + * @param href Where that type is described, or null. + * @param italic Whether the type is abstract, which is how an abstract type is shown. + * @param bold Whether the type is an enumeration. + */ + public void field(String name, String type, String href, boolean italic, boolean bold) { + box(column * WIDTH, baseLine, WIDTH, PRIMARY_HEIGHT, FIELD_COLOUR, name, null, + false, false, true); + box(column * WIDTH, baseLine + PRIMARY_HEIGHT, WIDTH, SECONDARY_HEIGHT, FIELD_COLOUR, + type, href, italic, bold, true); + column++; + widen(); + } + + /** + * Brackets the fields about to be drawn, saying something that applies to all of them. + * + * @param index How many brackets already sit under them, so this one clears them. + * @param count How many fields it covers. + * @param text What it says. + */ + public void span(int index, int count, String text) { + int x1 = column * WIDTH; + int x2 = (column + count) * WIDTH; + int y1 = baseLine + ROW_HEIGHT + (index * SPAN_STEP); + bracket(x1, y1, x2, y1 + SPAN_HEIGHT, text); + } + + /** + * Draws a field of an expanded type. + * + * @param name The field name. + * @param type The name of its type. + * @param href Where that type is described, or null. + * @param x The column it starts at. + * @param y The row it starts at. + * @param columns How many columns it covers. + * @param rows How many rows it covers. + * @param italic Whether the type is abstract. + * @param bold Whether the type is an enumeration. + * @param composite Whether the type is a composite, which is shown in its own colour. + */ + public void nestedField(String name, String type, String href, int x, int y, + int columns, int rows, boolean italic, boolean bold, boolean composite) { + int top = baseLine + (y * ROW_HEIGHT); + box(x * WIDTH, top, WIDTH * columns, PRIMARY_HEIGHT, HEADER_COLOUR, name, null, + false, false, false); + box(x * WIDTH, top + PRIMARY_HEIGHT, WIDTH * columns, + (rows * ROW_HEIGHT) - PRIMARY_HEIGHT, + composite ? COMPOSITE_COLOUR : FIELD_COLOUR, type, href, italic, bold, false); + if (maxWidth < x + columns) { + maxWidth = x + columns; + } + } + + /** + * Rules under a field of an expanded type, saying something that applies to it. + * <p> + * Wider than a bracket and drawn as a line with the text knocked out of it, because + * what it spans can be a good many columns of an opened-out composite. + * + * @param x The column it starts at. + * @param row The row it sits under. + * @param columns How many columns it covers. + * @param depth How many rules are drawn under the same field, this one being the last. + * @param text What it says. + */ + public void nestedSpan(int x, int row, int columns, int depth, String text) { + int x1 = x * WIDTH; + int x2 = (x + columns) * WIDTH; + int y1 = baseLine + (row * ROW_HEIGHT) + (depth * SPAN_STEP); + int y2 = y1 + SPAN_HEIGHT; + int middle = y1 + (y2 - y1) / 2; + + line(x1, y1, x1, y2); + line(x2, y1, x2, y2); + line(x1, middle, x2, middle); + + // The label is set in a box of clear ground so the rule does not run through it. + int width = text.length() * 8; + knockOut(x1 + ((x2 - x1) / 2 - (width / 2)), y1, width, y2 - y1); + text(x1, y1, x2 - x1, HALF_TEXT_HEIGHT, text, null, false, false); + grow(y2); + } + + /** + * @param indent How many steps in the element sits. + * @return the drawing as an svg element, sized to what it holds. + */ + public String render(int indent) { + StringBuilder out = new StringBuilder(); + out.append(XhtmlText.line(indent, "<svg:svg version=\"1.1\" width=\"" + + ((maxWidth * WIDTH) + MARGIN) + "px\" height=\"" + + (maxHeight + MARGIN) + "px\">")); + out.append(buf); + out.append(XhtmlText.line(indent, "</svg:svg>")); + return out.toString(); + } + + /** + * @return true if nothing has been drawn. + */ + public boolean isEmpty() { + return buf.length() == 0; + } + + private void bracket(int x1, int y1, int x2, int y2, String text) { + int middle = y1 + (y2 - y1) / 2; + line(x1, y1, x1, y2); + line(x2, y1, x2, y2); + line(x1, middle, x1 + SECONDARY_HEIGHT, middle); + line(x2, middle, x2 - SECONDARY_HEIGHT, middle); + text(x1, y1, x2 - x1, y2 - y1, text, null, false, false); + grow(y2); + } + + private void widen() { + if (maxWidth < column) { + maxWidth = column; + } + } + + /** + * Draws a box with its text in it. + * + * @param centred Whether the text sits in the middle of the box. A box of an expanded + * type is as tall as the type is deep, and text floating in the middle of it would sit + * nowhere near the name it belongs to, so it stays at the top. + */ + private void box(int x, int y, int width, int height, String colour, String text, + String href, boolean italic, boolean bold, boolean centred) { + append("<svg:rect x=\"" + x + "\" y=\"" + y + "\" width=\"" + width + "\" height=\"" + + height + "\" fill=\"" + colour + "\" stroke=\"" + STROKE + + "\" stroke-width=\"2\"/>"); + text(x, y, width, centred ? height : SECONDARY_HEIGHT, text, href, italic, bold); + grow(y + height); + } + + private void knockOut(int x, int y, int width, int height) { + append("<svg:rect x=\"" + x + "\" y=\"" + y + "\" width=\"" + width + "\" height=\"" + + height + "\" fill=\"white\" stroke=\"" + STROKE + "\" stroke-width=\"0\"/>"); + grow(y + height); + } + + private void line(int x1, int y1, int x2, int y2) { + append("<svg:line x1=\"" + x1 + "\" y1=\"" + y1 + "\" x2=\"" + x2 + "\" y2=\"" + y2 + + "\" stroke=\"" + STROKE + "\" stroke-width=\"1\"/>"); + } + + private void text(int x, int y, int width, int height, String text, String href, + boolean italic, boolean bold) { + String style = italic ? " font-style=\"italic\"" : ""; + if (bold) { + style += " font-weight=\"bold\""; + } + String shown = XhtmlBody.escape(text); + if (href != null && !href.isEmpty()) { + shown = "<svg:a xlink:href=\"" + XhtmlBody.escape(href) + "\">" + shown + "</svg:a>"; + } + append("<svg:text x=\"" + (x + width / 2) + "\" y=\"" + + (y + height / 2 + HALF_TEXT_HEIGHT) + "\" font-family=\"Verdana\"" + + " font-size=\"12\"" + style + " fill=\"" + STROKE + + "\" text-anchor=\"middle\" alignment-baseline=\"middle\">"); + append(1, shown); + append("</svg:text>"); + } + + private void grow(int height) { + if (maxHeight < height) { + maxHeight = height; + } + } + + private void append(String text) { + append(0, text); + } + + private void append(int extra, String text) { + buf.append(XhtmlText.line(XhtmlBody.INDENT + 2 + extra, text)); + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/xhtml/TypeNode.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/xhtml/TypeNode.java new file mode 100644 index 00000000..123bea84 --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/xhtml/TypeNode.java @@ -0,0 +1,340 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.generators.xhtml; + +import esa.mo.apigen.model.Area; +import esa.mo.apigen.model.Field; +import esa.mo.apigen.model.MOModel; +import esa.mo.apigen.model.types.CompositeType; +import esa.mo.apigen.model.types.EnumerationType; +import esa.mo.apigen.model.types.TypeDefinition; +import esa.mo.apigen.model.types.TypeRef; +import java.util.ArrayList; +import java.util.List; + +/** + * A message or a type opened out into everything it is made of. + * <p> + * Each node is one field: its name, the type in it, and - where that type is a composite - + * the fields of that composite on the row below. A node knows how wide it is, in columns of + * whatever it eventually holds, and how deep, so the drawing can be laid out before any of + * it is drawn. + * <p> + * <b>A composite may contain itself.</b> Mission Planning declares six that do: a Plan + * names a precursor Plan and a target Plan, an ActivityInstance holds its children, an + * EventDefinition holds the definitions under it. These are ordinary models - a plan really + * does supersede a plan - and the generator this replaces expanded them until the stack ran + * out, so the whole area produced an empty file. Here a type already open above is drawn + * but not opened again: it names the type, and the name is a link to where that type is + * described in full. + */ +final class TypeNode { + + /** + * How wide a drawing is allowed to get, in fields. + * <p> + * Opening a composite replaces one field with all of its own, so a message of nested + * composites grows by multiplication: Mission Planning's plan status report opens out + * to 824 fields, thirty metres of drawing, in a page of twenty megabytes. Nothing is + * read at that size. The widest drawing anywhere else in the specifications is 46 + * fields, so this leaves every one of those alone and stops only what has stopped + * being a diagram. + */ + private static final int MAX_COLUMNS = 120; + + private final String name; + + private final TypeRef type; + + private final boolean list; + + private final boolean optional; + + private final List<TypeNode> children = new ArrayList<TypeNode>(); + + private final boolean composite; + + private final boolean enumeration; + + private final boolean typeIsAbstract; + + /** + * True where this node names a type that is already open above it, and so is left + * closed. Kept because it is the reason a composite has no children, which is + * otherwise indistinguishable from a composite with no fields. + */ + private boolean closedOnCycle; + + /** + * The types open from the root down to this node, which are the ones it must not open + * again. + */ + private List<TypeRef> open; + + /** + * Hands out the number of each list in a drawing, so that "N1" and "N2" say which + * count each "Repeated" refers to. Held by the root and asked for from anywhere below. + */ + private int nextListIndex = 1; + + /** + * The Integer of the MAL generation this specification is written against, which is + * what the count of a list is. Held by the root, since it is the same throughout. + */ + private TypeRef counter; + + private TypeNode root; + + private TypeNode(String name, TypeRef type, boolean list, boolean optional, + MOModel model) { + this.name = name; + this.type = type; + this.list = list; + this.optional = optional; + this.root = this; + + TypeDefinition definition = type == null ? null : model.resolve(type); + this.composite = definition instanceof CompositeType; + this.enumeration = definition instanceof EnumerationType; + this.typeIsAbstract = definition != null && definition.isAbstract(); + } + + /** + * Opens out a message. + * + * @param fields The fields of the message. + * @param model Every loaded specification. + * @param counter The Integer that counts a list, of the MAL generation in use. + * @return the root of the tree, which draws the fields and nothing of its own. + */ + static TypeNode ofMessage(List<Field> fields, MOModel model, TypeRef counter) { + TypeNode root = new TypeNode(null, null, false, false, model); + root.counter = counter; + root.open = new ArrayList<TypeRef>(); + for (Field field : fields) { + root.add(field.getName(), field.getType(), field.isCanBeNull(), model); + } + + // A level at a time, so that what the drawing shows is the first so-many levels of + // everything rather than the whole of whatever happens to be drawn first. + List<TypeNode> frontier = compositesIn(root.children); + while (!frontier.isEmpty()) { + for (TypeNode node : frontier) { + node.openOut(model); + } + if (root.width() > MAX_COLUMNS) { + // This level does not fit. Close it again rather than show part of it, and + // leave those types named and linked instead of opened. + for (TypeNode node : frontier) { + node.children.clear(); + } + break; + } + List<TypeNode> next = new ArrayList<TypeNode>(); + for (TypeNode node : frontier) { + next.addAll(compositesIn(node.children)); + } + frontier = next; + } + return root; + } + + /** + * @return those of these nodes that hold a composite still to be opened. + */ + private static List<TypeNode> compositesIn(List<TypeNode> nodes) { + List<TypeNode> found = new ArrayList<TypeNode>(); + for (TypeNode node : nodes) { + if (node.composite && !node.closedOnCycle) { + found.add(node); + } + } + return found; + } + + /** + * @return true if this is the root, which stands for the message rather than for any + * field of it. + */ + private boolean isRoot() { + return type == null; + } + + private void add(String fieldName, TypeRef fieldType, boolean canBeNull, MOModel model) { + TypeRef bare = fieldType.unwrapped(); + TypeNode child = new TypeNode(nameOr(fieldName), bare, bare.isList(), canBeNull, model); + child.root = root; + child.open = new ArrayList<TypeRef>(open); + if (!isRoot()) { + child.open.add(keyOf(type)); + } + child.closedOnCycle = child.composite && child.open.contains(keyOf(bare)); + children.add(child); + } + + /** + * Adds the fields of the type in this node, one level down. + */ + private void openOut(MOModel model) { + CompositeType definition = (CompositeType) model.resolve(type); + if (definition == null) { + return; + } + // What a composite extends is drawn as a field of its own, opened out in turn, so + // the fields it inherits arrive through it rather than being repeated here. + TypeRef parent = definition.getSuperType(); + if (parent != null && !"Composite".equals(parent.getName())) { + add(parent.getName(), parent, false, model); + } + for (Field field : definition.getFields()) { + add(field.getName(), field.getType(), field.isCanBeNull(), model); + } + } + + /** + * @return how many columns this node takes up, which is however many its contents need. + */ + int width() { + if (children.isEmpty()) { + return isRoot() ? 0 : 1 + (list ? 1 : 0); + } + int width = list ? 1 : 0; + for (TypeNode child : children) { + width += child.width(); + } + return width; + } + + /** + * @param above How many rows are above this one. + * @return the row the deepest thing under this node sits on. + */ + int depth(int above) { + int mine = isRoot() ? above : above + 1; + int deepest = mine; + for (TypeNode child : children) { + int reach = child.depth(mine); + if (reach > deepest) { + deepest = reach; + } + } + return deepest; + } + + /** + * @return how many rules are drawn under this node and everything in it, so that the + * ones belonging to a node higher up clear them. + */ + int spanDepth() { + int mine = 0; + if (!isRoot()) { + mine = (list ? 1 : 0) + (optional ? 1 : 0); + } + int deepest = 0; + for (TypeNode child : children) { + int reach = child.spanDepth(); + if (reach > deepest) { + deepest = reach; + } + } + return deepest + mine; + } + + /** + * Draws this node and everything in it. + * + * @param diagram The drawing to place it on. + * @param area The area whose page is being written, so that links within it are short. + * @param model Every loaded specification. + * @param x The column to start at. + * @param y The row to start at. + * @param remaining How many rows are left below this one, which is how tall the box of + * a node with nothing under it has to be. + */ + void draw(SvgDiagram diagram, Area area, MOModel model, int x, int y, int remaining) { + if (!isRoot()) { + drawSelf(diagram, area, model, x, y, remaining); + } + int at = x + (isRoot() || !list ? 0 : 1); + for (TypeNode child : children) { + child.draw(diagram, area, model, at, isRoot() ? y : y + 1, + isRoot() ? remaining : remaining - 1); + at += child.width(); + } + } + + private void drawSelf(SvgDiagram diagram, Area area, MOModel model, + int x, int y, int remaining) { + // What is left below this node is what the box has to fill: a field with nothing in + // it reaches the bottom of the drawing, one with a composite in it stops above it. + int height = remaining - depth(0) + 1; + String href = XhtmlLink.hrefTo(model, area, type); + String typeName = type.getName(); + + if (list) { + int index = root.nextListIndex++; + diagram.nestedField("N" + index, "Integer", + XhtmlLink.hrefTo(model, area, root.counter), + x, y, 1, remaining, false, false, false); + diagram.nestedField(name, typeName, href, x + 1, y, width() - 1, height, + typeIsAbstract, enumeration, composite); + + int rules = spanDepth(); + if (optional) { + diagram.nestedSpan(x, y + remaining, width(), rules, "Nullable"); + rules--; + } + diagram.nestedSpan(x + 1, y + remaining, width() - 1, rules, + "Repeated N" + index + " times"); + } else { + diagram.nestedField(name, typeName, href, x, y, width(), height, + typeIsAbstract, enumeration, composite); + if (optional) { + diagram.nestedSpan(x, y + remaining, width(), spanDepth(), "Nullable"); + } + } + } + + /** + * A message field need not be named - the specifications leave the name off where the + * body is a single value - and a box has to say something. + */ + private static String nameOr(String fieldName) { + return fieldName == null || fieldName.isEmpty() ? "Part" : fieldName; + } + + /** + * What makes two references the same type for the purpose of noticing a cycle: the + * type itself, whether or not this mention of it is a list. + */ + private static TypeRef keyOf(TypeRef type) { + return new TypeRef(type.getArea(), type.getAreaVersion(), type.getService(), + type.getName(), false, false); + } + + /** + * @return true where the type in this node was left closed because it is already open + * higher up the drawing. + */ + boolean isClosedOnCycle() { + return closedOnCycle; + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/xhtml/XhtmlBody.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/xhtml/XhtmlBody.java new file mode 100644 index 00000000..bf31a649 --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/xhtml/XhtmlBody.java @@ -0,0 +1,184 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.generators.xhtml; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * A run of page content, built up and then appended to another. + * <p> + * A page is not written in the order it is read: the index of a service has to be written + * above the operations it indexes, and both are only known once the operations have been + * walked. So sections are written into bodies of their own and assembled at the end. + */ +public final class XhtmlBody { + + /** + * How far in the content of a page sits: inside html and body. + */ + static final int INDENT = 2; + + private final StringBuilder buf = new StringBuilder(); + + /** + * Escapes what XHTML reserves. + * <p> + * The generator this replaces escaped the text of a paragraph and not the text of a + * field description, so a description containing a {@code <} or an {@code &} - and the + * specifications contain both - produced a page no parser would accept. + * + * @param text The text, may be null. + * @return the text, safe to put between tags. + */ + public static String escape(String text) { + if (text == null) { + return ""; + } + return text.replace("&", "&").replace("<", "<").replace(">", ">"); + } + + /** + * Writes a heading. + * + * @param level The heading level, 1 to 6. + * @param prefix What the heading is, such as "Composite: ". + * @param anchor The anchor to give it, or null for none. + * @param text The name, which is what the prefix introduces. + * @param italic Whether the name is set in italics, which is how an abstract type is + * shown. + */ + public void title(int level, String prefix, String anchor, String text, boolean italic) { + String name = escape(text); + if (italic) { + name = "<i>" + name + "</i>"; + } + String id = anchor == null ? "" : " id=\"" + escape(anchor) + "\""; + line("<h" + level + id + ">" + escape(prefix) + name + "</h" + level + ">"); + } + + /** + * Writes a comment as one paragraph per paragraph of the comment. + * + * @param text The comment, may be null or empty. + */ + public void comment(String text) { + if (text == null || text.isEmpty()) { + return; + } + for (String block : XhtmlText.blocksOf(text)) { + line(block); + } + } + + /** + * Writes several comments in turn. + * + * @param texts The comments, any of which may be null or empty. + */ + public void comments(List<String> texts) { + for (String text : texts) { + comment(text); + } + } + + /** + * Describes one field of a type or a message, under its name. + * + * @param name The field name. + * @param text What it is, may be null or empty. + */ + public void fieldComment(String name, String text) { + line("<h5>" + escape(name) + "</h5>"); + if (text == null || text.isEmpty()) { + return; + } + for (String block : XhtmlText.blocksOf(text)) { + line(block); + } + } + + /** + * Writes a list of links to elsewhere in the page. + * + * @param title What the index is of. + * @param level The heading level of that title. + * @param entries The entries, name to href, in the order they are to be shown. + */ + public void index(String title, int level, List<Map.Entry<String, String>> entries) { + if (entries.isEmpty()) { + return; + } + line("<div class=\"index\">"); + title(level, title, null, "", false); + line("<ul>"); + for (Map.Entry<String, String> entry : entries) { + line("<li><a href=\"" + escape(entry.getValue()) + "\">" + + escape(entry.getKey()) + "</a></li>"); + } + line("</ul>"); + line("</div>"); + } + + /** + * Writes a diagram. + * + * @param diagram The diagram to write, already drawn. + */ + public void diagram(SvgDiagram diagram) { + line("<p class=\"diagram\">"); + buf.append(diagram.render(INDENT + 1)); + line("</p>"); + } + + /** + * Appends another body to this one. + * + * @param other The body to append. + */ + public void append(XhtmlBody other) { + buf.append(other.buf); + } + + /** + * @return true if nothing has been written. + */ + public boolean isEmpty() { + return buf.length() == 0; + } + + @Override + public String toString() { + return buf.toString(); + } + + private void line(String text) { + buf.append(XhtmlText.line(INDENT, text)); + } + + /** + * @return an empty list of index entries, ready to add to. + */ + static List<Map.Entry<String, String>> newIndex() { + return new ArrayList<Map.Entry<String, String>>(); + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/xhtml/XhtmlGenerator.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/xhtml/XhtmlGenerator.java new file mode 100644 index 00000000..ef321690 --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/xhtml/XhtmlGenerator.java @@ -0,0 +1,423 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.generators.xhtml; + +import esa.mo.apigen.generators.Generator; +import esa.mo.apigen.model.Area; +import esa.mo.apigen.model.Field; +import esa.mo.apigen.model.InteractionPattern; +import esa.mo.apigen.model.InteractionStage; +import esa.mo.apigen.model.MOModel; +import esa.mo.apigen.model.MessageBody; +import esa.mo.apigen.model.Operation; +import esa.mo.apigen.model.Service; +import esa.mo.apigen.model.com.COMFeatures; +import esa.mo.apigen.model.com.COMObject; +import esa.mo.apigen.model.types.CompositeType; +import esa.mo.apigen.model.types.EnumerationItem; +import esa.mo.apigen.model.types.EnumerationType; +import esa.mo.apigen.model.types.FundamentalType; +import esa.mo.apigen.model.types.TypeDefinition; +import esa.mo.apigen.model.types.TypeRef; +import java.io.IOException; +import java.nio.file.Path; +import java.util.AbstractMap; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.TreeMap; + +/** + * Writes a browsable page describing a specification, in an ECSS PUS style. + * <p> + * One page per area: what the area is, then a section per service and per operation, then + * every data type it declares, with an index of the lot at the end. The messages and the + * types are drawn rather than tabulated - each message once as it goes on the wire and once + * opened out into everything it is made of - and every type named anywhere is a link to + * where that type is described, whether that is this page or another. + * <p> + * This is not the generator that draws the diagrams in the Word documents. Those are SVG + * the specification itself declares, and the document generator rasterises them; these are + * drawn here from the model. The two share no code and no output. + */ +public final class XhtmlGenerator implements Generator { + + /** + * What each message of an interaction is called on the page. + */ + private static final String ARGUMENT_TITLE = "Telecommand application data:"; + + private static final String ACK_TITLE = "Acknowledgement telemetry report application data:"; + + private static final String UPDATE_TITLE = "Progress telemetry report application data:"; + + private static final String RESPONSE_TITLE = "Response telemetry report application data:"; + + private static final String NOTIFY_TITLE = "Notify telemetry report application data:"; + + private static final String EVENT_TITLE = "Event additional application data:"; + + @Override + public String getShortName() { + return "xhtml"; + } + + @Override + public String getDescription() { + return "Generates a navigable XHTML page of a set of MO service specifications"; + } + + @Override + public void generate(MOModel model, List<Area> targets, Path outputDir) + throws IOException { + for (Area area : targets) { + generateArea(model, area, outputDir); + } + } + + private void generateArea(MOModel model, Area area, Path outputDir) throws IOException { + XhtmlBody page = new XhtmlBody(); + page.title(1, "Specification: ", XhtmlLink.anchorOf(null, null), area.getName(), false); + page.comment(area.getComment()); + + // Every type described anywhere on the page, gathered as the page is written and + // shown in one alphabetical list at the end. The generator this replaces gathered + // them into a hash map and wrote them out in whatever order it iterated in, which + // is an index only in the sense that everything was in it. + Map<String, String> index = new TreeMap<String, String>(); + + List<Map.Entry<String, String>> serviceIndex = XhtmlBody.newIndex(); + XhtmlBody services = new XhtmlBody(); + for (Service service : area.getServices()) { + writeService(services, serviceIndex, model, area, service); + } + page.index("Services", 2, serviceIndex); + page.append(services); + + page.title(1, "Data types", null, "", false); + writeDataTypes(page, index, model, area); + + List<Map.Entry<String, String>> entries = XhtmlBody.newIndex(); + for (Map.Entry<String, String> entry : index.entrySet()) { + entries.add(entry); + } + page.index("Index", 1, entries); + + XhtmlPage.write(outputDir.resolve(XhtmlLink.pageOf(area)), area.getName(), page); + } + + private void writeService(XhtmlBody body, List<Map.Entry<String, String>> serviceIndex, + MOModel model, Area area, Service service) { + body.title(2, "Service: ", XhtmlLink.anchorOf(service, null), service.getName(), false); + body.comment(service.getComment()); + serviceIndex.add(entry(service.getName(), XhtmlLink.hrefWithin(service, null))); + + List<Map.Entry<String, String>> operationIndex = XhtmlBody.newIndex(); + XhtmlBody operations = new XhtmlBody(); + for (Operation operation : service.getOperations()) { + operations.title(3, "Operation: ", + XhtmlLink.anchorOf(service, operation.getName()), operation.getName(), false); + operations.comment(operation.getComment()); + operationIndex.add(entry(operation.getName(), + XhtmlLink.hrefWithin(service, operation.getName()))); + writeMessages(operations, model, area, operation); + } + body.index("Operations", 3, operationIndex); + body.append(operations); + + writeEvents(body, model, area, service); + } + + /** + * Describes the events a service declares, each carrying whatever its object type says. + */ + private void writeEvents(XhtmlBody body, MOModel model, Area area, Service service) { + COMFeatures com = service.getCom(); + if (com == null || com.getEvents().isEmpty()) { + return; + } + List<Map.Entry<String, String>> eventIndex = XhtmlBody.newIndex(); + XhtmlBody events = new XhtmlBody(); + for (COMObject event : com.getEvents()) { + events.title(3, "Event: ", XhtmlLink.anchorOf(service, event.getName()), + event.getName(), false); + eventIndex.add(entry(event.getName(), + XhtmlLink.hrefWithin(service, event.getName()))); + + List<Field> carried = new ArrayList<Field>(); + if (event.getBodyType() != null) { + carried.add(field(null, event.getBodyType(), false)); + } + writeMessage(events, model, area, EVENT_TITLE, carried, event.getComment()); + } + body.index("Events", 3, eventIndex); + body.append(events); + } + + /** + * Describes each message of an operation, in the order the interaction sends them. + */ + private void writeMessages(XhtmlBody body, MOModel model, Area area, Operation operation) { + switch (operation.getPattern()) { + case SEND: + message(body, model, area, operation, ARGUMENT_TITLE, InteractionStage.SEND); + break; + case SUBMIT: + message(body, model, area, operation, ARGUMENT_TITLE, InteractionStage.SUBMIT); + break; + case REQUEST: + message(body, model, area, operation, ARGUMENT_TITLE, InteractionStage.REQUEST); + message(body, model, area, operation, RESPONSE_TITLE, InteractionStage.RESPONSE); + break; + case INVOKE: + message(body, model, area, operation, ARGUMENT_TITLE, InteractionStage.INVOKE); + message(body, model, area, operation, ACK_TITLE, InteractionStage.ACK); + message(body, model, area, operation, RESPONSE_TITLE, InteractionStage.RESPONSE); + break; + case PROGRESS: + message(body, model, area, operation, ARGUMENT_TITLE, InteractionStage.PROGRESS); + message(body, model, area, operation, ACK_TITLE, InteractionStage.ACK); + message(body, model, area, operation, UPDATE_TITLE, InteractionStage.UPDATE); + message(body, model, area, operation, RESPONSE_TITLE, InteractionStage.RESPONSE); + break; + case PUBSUB: + MessageBody notify = operation.getMessage(InteractionStage.PUBLISH_NOTIFY); + writeMessage(body, model, area, NOTIFY_TITLE, notifyFields(model, area, notify), + notify == null ? null : notify.getComment()); + break; + default: + break; + } + } + + private void message(XhtmlBody body, MOModel model, Area area, Operation operation, + String title, InteractionStage stage) { + MessageBody message = operation.getMessage(stage); + writeMessage(body, model, area, title, + message == null ? new ArrayList<Field>() : message.getFields(), + message == null ? null : message.getComment()); + } + + /** + * What a NOTIFY carries, which is not what the specification writes. + * <p> + * A specification says what a publish-subscribe operation publishes; the message that + * arrives holds the identifier of the subscription it answers and a header for each + * update, and carries a list of every published value rather than one of each. The + * diagram shows the message, so it is assembled here. + */ + private List<Field> notifyFields(MOModel model, Area area, MessageBody published) { + List<Field> fields = new ArrayList<Field>(); + int mal = malVersionOf(area); + // Every part of a NOTIFY is there: the message says which subscription it answers + // and carries a header for each update, whatever the values themselves are. + fields.add(field("subscriptionId", new TypeRef("MAL", mal, null, + "Identifier", false, false), false)); + fields.add(field("updateHeaders", new TypeRef("MAL", mal, null, + "UpdateHeader", true, false), false)); + if (published != null) { + for (Field declared : published.getFields()) { + TypeRef type = declared.getType().unwrapped(); + fields.add(field(declared.getName(), new TypeRef(type.getArea(), + type.getAreaVersion(), type.getService(), type.getName(), true, false), + false)); + } + } + return fields; + } + + /** + * Describes one message: what it carries, drawn as it goes on the wire and drawn again + * opened out, then what each field of it is. + */ + private void writeMessage(XhtmlBody body, MOModel model, Area area, String title, + List<Field> fields, String comment) { + body.title(4, title, null, fields.isEmpty() ? " None" : "", false); + if (fields.isEmpty()) { + body.comment(comment); + return; + } + + SvgDiagram flat = new SvgDiagram(); + for (Field field : fields) { + drawField(flat, model, area, field); + } + body.diagram(flat); + + SvgDiagram expanded = new SvgDiagram(); + TypeNode root = TypeNode.ofMessage(fields, model, + new TypeRef("MAL", malVersionOf(area), null, "Integer", false, false)); + root.draw(expanded, area, model, 1, 0, root.depth(0)); + body.diagram(expanded); + + body.comment(comment); + for (Field field : fields) { + if (field.getComment() != null && !field.getComment().isEmpty()) { + body.fieldComment(nameOf(field), field.getComment()); + } + } + } + + /** + * Draws one field as it goes on the wire: a list is a count followed by that many of + * the type in it. + */ + private void drawField(SvgDiagram diagram, MOModel model, Area area, Field field) { + TypeRef type = field.getType().unwrapped(); + if (type.isList()) { + diagram.field("N", "Integer", XhtmlLink.hrefTo(model, area, + new TypeRef("MAL", malVersionOf(area), null, "Integer", false, false)), + false, false); + diagram.span(1, 1, "Repeated N times"); + } + diagram.field(nameOf(field), type.getName(), XhtmlLink.hrefTo(model, area, type), + isAbstract(model, type), isEnumeration(model, type)); + } + + /** + * Describes every type the specification declares, area level first and then service by + * service. + */ + private void writeDataTypes(XhtmlBody body, Map<String, String> index, + MOModel model, Area area) { + if (!area.getDataTypes().isEmpty()) { + body.title(2, "Area data types: ", null, area.getName(), false); + for (TypeDefinition type : area.getDataTypes()) { + writeDataType(body, index, model, area, null, type); + } + } + for (Service service : area.getServices()) { + if (service.getDataTypes().isEmpty()) { + continue; + } + body.title(2, "Service data types: ", null, service.getName(), false); + for (TypeDefinition type : service.getDataTypes()) { + writeDataType(body, index, model, area, service, type); + } + } + } + + private void writeDataType(XhtmlBody body, Map<String, String> index, MOModel model, + Area area, Service service, TypeDefinition type) { + if (type instanceof FundamentalType) { + body.title(3, "Fundamental: ", XhtmlLink.anchorOf(service, type.getName()), + type.getName(), true); + body.comment(type.getComment()); + } else if (type instanceof esa.mo.apigen.model.types.AttributeType) { + body.title(3, "Attribute: ", XhtmlLink.anchorOf(service, type.getName()), + type.getName(), true); + body.comment(type.getComment()); + } else if (type instanceof EnumerationType) { + writeEnumeration(body, (EnumerationType) type, service); + } else if (type instanceof CompositeType) { + writeComposite(body, model, area, service, (CompositeType) type); + } else { + throw new IllegalArgumentException("A data type of " + + area.getName() + " is a " + type.getClass().getName() + + ", which is not something a page can describe"); + } + index.put(type.getName(), XhtmlLink.hrefWithin(service, type.getName())); + } + + private void writeEnumeration(XhtmlBody body, EnumerationType type, Service service) { + body.title(3, "Enum: ", XhtmlLink.anchorOf(service, type.getName()), + type.getName(), false); + body.comment(type.getComment()); + for (EnumerationItem item : type.getItems()) { + body.fieldComment(item.getValue(), item.getComment()); + } + } + + private void writeComposite(XhtmlBody body, MOModel model, Area area, Service service, + CompositeType type) { + body.title(3, "Composite: ", XhtmlLink.anchorOf(service, type.getName()), + type.getName(), type.isAbstract()); + body.comment(type.getComment()); + + SvgDiagram diagram = new SvgDiagram(); + TypeRef parent = type.getSuperType(); + if (parent != null && !"Composite".equals(parent.getName())) { + diagram.parent(parent.getName(), XhtmlLink.hrefTo(model, area, parent)); + } + for (Field field : type.getFields()) { + TypeRef fieldType = field.getType().unwrapped(); + if (field.isCanBeNull()) { + int covered = fieldType.isList() ? 2 : 1; + diagram.span(covered, covered, "Nullable"); + } + if (fieldType.isList()) { + diagram.field("N", "Integer", XhtmlLink.hrefTo(model, area, + new TypeRef("MAL", malVersionOf(area), null, "Integer", false, false)), + false, false); + diagram.span(1, 1, "Repeated N times"); + } + diagram.field(field.getName(), fieldType.getName(), + XhtmlLink.hrefTo(model, area, fieldType), + isAbstract(model, fieldType), isEnumeration(model, fieldType)); + } + body.diagram(diagram); + + for (Field field : type.getFields()) { + if (field.getComment() != null && !field.getComment().isEmpty()) { + body.fieldComment(field.getName(), field.getComment()); + } + } + } + + /** + * The MAL generation a specification is written against, which decides which MAL its + * Integer and its UpdateHeader are. + */ + private static int malVersionOf(Area area) { + if (area.getSpecification() == null || area.getSpecification().getSchemaVersion() == null) { + return 1; + } + return area.getSpecification().getSchemaVersion().getMalVersion(); + } + + private static boolean isAbstract(MOModel model, TypeRef type) { + TypeDefinition definition = model.resolve(type); + return definition != null && definition.isAbstract(); + } + + private static boolean isEnumeration(MOModel model, TypeRef type) { + return model.resolve(type) instanceof EnumerationType; + } + + /** + * A message field need not be named, and a box has to say something. + */ + private static String nameOf(Field field) { + return field.getName() == null || field.getName().isEmpty() ? "Part" : field.getName(); + } + + private static Field field(String name, TypeRef type, boolean canBeNull) { + Field field = new Field(); + field.setName(name); + field.setType(type); + field.setCanBeNull(canBeNull); + return field; + } + + private static Map.Entry<String, String> entry(String name, String href) { + return new AbstractMap.SimpleEntry<String, String>(name, href); + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/xhtml/XhtmlLink.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/xhtml/XhtmlLink.java new file mode 100644 index 00000000..201b465e --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/xhtml/XhtmlLink.java @@ -0,0 +1,113 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.generators.xhtml; + +import esa.mo.apigen.model.Area; +import esa.mo.apigen.model.MOModel; +import esa.mo.apigen.model.Service; +import esa.mo.apigen.model.types.TypeDefinition; +import esa.mo.apigen.model.types.TypeRef; + +/** + * Names the pages and the anchors within them, and links one to another. + * <p> + * Every anchor is {@code service_name}, or {@code _name} for something an area declares + * itself, so an anchor is unique within its page whether or not two services name a type + * the same way. + * <p> + * A link is only written when the target is known to exist. The generator this replaces + * wrote one for every type it mentioned, so a list type linked to an anchor no page ever + * defines - seven of them across the standards, {@code #_ElementList} among them, because + * the name it linked to was the name of the list rather than of the type in it. + */ +public final class XhtmlLink { + + private XhtmlLink() { + } + + /** + * Names the page of an area, after the specification it is generated from. + * <p> + * The number and the version are part of the name because the name alone is not an + * identity: MAL is published at version 1 and version 3, Monitor and Control at 1 and + * 2, and the generator this replaces wrote both of each pair to {@code outputMAL.xhtml} + * and {@code outputMC.xhtml}, so whichever specification was read second was the only + * one that survived. + * + * @param area The area the page describes. + * @return the file name of its page. + */ + public static String pageOf(Area area) { + return String.format("area%03d-v%03d-%s.xhtml", + area.getNumber(), area.getVersion(), area.getName()); + } + + /** + * The anchor of something a page describes. + * + * @param service The service that declares it, or null if the area does. + * @param name The name of the thing, or null for the top of the page. + * @return the anchor, without its '#'. + */ + public static String anchorOf(Service service, String name) { + return (service == null ? "" : service.getName()) + "_" + (name == null ? "" : name); + } + + /** + * Links to a type from the page of an area. + * <p> + * A list is drawn as a count and the type in it, so what is linked to is the type in + * it: {@code List<UpdateHeader>} resolves to wherever UpdateHeader is described. + * + * @param model Every loaded specification. + * @param from The area whose page is being written. + * @param type The type to link to. + * @return the href, or null if nothing loaded declares the type - in which case the + * name is written without a link rather than linking nowhere. + */ + public static String hrefTo(MOModel model, Area from, TypeRef type) { + if (type == null) { + return null; + } + TypeRef target = type.unwrapped(); + TypeDefinition declaration = model.resolve(target); + if (declaration == null) { + return null; + } + Area declaring = declaration.getArea(); + String anchor = anchorOf(declaration.getService(), declaration.getName()); + if (declaring == from) { + return "#" + anchor; + } + return pageOf(declaring) + "#" + anchor; + } + + /** + * Links to something on the page being written. + * + * @param service The service that declares it, or null if the area does. + * @param name The name of the thing. + * @return the href. + */ + public static String hrefWithin(Service service, String name) { + return "#" + anchorOf(service, name); + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/xhtml/XhtmlPage.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/xhtml/XhtmlPage.java new file mode 100644 index 00000000..c8624296 --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/xhtml/XhtmlPage.java @@ -0,0 +1,99 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.generators.xhtml; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.Charset; +import java.nio.file.Files; +import java.nio.file.Path; + +/** + * The file a page is written to: what wraps the content, and the writing of it. + */ +public final class XhtmlPage { + + private static final Charset UTF8 = Charset.forName("UTF-8"); + + /** + * The style sheet, carried as the file it is so it can be read and edited as CSS. It + * is written into the page rather than beside it, so that a page is one file that can + * be moved, mailed or opened from anywhere. + */ + private static final String STYLESHEET = "/xhtml/page.css"; + + private XhtmlPage() { + } + + /** + * Writes a page. + * + * @param file Where to write it. + * @param title What the page is about, which is what a browser shows in its tab. The + * generator this replaces wrote every page with an empty title, so a reader with + * several open could not tell one from another. + * @param body The content of the page. + * @throws IOException if writing fails. + */ + public static void write(Path file, String title, XhtmlBody body) throws IOException { + StringBuilder out = new StringBuilder(); + out.append(XhtmlText.line(0, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>")); + out.append(XhtmlText.line(0, "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"" + + " \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">")); + out.append(XhtmlText.line(0, "<html xmlns=\"http://www.w3.org/1999/xhtml\"" + + " xmlns:svg=\"http://www.w3.org/2000/svg\"" + + " xmlns:xlink=\"http://www.w3.org/1999/xlink\">")); + out.append(XhtmlText.line(1, "<head>")); + out.append(XhtmlText.line(2, "<title>" + XhtmlBody.escape(title) + "")); + out.append(XhtmlText.line(2, "")); + out.append(XhtmlText.line(1, "")); + out.append(XhtmlText.line(1, "")); + out.append(body.toString()); + out.append(XhtmlText.line(1, "")); + out.append(XhtmlText.line(0, "")); + + if (file.getParent() != null) { + Files.createDirectories(file.getParent()); + } + Files.write(file, out.toString().getBytes(UTF8)); + } + + private static String stylesheet() throws IOException { + InputStream in = XhtmlPage.class.getResourceAsStream(STYLESHEET); + if (in == null) { + throw new IOException("The stylesheet '" + STYLESHEET + "' is not on the classpath"); + } + try { + ByteArrayOutputStream buf = new ByteArrayOutputStream(); + byte[] chunk = new byte[8192]; + int read; + while ((read = in.read(chunk)) != -1) { + buf.write(chunk, 0, read); + } + return new String(buf.toByteArray(), UTF8); + } finally { + in.close(); + } + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/xhtml/XhtmlText.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/xhtml/XhtmlText.java new file mode 100644 index 00000000..43be125b --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/xhtml/XhtmlText.java @@ -0,0 +1,117 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.generators.xhtml; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * Turns the text of a comment into the markup of a page. + */ +public final class XhtmlText { + + private static final String OPEN_LIST = "

                    "; + + private static final String CLOSE_LIST = "
                  "; + + private XhtmlText() { + } + + /** + * @param indent How many steps in, at four spaces a step. + * @param text The line. + * @return the line, indented and ended. + */ + public static String line(int indent, String text) { + StringBuilder buf = new StringBuilder(); + for (int i = 0; i < indent; i++) { + buf.append(" "); + } + return buf.append(text).append('\n').toString(); + } + + /** + * Splits a comment into the blocks of markup that say it. + *

                  + * A comment is one string in the specification, and where it means a new paragraph it + * says so with a line break or with the double space the specifications use for the + * same thing. Requirement lists are written in the same string as markup - a line that + * is exactly {@code

                    } opens a level, one that is exactly {@code
                  } closes it, + * and text between {@code
                • } and {@code
                • } is an item of the level open at the + * time. Here that markup can simply be honoured: the target format is the one it is + * written in. + * + * @param text The comment, may be null. + * @return the blocks, each a complete element, empty if there is no text. + */ + public static List blocksOf(String text) { + List blocks = new ArrayList(); + if (text == null) { + return blocks; + } + int open = 0; + for (String part : Arrays.asList(text.split("( |\n)"))) { + String trimmed = part.trim(); + if (trimmed.isEmpty()) { + continue; + } + if (OPEN_LIST.equals(trimmed)) { + blocks.add(OPEN_LIST); + open++; + } else if (CLOSE_LIST.equals(trimmed)) { + // A close with nothing open is markup the specification got wrong; writing + // it out would make the page unparseable, so it is dropped. + if (open > 0) { + blocks.add(CLOSE_LIST); + open--; + } + } else if (trimmed.contains("
                • ")) { + // An item outside any list opens one, since a list is what it means and an + // item on its own is not something the page can hold. + if (open == 0) { + blocks.add(OPEN_LIST); + open++; + } + blocks.add("
                • " + XhtmlBody.escape(itemOf(trimmed)) + "
                • "); + } else if (open > 0) { + // Text inside a list that is not an item still belongs to the item above it. + blocks.add("
                • " + XhtmlBody.escape(trimmed) + "
                • "); + } else { + blocks.add("

                  " + XhtmlBody.escape(trimmed) + "

                  "); + } + } + while (open > 0) { + blocks.add(CLOSE_LIST); + open--; + } + return blocks; + } + + /** + * @return what a line holding an item says, without the tags that mark it as one. + */ + private static String itemOf(String line) { + int start = line.indexOf("
                • ") + "
                • ".length(); + int end = line.indexOf("
                • ", start); + return (end < 0 ? line.substring(start) : line.substring(start, end)).trim(); + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/importers/mospec/Cursor.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/importers/mospec/Cursor.java new file mode 100644 index 00000000..cf78e285 --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/importers/mospec/Cursor.java @@ -0,0 +1,134 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.importers.mospec; + +import esa.mo.apigen.importers.ImportException; +import esa.mo.apigen.model.SourceLocation; +import esa.mo.apigen.model.SourceRef; +import java.util.List; + +/** + * A position in a stream of tokens, with the small vocabulary a recursive-descent parser + * needs: look at what is next, take it if it is what was expected, complain if it is not. + */ +public final class Cursor { + + private final List tokens; + private final SourceRef source; + + private int at = 0; + + public Cursor(List tokens, SourceRef source) { + this.tokens = tokens; + this.source = source; + } + + /** + * @return the token about to be read, without reading it. + */ + public Token peek() { + return tokens.get(at); + } + + /** + * @param ahead How far to look past the next token. + * @return the token that far ahead, or the last one if that is past the end. + */ + public Token peek(int ahead) { + int index = at + ahead; + return tokens.get(index < tokens.size() ? index : tokens.size() - 1); + } + + /** + * @return the next token, and moves past it. + */ + public Token take() { + return tokens.get(at++); + } + + /** + * Takes the next token if it is the expected word or punctuation. + * + * @param expected What to look for. + * @return true if it was there and was taken. + */ + public boolean accept(String expected) { + if (peek().is(expected)) { + at++; + return true; + } + return false; + } + + /** + * Takes the next token, which must be the expected word or punctuation. + * + * @param expected What must be there. + * @return the token taken. + * @throws ImportException if something else is there. + */ + public Token expect(String expected) throws ImportException { + if (!peek().is(expected)) { + throw error("expected '" + expected + "'"); + } + return take(); + } + + /** + * Takes the next token, which must be of the expected kind. + * + * @param kind What kind must be there. + * @param what What to call it in an error message. + * @return the text of the token taken. + * @throws ImportException if something else is there. + */ + public String expect(Token.Kind kind, String what) throws ImportException { + if (peek().getKind() != kind) { + throw error("expected " + what); + } + return take().getText(); + } + + /** + * @return true if there is nothing left to read. + */ + public boolean atEnd() { + return peek().getKind() == Token.Kind.END; + } + + /** + * @return where the next token was written. + */ + public SourceLocation location() { + Token token = peek(); + return new SourceLocation(source, token.getLine(), token.getColumn()); + } + + /** + * @param message What was expected. + * @return an exception naming the place and what was found instead. + */ + public ImportException error(String message) { + Token token = peek(); + return new ImportException(source.getName() + ":" + token.getLine() + ":" + + token.getColumn() + ": " + message + ", found '" + token.getText() + "'"); + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/importers/mospec/Lexer.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/importers/mospec/Lexer.java new file mode 100644 index 00000000..fe531121 --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/importers/mospec/Lexer.java @@ -0,0 +1,387 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.importers.mospec; + +import esa.mo.apigen.importers.ImportException; +import java.util.ArrayList; +import java.util.List; + +/** + * Turns MOSpec text into tokens. + *

                  + * The language has one documentation syntax, in two spellings: {@code ///} for a line and + * {@code /** … **}{@code /} for a block. Both produce a single DOC token carrying the text + * with its markers stripped, which is what makes the readable syntax the parsed syntax - + * there is nothing to rewrite before parsing. + */ +public final class Lexer { + + private final String source; + private final String where; + + private int position = 0; + private int line = 1; + private int column = 1; + + /** + * @param source The text to read. + * @param where What to call it in an error message. + */ + public Lexer(String source, String where) { + this.source = source; + this.where = where; + } + + /** + * @return every token of the source, ending with one of kind END. + * @throws ImportException if the text cannot be read. + */ + public List tokens() throws ImportException { + List tokens = new ArrayList(); + while (true) { + Token token = next(); + tokens.add(token); + if (token.getKind() == Token.Kind.END) { + return tokens; + } + } + } + + private Token next() throws ImportException { + skipBlanksAndOrdinaryComments(); + if (position >= source.length()) { + return token(Token.Kind.END, ""); + } + + int startLine = line; + int startColumn = column; + char c = source.charAt(position); + + if (startsDoc()) { + return new Token(Token.Kind.DOC, readDoc(), startLine, startColumn); + } + if (c == '"') { + return new Token(startsText() ? Token.Kind.TEXT : Token.Kind.STRING, + startsText() ? readText() : readString(), startLine, startColumn); + } + if (Character.isDigit(c) || (c == '-' && isDigitAt(position + 1))) { + return new Token(Token.Kind.NUMBER, readNumber(), startLine, startColumn); + } + if (Character.isLetter(c) || c == '_') { + return new Token(Token.Kind.WORD, readWord(), startLine, startColumn); + } + // Two-character punctuation first, so that -> is not read as - then >. + if (c == '-' && isAt(position + 1, '>')) { + advance(); + advance(); + return new Token(Token.Kind.PUNCTUATION, "->", startLine, startColumn); + } + if (c == ':' && isAt(position + 1, ':')) { + advance(); + advance(); + return new Token(Token.Kind.PUNCTUATION, "::", startLine, startColumn); + } + advance(); + return new Token(Token.Kind.PUNCTUATION, String.valueOf(c), startLine, startColumn); + } + + /** + * Steps over anything that carries no meaning: whitespace, and comments that are not + * documentation. + */ + private void skipBlanksAndOrdinaryComments() throws ImportException { + while (position < source.length()) { + char c = source.charAt(position); + if (Character.isWhitespace(c)) { + advance(); + } else if (isAt(position, '/') && isAt(position + 1, '/') && !startsDoc()) { + while (position < source.length() && source.charAt(position) != '\n') { + advance(); + } + } else if (isAt(position, '/') && isAt(position + 1, '*') && !startsDoc()) { + advance(); + advance(); + while (position < source.length() + && !(isAt(position, '*') && isAt(position + 1, '/'))) { + advance(); + } + expect('*'); + expect('/'); + } else { + return; + } + } + } + + /** + * @return true if what follows is documentation rather than an ordinary comment. + */ + private boolean startsDoc() { + return (isAt(position, '/') && isAt(position + 1, '/') && isAt(position + 2, '/')) + || (isAt(position, '/') && isAt(position + 1, '*') && isAt(position + 2, '*')); + } + + /** + * Reads documentation, in either spelling, into the text it carries. Consecutive line + * comments are one piece of documentation, which is how a paragraph is written without + * a block. + */ + private String readDoc() throws ImportException { + if (isAt(position + 1, '*')) { + return readDocBlock(); + } + StringBuilder buf = new StringBuilder(); + boolean first = true; + while (isAt(position, '/') && isAt(position + 1, '/') && isAt(position + 2, '/')) { + advance(); + advance(); + advance(); + if (isAt(position, ' ')) { + advance(); + } + StringBuilder text = new StringBuilder(); + while (position < source.length() && source.charAt(position) != '\n') { + text.append(source.charAt(position)); + advance(); + } + buf.append(first ? "" : "\n").append(text); + first = false; + skipBlanksBeforeNextDocLine(); + } + return buf.toString(); + } + + /** + * Steps over the whitespace between two documentation lines, but no further: a blank + * line ends the documentation rather than joining what follows to it. + */ + private void skipBlanksBeforeNextDocLine() { + int mark = position; + int markLine = line; + int markColumn = column; + int newlines = 0; + while (position < source.length() && Character.isWhitespace(source.charAt(position))) { + if (source.charAt(position) == '\n') { + newlines++; + } + advance(); + } + boolean continues = newlines <= 1 && isAt(position, '/') + && isAt(position + 1, '/') && isAt(position + 2, '/'); + if (!continues) { + position = mark; + line = markLine; + column = markColumn; + } + } + + /** + * Reads a block of documentation, dropping the leading star of each line. + */ + private String readDocBlock() throws ImportException { + advance(); + advance(); + advance(); + StringBuilder buf = new StringBuilder(); + while (position < source.length() + && !(isAt(position, '*') && isAt(position + 1, '*') && isAt(position + 2, '/'))) { + buf.append(source.charAt(position)); + advance(); + } + expect('*'); + expect('*'); + expect('/'); + + List lines = new ArrayList(); + for (String written : buf.toString().split("\n", -1)) { + // Only what is in front of the text is removed - the indentation, the star, and + // the one space after it. Whatever follows is the text, trailing spaces and all: + // some comments in the specifications end in one, and the round trip has to + // give them back unchanged. + int at = 0; + while (at < written.length() && (written.charAt(at) == ' ' + || written.charAt(at) == '\t')) { + at++; + } + if (at < written.length() && written.charAt(at) == '*') { + at++; + if (at < written.length() && written.charAt(at) == ' ') { + at++; + } + lines.add(written.substring(at)); + } else { + lines.add(written.substring(at)); + } + } + // The first and last lines are the ones the markers sat on, and are empty. + while (!lines.isEmpty() && lines.get(0).trim().isEmpty()) { + lines.remove(0); + } + while (!lines.isEmpty() && lines.get(lines.size() - 1).trim().isEmpty()) { + lines.remove(lines.size() - 1); + } + return join(lines); + } + + /** + * @return true if what follows is a triple-quoted block rather than a plain string. + */ + private boolean startsText() { + return isAt(position, '"') && isAt(position + 1, '"') && isAt(position + 2, '"'); + } + + /** + * Reads a triple-quoted block, which keeps its own line breaks and gives up the + * indentation that was only there to line it up with the code around it. + */ + private String readText() throws ImportException { + advance(); + advance(); + advance(); + StringBuilder buf = new StringBuilder(); + while (position < source.length() && !startsText()) { + buf.append(source.charAt(position)); + advance(); + } + expect('"'); + expect('"'); + expect('"'); + return undent(buf.toString()); + } + + private String readString() throws ImportException { + advance(); + StringBuilder buf = new StringBuilder(); + while (position < source.length() && source.charAt(position) != '"') { + if (source.charAt(position) == '\\' && position + 1 < source.length()) { + advance(); + } + buf.append(source.charAt(position)); + advance(); + } + expect('"'); + return buf.toString(); + } + + private String readNumber() { + StringBuilder buf = new StringBuilder(); + if (isAt(position, '-')) { + buf.append('-'); + advance(); + } + while (position < source.length() && Character.isDigit(source.charAt(position))) { + buf.append(source.charAt(position)); + advance(); + } + return buf.toString(); + } + + private String readWord() { + StringBuilder buf = new StringBuilder(); + while (position < source.length()) { + char c = source.charAt(position); + if (!Character.isLetterOrDigit(c) && c != '_') { + break; + } + buf.append(c); + advance(); + } + return buf.toString(); + } + + /** + * Removes the indentation a block was written with, keeping whatever indentation is + * part of the text itself. + */ + private static String undent(String text) { + List lines = new ArrayList(); + for (String written : text.split("\n", -1)) { + lines.add(written); + } + // Exactly one line is dropped at each end, and only if it is blank: those are the + // lines the delimiters sit on. Dropping every blank line would swallow a blank line + // the text itself ends with, and some requirements do end with one. + if (!lines.isEmpty() && lines.get(0).trim().isEmpty()) { + lines.remove(0); + } + if (!lines.isEmpty() && lines.get(lines.size() - 1).trim().isEmpty()) { + lines.remove(lines.size() - 1); + } + + int common = Integer.MAX_VALUE; + for (String written : lines) { + if (written.trim().isEmpty()) { + continue; + } + int leading = 0; + while (leading < written.length() && written.charAt(leading) == '\t') { + leading++; + } + common = Math.min(common, leading); + } + if (common == Integer.MAX_VALUE || common == 0) { + return join(lines); + } + List trimmed = new ArrayList(); + for (String written : lines) { + trimmed.add(written.length() >= common ? written.substring(common) : written); + } + return join(trimmed); + } + + private static String join(List lines) { + StringBuilder buf = new StringBuilder(); + for (int i = 0; i < lines.size(); i++) { + buf.append(i == 0 ? "" : "\n").append(lines.get(i)); + } + return buf.toString(); + } + + private void expect(char c) throws ImportException { + if (position >= source.length() || source.charAt(position) != c) { + throw new ImportException(where + ":" + line + ":" + column + + ": expected '" + c + "'"); + } + advance(); + } + + private boolean isAt(int at, char c) { + return at < source.length() && source.charAt(at) == c; + } + + private boolean isDigitAt(int at) { + return at < source.length() && Character.isDigit(source.charAt(at)); + } + + private void advance() { + if (source.charAt(position) == '\n') { + line++; + column = 1; + } else { + column++; + } + position++; + } + + private Token token(Token.Kind kind, String text) { + return new Token(kind, text, line, column); + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/importers/mospec/MOSpecImporter.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/importers/mospec/MOSpecImporter.java new file mode 100644 index 00000000..03255157 --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/importers/mospec/MOSpecImporter.java @@ -0,0 +1,1087 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.importers.mospec; + +import esa.mo.apigen.importers.ImportException; +import esa.mo.apigen.importers.Importer; +import esa.mo.apigen.model.Area; +import esa.mo.apigen.model.CapabilitySet; +import esa.mo.apigen.model.ErrorDefinition; +import esa.mo.apigen.model.ErrorReference; +import esa.mo.apigen.model.Field; +import esa.mo.apigen.model.InteractionPattern; +import esa.mo.apigen.model.InteractionStage; +import esa.mo.apigen.model.MessageBody; +import esa.mo.apigen.model.Operation; +import esa.mo.apigen.model.SchemaVersion; +import esa.mo.apigen.model.Service; +import esa.mo.apigen.model.SourceRef; +import esa.mo.apigen.model.Specification; +import esa.mo.apigen.model.com.COMFeatures; +import esa.mo.apigen.model.com.COMObject; +import esa.mo.apigen.model.com.ObjectLink; +import esa.mo.apigen.model.com.ObjectReference; +import esa.mo.apigen.model.docs.Diagram; +import esa.mo.apigen.model.docs.DocSection; +import esa.mo.apigen.model.types.AttributeType; +import esa.mo.apigen.model.types.CompositeType; +import esa.mo.apigen.model.types.EnumerationItem; +import esa.mo.apigen.model.types.EnumerationType; +import esa.mo.apigen.model.types.FundamentalType; +import esa.mo.apigen.model.types.TypeDefinition; +import esa.mo.apigen.model.types.TypeRef; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.Reader; +import java.nio.charset.Charset; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * Reads a specification from MOSpec. + *

                  + * Recursive descent over a hand-written lexer. The language is LL(1) throughout: every + * declaration is led by a keyword, every block is brace-delimited, and there is no + * expression grammar to speak of - so each production can decide what it is looking at from + * the next token alone. + *

                  + * The documentation of whatever comes next is carried in {@code pending}: the lexer hands + * back one DOC token for a comment however it was spelled, and each production takes it as + * it starts. That is what lets a comment sit above the thing it describes without every + * production having to look backwards. + */ +public final class MOSpecImporter implements Importer { + + /** + * The area being read, so that an unqualified name can be resolved against it. + */ + private Area area; + + /** + * The service being read, or null at area level. + */ + private Service service; + + /** + * Every type the file declares, as "area" or "area.service" against the names declared + * there. + *

                  + * Gathered before parsing, because a name is used before it is declared all the time: an + * operation names a type its own service declares further down the file. Without this an + * unqualified name would resolve to the MAL's type of that name, silently. + */ + private final Map> declared = new HashMap>(); + + @Override + public Specification read(Reader in, SourceRef source) throws ImportException { + try { + Specification spec = read(readAll(in), source); + readSidecars(spec, source); + return spec; + } catch (IOException ex) { + throw new ImportException("Could not read " + source + ": " + ex.getMessage(), ex); + } + } + + /** + * Reads the drawing of each diagram from the file beside the specification. + *

                  + * A MOSpec specification is a directory: the text names its diagrams and the drawings + * live next to it, because a hundred lines of SVG in the middle of a readable file + * would defeat the point of having one. Where the file cannot be found the diagram + * keeps its name and loses its drawing, which is what reading a half-copied directory + * should do rather than failing outright. + */ + private void readSidecars(Specification spec, SourceRef source) throws IOException { + if (source.getLocation() == null) { + return; + } + File beside = new File(source.getLocation()).getAbsoluteFile().getParentFile(); + if (beside == null) { + return; + } + for (Area read : spec.getAreas()) { + readSidecars(beside, read.getDocumentation().getDiagrams()); + for (Service svc : read.getServices()) { + readSidecars(beside, svc.getDocumentation().getDiagrams()); + if (svc.getCom() != null) { + readSidecars(beside, svc.getCom().getDocumentation().getDiagrams()); + } + } + } + } + + private void readSidecars(File beside, List diagrams) throws IOException { + for (Diagram diagram : diagrams) { + File file = new File(beside, diagram.getName() + ".svg"); + if (file.isFile()) { + diagram.setSvg(readAll(new InputStreamReader( + new FileInputStream(file), Charset.forName("UTF-8")))); + } + } + } + + /** + * Reads a specification from text. + * + * @param text The MOSpec source. + * @param source Where it came from. + * @return the specification. + * @throws ImportException if the text cannot be parsed. + */ + public Specification read(String text, SourceRef source) throws ImportException { + List tokens = new Lexer(text, source.getName()).tokens(); + scanDeclarations(tokens); + Cursor c = new Cursor(tokens, source); + Specification spec = new Specification(); + spec.setSource(source); + + String comment = doc(c); + c.expect("specification"); + c.expect("["); + spec.setSchemaVersion(schemaVersion(c)); + c.expect("]"); + spec.setComment(comment); + + while (!c.atEnd()) { + spec.addArea(area(c)); + } + return spec; + } + + /** + * Walks the tokens once to find out what each area and service declares, so that an + * unqualified name can be resolved wherever it appears. + */ + private void scanDeclarations(List tokens) { + declared.clear(); + String currentArea = null; + String currentService = null; + int depth = 0; + int serviceDepth = -1; + + for (int i = 0; i < tokens.size(); i++) { + Token token = tokens.get(i); + if (token.is("{")) { + depth++; + continue; + } + if (token.is("}")) { + depth--; + if (currentService != null && depth <= serviceDepth) { + currentService = null; + serviceDepth = -1; + } + continue; + } + if (token.getKind() != Token.Kind.WORD) { + continue; + } + if (token.is("area") && i + 1 < tokens.size()) { + currentArea = nameAt(tokens, i + 1); + currentService = null; + } else if (token.is("service") && i + 1 < tokens.size()) { + currentService = nameAt(tokens, i + 1); + serviceDepth = depth; + } else if (token.is("composite") || token.is("enumeration") + || token.is("attribute") || token.is("fundamental")) { + String name = nameAt(tokens, i + 1); + if (name != null && currentArea != null) { + String key = currentService == null ? currentArea + : currentArea + "." + currentService; + Set names = declared.get(key); + if (names == null) { + names = new HashSet(); + declared.put(key, names); + } + names.add(name); + } + } + } + } + + private static String nameAt(List tokens, int index) { + if (index >= tokens.size()) { + return null; + } + Token token = tokens.get(index); + return token.getKind() == Token.Kind.WORD || token.getKind() == Token.Kind.STRING + ? token.getText() : null; + } + + private SchemaVersion schemaVersion(Cursor c) throws ImportException { + String written = c.expect(Token.Kind.WORD, "a schema version such as v003"); + for (SchemaVersion version : SchemaVersion.values()) { + if (version.name().equalsIgnoreCase(written)) { + return version; + } + } + throw c.error("unknown schema version '" + written + "'"); + } + + // ----------------------------------------------------------------- area + + private Area area(Cursor c) throws ImportException { + String comment = doc(c); + Area read = new Area(); + read.setLocation(c.location()); + c.expect("area"); + read.setComment(comment); + read.setName(identifier(c)); + c.expect("["); + read.setNumber(number(c)); + c.expect("."); + read.setVersion(number(c)); + c.expect("]"); + + this.area = read; + this.service = null; + + while (!c.atEnd() && !startsArea(c)) { + String memberComment = doc(c); + if (c.peek().is("service") || c.peek().is("extended")) { + read.addService(service(c, memberComment)); + } else if (c.peek().is("doc")) { + read.getDocumentation().getSections().add(docSection(c, memberComment)); + } else if (c.peek().is("diagram")) { + read.getDocumentation().getDiagrams().add(diagram(c)); + } else if (c.peek().is("error")) { + read.getErrors().add(errorDefinition(c, memberComment)); + } else { + read.getDataTypes().add(dataType(c, memberComment)); + } + } + this.area = null; + return read; + } + + /** + * @return true if what follows begins another area, which is where this one ends. + */ + private boolean startsArea(Cursor c) { + if (c.peek().is("area")) { + return true; + } + // An area may be preceded by its documentation, which has already been taken. + return c.peek().getKind() == Token.Kind.DOC && c.peek(1).is("area"); + } + + // -------------------------------------------------------------- service + + private Service service(Cursor c, String comment) throws ImportException { + Service read = new Service(); + read.setLocation(c.location()); + if (c.accept("extended")) { + read.setExtended(true); + } + c.expect("service"); + read.setComment(comment); + read.setName(identifier(c)); + c.expect("["); + read.setNumber(number(c)); + c.expect("]"); + c.expect("{"); + + this.service = read; + while (!c.accept("}")) { + String memberComment = doc(c); + if (c.peek().is("capability")) { + read.addCapabilitySet(capabilitySet(c, memberComment)); + } else if (c.peek().is("doc")) { + read.getDocumentation().getSections().add(docSection(c, memberComment)); + } else if (c.peek().is("diagram")) { + read.getDocumentation().getDiagrams().add(diagram(c)); + } else if (c.peek().is("error")) { + read.getErrors().add(errorDefinition(c, memberComment)); + } else if (c.peek().is("com")) { + read.setExtended(true); + read.setCom(com(c)); + } else { + read.getDataTypes().add(dataType(c, memberComment)); + } + } + this.service = null; + return read; + } + + private CapabilitySet capabilitySet(Cursor c, String comment) throws ImportException { + CapabilitySet set = new CapabilitySet(); + set.setLocation(c.location()); + c.expect("capability"); + set.setComment(comment); + c.expect("["); + set.setNumber(number(c)); + c.expect("]"); + c.expect("{"); + while (!c.accept("}")) { + set.addOperation(operation(c, doc(c))); + } + return set; + } + + // ------------------------------------------------------------ operation + + private Operation operation(Cursor c, String comment) throws ImportException { + Operation read = new Operation(); + read.setLocation(c.location()); + // Documentation of the operation's own sections may sit between the comment and the + // signature, so it is taken before anything else is decided. + while (c.peek().is("doc")) { + read.getDocumentation().getSections().add(docSection(c, null)); + } + + if (c.accept("replayable")) { + read.setSupportInReplay(true); + } + InteractionPattern pattern = pattern(c); + read.setPattern(pattern); + read.setName(identifier(c)); + c.expect("["); + read.setNumber(number(c)); + c.expect("]"); + + List stages = stagesOf(pattern); + if (c.peek().is("(")) { + read.getMessages().put(stages.get(0), messageBody(c)); + } + + for (int i = 1; i < stages.size(); i++) { + c.expect("->"); + MessageBody body = messageBody(c); + // The repeating update of a progress is marked where it is declared. + c.accept("*"); + read.getMessages().put(stages.get(i), body); + } + + if (c.accept("throws")) { + do { + read.getErrors().add(errorReference(c)); + } while (c.accept(",")); + } + + applyBulkDocumentation(read, comment); + return read; + } + + private InteractionPattern pattern(Cursor c) throws ImportException { + String written = c.expect(Token.Kind.WORD, "an interaction pattern"); + for (InteractionPattern pattern : InteractionPattern.values()) { + if (pattern.name().equalsIgnoreCase(written)) { + return pattern; + } + } + throw c.error("unknown interaction pattern '" + written + "'"); + } + + private MessageBody messageBody(Cursor c) throws ImportException { + MessageBody body = new MessageBody(); + c.expect("("); + if (c.accept(")")) { + return body; + } + do { + String comment = doc(c); + Field field = field(c); + field.setComment(comment); + body.getFields().add(field); + } while (c.accept(",")); + c.expect(")"); + return body; + } + + private ErrorReference errorReference(Cursor c) throws ImportException { + ErrorReference reference = new ErrorReference(); + reference.setLocation(c.location()); + reference.setComment(doc(c)); + reference.setError(errorReference2(c)); + if (c.accept(":")) { + String extraComment = doc(c); + Field extra = new Field(); + extra.setCanBeNull(false); + extra.setComment(extraComment); + extra.setType(typeWithWrappers(c)); + reference.setExtraInformation(extra); + } + return reference; + } + + /** + * Reads the name of an error. + *

                  + * Not a type reference: there is no implicit import for errors, so a name that says no + * area means an error of the area being read. The MAL's errors are named in full + * wherever they are used, exactly as the specifications write them. + */ + private TypeRef errorReference2(Cursor c) throws ImportException { + String first = identifier(c); + String areaName = area == null ? null : area.getName(); + String serviceName = null; + String name = first; + + if (c.accept("::")) { + areaName = first; + name = identifier(c); + } + if (c.accept(".")) { + serviceName = name; + name = identifier(c); + } + return new TypeRef(areaName, 0, serviceName, name, false, false); + } + + /** + * Hands the tagged lines of a bulk documentation block to the things they describe. + *

                  + * Everything before the first tag is the operation's own comment; a line that does not + * begin with a tag continues the one above it, which is what lets a field's + * documentation run to several lines. + */ + private void applyBulkDocumentation(Operation operation, String comment) { + if (comment == null || comment.isEmpty()) { + return; + } + List own = new ArrayList(); + List tagged = new ArrayList(); + String[] current = null; + + for (String line : comment.split("\n", -1)) { + if (line.startsWith("@")) { + current = tag(line); + tagged.add(current); + } else if (current != null) { + // A line under a tag continues it, and continues it as a new line: the text + // it came from had a break there, and the round trip has to give it back. + current[2] = current[2] + "\n" + line; + } else { + own.add(line); + } + } + operation.setComment(trimTrailingBlanks(own)); + + for (String[] parts : tagged) { + applyTag(operation, parts[0], parts[1], parts[2]); + } + } + + /** + * Takes a tag line apart into what it is, what it is about, and what it says. + *

                  + * A tag naming a message is written {@code @submit: what it says}; one naming something + * inside a message is {@code @submitparam name: what it says}. So the tag ends at the + * first colon or space, and where a space came first the subject runs to the colon + * after it - which may itself be preceded by a doubled colon, as in + * {@code @error MAL::UNKNOWN: ...}. + * + * @param line The line, beginning with its tag. + * @return the tag, the subject, and the text. + */ + private static String[] tag(String line) { + int end = 1; + while (end < line.length() && line.charAt(end) != ':' && line.charAt(end) != ' ') { + end++; + } + String name = line.substring(1, end); + String rest = end < line.length() ? line.substring(end) : ""; + + if (rest.startsWith(":")) { + return new String[]{name, "", after(rest.substring(1))}; + } + rest = rest.startsWith(" ") ? rest.substring(1) : rest; + int colon = separator(rest); + if (colon < 0) { + return new String[]{name, subject(rest), ""}; + } + return new String[]{name, subject(rest.substring(0, colon)), + after(rest.substring(colon + 1))}; + } + + /** + * A tag names what it is about the way the rest of the file does, so a name that had to + * be quoted is quoted here too - the MAL calls one of its errors "Read Only". The quotes + * are the writing, not the name, so they come off before anything is matched. + * + * @param text The subject as written. + * @return the subject as named. + */ + private static String subject(String text) { + return text.trim().replace("\"", ""); + } + + /** + * @param text What follows the colon of a tag. + * @return the text with the one space the tag is written with removed, and nothing else: + * some comments in the specifications end in spaces, and a round trip that tidied them + * up would not be a round trip. + */ + private static String after(String text) { + return text.startsWith(" ") ? text.substring(1) : text; + } + + /** + * Gives one tagged line to whatever it describes: a message, a field of one, an error, + * or an error's extra information. + */ + private void applyTag(Operation operation, String tag, String subject, String text) { + if ("error".equals(tag) || "errorinfo".equals(tag)) { + for (ErrorReference reference : operation.getErrors()) { + if (!subject.endsWith(reference.getError().getName())) { + continue; + } + if ("error".equals(tag)) { + reference.setComment(text); + } else if (reference.getExtraInformation() != null) { + reference.getExtraInformation().setComment(text); + } + } + return; + } + + boolean namesAField = tag.endsWith("param"); + String stageName = namesAField + ? tag.substring(0, tag.length() - "param".length()) : tag; + + for (InteractionStage stage : stagesOf(operation.getPattern())) { + if (!tagOf(stage).equals(stageName)) { + continue; + } + MessageBody body = operation.getMessage(stage); + if (body == null) { + continue; + } + if (!namesAField) { + body.setComment(text); + continue; + } + for (Field field : body.getFields()) { + if (subject.equals(field.getName())) { + field.setComment(text); + } + } + } + } + + /** + * Finds the colon that separates what a tag is about from what it says. The subject may + * itself contain a doubled colon - {@code @error MAL::UNKNOWN: ...} - so the first + * single colon is the one that matters. + * + * @param text The part of a tag line after the tag itself. + * @return where the separator is, or -1 if there is none. + */ + private static int separator(String text) { + for (int i = 0; i < text.length(); i++) { + if (text.charAt(i) != ':') { + continue; + } + if (i + 1 < text.length() && text.charAt(i + 1) == ':') { + i++; + continue; + } + return i; + } + return -1; + } + + /** + * Gives one tagged line to whatever it describes: a field of a stage, an error, or an + * error's extra information. + */ + private void applyTag(Operation operation, String tag, String rest) { + int colon = separator(rest); + if (colon < 0) { + return; + } + String subject = rest.substring(0, colon).trim(); + // Only the one space the tag is written with is removed. What follows is the text + // as it was, trailing spaces included: some comments in the specifications end in + // them, and a round trip that tidied them up would not be a round trip. + String text = rest.substring(colon + 1); + if (text.startsWith(" ")) { + text = text.substring(1); + } + + if ("error".equals(tag) || "errorinfo".equals(tag)) { + for (ErrorReference reference : operation.getErrors()) { + if (!subject.endsWith(reference.getError().getName())) { + continue; + } + if ("error".equals(tag)) { + reference.setComment(text); + } else if (reference.getExtraInformation() != null) { + reference.getExtraInformation().setComment(text); + } + } + return; + } + if (!tag.endsWith("param")) { + for (InteractionStage stage : stagesOf(operation.getPattern())) { + MessageBody body = operation.getMessage(stage); + if (tagOf(stage).equals(tag) && body != null) { + // The tag names the stage and nothing within it, so what it says is + // what the message itself says. + body.setComment(subject.isEmpty() ? text : subject + ":" + text); + } + } + return; + } + String stageName = tag.substring(0, tag.length() - "param".length()); + for (InteractionStage stage : stagesOf(operation.getPattern())) { + if (!tagOf(stage).equals(stageName)) { + continue; + } + MessageBody body = operation.getMessage(stage); + if (body == null) { + continue; + } + for (Field field : body.getFields()) { + if (subject.equals(field.getName())) { + field.setComment(text); + } + } + } + } + + // ------------------------------------------------------------ datatypes + + private TypeDefinition dataType(Cursor c, String comment) throws ImportException { + if (c.peek().is("fundamental")) { + return fundamental(c, comment); + } + if (c.peek().is("attribute")) { + return attribute(c, comment); + } + if (c.peek().is("enumeration")) { + return enumeration(c, comment); + } + if (c.peek().is("composite") || c.peek().is("abstract")) { + return composite(c, comment); + } + throw c.error("expected a declaration"); + } + + private FundamentalType fundamental(Cursor c, String comment) throws ImportException { + FundamentalType type = new FundamentalType(); + type.setLocation(c.location()); + c.expect("fundamental"); + type.setComment(comment); + type.setName(identifier(c)); + if (c.accept("extends")) { + type.setSuperType(typeReference(c)); + } + return type; + } + + private AttributeType attribute(Cursor c, String comment) throws ImportException { + AttributeType type = new AttributeType(); + type.setLocation(c.location()); + c.expect("attribute"); + type.setComment(comment); + type.setName(identifier(c)); + c.expect("["); + type.setShortFormPart(number(c)); + c.expect("]"); + return type; + } + + private EnumerationType enumeration(Cursor c, String comment) throws ImportException { + EnumerationType type = new EnumerationType(); + type.setLocation(c.location()); + c.expect("enumeration"); + type.setComment(comment); + type.setName(identifier(c)); + c.expect("["); + type.setShortFormPart(number(c)); + c.expect("]"); + c.expect("{"); + while (!c.accept("}")) { + String itemComment = doc(c); + EnumerationItem item = new EnumerationItem(); + item.setLocation(c.location()); + item.setComment(itemComment); + item.setValue(identifier(c)); + c.expect("["); + item.setNumericValue(number(c)); + c.expect("]"); + type.getItems().add(item); + } + return type; + } + + private CompositeType composite(Cursor c, String comment) throws ImportException { + CompositeType type = new CompositeType(); + type.setLocation(c.location()); + // Abstractness is not stored: a composite is abstract exactly when it has no short + // form, so the keyword says again what the missing [n] already says. It is accepted + // because it reads better, and checked against the number below. + boolean saidAbstract = c.accept("abstract"); + c.expect("composite"); + type.setComment(comment); + type.setName(identifier(c)); + if (c.accept("[")) { + type.setShortFormPart(number(c)); + c.expect("]"); + } + if (saidAbstract != type.isAbstract()) { + throw c.error(saidAbstract + ? "'" + type.getName() + "' is declared abstract but has a short form" + : "'" + type.getName() + "' has no short form, so it is abstract and" + + " has to say so"); + } + if (c.accept("extends")) { + type.setSuperType(typeReference(c)); + } + c.expect("{"); + while (!c.accept("}")) { + String fieldComment = doc(c); + Field field = field(c); + field.setComment(fieldComment); + type.getFields().add(field); + } + return type; + } + + private ErrorDefinition errorDefinition(Cursor c, String comment) throws ImportException { + ErrorDefinition error = new ErrorDefinition(); + error.setLocation(c.location()); + c.expect("error"); + error.setComment(comment); + error.setName(identifier(c)); + c.expect("["); + error.setNumber(number(c)); + c.expect("]"); + return error; + } + + // ------------------------------------------------------------------ com + + private COMFeatures com(Cursor c) throws ImportException { + COMFeatures com = new COMFeatures(); + c.expect("com"); + c.expect("{"); + while (!c.accept("}")) { + String comment = doc(c); + if (c.peek().is("diagram")) { + com.getDocumentation().getDiagrams().add(diagram(c)); + } else if (c.peek().is("doc")) { + com.getDocumentation().getSections().add(docSection(c, comment)); + } else if (c.accept("objects")) { + com.setDeclaresObjects(true); + com.setObjectsComment(comment); + c.expect("{"); + while (!c.accept("}")) { + com.getObjects().add(comObject(c, "object")); + } + } else if (c.accept("events")) { + com.setDeclaresEvents(true); + com.setEventsComment(comment); + c.expect("{"); + while (!c.accept("}")) { + com.getEvents().add(comObject(c, "event")); + } + } else if (c.accept("archiveUsage")) { + com.setDeclaresArchiveUsage(true); + com.setArchiveUsage(comment); + } else if (c.accept("activityUsage")) { + com.setDeclaresActivityUsage(true); + com.setActivityUsage(comment); + } else { + throw c.error("expected a COM declaration"); + } + } + return com; + } + + private COMObject comObject(Cursor c, String keyword) throws ImportException { + String comment = doc(c); + COMObject object = new COMObject(); + object.setLocation(c.location()); + c.expect(keyword); + object.setComment(comment); + object.setName(identifier(c)); + c.expect("["); + object.setNumber(number(c)); + c.expect("]"); + if (c.accept("(")) { + object.setBodyType(typeWithWrappers(c)); + c.expect(")"); + } + if (!c.accept("{")) { + return object; + } + while (!c.accept("}")) { + String linkComment = doc(c); + if (c.accept("related")) { + object.setRelated(objectLink(c, linkComment)); + } else if (c.accept("source")) { + object.setSource(objectLink(c, linkComment)); + } else { + throw c.error("expected 'related' or 'source'"); + } + } + return object; + } + + /** + * A link to another COM object, named by number so that it round-trips whether or not + * the area it points into is loaded. + */ + private ObjectLink objectLink(Cursor c, String comment) throws ImportException { + ObjectLink link = new ObjectLink(); + link.setComment(comment); + if (c.accept("-")) { + return link; + } + String targetArea = area.getName(); + String targetService = null; + if (c.peek(1).is("::")) { + targetArea = identifier(c); + c.expect("::"); + } + if (!c.peek().is("#")) { + targetService = identifier(c); + } + c.expect("#"); + // No version: the XML does not carry one on an object reference either, and the + // linker is what decides which generation a reference means. + link.setTarget(new ObjectReference(targetArea, 0, targetService, number(c))); + return link; + } + + // ------------------------------------------------------------ the small + + private DocSection docSection(Cursor c, String comment) throws ImportException { + DocSection section = new DocSection(); + section.setLocation(c.location()); + c.expect("doc"); + section.setName(c.expect(Token.Kind.STRING, "the name of the section")); + c.expect("["); + section.setOrder(number(c)); + c.expect("]"); + if (c.peek().getKind() == Token.Kind.TEXT) { + section.setContent(c.take().getText()); + } + return section; + } + + private Diagram diagram(Cursor c) throws ImportException { + Diagram diagram = new Diagram(); + diagram.setLocation(c.location()); + c.expect("diagram"); + diagram.setName(identifier(c)); + // The sidecar is named after the diagram, so the file name says nothing the name + // does not; it is read and discarded so that the two cannot disagree. + c.expect(Token.Kind.STRING, "the name of the sidecar file"); + return diagram; + } + + private Field field(Cursor c) throws ImportException { + Field field = new Field(); + field.setLocation(c.location()); + field.setType(typeWithWrappers(c)); + field.setCanBeNull(c.accept("?")); + field.setName(identifier(c)); + return field; + } + + /** + * Reads a type with whatever wrappers are around it: {@code List>}. + */ + private TypeRef typeWithWrappers(Cursor c) throws ImportException { + boolean list = false; + boolean objectRef = false; + if (c.peek().is("List") && c.peek(1).is("<")) { + c.take(); + c.take(); + list = true; + } + if (c.peek().is("ObjectRef") && c.peek(1).is("<")) { + c.take(); + c.take(); + objectRef = true; + } + TypeRef named = typeReference(c); + if (objectRef) { + c.expect(">"); + } + if (list) { + c.expect(">"); + } + return new TypeRef(named.getArea(), named.getAreaVersion(), named.getService(), + named.getName(), list, objectRef); + } + + /** + * Reads a name, with whatever of the area and service it says. What it leaves out is + * taken from where it is written, and a name that says nothing at all and is not + * declared here means the MAL's - the language imports those implicitly. + */ + private TypeRef typeReference(Cursor c) throws ImportException { + String first = identifier(c); + String areaName = null; + String serviceName = null; + String name = first; + + if (c.accept("::")) { + areaName = first; + name = identifier(c); + if (c.accept(".")) { + serviceName = name; + name = identifier(c); + } + } else if (c.accept(".")) { + serviceName = first; + name = identifier(c); + } + + if (areaName == null && serviceName != null) { + // A name that says a service says this area: another area's service is always + // written with its area in front of it. + areaName = area.getName(); + } else if (areaName == null) { + areaName = declaredHere(name) ? area.getName() : "MAL"; + if (serviceName == null && declaredHere(name) && service != null + && declaredByService(name)) { + serviceName = service.getName(); + } + } + return new TypeRef(areaName, 0, serviceName, name, false, false); + } + + /** + * @return true if the area or the service being read declares a type of this name, in + * which case an unqualified name means that one rather than the MAL's. + */ + private boolean declaredHere(String name) { + return declaredByArea(name) || declaredByService(name); + } + + private boolean declaredByArea(String name) { + return area != null && declaredIn(area.getName(), name); + } + + private boolean declaredByService(String name) { + return area != null && service != null + && declaredIn(area.getName() + "." + service.getName(), name); + } + + private boolean declaredIn(String scope, String name) { + Set names = declared.get(scope); + return names != null && names.contains(name); + } + + /** + * @return the documentation attached to whatever comes next, or null if there is none. + */ + private String doc(Cursor c) { + return c.peek().getKind() == Token.Kind.DOC ? c.take().getText() : null; + } + + /** + * @return a name, which may be quoted where it would otherwise read as a keyword. + */ + private String identifier(Cursor c) throws ImportException { + if (c.peek().getKind() == Token.Kind.STRING) { + return c.take().getText(); + } + return c.expect(Token.Kind.WORD, "a name"); + } + + private int number(Cursor c) throws ImportException { + return Integer.parseInt(c.expect(Token.Kind.NUMBER, "a number")); + } + + private static String trimTrailingBlanks(List lines) { + while (!lines.isEmpty() && lines.get(lines.size() - 1).trim().isEmpty()) { + lines.remove(lines.size() - 1); + } + if (lines.isEmpty()) { + return null; + } + StringBuilder buf = new StringBuilder(); + for (int i = 0; i < lines.size(); i++) { + buf.append(i == 0 ? "" : "\n").append(lines.get(i)); + } + return buf.toString(); + } + + /** + * The stages an interaction exchanges, in the order they are written. + */ + private static List stagesOf(InteractionPattern pattern) { + List stages = new ArrayList(); + switch (pattern) { + case SEND: + stages.add(InteractionStage.SEND); + break; + case SUBMIT: + stages.add(InteractionStage.SUBMIT); + break; + case REQUEST: + stages.add(InteractionStage.REQUEST); + stages.add(InteractionStage.RESPONSE); + break; + case INVOKE: + stages.add(InteractionStage.INVOKE); + stages.add(InteractionStage.ACK); + stages.add(InteractionStage.RESPONSE); + break; + case PROGRESS: + stages.add(InteractionStage.PROGRESS); + stages.add(InteractionStage.ACK); + stages.add(InteractionStage.UPDATE); + stages.add(InteractionStage.RESPONSE); + break; + case PUBSUB: + stages.add(InteractionStage.SUBSCRIPTION_KEYS); + stages.add(InteractionStage.PUBLISH_NOTIFY); + break; + default: + break; + } + return stages; + } + + private static String tagOf(InteractionStage stage) { + if (stage == InteractionStage.PUBLISH_NOTIFY) { + return "publish"; + } + if (stage == InteractionStage.SUBSCRIPTION_KEYS) { + return "subscriptionkeys"; + } + return stage.name().toLowerCase(); + } + + private static String readAll(Reader in) throws IOException { + StringBuilder buf = new StringBuilder(); + char[] chunk = new char[8192]; + int read; + while ((read = in.read(chunk)) != -1) { + buf.append(chunk, 0, read); + } + return buf.toString(); + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/importers/mospec/Token.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/importers/mospec/Token.java new file mode 100644 index 00000000..6806e702 --- /dev/null +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/importers/mospec/Token.java @@ -0,0 +1,77 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.importers.mospec; + +/** + * One token of a MOSpec file, with where it was found. + */ +public final class Token { + + /** + * What kind of thing a token is. The language is keyword-led and brace-delimited, so + * the kinds are few: a word, a number, a piece of text, a piece of punctuation, or the + * documentation attached to whatever comes next. + */ + public enum Kind { + WORD, NUMBER, STRING, TEXT, PUNCTUATION, DOC, END + } + + private final Kind kind; + private final String text; + private final int line; + private final int column; + + public Token(Kind kind, String text, int line, int column) { + this.kind = kind; + this.text = text; + this.line = line; + this.column = column; + } + + public Kind getKind() { + return kind; + } + + public String getText() { + return text; + } + + public int getLine() { + return line; + } + + public int getColumn() { + return column; + } + + /** + * @param expected The word or punctuation to test for. + * @return true if this token is exactly that. + */ + public boolean is(String expected) { + return expected.equals(text); + } + + @Override + public String toString() { + return kind + " '" + text + "' at " + line + ":" + column; + } +} diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/importers/xml/StaxCursor.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/importers/xml/StaxCursor.java index 96b8cccf..c7e1dbdb 100644 --- a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/importers/xml/StaxCursor.java +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/importers/xml/StaxCursor.java @@ -220,7 +220,12 @@ public String captureChildren() throws XMLStreamException { switch (event) { case XMLStreamConstants.START_ELEMENT: depth++; - writeStart(out); + // The outermost element carries the namespace it was written in, so + // that what comes out is a document in its own right rather than a + // fragment that only means something back where it came from. A + // diagram is captured here and rendered elsewhere, and a drawing whose + // namespace was dropped renders as an empty picture. + writeStart(out, !wrote); wrote = true; break; case XMLStreamConstants.END_ELEMENT: @@ -242,8 +247,12 @@ public String captureChildren() throws XMLStreamException { return wrote ? out.toString() : null; } - private void writeStart(StringWriter out) { + private void writeStart(StringWriter out, boolean outermost) { out.write("<" + in.getLocalName()); + String namespace = in.getNamespaceURI(); + if (outermost && namespace != null && !namespace.isEmpty()) { + out.write(" xmlns=\"" + escapeAttr(namespace) + "\""); + } for (int i = 0; i < in.getAttributeCount(); i++) { out.write(" " + in.getAttributeLocalName(i) + "=\"" + escapeAttr(in.getAttributeValue(i)) + "\""); diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/importers/xml/XmlImporter.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/importers/xml/XmlImporter.java index 65ed9fd2..2d57d44a 100644 --- a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/importers/xml/XmlImporter.java +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/importers/xml/XmlImporter.java @@ -446,15 +446,19 @@ private COMFeatures readComFeatures(StaxCursor c) throws XMLStreamException { while (c.nextChild()) { String name = c.localName(); if ("objects".equals(name)) { + com.setDeclaresObjects(true); com.setObjectsComment(c.comment()); readComObjects(c, com.getObjects()); } else if ("events".equals(name)) { + com.setDeclaresEvents(true); com.setEventsComment(c.comment()); readComObjects(c, com.getEvents()); } else if ("archiveUsage".equals(name)) { + com.setDeclaresArchiveUsage(true); com.setArchiveUsage(c.comment()); c.skip(); } else if ("activityUsage".equals(name)) { + com.setDeclaresActivityUsage(true); com.setActivityUsage(c.comment()); c.skip(); } else if ("documentation".equals(name)) { diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/link/Linker.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/link/Linker.java index 045afbfe..a209b91c 100644 --- a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/link/Linker.java +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/link/Linker.java @@ -82,12 +82,12 @@ public ValidationResult link(MOModel model) { } private void linkArea(MOModel model, Area area, int malVersion, ValidationResult result) { - linkTypes(model, area, area.getDataTypes(), malVersion, result); + linkTypes(model, area, null, area.getDataTypes(), malVersion, result); for (ErrorDefinition error : area.getErrors()) { linkField(model, area, error.getExtraInformation(), result); } for (Service service : area.getServices()) { - linkTypes(model, area, service.getDataTypes(), malVersion, result); + linkTypes(model, area, service, service.getDataTypes(), malVersion, result); for (ErrorDefinition error : service.getErrors()) { linkField(model, area, error.getExtraInformation(), result); } @@ -100,10 +100,16 @@ private void linkArea(MOModel model, Area area, int malVersion, ValidationResult } } - private void linkTypes(MOModel model, Area area, List types, - int malVersion, ValidationResult result) { + /** + * @param service The service that declares these types, or null where the area does. + * A type knows which of the two it belongs to because where it is declared is part of + * what it is: two services of one area may each declare a type of the same name. + */ + private void linkTypes(MOModel model, Area area, Service service, + List types, int malVersion, ValidationResult result) { for (TypeDefinition type : types) { type.setArea(area); + type.setService(service); if (type instanceof CompositeType) { CompositeType composite = (CompositeType) type; if (composite.getSuperType() == null) { diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/MOModel.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/MOModel.java index 4d70a258..40f5cce7 100644 --- a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/MOModel.java +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/MOModel.java @@ -22,6 +22,7 @@ import esa.mo.apigen.model.com.COMObject; import esa.mo.apigen.model.com.ObjectReference; +import esa.mo.apigen.model.types.CompositeType; import esa.mo.apigen.model.types.TypeDefinition; import esa.mo.apigen.model.types.TypeRef; import java.util.ArrayList; @@ -177,7 +178,7 @@ public Area findUniqueArea(String name) { /** * Resolves a type reference to the type it names. * - * @param ref The reference, already linked. + * @param reference The reference, already linked. * @return the type definition, or null if it cannot be resolved. */ public TypeDefinition resolve(TypeRef reference) { @@ -196,6 +197,45 @@ public TypeDefinition resolve(TypeRef reference) { return service == null ? null : findType(service.getDataTypes(), ref.getName()); } + /** + * Returns the fields a composite inherits, outermost ancestor first, followed by the + * ones its immediate parent declares. + *

                  + * A composite extending the MAL's Object contributes one field that is not written + * anywhere: the schema declares Object as a fundamental, so it has no fields to read, + * but an MO Object is by definition something with an identity. That identity is + * named here rather than in each generator that has to show it. + * + * @param composite The composite whose ancestry is wanted. + * @return the inherited fields, empty if it extends nothing but Composite. + */ + public List inheritedFields(CompositeType composite) { + List inherited = new ArrayList(); + TypeRef parent = composite.getSuperType(); + + if (parent == null || "Composite".equals(parent.getName())) { + return inherited; + } + if ("MAL".equals(parent.getArea()) && "Object".equals(parent.getName())) { + Field identity = new Field(); + identity.setName("objectIdentity"); + identity.setComment("The identity of the MO Object."); + identity.setCanBeNull(false); + identity.setType(new TypeRef("MAL", parent.getAreaVersion(), null, + "ObjectIdentity", false, false)); + inherited.add(identity); + return inherited; + } + + TypeDefinition resolved = resolve(parent); + if (resolved instanceof CompositeType) { + CompositeType above = (CompositeType) resolved; + inherited.addAll(inheritedFields(above)); + inherited.addAll(above.getFields()); + } + return inherited; + } + private static TypeDefinition findType(List types, String name) { for (TypeDefinition type : types) { if (type.getName() != null && type.getName().equals(name)) { diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/com/COMFeatures.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/com/COMFeatures.java index 0218e082..832ed4cc 100644 --- a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/com/COMFeatures.java +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/model/com/COMFeatures.java @@ -36,6 +36,14 @@ public final class COMFeatures { private String objectsComment; private String eventsComment; private final List objects = new ArrayList(); + + private boolean declaresObjects = false; + + private boolean declaresEvents = false; + + private boolean declaresArchiveUsage = false; + + private boolean declaresActivityUsage = false; private final List events = new ArrayList(); private String archiveUsage; private String activityUsage; @@ -57,6 +65,60 @@ public void setEventsComment(String eventsComment) { this.eventsComment = eventsComment; } + /** + * Returns true if the service wrote an objects section, whether or not it listed any. + *

                  + * Kept apart from the list itself: a service that declares the section and nothing in + * it is still saying something about how it uses the COM, and the documents say so. + * + * @return true if the section was declared. + */ + public boolean declaresObjects() { + return declaresObjects; + } + + public void setDeclaresObjects(boolean declaresObjects) { + this.declaresObjects = declaresObjects; + } + + /** + * @return true if the service wrote an events section, whether or not it listed any. + */ + public boolean declaresEvents() { + return declaresEvents; + } + + public void setDeclaresEvents(boolean declaresEvents) { + this.declaresEvents = declaresEvents; + } + + /** + * Returns true if the service said how it uses the COM archive, whatever it said. + *

                  + * Kept apart from the text, which is the whole content of that statement: a format that + * leaves documentation out still has to record that the statement was made. + * + * @return true if the section was declared. + */ + public boolean declaresArchiveUsage() { + return declaresArchiveUsage; + } + + public void setDeclaresArchiveUsage(boolean declaresArchiveUsage) { + this.declaresArchiveUsage = declaresArchiveUsage; + } + + /** + * @return true if the service said how it uses the COM activity tracking. + */ + public boolean declaresActivityUsage() { + return declaresActivityUsage; + } + + public void setDeclaresActivityUsage(boolean declaresActivityUsage) { + this.declaresActivityUsage = declaresActivityUsage; + } + public List getObjects() { return objects; } diff --git a/api-generator/api-generator-lib/src/main/resources/docx/content-types.xml b/api-generator/api-generator-lib/src/main/resources/docx/content-types.xml new file mode 100644 index 00000000..fbe325d6 --- /dev/null +++ b/api-generator/api-generator-lib/src/main/resources/docx/content-types.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/api-generator/api-generator-lib/src/main/resources/docx/numbering-instance.xml b/api-generator/api-generator-lib/src/main/resources/docx/numbering-instance.xml new file mode 100644 index 00000000..07e17571 --- /dev/null +++ b/api-generator/api-generator-lib/src/main/resources/docx/numbering-instance.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/api-generator/api-generator-lib/src/main/resources/docx/numbering-preamble.xml b/api-generator/api-generator-lib/src/main/resources/docx/numbering-preamble.xml new file mode 100644 index 00000000..a8b8d5fe --- /dev/null +++ b/api-generator/api-generator-lib/src/main/resources/docx/numbering-preamble.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/api-generator/api-generator-lib/src/main/resources/docx/package.rels b/api-generator/api-generator-lib/src/main/resources/docx/package.rels new file mode 100644 index 00000000..d6637f3e --- /dev/null +++ b/api-generator/api-generator-lib/src/main/resources/docx/package.rels @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/api-generator/api-generator-lib/src/main/resources/docx/styles-calibri.xml b/api-generator/api-generator-lib/src/main/resources/docx/styles-calibri.xml new file mode 100644 index 00000000..297102cb --- /dev/null +++ b/api-generator/api-generator-lib/src/main/resources/docx/styles-calibri.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/api-generator/api-generator-lib/src/main/resources/docx/styles-ccsds.xml b/api-generator/api-generator-lib/src/main/resources/docx/styles-ccsds.xml new file mode 100644 index 00000000..8923684a --- /dev/null +++ b/api-generator/api-generator-lib/src/main/resources/docx/styles-ccsds.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/api-generator/api-generator-lib/src/main/resources/docx/styles-times-mo-table.xml b/api-generator/api-generator-lib/src/main/resources/docx/styles-times-mo-table.xml new file mode 100644 index 00000000..a4392ff8 --- /dev/null +++ b/api-generator/api-generator-lib/src/main/resources/docx/styles-times-mo-table.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/api-generator/api-generator-lib/src/main/resources/docx/styles-times.xml b/api-generator/api-generator-lib/src/main/resources/docx/styles-times.xml new file mode 100644 index 00000000..72417126 --- /dev/null +++ b/api-generator/api-generator-lib/src/main/resources/docx/styles-times.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/api-generator/api-generator-lib/src/main/resources/docx/styles.xml b/api-generator/api-generator-lib/src/main/resources/docx/styles.xml new file mode 100644 index 00000000..ee967ee1 --- /dev/null +++ b/api-generator/api-generator-lib/src/main/resources/docx/styles.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/api-generator/api-generator-lib/src/main/resources/xhtml/page.css b/api-generator/api-generator-lib/src/main/resources/xhtml/page.css new file mode 100644 index 00000000..b7135c51 --- /dev/null +++ b/api-generator/api-generator-lib/src/main/resources/xhtml/page.css @@ -0,0 +1,93 @@ +/* The page describes a specification that is read rather than skimmed, so the measure is + held short enough to read and the drawings are allowed the full width they need. */ + +body { + font-family: Georgia, "Times New Roman", serif; + font-size: 15px; + line-height: 1.55; + color: #1a1a1a; + background: #ffffff; + margin: 0 auto; + padding: 2em 3em 6em 3em; + max-width: 62em; +} + +h1, h2, h3, h4, h5 { + font-family: Verdana, Arial, sans-serif; + color: #123a5e; + line-height: 1.3; +} + +h1 { + font-size: 1.7em; + border-bottom: 2px solid #123a5e; + padding-bottom: 0.2em; + margin-top: 1.8em; +} + +h2 { + font-size: 1.35em; + margin-top: 1.6em; +} + +h3 { + font-size: 1.1em; + margin-top: 1.5em; +} + +h4 { + font-size: 0.95em; + margin-top: 1.3em; + color: #3c3c3c; +} + +/* A field name introduces the description under it, so it sits tight against it. */ +h5 { + font-size: 0.9em; + margin: 1em 0 0 0; + color: #123a5e; +} + +h5 + p { + margin-top: 0.2em; +} + +a { + color: #14507f; +} + +/* A drawing is as wide as the message it draws, which can be a good deal wider than the + text; it scrolls in its own right rather than widening the page. */ +p.diagram { + overflow-x: auto; + max-width: 100%; + margin: 1.2em 0; +} + +div.index { + background: #f4f6f8; + border-left: 3px solid #123a5e; + padding: 0.1em 1.2em 0.8em 1.2em; + margin: 1.2em 0; +} + +div.index h1, div.index h2, div.index h3 { + border: none; + font-size: 1em; + margin-top: 0.8em; + padding-bottom: 0; +} + +div.index ul { + columns: 4 12em; + list-style: none; + padding-left: 0; + margin: 0.3em 0 0 0; +} + +div.index li { + margin: 0.15em 0; + font-family: Verdana, Arial, sans-serif; + font-size: 0.85em; + break-inside: avoid; +} diff --git a/api-generator/api-generator-lib/src/test/java/esa/mo/apigen/generators/docx/DocxBodyTest.java b/api-generator/api-generator-lib/src/test/java/esa/mo/apigen/generators/docx/DocxBodyTest.java new file mode 100644 index 00000000..972ac30e --- /dev/null +++ b/api-generator/api-generator-lib/src/test/java/esa/mo/apigen/generators/docx/DocxBodyTest.java @@ -0,0 +1,190 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.generators.docx; + +import java.io.File; +import java.nio.charset.Charset; +import java.nio.file.Files; +import org.junit.Assume; +import org.junit.Test; +import static org.junit.Assert.assertTrue; + +/** + * The document body, held against the reference output. + *

                  + * Rather than restating what the XML should look like, each test builds a fragment and + * checks that the captured document contains it word for word. A fragment that is right in + * isolation but wrong in place would pass the first kind of test and fail this one. + */ +public class DocxBodyTest { + + private static final Charset UTF8 = Charset.forName("UTF-8"); + + private static final String SHADE = "00CCFF"; + + /** + * @return a captured document, or null if the baseline has not been taken. + */ + private static String reference(String document) throws Exception { + File here = new File(System.getProperty("user.dir")).getAbsoluteFile(); + while (here != null && !new File(here, "xml-service-specifications").isDirectory()) { + here = here.getParentFile(); + } + if (here == null) { + return null; + } + File file = new File(here, "api-generator/golden/baseline/docx/prototypes/" + + document + "/word/document.xml"); + return file.isFile() ? new String(Files.readAllBytes(file.toPath()), UTF8) : null; + } + + /** + * A captioned table with a shaded, centred header row - the shape almost every table in + * these documents starts with. + */ + @Test + public void aCaptionedTableWithAHeaderRowMatchesTheReference() throws Exception { + String document = reference("Service_Specification_area009-v001-MPD"); + Assume.assumeNotNull("baseline not captured; run api-generator/golden/golden.sh capture", + document); + + DocxBody body = new DocxBody(); + DocxTable table = body.table(new int[]{2250, 2801, 1382, 1185, 1382}, + "ProductRetrieval Service Operations"); + table.row() + .cell("Area Identifier").shaded(SHADE).centered().next() + .cell("Service Identifier").shaded(SHADE).centered().next() + .cell("Area Number").shaded(SHADE).centered().next() + .cell("Service Number").shaded(SHADE).centered().next() + .cell("Area Version").shaded(SHADE).centered().endRow(); + + assertTrue("the caption, the table and its header row have to appear as written", + document.contains(body.toXml())); + } + + /** + * A figure caption is the same construction as a table caption, with two words changed. + * Software Management is the specification that carries diagrams. + */ + @Test + public void aFigureCaptionMatchesTheReference() throws Exception { + String document = reference("Service_Specification_area007-v001-SoftwareManagement"); + Assume.assumeNotNull("baseline not captured", document); + + int start = document.indexOf("" + + "" + + DocxTypeLink.forField(area, null, field) + "")); + } + + /** + * A name that links to something other than a type - an operation, say - goes through + * the same construction with the bookmark named directly. + */ + @Test + public void aLinkToAnOperationMatchesTheReference() throws Exception { + String document = reference("Service_Specification_area009-v001-MPD"); + Assume.assumeNotNull("baseline not captured", document); + + assertTrue("the operation link has to appear as written", document.contains( + DocxTypeLink.hyperlink("", "listProducts", "", + "OPERATION_1_listProducts", true))); + } + + /** + * @return the name of the first figure in the document, read back out of its bookmark. + */ + private static String firstFigureName(String document) { + String marker = " + * A document that starts no numbered list still carries the two numberings the preamble + * defines, so the MAL specifications - which have no such list - pin the fixed part exactly. + */ +public class DocxNumberingTest { + + private static final Charset UTF8 = Charset.forName("UTF-8"); + + /** + * @return the captured numbering part of a document, or null if the baseline has not + * been taken. + */ + private static File baseline(String document) { + File here = new File(System.getProperty("user.dir")).getAbsoluteFile(); + while (here != null && !new File(here, "xml-service-specifications").isDirectory()) { + here = here.getParentFile(); + } + if (here == null) { + return null; + } + File file = new File(here, "api-generator/golden/baseline/docx/prototypes/" + + document + "/word/numbering.xml"); + return file.isFile() ? file : null; + } + + @Test + public void aDocumentWithNoListsCarriesOnlyTheFixedNumbering() throws Exception { + File expected = baseline("Service_Specification_area001-v001-MAL"); + Assume.assumeNotNull("baseline not captured; run api-generator/golden/golden.sh capture", + expected); + + String reference = new String(Files.readAllBytes(expected.toPath()), UTF8); + assertEquals(reference, new DocxNumbering().toXml()); + } + + /** + * Each list asked for gets a numbering of its own, so that one list does not carry on + * counting where the last one stopped. + */ + @Test + public void everyListAskedForGetsItsOwnNumbering() throws Exception { + DocxNumbering numbering = new DocxNumbering(); + assertEquals(2, numbering.nextInstance()); + assertEquals(3, numbering.nextInstance()); + + String xml = numbering.toXml(); + assertTrue("the definition of the second list has to be there", + xml.contains("")); + assertTrue("and the instance that refers to it", + xml.contains("")); + } +} diff --git a/api-generator/golden/README.md b/api-generator/golden/README.md index ec4a5481..117b391c 100644 --- a/api-generator/golden/README.md +++ b/api-generator/golden/README.md @@ -16,6 +16,16 @@ The baseline lives in `baseline/` (override with `GOLDEN_BASELINE=/some/path`) a it is ~20 MB and regenerable. Full diffs are written to `last-diff.txt`; the console shows a per-file summary. +**What else reads the baseline.** `testbeds/testbed-api-generator` holds the JUnit side — the +golden-tree tests that generate with `api-generator-lib` and compare against `baseline/`, so +capturing one here is what makes them run rather than skip: + +``` +cd testbeds/testbed-api-generator && mvn test +``` + +Without a baseline those tests skip, which is also what happens in CI (DESIGN.md §10.8). + ## What it captures | | | diff --git a/api-generator/golden/intended-differences.txt b/api-generator/golden/intended-differences.txt index 2da0c03e..76788a95 100644 --- a/api-generator/golden/intended-differences.txt +++ b/api-generator/golden/intended-differences.txt @@ -6,11 +6,18 @@ # the baseline with ./golden.sh capture, and return the diff to zero — a permanently # fuzzy diff is no safety net, because the next real regression hides in the noise. # -# See api-generator-lib-DESIGN.md §10.1. +# See ../api-generator-lib/DESIGN.md §10.1. # # Format: # # reason — YYYY-MM-DD # # --------------------------------------------------------------------------- -# (none yet) +# (none) +# +# There was one, and it was fixed rather than tolerated: the existing generator documented +# an error under the number of another area's error of the same name, because it looked +# errors up by name alone across every specification loaded. MPS's INVALID was documented +# as COM's 70000 and MC v002's Invalid as MPD's 1, while the XML says 1 and 3 and the +# generated Java has always said 1 and 3. MOTypeRegistry now holds an error under its area +# as well as its name, both generators agree, and the baseline was re-captured. - 2026-08-22 diff --git a/api-generator/pom.xml b/api-generator/pom.xml index ec3c1074..782ee33d 100644 --- a/api-generator/pom.xml +++ b/api-generator/pom.xml @@ -66,6 +66,7 @@ + api-generator-lib generator-interfaces generator-java generator-docs diff --git a/parent/pom.xml b/parent/pom.xml index 2fa8ce6d..95fdcc9b 100644 --- a/parent/pom.xml +++ b/parent/pom.xml @@ -116,6 +116,11 @@ generator-java ${esa.mo.version} + + int.esa.ccsds.mo + api-generator-lib + ${esa.mo.version} + int.esa.ccsds.mo diff --git a/testbeds/pom.xml b/testbeds/pom.xml index 7b597e0e..908a9e79 100644 --- a/testbeds/pom.xml +++ b/testbeds/pom.xml @@ -63,6 +63,7 @@ testbed-pom + testbed-api-generator testbed-encoders testbed-util xml-tests diff --git a/testbeds/testbed-api-generator/pom.xml b/testbeds/testbed-api-generator/pom.xml new file mode 100644 index 00000000..2e58f00c --- /dev/null +++ b/testbeds/testbed-api-generator/pom.xml @@ -0,0 +1,98 @@ + + + + + + 4.0.0 + + + int.esa.ccsds.mo + parent + 14.2-SNAPSHOT + ../../parent/pom.xml + + + int.esa.ccsds.mo + testbed-api-generator + jar + 14.2-SNAPSHOT + CCSDS MOIMS MO Testbed API Generator + Holds the api-generator-lib tests that read a corpus: the golden trees, the + corpus walks and the round trips. They live here rather than in the library so that + building the library stays a compile - the same reason every other testbed exists. + See api-generator/api-generator-lib/DESIGN.md, section 10.8. + + + ESA + http://www.esa.int + + + + + The European Space Agency Public License, Version 2.0 + https://raw.githubusercontent.com/esa/mo-services-java/master/LICENCE.md + repo + + + + + scm:git:git@github.com:esa/mo-services-java.git + scm:git:git@github.com:esa/mo-services-java.git + https://github.com/esa/mo-services-java + + + + GitHub + https://github.com/esa/mo-services-java/issues + + + + UTF-8 + + + + + int.esa.ccsds.mo + api-generator-lib + + + junit + junit + test + + + + + + + + org.apache.maven.plugins + maven-install-plugin + + true + + + + org.apache.maven.plugins + maven-deploy-plugin + + true + + + + + diff --git a/testbeds/testbed-api-generator/src/test/java/esa/mo/apigen/exporters/mospec/MOSpecRoundTripTest.java b/testbeds/testbed-api-generator/src/test/java/esa/mo/apigen/exporters/mospec/MOSpecRoundTripTest.java new file mode 100644 index 00000000..69818e30 --- /dev/null +++ b/testbeds/testbed-api-generator/src/test/java/esa/mo/apigen/exporters/mospec/MOSpecRoundTripTest.java @@ -0,0 +1,377 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.exporters.mospec; + +import esa.mo.apigen.exporters.xml.ModelComparison; +import esa.mo.apigen.exporters.xml.XmlExporter; +import esa.mo.apigen.importers.mospec.MOSpecImporter; +import esa.mo.apigen.importers.xml.XmlImporter; +import esa.mo.apigen.model.SourceRef; +import esa.mo.apigen.model.Specification; +import java.io.File; +import java.io.FileInputStream; +import java.io.InputStreamReader; +import java.io.Reader; +import java.nio.charset.Charset; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import org.junit.Assume; +import org.junit.Before; +import org.junit.Test; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +/** + * The closure test the format is held to: the grammar must accept everything the exporter + * writes, and what comes back must be what went in. + *

                  + * Run over every specification in the repository, in each mode that claims to preserve the + * model: + *

                  + * xml -> model -> text -> model' -> text'
                  + *       model == model'   nothing was lost
                  + *       text  == text'    the formatting has settled
                  + * 
                  + * With this, "I do not like how the output reads" is a change to the formatter and a run of + * this test, rather than a change to the writer and a patch to the parser. + */ +public class MOSpecRoundTripTest { + + private static final Charset UTF8 = Charset.forName("UTF-8"); + + private List files; + + @Before + public void findCorpus() { + files = corpus(); + Assume.assumeFalse("specifications not found", files.isEmpty()); + } + + /** + * Every specification, in every mode that keeps the model. + */ + @Test + public void everySpecificationSurvivesTheRoundTrip() throws Exception { + List failures = new ArrayList(); + int checked = 0; + + for (DocMode mode : Arrays.asList(DocMode.BULK, DocMode.INLINE)) { + MOSpecExporter exporter = new MOSpecExporter(mode); + for (File file : files) { + Specification original = readXml(file); + + // Written to a directory and read back from it, because that is what a + // MOSpec specification is: the text names its diagrams and the drawings sit + // beside it. Reading the text alone would compare a model that had lost them. + File directory = writeToTemporaryDirectory(exporter, original); + String text = exporter.toText(original); + + Specification reread; + try { + reread = readMOSpec(directory, original); + } catch (Exception ex) { + failures.add(mode + " " + file.getName() + ": did not parse - " + + ex.getMessage()); + continue; + } + + ModelComparison comparison = new ModelComparison(); + comparison.compare(original, reread); + if (!comparison.isEqual()) { + failures.add(mode + " " + file.getName() + ": the model changed - " + + first(comparison.getDifferences())); + } + + String again = exporter.toText(reread); + if (!text.equals(again)) { + failures.add(mode + " " + file.getName() + ": the text changed - " + + firstDifference(text, again)); + } + checked++; + } + } + + assertTrue("no specifications were checked", checked > 0); + if (!failures.isEmpty()) { + fail(failures.size() + " of " + checked + " round trip(s) failed:\n " + + join(failures)); + } + } + + /** + * The mode that strips documentation cannot preserve the model, so it is held to what + * it does claim: the text still parses, and everything that is not documentation comes + * back unchanged. + */ + @Test + public void suppressingDocumentationKeepsEverythingElse() throws Exception { + List failures = new ArrayList(); + MOSpecExporter exporter = new MOSpecExporter(DocMode.SUPPRESS); + + for (File file : files) { + Specification original = readXml(file); + File directory = writeToTemporaryDirectory(exporter, original); + + Specification reread; + try { + reread = readMOSpec(directory, original); + } catch (Exception ex) { + failures.add(file.getName() + ": did not parse - " + ex.getMessage()); + continue; + } + + // Compared against the original with its documentation taken away, which is + // what this mode says it produces. + ModelComparison comparison = new ModelComparison(); + comparison.compare(undocumented(original), reread); + if (!comparison.isEqual()) { + failures.add(file.getName() + ": " + comparison.getDifferences().get(0)); + } + } + if (!failures.isEmpty()) { + fail(failures.size() + " specification(s) lost something other than" + + " documentation:\n " + join(failures)); + } + } + + /** + * @return the specification with every comment and documentation section removed, read + * afresh so that the original is left alone. + */ + private static Specification undocumented(Specification spec) throws Exception { + Specification stripped = readXml(new File(spec.getSource().getLocation())); + stripped.setComment(null); + for (esa.mo.apigen.model.Area area : stripped.getAreas()) { + area.setComment(null); + area.getDocumentation().getSections().clear(); + stripComments(area.getDataTypes()); + for (esa.mo.apigen.model.ErrorDefinition error : area.getErrors()) { + error.setComment(null); + } + for (esa.mo.apigen.model.Service service : area.getServices()) { + service.setComment(null); + service.getDocumentation().getSections().clear(); + stripComments(service.getDataTypes()); + for (esa.mo.apigen.model.ErrorDefinition error : service.getErrors()) { + error.setComment(null); + } + for (esa.mo.apigen.model.CapabilitySet set : service.getCapabilitySets()) { + set.setComment(null); + for (esa.mo.apigen.model.Operation operation : set.getOperations()) { + operation.setComment(null); + operation.getDocumentation().getSections().clear(); + for (esa.mo.apigen.model.MessageBody body + : operation.getMessages().values()) { + body.setComment(null); + for (esa.mo.apigen.model.Field field : body.getFields()) { + field.setComment(null); + } + } + for (esa.mo.apigen.model.ErrorReference error : operation.getErrors()) { + error.setComment(null); + if (error.getExtraInformation() != null) { + error.getExtraInformation().setComment(null); + } + } + } + } + if (service.getCom() != null) { + service.getCom().setObjectsComment(null); + service.getCom().setEventsComment(null); + service.getCom().setArchiveUsage(null); + service.getCom().setActivityUsage(null); + service.getCom().getDocumentation().getSections().clear(); + stripComments(service.getCom().getObjects()); + stripComments(service.getCom().getEvents()); + } + } + } + return stripped; + } + + private static void stripComments(List things) { + for (Object thing : things) { + if (thing instanceof esa.mo.apigen.model.types.TypeDefinition) { + esa.mo.apigen.model.types.TypeDefinition type + = (esa.mo.apigen.model.types.TypeDefinition) thing; + type.setComment(null); + if (type instanceof esa.mo.apigen.model.types.CompositeType) { + for (esa.mo.apigen.model.Field field + : ((esa.mo.apigen.model.types.CompositeType) type).getFields()) { + field.setComment(null); + } + } + if (type instanceof esa.mo.apigen.model.types.EnumerationType) { + for (esa.mo.apigen.model.types.EnumerationItem item + : ((esa.mo.apigen.model.types.EnumerationType) type).getItems()) { + item.setComment(null); + } + } + } + if (thing instanceof esa.mo.apigen.model.com.COMObject) { + esa.mo.apigen.model.com.COMObject object + = (esa.mo.apigen.model.com.COMObject) thing; + object.setComment(null); + if (object.getRelated() != null) { + object.getRelated().setComment(null); + } + if (object.getSource() != null) { + object.getSource().setComment(null); + } + } + } + } + + /** + * The longer trip: out through the text format and back to XML. + *

                  + * This is what makes MOSpec a format the specifications can actually be kept in rather + * than a view of them - what comes back has to be the file that went out. + */ + @Test + public void everySpecificationSurvivesTheTripBackToXml() throws Exception { + List failures = new ArrayList(); + MOSpecExporter exporter = new MOSpecExporter(DocMode.BULK); + + for (File file : files) { + Specification original = readXml(file); + String before = new XmlExporter().toXml(original); + + File directory = writeToTemporaryDirectory(exporter, original); + Specification reread = readMOSpec(directory, original); + String after = new XmlExporter().toXml(reread); + + if (!modernised(before).equals(after)) { + failures.add(file.getName() + ": " + firstDifference(modernised(before), after) + .replace("\n ", "\n ")); + } + } + if (!failures.isEmpty()) { + fail(failures.size() + " specification(s) did not survive:\n " + join(failures)); + } + } + + /** + * Rewrites the older spelling of an object reference into the one MOSpec writes. + *

                  + * A type named {@code ObjectRef(Product)} and a type named {@code Product} carrying the + * objectRef flag mean the same thing, and MOSpec writes the second. Three fields in + * Mission Product Distribution use the first, so their XML comes back modernised - a + * decision taken deliberately, not an accident to be papered over. Applying the same + * rewrite to the original is what lets the test still insist on equality everywhere + * else: any other change to the XML fails. + */ + private static String modernised(String xml) { + return xml.replaceAll("]*?)name=\"ObjectRef\\(([^)]*)\\)\"([^>]*?)/>", + ""); + } + + /** + * Writes a specification into a directory of its own, sidecars and all. + */ + private static File writeToTemporaryDirectory(MOSpecExporter exporter, Specification spec) + throws Exception { + File directory = java.nio.file.Files.createTempDirectory("mospec").toFile(); + directory.deleteOnExit(); + exporter.write(spec, directory.toPath()); + return directory; + } + + /** + * @return the specification read back out of the directory it was written to. + */ + private static Specification readMOSpec(File directory, Specification original) + throws Exception { + String name = original.getAreas().isEmpty() ? "specification" + : original.getAreas().get(0).getName(); + File file = new File(directory, name + ".mospec"); + Reader in = new InputStreamReader(new FileInputStream(file), UTF8); + try { + return new MOSpecImporter().read(in, new SourceRef(file.getName(), file.getPath())); + } finally { + in.close(); + } + } + + /** + * @return the first line the two texts disagree on, which is enough to say what moved. + */ + private static String firstDifference(String one, String other) { + String[] a = one.split("\n", -1); + String[] b = other.split("\n", -1); + for (int i = 0; i < Math.max(a.length, b.length); i++) { + String x = i < a.length ? a[i] : ""; + String y = i < b.length ? b[i] : ""; + if (!x.equals(y)) { + return "line " + (i + 1) + "\n was: " + x + "\n now: " + y; + } + } + return ""; + } + + private static Specification readXml(File file) throws Exception { + Reader in = new InputStreamReader(new FileInputStream(file), UTF8); + try { + return new XmlImporter().read(in, new SourceRef(file.getName(), file.getPath())); + } finally { + in.close(); + } + } + + private static List corpus() { + List all = new ArrayList(); + File here = new File(System.getProperty("user.dir")).getAbsoluteFile(); + while (here != null && !new File(here, "xml-service-specifications").isDirectory()) { + here = here.getParentFile(); + } + if (here == null) { + return all; + } + for (String set : new String[]{"prototypes", "standards"}) { + File dir = new File(here, + "xml-service-specifications/xml-ccsds-mo-" + set + "/src/main/resources/xml"); + File[] found = dir.listFiles(); + if (found == null) { + continue; + } + Arrays.sort(found); + for (File file : found) { + if (file.getName().endsWith(".xml")) { + all.add(file); + } + } + } + return all; + } + + private static String first(List differences) { + return differences.isEmpty() ? "" : differences.get(0); + } + + private static String join(List lines) { + StringBuilder buf = new StringBuilder(); + for (String line : lines) { + buf.append(line).append("\n "); + } + return buf.toString(); + } +} diff --git a/api-generator/api-generator-lib/src/test/java/esa/mo/apigen/exporters/xml/ModelComparison.java b/testbeds/testbed-api-generator/src/test/java/esa/mo/apigen/exporters/xml/ModelComparison.java similarity index 94% rename from api-generator/api-generator-lib/src/test/java/esa/mo/apigen/exporters/xml/ModelComparison.java rename to testbeds/testbed-api-generator/src/test/java/esa/mo/apigen/exporters/xml/ModelComparison.java index c8e2bb87..a11392b2 100644 --- a/api-generator/api-generator-lib/src/test/java/esa/mo/apigen/exporters/xml/ModelComparison.java +++ b/testbeds/testbed-api-generator/src/test/java/esa/mo/apigen/exporters/xml/ModelComparison.java @@ -55,6 +55,24 @@ private void diff(String where, Object a, Object b) { } } + /** + * Compares two types by what they denote rather than by how they were written. + *

                  + * An object reference has two spellings in the corpus - a type named + * {@code ObjectRef(Product)}, and {@code Product} with the objectRef flag - and they + * mean the same thing. A format that writes one of them is not losing anything by not + * writing the other, so the comparison unwraps both before looking at them. The XML + * round trip compares the XML text as well, so a change of spelling there is still + * caught. + */ + private void diff(String where, TypeRef a, TypeRef b) { + TypeRef x = a == null ? null : a.unwrapped(); + TypeRef y = b == null ? null : b.unwrapped(); + if (x == null ? y != null : !x.equals(y)) { + differences.add(where + ": " + a + " != " + b); + } + } + private boolean sizes(String where, List a, List b) { if (a.size() != b.size()) { differences.add(where + ": " + a.size() + " entries != " + b.size()); diff --git a/api-generator/api-generator-lib/src/test/java/esa/mo/apigen/exporters/xml/XmlRoundTripTest.java b/testbeds/testbed-api-generator/src/test/java/esa/mo/apigen/exporters/xml/XmlRoundTripTest.java similarity index 100% rename from api-generator/api-generator-lib/src/test/java/esa/mo/apigen/exporters/xml/XmlRoundTripTest.java rename to testbeds/testbed-api-generator/src/test/java/esa/mo/apigen/exporters/xml/XmlRoundTripTest.java diff --git a/testbeds/testbed-api-generator/src/test/java/esa/mo/apigen/generators/docx/DocxGeneratorGoldenTest.java b/testbeds/testbed-api-generator/src/test/java/esa/mo/apigen/generators/docx/DocxGeneratorGoldenTest.java new file mode 100644 index 00000000..50fc203e --- /dev/null +++ b/testbeds/testbed-api-generator/src/test/java/esa/mo/apigen/generators/docx/DocxGeneratorGoldenTest.java @@ -0,0 +1,259 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.generators.docx; + +import esa.mo.apigen.importers.xml.XmlImporter; +import esa.mo.apigen.link.Linker; +import esa.mo.apigen.model.Area; +import esa.mo.apigen.model.MOModel; +import esa.mo.apigen.model.SourceRef; +import esa.mo.apigen.model.Specification; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.Reader; +import java.nio.charset.Charset; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import org.junit.AfterClass; +import org.junit.Assume; +import org.junit.Test; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.fail; + +/** + * The new document generator held against the documents the existing one produces. + *

                  + * Every specification of a set is loaded, every document is written, and each part of each + * package is compared byte for byte with the captured one. + */ +public class DocxGeneratorGoldenTest { + + private static final Charset UTF8 = Charset.forName("UTF-8"); + + /** + * How many parts of each document may still differ, keyed by set and document. + *

                  + * Empty, and meant to stay that way. It held two entries while the existing generator + * documented an error under another area's number; that was fixed rather than + * reproduced, and the baseline re-captured. + */ + private static final Map REMAINING = new HashMap(); + + private static int matching = 0; + + private static int expected = 0; + + @AfterClass + public static void reportProgress() { + if (expected != 0) { + System.out.println("Golden documents: " + matching + " of " + expected + + " part(s) are identical to the reference output"); + } + } + + @Test + public void prototypes() throws Exception { + check("prototypes"); + } + + @Test + public void standards() throws Exception { + check("standards"); + } + + /** + * Writes every document of a set and compares it with the captured one. + */ + private void check(String set) throws Exception { + File root = repoRoot(); + Assume.assumeNotNull("not inside the repository", root); + File specs = new File(root, "xml-service-specifications/xml-ccsds-mo-" + set + + "/src/main/resources/xml"); + File baseline = new File(root, "api-generator/golden/baseline/docx/" + set); + Assume.assumeTrue("baseline not captured; run api-generator/golden/golden.sh capture", + specs.isDirectory() && baseline.isDirectory()); + + Path out = Files.createTempDirectory("apigen-docx-" + set); + try { + generate(specs, out); + List differences = new ArrayList(); + + for (File document : sorted(baseline)) { + int differing = compare(document, new File(out.toFile(), document.getName()), + differences); + String key = set + "/" + document.getName(); + int budget = REMAINING.containsKey(key) ? REMAINING.get(key) : 0; + if (differing != budget) { + fail(document.getName() + ": " + differing + " part(s) differ from the" + + " baseline, budget is " + budget + "\n " + + join(differences)); + } + } + } finally { + delete(out.toFile()); + } + } + + /** + * Loads every specification of a directory and writes a document for each. + */ + private static void generate(File specs, Path out) throws Exception { + MOModel model = new MOModel(); + List targets = new ArrayList(); + for (File file : sorted(specs)) { + if (!file.getName().endsWith(".xml")) { + continue; + } + Specification spec = read(file); + model.add(spec); + targets.addAll(spec.getAreas()); + } + new Linker().link(model); + new DocxGenerator().generate(model, targets, out); + } + + /** + * @return how many parts of the document differ from the captured one. + */ + private static int compare(File captured, File written, List differences) + throws IOException { + int differing = 0; + for (File part : parts(captured)) { + String relative = captured.toPath().relativize(part.toPath()).toString(); + File other = new File(written, relative); + if (!other.isFile()) { + differences.add("missing: " + captured.getName() + "/" + relative); + differing++; + continue; + } + if (!Arrays.equals(Files.readAllBytes(part.toPath()), + Files.readAllBytes(other.toPath()))) { + differences.add("differs: " + captured.getName() + "/" + relative + + describe(part, other)); + differing++; + } + } + matching += parts(captured).size() - differing; + expected += parts(captured).size(); + return differing; + } + + /** + * @return the first line that differs, which is usually enough to say what changed. + */ + private static String describe(File captured, File written) throws IOException { + if (captured.getName().endsWith(".png")) { + return " (image, " + captured.length() + " vs " + written.length() + " bytes)"; + } + List a = Arrays.asList(new String(Files.readAllBytes(captured.toPath()), UTF8) + .split("\r?\n", -1)); + List b = Arrays.asList(new String(Files.readAllBytes(written.toPath()), UTF8) + .split("\r?\n", -1)); + for (int i = 0; i < Math.max(a.size(), b.size()); i++) { + String x = i < a.size() ? a.get(i) : ""; + String y = i < b.size() ? b.get(i) : ""; + if (!x.equals(y)) { + int cut = 160; + return "\n line " + (i + 1) + " expected: " + + x.substring(0, Math.min(cut, x.length())) + + "\n line " + (i + 1) + " actual: " + + y.substring(0, Math.min(cut, y.length())); + } + } + return ""; + } + + private static List parts(File document) { + List found = new ArrayList(); + collect(document, found); + java.util.Collections.sort(found); + return found; + } + + private static void collect(File dir, List into) { + File[] entries = dir.listFiles(); + if (entries == null) { + return; + } + Arrays.sort(entries); + for (File entry : entries) { + if (entry.isDirectory()) { + collect(entry, into); + } else { + into.add(entry); + } + } + } + + private static List sorted(File dir) { + File[] entries = dir.listFiles(); + if (entries == null) { + return new ArrayList(); + } + Arrays.sort(entries); + return Arrays.asList(entries); + } + + private static Specification read(File file) throws Exception { + Reader in = new InputStreamReader(new FileInputStream(file), UTF8); + try { + return new XmlImporter().read(in, new SourceRef(file.getName(), file.getPath())); + } finally { + in.close(); + } + } + + private static String join(List lines) { + StringBuilder buf = new StringBuilder(); + for (String line : lines) { + buf.append(line).append("\n "); + } + return buf.toString(); + } + + private static File repoRoot() { + File here = new File(System.getProperty("user.dir")).getAbsoluteFile(); + while (here != null) { + if (new File(here, "xml-service-specifications").isDirectory()) { + return here; + } + here = here.getParentFile(); + } + return null; + } + + private static void delete(File file) { + File[] entries = file.listFiles(); + if (entries != null) { + for (File entry : entries) { + delete(entry); + } + } + file.delete(); + } +} diff --git a/api-generator/api-generator-lib/src/test/java/esa/mo/apigen/generators/java/GoldenTree.java b/testbeds/testbed-api-generator/src/test/java/esa/mo/apigen/generators/java/GoldenTree.java similarity index 100% rename from api-generator/api-generator-lib/src/test/java/esa/mo/apigen/generators/java/GoldenTree.java rename to testbeds/testbed-api-generator/src/test/java/esa/mo/apigen/generators/java/GoldenTree.java diff --git a/api-generator/api-generator-lib/src/test/java/esa/mo/apigen/generators/java/JavaGeneratorGoldenTest.java b/testbeds/testbed-api-generator/src/test/java/esa/mo/apigen/generators/java/JavaGeneratorGoldenTest.java similarity index 100% rename from api-generator/api-generator-lib/src/test/java/esa/mo/apigen/generators/java/JavaGeneratorGoldenTest.java rename to testbeds/testbed-api-generator/src/test/java/esa/mo/apigen/generators/java/JavaGeneratorGoldenTest.java diff --git a/testbeds/testbed-api-generator/src/test/java/esa/mo/apigen/generators/xhtml/XhtmlGeneratorCorpusTest.java b/testbeds/testbed-api-generator/src/test/java/esa/mo/apigen/generators/xhtml/XhtmlGeneratorCorpusTest.java new file mode 100644 index 00000000..9bb5c942 --- /dev/null +++ b/testbeds/testbed-api-generator/src/test/java/esa/mo/apigen/generators/xhtml/XhtmlGeneratorCorpusTest.java @@ -0,0 +1,296 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.apigen.generators.xhtml; + +import esa.mo.apigen.importers.xml.XmlImporter; +import esa.mo.apigen.link.Linker; +import esa.mo.apigen.model.Area; +import esa.mo.apigen.model.MOModel; +import esa.mo.apigen.model.SourceRef; +import esa.mo.apigen.model.Specification; +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.Reader; +import java.io.StringReader; +import java.nio.charset.Charset; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import org.junit.Assume; +import org.junit.Test; +import org.xml.sax.InputSource; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +/** + * The XHTML generator over every specification in the repository. + *

                  + * There is nothing to hold this output against - nothing in the build has ever invoked the + * generator it replaces, so the Phase 0 capture holds no page to compare with - so what is + * checked here is what the output has to be true of rather than what it happens to say: + * every area produces a page, every page parses, and every link on every page arrives + * somewhere. Those three between them caught what the old generator got wrong. + */ +public class XhtmlGeneratorCorpusTest { + + private static final Charset UTF8 = Charset.forName("UTF-8"); + + private static final Pattern ANCHOR = Pattern.compile("id=\"([^\"]*)\""); + + private static final Pattern LINK = Pattern.compile("(?:xlink:)?href=\"([^\"]*)\""); + + @Test + public void everyAreaOfTheStandardsIsDescribed() throws Exception { + check("standards"); + } + + @Test + public void everyAreaOfThePrototypesIsDescribed() throws Exception { + check("prototypes"); + } + + /** + * Mission Planning declares six composites that contain themselves - a Plan names a + * precursor Plan, an ActivityInstance holds its children - and the generator this + * replaces expanded them until the stack ran out, leaving an empty file behind. The + * page has to describe them. + */ + @Test + public void aTypeThatContainsItselfIsDescribed() throws Exception { + File specs = specifications("prototypes"); + Assume.assumeTrue("specifications not present", specs.isDirectory()); + + Path out = Files.createTempDirectory("apigen-xhtml-recursive"); + try { + generate(specs, out); + File page = new File(out.toFile(), "area005-v001-MPS.xhtml"); + assertTrue("Mission Planning produced no page at all", page.isFile()); + + String text = new String(Files.readAllBytes(page.toPath()), UTF8); + for (String type : Arrays.asList("Plan", "PlanRevision", "ActivityInstance", + "EventDefinition", "EventInstance")) { + assertTrue(type + " is not described", text.contains("id=\"_" + type + "\"") + || text.contains("_" + type + "\"")); + } + parse(page, text); + assertWidthsAreBounded(page, text); + } finally { + delete(out.toFile()); + } + } + + private void check(String set) throws Exception { + File specs = specifications(set); + Assume.assumeTrue("specifications not present", specs.isDirectory()); + + Path out = Files.createTempDirectory("apigen-xhtml-" + set); + try { + List written = generate(specs, out); + assertFalse("no area was generated", written.isEmpty()); + + Map> anchors = new HashMap>(); + Map pages = new HashMap(); + for (Area area : written) { + String name = XhtmlLink.pageOf(area); + File page = new File(out.toFile(), name); + assertTrue(area.getName() + " produced no page", page.isFile()); + + String text = new String(Files.readAllBytes(page.toPath()), UTF8); + parse(page, text); + assertWidthsAreBounded(page, text); + pages.put(name, text); + anchors.put(name, anchorsOf(text)); + } + // An area published twice under different versions gets a page of each: the two + // say different things, and the name of the file has to keep them apart. + assertTrue("MAL 1 and MAL 3 share a page", + pages.containsKey("area001-v001-MAL.xhtml") + && pages.containsKey("area001-v003-MAL.xhtml")); + + List broken = new ArrayList(); + for (Map.Entry page : pages.entrySet()) { + checkLinks(page.getKey(), page.getValue(), anchors, broken); + } + if (!broken.isEmpty()) { + fail(broken.size() + " link(s) arrive nowhere:\n " + join(broken)); + } + } finally { + delete(out.toFile()); + } + } + + /** + * Every link either stays on its page or names another page of the same set, and in + * both cases names something that page defines. + */ + private static void checkLinks(String from, String text, + Map> anchors, List broken) { + Matcher matcher = LINK.matcher(text); + while (matcher.find()) { + String href = matcher.group(1); + int hash = href.indexOf('#'); + if (hash < 0) { + continue; + } + String page = hash == 0 ? from : href.substring(0, hash); + String anchor = href.substring(hash + 1); + if (!anchors.containsKey(page)) { + broken.add(from + " -> " + href + " (no such page)"); + } else if (!anchors.get(page).contains(anchor)) { + broken.add(from + " -> " + href + " (no such anchor)"); + } + } + } + + /** + * A composite opened out inside another multiplies rather than adds, so a message of + * nested composites can reach a size at which the drawing has stopped being one. The + * generator stops opening types out before that happens, and this is what says it did. + */ + private static void assertWidthsAreBounded(File page, String text) { + Matcher matcher = Pattern.compile(" anchorsOf(String text) { + Set found = new HashSet(); + Matcher matcher = ANCHOR.matcher(text); + while (matcher.find()) { + found.add(matcher.group(1)); + } + return found; + } + + /** + * A page is XHTML, so it has to parse as XML. The document type is not fetched - the + * point is that the markup is well formed, and reaching the network to find that out + * would make the test depend on being online. + */ + private static void parse(File page, String text) throws Exception { + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + factory.setNamespaceAware(true); + factory.setValidating(false); + factory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", + false); + DocumentBuilder builder = factory.newDocumentBuilder(); + builder.setEntityResolver(new org.xml.sax.EntityResolver() { + @Override + public InputSource resolveEntity(String publicId, String systemId) { + return new InputSource(new StringReader("")); + } + }); + try { + builder.parse(new ByteArrayInputStream(text.getBytes(UTF8))); + } catch (Exception ex) { + fail(page.getName() + " is not well-formed XHTML: " + ex.getMessage()); + } + } + + private static List generate(File specs, Path out) throws Exception { + MOModel model = new MOModel(); + List targets = new ArrayList(); + for (File file : sorted(specs)) { + if (!file.getName().endsWith(".xml")) { + continue; + } + Specification spec = read(file); + model.add(spec); + targets.addAll(spec.getAreas()); + } + new Linker().link(model); + new XhtmlGenerator().generate(model, targets, out); + return targets; + } + + private static File specifications(String set) { + File root = repoRoot(); + Assume.assumeNotNull("not inside the repository", root); + return new File(root, "xml-service-specifications/xml-ccsds-mo-" + set + + "/src/main/resources/xml"); + } + + private static Specification read(File file) throws Exception { + Reader in = new InputStreamReader(new FileInputStream(file), UTF8); + try { + return new XmlImporter().read(in, new SourceRef(file.getName(), file.getPath())); + } finally { + in.close(); + } + } + + private static List sorted(File dir) { + File[] entries = dir.listFiles(); + if (entries == null) { + return new ArrayList(); + } + Arrays.sort(entries); + return Arrays.asList(entries); + } + + private static String join(List lines) { + StringBuilder buf = new StringBuilder(); + for (String line : lines.subList(0, Math.min(20, lines.size()))) { + buf.append(line).append("\n "); + } + return buf.toString(); + } + + private static File repoRoot() { + File here = new File(System.getProperty("user.dir")).getAbsoluteFile(); + while (here != null) { + if (new File(here, "xml-service-specifications").isDirectory()) { + return here; + } + here = here.getParentFile(); + } + return null; + } + + private static void delete(File file) throws IOException { + File[] entries = file.listFiles(); + if (entries != null) { + for (File entry : entries) { + delete(entry); + } + } + Files.deleteIfExists(file.toPath()); + } +} diff --git a/api-generator/api-generator-lib/src/test/java/esa/mo/apigen/importers/xml/Corpus.java b/testbeds/testbed-api-generator/src/test/java/esa/mo/apigen/importers/xml/Corpus.java similarity index 100% rename from api-generator/api-generator-lib/src/test/java/esa/mo/apigen/importers/xml/Corpus.java rename to testbeds/testbed-api-generator/src/test/java/esa/mo/apigen/importers/xml/Corpus.java diff --git a/api-generator/api-generator-lib/src/test/java/esa/mo/apigen/importers/xml/XmlImporterCorpusTest.java b/testbeds/testbed-api-generator/src/test/java/esa/mo/apigen/importers/xml/XmlImporterCorpusTest.java similarity index 92% rename from api-generator/api-generator-lib/src/test/java/esa/mo/apigen/importers/xml/XmlImporterCorpusTest.java rename to testbeds/testbed-api-generator/src/test/java/esa/mo/apigen/importers/xml/XmlImporterCorpusTest.java index 5df9007c..31f2e6a4 100644 --- a/api-generator/api-generator-lib/src/test/java/esa/mo/apigen/importers/xml/XmlImporterCorpusTest.java +++ b/testbeds/testbed-api-generator/src/test/java/esa/mo/apigen/importers/xml/XmlImporterCorpusTest.java @@ -206,6 +206,28 @@ public void anEmptyCommentIsKeptApartFromAnAbsentOne() throws Exception { assertNotNull(spec.getAreas().get(0).getComment()); } + @Test + public void aCapturedDiagramIsSelfContained() throws Exception { + // A diagram is written inside a specification, in a namespace the specification + // declares once at the top. It is read here and rendered somewhere else entirely, + // so what is captured has to carry that namespace itself - a drawing whose + // namespace was dropped renders as an empty picture. + Specification spec = Corpus.read(Corpus.file("area007-v001-Software-Management.xml")); + int diagrams = 0; + for (Service service : spec.getAreas().get(0).getServices()) { + if (service.getCom() == null) { + continue; + } + for (esa.mo.apigen.model.docs.Diagram diagram + : service.getCom().getDocumentation().getDiagrams()) { + diagrams++; + assertTrue(diagram.getName() + " should stand on its own", + diagram.getSvg().startsWith(" Date: Sun, 23 Aug 2026 13:29:26 +0200 Subject: [PATCH 38/45] Committed the golden baseline and started removing inline diagrams The baseline is the output of the old generators, and the golden tests compare the new ones against it. It was gitignored as "~20 MB and regenerable", so it was absent on a CI runner and those tests skipped there. 20 MB is the size on disk; it is repetitive generated text and git stores it in 1.17 MB, against a repository of 8.6 MB. It now lives beside the tests that read it, and not under src/test/resources, where Maven would copy 20 MB into target on every build. A quarter of that is ten PNGs, which neither compress nor delta. They come from , which wraps raw SVG inside the specification XML. That is going away: an SVG is a rendering of the model, not part of it, so nothing can check it, and a diagram that silently disagrees with its own specification is worse than no diagram. Sixteen of the eighteen in the corpus belong to MC v001, and the NMF has none. DESIGN.md section 8.3 sets out the reasoning and the order: the diagrams come out of the XML, both generators then stop emitting them, and the baseline is re-captured - rather than dropping them from the tests, which would mean choosing to stop checking something still being produced. Software Management goes first, being a prototype. Its two diagrams are removed and the baseline re-captured; the old generator stopped emitting the images by itself, so there is nothing to record as an intended difference. Two importer tests that used it as their diagram example now use MC v001, which still has eight, and go when it does. DocxBodyTest and DocxNumberingTest move to the testbed as well. They read a captured document, so they belong there; they had stayed behind and were skipping. Co-Authored-By: Claude Opus 5 --- .github/workflows/testbeds.yml | 20 +- api-generator/api-generator-lib/DESIGN.md | 112 +- api-generator/golden/.gitignore | 1 - api-generator/golden/README.md | 12 +- api-generator/golden/golden.sh | 2 +- .../testbed-api-generator/baseline/MANIFEST | 5 + .../[Content_Types].xml | 1 + .../_rels/.rels | 1 + .../word/_rels/document.xml.rels | 1 + .../word/document.xml | 1514 ++ .../word/numbering.xml | 3 + .../word/styles.xml | 1 + .../[Content_Types].xml | 1 + .../_rels/.rels | 1 + .../word/_rels/document.xml.rels | 1 + .../word/document.xml | 1791 ++ .../word/numbering.xml | 3 + .../word/styles.xml | 1 + .../[Content_Types].xml | 1 + .../_rels/.rels | 1 + .../word/_rels/document.xml.rels | 1 + .../word/document.xml | 2252 +++ .../word/numbering.xml | 31 + .../word/styles.xml | 1 + .../[Content_Types].xml | 1 + .../_rels/.rels | 1 + .../word/_rels/document.xml.rels | 1 + .../word/document.xml | 3323 ++++ .../word/numbering.xml | 57 + .../word/styles.xml | 1 + .../[Content_Types].xml | 1 + .../_rels/.rels | 1 + .../word/_rels/document.xml.rels | 1 + .../word/document.xml | 10925 ++++++++++++ .../word/media/image1.png | Bin 0 -> 35930 bytes .../word/media/image2.png | Bin 0 -> 24541 bytes .../word/media/image3.png | Bin 0 -> 22204 bytes .../word/media/image4.png | Bin 0 -> 60771 bytes .../word/media/image5.png | Bin 0 -> 31988 bytes .../word/media/image6.png | Bin 0 -> 27153 bytes .../word/media/image7.png | Bin 0 -> 39314 bytes .../word/media/image8.png | Bin 0 -> 16068 bytes .../word/numbering.xml | 147 + .../word/styles.xml | 1 + .../[Content_Types].xml | 1 + .../_rels/.rels | 1 + .../word/_rels/document.xml.rels | 1 + .../word/document.xml | 3920 +++++ .../word/numbering.xml | 41 + .../word/styles.xml | 1 + .../[Content_Types].xml | 1 + .../_rels/.rels | 1 + .../word/_rels/document.xml.rels | 1 + .../word/document.xml | 14418 ++++++++++++++++ .../word/numbering.xml | 95 + .../word/styles.xml | 1 + .../[Content_Types].xml | 1 + .../_rels/.rels | 1 + .../word/_rels/document.xml.rels | 1 + .../word/document.xml | 2237 +++ .../word/numbering.xml | 41 + .../word/styles.xml | 1 + .../[Content_Types].xml | 1 + .../_rels/.rels | 1 + .../word/_rels/document.xml.rels | 1 + .../word/document.xml | 1958 +++ .../word/numbering.xml | 37 + .../word/styles.xml | 1 + .../[Content_Types].xml | 1 + .../_rels/.rels | 1 + .../word/_rels/document.xml.rels | 1 + .../word/document.xml | 5708 ++++++ .../word/numbering.xml | 79 + .../word/styles.xml | 1 + .../[Content_Types].xml | 1 + .../_rels/.rels | 1 + .../word/_rels/document.xml.rels | 1 + .../word/document.xml | 3572 ++++ .../word/numbering.xml | 47 + .../word/styles.xml | 1 + .../[Content_Types].xml | 1 + .../_rels/.rels | 1 + .../word/_rels/document.xml.rels | 1 + .../word/document.xml | 1893 ++ .../word/numbering.xml | 25 + .../word/styles.xml | 1 + .../[Content_Types].xml | 1 + .../_rels/.rels | 1 + .../word/_rels/document.xml.rels | 1 + .../word/document.xml | 1514 ++ .../word/numbering.xml | 3 + .../word/styles.xml | 1 + .../[Content_Types].xml | 1 + .../_rels/.rels | 1 + .../word/_rels/document.xml.rels | 1 + .../word/document.xml | 1791 ++ .../word/numbering.xml | 3 + .../word/styles.xml | 1 + .../[Content_Types].xml | 1 + .../_rels/.rels | 1 + .../word/_rels/document.xml.rels | 1 + .../word/document.xml | 2252 +++ .../word/numbering.xml | 31 + .../word/styles.xml | 1 + .../[Content_Types].xml | 1 + .../_rels/.rels | 1 + .../word/_rels/document.xml.rels | 1 + .../word/document.xml | 3323 ++++ .../word/numbering.xml | 57 + .../word/styles.xml | 1 + .../[Content_Types].xml | 1 + .../_rels/.rels | 1 + .../word/_rels/document.xml.rels | 1 + .../word/document.xml | 10925 ++++++++++++ .../word/media/image1.png | Bin 0 -> 35930 bytes .../word/media/image2.png | Bin 0 -> 24541 bytes .../word/media/image3.png | Bin 0 -> 22204 bytes .../word/media/image4.png | Bin 0 -> 60771 bytes .../word/media/image5.png | Bin 0 -> 31988 bytes .../word/media/image6.png | Bin 0 -> 27153 bytes .../word/media/image7.png | Bin 0 -> 39314 bytes .../word/media/image8.png | Bin 0 -> 16068 bytes .../word/numbering.xml | 147 + .../word/styles.xml | 1 + .../[Content_Types].xml | 1 + .../_rels/.rels | 1 + .../word/_rels/document.xml.rels | 1 + .../word/document.xml | 3920 +++++ .../word/numbering.xml | 41 + .../word/styles.xml | 1 + .../mo/mal/AuthenticationFailedException.java | 28 + .../mo/mal/AuthorisationFailException.java | 28 + .../moims/mo/mal/BadEncodingException.java | 28 + .../mo/mal/DeliveryDelayedException.java | 28 + .../moims/mo/mal/DeliveryFailedException.java | 27 + .../mo/mal/DeliveryTimedoutException.java | 27 + .../mo/mal/DestinationLostException.java | 28 + .../mo/mal/DestinationTransientException.java | 28 + .../mo/mal/DestinationUnknownException.java | 27 + .../moims/mo/mal/EncryptionFailException.java | 28 + .../moims/mo/mal/IncorrectStateException.java | 28 + .../ccsds/moims/mo/mal/InternalException.java | 27 + .../ccsds/moims/mo/mal/MALElementFactory.java | 118 + .../org/ccsds/moims/mo/mal/MALHelper.java | 252 + .../ccsds/moims/mo/mal/ShutdownException.java | 27 + .../ccsds/moims/mo/mal/TooManyException.java | 28 + .../mo/mal/TransactionTimeoutException.java | 28 + .../ccsds/moims/mo/mal/UnknownException.java | 27 + .../mo/mal/UnsupportedAreaException.java | 28 + .../mal/UnsupportedAreaVersionException.java | 28 + .../mo/mal/UnsupportedOperationException.java | 28 + .../mo/mal/UnsupportedServiceException.java | 28 + .../org/ccsds/moims/mo/mal/package-info.java | 4 + .../mo/mal/structures/AttributeType.java | 391 + .../mo/mal/structures/AttributeTypeList.java | 79 + .../moims/mo/mal/structures/BlobList.java | 79 + .../moims/mo/mal/structures/BooleanList.java | 80 + .../moims/mo/mal/structures/DoubleList.java | 80 + .../moims/mo/mal/structures/DurationList.java | 79 + .../ccsds/moims/mo/mal/structures/File.java | 303 + .../moims/mo/mal/structures/FileList.java | 79 + .../moims/mo/mal/structures/FineTimeList.java | 79 + .../moims/mo/mal/structures/FloatList.java | 80 + .../mo/mal/structures/IdBooleanPair.java | 147 + .../mo/mal/structures/IdBooleanPairList.java | 79 + .../mo/mal/structures/IdentifierList.java | 79 + .../moims/mo/mal/structures/IntegerList.java | 80 + .../mo/mal/structures/InteractionType.java | 182 + .../mal/structures/InteractionTypeList.java | 79 + .../moims/mo/mal/structures/LongList.java | 80 + .../ccsds/moims/mo/mal/structures/MOArea.java | 198 + .../moims/mo/mal/structures/MOAreaList.java | 79 + .../moims/mo/mal/structures/NamedValue.java | 147 + .../mo/mal/structures/NamedValueList.java | 79 + .../mo/mal/structures/NullableAttribute.java | 103 + .../mal/structures/NullableAttributeList.java | 79 + .../mo/mal/structures/ObjectIdentity.java | 173 + .../mo/mal/structures/ObjectIdentityList.java | 79 + .../mo/mal/structures/ObjectRefList.java | 79 + .../moims/mo/mal/structures/OctetList.java | 80 + .../ccsds/moims/mo/mal/structures/Pair.java | 133 + .../moims/mo/mal/structures/PairList.java | 79 + .../moims/mo/mal/structures/QoSLevel.java | 150 + .../moims/mo/mal/structures/QoSLevelList.java | 79 + .../moims/mo/mal/structures/ServiceId.java | 173 + .../mo/mal/structures/ServiceIdList.java | 79 + .../moims/mo/mal/structures/SessionType.java | 134 + .../mo/mal/structures/SessionTypeList.java | 79 + .../moims/mo/mal/structures/ShortList.java | 80 + .../moims/mo/mal/structures/StringList.java | 80 + .../moims/mo/mal/structures/Subscription.java | 214 + .../mo/mal/structures/SubscriptionFilter.java | 143 + .../structures/SubscriptionFilterList.java | 79 + .../mo/mal/structures/SubscriptionList.java | 79 + .../moims/mo/mal/structures/TimeList.java | 79 + .../moims/mo/mal/structures/UIntegerList.java | 79 + .../moims/mo/mal/structures/ULongList.java | 79 + .../moims/mo/mal/structures/UOctetList.java | 79 + .../moims/mo/mal/structures/URIList.java | 79 + .../moims/mo/mal/structures/UShortList.java | 79 + .../moims/mo/mal/structures/UpdateHeader.java | 166 + .../mo/mal/structures/UpdateHeaderList.java | 79 + .../moims/mo/mal/structures/package-info.java | 4 + .../ccsds/moims/mo/com/COMElementFactory.java | 102 + .../org/ccsds/moims/mo/com/COMHelper.java | 75 + .../moims/mo/com/DuplicateException.java | 27 + .../ccsds/moims/mo/com/InvalidException.java | 27 + .../ActivityTrackingHelper.java | 17 + .../ActivityTrackingServiceInfo.java | 255 + .../consumer/ActivityTrackingAdapter.java | 8 + .../consumer/ActivityTrackingStub.java | 33 + .../consumer/package-info.java | 4 + .../mo/com/activitytracking/package-info.java | 9 + .../provider/ActivityTrackingHandler.java | 15 + .../ActivityTrackingInheritanceSkeleton.java | 101 + .../provider/ActivityTrackingSkeleton.java | 8 + .../provider/package-info.java | 4 + .../structures/ActivityAcceptance.java | 106 + .../structures/ActivityAcceptanceList.java | 79 + .../structures/ActivityExecution.java | 173 + .../structures/ActivityExecutionList.java | 79 + .../structures/ActivityTransfer.java | 183 + .../structures/ActivityTransferList.java | 79 + .../structures/OperationActivity.java | 107 + .../structures/OperationActivityList.java | 79 + .../structures/package-info.java | 4 + .../moims/mo/com/archive/ArchiveHelper.java | 17 + .../mo/com/archive/ArchiveServiceInfo.java | 331 + .../com/archive/consumer/ArchiveAdapter.java | 507 + .../mo/com/archive/consumer/ArchiveStub.java | 465 + .../mo/com/archive/consumer/package-info.java | 4 + .../moims/mo/com/archive/package-info.java | 16 + .../com/archive/provider/ArchiveHandler.java | 165 + .../provider/ArchiveInheritanceSkeleton.java | 158 + .../com/archive/provider/ArchiveSkeleton.java | 8 + .../archive/provider/CountInteraction.java | 70 + .../archive/provider/QueryInteraction.java | 116 + .../archive/provider/RetrieveInteraction.java | 76 + .../mo/com/archive/provider/package-info.java | 4 + .../archive/structures/ArchiveDetails.java | 246 + .../structures/ArchiveDetailsList.java | 79 + .../com/archive/structures/ArchiveQuery.java | 386 + .../archive/structures/ArchiveQueryList.java | 79 + .../archive/structures/CompositeFilter.java | 198 + .../structures/CompositeFilterList.java | 79 + .../structures/CompositeFilterSet.java | 113 + .../structures/CompositeFilterSetList.java | 79 + .../structures/ExpressionOperator.java | 214 + .../structures/ExpressionOperatorList.java | 79 + .../com/archive/structures/QueryFilter.java | 46 + .../archive/structures/QueryFilterList.java | 23 + .../com/archive/structures/package-info.java | 4 + .../ccsds/moims/mo/com/event/EventHelper.java | 17 + .../moims/mo/com/event/EventServiceInfo.java | 96 + .../mo/com/event/consumer/EventAdapter.java | 172 + .../mo/com/event/consumer/EventStub.java | 85 + .../MonitorEventSubscriptionKeys.java | 68 + .../mo/com/event/consumer/package-info.java | 4 + .../moims/mo/com/event/package-info.java | 21 + .../mo/com/event/provider/EventHandler.java | 15 + .../provider/EventInheritanceSkeleton.java | 112 + .../mo/com/event/provider/EventSkeleton.java | 29 + .../event/provider/MonitorEventPublisher.java | 124 + .../mo/com/event/provider/package-info.java | 4 + .../org/ccsds/moims/mo/com/package-info.java | 7 + .../com/structures/InstanceBooleanPair.java | 139 + .../structures/InstanceBooleanPairList.java | 79 + .../mo/com/structures/ObjectDetails.java | 138 + .../mo/com/structures/ObjectDetailsList.java | 79 + .../moims/mo/com/structures/ObjectId.java | 140 + .../moims/mo/com/structures/ObjectIdList.java | 79 + .../moims/mo/com/structures/ObjectKey.java | 141 + .../mo/com/structures/ObjectKeyList.java | 79 + .../moims/mo/com/structures/ObjectType.java | 213 + .../mo/com/structures/ObjectTypeList.java | 79 + .../moims/mo/com/structures/package-info.java | 4 + .../moims/mo/common/CommonElementFactory.java | 100 + .../ccsds/moims/mo/common/CommonHelper.java | 55 + .../configuration/ConfigurationHelper.java | 17 + .../ConfigurationServiceInfo.java | 543 + .../consumer/ConfigurationAdapter.java | 418 + .../consumer/ConfigurationStub.java | 585 + .../configuration/consumer/package-info.java | 4 + .../mo/common/configuration/package-info.java | 19 + .../provider/ActivateInteraction.java | 77 + .../provider/ConfigurationHandler.java | 178 + .../ConfigurationInheritanceSkeleton.java | 156 + .../provider/ConfigurationSkeleton.java | 8 + .../provider/StoreCurrentInteraction.java | 68 + .../configuration/provider/package-info.java | 4 + .../ConfigurationObjectDetails.java | 108 + .../ConfigurationObjectDetailsList.java | 79 + .../structures/ConfigurationObjectSet.java | 173 + .../ConfigurationObjectSetList.java | 79 + .../structures/ConfigurationType.java | 117 + .../structures/ConfigurationTypeList.java | 79 + .../ServiceConfigurationIdentifier.java | 140 + .../ServiceConfigurationIdentifierList.java | 79 + .../structures/package-info.java | 4 + .../mo/common/directory/DirectoryHelper.java | 17 + .../directory/DirectoryServiceInfo.java | 221 + .../body/PublishProviderResponse.java | 71 + .../common/directory/body/package-info.java | 4 + .../directory/consumer/DirectoryAdapter.java | 185 + .../directory/consumer/DirectoryStub.java | 271 + .../directory/consumer/package-info.java | 4 + .../mo/common/directory/package-info.java | 17 + .../directory/provider/DirectoryHandler.java | 89 + .../DirectoryInheritanceSkeleton.java | 130 + .../directory/provider/DirectorySkeleton.java | 8 + .../directory/provider/package-info.java | 4 + .../directory/structures/AddressDetails.java | 285 + .../structures/AddressDetailsList.java | 79 + .../directory/structures/ProviderDetails.java | 146 + .../structures/ProviderDetailsList.java | 79 + .../directory/structures/ProviderSummary.java | 173 + .../structures/ProviderSummaryList.java | 79 + .../directory/structures/PublishDetails.java | 324 + .../structures/PublishDetailsList.java | 79 + .../structures/ServiceCapability.java | 213 + .../structures/ServiceCapabilityList.java | 79 + .../directory/structures/ServiceFilter.java | 285 + .../structures/ServiceFilterList.java | 79 + .../directory/structures/package-info.java | 4 + .../moims/mo/common/login/LoginHelper.java | 17 + .../mo/common/login/LoginServiceInfo.java | 286 + .../common/login/body/HandoverResponse.java | 58 + .../mo/common/login/body/LoginResponse.java | 58 + .../mo/common/login/body/package-info.java | 4 + .../common/login/consumer/LoginAdapter.java | 182 + .../mo/common/login/consumer/LoginStub.java | 283 + .../common/login/consumer/package-info.java | 4 + .../moims/mo/common/login/package-info.java | 29 + .../common/login/provider/LoginHandler.java | 96 + .../provider/LoginInheritanceSkeleton.java | 132 + .../common/login/provider/LoginSkeleton.java | 8 + .../common/login/provider/package-info.java | 4 + .../mo/common/login/structures/Profile.java | 147 + .../common/login/structures/ProfileList.java | 79 + .../common/login/structures/package-info.java | 4 + .../ccsds/moims/mo/common/package-info.java | 15 + .../mo/common/structures/ServiceKey.java | 173 + .../mo/common/structures/ServiceKeyList.java | 79 + .../mo/common/structures/package-info.java | 4 + .../ccsds/moims/mo/mc/MCElementFactory.java | 246 + .../org/ccsds/moims/mo/mc/MCHelper.java | 80 + .../ccsds/moims/mo/mc/ReadonlyException.java | 27 + .../moims/mo/mc/ReferencedException.java | 27 + .../moims/mo/mc/action/ActionHelper.java | 17 + .../moims/mo/mc/action/ActionServiceInfo.java | 334 + .../mo/mc/action/consumer/ActionAdapter.java | 242 + .../mo/mc/action/consumer/ActionStub.java | 397 + .../mo/mc/action/consumer/package-info.java | 4 + .../moims/mo/mc/action/package-info.java | 50 + .../mo/mc/action/provider/ActionHandler.java | 128 + .../provider/ActionInheritanceSkeleton.java | 138 + .../mo/mc/action/provider/ActionSkeleton.java | 8 + .../mo/mc/action/provider/package-info.java | 4 + .../mc/action/structures/ActionCategory.java | 134 + .../action/structures/ActionCategoryList.java | 79 + .../structures/ActionCreationRequest.java | 140 + .../structures/ActionCreationRequestList.java | 79 + .../structures/ActionDefinitionDetails.java | 223 + .../ActionDefinitionDetailsList.java | 79 + .../structures/ActionInstanceDetails.java | 331 + .../structures/ActionInstanceDetailsList.java | 79 + .../mo/mc/action/structures/package-info.java | 4 + .../mo/mc/aggregation/AggregationHelper.java | 17 + .../aggregation/AggregationServiceInfo.java | 361 + .../consumer/AggregationAdapter.java | 439 + .../aggregation/consumer/AggregationStub.java | 527 + .../MonitorValueSubscriptionKeys.java | 68 + .../mc/aggregation/consumer/package-info.java | 4 + .../moims/mo/mc/aggregation/package-info.java | 45 + .../provider/AggregationHandler.java | 156 + .../AggregationInheritanceSkeleton.java | 153 + .../provider/AggregationSkeleton.java | 29 + .../provider/MonitorValuePublisher.java | 123 + .../mc/aggregation/provider/package-info.java | 4 + .../structures/AggregationCategory.java | 118 + .../structures/AggregationCategoryList.java | 79 + .../AggregationCreationRequest.java | 140 + .../AggregationCreationRequestList.java | 79 + .../AggregationDefinitionDetails.java | 378 + .../AggregationDefinitionDetailsList.java | 79 + .../structures/AggregationParameterSet.java | 220 + .../AggregationParameterSetList.java | 79 + .../structures/AggregationParameterValue.java | 148 + .../AggregationParameterValueList.java | 79 + .../structures/AggregationSetValue.java | 191 + .../structures/AggregationSetValueList.java | 79 + .../structures/AggregationValue.java | 177 + .../structures/AggregationValueDetails.java | 207 + .../AggregationValueDetailsList.java | 79 + .../structures/AggregationValueList.java | 79 + .../structures/GenerationMode.java | 134 + .../structures/GenerationModeList.java | 79 + .../structures/ThresholdFilter.java | 174 + .../structures/ThresholdFilterList.java | 79 + .../aggregation/structures/ThresholdType.java | 118 + .../structures/ThresholdTypeList.java | 79 + .../aggregation/structures/package-info.java | 4 + .../ccsds/moims/mo/mc/alert/AlertHelper.java | 17 + .../moims/mo/mc/alert/AlertServiceInfo.java | 281 + .../mo/mc/alert/consumer/AlertAdapter.java | 212 + .../moims/mo/mc/alert/consumer/AlertStub.java | 344 + .../mo/mc/alert/consumer/package-info.java | 4 + .../ccsds/moims/mo/mc/alert/package-info.java | 11 + .../mo/mc/alert/provider/AlertHandler.java | 113 + .../provider/AlertInheritanceSkeleton.java | 132 + .../mo/mc/alert/provider/AlertSkeleton.java | 8 + .../mo/mc/alert/provider/package-info.java | 4 + .../structures/AlertCreationRequest.java | 140 + .../structures/AlertCreationRequestList.java | 79 + .../structures/AlertDefinitionDetails.java | 206 + .../AlertDefinitionDetailsList.java | 79 + .../alert/structures/AlertEventDetails.java | 139 + .../structures/AlertEventDetailsList.java | 79 + .../mo/mc/alert/structures/package-info.java | 4 + .../ccsds/moims/mo/mc/check/CheckHelper.java | 17 + .../moims/mo/mc/check/CheckServiceInfo.java | 661 + .../mo/mc/check/consumer/CheckAdapter.java | 660 + .../moims/mo/mc/check/consumer/CheckStub.java | 829 + .../mo/mc/check/consumer/package-info.java | 4 + .../ccsds/moims/mo/mc/check/package-info.java | 55 + .../mo/mc/check/provider/CheckHandler.java | 264 + .../provider/CheckInheritanceSkeleton.java | 175 + .../mo/mc/check/provider/CheckSkeleton.java | 8 + .../GetCurrentTransitionListInteraction.java | 94 + .../provider/GetSummaryReportInteraction.java | 98 + .../mo/mc/check/provider/package-info.java | 4 + .../structures/CheckDefinitionDetails.java | 298 + .../CheckDefinitionDetailsList.java | 23 + .../mc/check/structures/CheckLinkDetails.java | 261 + .../structures/CheckLinkDetailsList.java | 79 + .../mc/check/structures/CheckLinkSummary.java | 256 + .../structures/CheckLinkSummaryList.java | 79 + .../mo/mc/check/structures/CheckResult.java | 221 + .../check/structures/CheckResultFilter.java | 248 + .../structures/CheckResultFilterList.java | 79 + .../mc/check/structures/CheckResultList.java | 79 + .../check/structures/CheckResultSummary.java | 257 + .../structures/CheckResultSummaryList.java | 79 + .../mo/mc/check/structures/CheckState.java | 167 + .../mc/check/structures/CheckStateList.java | 79 + .../check/structures/CheckTypedInstance.java | 148 + .../structures/CheckTypedInstanceList.java | 79 + .../structures/CompoundCheckDefinition.java | 169 + .../CompoundCheckDefinitionList.java | 79 + .../structures/ConstantCheckDefinition.java | 168 + .../ConstantCheckDefinitionList.java | 79 + .../structures/DeltaCheckDefinition.java | 303 + .../structures/DeltaCheckDefinitionList.java | 79 + .../structures/LimitCheckDefinition.java | 230 + .../structures/LimitCheckDefinitionList.java | 79 + .../structures/ReferenceCheckDefinition.java | 167 + .../ReferenceCheckDefinitionList.java | 79 + .../mc/check/structures/ReferenceValue.java | 187 + .../check/structures/ReferenceValueList.java | 79 + .../mo/mc/check/structures/package-info.java | 4 + .../mo/mc/conversion/ConversionHelper.java | 17 + .../mc/conversion/ConversionServiceInfo.java | 224 + .../consumer/ConversionAdapter.java | 8 + .../conversion/consumer/ConversionStub.java | 33 + .../mc/conversion/consumer/package-info.java | 4 + .../moims/mo/mc/conversion/package-info.java | 13 + .../provider/ConversionHandler.java | 15 + .../ConversionInheritanceSkeleton.java | 101 + .../provider/ConversionSkeleton.java | 8 + .../mc/conversion/provider/package-info.java | 4 + .../structures/DiscreteConversionDetails.java | 111 + .../DiscreteConversionDetailsList.java | 79 + .../structures/LineConversionDetails.java | 144 + .../structures/LineConversionDetailsList.java | 79 + .../structures/PolyConversionDetails.java | 110 + .../structures/PolyConversionDetailsList.java | 79 + .../structures/RangeConversionDetails.java | 109 + .../RangeConversionDetailsList.java | 79 + .../conversion/structures/package-info.java | 4 + .../ccsds/moims/mo/mc/group/GroupHelper.java | 17 + .../moims/mo/mc/group/GroupServiceInfo.java | 131 + .../mo/mc/group/consumer/GroupAdapter.java | 8 + .../moims/mo/mc/group/consumer/GroupStub.java | 33 + .../mo/mc/group/consumer/package-info.java | 4 + .../ccsds/moims/mo/mc/group/package-info.java | 18 + .../mo/mc/group/provider/GroupHandler.java | 15 + .../provider/GroupInheritanceSkeleton.java | 101 + .../mo/mc/group/provider/GroupSkeleton.java | 8 + .../mo/mc/group/provider/package-info.java | 4 + .../mo/mc/group/structures/GroupDetails.java | 207 + .../mc/group/structures/GroupDetailsList.java | 79 + .../mo/mc/group/structures/package-info.java | 4 + .../org/ccsds/moims/mo/mc/package-info.java | 15 + .../mo/mc/parameter/ParameterHelper.java | 17 + .../mo/mc/parameter/ParameterServiceInfo.java | 360 + .../MonitorValueSubscriptionKeys.java | 68 + .../parameter/consumer/ParameterAdapter.java | 439 + .../mc/parameter/consumer/ParameterStub.java | 513 + .../mc/parameter/consumer/package-info.java | 4 + .../moims/mo/mc/parameter/package-info.java | 19 + .../provider/MonitorValuePublisher.java | 123 + .../parameter/provider/ParameterHandler.java | 152 + .../ParameterInheritanceSkeleton.java | 152 + .../parameter/provider/ParameterSkeleton.java | 29 + .../mc/parameter/provider/package-info.java | 4 + .../structures/ParameterConversion.java | 185 + .../structures/ParameterConversionList.java | 79 + .../structures/ParameterCreationRequest.java | 140 + .../ParameterCreationRequestList.java | 79 + .../ParameterDefinitionDetails.java | 323 + .../ParameterDefinitionDetailsList.java | 79 + .../structures/ParameterRawValue.java | 147 + .../structures/ParameterRawValueList.java | 79 + .../parameter/structures/ParameterValue.java | 180 + .../structures/ParameterValueDetails.java | 206 + .../structures/ParameterValueDetailsList.java | 79 + .../structures/ParameterValueList.java | 79 + .../parameter/structures/ValidityState.java | 182 + .../structures/ValidityStateList.java | 79 + .../mc/parameter/structures/package-info.java | 4 + .../mo/mc/statistic/StatisticHelper.java | 17 + .../mo/mc/statistic/StatisticServiceInfo.java | 443 + .../MonitorStatisticsSubscriptionKeys.java | 69 + .../statistic/consumer/StatisticAdapter.java | 509 + .../mc/statistic/consumer/StatisticStub.java | 631 + .../mc/statistic/consumer/package-info.java | 4 + .../moims/mo/mc/statistic/package-info.java | 54 + .../provider/MonitorStatisticsPublisher.java | 125 + .../statistic/provider/StatisticHandler.java | 185 + .../StatisticInheritanceSkeleton.java | 165 + .../statistic/provider/StatisticSkeleton.java | 29 + .../mc/statistic/provider/package-info.java | 4 + .../structures/StatisticCreationRequest.java | 173 + .../StatisticCreationRequestList.java | 79 + .../structures/StatisticEvaluationReport.java | 139 + .../StatisticEvaluationReportList.java | 79 + .../structures/StatisticFunctionDetails.java | 139 + .../StatisticFunctionDetailsList.java | 79 + .../structures/StatisticLinkDetails.java | 278 + .../structures/StatisticLinkDetailsList.java | 79 + .../structures/StatisticLinkSummary.java | 240 + .../structures/StatisticLinkSummaryList.java | 79 + .../statistic/structures/StatisticValue.java | 286 + .../structures/StatisticValueList.java | 79 + .../mc/statistic/structures/package-info.java | 4 + .../structures/ArgumentDefinitionDetails.java | 313 + .../ArgumentDefinitionDetailsList.java | 79 + .../mo/mc/structures/AttributeValue.java | 109 + .../mo/mc/structures/AttributeValueList.java | 79 + .../mc/structures/ConditionalConversion.java | 151 + .../structures/ConditionalConversionList.java | 79 + .../mo/mc/structures/ObjectInstancePair.java | 140 + .../mc/structures/ObjectInstancePairList.java | 79 + .../mo/mc/structures/ParameterExpression.java | 221 + .../structures/ParameterExpressionList.java | 79 + .../moims/mo/mc/structures/Severity.java | 169 + .../moims/mo/mc/structures/SeverityList.java | 79 + .../moims/mo/mc/structures/package-info.java | 4 + .../ccsds/moims/mo/mc/AmbiguousException.java | 28 + .../ccsds/moims/mo/mc/DuplicateException.java | 28 + .../ccsds/moims/mo/mc/InvalidException.java | 28 + .../ccsds/moims/mo/mc/MCElementFactory.java | 83 + .../org/ccsds/moims/mo/mc/MCHelper.java | 107 + .../ccsds/moims/mo/mc/ReadOnlyException.java | 28 + .../ccsds/moims/mo/mc/RejectedException.java | 28 + .../moims/mo/mc/action/ActionHelper.java | 17 + .../moims/mo/mc/action/ActionServiceInfo.java | 127 + .../mo/mc/action/consumer/ActionAdapter.java | 211 + .../mo/mc/action/consumer/ActionStub.java | 128 + .../MonitorExecutionSubscriptionKeys.java | 98 + .../mo/mc/action/consumer/package-info.java | 4 + .../moims/mo/mc/action/package-info.java | 5 + .../mo/mc/action/provider/ActionHandler.java | 29 + .../provider/ActionInheritanceSkeleton.java | 121 + .../mo/mc/action/provider/ActionSkeleton.java | 29 + .../provider/MonitorExecutionPublisher.java | 121 + .../mo/mc/action/provider/package-info.java | 4 + .../mo/mc/aggregation/AggregationHelper.java | 17 + .../aggregation/AggregationServiceInfo.java | 293 + .../consumer/AggregationAdapter.java | 453 + .../aggregation/consumer/AggregationStub.java | 471 + .../MonitorValueSubscriptionKeys.java | 88 + .../mc/aggregation/consumer/package-info.java | 4 + .../moims/mo/mc/aggregation/package-info.java | 5 + .../provider/AggregationHandler.java | 131 + .../AggregationInheritanceSkeleton.java | 165 + .../provider/AggregationSkeleton.java | 29 + .../provider/MonitorValuePublisher.java | 121 + .../mc/aggregation/provider/package-info.java | 4 + .../ccsds/moims/mo/mc/alert/AlertHelper.java | 17 + .../moims/mo/mc/alert/AlertServiceInfo.java | 175 + .../mo/mc/alert/consumer/AlertAdapter.java | 297 + .../moims/mo/mc/alert/consumer/AlertStub.java | 229 + .../MonitorAlertSubscriptionKeys.java | 97 + .../mo/mc/alert/consumer/package-info.java | 4 + .../ccsds/moims/mo/mc/alert/package-info.java | 5 + .../mo/mc/alert/provider/AlertHandler.java | 58 + .../provider/AlertInheritanceSkeleton.java | 137 + .../mo/mc/alert/provider/AlertSkeleton.java | 29 + .../alert/provider/MonitorAlertPublisher.java | 123 + .../mo/mc/alert/provider/package-info.java | 4 + .../org/ccsds/moims/mo/mc/package-info.java | 5 + .../moims/mo/mc/packet/PacketHelper.java | 17 + .../moims/mo/mc/packet/PacketServiceInfo.java | 102 + .../DeliverPacketSubscriptionKeys.java | 77 + .../mo/mc/packet/consumer/PacketAdapter.java | 165 + .../mo/mc/packet/consumer/PacketStub.java | 85 + .../mo/mc/packet/consumer/package-info.java | 4 + .../moims/mo/mc/packet/package-info.java | 5 + .../provider/DeliverPacketPublisher.java | 119 + .../mo/mc/packet/provider/PacketHandler.java | 15 + .../provider/PacketInheritanceSkeleton.java | 112 + .../mo/mc/packet/provider/PacketSkeleton.java | 29 + .../mo/mc/packet/provider/package-info.java | 4 + .../mo/mc/parameter/ParameterHelper.java | 17 + .../mo/mc/parameter/ParameterServiceInfo.java | 248 + .../MonitorValueSubscriptionKeys.java | 88 + .../parameter/consumer/ParameterAdapter.java | 393 + .../mc/parameter/consumer/ParameterStub.java | 381 + .../mc/parameter/consumer/package-info.java | 4 + .../moims/mo/mc/parameter/package-info.java | 5 + .../provider/MonitorValuePublisher.java | 123 + .../parameter/provider/ParameterHandler.java | 108 + .../ParameterInheritanceSkeleton.java | 156 + .../parameter/provider/ParameterSkeleton.java | 29 + .../mc/parameter/provider/package-info.java | 4 + .../mo/mc/structures/ActionCategory.java | 133 + .../mo/mc/structures/ActionCategoryList.java | 79 + .../mo/mc/structures/ActionCompleteEvent.java | 94 + .../structures/ActionCompleteEventList.java | 79 + .../mo/mc/structures/ActionDefinition.java | 230 + .../mc/structures/ActionDefinitionList.java | 79 + .../moims/mo/mc/structures/ActionEvent.java | 128 + .../mo/mc/structures/ActionEventList.java | 23 + .../mc/structures/ActionExecutionRequest.java | 322 + .../ActionExecutionRequestList.java | 79 + .../mc/structures/ActionInProgressEvent.java | 167 + .../structures/ActionInProgressEventList.java | 79 + .../mo/mc/structures/ActionStartEvent.java | 94 + .../mc/structures/ActionStartEventList.java | 79 + .../mc/structures/AggregationDefinition.java | 195 + .../structures/AggregationDefinitionList.java | 79 + .../mo/mc/structures/AggregationValue.java | 173 + .../mc/structures/AggregationValueList.java | 79 + .../mo/mc/structures/AlertConfiguration.java | 107 + .../mc/structures/AlertConfigurationList.java | 79 + .../mo/mc/structures/AlertDefinition.java | 195 + .../mo/mc/structures/AlertDefinitionList.java | 79 + .../moims/mo/mc/structures/AlertEvent.java | 183 + .../mo/mc/structures/AlertEventList.java | 79 + .../mo/mc/structures/ArgumentDefinition.java | 214 + .../mc/structures/ArgumentDefinitionList.java | 79 + .../moims/mo/mc/structures/PacketValue.java | 219 + .../mo/mc/structures/PacketValueList.java | 79 + .../mo/mc/structures/ParameterDefinition.java | 256 + .../structures/ParameterDefinitionList.java | 79 + .../mo/mc/structures/ParameterValue.java | 220 + .../mo/mc/structures/ParameterValueData.java | 178 + .../mc/structures/ParameterValueDataList.java | 79 + .../mo/mc/structures/ParameterValueList.java | 79 + .../mo/mc/structures/ReportConfiguration.java | 140 + .../structures/ReportConfigurationList.java | 79 + .../moims/mo/mc/structures/Severity.java | 166 + .../moims/mo/mc/structures/SeverityList.java | 79 + .../moims/mo/mc/structures/ValidityState.java | 182 + .../mo/mc/structures/ValidityStateList.java | 79 + .../moims/mo/mc/structures/package-info.java | 4 + .../moims/mo/mps/ActivateFailedException.java | 29 + .../mps/ActivateSubplanFailedException.java | 28 + .../moims/mo/mps/CancelFailedException.java | 28 + .../mo/mps/DeactivateFailedException.java | 27 + .../mps/DeactivateSubplanFailedException.java | 28 + .../moims/mo/mps/DeleteFailedException.java | 28 + .../moims/mo/mps/InsertFailedException.java | 28 + .../ccsds/moims/mo/mps/InvalidException.java | 28 + .../ccsds/moims/mo/mps/MPSElementFactory.java | 277 + .../org/ccsds/moims/mo/mps/MPSHelper.java | 177 + .../moims/mo/mps/RevokeFailedException.java | 29 + .../moims/mo/mps/SubmitFailedException.java | 28 + .../moims/mo/mps/UnsupportedException.java | 28 + .../moims/mo/mps/UpdateFailedException.java | 29 + .../org/ccsds/moims/mo/mps/package-info.java | 4 + .../PlanDistributionHelper.java | 17 + .../PlanDistributionServiceInfo.java | 279 + .../MonitorPlanStatusSubscriptionKeys.java | 106 + .../consumer/MonitorPlanSubscriptionKeys.java | 105 + .../consumer/PlanDistributionAdapter.java | 613 + .../consumer/PlanDistributionStub.java | 382 + .../consumer/package-info.java | 4 + .../mo/mps/plandistribution/package-info.java | 7 + .../provider/GetPlanInteraction.java | 91 + .../provider/MonitorPlanPublisher.java | 123 + .../provider/MonitorPlanStatusPublisher.java | 123 + .../provider/PlanDistributionHandler.java | 73 + .../PlanDistributionInheritanceSkeleton.java | 151 + .../provider/PlanDistributionSkeleton.java | 50 + .../provider/QueryPlanInteraction.java | 91 + .../provider/package-info.java | 4 + .../moims/mo/mps/planedit/PlanEditHelper.java | 17 + .../mo/mps/planedit/PlanEditServiceInfo.java | 318 + .../planedit/consumer/PlanEditAdapter.java | 353 + .../mps/planedit/consumer/PlanEditStub.java | 596 + .../mps/planedit/consumer/package-info.java | 4 + .../moims/mo/mps/planedit/package-info.java | 12 + .../planedit/provider/PlanEditHandler.java | 162 + .../provider/PlanEditInheritanceSkeleton.java | 168 + .../planedit/provider/PlanEditSkeleton.java | 8 + .../mps/planedit/provider/package-info.java | 4 + .../PlanExecutionControlHelper.java | 17 + .../PlanExecutionControlServiceInfo.java | 461 + ...orPlanExecutionDetailSubscriptionKeys.java | 106 + .../MonitorPlanExecutionSubscriptionKeys.java | 106 + ...nitorSubPlanExecutionSubscriptionKeys.java | 78 + .../consumer/PlanExecutionControlAdapter.java | 730 + .../consumer/PlanExecutionControlStub.java | 822 + .../consumer/package-info.java | 4 + .../planexecutioncontrol/package-info.java | 9 + .../MonitorPlanExecutionDetailPublisher.java | 123 + .../MonitorPlanExecutionPublisher.java | 123 + .../MonitorSubPlanExecutionPublisher.java | 117 + .../provider/PlanExecutionControlHandler.java | 172 + ...anExecutionControlInheritanceSkeleton.java | 199 + .../PlanExecutionControlSkeleton.java | 71 + .../provider/package-info.java | 5 + .../PlanInformationManagementHelper.java | 17 + .../PlanInformationManagementServiceInfo.java | 288 + .../PlanInformationManagementAdapter.java | 592 + .../PlanInformationManagementStub.java | 444 + .../consumer/package-info.java | 5 + .../package-info.java | 10 + .../provider/ListActivityDefsInteraction.java | 92 + .../provider/ListEventDefsInteraction.java | 92 + .../provider/ListRequestDefsInteraction.java | 92 + .../provider/ListResourceDefsInteraction.java | 92 + .../PlanInformationManagementHandler.java | 117 + ...ormationManagementInheritanceSkeleton.java | 147 + .../PlanInformationManagementSkeleton.java | 8 + .../provider/package-info.java | 5 + .../PlanningRequestHelper.java | 17 + .../PlanningRequestServiceInfo.java | 269 + .../MonitorRequestStatusSubscriptionKeys.java | 127 + .../consumer/PlanningRequestAdapter.java | 576 + .../consumer/PlanningRequestStub.java | 377 + .../consumer/package-info.java | 4 + .../mo/mps/planningrequest/package-info.java | 13 + .../provider/GetRequestInteraction.java | 91 + .../provider/GetRequestStatusInteraction.java | 92 + .../MonitorRequestStatusPublisher.java | 127 + .../provider/PlanningRequestHandler.java | 90 + .../PlanningRequestInheritanceSkeleton.java | 150 + .../provider/PlanningRequestSkeleton.java | 29 + .../provider/package-info.java | 4 + .../mo/mps/structures/ActivityDefinition.java | 387 + .../structures/ActivityDefinitionList.java | 79 + .../mo/mps/structures/ActivityDetails.java | 183 + .../mps/structures/ActivityDetailsList.java | 23 + .../mo/mps/structures/ActivityInstance.java | 724 + .../mps/structures/ActivityInstanceList.java | 79 + .../moims/mo/mps/structures/ActivityNode.java | 153 + .../mo/mps/structures/ActivityNodeList.java | 79 + .../mo/mps/structures/ActivityStatusEnum.java | 166 + .../structures/ActivityStatusEnumList.java | 79 + .../structures/ActivitySuspensionStatus.java | 217 + .../ActivitySuspensionStatusList.java | 79 + .../mo/mps/structures/ActivityUpdate.java | 583 + .../mo/mps/structures/ActivityUpdateList.java | 79 + .../ccsds/moims/mo/mps/structures/Angle.java | 93 + .../mo/mps/structures/AngleConstraint.java | 281 + .../mps/structures/AngleConstraintList.java | 79 + .../moims/mo/mps/structures/AngleList.java | 79 + .../mo/mps/structures/AngleRepetition.java | 316 + .../mps/structures/AngleRepetitionList.java | 79 + .../moims/mo/mps/structures/AngleTrigger.java | 249 + .../mo/mps/structures/AngleTriggerList.java | 79 + .../mo/mps/structures/AngularVelocity.java | 93 + .../mps/structures/AngularVelocityList.java | 79 + .../ccsds/moims/mo/mps/structures/ArgDef.java | 292 + .../moims/mo/mps/structures/ArgDefList.java | 79 + .../moims/mo/mps/structures/ArgSpec.java | 145 + .../moims/mo/mps/structures/ArgSpecList.java | 79 + .../moims/mo/mps/structures/ArgTypeEnum.java | 489 + .../mo/mps/structures/ArgTypeEnumList.java | 79 + .../moims/mo/mps/structures/Argument.java | 144 + .../mo/mps/structures/ArgumentConstraint.java | 235 + .../structures/ArgumentConstraintList.java | 79 + .../moims/mo/mps/structures/ArgumentList.java | 79 + .../mo/mps/structures/CartesianDirection.java | 212 + .../structures/CartesianDirectionList.java | 79 + .../mo/mps/structures/CartesianPosition.java | 263 + .../mps/structures/CartesianPositionList.java | 79 + .../mo/mps/structures/ComplexEffect.java | 299 + .../mo/mps/structures/ComplexEffectList.java | 79 + .../structures/ComplexResourceConstraint.java | 275 + .../ComplexResourceConstraintList.java | 79 + .../moims/mo/mps/structures/Constraint.java | 85 + .../mps/structures/ConstraintExpression.java | 137 + .../structures/ConstraintExpressionList.java | 79 + .../mo/mps/structures/ConstraintList.java | 23 + .../mo/mps/structures/ConstraintNode.java | 160 + .../mo/mps/structures/ConstraintNodeList.java | 79 + .../moims/mo/mps/structures/DefListEntry.java | 142 + .../mo/mps/structures/DefListEntryList.java | 79 + .../moims/mo/mps/structures/Direction.java | 48 + .../mo/mps/structures/DirectionList.java | 23 + .../mo/mps/structures/DirectionReference.java | 113 + .../structures/DirectionReferenceList.java | 79 + .../mps/structures/DirectionRepetition.java | 244 + .../structures/DirectionRepetitionList.java | 79 + .../mo/mps/structures/DirectionTrigger.java | 161 + .../mps/structures/DirectionTriggerList.java | 79 + .../moims/mo/mps/structures/Distance.java | 93 + .../mo/mps/structures/DistanceConstraint.java | 245 + .../structures/DistanceConstraintList.java | 79 + .../moims/mo/mps/structures/DistanceList.java | 79 + .../mo/mps/structures/DurationConstraint.java | 145 + .../structures/DurationConstraintList.java | 79 + .../ccsds/moims/mo/mps/structures/Effect.java | 88 + .../moims/mo/mps/structures/EffectList.java | 23 + .../mps/structures/EffectOperationEnum.java | 134 + .../structures/EffectOperationEnumList.java | 79 + .../EllipsoidalPositionConstraint.java | 320 + .../EllipsoidalPositionConstraintList.java | 79 + .../mo/mps/structures/EventDefinition.java | 269 + .../mps/structures/EventDefinitionList.java | 79 + .../mo/mps/structures/EventInstance.java | 332 + .../mo/mps/structures/EventInstanceList.java | 79 + .../mo/mps/structures/EventRepetition.java | 208 + .../mps/structures/EventRepetitionList.java | 79 + .../mo/mps/structures/EventStatusEnum.java | 149 + .../mps/structures/EventStatusEnumList.java | 79 + .../moims/mo/mps/structures/EventTrigger.java | 148 + .../mo/mps/structures/EventTriggerList.java | 79 + .../moims/mo/mps/structures/EventUpdate.java | 302 + .../mo/mps/structures/EventUpdateList.java | 79 + .../moims/mo/mps/structures/EventWindow.java | 218 + .../mo/mps/structures/EventWindowList.java | 79 + .../structures/ExpressionOperatorEnum.java | 216 + .../ExpressionOperatorEnumList.java | 79 + .../mo/mps/structures/ExternalExpression.java | 176 + .../structures/ExternalExpressionList.java | 79 + .../mo/mps/structures/FunctionConstraint.java | 258 + .../structures/FunctionConstraintList.java | 79 + .../structures/FunctionDefinitionDetails.java | 223 + .../FunctionDefinitionDetailsList.java | 79 + .../mo/mps/structures/FunctionDetails.java | 149 + .../mps/structures/FunctionDetailsList.java | 79 + .../mps/structures/GeometricConstraint.java | 190 + .../structures/GeometricConstraintList.java | 23 + .../structures/InsertedActivityDetails.java | 431 + .../InsertedActivityDetailsList.java | 79 + .../mps/structures/InsertedEventDetails.java | 220 + .../structures/InsertedEventDetailsList.java | 79 + .../mps/structures/InterpolationTypeEnum.java | 134 + .../structures/InterpolationTypeEnumList.java | 79 + .../moims/mo/mps/structures/ItemRevision.java | 143 + .../mo/mps/structures/ItemRevisionList.java | 79 + .../moims/mo/mps/structures/LogicOpEnum.java | 118 + .../mo/mps/structures/LogicOpEnumList.java | 79 + .../moims/mo/mps/structures/NamedElement.java | 151 + .../mo/mps/structures/NamedElementList.java | 79 + .../mps/structures/NamedTargetDirection.java | 115 + .../structures/NamedTargetDirectionList.java | 79 + .../moims/mo/mps/structures/NumericRange.java | 140 + .../mo/mps/structures/NumericRangeList.java | 79 + .../mo/mps/structures/NumericResource.java | 147 + .../mps/structures/NumericResourceList.java | 79 + .../mo/mps/structures/ObjectPosition.java | 115 + .../mo/mps/structures/ObjectPositionList.java | 79 + .../mo/mps/structures/OrbitFilePosition.java | 113 + .../mps/structures/OrbitFilePositionList.java | 79 + .../mo/mps/structures/OrbitRepetition.java | 323 + .../mps/structures/OrbitRepetitionList.java | 79 + .../mo/mps/structures/OrbitalPosition.java | 184 + .../mps/structures/OrbitalPositionList.java | 79 + .../moims/mo/mps/structures/PartialPlan.java | 318 + .../mo/mps/structures/PartialPlanFilter.java | 280 + .../mps/structures/PartialPlanFilterList.java | 79 + .../mo/mps/structures/PartialPlanList.java | 79 + .../mo/mps/structures/PhysicalValue.java | 129 + .../mo/mps/structures/PhysicalValueList.java | 23 + .../ccsds/moims/mo/mps/structures/Plan.java | 453 + .../mps/structures/PlanActivationStatus.java | 175 + .../structures/PlanActivationStatusList.java | 79 + .../mo/mps/structures/PlanDetailUpdate.java | 49 + .../mps/structures/PlanDetailUpdateList.java | 23 + .../moims/mo/mps/structures/PlanFilter.java | 255 + .../mo/mps/structures/PlanFilterList.java | 79 + .../mo/mps/structures/PlanInformation.java | 405 + .../mps/structures/PlanInformationList.java | 79 + .../moims/mo/mps/structures/PlanList.java | 79 + .../moims/mo/mps/structures/PlanQuery.java | 512 + .../mo/mps/structures/PlanQueryList.java | 79 + .../moims/mo/mps/structures/PlanRevision.java | 224 + .../mo/mps/structures/PlanRevisionList.java | 79 + .../mo/mps/structures/PlanStatusEnum.java | 165 + .../mo/mps/structures/PlanStatusEnumList.java | 79 + .../mo/mps/structures/PlanSummaryStatus.java | 367 + .../mps/structures/PlanSummaryStatusList.java | 79 + .../moims/mo/mps/structures/PlanUpdate.java | 266 + .../mo/mps/structures/PlanUpdateList.java | 79 + .../moims/mo/mps/structures/PlannedItems.java | 136 + .../mo/mps/structures/PlannedItemsList.java | 79 + .../structures/PlanningRequestDetails.java | 569 + .../PlanningRequestDetailsList.java | 79 + .../structures/PlanningRequestResponse.java | 146 + .../PlanningRequestResponseList.java | 79 + .../moims/mo/mps/structures/PlanningUser.java | 83 + .../mo/mps/structures/PlanningUserList.java | 79 + .../mo/mps/structures/PointingConstraint.java | 347 + .../structures/PointingConstraintList.java | 79 + .../moims/mo/mps/structures/Position.java | 48 + .../mo/mps/structures/PositionConstraint.java | 183 + .../structures/PositionConstraintList.java | 79 + .../moims/mo/mps/structures/PositionList.java | 23 + .../mo/mps/structures/PositionReference.java | 114 + .../mps/structures/PositionReferenceList.java | 79 + .../mo/mps/structures/PositionRepetition.java | 243 + .../structures/PositionRepetitionList.java | 79 + .../mo/mps/structures/PositionTrigger.java | 161 + .../mps/structures/PositionTriggerList.java | 79 + .../mo/mps/structures/PredictabilityEnum.java | 118 + .../structures/PredictabilityEnumList.java | 79 + .../moims/mo/mps/structures/ProfileEntry.java | 141 + .../mo/mps/structures/ProfileEntryList.java | 79 + .../mo/mps/structures/ProfileSegment.java | 285 + .../mo/mps/structures/ProfileSegmentList.java | 79 + .../mo/mps/structures/RADecDirection.java | 182 + .../mo/mps/structures/RADecDirectionList.java | 79 + .../mps/structures/RelativeProfileEntry.java | 143 + .../structures/RelativeProfileEntryList.java | 79 + .../structures/RelativeProfileSegment.java | 285 + .../RelativeProfileSegmentList.java | 79 + .../structures/RelativeResourceProfile.java | 142 + .../RelativeResourceProfileList.java | 79 + .../moims/mo/mps/structures/Repetition.java | 167 + .../mo/mps/structures/RepetitionList.java | 23 + .../mo/mps/structures/RequestDefinition.java | 236 + .../mps/structures/RequestDefinitionList.java | 79 + .../mo/mps/structures/RequestFilter.java | 319 + .../mo/mps/structures/RequestFilterList.java | 79 + .../mo/mps/structures/RequestInstance.java | 381 + .../mps/structures/RequestInstanceList.java | 79 + .../mo/mps/structures/RequestStatusEnum.java | 215 + .../mps/structures/RequestStatusEnumList.java | 79 + .../mps/structures/RequestStatusUpdate.java | 365 + .../structures/RequestStatusUpdateList.java | 79 + .../mps/structures/RequestSummaryStatus.java | 570 + .../structures/RequestSummaryStatusList.java | 79 + .../moims/mo/mps/structures/Resource.java | 272 + .../mo/mps/structures/ResourceConstraint.java | 144 + .../structures/ResourceConstraintList.java | 23 + .../moims/mo/mps/structures/ResourceList.java | 79 + .../mo/mps/structures/ResourceProfile.java | 142 + .../mps/structures/ResourceProfileList.java | 79 + .../mo/mps/structures/ResourceUpdate.java | 190 + .../mo/mps/structures/ResourceUpdateList.java | 79 + .../mo/mps/structures/RevisionStatusEnum.java | 150 + .../structures/RevisionStatusEnumList.java | 79 + .../mps/structures/RevolutionConstraint.java | 172 + .../structures/RevolutionConstraintList.java | 79 + .../mps/structures/RevolutionRepetition.java | 207 + .../structures/RevolutionRepetitionList.java | 79 + .../structures/SecondaryErrorCodeEnum.java | 215 + .../SecondaryErrorCodeEnumList.java | 79 + .../mps/structures/SeparationConstraint.java | 389 + .../structures/SeparationConstraintList.java | 79 + .../mo/mps/structures/SeparationTypeEnum.java | 118 + .../structures/SeparationTypeEnumList.java | 79 + .../mps/structures/SequentialConstraint.java | 258 + .../structures/SequentialConstraintList.java | 79 + .../mps/structures/SimpleActivityDetails.java | 294 + .../structures/SimpleActivityDetailsList.java | 79 + .../moims/mo/mps/structures/SimpleEffect.java | 238 + .../mo/mps/structures/SimpleEffectList.java | 79 + .../structures/SimpleResourceConstraint.java | 138 + .../SimpleResourceConstraintList.java | 79 + .../ccsds/moims/mo/mps/structures/Slider.java | 110 + .../moims/mo/mps/structures/SliderList.java | 79 + .../mo/mps/structures/SphericalDirection.java | 181 + .../structures/SphericalDirectionList.java | 79 + .../moims/mo/mps/structures/StateDef.java | 142 + .../moims/mo/mps/structures/StateDefList.java | 79 + .../moims/mo/mps/structures/StatusValues.java | 115 + .../mo/mps/structures/StatusValuesList.java | 79 + .../mo/mps/structures/StringPattern.java | 144 + .../mo/mps/structures/StringPatternList.java | 79 + .../structures/SubPlanActivationStatus.java | 175 + .../SubPlanActivationStatusList.java | 79 + .../mo/mps/structures/SubPlanStatusEnum.java | 118 + .../mps/structures/SubPlanStatusEnumList.java | 79 + .../mo/mps/structures/SubPlanUpdate.java | 179 + .../mo/mps/structures/SubPlanUpdateList.java | 79 + .../mo/mps/structures/SurfacePosition.java | 292 + .../mps/structures/SurfacePositionList.java | 79 + .../mo/mps/structures/TemporalRepetition.java | 206 + .../structures/TemporalRepetitionList.java | 79 + .../mo/mps/structures/TimeConstraint.java | 161 + .../mo/mps/structures/TimeConstraintList.java | 79 + .../moims/mo/mps/structures/TimeTrigger.java | 118 + .../mo/mps/structures/TimeTriggerList.java | 79 + .../moims/mo/mps/structures/TimeWindow.java | 141 + .../mps/structures/TimeWindowConstraint.java | 193 + .../structures/TimeWindowConstraintList.java | 79 + .../mo/mps/structures/TimeWindowList.java | 79 + .../moims/mo/mps/structures/Trigger.java | 91 + .../moims/mo/mps/structures/TriggerList.java | 23 + .../mo/mps/structures/ValidationDetails.java | 47 + .../mps/structures/ValidationDetailsList.java | 23 + .../moims/mo/mps/structures/package-info.java | 4 + .../moims/mo/mpd/DeliveryFailedException.java | 28 + .../ccsds/moims/mo/mpd/InvalidException.java | 28 + .../ccsds/moims/mo/mpd/MPDElementFactory.java | 55 + .../org/ccsds/moims/mo/mpd/MPDHelper.java | 105 + .../moims/mo/mpd/OrderFailedException.java | 27 + .../ccsds/moims/mo/mpd/TooManyException.java | 27 + .../ccsds/moims/mo/mpd/UnknownException.java | 27 + .../OrderManagementHelper.java | 17 + .../OrderManagementServiceInfo.java | 140 + .../consumer/OrderManagementAdapter.java | 143 + .../consumer/OrderManagementStub.java | 171 + .../consumer/package-info.java | 4 + .../mo/mpd/ordermanagement/package-info.java | 6 + .../provider/OrderManagementHandler.java | 52 + .../OrderManagementInheritanceSkeleton.java | 124 + .../provider/OrderManagementSkeleton.java | 8 + .../provider/package-info.java | 4 + .../org/ccsds/moims/mo/mpd/package-info.java | 4 + .../ProductOrderDeliveryHelper.java | 17 + .../ProductOrderDeliveryServiceInfo.java | 142 + .../DeliverProductsSubscriptionKeys.java | 88 + ...NotifyProductDeliverySubscriptionKeys.java | 88 + .../consumer/ProductOrderDeliveryAdapter.java | 257 + .../consumer/ProductOrderDeliveryStub.java | 137 + .../consumer/package-info.java | 4 + .../productorderdelivery/package-info.java | 10 + .../provider/DeliverProductsPublisher.java | 119 + .../NotifyProductDeliveryPublisher.java | 125 + .../provider/ProductOrderDeliveryHandler.java | 15 + ...oductOrderDeliveryInheritanceSkeleton.java | 124 + .../ProductOrderDeliverySkeleton.java | 50 + .../provider/package-info.java | 5 + .../ProductRetrievalHelper.java | 17 + .../ProductRetrievalServiceInfo.java | 150 + .../consumer/ProductRetrievalAdapter.java | 313 + .../consumer/ProductRetrievalStub.java | 183 + .../consumer/package-info.java | 4 + .../mo/mpd/productretrieval/package-info.java | 5 + .../DeliverProductFilesInteraction.java | 96 + .../provider/GetProductsInteraction.java | 91 + .../provider/ProductRetrievalHandler.java | 57 + .../ProductRetrievalInheritanceSkeleton.java | 124 + .../provider/ProductRetrievalSkeleton.java | 8 + .../provider/package-info.java | 4 + .../moims/mo/mpd/structures/AttributeDef.java | 215 + .../mo/mpd/structures/AttributeDefList.java | 79 + .../mo/mpd/structures/AttributeFilter.java | 124 + .../mpd/structures/AttributeFilterList.java | 23 + .../mo/mpd/structures/DeliveryMethodEnum.java | 134 + .../structures/DeliveryMethodEnumList.java | 79 + .../moims/mo/mpd/structures/FileMetadata.java | 172 + .../mo/mpd/structures/FileMetadataList.java | 79 + .../moims/mo/mpd/structures/Product.java | 150 + .../mo/mpd/structures/ProductFilter.java | 210 + .../mo/mpd/structures/ProductFilterList.java | 79 + .../moims/mo/mpd/structures/ProductList.java | 79 + .../mo/mpd/structures/ProductMetadata.java | 415 + .../mpd/structures/ProductMetadataList.java | 79 + .../moims/mo/mpd/structures/ProductType.java | 180 + .../mo/mpd/structures/ProductTypeList.java | 79 + .../mo/mpd/structures/StandingOrder.java | 313 + .../mo/mpd/structures/StandingOrderList.java | 79 + .../mo/mpd/structures/StringPattern.java | 122 + .../mo/mpd/structures/StringPatternList.java | 79 + .../moims/mo/mpd/structures/TimeWindow.java | 140 + .../mo/mpd/structures/TimeWindowList.java | 79 + .../moims/mo/mpd/structures/ValueRange.java | 160 + .../mo/mpd/structures/ValueRangeList.java | 79 + .../moims/mo/mpd/structures/ValueSet.java | 119 + .../moims/mo/mpd/structures/ValueSetList.java | 79 + .../moims/mo/mpd/structures/package-info.java | 4 + .../apigen/generators/docx/DocxBodyTest.java | 8 +- .../docx/DocxGeneratorGoldenTest.java | 8 +- .../generators/docx/DocxNumberingTest.java | 8 +- .../mo/apigen/generators/java/GoldenTree.java | 14 +- .../importers/xml/XmlImporterCorpusTest.java | 15 +- .../xml/area007-v001-Software-Management.xml | 96 - 1086 files changed, 194244 insertions(+), 141 deletions(-) create mode 100644 testbeds/testbed-api-generator/baseline/MANIFEST create mode 100644 testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area001-v001-MAL/[Content_Types].xml create mode 100644 testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area001-v001-MAL/_rels/.rels create mode 100644 testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area001-v001-MAL/word/_rels/document.xml.rels create mode 100644 testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area001-v001-MAL/word/document.xml create mode 100644 testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area001-v001-MAL/word/numbering.xml create mode 100644 testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area001-v001-MAL/word/styles.xml create mode 100644 testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area001-v003-MAL/[Content_Types].xml create mode 100644 testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area001-v003-MAL/_rels/.rels create mode 100644 testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area001-v003-MAL/word/_rels/document.xml.rels create mode 100644 testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area001-v003-MAL/word/document.xml create mode 100644 testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area001-v003-MAL/word/numbering.xml create mode 100644 testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area001-v003-MAL/word/styles.xml create mode 100644 testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area002-v001-COM/[Content_Types].xml create mode 100644 testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area002-v001-COM/_rels/.rels create mode 100644 testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area002-v001-COM/word/_rels/document.xml.rels create mode 100644 testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area002-v001-COM/word/document.xml create mode 100644 testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area002-v001-COM/word/numbering.xml create mode 100644 testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area002-v001-COM/word/styles.xml create mode 100644 testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area003-v001-Common/[Content_Types].xml create mode 100644 testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area003-v001-Common/_rels/.rels create mode 100644 testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area003-v001-Common/word/_rels/document.xml.rels create mode 100644 testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area003-v001-Common/word/document.xml create mode 100644 testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area003-v001-Common/word/numbering.xml create mode 100644 testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area003-v001-Common/word/styles.xml create mode 100644 testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area004-v001-MC/[Content_Types].xml create mode 100644 testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area004-v001-MC/_rels/.rels create mode 100644 testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area004-v001-MC/word/_rels/document.xml.rels create mode 100644 testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area004-v001-MC/word/document.xml create mode 100644 testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area004-v001-MC/word/media/image1.png create mode 100644 testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area004-v001-MC/word/media/image2.png create mode 100644 testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area004-v001-MC/word/media/image3.png create mode 100644 testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area004-v001-MC/word/media/image4.png create mode 100644 testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area004-v001-MC/word/media/image5.png create mode 100644 testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area004-v001-MC/word/media/image6.png create mode 100644 testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area004-v001-MC/word/media/image7.png create mode 100644 testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area004-v001-MC/word/media/image8.png create mode 100644 testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area004-v001-MC/word/numbering.xml create mode 100644 testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area004-v001-MC/word/styles.xml create mode 100644 testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area004-v002-MC/[Content_Types].xml create mode 100644 testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area004-v002-MC/_rels/.rels create mode 100644 testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area004-v002-MC/word/_rels/document.xml.rels create mode 100644 testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area004-v002-MC/word/document.xml create mode 100644 testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area004-v002-MC/word/numbering.xml create mode 100644 testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area004-v002-MC/word/styles.xml create mode 100644 testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area005-v001-MPS/[Content_Types].xml create mode 100644 testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area005-v001-MPS/_rels/.rels create mode 100644 testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area005-v001-MPS/word/_rels/document.xml.rels create mode 100644 testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area005-v001-MPS/word/document.xml create mode 100644 testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area005-v001-MPS/word/numbering.xml create mode 100644 testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area005-v001-MPS/word/styles.xml create mode 100644 testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area007-v001-SoftwareManagement/[Content_Types].xml create mode 100644 testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area007-v001-SoftwareManagement/_rels/.rels create mode 100644 testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area007-v001-SoftwareManagement/word/_rels/document.xml.rels create mode 100644 testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area007-v001-SoftwareManagement/word/document.xml create mode 100644 testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area007-v001-SoftwareManagement/word/numbering.xml create mode 100644 testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area007-v001-SoftwareManagement/word/styles.xml create mode 100644 testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area009-v001-MPD/[Content_Types].xml create mode 100644 testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area009-v001-MPD/_rels/.rels create mode 100644 testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area009-v001-MPD/word/_rels/document.xml.rels create mode 100644 testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area009-v001-MPD/word/document.xml create mode 100644 testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area009-v001-MPD/word/numbering.xml create mode 100644 testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area009-v001-MPD/word/styles.xml create mode 100644 testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area009-v001-distribution/[Content_Types].xml create mode 100644 testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area009-v001-distribution/_rels/.rels create mode 100644 testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area009-v001-distribution/word/_rels/document.xml.rels create mode 100644 testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area009-v001-distribution/word/document.xml create mode 100644 testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area009-v001-distribution/word/numbering.xml create mode 100644 testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area009-v001-distribution/word/styles.xml create mode 100644 testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area020-v001-FM/[Content_Types].xml create mode 100644 testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area020-v001-FM/_rels/.rels create mode 100644 testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area020-v001-FM/word/_rels/document.xml.rels create mode 100644 testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area020-v001-FM/word/document.xml create mode 100644 testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area020-v001-FM/word/numbering.xml create mode 100644 testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area020-v001-FM/word/styles.xml create mode 100644 testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area051-v001-MDP/[Content_Types].xml create mode 100644 testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area051-v001-MDP/_rels/.rels create mode 100644 testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area051-v001-MDP/word/_rels/document.xml.rels create mode 100644 testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area051-v001-MDP/word/document.xml create mode 100644 testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area051-v001-MDP/word/numbering.xml create mode 100644 testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area051-v001-MDP/word/styles.xml create mode 100644 testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area001-v001-MAL/[Content_Types].xml create mode 100644 testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area001-v001-MAL/_rels/.rels create mode 100644 testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area001-v001-MAL/word/_rels/document.xml.rels create mode 100644 testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area001-v001-MAL/word/document.xml create mode 100644 testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area001-v001-MAL/word/numbering.xml create mode 100644 testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area001-v001-MAL/word/styles.xml create mode 100644 testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area001-v003-MAL/[Content_Types].xml create mode 100644 testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area001-v003-MAL/_rels/.rels create mode 100644 testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area001-v003-MAL/word/_rels/document.xml.rels create mode 100644 testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area001-v003-MAL/word/document.xml create mode 100644 testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area001-v003-MAL/word/numbering.xml create mode 100644 testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area001-v003-MAL/word/styles.xml create mode 100644 testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area002-v001-COM/[Content_Types].xml create mode 100644 testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area002-v001-COM/_rels/.rels create mode 100644 testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area002-v001-COM/word/_rels/document.xml.rels create mode 100644 testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area002-v001-COM/word/document.xml create mode 100644 testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area002-v001-COM/word/numbering.xml create mode 100644 testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area002-v001-COM/word/styles.xml create mode 100644 testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area003-v001-Common/[Content_Types].xml create mode 100644 testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area003-v001-Common/_rels/.rels create mode 100644 testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area003-v001-Common/word/_rels/document.xml.rels create mode 100644 testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area003-v001-Common/word/document.xml create mode 100644 testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area003-v001-Common/word/numbering.xml create mode 100644 testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area003-v001-Common/word/styles.xml create mode 100644 testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area004-v001-MC/[Content_Types].xml create mode 100644 testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area004-v001-MC/_rels/.rels create mode 100644 testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area004-v001-MC/word/_rels/document.xml.rels create mode 100644 testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area004-v001-MC/word/document.xml create mode 100644 testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area004-v001-MC/word/media/image1.png create mode 100644 testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area004-v001-MC/word/media/image2.png create mode 100644 testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area004-v001-MC/word/media/image3.png create mode 100644 testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area004-v001-MC/word/media/image4.png create mode 100644 testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area004-v001-MC/word/media/image5.png create mode 100644 testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area004-v001-MC/word/media/image6.png create mode 100644 testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area004-v001-MC/word/media/image7.png create mode 100644 testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area004-v001-MC/word/media/image8.png create mode 100644 testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area004-v001-MC/word/numbering.xml create mode 100644 testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area004-v001-MC/word/styles.xml create mode 100644 testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area004-v002-MC/[Content_Types].xml create mode 100644 testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area004-v002-MC/_rels/.rels create mode 100644 testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area004-v002-MC/word/_rels/document.xml.rels create mode 100644 testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area004-v002-MC/word/document.xml create mode 100644 testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area004-v002-MC/word/numbering.xml create mode 100644 testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area004-v002-MC/word/styles.xml create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/AuthenticationFailedException.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/AuthorisationFailException.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/BadEncodingException.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/DeliveryDelayedException.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/DeliveryFailedException.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/DeliveryTimedoutException.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/DestinationLostException.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/DestinationTransientException.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/DestinationUnknownException.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/EncryptionFailException.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/IncorrectStateException.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/InternalException.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/MALElementFactory.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/MALHelper.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/ShutdownException.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/TooManyException.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/TransactionTimeoutException.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/UnknownException.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/UnsupportedAreaException.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/UnsupportedAreaVersionException.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/UnsupportedOperationException.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/UnsupportedServiceException.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/AttributeType.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/AttributeTypeList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/BlobList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/BooleanList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/DoubleList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/DurationList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/File.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/FileList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/FineTimeList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/FloatList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/IdBooleanPair.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/IdBooleanPairList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/IdentifierList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/IntegerList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/InteractionType.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/InteractionTypeList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/LongList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/MOArea.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/MOAreaList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/NamedValue.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/NamedValueList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/NullableAttribute.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/NullableAttributeList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/ObjectIdentity.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/ObjectIdentityList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/ObjectRefList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/OctetList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/Pair.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/PairList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/QoSLevel.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/QoSLevelList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/ServiceId.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/ServiceIdList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/SessionType.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/SessionTypeList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/ShortList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/StringList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/Subscription.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/SubscriptionFilter.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/SubscriptionFilterList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/SubscriptionList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/TimeList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/UIntegerList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/ULongList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/UOctetList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/URIList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/UShortList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/UpdateHeader.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/UpdateHeaderList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/COMElementFactory.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/COMHelper.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/DuplicateException.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/InvalidException.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/activitytracking/ActivityTrackingHelper.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/activitytracking/ActivityTrackingServiceInfo.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/activitytracking/consumer/ActivityTrackingAdapter.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/activitytracking/consumer/ActivityTrackingStub.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/activitytracking/consumer/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/activitytracking/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/activitytracking/provider/ActivityTrackingHandler.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/activitytracking/provider/ActivityTrackingInheritanceSkeleton.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/activitytracking/provider/ActivityTrackingSkeleton.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/activitytracking/provider/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/activitytracking/structures/ActivityAcceptance.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/activitytracking/structures/ActivityAcceptanceList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/activitytracking/structures/ActivityExecution.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/activitytracking/structures/ActivityExecutionList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/activitytracking/structures/ActivityTransfer.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/activitytracking/structures/ActivityTransferList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/activitytracking/structures/OperationActivity.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/activitytracking/structures/OperationActivityList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/activitytracking/structures/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/ArchiveHelper.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/ArchiveServiceInfo.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/consumer/ArchiveAdapter.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/consumer/ArchiveStub.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/consumer/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/provider/ArchiveHandler.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/provider/ArchiveInheritanceSkeleton.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/provider/ArchiveSkeleton.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/provider/CountInteraction.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/provider/QueryInteraction.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/provider/RetrieveInteraction.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/provider/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/structures/ArchiveDetails.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/structures/ArchiveDetailsList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/structures/ArchiveQuery.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/structures/ArchiveQueryList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/structures/CompositeFilter.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/structures/CompositeFilterList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/structures/CompositeFilterSet.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/structures/CompositeFilterSetList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/structures/ExpressionOperator.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/structures/ExpressionOperatorList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/structures/QueryFilter.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/structures/QueryFilterList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/structures/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/event/EventHelper.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/event/EventServiceInfo.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/event/consumer/EventAdapter.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/event/consumer/EventStub.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/event/consumer/MonitorEventSubscriptionKeys.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/event/consumer/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/event/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/event/provider/EventHandler.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/event/provider/EventInheritanceSkeleton.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/event/provider/EventSkeleton.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/event/provider/MonitorEventPublisher.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/event/provider/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/structures/InstanceBooleanPair.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/structures/InstanceBooleanPairList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/structures/ObjectDetails.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/structures/ObjectDetailsList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/structures/ObjectId.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/structures/ObjectIdList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/structures/ObjectKey.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/structures/ObjectKeyList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/structures/ObjectType.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/structures/ObjectTypeList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/structures/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/CommonElementFactory.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/CommonHelper.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/configuration/ConfigurationHelper.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/configuration/ConfigurationServiceInfo.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/configuration/consumer/ConfigurationAdapter.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/configuration/consumer/ConfigurationStub.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/configuration/consumer/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/configuration/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/configuration/provider/ActivateInteraction.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/configuration/provider/ConfigurationHandler.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/configuration/provider/ConfigurationInheritanceSkeleton.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/configuration/provider/ConfigurationSkeleton.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/configuration/provider/StoreCurrentInteraction.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/configuration/provider/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/configuration/structures/ConfigurationObjectDetails.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/configuration/structures/ConfigurationObjectDetailsList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/configuration/structures/ConfigurationObjectSet.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/configuration/structures/ConfigurationObjectSetList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/configuration/structures/ConfigurationType.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/configuration/structures/ConfigurationTypeList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/configuration/structures/ServiceConfigurationIdentifier.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/configuration/structures/ServiceConfigurationIdentifierList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/configuration/structures/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/DirectoryHelper.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/DirectoryServiceInfo.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/body/PublishProviderResponse.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/body/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/consumer/DirectoryAdapter.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/consumer/DirectoryStub.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/consumer/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/provider/DirectoryHandler.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/provider/DirectoryInheritanceSkeleton.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/provider/DirectorySkeleton.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/provider/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/structures/AddressDetails.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/structures/AddressDetailsList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/structures/ProviderDetails.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/structures/ProviderDetailsList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/structures/ProviderSummary.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/structures/ProviderSummaryList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/structures/PublishDetails.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/structures/PublishDetailsList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/structures/ServiceCapability.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/structures/ServiceCapabilityList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/structures/ServiceFilter.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/structures/ServiceFilterList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/structures/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/login/LoginHelper.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/login/LoginServiceInfo.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/login/body/HandoverResponse.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/login/body/LoginResponse.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/login/body/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/login/consumer/LoginAdapter.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/login/consumer/LoginStub.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/login/consumer/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/login/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/login/provider/LoginHandler.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/login/provider/LoginInheritanceSkeleton.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/login/provider/LoginSkeleton.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/login/provider/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/login/structures/Profile.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/login/structures/ProfileList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/login/structures/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/structures/ServiceKey.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/structures/ServiceKeyList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/structures/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/MCElementFactory.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/MCHelper.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/ReadonlyException.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/ReferencedException.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/action/ActionHelper.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/action/ActionServiceInfo.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/action/consumer/ActionAdapter.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/action/consumer/ActionStub.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/action/consumer/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/action/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/action/provider/ActionHandler.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/action/provider/ActionInheritanceSkeleton.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/action/provider/ActionSkeleton.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/action/provider/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/action/structures/ActionCategory.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/action/structures/ActionCategoryList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/action/structures/ActionCreationRequest.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/action/structures/ActionCreationRequestList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/action/structures/ActionDefinitionDetails.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/action/structures/ActionDefinitionDetailsList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/action/structures/ActionInstanceDetails.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/action/structures/ActionInstanceDetailsList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/action/structures/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/AggregationHelper.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/AggregationServiceInfo.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/consumer/AggregationAdapter.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/consumer/AggregationStub.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/consumer/MonitorValueSubscriptionKeys.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/consumer/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/provider/AggregationHandler.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/provider/AggregationInheritanceSkeleton.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/provider/AggregationSkeleton.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/provider/MonitorValuePublisher.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/provider/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/AggregationCategory.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/AggregationCategoryList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/AggregationCreationRequest.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/AggregationCreationRequestList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/AggregationDefinitionDetails.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/AggregationDefinitionDetailsList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/AggregationParameterSet.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/AggregationParameterSetList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/AggregationParameterValue.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/AggregationParameterValueList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/AggregationSetValue.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/AggregationSetValueList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/AggregationValue.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/AggregationValueDetails.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/AggregationValueDetailsList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/AggregationValueList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/GenerationMode.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/GenerationModeList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/ThresholdFilter.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/ThresholdFilterList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/ThresholdType.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/ThresholdTypeList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/alert/AlertHelper.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/alert/AlertServiceInfo.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/alert/consumer/AlertAdapter.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/alert/consumer/AlertStub.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/alert/consumer/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/alert/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/alert/provider/AlertHandler.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/alert/provider/AlertInheritanceSkeleton.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/alert/provider/AlertSkeleton.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/alert/provider/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/alert/structures/AlertCreationRequest.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/alert/structures/AlertCreationRequestList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/alert/structures/AlertDefinitionDetails.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/alert/structures/AlertDefinitionDetailsList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/alert/structures/AlertEventDetails.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/alert/structures/AlertEventDetailsList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/alert/structures/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/CheckHelper.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/CheckServiceInfo.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/consumer/CheckAdapter.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/consumer/CheckStub.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/consumer/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/provider/CheckHandler.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/provider/CheckInheritanceSkeleton.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/provider/CheckSkeleton.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/provider/GetCurrentTransitionListInteraction.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/provider/GetSummaryReportInteraction.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/provider/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/CheckDefinitionDetails.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/CheckDefinitionDetailsList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/CheckLinkDetails.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/CheckLinkDetailsList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/CheckLinkSummary.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/CheckLinkSummaryList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/CheckResult.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/CheckResultFilter.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/CheckResultFilterList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/CheckResultList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/CheckResultSummary.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/CheckResultSummaryList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/CheckState.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/CheckStateList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/CheckTypedInstance.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/CheckTypedInstanceList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/CompoundCheckDefinition.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/CompoundCheckDefinitionList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/ConstantCheckDefinition.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/ConstantCheckDefinitionList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/DeltaCheckDefinition.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/DeltaCheckDefinitionList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/LimitCheckDefinition.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/LimitCheckDefinitionList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/ReferenceCheckDefinition.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/ReferenceCheckDefinitionList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/ReferenceValue.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/ReferenceValueList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/conversion/ConversionHelper.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/conversion/ConversionServiceInfo.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/conversion/consumer/ConversionAdapter.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/conversion/consumer/ConversionStub.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/conversion/consumer/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/conversion/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/conversion/provider/ConversionHandler.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/conversion/provider/ConversionInheritanceSkeleton.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/conversion/provider/ConversionSkeleton.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/conversion/provider/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/conversion/structures/DiscreteConversionDetails.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/conversion/structures/DiscreteConversionDetailsList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/conversion/structures/LineConversionDetails.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/conversion/structures/LineConversionDetailsList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/conversion/structures/PolyConversionDetails.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/conversion/structures/PolyConversionDetailsList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/conversion/structures/RangeConversionDetails.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/conversion/structures/RangeConversionDetailsList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/conversion/structures/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/group/GroupHelper.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/group/GroupServiceInfo.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/group/consumer/GroupAdapter.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/group/consumer/GroupStub.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/group/consumer/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/group/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/group/provider/GroupHandler.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/group/provider/GroupInheritanceSkeleton.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/group/provider/GroupSkeleton.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/group/provider/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/group/structures/GroupDetails.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/group/structures/GroupDetailsList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/group/structures/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/ParameterHelper.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/ParameterServiceInfo.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/consumer/MonitorValueSubscriptionKeys.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/consumer/ParameterAdapter.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/consumer/ParameterStub.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/consumer/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/provider/MonitorValuePublisher.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/provider/ParameterHandler.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/provider/ParameterInheritanceSkeleton.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/provider/ParameterSkeleton.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/provider/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/structures/ParameterConversion.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/structures/ParameterConversionList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/structures/ParameterCreationRequest.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/structures/ParameterCreationRequestList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/structures/ParameterDefinitionDetails.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/structures/ParameterDefinitionDetailsList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/structures/ParameterRawValue.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/structures/ParameterRawValueList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/structures/ParameterValue.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/structures/ParameterValueDetails.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/structures/ParameterValueDetailsList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/structures/ParameterValueList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/structures/ValidityState.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/structures/ValidityStateList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/structures/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/StatisticHelper.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/StatisticServiceInfo.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/consumer/MonitorStatisticsSubscriptionKeys.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/consumer/StatisticAdapter.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/consumer/StatisticStub.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/consumer/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/provider/MonitorStatisticsPublisher.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/provider/StatisticHandler.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/provider/StatisticInheritanceSkeleton.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/provider/StatisticSkeleton.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/provider/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/structures/StatisticCreationRequest.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/structures/StatisticCreationRequestList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/structures/StatisticEvaluationReport.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/structures/StatisticEvaluationReportList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/structures/StatisticFunctionDetails.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/structures/StatisticFunctionDetailsList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/structures/StatisticLinkDetails.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/structures/StatisticLinkDetailsList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/structures/StatisticLinkSummary.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/structures/StatisticLinkSummaryList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/structures/StatisticValue.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/structures/StatisticValueList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/structures/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/structures/ArgumentDefinitionDetails.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/structures/ArgumentDefinitionDetailsList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/structures/AttributeValue.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/structures/AttributeValueList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/structures/ConditionalConversion.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/structures/ConditionalConversionList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/structures/ObjectInstancePair.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/structures/ObjectInstancePairList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/structures/ParameterExpression.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/structures/ParameterExpressionList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/structures/Severity.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/structures/SeverityList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/structures/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/AmbiguousException.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/DuplicateException.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/InvalidException.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/MCElementFactory.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/MCHelper.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/ReadOnlyException.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/RejectedException.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/action/ActionHelper.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/action/ActionServiceInfo.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/action/consumer/ActionAdapter.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/action/consumer/ActionStub.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/action/consumer/MonitorExecutionSubscriptionKeys.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/action/consumer/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/action/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/action/provider/ActionHandler.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/action/provider/ActionInheritanceSkeleton.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/action/provider/ActionSkeleton.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/action/provider/MonitorExecutionPublisher.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/action/provider/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/aggregation/AggregationHelper.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/aggregation/AggregationServiceInfo.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/aggregation/consumer/AggregationAdapter.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/aggregation/consumer/AggregationStub.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/aggregation/consumer/MonitorValueSubscriptionKeys.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/aggregation/consumer/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/aggregation/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/aggregation/provider/AggregationHandler.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/aggregation/provider/AggregationInheritanceSkeleton.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/aggregation/provider/AggregationSkeleton.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/aggregation/provider/MonitorValuePublisher.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/aggregation/provider/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/alert/AlertHelper.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/alert/AlertServiceInfo.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/alert/consumer/AlertAdapter.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/alert/consumer/AlertStub.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/alert/consumer/MonitorAlertSubscriptionKeys.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/alert/consumer/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/alert/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/alert/provider/AlertHandler.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/alert/provider/AlertInheritanceSkeleton.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/alert/provider/AlertSkeleton.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/alert/provider/MonitorAlertPublisher.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/alert/provider/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/packet/PacketHelper.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/packet/PacketServiceInfo.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/packet/consumer/DeliverPacketSubscriptionKeys.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/packet/consumer/PacketAdapter.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/packet/consumer/PacketStub.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/packet/consumer/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/packet/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/packet/provider/DeliverPacketPublisher.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/packet/provider/PacketHandler.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/packet/provider/PacketInheritanceSkeleton.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/packet/provider/PacketSkeleton.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/packet/provider/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/parameter/ParameterHelper.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/parameter/ParameterServiceInfo.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/parameter/consumer/MonitorValueSubscriptionKeys.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/parameter/consumer/ParameterAdapter.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/parameter/consumer/ParameterStub.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/parameter/consumer/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/parameter/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/parameter/provider/MonitorValuePublisher.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/parameter/provider/ParameterHandler.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/parameter/provider/ParameterInheritanceSkeleton.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/parameter/provider/ParameterSkeleton.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/parameter/provider/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ActionCategory.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ActionCategoryList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ActionCompleteEvent.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ActionCompleteEventList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ActionDefinition.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ActionDefinitionList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ActionEvent.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ActionEventList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ActionExecutionRequest.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ActionExecutionRequestList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ActionInProgressEvent.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ActionInProgressEventList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ActionStartEvent.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ActionStartEventList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/AggregationDefinition.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/AggregationDefinitionList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/AggregationValue.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/AggregationValueList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/AlertConfiguration.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/AlertConfigurationList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/AlertDefinition.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/AlertDefinitionList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/AlertEvent.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/AlertEventList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ArgumentDefinition.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ArgumentDefinitionList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/PacketValue.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/PacketValueList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ParameterDefinition.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ParameterDefinitionList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ParameterValue.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ParameterValueData.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ParameterValueDataList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ParameterValueList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ReportConfiguration.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ReportConfigurationList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/Severity.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/SeverityList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ValidityState.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ValidityStateList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/ActivateFailedException.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/ActivateSubplanFailedException.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/CancelFailedException.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/DeactivateFailedException.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/DeactivateSubplanFailedException.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/DeleteFailedException.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/InsertFailedException.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/InvalidException.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/MPSElementFactory.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/MPSHelper.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/RevokeFailedException.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/SubmitFailedException.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/UnsupportedException.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/UpdateFailedException.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/plandistribution/PlanDistributionHelper.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/plandistribution/PlanDistributionServiceInfo.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/plandistribution/consumer/MonitorPlanStatusSubscriptionKeys.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/plandistribution/consumer/MonitorPlanSubscriptionKeys.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/plandistribution/consumer/PlanDistributionAdapter.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/plandistribution/consumer/PlanDistributionStub.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/plandistribution/consumer/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/plandistribution/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/plandistribution/provider/GetPlanInteraction.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/plandistribution/provider/MonitorPlanPublisher.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/plandistribution/provider/MonitorPlanStatusPublisher.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/plandistribution/provider/PlanDistributionHandler.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/plandistribution/provider/PlanDistributionInheritanceSkeleton.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/plandistribution/provider/PlanDistributionSkeleton.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/plandistribution/provider/QueryPlanInteraction.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/plandistribution/provider/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planedit/PlanEditHelper.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planedit/PlanEditServiceInfo.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planedit/consumer/PlanEditAdapter.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planedit/consumer/PlanEditStub.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planedit/consumer/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planedit/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planedit/provider/PlanEditHandler.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planedit/provider/PlanEditInheritanceSkeleton.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planedit/provider/PlanEditSkeleton.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planedit/provider/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planexecutioncontrol/PlanExecutionControlHelper.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planexecutioncontrol/PlanExecutionControlServiceInfo.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planexecutioncontrol/consumer/MonitorPlanExecutionDetailSubscriptionKeys.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planexecutioncontrol/consumer/MonitorPlanExecutionSubscriptionKeys.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planexecutioncontrol/consumer/MonitorSubPlanExecutionSubscriptionKeys.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planexecutioncontrol/consumer/PlanExecutionControlAdapter.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planexecutioncontrol/consumer/PlanExecutionControlStub.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planexecutioncontrol/consumer/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planexecutioncontrol/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planexecutioncontrol/provider/MonitorPlanExecutionDetailPublisher.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planexecutioncontrol/provider/MonitorPlanExecutionPublisher.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planexecutioncontrol/provider/MonitorSubPlanExecutionPublisher.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planexecutioncontrol/provider/PlanExecutionControlHandler.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planexecutioncontrol/provider/PlanExecutionControlInheritanceSkeleton.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planexecutioncontrol/provider/PlanExecutionControlSkeleton.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planexecutioncontrol/provider/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planinformationmanagement/PlanInformationManagementHelper.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planinformationmanagement/PlanInformationManagementServiceInfo.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planinformationmanagement/consumer/PlanInformationManagementAdapter.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planinformationmanagement/consumer/PlanInformationManagementStub.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planinformationmanagement/consumer/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planinformationmanagement/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planinformationmanagement/provider/ListActivityDefsInteraction.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planinformationmanagement/provider/ListEventDefsInteraction.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planinformationmanagement/provider/ListRequestDefsInteraction.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planinformationmanagement/provider/ListResourceDefsInteraction.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planinformationmanagement/provider/PlanInformationManagementHandler.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planinformationmanagement/provider/PlanInformationManagementInheritanceSkeleton.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planinformationmanagement/provider/PlanInformationManagementSkeleton.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planinformationmanagement/provider/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planningrequest/PlanningRequestHelper.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planningrequest/PlanningRequestServiceInfo.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planningrequest/consumer/MonitorRequestStatusSubscriptionKeys.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planningrequest/consumer/PlanningRequestAdapter.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planningrequest/consumer/PlanningRequestStub.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planningrequest/consumer/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planningrequest/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planningrequest/provider/GetRequestInteraction.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planningrequest/provider/GetRequestStatusInteraction.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planningrequest/provider/MonitorRequestStatusPublisher.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planningrequest/provider/PlanningRequestHandler.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planningrequest/provider/PlanningRequestInheritanceSkeleton.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planningrequest/provider/PlanningRequestSkeleton.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planningrequest/provider/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ActivityDefinition.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ActivityDefinitionList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ActivityDetails.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ActivityDetailsList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ActivityInstance.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ActivityInstanceList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ActivityNode.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ActivityNodeList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ActivityStatusEnum.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ActivityStatusEnumList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ActivitySuspensionStatus.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ActivitySuspensionStatusList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ActivityUpdate.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ActivityUpdateList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/Angle.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/AngleConstraint.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/AngleConstraintList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/AngleList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/AngleRepetition.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/AngleRepetitionList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/AngleTrigger.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/AngleTriggerList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/AngularVelocity.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/AngularVelocityList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ArgDef.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ArgDefList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ArgSpec.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ArgSpecList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ArgTypeEnum.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ArgTypeEnumList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/Argument.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ArgumentConstraint.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ArgumentConstraintList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ArgumentList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/CartesianDirection.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/CartesianDirectionList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/CartesianPosition.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/CartesianPositionList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ComplexEffect.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ComplexEffectList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ComplexResourceConstraint.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ComplexResourceConstraintList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/Constraint.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ConstraintExpression.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ConstraintExpressionList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ConstraintList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ConstraintNode.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ConstraintNodeList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/DefListEntry.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/DefListEntryList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/Direction.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/DirectionList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/DirectionReference.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/DirectionReferenceList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/DirectionRepetition.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/DirectionRepetitionList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/DirectionTrigger.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/DirectionTriggerList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/Distance.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/DistanceConstraint.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/DistanceConstraintList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/DistanceList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/DurationConstraint.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/DurationConstraintList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/Effect.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/EffectList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/EffectOperationEnum.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/EffectOperationEnumList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/EllipsoidalPositionConstraint.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/EllipsoidalPositionConstraintList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/EventDefinition.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/EventDefinitionList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/EventInstance.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/EventInstanceList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/EventRepetition.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/EventRepetitionList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/EventStatusEnum.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/EventStatusEnumList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/EventTrigger.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/EventTriggerList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/EventUpdate.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/EventUpdateList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/EventWindow.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/EventWindowList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ExpressionOperatorEnum.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ExpressionOperatorEnumList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ExternalExpression.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ExternalExpressionList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/FunctionConstraint.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/FunctionConstraintList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/FunctionDefinitionDetails.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/FunctionDefinitionDetailsList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/FunctionDetails.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/FunctionDetailsList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/GeometricConstraint.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/GeometricConstraintList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/InsertedActivityDetails.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/InsertedActivityDetailsList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/InsertedEventDetails.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/InsertedEventDetailsList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/InterpolationTypeEnum.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/InterpolationTypeEnumList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ItemRevision.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ItemRevisionList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/LogicOpEnum.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/LogicOpEnumList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/NamedElement.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/NamedElementList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/NamedTargetDirection.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/NamedTargetDirectionList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/NumericRange.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/NumericRangeList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/NumericResource.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/NumericResourceList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ObjectPosition.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ObjectPositionList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/OrbitFilePosition.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/OrbitFilePositionList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/OrbitRepetition.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/OrbitRepetitionList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/OrbitalPosition.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/OrbitalPositionList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PartialPlan.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PartialPlanFilter.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PartialPlanFilterList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PartialPlanList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PhysicalValue.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PhysicalValueList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/Plan.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanActivationStatus.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanActivationStatusList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanDetailUpdate.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanDetailUpdateList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanFilter.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanFilterList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanInformation.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanInformationList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanQuery.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanQueryList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanRevision.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanRevisionList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanStatusEnum.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanStatusEnumList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanSummaryStatus.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanSummaryStatusList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanUpdate.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanUpdateList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlannedItems.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlannedItemsList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanningRequestDetails.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanningRequestDetailsList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanningRequestResponse.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanningRequestResponseList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanningUser.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanningUserList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PointingConstraint.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PointingConstraintList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/Position.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PositionConstraint.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PositionConstraintList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PositionList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PositionReference.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PositionReferenceList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PositionRepetition.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PositionRepetitionList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PositionTrigger.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PositionTriggerList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PredictabilityEnum.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PredictabilityEnumList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ProfileEntry.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ProfileEntryList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ProfileSegment.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ProfileSegmentList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RADecDirection.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RADecDirectionList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RelativeProfileEntry.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RelativeProfileEntryList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RelativeProfileSegment.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RelativeProfileSegmentList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RelativeResourceProfile.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RelativeResourceProfileList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/Repetition.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RepetitionList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RequestDefinition.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RequestDefinitionList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RequestFilter.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RequestFilterList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RequestInstance.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RequestInstanceList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RequestStatusEnum.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RequestStatusEnumList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RequestStatusUpdate.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RequestStatusUpdateList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RequestSummaryStatus.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RequestSummaryStatusList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/Resource.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ResourceConstraint.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ResourceConstraintList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ResourceList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ResourceProfile.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ResourceProfileList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ResourceUpdate.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ResourceUpdateList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RevisionStatusEnum.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RevisionStatusEnumList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RevolutionConstraint.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RevolutionConstraintList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RevolutionRepetition.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RevolutionRepetitionList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SecondaryErrorCodeEnum.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SecondaryErrorCodeEnumList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SeparationConstraint.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SeparationConstraintList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SeparationTypeEnum.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SeparationTypeEnumList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SequentialConstraint.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SequentialConstraintList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SimpleActivityDetails.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SimpleActivityDetailsList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SimpleEffect.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SimpleEffectList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SimpleResourceConstraint.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SimpleResourceConstraintList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/Slider.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SliderList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SphericalDirection.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SphericalDirectionList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/StateDef.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/StateDefList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/StatusValues.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/StatusValuesList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/StringPattern.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/StringPatternList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SubPlanActivationStatus.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SubPlanActivationStatusList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SubPlanStatusEnum.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SubPlanStatusEnumList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SubPlanUpdate.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SubPlanUpdateList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SurfacePosition.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SurfacePositionList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/TemporalRepetition.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/TemporalRepetitionList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/TimeConstraint.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/TimeConstraintList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/TimeTrigger.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/TimeTriggerList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/TimeWindow.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/TimeWindowConstraint.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/TimeWindowConstraintList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/TimeWindowList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/Trigger.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/TriggerList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ValidationDetails.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ValidationDetailsList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/DeliveryFailedException.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/InvalidException.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/MPDElementFactory.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/MPDHelper.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/OrderFailedException.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/TooManyException.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/UnknownException.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/ordermanagement/OrderManagementHelper.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/ordermanagement/OrderManagementServiceInfo.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/ordermanagement/consumer/OrderManagementAdapter.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/ordermanagement/consumer/OrderManagementStub.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/ordermanagement/consumer/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/ordermanagement/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/ordermanagement/provider/OrderManagementHandler.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/ordermanagement/provider/OrderManagementInheritanceSkeleton.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/ordermanagement/provider/OrderManagementSkeleton.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/ordermanagement/provider/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productorderdelivery/ProductOrderDeliveryHelper.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productorderdelivery/ProductOrderDeliveryServiceInfo.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productorderdelivery/consumer/DeliverProductsSubscriptionKeys.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productorderdelivery/consumer/NotifyProductDeliverySubscriptionKeys.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productorderdelivery/consumer/ProductOrderDeliveryAdapter.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productorderdelivery/consumer/ProductOrderDeliveryStub.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productorderdelivery/consumer/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productorderdelivery/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productorderdelivery/provider/DeliverProductsPublisher.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productorderdelivery/provider/NotifyProductDeliveryPublisher.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productorderdelivery/provider/ProductOrderDeliveryHandler.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productorderdelivery/provider/ProductOrderDeliveryInheritanceSkeleton.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productorderdelivery/provider/ProductOrderDeliverySkeleton.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productorderdelivery/provider/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productretrieval/ProductRetrievalHelper.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productretrieval/ProductRetrievalServiceInfo.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productretrieval/consumer/ProductRetrievalAdapter.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productretrieval/consumer/ProductRetrievalStub.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productretrieval/consumer/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productretrieval/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productretrieval/provider/DeliverProductFilesInteraction.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productretrieval/provider/GetProductsInteraction.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productretrieval/provider/ProductRetrievalHandler.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productretrieval/provider/ProductRetrievalInheritanceSkeleton.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productretrieval/provider/ProductRetrievalSkeleton.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productretrieval/provider/package-info.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/AttributeDef.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/AttributeDefList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/AttributeFilter.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/AttributeFilterList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/DeliveryMethodEnum.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/DeliveryMethodEnumList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/FileMetadata.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/FileMetadataList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/Product.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/ProductFilter.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/ProductFilterList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/ProductList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/ProductMetadata.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/ProductMetadataList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/ProductType.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/ProductTypeList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/StandingOrder.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/StandingOrderList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/StringPattern.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/StringPatternList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/TimeWindow.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/TimeWindowList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/ValueRange.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/ValueRangeList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/ValueSet.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/ValueSetList.java create mode 100644 testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/package-info.java rename {api-generator/api-generator-lib => testbeds/testbed-api-generator}/src/test/java/esa/mo/apigen/generators/docx/DocxBodyTest.java (96%) rename {api-generator/api-generator-lib => testbeds/testbed-api-generator}/src/test/java/esa/mo/apigen/generators/docx/DocxNumberingTest.java (92%) diff --git a/.github/workflows/testbeds.yml b/.github/workflows/testbeds.yml index 0272951c..385f228a 100644 --- a/.github/workflows/testbeds.yml +++ b/.github/workflows/testbeds.yml @@ -737,9 +737,8 @@ jobs: path: ~/.m2/repository key: ${{ runner.os }}-maven-mo-testbeds-jdk11-${{ github.sha }} # The golden trees compare the new generators against a baseline captured from the - # old ones. The baseline is not in the repository - it is build output - so those - # tests skip here and the corpus walks and round trips are what run. Capturing it - # first would mean building apis/* twice; see DESIGN.md section 10.8. + # old ones. It is committed at testbeds/testbed-api-generator/baseline, so they run + # here rather than skipping; see DESIGN.md section 10.8. - name: Run the Testbed for the API generator run: mvn --batch-mode --update-snapshots test working-directory: testbeds/testbed-api-generator @@ -765,9 +764,8 @@ jobs: path: ~/.m2/repository key: ${{ runner.os }}-maven-mo-testbeds-jdk17-${{ github.sha }} # The golden trees compare the new generators against a baseline captured from the - # old ones. The baseline is not in the repository - it is build output - so those - # tests skip here and the corpus walks and round trips are what run. Capturing it - # first would mean building apis/* twice; see DESIGN.md section 10.8. + # old ones. It is committed at testbeds/testbed-api-generator/baseline, so they run + # here rather than skipping; see DESIGN.md section 10.8. - name: Run the Testbed for the API generator run: mvn --batch-mode --update-snapshots test working-directory: testbeds/testbed-api-generator @@ -793,9 +791,8 @@ jobs: path: ~/.m2/repository key: ${{ runner.os }}-maven-mo-testbeds-jdk21-${{ github.sha }} # The golden trees compare the new generators against a baseline captured from the - # old ones. The baseline is not in the repository - it is build output - so those - # tests skip here and the corpus walks and round trips are what run. Capturing it - # first would mean building apis/* twice; see DESIGN.md section 10.8. + # old ones. It is committed at testbeds/testbed-api-generator/baseline, so they run + # here rather than skipping; see DESIGN.md section 10.8. - name: Run the Testbed for the API generator run: mvn --batch-mode --update-snapshots test working-directory: testbeds/testbed-api-generator @@ -821,9 +818,8 @@ jobs: path: ~/.m2/repository key: ${{ runner.os }}-maven-mo-testbeds-jdk25-${{ github.sha }} # The golden trees compare the new generators against a baseline captured from the - # old ones. The baseline is not in the repository - it is build output - so those - # tests skip here and the corpus walks and round trips are what run. Capturing it - # first would mean building apis/* twice; see DESIGN.md section 10.8. + # old ones. It is committed at testbeds/testbed-api-generator/baseline, so they run + # here rather than skipping; see DESIGN.md section 10.8. - name: Run the Testbed for the API generator run: mvn --batch-mode --update-snapshots test working-directory: testbeds/testbed-api-generator diff --git a/api-generator/api-generator-lib/DESIGN.md b/api-generator/api-generator-lib/DESIGN.md index 259e7fdc..bc371ae3 100644 --- a/api-generator/api-generator-lib/DESIGN.md +++ b/api-generator/api-generator-lib/DESIGN.md @@ -111,6 +111,10 @@ being about the model rather than the generators. This still removes `jaxb-api`, executions. Keeping the library dependency-free is what makes putting everything in it cost nothing. +**And Batik is temporary.** It is here only because the specifications carry pictures inside them, +and they are not going to: §8.3 sets out why the diagrams come out of the XML and in what order. +When they do, the rasteriser goes and the count returns to zero. + `api-generator-maven-plugin` stays a separate module — it is the Maven binding, not part of the library, and it must go on depending on the old generators throughout 14.x. @@ -1319,6 +1323,70 @@ created — and that becomes a real flakiness source the moment those maps are w threads. Making them concurrent and sorting at flush is required for parallelism and is an improvement without it. +### 8.3 Diagrams in the specification are on the way out + +`` wraps raw SVG inside the specification XML, and the document generator rasterises +it with Batik to embed in the `.docx`. That is the whole reason the library has a third-party +dependency at all (§3). **The intent is to remove it**, and the reasoning is not primarily about +cost. + +**An SVG is a rendering of the model, not part of it.** Nothing can check it. A diagram may say +something the model does not — a field that no longer exists, an interaction that changed — and no +validator will ever notice, because to a validator it is an opaque blob of ``. A picture +that silently disagrees with the specification it sits inside is worse than no picture. Everything +else in the file is subject to §9; this alone is not. + +**It is one book's feature.** Eighteen `` elements exist across both CCSDS sets: + +| Specification | Diagrams | +| --- | --- | +| MC **v001**, standards | 8 | +| MC **v001**, prototypes | 8 | +| Software Management, prototypes | 2 | +| Everything else, both sets | 0 | +| **NanoSat MO Framework, all five areas** | **0** — already removed | + +Sixteen of the eighteen are in the book that v002 supersedes, and the NMF has none: they were taken +out there and nothing was lost. + +**MOSpec already went the other way.** §7.6 decided sidecars — `diagram X "X.svg"` with the SVG in a +sibling file — so the text format never inlines a picture. The same argument applies one layer down, +to the XML. + +#### The order matters + +The tempting move is to drop the diagrams from the golden tests, since the ten PNGs are a quarter of +what the baseline costs the repository (§10.1) and sixteen of them belong to a superseded book. +**That is the wrong end to start from.** While the existing generator still emits those images, the +golden tree's job is to prove the new one matches it, and removing them from the tests means +choosing to stop checking something that is still being produced. + +Removing them from the **specifications** gets the same result correctly: + +1. the `` elements come out of the XML; +2. both generators stop emitting images, because there are none to emit; +3. `golden.sh capture` is re-run, and the PNGs leave the baseline on their own; +4. nothing is entered in `intended-differences.txt`, because there is no difference between the two + implementations — only a difference in what they were given. + +The coverage disappears because the thing it covered disappeared, which is the only honest way for a +regression net to shrink. + +#### What follows + +- **Batik goes**, and `api-generator-lib` returns to zero third-party dependencies, which is where + §3 wanted it before the document generator forced the exception. `DocxDocument`'s rasterisation + path and the image parts of the package go with it. +- **The baseline loses ~0.27 MB of ten PNGs**, the part of it that neither compresses nor deltas + (§10.1). Everything else in the capture is text and costs almost nothing to keep. +- **MC v001 stays in the golden tests regardless.** Its Java tree is 0.13 MB, `apis/pom.xml:72` + still builds and ships `api-area004-v001-mc`, and none of that has anything to do with diagrams. + A superseded book is not an unshipped one. +- **Where the diagrams go instead** is a separate question, and the answer is already written for + the text format: beside the specification, not inside it. Whether the published CCSDS books keep + their figures is an editorial decision for the working group, not a consequence of this change — + the XML stops carrying them either way. + ## 9. Validation `Validator` runs over an `MOModel` and reports `ValidationIssue(severity, message, SourceLocation)`. @@ -1367,7 +1435,7 @@ Rules include: Implemented in **`api-generator/golden/`** — `golden.sh capture | compare`, with `intended-differences.txt` for agreed deviations and a `README.md` covering both. The baseline is -git-ignored and regenerable. +committed, at `testbeds/testbed-api-generator/baseline/`, beside the tests that read it. Verified end to end: with all seven `apis/*` generated-source trees deleted and rebuilt from scratch, the harness reported **no differences** against the baseline. Generation is reproducible. @@ -1376,7 +1444,7 @@ scratch, the harness reported **no differences** against the baseline. Generatio | --- | --- | | Java | 950 files, ~116 000 lines, 7 modules | | docx | 18 documents, unzipped so `word/document.xml` diffs as text | -| Baseline size | ~20 MB | +| Baseline size | ~20 MB on disk, **1.17 MB** as git stores it — it is repetitive generated text, and packs about 12:1 | **Two pre-existing defects surfaced on the first capture.** Neither is caused by this migration, and both should be fixed independently of it: @@ -1702,7 +1770,8 @@ importer and the model had both changed since: The documents had never been compared on this corpus before, and came out identical on the first run with no corrections. What they do not exercise is the diagram path: NMF declares no `` anywhere, so none of its documents embeds an image and Batik is never reached. The only cover for -that remains the three CCSDS documents that do. +that remains the three CCSDS documents that do — and that the NMF has none is not an accident but +the direction of travel, §8.3. ### 10.7 Phase 6: the XHTML generator @@ -1803,24 +1872,34 @@ golden trees, the XML importer and validator corpus walks, the XHTML corpus, and round trips, together with the `ModelComparison`, `GoldenTree` and `Corpus` helpers they share. The line between the two is whether a test reads anything outside its own module: a test of `JumpTable` or `JavaMethodBuilder` stays with the code it tests, a test that walks -`xml-service-specifications/` or `golden/baseline/` does not. +`xml-service-specifications/` or the captured baseline does not. The point of the split is that building the library is a compile. The point of *not* deleting the unit tests along with the rest is that they are what fails when someone breaks a builder, and they cost 70 ms. -**What CI runs, and what it does not.** `.github/workflows/testbeds.yml` gains a -`testbed-api-generator` job on each of the four JDKs. Thirty of the 39 tests run there — everything -that needs only the specifications, which are in the repository. The nine golden-tree tests -**skip**: they compare against a baseline captured from the old generators, `golden/baseline/` is -build output rather than source, and it is gitignored. They `Assume`-skip rather than fail, so the -job is honest about it, but the effect is that the strongest check in the suite is the one CI does -not perform. +**What CI runs.** `.github/workflows/testbeds.yml` gains a `testbed-api-generator` job on each of +the four JDKs, and all 39 tests run there, golden trees included. + +That last part took a correction. The baseline was gitignored, on the Phase 0 note that it is +"~20 MB and regenerable", so on a fresh runner the nine golden-tree tests found nothing to compare +against and `Assume`-skipped — the strongest check in the suite was the one CI did not perform. The +proposed fix was to run `golden.sh capture` in the workflow, rebuilding every `apis/*` module with +the old generators before the testbed built them again with the new. + +That was the wrong trade, and the 20 MB was the wrong number. It is repetitive generated Java and +XML, so it **packs to 1.5 MB** against a repository of 11 MB, and it changes only when the old +generators change, which is to say almost never while they are frozen through 14.x. Spending +minutes of CI on four JDKs on every push, forever, to avoid committing 1.5 MB once is not a saving. + +So the baseline is committed, at `testbeds/testbed-api-generator/baseline/`, next to the tests that +read it — deliberately not under `src/test/resources/`, since the tests reach it as files and Maven +would otherwise copy 20 MB into `target/` on every build. `golden.sh` captures to and compares +against the same path. -Making CI run them means `golden.sh capture` first, which builds every `apis/*` module with the old -generators before the testbed builds them again with the new — the parallel-run contract of §3, at -the cost of generating the APIs twice in the same workflow. That is a real cost and an open -decision, not an oversight. +The benefit that decided it is one neither option had been weighed for: a committed baseline makes +a change in generated output **visible in review**. Change the Java generator and the diff names +the files that moved. A test that reports "7 files differ" says less than a diff that shows what. ### 10.9 Cut-over — v15.0 @@ -1899,7 +1978,7 @@ the evidence that settled them, so that they are not silently reopened: | MOSpec normalises the older `ObjectRef(X)` spelling; the XML comes back modernised | §7.9 | | A comment written empty stays empty, and is shown as one | §7.5 | | docx: output unchanged, OOXML layer lifted, styles to resource files | §8 | -| Batik is the one third-party dependency, for rasterising declared diagrams | §3, §8 | +| Batik is the one third-party dependency, for rasterising declared diagrams — and temporary | §3, §8.3 | | The XHTML generator is ported, not dropped, as Phase 6 | §8, §10.7 | | The XHTML page is named after its specification, so two versions of an area no longer collide | §10.7 | | A type that contains itself is drawn once and linked, not expanded | §10.7 | @@ -1908,4 +1987,5 @@ the evidence that settled them, so that they are not silently reopened: | Rewrite rather than port; no language abstraction before a second language | §8, §8.1 | | Parallel generation, with determinism as the binding constraint | §8.2 | | Parallel running through 14.x, cut-over at v15.0 | §3, §10.9 | +| Inline SVG diagrams leave the specification; remove them from the XML, not from the tests | §8.3 | | The library compiles in the reactor; its corpus tests live in a testbed | §10.8 | diff --git a/api-generator/golden/.gitignore b/api-generator/golden/.gitignore index 9a8dc65e..e9ffb328 100644 --- a/api-generator/golden/.gitignore +++ b/api-generator/golden/.gitignore @@ -1,2 +1 @@ -baseline/ last-diff.txt diff --git a/api-generator/golden/README.md b/api-generator/golden/README.md index 117b391c..1100aca7 100644 --- a/api-generator/golden/README.md +++ b/api-generator/golden/README.md @@ -12,9 +12,12 @@ See `../api-generator-lib/DESIGN.md` §10.1. ./golden.sh compare-only compare without rebuilding ``` -The baseline lives in `baseline/` (override with `GOLDEN_BASELINE=/some/path`) and is git-ignored: -it is ~20 MB and regenerable. Full diffs are written to `last-diff.txt`; the console shows a -per-file summary. +The baseline lives in `testbeds/testbed-api-generator/baseline/` (override with +`GOLDEN_BASELINE=/some/path`) and **is committed**, beside the tests that read it: ~20 MB on disk +but 1.5 MB packed, and it changes only when the old generators do. Keeping it in the repository is +what lets CI run the golden tests, and it makes a change in generated output show up as a diff +rather than only as a failing assertion. Full diffs are written to `last-diff.txt`; the console +shows a per-file summary. **What else reads the baseline.** `testbeds/testbed-api-generator` holds the JUnit side — the golden-tree tests that generate with `api-generator-lib` and compare against `baseline/`, so @@ -24,7 +27,8 @@ capturing one here is what makes them run rather than skip: cd testbeds/testbed-api-generator && mvn test ``` -Without a baseline those tests skip, which is also what happens in CI (DESIGN.md §10.8). +Without a baseline those tests skip — which now only happens to someone who has cleared it to +re-capture, since CI has the committed one (DESIGN.md §10.8). ## What it captures diff --git a/api-generator/golden/golden.sh b/api-generator/golden/golden.sh index 49ed0898..2701291d 100755 --- a/api-generator/golden/golden.sh +++ b/api-generator/golden/golden.sh @@ -15,7 +15,7 @@ set -u -o pipefail HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" REPO="$(cd "$HERE/../.." && pwd)" -BASELINE="${GOLDEN_BASELINE:-$HERE/baseline}" +BASELINE="${GOLDEN_BASELINE:-$REPO/testbeds/testbed-api-generator/baseline}" IGNORE_FILE="$HERE/intended-differences.txt" MVN="${MVN:-mvn}" MVN_FLAGS="${MVN_FLAGS:---batch-mode -DskipTests}" diff --git a/testbeds/testbed-api-generator/baseline/MANIFEST b/testbeds/testbed-api-generator/baseline/MANIFEST new file mode 100644 index 00000000..220b356b --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/MANIFEST @@ -0,0 +1,5 @@ +captured: 2026-08-23T11:24:15Z +commit: b2cef8cd +branch: v14.2 +java files: 950 +docx documents: 18 diff --git a/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area001-v001-MAL/[Content_Types].xml b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area001-v001-MAL/[Content_Types].xml new file mode 100644 index 00000000..fbe325d6 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area001-v001-MAL/[Content_Types].xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area001-v001-MAL/_rels/.rels b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area001-v001-MAL/_rels/.rels new file mode 100644 index 00000000..d6637f3e --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area001-v001-MAL/_rels/.rels @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area001-v001-MAL/word/_rels/document.xml.rels b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area001-v001-MAL/word/_rels/document.xml.rels new file mode 100644 index 00000000..7af141e1 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area001-v001-MAL/word/_rels/document.xml.rels @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area001-v001-MAL/word/document.xml b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area001-v001-MAL/word/document.xml new file mode 100644 index 00000000..da0d04d6 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area001-v001-MAL/word/document.xml @@ -0,0 +1,1514 @@ + + + + + Specification: MAL + + + General + + This section contains the specifications for the MAL services. + This area contains the following services: + + Data types + + + Area data types: MAL + + + + Fundamental: Attribute + + Attribute is the base type of all attributes of the MAL data model. Attributes are contained within Composites and are used to build complex structures that make the data model. + + + Fundamental: Composite + + Composite is the base structure for composite structures that contain a set of elements. + + + Fundamental: Element + + Element is the base type of all data constructs. All types that make up the MAL data model are derived from it. + + + Attribute: Blob + + The Blob structure is used to store binary object attributes. It is a variable-length, unbounded, octet array. The distinction between this type and a list of Octet attributes is that this type may allow language mappings and encodings to use more efficient or appropriate representations. + + + + + + + + + + + + + + + + + + Name + Blob + + + Extends + Attribute + + + Short Form Part + 1 + + + + + Attribute: Boolean + + The Boolean structure is used to store Boolean attributes. Possible values are 'True' or 'False'. + + + + + + + + + + + + + + + + + + Name + Boolean + + + Extends + Attribute + + + Short Form Part + 2 + + + + + Attribute: Duration + + The Duration structure is used to store Duration attributes. It represents a length of time in seconds. It may contain a fractional component. + + + + + + + + + + + + + + + + + + Name + Duration + + + Extends + Attribute + + + Short Form Part + 3 + + + + + Attribute: Float + + The Float structure is used to store floating point attributes using the IEEE 754 32-bit range. + Three special values exist for this type: POSITIVE_INFINITY, NEGATIVE_INFINITY, and NaN (Not A Number). + + + + + + + + + + + + + + + + + + Name + Float + + + Extends + Attribute + + + Short Form Part + 4 + + + + + Attribute: Double + + The Double structure is used to store floating point attributes using the IEEE 754 64-bit range. + Three special values exist for this type: POSITIVE_INFINITY, NEGATIVE_INFINITY, and NaN (Not A Number). + + + + + + + + + + + + + + + + + + Name + Double + + + Extends + Attribute + + + Short Form Part + 5 + + + + + Attribute: Identifier + + The Identifier structure is used to store an identifier and can be used for indexing. It is a variable-length, unbounded, Unicode string. + + + + + + + + + + + + + + + + + + Name + Identifier + + + Extends + Attribute + + + Short Form Part + 6 + + + + + Attribute: Octet + + The Octet structure is used to store 8-bit signed attributes. The permitted range is -128 to 127. + + + + + + + + + + + + + + + + + + Name + Octet + + + Extends + Attribute + + + Short Form Part + 7 + + + + + Attribute: UOctet + + The UOctet structure is used to store 8-bit unsigned attributes. The permitted range is 0 to 255. + + + + + + + + + + + + + + + + + + Name + UOctet + + + Extends + Attribute + + + Short Form Part + 8 + + + + + Attribute: Short + + The Short structure is used to store 16-bit signed attributes. The permitted range is -32768 to 32767. + + + + + + + + + + + + + + + + + + Name + Short + + + Extends + Attribute + + + Short Form Part + 9 + + + + + Attribute: UShort + + The UShort structure is used to store 16-bit unsigned attributes. The permitted range is 0 to 65535. + + + + + + + + + + + + + + + + + + Name + UShort + + + Extends + Attribute + + + Short Form Part + 10 + + + + + Attribute: Integer + + The Integer structure is used to store 32-bit signed attributes. The permitted range is -2147483648 to 2147483647. + + + + + + + + + + + + + + + + + + Name + Integer + + + Extends + Attribute + + + Short Form Part + 11 + + + + + Attribute: UInteger + + The UInteger structure is used to store 32-bit unsigned attributes. The permitted range is 0 to 4294967295. + + + + + + + + + + + + + + + + + + Name + UInteger + + + Extends + Attribute + + + Short Form Part + 12 + + + + + Attribute: Long + + The Long structure is used to store 64-bit signed attributes. The permitted range is -9223372036854775808 to 9223372036854775807. + + + + + + + + + + + + + + + + + + Name + Long + + + Extends + Attribute + + + Short Form Part + 13 + + + + + Attribute: ULong + + The ULong structure is used to store 64-bit unsigned attributes. The permitted range is 0 to 18446744073709551615. + + + + + + + + + + + + + + + + + + Name + ULong + + + Extends + Attribute + + + Short Form Part + 14 + + + + + Attribute: String + + The String structure is used to store String attributes. It is a variable-length, unbounded, Unicode string. + + + + + + + + + + + + + + + + + + Name + String + + + Extends + Attribute + + + Short Form Part + 15 + + + + + Attribute: Time + + The Time structure is used to store absolute time attributes. It represents an absolute date and time to millisecond resolution. + + + + + + + + + + + + + + + + + + Name + Time + + + Extends + Attribute + + + Short Form Part + 16 + + + + + Attribute: FineTime + + The FineTime structure is used to store high-resolution absolute time attributes. It represents an absolute date and time to picosecond resolution. + + + + + + + + + + + + + + + + + + Name + FineTime + + + Extends + Attribute + + + Short Form Part + 17 + + + + + Attribute: URI + + The URI structure is used to store URI addresses. It is a variable-length, unbounded, Unicode string. + + + + + + + + + + + + + + + + + + Name + URI + + + Extends + Attribute + + + Short Form Part + 18 + + + + + Enumeration: InteractionType + + InteractionType is an enumeration holding the possible interaction pattern types. + + + + + + + + + + + + + + + + + + + Name + InteractionType + + + Short Form Part + 19 + + + Enumeration Value + Numerical Value + Comment + + + SEND + 1 + Used for Send interactions. + + + SUBMIT + 2 + Used for Submit interactions. + + + REQUEST + 3 + Used for Request interactions. + + + INVOKE + 4 + Used for Invoke interactions. + + + PROGRESS + 5 + Used for Progress interactions. + + + PUBSUB + 6 + Used for Publish/Subscribe interactions. + + + + + Enumeration: SessionType + + SessionType is an enumeration holding the session types. + + + + + + + + + + + + + + + + + + + Name + SessionType + + + Short Form Part + 20 + + + Enumeration Value + Numerical Value + Comment + + + LIVE + 1 + Used for Live sessions. + + + SIMULATION + 2 + Used for Simulation sessions. + + + REPLAY + 3 + Used for Replay sessions. + + + + + Enumeration: QoSLevel + + QoSLevel is an enumeration holding the possible QoS levels. + + + + + + + + + + + + + + + + + + + Name + QoSLevel + + + Short Form Part + 21 + + + Enumeration Value + Numerical Value + Comment + + + BESTEFFORT + 1 + Used for Best Effort QoS Level. + + + ASSURED + 2 + Used for Assured QoS Level. + + + QUEUED + 3 + Used for Queued QoS Level. + + + TIMELY + 4 + Used for Timely QoS Level. + + + + + Enumeration: UpdateType + + UpdateType is an enumeration holding the possible Update types. + + + + + + + + + + + + + + + + + + + Name + UpdateType + + + Short Form Part + 22 + + + Enumeration Value + Numerical Value + Comment + + + CREATION + 1 + Update is notification of the creation of the item. + + + UPDATE + 2 + Update is just a periodic update of the item and has not changed its value. + + + MODIFICATION + 3 + Update is for a changed value or modification of the item. + + + DELETION + 4 + Update is notification of the removal of the item. + + + + + Composite: Subscription + + The Subscription structure is used when subscribing for updates using the PUBSUB interaction pattern. It contains a single identifier that identifies the subscription being defined and a set of entities being requested. + + + + + + + + + + + + + + + + + + + + Name + Subscription + + + Extends + HYPERLINK \l "DATATYPE_Composite" Composite + + + Short Form Part + 23 + + + Field + Type + Nullable + Comment + + + subscriptionId + HYPERLINK \l "DATATYPE_Identifier" Identifier + No + The identifier of this subscription. + + + entities + List< HYPERLINK \l "DATATYPE_EntityRequest" EntityRequest> + No + The list of entities that are being subscribed for by this identified subscription. + + + + + Composite: EntityRequest + + The EntityRequest structure is used when subscribing for updates using the PUBSUB interaction pattern. + + + + + + + + + + + + + + + + + + + + Name + EntityRequest + + + Extends + HYPERLINK \l "DATATYPE_Composite" Composite + + + Short Form Part + 24 + + + Field + Type + Nullable + Comment + + + subDomain + List< HYPERLINK \l "DATATYPE_Identifier" Identifier> + Yes + Optional subdomain identifier that is appended to the Message Header domain identifier when requesting entities in a subdomain of this domain. + + + allAreas + HYPERLINK \l "DATATYPE_Boolean" Boolean + No + If set to True, then all updates regardless of Area shall be sent. + + + allServices + HYPERLINK \l "DATATYPE_Boolean" Boolean + No + If set to True, then all updates regardless of Service shall be sent. + + + allOperations + HYPERLINK \l "DATATYPE_Boolean" Boolean + No + If set to True, then all updates regardless of Operation shall be sent. + + + onlyOnChange + HYPERLINK \l "DATATYPE_Boolean" Boolean + No + The Boolean denotes that only change updates are to be sent rather than all updates. + + + entityKeys + List< HYPERLINK \l "DATATYPE_EntityKey" EntityKey> + No + The list of entities to be monitored. + + + + + Composite: EntityKey + + The EntityKey structure is used to identify an entity in the PUBSUB interaction pattern. + + + + + + + + + + + + + + + + + + + + Name + EntityKey + + + Extends + HYPERLINK \l "DATATYPE_Composite" Composite + + + Short Form Part + 25 + + + Field + Type + Nullable + Comment + + + firstSubKey + HYPERLINK \l "DATATYPE_Identifier" Identifier + Yes + The first sub-key of the key. + + + secondSubKey + HYPERLINK \l "DATATYPE_Long" Long + Yes + The second sub-key of the key. + + + thirdSubKey + HYPERLINK \l "DATATYPE_Long" Long + Yes + The third sub-key of the key. + + + fourthSubKey + HYPERLINK \l "DATATYPE_Long" Long + Yes + The fourth sub-key of the key. + + + + + Composite: UpdateHeader + + The UpdateHeader structure is used by updates using the PUBSUB interaction pattern. It holds information that identifies a single update. + + + + + + + + + + + + + + + + + + + + Name + UpdateHeader + + + Extends + HYPERLINK \l "DATATYPE_Composite" Composite + + + Short Form Part + 26 + + + Field + Type + Nullable + Comment + + + timestamp + HYPERLINK \l "DATATYPE_Time" Time + No + Creation timestamp of the update. + + + sourceURI + HYPERLINK \l "DATATYPE_URI" URI + No + URI of the source of the update, usually a PUBSUB provider. + + + updateType + HYPERLINK \l "DATATYPE_UpdateType" UpdateType + No + Type of update being reported. + + + key + HYPERLINK \l "DATATYPE_EntityKey" EntityKey + No + The key of the entity; shall not contain the wildcard value. + + + + + Composite: IdBooleanPair + + IdBooleanPair is a simple pair type of an identifier and Boolean value. + + + + + + + + + + + + + + + + + + + + Name + IdBooleanPair + + + Extends + HYPERLINK \l "DATATYPE_Composite" Composite + + + Short Form Part + 27 + + + Field + Type + Nullable + Comment + + + id + HYPERLINK \l "DATATYPE_Identifier" Identifier + Yes + The Identifier value. + + + value + HYPERLINK \l "DATATYPE_Boolean" Boolean + Yes + The Boolean value. + + + + + Composite: Pair + + Pair is a simple composite structure for holding pairs. The pairs can be user-defined attributes. + + + + + + + + + + + + + + + + + + + + Name + Pair + + + Extends + HYPERLINK \l "DATATYPE_Composite" Composite + + + Short Form Part + 28 + + + Field + Type + Nullable + Comment + + + first + HYPERLINK \l "DATATYPE_Attribute" Attribute + Yes + The attribute value for the first element of this pair. + + + second + HYPERLINK \l "DATATYPE_Attribute" Attribute + Yes + The attribute value for the second element of this pair. + + + + + Composite: NamedValue + + The NamedValue structure represents a simple pair type of an identifier and abstract attribute value. + + + + + + + + + + + + + + + + + + + + Name + NamedValue + + + Extends + HYPERLINK \l "DATATYPE_Composite" Composite + + + Short Form Part + 29 + + + Field + Type + Nullable + Comment + + + name + HYPERLINK \l "DATATYPE_Identifier" Identifier + Yes + The Identifier value. + + + value + HYPERLINK \l "DATATYPE_Attribute" Attribute + Yes + The Attribute value. + + + + + Composite: File + + The File structure represents a File and holds details about a File. It can also, optionally, hold a BLOB of the file data. The file type is denoted using the internet MIME media types, the list of official MIME types is held at http://www.iana.org/assignments/media-types/index.html. + + + + + + + + + + + + + + + + + + + + Name + File + + + Extends + HYPERLINK \l "DATATYPE_Composite" Composite + + + Short Form Part + 30 + + + Field + Type + Nullable + Comment + + + name + HYPERLINK \l "DATATYPE_Identifier" Identifier + No + The file name. + + + mimeType + HYPERLINK \l "DATATYPE_String" String + Yes + The MIME type of the file, NULL if not known. + + + creationDate + HYPERLINK \l "DATATYPE_Time" Time + Yes + The creation timestamp of the file, NULL if not known. + + + modificationDate + HYPERLINK \l "DATATYPE_Time" Time + Yes + The last modification timestamp of the file, NULL if not known. + + + size + HYPERLINK \l "DATATYPE_ULong" ULong + Yes + The size of the file in Octets, NULL if not known. + + + content + HYPERLINK \l "DATATYPE_Blob" Blob + Yes + The contents of the file, NULL if not supplied. + + + metaData + List< HYPERLINK \l "DATATYPE_NamedValue" NamedValue> + Yes + A list of extra metadata for the file. + + + + MO Errors + + The following table lists the errors defined in this specification: + + Table + + STYLEREF "Heading 1"\l \n \t \* MERGEFORMAT 1 SEQ Table \s 1 1tc \f T " + 1 + - SEQ Table_TOC \s 1 1 + MAL MO Errors + " + : MAL MO Errors + + + + + + + + + + + + + + + + + + + + Error + Error # + Comment + + + DELIVERY_FAILED + 65536 + Confirmed communication error. + + + DELIVERY_TIMEDOUT + 65537 + Unconfirmed communication error. + + + DELIVERY_DELAYED + 65538 + Message queued somewhere awaiting contact. + + + DESTINATION_UNKNOWN + 65539 + Destination cannot be contacted. + + + DESTINATION_TRANSIENT + 65540 + Destination middleware reports destination application does not exist. + + + DESTINATION_LOST + 65541 + Destination lost halfway through conversation. + + + AUTHENTICATION_FAIL + 65542 + A failure to authenticate the message correctly. + + + AUTHORISATION_FAIL + 65543 + A failure in the MAL to authorise the message. + + + ENCRYPTION_FAIL + 65544 + A failure in the MAL to encrypt/decrypt the message. + + + UNSUPPORTED_AREA + 65545 + The destination does not support the service area. + + + UNSUPPORTED_OPERATION + 65546 + The destination does not support the operation. + + + UNSUPPORTED_VERSION + 65547 + The destination does not support the service version. + + + BAD_ENCODING + 65548 + The destination was unable to decode the message. + + + INTERNAL + 65549 + An internal error has occurred. + + + UNKNOWN + 65550 + Operation specific. + + + INCORRECT_STATE + 65551 + The destination was not in the correct state for the received message. + + + TOO_MANY + 65552 + Maximum number of subscriptions or providers of a broker has been exceeded. + + + SHUTDOWN + 65553 + The component is being shutdown. + + + + diff --git a/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area001-v001-MAL/word/numbering.xml b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area001-v001-MAL/word/numbering.xml new file mode 100644 index 00000000..1d905cd4 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area001-v001-MAL/word/numbering.xml @@ -0,0 +1,3 @@ + + + diff --git a/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area001-v001-MAL/word/styles.xml b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area001-v001-MAL/word/styles.xml new file mode 100644 index 00000000..ee967ee1 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area001-v001-MAL/word/styles.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area001-v003-MAL/[Content_Types].xml b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area001-v003-MAL/[Content_Types].xml new file mode 100644 index 00000000..fbe325d6 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area001-v003-MAL/[Content_Types].xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area001-v003-MAL/_rels/.rels b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area001-v003-MAL/_rels/.rels new file mode 100644 index 00000000..d6637f3e --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area001-v003-MAL/_rels/.rels @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area001-v003-MAL/word/_rels/document.xml.rels b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area001-v003-MAL/word/_rels/document.xml.rels new file mode 100644 index 00000000..7af141e1 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area001-v003-MAL/word/_rels/document.xml.rels @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area001-v003-MAL/word/document.xml b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area001-v003-MAL/word/document.xml new file mode 100644 index 00000000..28a1bfcc --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area001-v003-MAL/word/document.xml @@ -0,0 +1,1791 @@ + + + + + Specification: MAL + + + General + + This section contains the specifications for the MAL services. + This area contains the following services: + + Data types + + + Area data types: MAL + + + + Fundamental: Attribute + + Attribute is the base type of all Attributes of the MAL data model. Attributes are contained within Composites and are used to build complex structures that make the data model. + + + Fundamental: Composite + + Composite is the base structure for Composite structures that contain a set of Elements. + + + Fundamental: Object + + Object is the base structure for MO Objects in the MAL data model. Objects are representations of complex data types with two specific characteristics: Objects have a unique and an immutable identity and can be referenced unambiguously. + + + Fundamental: Element + + Element is the base type of all data constructs. All types that make up the MAL data model are derived from it. + + + Attribute: Blob + + The Blob structure shall be used to hold binary data. It shall be a variable-length Octet array and the maximum length shall depend on the selected encoding. + + + + + + + + + + + + + + + + + + Name + Blob + + + Extends + Attribute + + + Short Form Part + 1 + + + + + Attribute: Boolean + + The Boolean structure shall be used to hold Boolean Attributes. Possible values are ‘True’ or ‘False’. + + + + + + + + + + + + + + + + + + Name + Boolean + + + Extends + Attribute + + + Short Form Part + 2 + + + + + Attribute: Duration + + The Duration structure shall be used to hold duration Attributes at nanoseconds resolution. It can be negative because it may be used to represent offsets. The duration shall support a range between -2^63 nanoseconds, and (2^63)-1 nanoseconds (to allow representation as a 64-bit signed integer). + + + + + + + + + + + + + + + + + + Name + Duration + + + Extends + Attribute + + + Short Form Part + 3 + + + + + Attribute: Float + + The Float structure shall be used to hold floating point Attributes using the IEEE 754 32-bit range. + + + + + + + + + + + + + + + + + + Name + Float + + + Extends + Attribute + + + Short Form Part + 4 + + + + + Attribute: Double + + The Double structure shall be used to hold floating point Attributes using the IEEE 754 64-bit range. + + + + + + + + + + + + + + + + + + Name + Double + + + Extends + Attribute + + + Short Form Part + 5 + + + + + Attribute: Identifier + + The Identifier structure shall be used to hold an identifier and can be used for indexing. It is a variable-length Unicode string and the maximum length shall depend on the selected encoding. For some encoding/decoding bindings, the use of a numeric value might be appropriate for this Attribute, for example, via a dictionary. + + + + + + + + + + + + + + + + + + Name + Identifier + + + Extends + Attribute + + + Short Form Part + 6 + + + + + Attribute: Octet + + The Octet structure shall be used to hold 8-bit signed Attributes. The permitted range is −128 to 127. + + + + + + + + + + + + + + + + + + Name + Octet + + + Extends + Attribute + + + Short Form Part + 7 + + + + + Attribute: UOctet + + The UOctet structure shall be used to hold 8-bit unsigned Attributes. The permitted range is 0 to 255. + + + + + + + + + + + + + + + + + + Name + UOctet + + + Extends + Attribute + + + Short Form Part + 8 + + + + + Attribute: Short + + The Short structure shall be used to hold 16-bit signed Attributes. The permitted range is −32768 to 32767. + + + + + + + + + + + + + + + + + + Name + Short + + + Extends + Attribute + + + Short Form Part + 9 + + + + + Attribute: UShort + + The UShort structure shall be used to hold 16-bit unsigned Attributes. The permitted range is 0 to 65535. + + + + + + + + + + + + + + + + + + Name + UShort + + + Extends + Attribute + + + Short Form Part + 10 + + + + + Attribute: Integer + + The Integer structure shall be used to hold 32-bit signed Attributes. The permitted range is −2147483648 to 2147483647. + + + + + + + + + + + + + + + + + + Name + Integer + + + Extends + Attribute + + + Short Form Part + 11 + + + + + Attribute: UInteger + + The UInteger structure shall be used to hold 32-bit unsigned Attributes. The permitted range is 0 to 4294967295. + + + + + + + + + + + + + + + + + + Name + UInteger + + + Extends + Attribute + + + Short Form Part + 12 + + + + + Attribute: Long + + The Long structure shall be used to hold 64-bit signed Attributes. The permitted range is −9223372036854775808 to 9223372036854775807. + + + + + + + + + + + + + + + + + + Name + Long + + + Extends + Attribute + + + Short Form Part + 13 + + + + + Attribute: ULong + + The ULong structure shall be used to hold 64-bit unsigned Attributes. The permitted range is 0 to 18446744073709551615. + + + + + + + + + + + + + + + + + + Name + ULong + + + Extends + Attribute + + + Short Form Part + 14 + + + + + Attribute: String + + The String structure shall be used to hold string Attributes. It is a variable-length Unicode string and the maximum length shall depend on the selected encoding. + + + + + + + + + + + + + + + + + + Name + String + + + Extends + Attribute + + + Short Form Part + 15 + + + + + Attribute: Time + + The Time structure shall be used to hold absolute time Attributes. It shall represent an absolute date and time to millisecond resolution. The range shall depend on the selected encoding. + + + + + + + + + + + + + + + + + + Name + Time + + + Extends + Attribute + + + Short Form Part + 16 + + + + + Attribute: FineTime + + The FineTime structure shall be used to hold high-resolution absolute time Attributes. It shall represent an absolute date and time to nanosecond resolution. The range shall depend on the selected encoding. + + + + + + + + + + + + + + + + + + Name + FineTime + + + Extends + Attribute + + + Short Form Part + 17 + + + + + Attribute: URI + + The URI structure shall be used to hold URI addresses. It shall be a variable-length Unicode string and the maximum length shall depend on the selected encoding. + + + + + + + + + + + + + + + + + + Name + URI + + + Extends + Attribute + + + Short Form Part + 18 + + + + + Attribute: ObjectRef + + The ObjectRef structure shall be used to hold references to MO Objects. + + + + + + + + + + + + + + + + + + Name + ObjectRef + + + Extends + Attribute + + + Short Form Part + 19 + + + + + Enumeration: InteractionType + + InteractionType is an enumeration that shall be used to hold the possible Interaction Pattern types. + + + + + + + + + + + + + + + + + + + Name + InteractionType + + + Short Form Part + 101 + + + Enumeration Value + Numerical Value + Comment + + + SEND + 1 + Used for SEND interactions. + + + SUBMIT + 2 + Used for SUBMIT interactions. + + + REQUEST + 3 + Used for REQUEST interactions. + + + INVOKE + 4 + Used for INVOKE interactions. + + + PROGRESS + 5 + Used for PROGRESS interactions. + + + PUBSUB + 6 + Used for Publish-Subscribe interactions. + + + + + Enumeration: SessionType + + SessionType is an enumeration that shall be used to hold the session types. This facilitates the use of different Sessions in out-of-band agreements. + + + + + + + + + + + + + + + + + + + Name + SessionType + + + Short Form Part + 102 + + + Enumeration Value + Numerical Value + Comment + + + LIVE + 1 + Used for Live sessions. + + + SIMULATION + 2 + Used for Simulation sessions. + + + REPLAY + 3 + Used for Replay sessions. + + + + + Enumeration: QoSLevel + + QoSLevel is an enumeration that shall be used to hold the possible QoS levels. This facilitates the use of different QoS in out-of-band agreements. + + + + + + + + + + + + + + + + + + + Name + QoSLevel + + + Short Form Part + 103 + + + Enumeration Value + Numerical Value + Comment + + + BESTEFFORT + 1 + Used for Best Effort QoS Level. + + + ASSURED + 2 + Used for Assured QoS Level. + + + QUEUED + 3 + Used for Queued QoS Level. + + + TIMELY + 4 + Used for Timely QoS Level. + + + + + Enumeration: AttributeType + + AttributeType is an enumeration that shall be used to hold the defined MAL Attribute types. + + + + + + + + + + + + + + + + + + + Name + AttributeType + + + Short Form Part + 104 + + + Enumeration Value + Numerical Value + Comment + + + BLOB + 1 + Blob type. + + + BOOLEAN + 2 + Boolean type. + + + DURATION + 3 + Duration type. + + + FLOAT + 4 + Float type. + + + DOUBLE + 5 + Double type. + + + IDENTIFIER + 6 + Identifier type. + + + OCTET + 7 + Octet type. + + + UOCTET + 8 + UOctet type. + + + SHORT + 9 + Short type. + + + USHORT + 10 + UShort type. + + + INTEGER + 11 + Integer type. + + + UINTEGER + 12 + UInteger type. + + + LONG + 13 + Long type. + + + ULONG + 14 + ULong type. + + + STRING + 15 + String type. + + + TIME + 16 + Time type. + + + FINETIME + 17 + FineTime type. + + + URI + 18 + URI type. + + + OBJECTREF + 19 + ObjectRef type. + + + + + Enumeration: MOArea + + MOArea is an enumeration that shall be used to hold the known existing area numbers in use. + + + + + + + + + + + + + + + + + + + Name + MOArea + + + Short Form Part + 105 + + + Enumeration Value + Numerical Value + Comment + + + MAL + 1 + The MAL area number. + + + COM + 2 + The COM area number. The COM is deprecated; therefore this area number is reserved for backward compatibility. + + + COMMON + 3 + The Common area number. + + + MC + 4 + The Monitor and Control area number. + + + MPS + 5 + The Mission Planning and Scheduling area number. + + + SM + 7 + The Software Management area number. + + + MDPD + 9 + The Mission Data Product Distribution area number. + + + + + Composite: Subscription + + The Subscription structure shall be used when subscribing for updates using the PUBSUB Interaction Pattern. It shall contain a single identifier that identifies the subscription being defined and a set of entities being requested. + + + + + + + + + + + + + + + + + + + + Name + Subscription + + + Extends + HYPERLINK \l "DATATYPE_Composite" Composite + + + Short Form Part + 1001 + + + Field + Type + Nullable + Comment + + + subscriptionId + HYPERLINK \l "DATATYPE_Identifier" Identifier + No + The identifier of this subscription. + + + domain + List< HYPERLINK \l "DATATYPE_Identifier" Identifier> + Yes + Optional domain identifier. If NULL, the subscription shall match with any domain. + + + selectedKeys + List< HYPERLINK \l "DATATYPE_Identifier" Identifier> + Yes + The list of names of the selected Subscription Keys to be transmitted to the consumer. The Subscription Keys that are not in this list will be removed. If NULL, then all Subscription Keys will be transmitted. + + + filters + List< HYPERLINK \l "DATATYPE_SubscriptionFilter" SubscriptionFilter> + Yes + The list of filters for this subscription. The list of filters must be ANDed together. If NULL, the subscription will not filter specific keys. + + + + + Composite: SubscriptionFilter + + The SubscriptionFilter structure shall be used when subscribing for updates using the PUBSUB Interaction Pattern. It shall contain a single identifier that identifies the Subscription Key name and the set of values to be registered for the defined key name. + + + + + + + + + + + + + + + + + + + + Name + SubscriptionFilter + + + Extends + HYPERLINK \l "DATATYPE_Composite" Composite + + + Short Form Part + 1002 + + + Field + Type + Nullable + Comment + + + name + HYPERLINK \l "DATATYPE_Identifier" Identifier + No + The identifier name of the key. + + + values + List< HYPERLINK \l "DATATYPE_Attribute" Attribute> + No + The list of values that are being subscribed for this key. These shall be ORed together. + + + + + Composite: UpdateHeader + + The UpdateHeader structure shall be used by updates using the PUBSUB Interaction Pattern. It shall hold information that identifies a single update. + + + + + + + + + + + + + + + + + + + + Name + UpdateHeader + + + Extends + HYPERLINK \l "DATATYPE_Composite" Composite + + + Short Form Part + 1003 + + + Field + Type + Nullable + Comment + + + source + HYPERLINK \l "DATATYPE_Identifier" Identifier + Yes + The source of the update, usually a PUBSUB provider. + + + domain + List< HYPERLINK \l "DATATYPE_Identifier" Identifier> + Yes + The domain of this update. The individual domain identifier parts shall not be set as the wildcard character ‘*’. + + + keyValues + List< HYPERLINK \l "DATATYPE_NullableAttribute" NullableAttribute> + Yes + The values for the PUBSUB keys. The values shall be ordered according to the defined keys if the consumer subscription did not enable trimming. + + + + + Composite: IdBooleanPair + + IdBooleanPair shall be a simple pair type of an identifier and Boolean value. + + + + + + + + + + + + + + + + + + + + Name + IdBooleanPair + + + Extends + HYPERLINK \l "DATATYPE_Composite" Composite + + + Short Form Part + 1004 + + + Field + Type + Nullable + Comment + + + id + HYPERLINK \l "DATATYPE_Identifier" Identifier + No + The Identifier value. + + + value + HYPERLINK \l "DATATYPE_Boolean" Boolean + Yes + The Boolean value. + + + + + Composite: Pair + + Pair shall be a simple Composite structure for holding pairs. + + + + + + + + + + + + + + + + + + + + Name + Pair + + + Extends + HYPERLINK \l "DATATYPE_Composite" Composite + + + Short Form Part + 1005 + + + Field + Type + Nullable + Comment + + + first + HYPERLINK \l "DATATYPE_Attribute" Attribute + Yes + The attribute value for the first Element of this pair. + + + second + HYPERLINK \l "DATATYPE_Attribute" Attribute + Yes + The attribute value for the second Element of this pair. + + + + + Composite: NamedValue + + The NamedValue structure shall represent a simple pair type of an identifier and abstract Attribute value. + + + + + + + + + + + + + + + + + + + + Name + NamedValue + + + Extends + HYPERLINK \l "DATATYPE_Composite" Composite + + + Short Form Part + 1006 + + + Field + Type + Nullable + Comment + + + name + HYPERLINK \l "DATATYPE_Identifier" Identifier + No + The Identifier value. + + + value + HYPERLINK \l "DATATYPE_Attribute" Attribute + Yes + The Attribute value. + + + + + Composite: File + + The File structure represents a file and shall be used to hold details about a file. It may also, optionally, hold a BLOB of the file data. The file type shall be denoted using the internet MIME media types. + + + + + + + + + + + + + + + + + + + + Name + File + + + Extends + HYPERLINK \l "DATATYPE_Composite" Composite + + + Short Form Part + 1007 + + + Field + Type + Nullable + Comment + + + name + HYPERLINK \l "DATATYPE_String" String + No + The file name. + + + mimeType + HYPERLINK \l "DATATYPE_String" String + Yes + The MIME type of the file, NULL if not known. + + + creationDate + HYPERLINK \l "DATATYPE_Time" Time + Yes + The creation timestamp of the file, NULL if not known. + + + modificationDate + HYPERLINK \l "DATATYPE_Time" Time + Yes + The last modification timestamp of the file, NULL if not known. + + + size + HYPERLINK \l "DATATYPE_ULong" ULong + Yes + The size of the file in Octets, NULL if not known. + + + content + HYPERLINK \l "DATATYPE_Blob" Blob + Yes + The contents of the file, NULL if not supplied. + + + metaData + List< HYPERLINK \l "DATATYPE_NamedValue" NamedValue> + Yes + A list of extra metadata for the file. + + + + + Composite: ObjectIdentity + + The ObjectIdentity structure shall represent the Object Identity of an MO Object. + + + + + + + + + + + + + + + + + + + + Name + ObjectIdentity + + + Extends + HYPERLINK \l "DATATYPE_Composite" Composite + + + Short Form Part + 1008 + + + Field + Type + Nullable + Comment + + + domain + List< HYPERLINK \l "DATATYPE_Identifier" Identifier> + No + The domain of the MO Object being referenced. + + + key + HYPERLINK \l "DATATYPE_Identifier" Identifier + No + The key of the MO Object being referenced. + + + version + HYPERLINK \l "DATATYPE_UInteger" UInteger + No + The version of the MO Object being referenced. + + + + + Composite: ServiceId + + The ServiceId structure shall represent a specific service in MO. + + + + + + + + + + + + + + + + + + + + Name + ServiceId + + + Extends + HYPERLINK \l "DATATYPE_Composite" Composite + + + Short Form Part + 1009 + + + Field + Type + Nullable + Comment + + + keyArea + HYPERLINK \l "DATATYPE_UShort" UShort + No + The area of this service taken from the numeric Area identifier of the service specification. + + + keyService + HYPERLINK \l "DATATYPE_UShort" UShort + No + The service taken from the numeric Service identifier of the service specification. + + + keyAreaVersion + HYPERLINK \l "DATATYPE_UOctet" UOctet + No + The Area Version of the service. + + + + + Composite: NullableAttribute + + NullableAttribute structure shall represent an Attribute that can be nullable. + + + + + + + + + + + + + + + + + + + + Name + NullableAttribute + + + Extends + HYPERLINK \l "DATATYPE_Composite" Composite + + + Short Form Part + 1010 + + + Field + Type + Nullable + Comment + + + value + HYPERLINK \l "DATATYPE_Attribute" Attribute + Yes + The value of the nullable attribute. + + + + MO Errors + + The following table lists the errors defined in this specification: + + Table + + STYLEREF "Heading 1"\l \n \t \* MERGEFORMAT 1 SEQ Table \s 1 1tc \f T " + 1 + - SEQ Table_TOC \s 1 1 + MAL MO Errors + " + : MAL MO Errors + + + + + + + + + + + + + + + + + + + + Error + Error # + Comment + + + Delivery Failed + 65536 + Confirmed communication error. + + + Delivery Timedout + 65537 + Unconfirmed communication error. + + + Delivery Delayed + 65538 + Message queued somewhere awaiting contact. + + + Destination Unknown + 65539 + Destination cannot be contacted. + + + Destination Transient + 65540 + Destination middleware reports destination application does not exist. + + + Destination Lost + 65541 + Destination lost halfway through conversation. + + + Authentication Failed + 65542 + A failure to authenticate the message correctly. + + + Authorisation Fail + 65543 + A failure in the MAL to authorise the message. + + + Encryption Fail + 65544 + A failure in the MAL to encrypt/decrypt the message. + + + Unsupported Area + 65545 + The destination does not support the selected area. + + + Unsupported Area Version + 65546 + The destination does not support the selected area version. + + + Unsupported Service + 65547 + The destination does not support the selected service. + + + Unsupported Operation + 65548 + The destination does not support the selected operation. + + + Bad Encoding + 65549 + The destination was unable to decode the message. + + + Internal + 65550 + An internal error has occurred. + + + Unknown + 65551 + Operation specific. + + + Incorrect State + 65552 + The destination was not in the correct state for the received message. + + + Too Many + 65553 + Maximum number of subscriptions or providers of a broker has been exceeded. + + + Shutdown + 65554 + The component is being shutdown. + + + Transaction Timeout + 65555 + The interaction exceeded a certain timeout duration. + + + + diff --git a/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area001-v003-MAL/word/numbering.xml b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area001-v003-MAL/word/numbering.xml new file mode 100644 index 00000000..1d905cd4 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area001-v003-MAL/word/numbering.xml @@ -0,0 +1,3 @@ + + + diff --git a/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area001-v003-MAL/word/styles.xml b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area001-v003-MAL/word/styles.xml new file mode 100644 index 00000000..ee967ee1 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area001-v003-MAL/word/styles.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area002-v001-COM/[Content_Types].xml b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area002-v001-COM/[Content_Types].xml new file mode 100644 index 00000000..fbe325d6 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area002-v001-COM/[Content_Types].xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area002-v001-COM/_rels/.rels b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area002-v001-COM/_rels/.rels new file mode 100644 index 00000000..d6637f3e --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area002-v001-COM/_rels/.rels @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area002-v001-COM/word/_rels/document.xml.rels b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area002-v001-COM/word/_rels/document.xml.rels new file mode 100644 index 00000000..7af141e1 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area002-v001-COM/word/_rels/document.xml.rels @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area002-v001-COM/word/document.xml b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area002-v001-COM/word/document.xml new file mode 100644 index 00000000..3ab0848a --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area002-v001-COM/word/document.xml @@ -0,0 +1,2252 @@ + + + + + Specification: COM + + + General + + This section contains the specifications for the COM services. + This section details the Common Object Model area; the structures used by the service are detailed in section 4. The area and structures are defined in terms of the MO Message Abstraction Layer (MAL), so it is possible to deploy them over any supported protocol and message transport. + This area contains the following services: + Event + Archive + ActivityTracking + + Requirements + + The instance identifier of an object must not use the value of '0' for actual object instances as this is the wildcard value. + The related field of an object must not use the value of '0' as this is the wildcard value. + The instance identifier of the source field of an object must not use the value of '0' as this is the wildcard value. + If the MAL data type specification is being used the body of an object shall be a concrete type. + If the MAL data type specification is being used the body of an object shall not be an abstract Attribute. + If the MAL data type specification is being used the body of an object shall not be a list. + + + Service: Event + + + Overview + + An event is a specific object representing 'something that happens in the system at a given point in time'. The event service provides a generic mechanism for the distribution of events. + An event is a special type of COM object and is identified by the normal object fields (domain, object type, and object instance identifier). + It may also contain: + a link to a source object (that caused the event to be generated) + a link to a service specific related object + a body that is specific to the event type and whose data structure is defined by the service that declares the event. + The event service only defines a single operation that supports the publishing of events and subscription of events generated by other components. + Events are published with a MAL update type of DELETION. Events are something that happens at a given point in time, therefore they in themselves have no lifetime, they are created and deleted at the time instant in time. For efficiency purposes only the deletion update is used. + + Table + + STYLEREF "Heading 1"\l \n \t \* MERGEFORMAT 1 SEQ Table \s 1 1tc \f T " + 1 + - SEQ Table_TOC \s 1 1 + Event Service Operations + " + : Event Service Operations + + + + + + + + + + + + + + + + + + + + + + Area Identifier + Service Identifier + Area Number + Service Number + Area Version + + + COM + Event + 2 + 1 + 1 + + + Interaction Pattern + Operation Identifier + Operation Number + Capability Set + + + PUB-SUB + HYPERLINK \l "OPERATION_1_monitorEvent" monitorEvent + 1 + 1 + + + + Service-level Requirements + + + COM usage + + The event service may be used for the publishing and monitoring of COM events. + The identification of the event shall follow the COM object rules. + The COM object source link shall point to the object that caused the event to be generated unless stated otherwise by the defining service specification. + The COM object related link shall be service and event type specific. + When an event is published using the PUBLISH-SUBSCRIBE monitorEvent operation defined in the event service it shall be published with a MAL update type of DELETED. + When an event is published, the COM object instance identifier shall be populated by the publisher. + The object instance identifier should be unique for a domain and object type. + An event may have an associated body that is published with it. + The type and contents of the body of an event shall be specified in the defining service specification but must be a concrete type or an Attribute. + + COM Archive Service usage + + Each type of event is a separate COM object type and therefore may be stored in a COM archive. + When a service implementation requires that the events it generates be persisted, upon event emission, the event shall be stored as normal. + The related link is service specific and shall always be null if not explicitly used by a service. + The source link shall point to the source object of the event. + + + Operation: monitorEvent + + + Overview + + The monitorEvent operation allows a consumer to subscribe for events. + + + + + + + + + + + + + + + + + + + + Operation Identifier + monitorEvent + + + Interaction Pattern + PUBLISH-SUBSCRIBE + + + Pattern Sequence + Message + Nullable + Type Signature + + + OUT + PUBLISH + YesYes + HYPERLINK \l "DATATYPE_ObjectDetails" ObjectDetails eventLinksElement eventBody + + + + Type Signature Details + + eventLinks - The MAL::EntityKey.firstSubKey shall contain the event object number as a base 10 string. For example, for an object number of '14' the key value would be '14' with no padding. +The MAL::EntityKey.secondSubKey shall contain the area, service, and version ObjectType fields as a MAL::Long populated as (in hex) 0xAAAASSSSVVXXXXXX where AAAA is the area (16 bits), SSSS is the service (16 bits), VV is the version (8 bits), and XXXXXX is unused and set to zero (24 bits). For example, for an area of '1', and a service of '2', and a version of '3' the field would contain (in hex) 0x0001000203000000. +The MAL::EntityKey.thirdSubKey shall contain the event object instance identifier. +The MAL::EntityKey.fourthSubKey shall contain the area, service, version and number fields of the event source ObjectType using same methodology as given for the second sub key but replacing the XXXXXX part with the number field. +The related and source links of the event shall populate the ObjectDetails part of the publish/notify message. +The body of the event shall populate the final part of the publish/notify message. +The timestamp of the Event shall be taken from the publish message. +An event in one domain may be generated by something in another domain therefore the domain of the event shall not be required to be the same domain as the source of the event. + eventBody - + + Requirements + + + MO Errors + + The operation does not return any errors. + + + Service: Archive + + + Overview + + The Archive service provides a basic interface to a standard archiving function. It follows the basic CRUD principles and allows simple querying of the archive. It provides operations to add new objects to an archive, delete objects from an archive, update existing objects in an archive, and also query the content of the archive. + The query operation provides a basic querying ability, allowing a consumer to filter on fields from the object headers (such as domain etc) and also filter on the body of the object if it uses the MAL data type specification. + The query operation is extensible but the extensions would be outside this standard. + Finally, a consumer of the archive can monitor it for changes by subscribing for archive events from the event service. Any change to the archive is published using the event service if it is supported by an implementation. + + Table + + STYLEREF "Heading 1"\l \n \t \* MERGEFORMAT 1 SEQ Table \s 1 1tc \f T " + 1 + - SEQ Table_TOC \s 1 1 + Archive Service Operations + " + : Archive Service Operations + + + + + + + + + + + + + + + + + + + + + + Area Identifier + Service Identifier + Area Number + Service Number + Area Version + + + COM + Archive + 2 + 2 + 1 + + + Interaction Pattern + Operation Identifier + Operation Number + Capability Set + + + INVOKE + HYPERLINK \l "OPERATION_2_retrieve" retrieve + 1 + 1 + + + PROGRESS + HYPERLINK \l "OPERATION_2_query" query + 2 + + + + INVOKE + HYPERLINK \l "OPERATION_2_count" count + 3 + + + + REQUEST + HYPERLINK \l "OPERATION_2_store" store + 4 + 2 + + + SUBMIT + HYPERLINK \l "OPERATION_2_update" update + 5 + 3 + + + REQUEST + HYPERLINK \l "OPERATION_2_delete" delete + 6 + 4 + + + + Service-level Requirements + + + COM Event Service usage + + For each stored object, an 'ObjectStored' event may be published to the event service. + For each updated object, an 'ObjectUpdated' event may be published to the event service. + For each deleted object, an 'ObjectDeleted' event may be published to the event service. + The source link of the generated events shall link to the object being stored/updated/deleted. + Archive service events shall be persisted silently in order not to trigger an infinite event loop. + + Table + + STYLEREF "Heading 1"\l \n \t \* MERGEFORMAT 1 SEQ Table \s 1 1tc \f T " + 1 + - SEQ Table_TOC \s 1 1 + Archive Service Events + " + : Archive Service Events + + + + + + + + + + + + + + + + + + + + + + Object Number + Event Name + Object Body Type + Related link + Source link + + + 1 + ObjectStored + No body + Set to NULL + The Object source is the newly stored object. + + + 2 + ObjectUpdated + No body + Set to NULL + The Object source is the updated object. + + + 3 + ObjectDeleted + No body + Set to NULL + The Object source is the deleted object. + + + + COM Object Relationships + + The Figure below shows the COM event relationships for this service: + + Figure + + STYLEREF "Heading 1"\l \n \t \* MERGEFORMAT 1 SEQ Figure \s 1 1tc \f T " + 1 + - SEQ Figure_TOC \s 1 1 + Archive Service COM event relationships + " + : Archive Service COM event relationships + + + + Operation: retrieve + + + Overview + + Retrieves a set of objects identified by their object instance identifier. + + + + + + + + + + + + + + + + + + + + Operation Identifier + retrieve + + + Interaction Pattern + INVOKE + + + Pattern Sequence + Message + Nullable + Type Signature + + + IN + INVOKE + YesYesYes + HYPERLINK \l "DATATYPE_ObjectType" ObjectType objTypeList<Identifier> domainList<Long> objInstIds + + + OUT + ACK + - + - + + + OUT + RESPONSE + YesYes + List< HYPERLINK \l "DATATYPE_ArchiveDetails" ArchiveDetails> objDetailsList<Element> objBodies + + + + Type Signature Details + + objType - The first part of the request shall contain the type of the object required. +If any of the fields of the object type contains the wildcard value of '0' then an INVALID error shall be returned. +The second part of the request shall contain the domain to match. +If the domain contains the wildcard value of '*' then an INVALID error shall be returned. +The third part of the request shall contain the list of object instance identifiers to match. +If the object instance identifier list contains the wildcard value '0' then all object instances shall be matched. +If any explicitly requested object cannot be matched then an UNKNOWN error shall be returned. + domain - + objInstIds - + objDetails - The response shall contain the set of matched objects. +The first returned list shall contain the matched object instance identifiers and object details of the matched objects. +The second returned list shall contain the object bodies ordered identically to the first list unless no body for the object is declared in the service specification, in which case a NULL replaces the complete list. +There shall be an entry in each returned list for each matched object. +When no objects have been matched only a response with NULL for each part of the response shall be returned. +The ordering of the returned objects is not specified and implementation specific. +If ordering of the returned objects is required then the query operation should be used instead. + objBodies - + + Requirements + + + MO Errors + + The operation may return one of the following errors: + UNKNOWN: One or more of the requested objects specified in the operation do not exist and therefore cannot be found. + INVALID: The request contains a wildcard value in either the object type field or the domain. + + + + + + + + + + + + + + + + + + + + Error + Error # + ExtraInfo Type + ExtraInfo description + + + UNKNOWN + Defined in MAL + List<UInteger> + A list of the indexes of the error values shall be contained in the extra information field. + + + INVALID + 70000 + Not Used + - + + + + + Operation: query + + + Overview + + Retrieves a set of object instance identifiers, and optionally the object bodies, from a list of supplied queries. The PROGRESS interaction pattern is used as the returned set of data may be quite large and this allows it to be split over several MAL messages. + + + + + + + + + + + + + + + + + + + + Operation Identifier + query + + + Interaction Pattern + PROGRESS + + + Pattern Sequence + Message + Nullable + Type Signature + + + IN + PROGRESS + YesYesYesYes + Boolean returnBody HYPERLINK \l "DATATYPE_ObjectType" ObjectType objTypeList< HYPERLINK \l "DATATYPE_ArchiveQuery" ArchiveQuery> archiveQueryList< HYPERLINK \l "DATATYPE_QueryFilter" QueryFilter> queryFilter + + + OUT + ACK + - + - + + + OUT + UPDATE + YesYesYesYes + HYPERLINK \l "DATATYPE_ObjectType" ObjectType objTypeList<Identifier> domainList< HYPERLINK \l "DATATYPE_ArchiveDetails" ArchiveDetails> objDetailsList<Element> objBodies + + + OUT + RESPONSE + YesYesYesYes + HYPERLINK \l "DATATYPE_ObjectType" ObjectType objTypeList<Identifier> domainList< HYPERLINK \l "DATATYPE_ArchiveDetails" ArchiveDetails> objDetailsList<Element> objBodies + + + + Type Signature Details + + returnBody - The first part of the request shall contain a Boolean that if set to TRUE requests that the body of the objects is returned otherwise only the ObjectType and ArchiveDetails shall be returned and the returned list of the bodies of the objects shall be replaced with a NULL. +The second part of the request shall contain the type of the object required. +Each part of the object type may contain the wildcard value of '0'. +The third and fourth parts of the request shall contain the queries to evaluate. +A single query shall be formed by the combination of an ArchiveQuery from the first list and a QueryFilter from the second list. +The two lists shall be ordered identically so that the query and the filter parts can be matched together. +If a query does not contain a QueryFilter part then that entry in the QueryFilter list shall be replaced with a NULL value. +If the request does not contain any QueryFilters then the complete list may be replaced with a NULL. +The size of the two lists must be the same unless the complete second list is replaced with a NULL otherwise an INVALID error shall be raised. +For each query, the ArchiveQuery and the QueryFilter shall contain the COM object fields to filter on. +The ArchiveQuery may contain the wildcard value of NULL on each of the fields. +If an ArchiveQuery contains an end time but no start time then it shall match the single object that has a timestamp closest to, but not greater than, the end time field. +The end time field may specify a time in the future. +If the sortFieldName of the ArchiveQuery does not reference a defined field then an INVALID error shall be returned. +Each query shall be evaluated separately from each other, the filter of one query will not affect the filter of another. This forms a logical OR operation. +If the QueryFilter contains an error then an INVALID error shall be returned. The definition of erroneous values are filter specific and defined in the relevant filter structure specification. + objType - + archiveQuery - + queryFilter - + objType - + domain - + objDetails - + objBodies - + objType - The updates and the responses shall contain the set of matched objects. +If a wildcard was used in the ObjectType part of the request then the updates and response shall contain the ObjectType of each matched object. +If there was not any wildcards in the ObjectType part of the request the ObjectType in the updates and response shall be replaced by a NULL. +The first returned list shall contain the domain of the objects being returned. +If multiple ObjectTypes or domains have been matched then multiple Update message may be returned. +There shall be an entry in the second and third lists for each matched object. +The second returned list shall contain the archive details stored for the matched objects. +If the initial Boolean of the request was True the third returned list shall contain the bodies of the objects. +If the initial Boolean of the request was NULL or False the third returned list shall be replaced by a NULL. +The returned lists shall be sorted based on the sorting options specified in ArchiveQuery. +Each domain/object type pair shall be sorted separately from other domain/object type pairs, there is no requirement for sorting to be applied across domain/object type pairs. +When the field being sorted on contains a NULL value, or does not exist in the matched object (due to a containing composite being NULL), these entries shall be added to the end of the returned list in the order that they are matched. +When no objects have been matched only a response with NULL for each part of the response shall be returned. + domain - + objDetails - + objBodies - + + Requirements + + + MO Errors + + The operation may return the following error: + INVALID: One or more of the query filters supplied contains an invalid value. + + + + + + + + + + + + + + + + + + + + Error + Error # + ExtraInfo Type + ExtraInfo description + + + INVALID + 70000 + List<UInteger> + The extra information field contains a list of the indexes of the erroneous values from the originating list supplied. + + + + + Operation: count + + + Overview + + Counts the set of objects based on a supplied query. + + + + + + + + + + + + + + + + + + + + Operation Identifier + count + + + Interaction Pattern + INVOKE + + + Pattern Sequence + Message + Nullable + Type Signature + + + IN + INVOKE + YesYesYes + HYPERLINK \l "DATATYPE_ObjectType" ObjectType objTypeList< HYPERLINK \l "DATATYPE_ArchiveQuery" ArchiveQuery> archiveQueryList< HYPERLINK \l "DATATYPE_QueryFilter" QueryFilter> queryFilter + + + OUT + ACK + - + - + + + OUT + RESPONSE + Yes + List<Long> counts + + + + Type Signature Details + + objType - The ObjectType, ArchiveQuery and QueryFilter parts of the request shall be populated exactly the same as for the query operation. + archiveQuery - + queryFilter - + counts - The response shall contain the count of matched objects. +There shall be an entry in each returned list for each entry in the request list. +The returned lists shall be ordered the same as the request query lists so that the response can be matched to the corresponding request. + + Requirements + + + MO Errors + + The operation may return the following error: + INVALID: One or more of the query filters supplied contains an invalid value. + + + + + + + + + + + + + + + + + + + + Error + Error # + ExtraInfo Type + ExtraInfo description + + + INVALID + 70000 + List<UInteger> + The extra information field contains a list of the indexes of the erroneous values from the originating list supplied. + + + + + Operation: store + + + Overview + + Stores new objects in the archive and causes an ObjectStored event to be published by the archive. + When new objects are being stored in an archive by a service provider the archive service provider is capable of allocating an unused object instance identifier for the objects being stored. The returned object instance identifier should be used by the service provider for identifying the object instances to its consumer to ensure that only a single object instance identifier is used for each object instance. + + + + + + + + + + + + + + + + + + + + Operation Identifier + store + + + Interaction Pattern + REQUEST + + + Pattern Sequence + Message + Nullable + Type Signature + + + IN + REQUEST + YesYesYesYesYes + Boolean returnObjInstIds HYPERLINK \l "DATATYPE_ObjectType" ObjectType objTypeList<Identifier> domainList< HYPERLINK \l "DATATYPE_ArchiveDetails" ArchiveDetails> objDetailsList<Element> objBodies + + + OUT + RESPONSE + Yes + List<Long> objInstIds + + + + Type Signature Details + + returnObjInstIds - The first part of the request indicates whether the operation should return the object instance identifiers used, if TRUE it shall return them, otherwise it returns NULL. +The second part of the request shall contain the type of object being stored. +The third part of the request shall contain the domain of the objects being stored. +The fourth part of the request shall contain the list of archive details to use, one for each object being stored. +If the object instance identifier supplied in the archive details is set to 0 then the store operation shall allocate a new and unused object instance identifier. +If the object instance identifier supplied in the archive details is not set to 0 and is currently used in the archive then a DUPLICATE error is returned and no objects from the request shall be stored. +The fifth part of the request shall contain the list of objects to store. +The fourth and fifth list must be the same size as there is only one entry in each for each object to be stored. If they differ in size an INVALID error is returned with the extra error information integer giving the index of the list entry without a matching entry in the other list. +An INVALID error shall be returned if a wildcard value of '0' is used in the object type. +An INVALID error shall be returned if a wildcard value of '*' is used in the domain identifier list. +An INVALID error shall be returned if the values of '0', '*', or NULL are used in the network, timestamp or provider fields of the archive details except for the object instance identifier. +The type of the body of the object should be checked against the declared type in the relevant service specification, if different an INVALID error is raised. +If any error is returned then the store operation shall be rolled back and nothing is stored as a result of the operation. + objType - + domain - + objDetails - + objBodies - + objInstIds - The response shall contain the set of new object instance identifiers if the request supplied an initial TRUE Boolean value, otherwise it returns NULL. +The returned list shall be ordered identically to the submitted list so that the returned object instance identifiers can be mapped to the correct objects. + + Requirements + + + MO Errors + + The operation may return one of the following errors: + INVALID: One or more of the objects being stored contains an invalid value. + DUPLICATE: One or more of the objects being stored has supplied an object instance identifier that is already in use in the archive. + + + + + + + + + + + + + + + + + + + + Error + Error # + ExtraInfo Type + ExtraInfo description + + + INVALID + 70000 + List<UInteger> + The extra information field contains a list of the indexes of the erroneous values from the originating list supplied. + + + DUPLICATE + 70001 + List<UInteger> + The extra information field contains a list of the indexes of the erroneous values from the originating request list. + + + + + Operation: update + + + Overview + + Updates an object (or set of objects), causes an ObjectUpdated event to be published by the archive. + + + + + + + + + + + + + + + + + + + + Operation Identifier + update + + + Interaction Pattern + SUBMIT + + + Pattern Sequence + Message + Nullable + Type Signature + + + IN + SUBMIT + YesYesYesYes + HYPERLINK \l "DATATYPE_ObjectType" ObjectType objTypeList<Identifier> domainList< HYPERLINK \l "DATATYPE_ArchiveDetails" ArchiveDetails> objDetailsList<Element> objBodies + + + + Type Signature Details + + objType - The first part of the request shall contain the type of object being updated. +The second part of the request shall contain the domain of the objects being updated. +The third part of the request shall contain the list of ArchiveDetails. +The object instance identifier contained in the ArchiveDetails, combined with the object type and domain from the request, shall be used to match objects. +If requested object cannot be matched then an UNKNOWN error shall be returned and nothing will be updated. +The remainder of the ArchiveDetails shall be used to update the matched objects. +The fourth part of the request shall contain the list of objects to replace the matched objects with. +No wildcard values shall be accepted in the object type, the domain, and the object instance identifier, an INVALID error is returned in this case and no objects are updated. + domain - + objDetails - + objBodies - + + Requirements + + + MO Errors + + The operation may return one of the following errors: + UNKNOWN: One or more of the requested objects specified in the operation do not exist and therefore cannot be found. + INVALID: One or more of the objects being updated contains a wildcard value in the object identifier fields. + + + + + + + + + + + + + + + + + + + + Error + Error # + ExtraInfo Type + ExtraInfo description + + + UNKNOWN + Defined in MAL + List<UInteger> + A list of the indexes of the error values shall be contained in the extra information field. + + + INVALID + 70000 + List<UInteger> + The extra information field contains a list of the indexes of the erroneous values from the originating list supplied. + + + + + Operation: delete + + + Overview + + Deletes an object (or set of objects) and causes an ObjectDeleted event to be published by the archive. + + + + + + + + + + + + + + + + + + + + Operation Identifier + delete + + + Interaction Pattern + REQUEST + + + Pattern Sequence + Message + Nullable + Type Signature + + + IN + REQUEST + YesYesYes + HYPERLINK \l "DATATYPE_ObjectType" ObjectType objTypeList<Identifier> domainList<Long> objInstIds + + + OUT + RESPONSE + Yes + List<Long> deletedObjInstIds + + + + Type Signature Details + + objType - The first part of the request shall contain the type of object to match and is not permitted to contain the wildcard value. +The second part of the request shall contain the domain of the objects to match and is not permitted to contain the wildcard value. +If either the first or second part contain a wildcard value then an INVALID error shall be returned and no object deleted. +The third part of the request shall contain the list of object instance identifiers to match. +If the object instance identifier list contains the wildcard value '0' then all object instances shall be matched. +If any explicitly requested object cannot be matched then an UNKNOWN error shall be returned and nothing will be deleted. +The matched objects shall be deleted from the archive. + domain - + objInstIds - + deletedObjInstIds - The response shall contain the set of object instance identifiers of the deleted objects. + + Requirements + + + MO Errors + + The operation may return one of the following errors: + UNKNOWN: One or more of the requested objects specified in the operation do not exist and therefore cannot be found. + INVALID: The supplied object type or domain contains a wildcard value. + + + + + + + + + + + + + + + + + + + + Error + Error # + ExtraInfo Type + ExtraInfo description + + + UNKNOWN + Defined in MAL + List<UInteger> + A list of the indexes of the error values shall be contained in the extra information field. + + + INVALID + 70000 + Not Used + - + + + + + Service: ActivityTracking + + + Overview + + The activity tracking service provides the ability to monitor the progress of activities; an activity is anything that has a measurable period of time (a command, a remote procedure, a schedule etc). It defines an event pattern that supports the monitoring of activities from the initial consumer request, tracking its progress across a transport link, to reception by the provider and execution in that provider. + + Table + + STYLEREF "Heading 1"\l \n \t \* MERGEFORMAT 1 SEQ Table \s 1 1tc \f T " + 1 + - SEQ Table_TOC \s 1 1 + ActivityTracking Service Operations + " + : ActivityTracking Service Operations + + + + + + + + + + + + + + + + + + + + + + Area Identifier + Service Identifier + Area Number + Service Number + Area Version + + + COM + ActivityTracking + 2 + 3 + 1 + + + Interaction Pattern + Operation Identifier + Operation Number + Capability Set + + + + Service-level Requirements + + + COM usage + + The activity tracking service may be used for the monitoring of MAL operations. + A MAL implementation must populate the transaction identifier for SEND interactions if the activity tracking service is to be used. + If a MAL operation is using the activity tracking service, when the interaction is started, the consumer shall populate and archive an OperationActivity object. + The OperationActivity object shall use the transaction identifier of the MAL operation for its object instance identifier. + The OperationActivity object shall use the domain of the MAL operation for its domain. + All Activity events for the interaction shall link to the OperationActivity object using their source link where the object instance identifier to use is the MAL interaction transaction identifier. + If a relay node is unable to relay the operation then that relay shall fail the MAL interaction that the consumer initiated as well as generate the correct activity event. + The executionStage field of the Execution event structure shall hold the current execution stage of the activity. + For SUBMIT, INVOKE, and PROGRESS interactions the ACKNOWLEDGE stage shall have an execution stage value of '1'. + For REQUEST interactions the RESPONSE stage shall have an execution stage value of '1'. + For PROGRESS interactions the execution stage value for the PROGRESS updates shall start at '2' and increate for each update sent. + For PROGRESS interactions the execution stage value for the RESPONSE shall be the total number of PROGRESS updates plus '2'. + The stageCount field of the Execution event structure shall be populated from the stage count row of Table 2-1. + + Table + + STYLEREF "Heading 1"\l \n \t \* MERGEFORMAT 1 SEQ Table \s 1 1tc \f T " + 1 + - SEQ Table_TOC \s 1 1 + ActivityTracking Service Object Types + " + : ActivityTracking Service Object Types + + + + + + + + + + + + + + + + + + + + + + Object Number + Object Name + Object Body Type + Related link + Source link + + + 6 + OperationActivity + HYPERLINK \l "DATATYPE_OperationActivity" OperationActivity + Set to NULL + Set to NULL + + + + COM Event Service usage + + The activity tracking service shall use the event service for the monitoring of activities being transferred from a consumer to a provider and also for execution in the provider. + A Release event shall be generated when an activity is released from a consumer. + A Reception event shall be generated when an activity is received by an intermediate relay. + A Forward event shall be generated when an activity is released from an intermediate relay. + An Acceptance event shall be generated when an activity is received by the destination provider. + Reception and Forward events shall only be used in a multi-hop activity transfer. + For Reception and Forward events, the source URI in the UpdateHeader of the published event shall contain the URI of the relay. It is protocol specific how this value is derived. + Execution progress of an activity shall be reported using Execution events. + The Execution event may be reported many times as it is used to report each stage in the execution of the activity. + + Table + + STYLEREF "Heading 1"\l \n \t \* MERGEFORMAT 1 SEQ Table \s 1 1tc \f T " + 1 + - SEQ Table_TOC \s 1 1 + ActivityTracking Service Events + " + : ActivityTracking Service Events + + + + + + + + + + + + + + + + + + + + + + Object Number + Event Name + Object Body Type + Related link + Source link + + + 1 + Release + HYPERLINK \l "DATATYPE_ActivityTransfer" ActivityTransfer + Set to NULL + The activity being monitored is the source of the event. + + + 2 + Reception + HYPERLINK \l "DATATYPE_ActivityTransfer" ActivityTransfer + Set to NULL + The activity being monitored is the source of the event. + + + 3 + Forward + HYPERLINK \l "DATATYPE_ActivityTransfer" ActivityTransfer + Set to NULL + The activity being monitored is the source of the event. + + + 4 + Acceptance + HYPERLINK \l "DATATYPE_ActivityAcceptance" ActivityAcceptance + Set to NULL + The activity being monitored is the source of the event. + + + 5 + Execution + HYPERLINK \l "DATATYPE_ActivityExecution" ActivityExecution + Set to NULL + The activity being monitored is the source of the event. + + + + COM Object Relationships + + The Figure below shows the COM object and event relationships for this service: + + Figure + + STYLEREF "Heading 1"\l \n \t \* MERGEFORMAT 1 SEQ Figure \s 1 1tc \f T " + 1 + - SEQ Figure_TOC \s 1 1 + ActivityTracking Service COM object and event relationships + " + : ActivityTracking Service COM object and event relationships + + + COM Archive Service usage + + The events generated as part of the activity monitoring pattern may be persisted in a COM archive. + If the activity events are being persisted then the objects that represent the activities (such as an OperationActivity object) should also be persisted. + + Data types + + + Area data types: COM + + + + Composite: ObjectType + + The ObjectType structure uniquely identifies the type of an object. It is the combination of the area number, service number, area version, and service object type number. The combined parts are able to fit inside a MAL::Long (for implementations that prefer to index on a single numeric field rather than a structure). + + + + + + + + + + + + + + + + + + + + Name + ObjectType + + + Extends + Composite + + + Short Form Part + 1 + + + Field + Type + Nullable + Comment + + + area + UShort + No + Area Number where the object type is defined. Must not be '0' for values as this is the wildcard. + + + service + UShort + No + Service Number of the service where the object type is defined. Must not be '0' for values as this is the wildcard. + + + version + UOctet + No + Area Version of the service where the object type is defined. Must not be '0' for values as this is the wildcard. + + + number + UShort + No + The service specific object number. Must not be '0' for values as this is the wildcard. + + + + + Composite: ObjectKey + + The ObjectKey structure combines a domain and an object instance identifier such that it identifies the instance of an object for a specific domain. + + + + + + + + + + + + + + + + + + + + Name + ObjectKey + + + Extends + Composite + + + Short Form Part + 2 + + + Field + Type + Nullable + Comment + + + domain + List<Identifier> + No + The domain of the object instance. + + + instId + Long + No + The unique identifier of the object instance. Must not be '0' for values as this is the wildcard. + + + + + Composite: ObjectId + + The ObjectId structure combines an object type and an object key such that it identifies the instance and type of an object for a specific domain. + + + + + + + + + + + + + + + + + + + + Name + ObjectId + + + Extends + Composite + + + Short Form Part + 3 + + + Field + Type + Nullable + Comment + + + type + HYPERLINK \l "DATATYPE_ObjectType" ObjectType + No + The fully qualified unique identifier of the type. + + + key + HYPERLINK \l "DATATYPE_ObjectKey" ObjectKey + No + The combination of the object domain and object instance identifier. + + + + + Composite: ObjectDetails + + The ObjectDetails type is used to hold the extra information associated with an object instance, namely the related and source links. + + + + + + + + + + + + + + + + + + + + Name + ObjectDetails + + + Extends + Composite + + + Short Form Part + 4 + + + Field + Type + Nullable + Comment + + + related + Long + Yes + Contains the object instance identifier of a related object (e.g. the ActionDefinition that an Action uses). This is service specific. The ObjectType of the related object is specified in the service specification. The related object must exist in the same domain as this object. + + + source + HYPERLINK \l "DATATYPE_ObjectId" ObjectId + Yes + An object which is at the origin of the object creation (e.g. the procedure from which an action was triggered). + + + + + Composite: InstanceBooleanPair + + Simple pair of an object instance identifier and a Boolean value. + + + + + + + + + + + + + + + + + + + + Name + InstanceBooleanPair + + + Extends + Composite + + + Short Form Part + 5 + + + Field + Type + Nullable + Comment + + + id + Long + No + The object instance identifier. + + + value + Boolean + No + An associated Boolean value. + + + + Service data types: Archive + + + + Enumeration: ExpressionOperator + + The ExpressionOperator enumeration holds a set of possible expression operators. + + + + + + + + + + + + + + + + + + + Name + ExpressionOperator + + + Short Form Part + 5 + + + Enumeration Value + Numerical Value + Comment + + + EQUAL + 1 + Checks for equality. + + + DIFFER + 2 + Checks for difference (not equal). + + + GREATER + 3 + Checks for greater than. + + + GREATER_OR_EQUAL + 4 + Checks for greater than or equal to. + + + LESS + 5 + Checks for less than. + + + LESS_OR_EQUAL + 6 + Checks for less than or equal to. + + + CONTAINS + 7 + Case sensitive containment test (String types only) + + + ICONTAINS + 8 + Case insensitive containment test (String types only). + + + + + Composite: QueryFilter + + The base structure for archive filters. + + + + + + + + + + + + + + + + + + + + Name + QueryFilter + + + Extends + Composite + + + Abstract + + + + + Composite: ArchiveDetails + + The ArchiveDetails structure is used to hold information about a single entry in an Archive. + + + + + + + + + + + + + + + + + + + + Name + ArchiveDetails + + + Extends + Composite + + + Short Form Part + 1 + + + Field + Type + Nullable + Comment + + + instId + Long + No + The object instance identifier of the archived object. + + + details + HYPERLINK \l "DATATYPE_ObjectDetails" ObjectDetails + No + The details of the Object. + + + network + Identifier + Yes + The network zone of the object. + + + timestamp + FineTime + Yes + The time the object was created. + + + provider + URI + Yes + The component that created the object (a component may be anything from an onboard equipment to a software process on the ground). + + + + + Composite: ArchiveQuery + + The ArchiveQuery structure is used to specify filters on the common parts of an object in an archive. + + + + + + + + + + + + + + + + + + + + Name + ArchiveQuery + + + Extends + Composite + + + Short Form Part + 2 + + + Field + Type + Nullable + Comment + + + domain + List<Identifier> + Yes + Only the objects whose domain matches the provided domain will be returned. The domain field supports the wildcard value of '*' only in the last part of the domain. If NULL then all domains shall be matched. + + + network + Identifier + Yes + Optional network zone. Only the objects whose network zone matches the provided value will be returned. If NULL then all values will be matched. + + + provider + URI + Yes + Optional provider. Only the objects whose provider URI matches the provided provider URI will be returned. If NULL then all values will be matched. + + + related + Long + No + Object instance identifier of the related Object. Only the objects whose related Object matches the provided related Object will be returned unless the '0' wildcard value is supplied. + + + source + HYPERLINK \l "DATATYPE_ObjectId" ObjectId + Yes + Optional source. Only the objects whose source matches the provided source will be returned. The fields of the ObjectId may contain the wildcard values ('0' for numeric fields, '*' for Identifier fields). If NULL then all values will be matched. + + + startTime + FineTime + Yes + Optional start time. Only the objects whose timestamp is equal or greater than the provided start time will be returned. If NULL then no start time shall be applied. + + + endTime + FineTime + Yes + Optional end time. Only the objects whose timestamp is equal or less than the provided end time will be returned. If NULL then no end time will be applied. + + + sortOrder + Boolean + Yes + If set to TRUE then returned values shall be sorted in ascending order, if FALSE then in descending order. If NULL then no sorting shall be applied. + + + sortFieldName + String + Yes + If the returned values are to be sorted because the sortOrder field is not NULL then this field may contain the name of the field in the object body (MAL::Composite) to sort against. If the object body is not a composite but an Attribute or Enumeration then to sort on the values an empty string of "" should be used. Enumerations are sorted on their ordinal. If this field is NULL then the objects shall be sorted on the COM object timestamp. The field follows the naming convention of CompositeFilter::fieldName. If the field points to a composite, list, abstract type (including Attribute) or Blob then no sorting shall be applied. + + + + + Composite: CompositeFilter + + The CompositeFilter allows an archive query to specify a filter based on the content of the body of an object if that body is specified using the MAL data type specification. + + + + + + + + + + + + + + + + + + + + Name + CompositeFilter + + + Extends + Composite + + + Short Form Part + 3 + + + Field + Type + Nullable + Comment + + + fieldName + String + No + The name of the field in the object body (MAL::Composite) to match against. It is specified by referring to the name of the field. If the field does not exist in the Composite then the filter shall evaluate to false. If the field is nested inside another Composite, it can be referenced by separating the field names by a '.' character; for example the field 'instId' or the source of an ArchiveDetails composite would be referenced using "details.source.key.instId". If the body is not a Composite but an Attribute or Enumeration then it can be referred to by using a blank ("") string value here. Accessing values from lists is not supported by this method. + + + type + HYPERLINK \l "DATATYPE_ExpressionOperator" ExpressionOperator + No + The type of the filter to apply. + + + fieldValue + Attribute + Yes + The value to compare with. The type of the suppied value and the matched field mst be the same. Must not contain NULL for expression operators CONTAINS, ICONTAINS, GREATER, GREATER_OR_EQUAL, LESS, or LESS_OR_EQUAL otherwise an INVALID error should be returned. Must contain a UInteger ordinal value if the field being matched is an Enumeration. Blob fields can only be used with EQUAL/DIFFER. Must contain a String value if operator is CONTAINS or ICONTAINS otherwise an INVALID error should be returned. + + + + + Composite: CompositeFilterSet + + Contains a list of CompositeFilters that are AND'd together to form a more complex filter. + + + + + + + + + + + + + + + + + + + + Name + CompositeFilterSet + + + Extends + HYPERLINK \l "DATATYPE_QueryFilter" QueryFilter + + + Short Form Part + 4 + + + Field + Type + Nullable + Comment + + + filters + List< HYPERLINK \l "DATATYPE_CompositeFilter" CompositeFilter> + No + The list of filters to apply. + + + + Service data types: ActivityTracking + + + + Composite: ActivityTransfer + + The structure holds details for a Release, Reception, or Forward event of an activity. + + + + + + + + + + + + + + + + + + + + Name + ActivityTransfer + + + Extends + Composite + + + Short Form Part + 1 + + + Field + Type + Nullable + Comment + + + success + Boolean + No + The success result of this stage, TRUE if successful, FALSE otherwise. If this is TRUE then the next two fields should be populated. + + + estimateDuration + Duration + Yes + The estimated amount of time it will take to be received by the next destination if Release or Forward. Contains the estimated amount of time it will take to be forwarded by this relay if Reception event. May be NULL if unknown or cannot be calculated. + + + nextDestination + URI + Yes + This contains the URI of the next destination, either another relay or the provider. It is protocol specific how this value is derived. + + + + + Composite: ActivityAcceptance + + The structure is used to hold details of an Acceptance event. + + + + + + + + + + + + + + + + + + + + Name + ActivityAcceptance + + + Extends + Composite + + + Short Form Part + 2 + + + Field + Type + Nullable + Comment + + + success + Boolean + No + The success result of this stage, TRUE if successful, FALSE otherwise. + + + + + Composite: ActivityExecution + + The structure is used to report the execution status of an activity in the final destination. + + + + + + + + + + + + + + + + + + + + Name + ActivityExecution + + + Extends + Composite + + + Short Form Part + 3 + + + Field + Type + Nullable + Comment + + + success + Boolean + No + The success result of this stage, TRUE if successful, FALSE otherwise. + + + executionStage + UInteger + No + The execution stage of the operation. + + + stageCount + UInteger + No + The total number of execution stages that will be reported. + + + + + Composite: OperationActivity + + The OperationActivity structure contains the details of a MAL operation activity. + + + + + + + + + + + + + + + + + + + + Name + OperationActivity + + + Extends + Composite + + + Short Form Part + 4 + + + Field + Type + Nullable + Comment + + + interactionType + InteractionType + No + The interaction type of the original operation message header. + + + + MO Errors + + The following table lists the errors defined in this specification: + + Table + + STYLEREF "Heading 1"\l \n \t \* MERGEFORMAT 1 SEQ Table \s 1 1tc \f T " + 1 + - SEQ Table_TOC \s 1 1 + COM MO Errors + " + : COM MO Errors + + + + + + + + + + + + + + + + + + + + Error + Error # + Comment + + + INVALID + 70000 + Operation specific + + + DUPLICATE + 70001 + Operation specific + + + + diff --git a/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area002-v001-COM/word/numbering.xml b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area002-v001-COM/word/numbering.xml new file mode 100644 index 00000000..091a10ef --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area002-v001-COM/word/numbering.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area002-v001-COM/word/styles.xml b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area002-v001-COM/word/styles.xml new file mode 100644 index 00000000..ee967ee1 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area002-v001-COM/word/styles.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area003-v001-Common/[Content_Types].xml b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area003-v001-Common/[Content_Types].xml new file mode 100644 index 00000000..fbe325d6 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area003-v001-Common/[Content_Types].xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area003-v001-Common/_rels/.rels b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area003-v001-Common/_rels/.rels new file mode 100644 index 00000000..d6637f3e --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area003-v001-Common/_rels/.rels @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area003-v001-Common/word/_rels/document.xml.rels b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area003-v001-Common/word/_rels/document.xml.rels new file mode 100644 index 00000000..7af141e1 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area003-v001-Common/word/_rels/document.xml.rels @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area003-v001-Common/word/document.xml b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area003-v001-Common/word/document.xml new file mode 100644 index 00000000..5eed8046 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area003-v001-Common/word/document.xml @@ -0,0 +1,3323 @@ + + + + + Specification: Common + + + General + + This section contains the specifications for the Common services. + This section details the Common Services; the structures used by the services and operations are detailed in section 4. The services and structures are defined in terms of the MO Message Abstraction Layer (MAL) which is defined in reference [2], so it is possible to deploy them over any supported protocol and message transport. + The services defined here are also specified in terms of the COM which is defined in reference [3]. + To aid comprehension several tables are included for each service and operation definition. The table formats are the same as those used for the specification of the MO COM Services in reference [3]. The formats are fully described in reference [2] in section 2 and in reference [3] section 2, for COM usage. + All service specifications in this document are part of the Common Area. + This area contains the following services: + Directory + Login + Configuration + + + Service: Directory + + + Overview + + The Directory service allows service providers to publish information about which services they provide and consumers to discover service provider address and capability information. + Service provider information is made available using the Directory service publishProvider operation and removed using the withdrawProvider operation. + The lookupProvider operation provides the ability for consumers to query the directory service based on a filter such as required service capability. + Finally, a provider may supply its set of service specification XML files when publishing its capabilities. This allows consumers that are able to process MO service XML files obtain the files for further processing. It is expected that this would be used to either ensure that no modifications have been made by a provider to a standard service or, in the case of a consumer that is able to dynamically interact with new service specifications, obtain the service specification to allow interaction with that new service. + + Table + + STYLEREF "Heading 1"\l \n \t \* MERGEFORMAT 1 SEQ Table \s 1 1tc \f T " + 1 + - SEQ Table_TOC \s 1 1 + Directory Service Operations + " + : Directory Service Operations + + + + + + + + + + + + + + + + + + + + + + Area Identifier + Service Identifier + Area Number + Service Number + Area Version + + + Common + Directory + 3 + 1 + 1 + + + Interaction Pattern + Operation Identifier + Operation Number + Capability Set + + + REQUEST + HYPERLINK \l "OPERATION_1_lookupProvider" lookupProvider + 1 + 1 + + + REQUEST + HYPERLINK \l "OPERATION_1_publishProvider" publishProvider + 2 + 2 + + + SUBMIT + HYPERLINK \l "OPERATION_1_withdrawProvider" withdrawProvider + 3 + + + + REQUEST + HYPERLINK \l "OPERATION_1_getServiceXML" getServiceXML + 4 + 3 + + + + Service-level Requirements + + The directory service shall provide the capability: + request service provider details based on a filter; + publish new service provider details; + withdraw service provider details; + request any supplied service XML for a service provider. + A service provider shall use the publishProvider operation to make available the set of services and the capabilities of those services that it offers. + The publish operation shall take a PublishDetails structure which defines the capabilities and addressing information of that service provider. + It shall be possible for a provider to offer multiple service addresses and bindings to allows the provider to support multiple message transports and encodings. + Each service address entry shall include the service interface binding signature description, interface address, MAL protocol mapping, message encoding, the supported QoS levels and associated QoS properties available for that connection. + A service consumer indicates its required QoS level and priority by using these values in the lookupProvider operation. + For services that have operations based on the publish and subscribe interaction pattern there may be required a separate URI for the broker component. To support this the directory service shall hold two URIs for each service, the URI of the primary interface and also a secondary one which, if present, is used for publish and subscribe-based operations. + If a broker component is shared between more than one provider, known as a shared broker, the broker shall be published as a directory service entry without a primary interface URI. + Providers that wish to use the shared broker shall reference it by using its object instance identifier in the 'brokerProviderObjInstId' field in their directory service entry. + + COM usage + + A ServiceProvider object represents a service provider. The COM object body shall hold the service provider id taken from the providerId field of the PublishDetails composite. + The ServiceProvider COM object related link shall not be used and therefore set to NULL. + The ServiceProvider COM object source link shall not be used and therefore shall be set to NULL. + A ProviderCapabilities object represents the supported capabilities of a service provider. The COM object body shall hold the provider details of the service provider. + The ProviderCapabilities COM object related link shall indicate which ServiceProvider COM object it links to. + The ProviderCapabilities COM object source link shall not be used and therefore set to NULL. + ServiceProvider and ProviderCapabilities objects shall be created by the publishService operation. + The object instance identifier for the ServiceProvider and ProviderCapabilities objects shall be populated by the provider of the directory service. + For the AddressDetails of a particular ProviderCapabilities object, if the brokerProviderObjInstId field contains a value and the brokerURI field is NULL, then the brokerURI value of the referenced provider shall be used. + + Table + + STYLEREF "Heading 1"\l \n \t \* MERGEFORMAT 1 SEQ Table \s 1 1tc \f T " + 1 + - SEQ Table_TOC \s 1 1 + Directory Service Object Types + " + : Directory Service Object Types + + + + + + + + + + + + + + + + + + + + + + Object Number + Object Name + Object Body Type + Related link + Source link + + + 1 + ServiceProvider + Identifier + Set to NULL + Set to NULL + + + 2 + ProviderCapabilities + HYPERLINK \l "DATATYPE_ProviderDetails" ProviderDetails + 1 + Set to NULL + + + + COM Object Relationships + + The Figure below shows the COM object relationships for this service: + + Figure + + STYLEREF "Heading 1"\l \n \t \* MERGEFORMAT 1 SEQ Figure \s 1 1tc \f T " + 1 + - SEQ Figure_TOC \s 1 1 + Directory Service COM object relationships + " + : Directory Service COM object relationships + + + COM Archive Service usage + + All directory objects must be stored in the COM archive by the provider of the Directory service if the implementation of the Directory service uses a COM archive. + + + Operation: lookupProvider + + + Overview + + The lookup operation allows a service consumer to query the directory service to return a list of service providers that match the requested criteria. If no match is found, then an empty list is returned. + + NOTE: The various filters that may be specified as part of this operation are combined using AND logic. + + + + + + + + + + + + + + + + + + + + Operation Identifier + lookupProvider + + + Interaction Pattern + REQUEST + + + Pattern Sequence + Message + Nullable + Type Signature + + + IN + REQUEST + Yes + HYPERLINK \l "DATATYPE_ServiceFilter" ServiceFilter filter + + + OUT + RESPONSE + Yes + List< HYPERLINK \l "DATATYPE_ProviderSummary" ProviderSummary> matchingProviders + + + + Type Signature Details + + filter - The filter field shall define the lookup query and be used to match details previously published using the publishProvider operation, the specifics of the ServiceFilter fields are defined in the following requirements. +If the serviceProviderId field is NULL then all service provider identifiers shall be matched. +If the final identifier of the domain field of the filter is the wildcard '*', then all sub-domains shall be searched for matches. See R[2] section 3.5.6.5.g. +If the wildcard is used in any other part of the domain other than the final one then an INVALID error shall be returned. +If the domain field is NULL then all domains shall be matched. +If the network field is NULL then all networks shall be matched. +If the sessionType field is NULL then all session types shall be matched. +If the sessionName field is NULL then all session names shall be matched. +The serviceKey field shall be used to match against ServiceKey fields held in the PublishDetails used to publish a specific provider. +If the serviceKey field is NULL then all areas, services and versions shall be matched. +If the area field is the wildcard '0' then all areas names shall be matched. +If the service field is the wildcard '0' then all services shall be matched. +If the version field is the wildcard '0' then all area versions shall be matched. +If the requiredCapabilitySets field is NULL or an empty list then all service capability sets shall be matched. + matchingProviders - The operation shall return a list of service providers that match the filter. +If no service providers match the supplied filter then an empty list shall be returned. + + Requirements + + + MO Errors + + The operation may return the following error: + INVALID: Invalid domain filter value. + + + + + + + + + + + + + + + + + + + + Error + Error # + ExtraInfo Type + ExtraInfo description + + + INVALID + Defined in COM + Not Used + - + + + + + Operation: publishProvider + + + Overview + + The publishProvider operation adds a new or updates an existing entry in the list of service providers held in the directory service. + + + + + + + + + + + + + + + + + + + + Operation Identifier + publishProvider + + + Interaction Pattern + REQUEST + + + Pattern Sequence + Message + Nullable + Type Signature + + + IN + REQUEST + Yes + HYPERLINK \l "DATATYPE_PublishDetails" PublishDetails newProviderDetails + + + OUT + RESPONSE + YesYes + Long providerObjIdLong capabilitiesObjId + + + + Type Signature Details + + newProviderDetails - The newProviderDetails field shall hold the provider details of the service to be added or updated in the directory service. +If any of the fields of the newProviderDetails domain/sessionName/network fields are either empty or contain the wildcard '*' an INVALID error shall be returned. +If the providerId field of the PublishDetails structure is empty or contains the wildcard '*' an INVALID error shall be returned. +For each contained ServiceKey structure if the area/service/version fields contain '0' then an INVALID error shall be returned. +For each contained supportedCapabilitySets list if the list is empty or contains '0' then an INVALID error shall be returned. +If the supportedLevels list is empty or the priorityLevels field is '0' for each contained AddressDetails structure found either within the ProviderDetails or the inner ServiceCapability structures then an INVALID error shall be returned. +If an error is being returned then no changes shall be made. + providerObjId - If the providerId field of the PublishDetails structure matches an existing ServiceProvider COM object, the operation shall update the existing details of that provider. +If the providerId field of the PublishDetails structure does not match an existing ServiceProvider COM object, then the operation shall create a new ServiceProvider COM object to represent the new service provider. +A new ProviderCapabilities COM object shall be created to store the capabilities of the provider. +The created objects should be stored in the COM archive by the directory service provider. +The operation shall return the COM object instance identifiers of the ServiceProvider and ProviderCapabilities COM objects representing the provider. + capabilitiesObjId - + + Requirements + + + MO Errors + + The operation may return the following error: + INVALID: Submitted values are invalid. + + + + + + + + + + + + + + + + + + + + Error + Error # + ExtraInfo Type + ExtraInfo description + + + INVALID + Defined in COM + Not Used + - + + + + + Operation: withdrawProvider + + + Overview + + The withdrawProvider operation removes an existing entry from the list of service providers held in the directory service. If no match is found for the withdraw request, then nothing is changed. + + + + + + + + + + + + + + + + + + + + Operation Identifier + withdrawProvider + + + Interaction Pattern + SUBMIT + + + Pattern Sequence + Message + Nullable + Type Signature + + + IN + SUBMIT + Yes + Long providerObjId + + + + Type Signature Details + + providerObjId - The providerObjId field shall hold the object instance identifier for the ServiceProvider COM object to remove from the directory service. +If the supplied identifier is '0' an INVALID error shall be returned. +If the supplied identifier does not match an existing ServiceProvider COM object then an UNKNOWN error shall be returned. +If an error is being returned then no changes shall be made. +The matched provider shall be removed from the directory service. + + Requirements + + + MO Errors + + The operation may return one of the following errors: + UNKNOWN: Provider to withdraw was not found. + INVALID: Submitted values are invalid. + + + + + + + + + + + + + + + + + + + + Error + Error # + ExtraInfo Type + ExtraInfo description + + + UNKNOWN + Defined in MAL + Not Used + - + + + INVALID + Defined in COM + Not Used + - + + + + + Operation: getServiceXML + + + Overview + + The getServiceXML operation returns the list of XML files that were submitted by the service provider by the publishProvider operation. + If no files were supplied then this operation returns an empty list. + + + + + + + + + + + + + + + + + + + + Operation Identifier + getServiceXML + + + Interaction Pattern + REQUEST + + + Pattern Sequence + Message + Nullable + Type Signature + + + IN + REQUEST + Yes + Long providerObjId + + + OUT + RESPONSE + Yes + List<File> xmlFiles + + + + Type Signature Details + + providerObjId - The providerObjId field shall hold the COM object instance identifier for the ServiceProvider to obtain the service XML for. +If the supplied instance identifier is '0' an INVALID error shall be returned. +If the supplied identifier does not match an existing ServiceProvider COM object then an UNKNOWN error shall be returned. + xmlFiles - The list of XML files supplied during the publishProvider operation for the matched provider shall be returned. +If no XML files were supplied by the provider then an empty list shall be returned. + + Requirements + + + MO Errors + + The operation may return one of the following errors: + INVALID: Submitted values are invalid. + UNKNOWN: Provider was not found. + + + + + + + + + + + + + + + + + + + + Error + Error # + ExtraInfo Type + ExtraInfo description + + + INVALID + Defined in COM + Not Used + - + + + UNKNOWN + Defined in MAL + Not Used + - + + + + + Service: Login + + + Overview + + The Login service defines the primary mechanism for the submission of authentication credentials to a deployment specific security system. It supports operations to allow a user to login, logout, report available roles, and also handover the login to another user. + The service is closely tied to the Access Control aspect of the MAL where the returned authentication identifiers are used in the MAL message header to authenticate and authorise message via Access Control. + The login service supports the concept of roles, where users may log in with a specific role; the meaning of each role is mission-specific, however it is expected that a specific role allocates the user privileges to invoke operations on mission operation services. + The use of login roles is optional but if they are used then the role details are held in the COM archive and the COM archive operations are used to manage the role definitions. The responsibility for maintenance of the login roles is outside the scope of this specification as it is a deployment issue to define the possible roles and associate users to those roles. + The form in which the password is sent to the Login service provider must be agreed upon beforehand and is dependent on the security system deployed. For example, most security implementations do not recommend the use of plain text passwords but rather some encrypted version of the password. For this reason the contents of the messages sent between the login service consumer and provider during authentication handshaking are implementation-specific. + The authentication and authorisation concept of the MO services is covered in section 3.6 of the Reference Model (R2). + The Reference Model (R2) also provides sequence diagrams for security and login in sections 5.2 and 5.3. + + Table + + STYLEREF "Heading 1"\l \n \t \* MERGEFORMAT 1 SEQ Table \s 1 1tc \f T " + 1 + - SEQ Table_TOC \s 1 1 + Login Service Operations + " + : Login Service Operations + + + + + + + + + + + + + + + + + + + + + + Area Identifier + Service Identifier + Area Number + Service Number + Area Version + + + Common + Login + 3 + 2 + 1 + + + Interaction Pattern + Operation Identifier + Operation Number + Capability Set + + + REQUEST + HYPERLINK \l "OPERATION_2_login" login + 1 + 1 + + + SUBMIT + HYPERLINK \l "OPERATION_2_logout" logout + 2 + + + + REQUEST + HYPERLINK \l "OPERATION_2_listRoles" listRoles + 3 + 2 + + + REQUEST + HYPERLINK \l "OPERATION_2_handover" handover + 4 + 3 + + + + Service-level Requirements + + The login service shall provide the capability: + log in; + log out; + report the list of possible roles for a login profile; + hand over an existing login from one user to another. + + COM usage + + Instances of a user login shall be represented as LoginInstance COM object. + Instances of a user role shall be represented as LoginRole COM object. + LoginInstance objects shall be created by the login and handover operations. + The object instance identifier for a LoginInstance object shall be populated by the provider of the Login service. + The LoginInstance object shall use the related link to indicate which LoginRole (if any) the login uses. + If a LoginInstance object was created during a login operation then the source link shall be set to NULL. + If a LoginInstance object was created during a handover operation it shall use the source link to indicate which LoginInstance the login was handed over from. + + Table + + STYLEREF "Heading 1"\l \n \t \* MERGEFORMAT 1 SEQ Table \s 1 1tc \f T " + 1 + - SEQ Table_TOC \s 1 1 + Login Service Object Types + " + : Login Service Object Types + + + + + + + + + + + + + + + + + + + + + + Object Number + Object Name + Object Body Type + Related link + Source link + + + 1 + LoginRole + Identifier + Set to NULL + Set to NULL + + + 2 + LoginInstance + HYPERLINK \l "DATATYPE_Profile" Profile + 1 + 2 + + + + COM Event Service usage + + When a user logs in a LoginEvent COM event shall be generated. + When a user logs out a LogoutEvent COM event shall be generated. + When the handover operation is successful a LogoutEvent COM event shall be generated for the previous login and a LoginEvent COM event shall be generated for the new login. + The LoginEvent event shall use the related link to indicate which LoginInstance object is being logged in. + The LogoutEvent event shall use the related link to indicate which LoginInstance object is being logged out. + The LoginEvent event shall not use the COM object source link and shall set it to NULL. + The LogoutEvent event shall use the source link to indicate which LoginEvent event it is logging out. + The events shall be published using the COM event service. + + Table + + STYLEREF "Heading 1"\l \n \t \* MERGEFORMAT 1 SEQ Table \s 1 1tc \f T " + 1 + - SEQ Table_TOC \s 1 1 + Login Service Events + " + : Login Service Events + + + + + + + + + + + + + + + + + + + + + + Object Number + Event Name + Object Body Type + Related link + Source link + + + 3 + LoginEvent + No body + 2 + Set to NULL + + + 4 + LogoutEvent + No body + 2 + 3 + + + + COM Object Relationships + + The Figure below shows the COM object and event relationships for this service: + + Figure + + STYLEREF "Heading 1"\l \n \t \* MERGEFORMAT 1 SEQ Figure \s 1 1tc \f T " + 1 + - SEQ Figure_TOC \s 1 1 + Login Service COM object and event relationships + " + : Login Service COM object and event relationships + + + COM Archive Service usage + + LoginInstance objects should be stored in the COM archive. + When a login service event is published, the event object should be stored in the COM archive by the Login service provider. + LoginRole objects should be stored in the COM archive. + The COM archive service should be used for maintaining the LoginRole objects. + + + Operation: login + + + Overview + + The login operation allows a user to log in to the system. A user can log in more than once by using a different role; however, a specific deployment may place limits on the number of users that may use a specific role, and in that case will fail the login operation with the TOO_MANY error. + + + + + + + + + + + + + + + + + + + + Operation Identifier + login + + + Interaction Pattern + REQUEST + + + Pattern Sequence + Message + Nullable + Type Signature + + + IN + REQUEST + YesYes + HYPERLINK \l "DATATYPE_Profile" Profile userDetailsString password + + + OUT + RESPONSE + YesYes + Blob authIdLong objInstId + + + + Type Signature Details + + userDetails - The authenticationId field of the REQUEST message must be NULL otherwise an INVALID error shall be returned. +The authenticationId field shall be checked before applying all other tests here. +The userDetails field shall contain the details of the new user and role combination. +If the username field of the supplied Profile structure is either the wildcard '*' or empty an INVALID error shall be returned. +If roles are required by the system and the role field of the supplied Profile structure is NULL then an INVALID error shall be returned. +If roles are not used by the system the role field of the supplied Profile structure shall be ignored and may be set to NULL. +An UNKNOWN error shall be returned if the username, password and role combination are not correct for the system i.e. unknown user/role or incorrect password. +A DUPLICATE error shall be returned if the username and role combination is currently in use. +A TOO_MANY error shall be returned if the username or role are already used and exceed (deployment dependent) maximum number of concurrent logins/roles. +If the login is successful the provider shall create a new LoginInstance COM object and store it in the COM archive. +The related link of the new LoginInstance COM object shall be set to the requested LoginRole COM object. +A LoginEvent COM event shall be generated at this point. + password - + authId - The returned authId field shall be used as the authenticationId field in future MAL messages by the consumer MAL for authentication. The token is specific to the user and role in use. + objInstId - The returned objInstId field shall contain the LoginInstance COM object instance identifier that was created by the login operation. + + Requirements + + + MO Errors + + The operation may return one of the following errors: + DUPLICATE: Username/role combination currently in use. + INVALID: Submitted profile contains invalid values. No further information is provided as it may compromise security. + TOO_MANY: Role concurrent session limit count exceeded. + UNKNOWN: Unknown username/role/password combination. + + + + + + + + + + + + + + + + + + + + Error + Error # + ExtraInfo Type + ExtraInfo description + + + DUPLICATE + Defined in COM + Not Used + - + + + INVALID + Defined in COM + Not Used + - + + + TOO_MANY + Defined in MAL + Not Used + - + + + UNKNOWN + Defined in MAL + Not Used + - + + + + + Operation: logout + + + Overview + + The logout operation allows a user to log out from the system. No information is passed in the message as the MAL authentication Id is enough to identify the login. + + + + + + + + + + + + + + + + + + + + Operation Identifier + logout + + + Interaction Pattern + SUBMIT + + + Pattern Sequence + Message + Nullable + Type Signature + + + IN + SUBMIT + - + - + + + + Type Signature Details + + + Requirements + + + MO Errors + + The operation does not return any errors. + + + Operation: listRoles + + + Overview + + The listRoles operation returns the list of available roles for a specific user. This operation is expected to be called before a user logs in so that the software can provide a list of possible roles. + It should be noted that this operation requires both a username and password field before returning any information, this is to ensure that it does not provide a security attack vector by allowing the discovery of valid usernames without first knowing the correct password. + + + + + + + + + + + + + + + + + + + + Operation Identifier + listRoles + + + Interaction Pattern + REQUEST + + + Pattern Sequence + Message + Nullable + Type Signature + + + IN + REQUEST + YesYes + Identifier usernameString password + + + OUT + RESPONSE + Yes + List<Long> permittedRoles + + + + Type Signature Details + + username - The username field shall hold the details of the user. +If the username field is either the wildcard '*', NULL or empty an INVALID error shall be returned. + password - An UNKNOWN error shall be returned if the username and password combination are not correct for the system i.e. unknown user or incorrect password. + permittedRoles - The operation shall return a list of LoginRole object instance identifiers that are permitted for the user or NULL if roles are not used by the system. + + Requirements + + + MO Errors + + The operation may return one of the following errors: + UNKNOWN: Unknown username/password combination. + INVALID: Submitted profile contains invalid values. + + + + + + + + + + + + + + + + + + + + Error + Error # + ExtraInfo Type + ExtraInfo description + + + UNKNOWN + Defined in MAL + Not Used + - + + + INVALID + Defined in COM + Not Used + - + + + + + Operation: handover + + + Overview + + The handover operation allows an existing login to be transferred to a new user. Two cases are expected here, the first is where the operation is used to change the user's current role, and the second is where an operations context is handed over to another user. + + + + + + + + + + + + + + + + + + + + Operation Identifier + handover + + + Interaction Pattern + REQUEST + + + Pattern Sequence + Message + Nullable + Type Signature + + + IN + REQUEST + YesYes + HYPERLINK \l "DATATYPE_Profile" Profile newUserDetailsString newUserPassword + + + OUT + RESPONSE + YesYes + Blob newAuthIdLong newLoginInstId + + + + Type Signature Details + + newUserDetails - The newUserDetails field shall contain the details of the new user and role combination. +If the username field of the supplied Profile structure is either NULL, the wildcard '*', or empty an INVALID error shall be returned. +If roles are required by the system and the role field of the supplied Profile structure is NULL then an INVALID error shall be returned. +The role field of the supplied Profile structure may be NULL if roles are not used by the system. +An UNKNOWN error shall be returned if the username, password and role combination are not correct for the system i.e. unknown user/role or incorrect password. +A DUPLICATE error shall be returned if the username and role combination is currently in use. +A TOO_MANY error shall be returned if the username or role are already used and exceed the permitted maximum usage value (deployment dependent). +The DUPLICATE and TOO_MANY checks shall take into account the fact that current operator/role combination will be logged out after the handover operation completes. +If the handover is successful the provider shall create a new LoginInstance COM object and store it in the COM archive. +The related link of the new LoginInstance COM object shall be set to the requested LoginRole COM object. +If an error is raised then the handover operation shall fail and the original login remain active. +The source link of the new LoginInstance COM object shall be set to the LoginInstance COM object that represents the previous login. +If the handover operation is successful a LogoutEvent COM event shall be generated for the previous login and a LoginEvent COM event shall be generated for the new login. + newUserPassword - + newAuthId - The returned newAuthId field shall be used as the authenticationId field in future MAL messages by the consumer MAL for authentication. The token is specific to the new user and role in use. + newLoginInstId - The returned newLoginInstId field shall contain the new LoginInstance COM object instance identifier that was created by the operation. + + Requirements + + + MO Errors + + The operation may return one of the following errors: + UNKNOWN: Unknown username/role/password combination. + INVALID: Submitted profile contains invalid values. + TOO_MANY: Role concurrent session limit count exceeded. + DUPLICATE: Username/role combination currently in use. + + + + + + + + + + + + + + + + + + + + Error + Error # + ExtraInfo Type + ExtraInfo description + + + UNKNOWN + Defined in MAL + Not Used + - + + + INVALID + Defined in COM + Not Used + - + + + TOO_MANY + Defined in MAL + Not Used + - + + + DUPLICATE + Defined in COM + Not Used + - + + + + + Service: Configuration + + + Overview + + The Configuration service allows a service consumer to activate pre-defined configurations of a service provider. + The service uses a COM object to represent the different configurations allowed by a service provider; a service consumer selects one configuration to activate using the Configuration service activate operation. + The contents of a configuration for a service provider is deployment specific however the management of these configurations, and the selection of a configuration for current use, is the purpose of this service. + Implementations of this service may also use bespoke methods for configuration representation (such as hard-coded configuration) which is outside the scope of this specification, however, the status and management of these configurations can still be managed with this service. + NOTE: This service uses the COM Event service to distribute changes in state, therefore participating service providers should ensure they are all using the same shared COM Event service if they wish to receive Configuration service events. + + Table + + STYLEREF "Heading 1"\l \n \t \* MERGEFORMAT 1 SEQ Table \s 1 1tc \f T " + 1 + - SEQ Table_TOC \s 1 1 + Configuration Service Operations + " + : Configuration Service Operations + + + + + + + + + + + + + + + + + + + + + + Area Identifier + Service Identifier + Area Number + Service Number + Area Version + + + Common + Configuration + 3 + 5 + 1 + + + Interaction Pattern + Operation Identifier + Operation Number + Capability Set + + + INVOKE + HYPERLINK \l "OPERATION_5_activate" activate + 1 + 1 + + + REQUEST + HYPERLINK \l "OPERATION_5_list" list + 2 + 2 + + + REQUEST + HYPERLINK \l "OPERATION_5_getCurrent" getCurrent + 3 + + + + REQUEST + HYPERLINK \l "OPERATION_5_exportXML" exportXML + 4 + 3 + + + SUBMIT + HYPERLINK \l "OPERATION_5_add" add + 5 + 4 + + + SUBMIT + HYPERLINK \l "OPERATION_5_remove" remove + 6 + + + + INVOKE + HYPERLINK \l "OPERATION_5_storeCurrent" storeCurrent + 7 + 5 + + + REQUEST + HYPERLINK \l "OPERATION_5_importXML" importXML + 8 + 6 + + + + Service-level Requirements + + The configuration service shall provide the capability: + activate a configuration; + list available configurations; + manage the available configurations; + get and store the current configuration; + import/export configurations from/to XML. + + COM usage + + A ProviderConfiguration COM object represents a single set of configuration details that may be used by multiple service providers. The object body shall hold an indentifier to identify the provider configuration. + The ProviderConfiguration COM object related link shall link to the ConfigurationObjects COM object that contains the objects that form the provider configuration. + If the ProviderConfiguration represents a Hard-coded configuration for a provider then the related link shall be set to NULL. + The ProviderConfiguration COM object source link should be the object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used. + A ServiceConfiguration COM object represents a single configuration of a service in a provider, multiple ProviderConfiguration COM objects may reference the same service configuration via its linked ConfigurationObjects COM object. The object body shall hold the service key that identifies the service it is a configuration of. + The ServiceConfiguration COM object related link shall link to the ConfigurationObjects COM object that contains the objects that form the service configuration. + If the ServiceConfiguration represents a Hard-coded configuration for a single service then the related link shall be set to NULL. + The ServiceConfiguration COM object source link should be the object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used. + A ConfigurationObjects COM object represents a set of links to a set of COM objects that form an actual configuration. The object body shall hold a configuration object details structure that links to the objects that form the configuration. + The ConfigurationObjects COM object related link shall be set to NULL. + The ConfigurationObjects COM object source link should be the object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used. + A ConfigurationFile COM object provides a mechanism for holding files that contain non-COM configuration information so that it can still be managed and referenced by the configuration service. The object body shall hold the configuration file. + The ConfigurationFile COM object related link shall be set to NULL. + The ConfigurationFile COM object source link should be the object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used. + A non-COM configuration shall be represented by linking from a ConfigurationObjects COM object to one or more ConfigurationFile COM objects. + A ProviderConfigurationLink COM object represents the use of a provider configuration by a specific service provider. The object body is not used and shall be NULL. + The ProviderConfigurationLink COM object related link shall link to the ServiceProvider COM object that represents the service provider in the Directory Service. + The ProviderConfigurationLink COM object source link shall link to the ProviderConfiguration COM object in use by the provider. + + Table + + STYLEREF "Heading 1"\l \n \t \* MERGEFORMAT 1 SEQ Table \s 1 1tc \f T " + 1 + - SEQ Table_TOC \s 1 1 + Configuration Service Object Types + " + : Configuration Service Object Types + + + + + + + + + + + + + + + + + + + + + + Object Number + Object Name + Object Body Type + Related link + Source link + + + 1 + ServiceConfiguration + HYPERLINK \l "DATATYPE_ServiceConfigurationIdentifier" ServiceConfigurationIdentifier + 3 + The object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used. + + + 2 + ProviderConfiguration + Identifier + 3 + The object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used. + + + 3 + ConfigurationObjects + HYPERLINK \l "DATATYPE_ConfigurationObjectDetails" ConfigurationObjectDetails + Set to NULL + The object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used. + + + 4 + ConfigurationFile + File + Set to NULL + The object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used. + + + 5 + ProviderConfigurationLink + No body + Directory::1 + 2 + + + + COM Event Service usage + + A ConfigurationSwitch COM event shall represent a request change in active configuration. + The ConfigurationSwitch COM event body shall hold the configuration to be activated. + The ConfigurationSwitch COM event related link shall point to the COM ServiceProvider object that is required to attempt the configuration switch. + The ConfigurationSwitch COM event source link shall indicate the activate COM OperationActivity object that caused it to be created. + A ConfigurationSwitched COM event shall be raised when a configuration is made active. + The ConfigurationSwitched COM event body shall hold the result of the activation attempt. + If the activation was successful then the body of the ConfigurationSwitched event shall be set to TRUE, otherwise FALSE for failure. + The ConfigurationSwitched COM event related link shall point to the ConfigurationSwitch event that triggered the switch attempt. + The ConfigurationSwitched COM event source link shall point to the previous active configuration or be NULL if no configuration was previously active. + A ConfigurationStore COM event shall represent a request to store the current configuration. + The ConfigurationStore COM event body is may contain the ServiceKey of the service to store, it shall be NULL if the provider configuration is to be stored. + The ConfigurationStore COM event related link shall link to the ServiceProvider object that represents the provider that must store its configuration. + The ConfigurationStore COM event source link shall indicate the storeCurrent COM OperationActivity object that caused it to be created. + A ConfigurationStored COM event shall be raised when a configuration has been stored. + The ConfigurationStored COM event body shall hold the ObjectId of the new Configuration object if the store was successful, otherwise NULL for failure. + The ConfigurationStored COM event related link shall point to the ConfigurationStore event that triggered the store attempt. + The ConfigurationStored COM event source link shall be NULL. + + Table + + STYLEREF "Heading 1"\l \n \t \* MERGEFORMAT 1 SEQ Table \s 1 1tc \f T " + 1 + - SEQ Table_TOC \s 1 1 + Configuration Service Events + " + : Configuration Service Events + + + + + + + + + + + + + + + + + + + + + + Object Number + Event Name + Object Body Type + Related link + Source link + + + 6 + ConfigurationSwitch + COM::ObjectId + Directory::1 + The source link of the event is the object that triggered the activation, most likely the activate operation. + + + 7 + ConfigurationSwitched + Boolean + 6 + The previous active configuration or be NULL if no configuration was previously active. + + + 8 + ConfigurationStore + HYPERLINK \l "DATATYPE_ServiceKey" ServiceKey + Directory::1 + The source link of the event is the object that triggered the activation, most likely the storeCurrent operation. + + + 9 + ConfigurationStored + COM::ObjectId + 8 + Set to NULL + + + + COM Object Relationships + + The Figure below shows the COM object and event relationships for this service: + + Figure + + STYLEREF "Heading 1"\l \n \t \* MERGEFORMAT 1 SEQ Figure \s 1 1tc \f T " + 1 + - SEQ Figure_TOC \s 1 1 + Configuration Service COM object and event relationships + " + : Configuration Service COM object and event relationships + + + COM Archive Service usage + + Configuration definition objects (ServiceConfiguration, ProviderConfiguration, ProviderConfigurationLink, ConfigurationObjects, ConfigurationFile) must be stored in the COM archive by the provider of the Configuration service if the implementation of the Configuration service uses a COM archive. + The COM objects that hold the actual configuration definition details must be stored in the COM archive by the provider of the relevant service if the implementation of the Configuration service uses a COM archive. + When a configuration event (ConfigurationSwitch, ConfigurationSwitched, ConfigurationStore, ConfigurationStored) is published, the event objects should be stored in the COM archive. + + + Operation: activate + + + Overview + + The activate operation instructs a service provider to make a specific configuration active. The operation returns once the new configuration is active or when the activation attempt has failed for some reason. + The requested configuration must have either already been added to the configuration service provider using the add operation or alternatively known to the configuration service by another implementation specific mechanism. + NOTE - The service is reconfigured for all service consumers not just the calling consumer. + + + + + + + + + + + + + + + + + + + + Operation Identifier + activate + + + Interaction Pattern + INVOKE + + + Pattern Sequence + Message + Nullable + Type Signature + + + IN + INVOKE + YesYes + COM::ObjectKey serviceProviderCOM::ObjectId configObjId + + + OUT + ACK + - + - + + + OUT + RESPONSE + YesYes + Boolean activationResultList<COM::ObjectId> previousConfig + + + + Type Signature Details + + serviceProvider - The serviceProvider field shall contain the domain and object instance identifier of the ServiceProvider COM object being (re)configured. +If the service provider referenced by the serviceProvider field is not known an UNKNOWN error shall be returned. + configObjId - The configObjId field shall hold the COM object identifier that identifies the configuration to activate. +The configObjId field shall reference either a ProviderConfiguration or ServiceConfiguration object. +An UNKNOWN error shall be returned if the object instance identifier held in the configObjId field does not match an existing configuration. +An INVALID error shall be returned if the object instance identifier held in the configObjId field does not reference either a ProviderConfiguration or ServiceConfiguration object. +If the object instance identifier held in the configObjId field does not reference a valid configuration for the service provider an INVALID error shall be returned. A valid configuration is one that is returned from the list operation for the matched service provider. + activationResult - The service provider that implements the selected service shall, after the reception of the ConfigurationSwitch event, reconfigure itself and publish a ConfigurationSwitched COM event. +If the operation fails the previous configuration shall remain active. +In the case of a provider configuration, where multiple service configurations are being switched, the provider must switch all configurations successfully or roll back to the previous configuration. No partial reconfiguration is supported. +If a provider level configuration is successful, and a COM archive is being used, then the service provider that implements the selected service shall store in the COM archive a new ProviderConfigurationLink COM object that links its ServiceProvider object to the new activated ProviderConfiguration COM object. +The response message shall be sent when the configuration is either made active or fails. +If the activation was successful then the activationResult field shall be set to TRUE, otherwise FALSE for failure. + previousConfig - The previousConfig field shall point to the previously active configuration or NULL if no configuration was previously active or the activationResult was FALSE for failure. +If a service configuration was requested, configObjId field shall referenced a ServiceConfiguration, the response shall contain a list of a single item of the previous ServiceConfiguration COM object. +If a provider configuration was requested, configObjId field shall referenced a ProviderConfiguration, the response shall contain a list of the previous ProviderConfiguration COM object followed by the list of previous ServiceConfiguration objects active for that provider. + + Requirements + + + MO Errors + + The operation may return one of the following errors: + UNKNOWN: Requested configuration is unknown. + INVALID: Requested configuration is invalid. + + + + + + + + + + + + + + + + + + + + Error + Error # + ExtraInfo Type + ExtraInfo description + + + UNKNOWN + Defined in MAL + Not Used + - + + + INVALID + Defined in COM + Not Used + - + + + + + Operation: list + + + Overview + + The list operation returns list of configurations known to the configuration service provider for a certain configuration type in a specific domain. + To appear in the response from the list operation a configuration must have either been added to the configuration service provider using the add operation or alternatively known to the configuration service by another implementation specific mechanism. + + + + + + + + + + + + + + + + + + + + Operation Identifier + list + + + Interaction Pattern + REQUEST + + + Pattern Sequence + Message + Nullable + Type Signature + + + IN + REQUEST + YesYesYes + HYPERLINK \l "DATATYPE_ConfigurationType" ConfigurationType configurationTypeList<Identifier> domain HYPERLINK \l "DATATYPE_ServiceKey" ServiceKey serviceKey + + + OUT + RESPONSE + Yes + List<COM::ObjectId> objInstIds + + + + Type Signature Details + + configurationType - The configurationType argument shall hold the type of configuration to be listed. + domain - The domain request argument shall contain the domain of the configuration objects to return. +The domain field supports the wildcard value of '*' only in the last part of the domain, otherwise an INVALID error shall be returned. See section 3.5.6.5.g in R[2]. + serviceKey - If the request configuration type is SERVICE, then an optional filter may be supplied in the serviceKey field where the ServiceKey composite holds the service area, service, and version values to match on. +The filter shall be applied with a logical AND for each field of the service key. +Wildcard values of '0' are not accepted in the serviceKey fields, an INVALID error shall be returned in this case. +For other types of configuration the serviceKey field shall be ignored and may be set to NULL in the request. + objInstIds - The operation shall return the list of matched configuration objects known to the configuration service provider. +If no configurations matched then an empty list shall be returned. + + Requirements + + + MO Errors + + The operation may return the following error: + INVALID: Requested configuration is not a valid configuration object type or wildcard values were specified in the service key filter. + + + + + + + + + + + + + + + + + + + + Error + Error # + ExtraInfo Type + ExtraInfo description + + + INVALID + Defined in COM + Not Used + - + + + + + Operation: getCurrent + + + Overview + + The getCurrent operation returns the currently selected configuration of a service provider, either of the complete provider (ProviderConfiguration) or a specific service (ServiceConfiguration) of that provider, as far as the Configuration Service provider is concerned. + This means that if the provider of a specific service has modified their configuration by some other means, and this has not been stored using the storeCurrent operation, then this operation will return the unmodified configuration. + If a provider level configuration is required by this operation, and service configurations different to the ones in the provider configuration have been activated by the activate operation, then this operation will return the ProviderConfiguration followed by the list of modified ServiceConfigurations. + The current configuration of a service provider is most likely the configuration that was last activated using the activate operation, however implementations of the configuration service may have other means (outside the scope of this service) of selecting the current configuration of a service provider. + The operation can also be used to determine the initial configuration of a service provider before it has been activated, it is therefore a useful operation to call by a service provider during start-up to determine its initial configuration. If this is the case a ConfigurationSwitched event should be published. + + + + + + + + + + + + + + + + + + + + Operation Identifier + getCurrent + + + Interaction Pattern + REQUEST + + + Pattern Sequence + Message + Nullable + Type Signature + + + IN + REQUEST + YesYes + COM::ObjectKey serviceProvider HYPERLINK \l "DATATYPE_ServiceKey" ServiceKey serviceKey + + + OUT + RESPONSE + Yes + List<COM::ObjectId> objInstId + + + + Type Signature Details + + serviceProvider - The serviceProvider field shall contain the domain and object instance identifier of the ServiceProvider COM object being queried. + serviceKey - If the serviceKey field is not NULL, then the operation shall return the configuration of the selected service, as specified in the field. +For retrieval of the provider level configuration the serviceKey field shall be set to NULL in the request. +An UNKNOWN error shall be returned if the combination of service provider and service filter fields don't match an existing service provider, service key or configuration. +No wildcards are supported, an INVALID error must be returned in this case. + objInstId - If a service configuration was requested, serviceKey was not NULL, the response shall contain a list of a single item of the matched ServiceConfiguration COM object. +If a provider configuration was requested, serviceKey was NULL, the response shall contain a list of the matched ProviderConfiguration COM object followed by the list of active ServiceConfiguration objects active for that provider. + + Requirements + + + MO Errors + + The operation may return one of the following errors: + INVALID: The request contained one or more wildcards. + UNKNOWN: Requested service provider and service key combination is unknown. + + + + + + + + + + + + + + + + + + + + Error + Error # + ExtraInfo Type + ExtraInfo description + + + INVALID + Defined in COM + Not Used + - + + + UNKNOWN + Defined in MAL + Not Used + - + + + + + Operation: exportXML + + + Overview + + The exportXML operation returns the actual Configuration information in the XML format from the configuration object stored in the Archive. + The returned XML is in the standardised format and one of two levels of detail, compact or complete, can be selected. Compact contains just the COM object instance identifiers with the respective domains and object types whereas complete augments the compact with the additional set of values inside the respective service objects. + The XML standardised format is the XML representation of the referenced COM objects as defined by the XML encoding given in R[4]. Example XML documents can be found in an annex at the end of this specification. + If the implementation of the configuration service is not using a COM archive then an error is returned. + It should be noted that this operation only supports COM configurations. + + + + + + + + + + + + + + + + + + + + Operation Identifier + exportXML + + + Interaction Pattern + REQUEST + + + Pattern Sequence + Message + Nullable + Type Signature + + + IN + REQUEST + YesYes + COM::ObjectId confObjIdBoolean returnComplete + + + OUT + RESPONSE + Yes + File xmlConfiguration + + + + Type Signature Details + + confObjId - If the implementation of the configuration service is not using a COM archive then an UNSUPPORTED_OPERATION error shall be returned. +The confObjId argument shall contain the type, domain and COM object instance identifier of the configuration object to return the XML representation of. +An UNKNOWN error shall be returned if the confObjId field does not match an existing COM object. +An INVALID error shall be returned if the confObjId does not refer to either a ProviderConfiguration or a ServiceConfiguration object. +An INVALID error shall be returned if the confObjId refers to either a hard-coded or a non-COM configuration. + returnComplete - The returnComplete Boolean shall be set to True if the returned XML is to be in the complete standardised format, otherwise it will be in the compact standardised format. + xmlConfiguration - The returned File object shall contain the configuration XML. +The Configuration object shall not be deleted from the COM Archive. + + Requirements + + + MO Errors + + The operation may return one of the following errors: + INVALID: Requested configuration is not a valid configuration object type. + UNKNOWN: Requested object is unknown. + UNSUPPORTED_OPERATION: The operation requires the use of a COM archive + + + + + + + + + + + + + + + + + + + + Error + Error # + ExtraInfo Type + ExtraInfo description + + + INVALID + Defined in COM + Not Used + - + + + UNKNOWN + Defined in MAL + Not Used + - + + + UNSUPPORTED_OPERATION + Defined in MAL + Not Used + - + + + + + Operation: add + + + Overview + + The add operation makes a new Configuration available on the Configuration Service. The Configuration must already exist in the COM archive to be added to the Configuration Service. + If the implementation of the configuration service is not using a COM archive then an error is returned. + This operation can be used to add COM, non-COM and hard-coded configurations. + + + + + + + + + + + + + + + + + + + + Operation Identifier + add + + + Interaction Pattern + SUBMIT + + + Pattern Sequence + Message + Nullable + Type Signature + + + IN + SUBMIT + YesYes + COM::ObjectKey serviceProviderList<COM::ObjectId> configObjIds + + + + Type Signature Details + + serviceProvider - If the implementation of the configuration service is not using a COM archive then an UNSUPPORTED_OPERATION error shall be returned. +The first argument shall contain the domain and object identifier of the ServiceProvider COM object which the configurations are being added to. + configObjIds - The second argument shall contain a list of service and/or provider configurations to add to the list of configurations available for the specific service provider. +If either the service provider or the configuration objects are unknown then an UNKNOWN error shall be returned. +If any of the supplied configuration objects are not provider or service configuration objects then an INVALID error shall be returned. +If an error is raised then no new configurations shall be added as a result of this operation call. + + Requirements + + + MO Errors + + The operation may return one of the following errors: + INVALID: One of the supplied configuration object instance identifiers is either not a Service or a Provider configuration object. + UNSUPPORTED_OPERATION: The operation requires the use of a COM archive + UNKNOWN: One of the supplied service or configuration object instance identifiers is unknown. + + + + + + + + + + + + + + + + + + + + Error + Error # + ExtraInfo Type + ExtraInfo description + + + INVALID + Defined in COM + List<UInteger> + The extra information field contains a list of the indexes of the erroneous values from the originating list supplied. + + + UNSUPPORTED_OPERATION + Defined in MAL + Not Used + - + + + UNKNOWN + Defined in MAL + List<UInteger> + A list of the indexes of the error values shall be contained in the extra information field. + + + + + Operation: remove + + + Overview + + The remove operation, removes a provider configuration from the list of configurations available for that provider in the configuration service. The operation does not remove the configuration objects from the COM archive, merely removes the objects from the configuration service provider. + If the implementation of the configuration service is not using a COM archive then an error is returned. + This operation can be used to remove COM, non-COM, and hard-coded configurations from a provider. + + + + + + + + + + + + + + + + + + + + Operation Identifier + remove + + + Interaction Pattern + SUBMIT + + + Pattern Sequence + Message + Nullable + Type Signature + + + IN + SUBMIT + YesYes + COM::ObjectKey serviceProviderList<COM::ObjectId> configObjIds + + + + Type Signature Details + + serviceProvider - If the implementation of the configuration service is not using a COM archive then an UNSUPPORTED_OPERATION error shall be returned. +The first argument shall contain the domain and object identifier of the ServiceProvider COM object which the configurations are being removed from. + configObjIds - The second argument shall contain a list of service and/or provider configurations to remove from the list of configurations available for the specific service provider. +If either the service provider or a provided object identifier does not match an existing configuration object then this operation shall fail with an UNKNOWN error. +If any of the supplied configuration objects are not provider or service configuration objects then an INVALID error shall be returned. +If an error is raised then no configurations shall be removed as a result of this operation call. +Matched configuration objects shall not be removed from the COM archive only the list of configuration objects in the provider. + + Requirements + + + MO Errors + + The operation may return one of the following errors: + UNKNOWN: Either the service provider or one of the supplied configuration object instance identifiers is unknown. + INVALID: One of the supplied configuration object instance identifiers is either not a Service or a Provider configuration object. + UNSUPPORTED_OPERATION: The operation requires the use of a COM archive + + + + + + + + + + + + + + + + + + + + Error + Error # + ExtraInfo Type + ExtraInfo description + + + UNKNOWN + Defined in MAL + List<UInteger> + A list of the indexes of the error values shall be contained in the extra information field. + + + INVALID + Defined in COM + List<UInteger> + The extra information field contains a list of the indexes of the erroneous values from the originating list supplied. + + + UNSUPPORTED_OPERATION + Defined in MAL + Not Used + - + + + + + Operation: storeCurrent + + + Overview + + The storeCurrent operation requests the creation of a new Configuration object containing the current Configuration of a specific Service or Provider configuration and stores the new Configuration object in the COM archive. Optionally the configuration can be added to the list of available configurations. + The actual service provider is responsible for the creation of the new Configuration objects in the COM archive as it is the provider that contains the configuration being stored. + This operation's expected use is for storing a configuration that has been modified "on line" in the service provider. For instance, a need to modify the thresholds of the parameter checks on ground can arise during operations. Before being "officialised", the new thresholds are usually implemented locally and tested. If the modifications are deemed correct then the configuration may be stored in the archive and becomes a new official configuration of the relevant service. This configuration can then be used by other providers of the same service via the add and activate operations. + If the implementation of the configuration service is not using a COM archive then an error is returned. + This operation can be used to request the store of both COM and non-COM configurations. It does not make sense to support hard-coded configurations as by definition they are fixed in nature. + + + + + + + + + + + + + + + + + + + + Operation Identifier + storeCurrent + + + Interaction Pattern + INVOKE + + + Pattern Sequence + Message + Nullable + Type Signature + + + IN + INVOKE + YesYesYes + COM::ObjectKey serviceProvider HYPERLINK \l "DATATYPE_ServiceKey" ServiceKey serviceKeyBoolean autoAdd + + + OUT + ACK + - + - + + + OUT + RESPONSE + Yes + COM::ObjectId objInstId + + + + Type Signature Details + + serviceProvider - If the implementation of the configuration service is not using a COM archive then an UNSUPPORTED_OPERATION error shall be returned. +The serviceProvider field shall contain the domain and object instance identifier of the ServiceProvider COM object that must store its current configuration. +If the service provider is not known an UNKNOWN error shall be returned. + serviceKey - If the serviceKey field is not NULL then only the specified service of the provider shall be stored. +Wildcard values of '0' are not accepted in the serviceKey fields, an INVALID error shall be returned in this case. +If the serviceKey field is not NULL and the referenced service is not supported by the service provider an UNKNOWN error shall be returned. +The operation shall publish a ConfigurationStore event containing the selected configuration to be stored. +The service provider that implements the selected service shall, after the reception of the event, store its current Configuration in the COM Archive. +Once the relevant service provider has finished storing its configuration it shall publish a ConfigurationStored event with the stored configuration's ObjectId as its body. +If the request is for a hard-coded configuration then the relevant service provider must fail the store request by returning a NULL as a response. + autoAdd - If the autoAdd field is set to TRUE then, once the stored event has been published, and if it indicates success, the configuration service provider shall add the new configuration to the list of available configurations for the selected service provider. In effect call the add operation. + objInstId - The response shall contain the object identifier of the new configuration object if successful or NULL if not. + + Requirements + + + MO Errors + + The operation may return one of the following errors: + INVALID: Not a valid Service or Provider object + UNSUPPORTED_OPERATION: The operation requires the use of a COM archive + UNKNOWN: The service provider referenced is not known or the referenced service is not known by the provider. + + + + + + + + + + + + + + + + + + + + Error + Error # + ExtraInfo Type + ExtraInfo description + + + INVALID + Defined in COM + Not Used + - + + + UNSUPPORTED_OPERATION + Defined in MAL + Not Used + - + + + UNKNOWN + Defined in MAL + Not Used + - + + + + + Operation: importXML + + + Overview + + The importXML generates a new Configuration object from a XML File and stores the Configuration in the COM archive. Afterwards, the configuration can be added to the list of available configurations using the add operation. + The operation is only for importing XML configurations that use the standardised format defined by the Configuration service. + If the implementation of the configuration service is not using a COM archive then an error is returned. + The importXML can only be used to import COM based configurations. + + + + + + + + + + + + + + + + + + + + Operation Identifier + importXML + + + Interaction Pattern + REQUEST + + + Pattern Sequence + Message + Nullable + Type Signature + + + IN + REQUEST + Yes + File xmlFile + + + OUT + RESPONSE + Yes + COM::ObjectId objInstId + + + + Type Signature Details + + xmlFile - If the implementation of the configuration service is not using a COM archive then an UNSUPPORTED_OPERATION error shall be returned. +The supplied file contained in the xmlFile argument shall be read and converted to COM objects. +If there is a problem converting the XML then an INVALID error shall be returned. +For every object present within the XML file that does not exist in the COM Archive, the Configuration service shall create a new object with the same content and store the object in the COM Archive. +If the object already exists in the COM Archive, nothing shall be created. +If the object already exists in the COM Archive but contains a different content a DUPLICATE error shall be raised. +The newly generated Configuration object shall always reference existing objects in the Archive. +The newly generated Configuration object should be checked for consistency. An INVALID error shall be raised if the configuration is not valid. +If an error is raised then no objects shall be stored in the COM archive and operation shall end. + objInstId - The return response shall contain in the objInstId field the object identifier of the new configuration object. + + Requirements + + + MO Errors + + The operation may return one of the following errors: + UNSUPPORTED_OPERATION: The operation requires the use of a COM archive + DUPLICATE: The supplied XML contains a duplicate object definition that is different to the one held in the COM Archive. + INVALID: The supplied XML was not valid. + + + + + + + + + + + + + + + + + + + + Error + Error # + ExtraInfo Type + ExtraInfo description + + + UNSUPPORTED_OPERATION + Defined in MAL + Not Used + - + + + DUPLICATE + Defined in COM + Not Used + - + + + INVALID + Defined in COM + Not Used + - + + + + Data types + + + Area data types: Common + + + + Composite: ServiceKey + + + + + + + + + + + + + + + + + + + + + Name + ServiceKey + + + Extends + Composite + + + Short Form Part + 1 + + + Field + Type + Nullable + Comment + + + keyArea + UShort + No + The area of this service taken from the numeric Area identifier of the service specification. + + + keyService + UShort + No + The service taken from the numeric Service identifier of the service specification. + + + keyAreaVersion + UOctet + No + The version of this service taken from the Area Version of the area specification. + + + + Service data types: Directory + + + + Composite: ProviderDetails + + The ProviderDetails structure holds information about a provider of a service and its capabilities. The structure contains a list of AddressDetails structures which should be used when the individual services listed by the provider do not supply address information. A provider may support more than one transport technology and therefore can be reached using more than one address. + + + + + + + + + + + + + + + + + + + + Name + ProviderDetails + + + Extends + Composite + + + Short Form Part + 1 + + + Field + Type + Nullable + Comment + + + serviceCapabilities + List< HYPERLINK \l "DATATYPE_ServiceCapability" ServiceCapability> + No + The service capabilities supported by this service provider + + + providerAddresses + List< HYPERLINK \l "DATATYPE_AddressDetails" AddressDetails> + No + List of addresses for all services of this service provider unless service specific addresses are supplied in the serviceCapabilities field. If all address information is supplied in the serviceCapabilities field this list should be zero length. + + + + + Composite: ServiceCapability + + The ServiceCapability structure holds information about a service and the capabilities offered by a provider. + + + + + + + + + + + + + + + + + + + + Name + ServiceCapability + + + Extends + Composite + + + Short Form Part + 2 + + + Field + Type + Nullable + Comment + + + serviceKey + HYPERLINK \l "DATATYPE_ServiceKey" ServiceKey + No + The area, service, and version fields. + + + supportedCapabilitySets + List<UShort> + Yes + The supported capability set numbers for this service provider. If NULL then all capability sets supported. + + + serviceProperties + List<NamedValue> + Yes + Allows the passing of deployment specific service properties. + + + serviceAddresses + List< HYPERLINK \l "DATATYPE_AddressDetails" AddressDetails> + Yes + Optional set of address details for this specific service which shall be used instead of the provider ones when accessing this service. If all address information is supplied in the containing ProviderDetails structure field this list should be replaced with a NULL. + + + + + Composite: AddressDetails + + The AddressDetails structure holds all information required by the Directory service about a service providers URI and attributes relating to QoS. + + + + + + + + + + + + + + + + + + + + Name + AddressDetails + + + Extends + Composite + + + Short Form Part + 4 + + + Field + Type + Nullable + Comment + + + supportedLevels + List<QoSLevel> + No + The set of possible QoS levels this service can provide. + + + QoSproperties + List<NamedValue> + No + Any QoS properties relevant to this address URIs and the specified transport. + + + priorityLevels + UInteger + No + The number of QoS priority levels that this provider supports. + + + serviceURI + URI + Yes + The Service URI that identifies the physical location of this service. NULL if represents a shared data provider (Broker). + + + brokerURI + URI + Yes + The broker URI that identifies the physical location of the publish and subscribe interface. NULL if service does not use publish and subscribe operations or if a shared broker is to be used. + + + brokerProviderObjInstId + Long + Yes + The object instance identifier of a ServiceProvider COM object that is the shared broker used by this provider. + + + + + Composite: ProviderSummary + + The ProviderSummary structure holds information about a provider of a service and its capabilities. + + + + + + + + + + + + + + + + + + + + Name + ProviderSummary + + + Extends + Composite + + + Short Form Part + 5 + + + Field + Type + Nullable + Comment + + + providerKey + COM::ObjectKey + No + The COM object key of this service provider + + + providerId + Identifier + No + The id of this service provider. + + + providerDetails + HYPERLINK \l "DATATYPE_ProviderDetails" ProviderDetails + No + The service capabilities supported by this provider + + + + + Composite: PublishDetails + + The PublishDetails structure holds all the required information to publish new service provider details. + + + + + + + + + + + + + + + + + + + + Name + PublishDetails + + + Extends + Composite + + + Short Form Part + 6 + + + Field + Type + Nullable + Comment + + + providerId + Identifier + No + The unique service provider id; allows multiple service providers of the same service type to coexist in the directory service. + + + domain + List<Identifier> + No + The domain of the provider. + + + sessionType + SessionType + No + The type of session of the provider. + + + sourceSessionName + Identifier + Yes + If this is part of a replay session, this field holds the session name of the source session. NULL otherwise + + + network + Identifier + No + The network of the provider. + + + providerDetails + HYPERLINK \l "DATATYPE_ProviderDetails" ProviderDetails + No + The new service provider details. + + + serviceXML + List<File> + Yes + The optional XML files to associate with this provider. + + + + + Composite: ServiceFilter + + The ServiceFilter structure holds all information required by the Directory service for service lookup operation. The field filters are AND'd together. + + + + + + + + + + + + + + + + + + + + Name + ServiceFilter + + + Extends + Composite + + + Short Form Part + 7 + + + Field + Type + Nullable + Comment + + + serviceProviderId + Identifier + Yes + The required service provider. Can be NULL in which case matches all values. + + + domain + List<Identifier> + Yes + The domain to query. Can be NULL in which case matches all values. + + + network + Identifier + Yes + The network to match. Can be NULL in which case matches all values. + + + sessionType + SessionType + Yes + The session type to match. Can be NULL in which case matches all values. + + + sessionName + Identifier + Yes + The session name to match. Can be NULL in which case matches all values. + + + serviceKey + HYPERLINK \l "DATATYPE_ServiceKey" ServiceKey + Yes + The service to filter on, values can be NULL which matches all values. + + + requiredCapabilitySets + List<UShort> + Yes + List of required capability sets. If NULL then matches any. + + + + Service data types: Login + + + + Composite: Profile + + The Profile structure contains details of the user who is logging on to take a specified role. + + + + + + + + + + + + + + + + + + + + Name + Profile + + + Extends + Composite + + + Short Form Part + 1 + + + Field + Type + Nullable + Comment + + + username + Identifier + No + The name of the user. + + + role + Long + Yes + The optional object instance identifier of the role required by the user. + + + + Service data types: Configuration + + + + Enumeration: ConfigurationType + + The configuration type enumeration holds the possible types of a configuration. + + + + + + + + + + + + + + + + + + + Name + ConfigurationType + + + Short Form Part + 4 + + + Enumeration Value + Numerical Value + Comment + + + PROVIDER + 1 + The configuration is a Provider configuration. + + + SERVICE + 2 + The configuration is a Service configuration. + + + + + Composite: ConfigurationObjectSet + + The configuration object set holds a set of object identifiers for a single COM object type in a single domain. + + + + + + + + + + + + + + + + + + + + Name + ConfigurationObjectSet + + + Extends + Composite + + + Short Form Part + 1 + + + Field + Type + Nullable + Comment + + + objType + COM::ObjectType + No + The COM object type of the configuration objects. + + + domain + List<Identifier> + No + The domain of the configuration objects. + + + objInstIds + List<Long> + No + The set of COM object identifiers that form this configuration set. + + + + + Composite: ConfigurationObjectDetails + + The ConfigurationObjectDetails composite holds a zero to many ConfigurationObjectSet structures. It allows a configuration to reference COM objects from more than one domain or of more than one COM object type. + + + + + + + + + + + + + + + + + + + + Name + ConfigurationObjectDetails + + + Extends + Composite + + + Short Form Part + 2 + + + Field + Type + Nullable + Comment + + + configObjects + List< HYPERLINK \l "DATATYPE_ConfigurationObjectSet" ConfigurationObjectSet> + No + The list of configuration objects. + + + + + Composite: ServiceConfigurationIdentifier + + The ServiceConfigurationIdentifier structure holds the name and service key of a service configuration object. + + + + + + + + + + + + + + + + + + + + Name + ServiceConfigurationIdentifier + + + Extends + Composite + + + Short Form Part + 3 + + + Field + Type + Nullable + Comment + + + configName + Identifier + No + + + + serviceKey + HYPERLINK \l "DATATYPE_ServiceKey" ServiceKey + No + + + + + MO Errors + + No errors are defined in this specification. + + diff --git a/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area003-v001-Common/word/numbering.xml b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area003-v001-Common/word/numbering.xml new file mode 100644 index 00000000..531dbb77 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area003-v001-Common/word/numbering.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area003-v001-Common/word/styles.xml b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area003-v001-Common/word/styles.xml new file mode 100644 index 00000000..ee967ee1 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area003-v001-Common/word/styles.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area004-v001-MC/[Content_Types].xml b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area004-v001-MC/[Content_Types].xml new file mode 100644 index 00000000..fbe325d6 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area004-v001-MC/[Content_Types].xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area004-v001-MC/_rels/.rels b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area004-v001-MC/_rels/.rels new file mode 100644 index 00000000..d6637f3e --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area004-v001-MC/_rels/.rels @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area004-v001-MC/word/_rels/document.xml.rels b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area004-v001-MC/word/_rels/document.xml.rels new file mode 100644 index 00000000..d613a6f7 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area004-v001-MC/word/_rels/document.xml.rels @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area004-v001-MC/word/document.xml b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area004-v001-MC/word/document.xml new file mode 100644 index 00000000..b1632298 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area004-v001-MC/word/document.xml @@ -0,0 +1,10925 @@ + + + + + Specification: MC + + + General + + This section contains the specifications for the MC services. + This section details the MC services, the structures used by the services are detailed in section 4. Both the services and structures are defined in terms of the MO MAL, which is defined in [2], so it is possible to deploy them over any supported protocol and message transport. + The services defined here are also specified in terms of the COM, which is defined in [3]. + To aid comprehension, several tables are included for each service and operation definition. The table formats are briefly described in section 1.6.3.2 and are the same as those used for the specification of the MO COM services in [3]. + All service specifications in this document are part of the MC area, which has a short form number of '4'. + This area contains the following services: + Action + Parameter + Alert + Check + Statistic + Aggregation + Conversion + Group + + + Service: Action + + + Overview + + The action service allows consumers to submit an action for execution and to subsequently monitor the execution progress of these actions via the COM activity tracking pattern. The progress of the action is split into two parts, firstly transfer from the consumer to the provider, and secondly execution in the provider. + An action is submitted to the provider using the submitAction operation, the progress of which can be monitored using the COM activity tracking pattern, which completes when the action has been delivered to the provider. The action is then executed in the provider which can also be monitored using the activity tracking pattern. The submitAction operation takes the object instance identifier of the submitted action and uses that to populate the source fields of the activity tracking events. Coordination may be required between action service consumers to ensure the action object instance identifiers are unique. How this is done is outside the scope of this specification however a good approach is the use of a central COM archive as that can provide the unique instance identifiers. + The nominal sequence of action submission and execution monitoring are shown in Figure 3-1: + insert sequence diag here + The consumer is responsible for creating and archiving the action instance object and then using the submitAction operation to submit it to the action provider for execution. The action provider reports, using the COM ActivityTracking service, both the execution progress of the submitAction operation and also the execution of the action itself. Once the supplied action instance details have been checked and execution of the action started by the submitAction operation, that operation finishes, whilst the execution of the action possibly continues (depends on the actual action). The final interaction in the sequence shows the execution events of the executing action instance, the '*' at the start of that line indicates zero to many events being published. + If the execution of an action fails with an error, the action service provider can publish an ActionFailure COM event to hold the error code being reported by the failure. If no error code is required to be reported then there is no need to publish the event as the normal COM ActivityTracking event contains a success indication. + The service also includes an operation, preCheckAction, which checks that an action would be accepted for execution without actually submitting it for execution. It is expected to be provided by local action proxies, rather than the remote system, to allow for localised checking of things such as link state, argument values, action safety, before sending the action over long and slow space links. + The action service defines three types of objects, the first type is the ActionIdentity object that holds the name of an action. The second type is the ActionDefinition object that holds the description of an action with the list of required/optional arguments. The third type is the ActionInstance object that holds details of a specific action instance namely a value for each of the arguments of the action. + + Table + + STYLEREF "Heading 1"\l \n \t \* MERGEFORMAT 1 SEQ Table \s 1 1tc \f T " + 1 + - SEQ Table_TOC \s 1 1 + Action Service Operations + " + : Action Service Operations + + + + + + + + + + + + + + + + + + + + + + Area Identifier + Service Identifier + Area Number + Service Number + Area Version + + + MC + Action + 4 + 1 + 1 + + + Interaction Pattern + Operation Identifier + Operation Number + Capability Set + + + SUBMIT + HYPERLINK \l "OPERATION_1_submitAction" submitAction + 1 + 1 + + + REQUEST + HYPERLINK \l "OPERATION_1_preCheckAction" preCheckAction + 2 + + + + REQUEST + HYPERLINK \l "OPERATION_1_listDefinition" listDefinition + 3 + 2 + + + REQUEST + HYPERLINK \l "OPERATION_1_addAction" addAction + 4 + 3 + + + REQUEST + HYPERLINK \l "OPERATION_1_updateDefinition" updateDefinition + 5 + + + + SUBMIT + HYPERLINK \l "OPERATION_1_removeAction" removeAction + 6 + + + + + Service-level Requirements + + The action service shall provide: + the capability for submitting actions for execution; + the capability for submitting actions for check without execution; + the capability for listing the numeric identifiers for the action definitions; + the capability for defining a new definition; + the capability for updating an existing definition; + the capability for removing an existing definition. + The list of actions that are supported by the action service shall be declared when deploying that service. + Each action submission shall include: + the action definition numeric identifier; + the action instance numeric identifier; + the ordered list of action arguments. + The submitAction operation shall be used to submit a new action instance for execution. + + COM usage + + Each action of a provider shall be represented by an ActionIdentity COM object. + The body of the ActionIdentity COM object shall hold the name of the action. + The definitions of the actions shall be represented as ActionDefinition COM objects. + The ActionDefinition object shall use the related link to indicate which ActionIdentity object it uses. + The source link of the ActionIdentity object should be the object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used. + The source link of the ActionDefinition object should be the object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used. + Instances of an action that are submitted to a provider using the submitAction operation shall be represented as ActionInstance COM object. + The object instance identifier for an ActionInstance object shall be populated by the consumer. + The ActionInstance object shall use the related link to indicate which ActionDefinition object it uses. + Instances of an action that are submitted to a provider using the submitAction operation shall link to the submitAction OperationActivity object using the source link. + The source link of the submitAction OperationActivity object should be the object that caused it to be created, most likely an operator login or automated procedure object. + + Table + + STYLEREF "Heading 1"\l \n \t \* MERGEFORMAT 1 SEQ Table \s 1 1tc \f T " + 1 + - SEQ Table_TOC \s 1 1 + Action Service Object Types + " + : Action Service Object Types + + + + + + + + + + + + + + + + + + + + + + Object Number + Object Name + Object Body Type + Related link + Source link + + + 1 + ActionIdentity + Identifier + Set to NULL + The object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used + + + 2 + ActionDefinition + HYPERLINK \l "DATATYPE_ActionDefinitionDetails" ActionDefinitionDetails + 1 + The object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used + + + 3 + ActionInstance + HYPERLINK \l "DATATYPE_ActionInstanceDetails" ActionInstanceDetails + 2 + The object that caused it to be created, most likely a COM OperationActivity object if created by the submitAction operation + + + + COM Event Service usage + + Execution progress of an action shall be reported using COM ActivityTracking Execution events. + The Execution event may be reported many times as it is used to report each stage in the execution of the action. It is implementation specific when a progress step is reached and the Execution event will be reported. + If the execution of an action fails then that failure shall be reported using the normal COM ActivityTracking event pattern, specifically an ActivityTracking Execution event with the success field set to FALSE. + If the execution of an action fails with an error code then that error code shall be reported using an ActionFailure COM event in addition to the ActivityTracking event used to report the action failure. + The source of the ActionFailure event shall be the ActivityTracking Execution event that represents the failure stage of the action execution. + The related field of the ActionFailure event shall link to the ActionInstance object that failed. + The body of the event shall hold a numeric failure code that is either a MAL error number or a deployment specific code. + The specification of the deployment specific failure code is outside the scope of this specification and is expected to be agreed out of band. + + Table + + STYLEREF "Heading 1"\l \n \t \* MERGEFORMAT 1 SEQ Table \s 1 1tc \f T " + 1 + - SEQ Table_TOC \s 1 1 + Action Service Events + " + : Action Service Events + + + + + + + + + + + + + + + + + + + + + + Object Number + Event Name + Object Body Type + Related link + Source link + + + 6 + ActionFailure + UInteger + 3 + COM::ActivityTracking::5 + + + + COM Object Relationships + + The Figure below shows the COM object and event relationships for this service: + + Figure + + STYLEREF "Heading 1"\l \n \t \* MERGEFORMAT 1 SEQ Figure \s 1 1tc \f T " + 1 + - SEQ Figure_TOC \s 1 1 + Action Service COM object and event relationships + " + : Action Service COM object and event relationships + + + COM Archive Service usage + + ActionIdentity objects should be stored in the COM archive. + ActionDefinition objects should be stored in the COM archive. + Before an action is sent with the submitAction operation, the ActionInstance object should be stored in the COM archive by the consumer. + The COM activity tracking events associated with the submission and execution of the action should be stored in the COM archive. + Any ActionFailure COM event objects should be stored in the COM archive. + + COM Activity Service usage + + The COM Activity service should be used to monitor the transfer and execution of the submitAction operation. + The COM Activity service should be used to monitor the transfer and execution of ActionInstance objects. + The COM activity events for the submitAction operation shall be generated as defined in the COM activity tracking service. + A Release activity event for the action instance shall be generated when an ActionInstance object is released from a consumer using the submitAction operation. + The Acceptance activity event for the ActionInstance object, separate from the Acceptance activity event generated for the submitAction operation, shall be generated when an action is received by the destination provider and after any pre-execution checks have been performed. + The body of the ActionInstance ActivityAcceptance event object shall be populated with the pre-execution checks result. + The source link of the activity events for the ActionInstance shall be the ActionInstance object. + The related link of the activity events for the ActionInstance shall be set to NULL. + In all activity execution events for the action instance the ActivityExecution.stageCount field shall be set to 2 plus the total number of progress stages. + In the activity execution event, when notification of an action starting is requested, the ActivityExecution.executionStage field shall be set to 1. + In the activity execution event, when notification of an action progress is requested, the ActivityExecution.executionStage field shall be set to 1 plus the current progress stage. + In the activity execution event, when notification of an action completion is requested, the ActivityExecution.executionStage field shall be set to 2 plus the total number of progress stages. + + + Operation: submitAction + + + Overview + + The submitAction operation allows a consumer to submit an action to a provider for remote execution. + + + + + + + + + + + + + + + + + + + + Operation Identifier + submitAction + + + Interaction Pattern + SUBMIT + + + Pattern Sequence + Message + Nullable + Type Signature + + + IN + SUBMIT + YesYes + Long actionInstId HYPERLINK \l "DATATYPE_ActionInstanceDetails" ActionInstanceDetails actionDetails + + + + Type Signature Details + + actionInstId - The actionInstId field of the submission shall contain the object instance identifier of the ActionInstance to be used for activity tracking events. + actionDetails - The actionDetails part of the submission shall contain the argument values and related information of the action instance to be executed. +If the defInstId of the supplied actionDetails field does not match a known ActionDefinition object then an UNKNOWN error shall be returned. +The size of the argumentValues list of the ActionInstanceDetails structure shall be compared to the size of the argument list in the matched ActionDefinition object and an INVALID error shall be returned if they are not the same. +If the ActionInstanceDetails structure contains an argumentIds field value then this shall be compared to the same field in the matched ActionDefinition object and must be the same size and contain the same values, an INVALID error shall be returned if this is not the case. +If the ActionInstanceDetails structure contains an isRawValue field value then the size of this list shall be compared to the size of the argument list in the matched ActionDefinition object and an INVALID error shall be returned if they are not the same. +If the supplied argument values do not match the attribute type specified in the action definition then an INVALID error shall be returned. +A service provider may apply some deployment specific checks to the action instance and can return an INVALID error if they fail. +If an error is raised then no action shall be executed. +The SUBMIT acknowledgement shall be returned once the action has been accepted for execution but before execution starts. + + Requirements + + + MO Errors + + The operation may return one of the following errors: + INVALID: The list sizes held in the ActionInstanceDetails do not match the argument definitions or it contains one or more invalid argument values. + INVALID: If the two lists are not the same length then the extra information field shall contain the first index of the element in the largest list which does not have corresponding element in the other list. + UNKNOWN: Submitted action definition is unknown. + + + + + + + + + + + + + + + + + + + + Error + Error # + ExtraInfo Type + ExtraInfo description + + + INVALID + Defined in COM + List<UInteger> + The extra information field contains a list of the indexes of the erroneous values from the originating list supplied. + + + UNKNOWN + Defined in MAL + Not Used + - + + + + + Operation: preCheckAction + + + Overview + + The preCheckAction operation allows a consumer to check that an action would be successfully accepted for execution without actually submitting the action. The operation is expected to be provided by local action proxies rather than the remote system to allow for quick local checks before sending the action over long and slow space links. + + + + + + + + + + + + + + + + + + + + Operation Identifier + preCheckAction + + + Interaction Pattern + REQUEST + + + Pattern Sequence + Message + Nullable + Type Signature + + + IN + REQUEST + Yes + HYPERLINK \l "DATATYPE_ActionInstanceDetails" ActionInstanceDetails actionDetails + + + OUT + RESPONSE + Yes + Boolean accepted + + + + Type Signature Details + + actionDetails - The actionDetails part of the submission shall contain the argument values and related information of the action instance to be executed. +If the ActionInstanceDetails structure contains an argumentIds field value then this shall be compared to the same field in the matched ActionDefinition object and must be the same size and contain the same values, an INVALID error shall be returned if this is not the case. +If the supplied argument values do not match the attribute type specified in the action definition then an INVALID error shall be returned. +A service provider may apply some deployment specific checks to the action instance and can return an INVALID error if they fail. + accepted - The returned Boolean shall be set to TRUE if the action would be accepted successfully; otherwise the operation shall return FALSE. + + Requirements + + + MO Errors + + The operation may return one of the following errors: + INVALID: The argument list contains one or more invalid arguments. + UNKNOWN: Submitted action definition is unknown. + + + + + + + + + + + + + + + + + + + + Error + Error # + ExtraInfo Type + ExtraInfo description + + + INVALID + Defined in COM + List<UInteger> + The extra information field contains a list of the indexes of the erroneous values from the originating list supplied. + + + UNKNOWN + Defined in MAL + Not Used + - + + + + + Operation: listDefinition + + + Overview + + The listDefinition operation allows a consumer to request the object instance identifiers of the latest ActionIdentity and ActionDefinition objects for the supported actions of the provider. + + + + + + + + + + + + + + + + + + + + Operation Identifier + listDefinition + + + Interaction Pattern + REQUEST + + + Pattern Sequence + Message + Nullable + Type Signature + + + IN + REQUEST + Yes + List<Identifier> actionNames + + + OUT + RESPONSE + Yes + List< HYPERLINK \l "DATATYPE_ObjectInstancePair" ObjectInstancePair> actionInstIds + + + + Type Signature Details + + actionNames - The actionNames field shall contain a list of action names to retrieve the ActionIdentity and ActionDefinition object instance identifiers for. +The request may contain the wildcard value of '*' to return all supported ActionIdentity and ActionDefinition objects. +The wildcard value should be checked for first, if found no other checks of supplied identifiers shall be made. +If a provided identifier does not include a wildcard and does not match an existing ActionIdentity object then this operation shall fail with an UNKNOWN error. + actionInstIds - The response shall contain a list of matching ActionIdentity and ActionDefinition object instance identifiers. +The returned list shall maintain the same order as the submitted list unless the wildcard value was included in the request. + + Requirements + + + MO Errors + + The operation may return the following error: + UNKNOWN: One of the supplied identifiers is unknown. + + + + + + + + + + + + + + + + + + + + Error + Error # + ExtraInfo Type + ExtraInfo description + + + UNKNOWN + Defined in MAL + List<UInteger> + A list of the indexes of the error values shall be contained in the extra information field. + + + + + Operation: addAction + + + Overview + + The addAction operation allows a consumer to define one or more actions that do not currently exist. The new ActionIdentity and ActionDefinition objects are expected to be stored in the COM archive by the provider of the action service. + + + + + + + + + + + + + + + + + + + + Operation Identifier + addAction + + + Interaction Pattern + REQUEST + + + Pattern Sequence + Message + Nullable + Type Signature + + + IN + REQUEST + Yes + List< HYPERLINK \l "DATATYPE_ActionCreationRequest" ActionCreationRequest> actionDefDetails + + + OUT + RESPONSE + Yes + List< HYPERLINK \l "DATATYPE_ObjectInstancePair" ObjectInstancePair> newObjInstIds + + + + Type Signature Details + + actionDefDetails - The actionDefDetails field shall hold the name and definitions to be added. +The name field must not be the wildcard '*', or empty (an INVALID error shall be returned in this case). +The supplied name must be unique among all ActionIdentity objects for the domain of the provider otherwise a DUPLICATE error shall be raised. +If an error is raised then no new identities and definitions shall be added as a result of this operation call. +If the supplied name matches an existing, but removed, ActionIdentity then that ActionIdentity shall be reused otherwise a new ActionIdentity shall be created. +The provider shall create a new ActionDefinition object and store it, and any new ActionIdentity objects, in the COM archive. + newObjInstIds - The response shall contain the list of object instance identifiers for the ActionIdentity and new ActionDefinition objects. +The returned list shall maintain the same order as the submitted definitions. + + Requirements + + + MO Errors + + The operation may return one of the following errors: + INVALID: One of the supplied ActionIdentity objects contains an invalid action name. + DUPLICATE: One or more of the ActionIdentity objects being added has supplied an action name that is already in use in the domain. + + + + + + + + + + + + + + + + + + + + Error + Error # + ExtraInfo Type + ExtraInfo description + + + INVALID + Defined in COM + List<UInteger> + The extra information field contains a list of the indexes of the erroneous values from the originating list supplied. + + + DUPLICATE + Defined in COM + List<UInteger> + The extra information field contains a list of the indexes of the erroneous values from the originating request list. + + + + + Operation: updateDefinition + + + Overview + + The updateDefinition operation allows a consumer to update a definition for one or more actions. + This differs from deleting an existing action and adding a new definition with the same name in the fact that the ActionIdentity object is not changed between the two definitions. + The replacement definition should be stored in the COM archive by the service provider. The operation does not remove the previous ActionDefinition object from the COM archive, merely removes the object from the provider. This permits existing, and completed, ActionInstance objects to continue to reference the correct ActionIdentity and ActionDefinition objects in the COM archive. + + + + + + + + + + + + + + + + + + + + Operation Identifier + updateDefinition + + + Interaction Pattern + REQUEST + + + Pattern Sequence + Message + Nullable + Type Signature + + + IN + REQUEST + YesYes + List<Long> actionObjInstIdsList< HYPERLINK \l "DATATYPE_ActionDefinitionDetails" ActionDefinitionDetails> actionDefDetails + + + OUT + RESPONSE + Yes + List<Long> newDefInstIds + + + + Type Signature Details + + actionObjInstIds - The actionObjInstIds field shall contain the list of object instance identifiers of the ActionIdentity objects to be updated. +The supplied object instance identifiers shall match existing identity objects, an UNKNOWN error shall be raised if this is not the case. +If the actionObjInstIds list contains either NULL or '0' an INVALID error shall be raised. + actionDefDetails - The actionDefDetails field shall contain the replacement ActionDefinitionDetails. +The two lists shall be ordered the same. +The number of entries in the two lists shall be the same size otherwise an INVALID error shall be returned. +If an error is raised then no definitions shall be modified as a result of this operation call. +The provider shall create a new ActionDefinition object and store it in the COM archive. +The new ActionDefinition object shall be the current ActionDefinition used for the specific ActionIdentity. + newDefInstIds - The response shall contain the list of object instance identifiers for the new ActionDefinition objects. +The returned list shall maintain the same order as the submitted definitions. + + Requirements + + + MO Errors + + The operation may return one of the following errors: + INVALID: The supplied object instance identifiers list contains either a NULL or '0' or the two supplied lists are not the same length. + INVALID: If the two lists are not the same length then the extra information field shall contain the first index of the element in the largest list which does not have corresponding element in the other list. + UNKNOWN: One of the supplied ActionIdentity object instance identifiers is unknown. + + + + + + + + + + + + + + + + + + + + Error + Error # + ExtraInfo Type + ExtraInfo description + + + INVALID + Defined in COM + List<UInteger> + The extra information field contains a list of the indexes of the erroneous values from the originating list supplied. + + + UNKNOWN + Defined in MAL + List<UInteger> + A list of the indexes of the error values shall be contained in the extra information field. + + + + + Operation: removeAction + + + Overview + + The removeAction operation allows a consumer to remove one or more actions from the list of actions supported by the action provider. + The operation does not remove the ActionIdentity or ActionDefinition object from the COM archive, merely removes the objects from the provider. This permits existing, and completed, ActionInstance objects to continue to reference the correct ActionIdentity and ActionDefinition objects in the COM archive. + + + + + + + + + + + + + + + + + + + + Operation Identifier + removeAction + + + Interaction Pattern + SUBMIT + + + Pattern Sequence + Message + Nullable + Type Signature + + + IN + SUBMIT + Yes + List<Long> actionInstIds + + + + Type Signature Details + + actionInstIds - The actionInstIds field shall hold the object instance identifiers of the ActionIdentity objects to be removed from the provider. +The wildcard value of '0' in the list of object instance identifiers shall be supported and matches all actions of the provider. +The wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made. +If a provided ActionIdentity object instance identifier does not include a wildcard and does not match an existing ActionIdentity object then this operation shall fail with an UNKNOWN error. +If a matched definition is still being used by an executing action instance then this operation shall not fail because of this reason. +Matched ActionIdentity objects shall not be removed from the COM archive only the list of ActionIdentity objects in the provider. +Removed ActionIdentity object shall not be allowed to be referenced by new action instances. +If an error is raised then no actions shall be removed as a result of this operation call. + + Requirements + + + MO Errors + + The operation may return the following error: + UNKNOWN: One of the supplied ActionIdentity object instance identifiers is unknown. + + + + + + + + + + + + + + + + + + + + Error + Error # + ExtraInfo Type + ExtraInfo description + + + UNKNOWN + Defined in MAL + List<UInteger> + A list of the indexes of the error values shall be contained in the extra information field. + + + + + Service: Parameter + + + Overview + + The parameter service allows the user to subscribe to parameter value report and optionally be able to set new values. A single PUBSUB operation is provided for monitoring and publishing of parameter values. + A parameter value also contains a calculation of the validity of the parameter, the flow chart for this calculation is provided in Figure 3-3: + validity calculation flow chart + + This standard supports the concept of non-standard invalidity states but the meaning and calculation of these is outside the scope of this standard. + The generation of value reports can be controlled using the enableGeneration operation, which supports the use of groups. Groups must reference parameter identities or groups of parameter identities only. + The parameter service does not include any value checking, this is delegated to the check service. + Parameter definitions are maintained using the operations defined in this service but storage of definitions is delegated to the COM archive. + + Table + + STYLEREF "Heading 1"\l \n \t \* MERGEFORMAT 1 SEQ Table \s 1 1tc \f T " + 1 + - SEQ Table_TOC \s 1 1 + Parameter Service Operations + " + : Parameter Service Operations + + + + + + + + + + + + + + + + + + + + + + Area Identifier + Service Identifier + Area Number + Service Number + Area Version + + + MC + Parameter + 4 + 2 + 1 + + + Interaction Pattern + Operation Identifier + Operation Number + Capability Set + + + PUB-SUB + HYPERLINK \l "OPERATION_2_monitorValue" monitorValue + 1 + 1 + + + REQUEST + HYPERLINK \l "OPERATION_2_getValue" getValue + 2 + 2 + + + SUBMIT + HYPERLINK \l "OPERATION_2_setValue" setValue + 3 + 3 + + + REQUEST + HYPERLINK \l "OPERATION_2_enableGeneration" enableGeneration + 4 + 4 + + + REQUEST + HYPERLINK \l "OPERATION_2_listDefinition" listDefinition + 5 + 5 + + + REQUEST + HYPERLINK \l "OPERATION_2_addParameter" addParameter + 6 + 6 + + + REQUEST + HYPERLINK \l "OPERATION_2_updateDefinition" updateDefinition + 7 + + + + SUBMIT + HYPERLINK \l "OPERATION_2_removeParameter" removeParameter + 8 + + + + + Service-level Requirements + + The parameter service shall provide: + the capability for periodic reporting of predefined parameter values; + the capability for setting the raw parameter value of a set of parameters; + the capability for requesting the current value of a set of parameters; + the capability for controlling reporting of the parameter values; + the capability for maintaining the list of parameter definitions. + Each parameter value report shall contain: + The validity of the parameter value; + The raw value of the parameter; + The converted value of the parameter, if applicable. + The validity of parameter shall be calculated against validity criteria in the parameter definition. + It shall be possible to update, delete, and add parameter definitions. + The list of the parameters definitions may be requested. + The generation of reports of the parameter shall be controlled by the generationEnabled Boolean value in the ParameterDefinitionDetails. + Setting the generationEnabled field to TRUE shall enable generation of reports for a specific parameter. + If a parameter is required to send periodic reports then the time between these reports shall be controlled using the reportInterval Duration value in the ParameterDefinitionDetails. + A reportInterval value of '0' shall mean no periodic reports shall be sent; reports must be triggered by another implementation-specific mechanism in this case. + The generationEnabled values can be set by using the enableGeneration operation. + The generationEnabled and reportInterval values can be set by using the updateDefinition operation. + For onboard parameters, the interval should be a multiple of the minimum sampling interval of those parameters. + If an interval that is not supported by the provider is requested, then an INVALID error shall be returned, and the change rejected. + If the parameter is periodic and reported via a periodic aggregation, and a new report has not been received in the aggregation period, then the validity shall be set to EXPIRED by setting the ParameterValue validityState field to '1'. + If the parameter raw value cannot be obtained, or calculated for synthetic parameters, then the validity state shall be INVALID_RAW by setting the ParameterValue validityState field to '2' and the rawValue set to NULL. + If the validityExpression field is NULL, or the validity expression evaluates to TRUE, and the ParameterDefinitionDetails either does not contain a conversion or the conversion is successful, then the validity state shall be set to VALID by setting the ParameterValue validityState field to '0'. + If the validityExpression field is NULL, or the validity expression evaluates to TRUE, and the conversion of the parameter value fails (for example an unexpected value for a discrete conversion), then the validity state shall be INVALID_CONVERSION by setting the ParameterValue validityState field to '3'. + If the validityExpression field is not NULL and the parameters used to determine the expression are not VALID, then the validity state shall be set to UNVERIFIED by setting the ParameterValue validityState field to '4'. + If the validityExpression field is not NULL and the validity expression evaluates to FALSE, then the validity state shall be set to INVALID by setting the ParameterValue validityState field to '5'. + If the validity of the parameter is INVALID_CONVERSION then the convertedValue of the ParameterValue shall be set to NULL. + If the validity of the parameter is either UNVERIFIED or INVALID and the ParameterDefinitionDetails contains a conversion, then the convertedValue of the ParameterValue shall contain the converted value. + It is supported that other, implementation specific, mechanisms may be used to determine parameter validity. + It is supported that other, deployment specific, validityState values be used however the meaning of those values is deployment specific and outside the scope of this standard. They must use values greater than 127. + + COM usage + + Each parameter of a provider shall be represented by a ParameterIdentity COM object. + The body of the ParameterIdentity COM object shall hold the name of the parameter. + The definitions of the parameters shall be represented as ParameterDefinition COM objects. + Parameter value report shall be represented as ParameterValueInstance COM objects. + The ParameterDefinition object shall use the related link to indicate which ParameterIdentity object it uses. + The ParameterValueInstance object shall use the related link to indicate which ParameterDefinition object it uses. + The source link of the ParameterIdentity object should be the object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used. + The source link of the ParameterDefinition object should be the object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used. + The source link of the ParameterValueInstance object should be the object that caused the report to be generated. + The source link of the ParameterValueInstance object shall be NULL for periodic reports. + + Table + + STYLEREF "Heading 1"\l \n \t \* MERGEFORMAT 1 SEQ Table \s 1 1tc \f T " + 1 + - SEQ Table_TOC \s 1 1 + Parameter Service Object Types + " + : Parameter Service Object Types + + + + + + + + + + + + + + + + + + + + + + Object Number + Object Name + Object Body Type + Related link + Source link + + + 1 + ParameterIdentity + Identifier + Set to NULL + The object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used + + + 2 + ParameterDefinition + HYPERLINK \l "DATATYPE_ParameterDefinitionDetails" ParameterDefinitionDetails + 1 + The object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used + + + 3 + ParameterValueInstance + HYPERLINK \l "DATATYPE_ParameterValue" ParameterValue + 2 + The object that caused the value to be generated or NULL for periodic reports + + + + COM Object Relationships + + The Figure below shows the COM object relationships for this service: + + Figure + + STYLEREF "Heading 1"\l \n \t \* MERGEFORMAT 1 SEQ Figure \s 1 1tc \f T " + 1 + - SEQ Figure_TOC \s 1 1 + Parameter Service COM object relationships + " + : Parameter Service COM object relationships + + + COM Archive Service usage + + ParameterIdentity and ParameterDefinition objects should be stored in the COM archive. + When a parameter value report is published, the ParameterValueInstance object should be stored in the COM archive. + + + Operation: monitorValue + + + Overview + + The monitorValue operation allows a consumer to subscribe for parameter value reports. + + + + + + + + + + + + + + + + + + + + Operation Identifier + monitorValue + + + Interaction Pattern + PUBLISH-SUBSCRIBE + + + Pattern Sequence + Message + Nullable + Type Signature + + + OUT + PUBLISH + YesYes + COM::ObjectId objId HYPERLINK \l "DATATYPE_ParameterValue" ParameterValue newValue + + + + Type Signature Details + + objId - The MAL EntityKey.firstSubKey shall contain the parameter name. +The MAL EntityKey.secondSubKey shall contain the ParameterIdentity object instance identifier. +The MAL EntityKey.thirdSubKey shall contain the ParameterDefinition object instance identifier. +The MAL EntityKey.fourthSubKey shall contain the new ParameterValueInstance object instance identifier. +The timestamp of the ParameterValueInstance report shall be taken from the publish message and shall be the time of the parameter value update. +The publish message shall include the ObjectId of the source link of the report. +If no source link is needed then the ObjectId shall be replaced with a NULL. + newValue - The second part of the publish message shall be the ParameterValueInstance object value. + + Requirements + + + MO Errors + + The operation does not return any errors. + + + Operation: getValue + + + Overview + + The getValue operation returns the latest received value for a requested parameter. + + + + + + + + + + + + + + + + + + + + Operation Identifier + getValue + + + Interaction Pattern + REQUEST + + + Pattern Sequence + Message + Nullable + Type Signature + + + IN + REQUEST + Yes + List<Long> paramInstIds + + + OUT + RESPONSE + Yes + List< HYPERLINK \l "DATATYPE_ParameterValueDetails" ParameterValueDetails> paramValDetails + + + + Type Signature Details + + paramInstIds - The paramInstIds field shall provide the list of ParameterIdentity object instance identifiers. +The wildcard value of '0' shall be supported and matches all parameters of the provider. +The wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made. +If a requested parameter is unknown then an UNKNOWN error shall be returned. +If a parameter is being reported periodically, using the operation shall not reset the reportInterval timer. + paramValDetails - The response shall contain a list of returned ParameterIdentity and ParameterDefinition object instance identifier pairs and a matching list of parameter values. +The new value shall not be published via the monitorValue operation. + + Requirements + + + MO Errors + + The operation may return the following error: + UNKNOWN: One or more of the requested parameters is unknown. + + + + + + + + + + + + + + + + + + + + Error + Error # + ExtraInfo Type + ExtraInfo description + + + UNKNOWN + Defined in MAL + List<UInteger> + A list of the indexes of the error values shall be contained in the extra information field. + + + + + Operation: setValue + + + Overview + + The setValue operation allows a consumer to set the raw value for one or more parameters. + + + + + + + + + + + + + + + + + + + + Operation Identifier + setValue + + + Interaction Pattern + SUBMIT + + + Pattern Sequence + Message + Nullable + Type Signature + + + IN + SUBMIT + Yes + List< HYPERLINK \l "DATATYPE_ParameterRawValue" ParameterRawValue> newRawValues + + + + Type Signature Details + + newRawValues - The submitted newRawValues shall hold a list of ParameterRawValues that contain the ParameterIdentity object instance identifier and the respective raw value to be set. +If the paramInstId field contains the wildcard value of '0' then an INVALID error shall be returned. +If a requested ParameterIdentity is unknown then an UNKNOWN error shall be returned. +If a request ParameterIdentity is not settable due to it being read only then a READONLY error shall be returned. +The rawValue shall contain the new parameter raw value to be set. +If the supplied new parameter raw value does not match the defined type for the ParameterIdentity then an INVALID error shall be returned. +If an error is raised then no modifications shall be made as a result of this operation call. +The parameter values shall be set concurrently, by this it is meant that all values are set at the same time without interleaving of other values being (ATOMIC behaviour). How this is implemented is an implementation detail. +The service provider shall create new ParameterValueInstance objects for the updated parameter values, store these in the COM Archive, and publish these new values. + + Requirements + + + MO Errors + + The operation may return one of the following errors: + UNKNOWN: One or more of the referenced parameters is unknown. + INVALID: One of the supplied parameter values contains an invalid value. + READONLY: One or more of the parameters being set is read only. + + + + + + + + + + + + + + + + + + + + Error + Error # + ExtraInfo Type + ExtraInfo description + + + UNKNOWN + Defined in MAL + List<UInteger> + A list of the indexes of the error values shall be contained in the extra information field. + + + INVALID + Defined in COM + List<UInteger> + The extra information field contains a list of the indexes of the erroneous values from the originating list supplied. + + + READONLY + 70020 + List<UInteger> + A list of the indexes of the error values shall be contained in the extra information field. + + + + + Operation: enableGeneration + + + Overview + + The enableGeneration operation allows a consumer to control whether reports for specific parameters are generated or not. The operation allows the consumer to select the parameters directly or indirectly using groups. + + + + + + + + + + + + + + + + + + + + Operation Identifier + enableGeneration + + + Interaction Pattern + REQUEST + + + Pattern Sequence + Message + Nullable + Type Signature + + + IN + REQUEST + YesYes + Boolean isGroupIdsList<COM::InstanceBooleanPair> enableInstances + + + OUT + RESPONSE + Yes + List<Long> newObjInstIds + + + + Type Signature Details + + isGroupIds - If the isGroupIds field is TRUE then the enableInstances field shall contain GroupIdentity object instance identifiers, otherwise the field contains ParameterIdentity object instance identifiers. +The ParameterIdentity objects referenced, either directly or indirectly via groups, by the enableInstances field shall be the ParameterIdentity objects to match. +The id of the enableInstances field shall support the wildcard value of '0' and matches all ParameterIdentity objects of the provider. +The service provider shall check for the wildcard value in the list of object instance identifiers in the enableInstances field first and if found no other checks of supplied object instance identifiers shall be made. +If the enableInstances field contains a value of TRUE then reports for matching ParameterIdentity objects shall be generated, a value of FALSE requests that reports will not be generated. +No error shall be raised if the enableInstances Boolean value supplied is the same as the current generationEnabled field of the definition for a matched ParameterIdentity object i.e. enabling an already enabled parameter will not result in an error. +If a requested ParameterIdentity or GroupIdentity object is unknown then an UNKNOWN error shall be returned. +If a requested Group, or the Group objects referenced by that Group, does not contain ParameterIdentity objects then an INVALID error shall be returned. +If an error is raised then no modifications shall be made as a result of this operation call. +The provider shall create and store a new ParameterDefinition object in the COM archive if the generationEnabled field is changed. +If a new ParameterDefinition object is created then that new object shall be the current ParameterDefinition used for the specific ParameterIdentity. + enableInstances - If the generation of reports is being enabled, and the parameter is defined as being periodic, then the provider shall generate a report immediately and start the report interval from that report. + newObjInstIds - The response shall contain the list of object instance identifiers for the new ParameterDefinition objects. + + Requirements + + + MO Errors + + The operation may return one of the following errors: + UNKNOWN: One or more of the requested parameters or groups is unknown. + INVALID: One of the supplied groups is either not a group of groups or a group of ParameterIdentity objects. + + + + + + + + + + + + + + + + + + + + Error + Error # + ExtraInfo Type + ExtraInfo description + + + UNKNOWN + Defined in MAL + List<UInteger> + A list of the indexes of the error values shall be contained in the extra information field. + + + INVALID + Defined in COM + List<UInteger> + The extra information field contains a list of the indexes of the erroneous values from the originating list supplied. + + + + + Operation: listDefinition + + + Overview + + The listDefinition operation allows a consumer to request the latest object instance identifiers of the ParameterIdentity and ParameterDefinition objects for the supported parameters of the provider. + + + + + + + + + + + + + + + + + + + + Operation Identifier + listDefinition + + + Interaction Pattern + REQUEST + + + Pattern Sequence + Message + Nullable + Type Signature + + + IN + REQUEST + Yes + List<Identifier> paramNames + + + OUT + RESPONSE + Yes + List< HYPERLINK \l "DATATYPE_ObjectInstancePair" ObjectInstancePair> objInstIds + + + + Type Signature Details + + paramNames - The paramNames field shall contain a list of parameter names to retrieve the ParameterIdentity and ParameterDefinition object instance identifiers for. +The paramNames field may contain the wildcard value of '*' to return all supported ParameterIdentity and ParameterDefinition objects. +The wildcard value should be checked for first, if found no other checks of supplied identifiers shall be made. +If a provided identifier does not include a wildcard and does not match an existing ParameterIdentity object then this operation shall fail with an UNKNOWN error. + objInstIds - The response shall contain a list of matching ParameterIdentity and ParameterDefinition object instance identifier pairs. +The returned list shall maintain the same order as the submitted list unless the wildcard value was included in the request. + + Requirements + + + MO Errors + + The operation may return the following error: + UNKNOWN: One of the supplied identifiers is unknown. + + + + + + + + + + + + + + + + + + + + Error + Error # + ExtraInfo Type + ExtraInfo description + + + UNKNOWN + Defined in MAL + List<UInteger> + A list of the indexes of the error values shall be contained in the extra information field. + + + + + Operation: addParameter + + + Overview + + The addParameter operation allows a consumer to define one or more parameters that do not currently exist. + The new ParameterIdentity and ParameterDefinition objects are expected to be stored in the COM archive by the provider of the parameter service. + + + + + + + + + + + + + + + + + + + + Operation Identifier + addParameter + + + Interaction Pattern + REQUEST + + + Pattern Sequence + Message + Nullable + Type Signature + + + IN + REQUEST + Yes + List< HYPERLINK \l "DATATYPE_ParameterCreationRequest" ParameterCreationRequest> paramDefDetails + + + OUT + RESPONSE + Yes + List< HYPERLINK \l "DATATYPE_ObjectInstancePair" ObjectInstancePair> newObjInstIds + + + + Type Signature Details + + paramDefDetails - The paramDefDetails field shall hold the name and the ParameterDefinitionDetails to be added. +The name field must not be the wildcard '*', or empty (an INVALID error shall be returned in this case). +If the supplied reportInterval value is not supported by the provider then an INVALID error shall be returned. +The supplied name must be unique among all ParameterIdentity objects for the domain of the provider otherwise a DUPLICATE error shall be raised. +If an error is raised then no new identities and definitions shall be added as a result of this operation call. +If the supplied name matches an existing, but removed, ParameterIdentity then that ParameterIdentity shall be reused otherwise a new ParameterIdentity shall be created. +The provider shall create a new ParameterDefinition object and store it, and any new ParameterIdentity objects, in the COM archive. + newObjInstIds - The response shall contain the list of object instance identifiers for the ParameterIdentity and new ParameterDefinition objects. +The returned list shall maintain the same order as the submitted definitions. + + Requirements + + + MO Errors + + The operation may return one of the following errors: + INVALID: One of the supplied ParameterIdentity objects contains an invalid name or a supplied interval is not supported by the provider. + DUPLICATE: One or more of the ParameterIdentity objects being added has supplied a parameter name that is already in use in the domain. + + + + + + + + + + + + + + + + + + + + Error + Error # + ExtraInfo Type + ExtraInfo description + + + INVALID + Defined in COM + List<UInteger> + The extra information field contains a list of the indexes of the erroneous values from the originating list supplied. + + + DUPLICATE + Defined in COM + List<UInteger> + The extra information field contains a list of the indexes of the erroneous values from the originating request list. + + + + + Operation: updateDefinition + + + Overview + + The updateDefinition operation allows a consumer to update a definition for one or more parameters. + This differs from deleting an existing parameter and adding a new definition with the same parameter name in the fact that the ParameterIdentity object is not changed between the two definitions. + The replacement definition should be stored in the COM archive by the service provider. The operation does not remove the previous object from the COM archive, merely removes the object from the provider. + + + + + + + + + + + + + + + + + + + + Operation Identifier + updateDefinition + + + Interaction Pattern + REQUEST + + + Pattern Sequence + Message + Nullable + Type Signature + + + IN + REQUEST + YesYes + List<Long> paramInstIdsList< HYPERLINK \l "DATATYPE_ParameterDefinitionDetails" ParameterDefinitionDetails> paramDefDetails + + + OUT + RESPONSE + Yes + List<Long> newObjInstIds + + + + Type Signature Details + + paramInstIds - The paramInstIds field shall contain the object instance identifiers of the ParameterIdentity objects to be updated. +The supplied object instance identifiers shall match existing identity objects, an UNKNOWN error shall be raised if this is not the case. +If the paramInstIds list contains either NULL or '0' an INVALID error shall be raised. + paramDefDetails - The paramDefDetails field shall contain the replacement ParameterDefinitionDetails. +The two lists shall be ordered the same. +The number of entries in the two lists shall be the same size otherwise an INVALID error shall be returned. +If the supplied reportInterval value is not supported by the provider then an INVALID error shall be returned. +If an error is raised then no definitions shall be updated as a result of this operation call. +The provider shall create a new ParameterDefinition object and store it in the COM archive. +The new ParameterDefinition object shall be the current ParameterDefinition used for the specific ParameterIdentity. + newObjInstIds - The response shall contain the list of object instance identifiers for the new ParameterDefinition objects. +The returned list shall maintain the same order as the submitted definitions. + + Requirements + + + MO Errors + + The operation may return one of the following errors: + INVALID: The supplied object instance identifiers list contains either a NULL or '0' or the two supplied lists are not the same length or a supplied interval is not supported by the provider. + INVALID: If the two lists are not the same length then the extra information field shall contain the first index of the element in the largest list which does not have corresponding element in the other list. + UNKNOWN: One of the supplied ParameterIdentity object instance identifiers is unknown. + + + + + + + + + + + + + + + + + + + + Error + Error # + ExtraInfo Type + ExtraInfo description + + + INVALID + Defined in COM + List<UInteger> + The extra information field contains a list of the indexes of the erroneous values from the originating list supplied. + + + UNKNOWN + Defined in MAL + List<UInteger> + A list of the indexes of the error values shall be contained in the extra information field. + + + + + Operation: removeParameter + + + Overview + + The removeParameter operation allows a consumer to remove one or more parameters from the list of parameters supported by the parameter provider. + The operation does not remove the ParameterIdentity or ParameterDefinition objects from the COM archive, merely removes the objects from the provider. This permits existing parameter values to continue to reference the correct ParameterIdentity and ParameterDefinition objects in the COM archive. + + + + + + + + + + + + + + + + + + + + Operation Identifier + removeParameter + + + Interaction Pattern + SUBMIT + + + Pattern Sequence + Message + Nullable + Type Signature + + + IN + SUBMIT + Yes + List<Long> paramInstIds + + + + Type Signature Details + + paramInstIds - The paramInstIds field shall hold the object instance identifiers of the ParameterIdentity objects to be removed from the provider. +The list may contain the wildcard value of '0'. +The wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made. +If a provided ParameterIdentity object instance identifier does not include a wildcard and does not match an existing parameter identity object then this operation shall fail with an UNKNOWN error. +Matched ParameterIdentity and ParameterDefinition objects shall not be removed from the COM archive only the list of ParameterIdentity and ParameterDefinition objects from the provider. +If an error is raised then no parameters shall be removed as a result of this operation call. +If the operation succeeds then the provider shall not publish parameter values for the deleted ParameterIdentity objects anymore. + + Requirements + + + MO Errors + + The operation may return the following error: + UNKNOWN: One of the supplied ParameterIdentity object instance identifiers is unknown. + + + + + + + + + + + + + + + + + + + + Error + Error # + ExtraInfo Type + ExtraInfo description + + + UNKNOWN + Defined in MAL + List<UInteger> + A list of the indexes of the error values shall be contained in the extra information field. + + + + + Service: Alert + + + Overview + + The alert service defines the structures and patterns for the publishing and monitoring of alerts. The alert service uses COM event service to monitor and publish alert events. + The generation of alerts can be controlled using the enableGeneration operation, which supports the use of groups. Groups must reference either other groups or alerts only. + Alert definitions are maintained using the operations defined in this service but storage of definitions is delegated to the COM archive. + + Table + + STYLEREF "Heading 1"\l \n \t \* MERGEFORMAT 1 SEQ Table \s 1 1tc \f T " + 1 + - SEQ Table_TOC \s 1 1 + Alert Service Operations + " + : Alert Service Operations + + + + + + + + + + + + + + + + + + + + + + Area Identifier + Service Identifier + Area Number + Service Number + Area Version + + + MC + Alert + 4 + 3 + 1 + + + Interaction Pattern + Operation Identifier + Operation Number + Capability Set + + + REQUEST + HYPERLINK \l "OPERATION_3_enableGeneration" enableGeneration + 1 + 1 + + + REQUEST + HYPERLINK \l "OPERATION_3_listDefinition" listDefinition + 2 + 2 + + + REQUEST + HYPERLINK \l "OPERATION_3_addAlert" addAlert + 3 + 3 + + + REQUEST + HYPERLINK \l "OPERATION_3_updateDefinition" updateDefinition + 4 + + + + SUBMIT + HYPERLINK \l "OPERATION_3_removeAlert" removeAlert + 5 + + + + + Service-level Requirements + + The alert service shall provide: + the capability for reporting of alerts; + the capability for controlling reporting of alerts; + the capability for maintaining the list of alert definitions. + The alert reporting service shall provide the capability to enable and disable the generation of alert reports. + It shall be possible to update, delete, and add alert definitions. + The list of the alert definitions may be requested. + The generation of alerts shall be controlled by the generationEnabled Boolean value in the AlertDefinitionDetails. + Setting the generationEnabled field to TRUE shall enable generation of instances of that alert. + The generationEnabled value can be set by using either the enableGeneration or updateDefinition operations. + The alert instances shall be published as events using the COM event operations. + + COM usage + + Each alert of a provider shall be represented by an AlertIdentity COM object. + The body of the AlertIdentity COM object shall hold the name of the alert. + The definitions of the alerts shall be represented as AlertDefinition COM objects. + Instances of an alert shall be represented as an AlertEvent COM event. + The AlertDefinition object shall use the related link to indicate which AlertIdentity object it uses. + The AlertEvent object shall use the related link to indicate which AlertDefinition object it uses. + The source link of the AlertIdentity object should be the object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used. + The source link of the AlertDefinition object should be the object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used. + + Table + + STYLEREF "Heading 1"\l \n \t \* MERGEFORMAT 1 SEQ Table \s 1 1tc \f T " + 1 + - SEQ Table_TOC \s 1 1 + Alert Service Object Types + " + : Alert Service Object Types + + + + + + + + + + + + + + + + + + + + + + Object Number + Object Name + Object Body Type + Related link + Source link + + + 1 + AlertIdentity + Identifier + Set to NULL + The object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used + + + 2 + AlertDefinition + HYPERLINK \l "DATATYPE_AlertDefinitionDetails" AlertDefinitionDetails + 1 + The object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used + + + + COM Event Service usage + + When an alert is generated it shall be represented as a COM event. + The event shall be published using the COM event service. + The source link of the AlertEvent object shall be the object that caused the event to be generated. + + Table + + STYLEREF "Heading 1"\l \n \t \* MERGEFORMAT 1 SEQ Table \s 1 1tc \f T " + 1 + - SEQ Table_TOC \s 1 1 + Alert Service Events + " + : Alert Service Events + + + + + + + + + + + + + + + + + + + + + + Object Number + Event Name + Object Body Type + Related link + Source link + + + 3 + AlertEvent + HYPERLINK \l "DATATYPE_AlertEventDetails" AlertEventDetails + 2 + The object that caused the event to be generated + + + + COM Object Relationships + + The Figure below shows the COM object and event relationships for this service: + + Figure + + STYLEREF "Heading 1"\l \n \t \* MERGEFORMAT 1 SEQ Figure \s 1 1tc \f T " + 1 + - SEQ Figure_TOC \s 1 1 + Alert Service COM object and event relationships + " + : Alert Service COM object and event relationships + + + COM Archive Service usage + + AlertIdentity and AlertDefinition objects should be stored in the COM archive. + When an alert event is published, the AlertEvent object should be stored in the COM archive by the publisher. + + + Operation: enableGeneration + + + Overview + + The enableGeneration operation allows a consumer to control whether updates for specific alerts are generated or not. The operation allows the consumer to select the alerts directly or indirectly using groups. + + + + + + + + + + + + + + + + + + + + Operation Identifier + enableGeneration + + + Interaction Pattern + REQUEST + + + Pattern Sequence + Message + Nullable + Type Signature + + + IN + REQUEST + YesYes + Boolean isGroupIdsList<COM::InstanceBooleanPair> enableInstances + + + OUT + RESPONSE + Yes + List<Long> newObjInstIds + + + + Type Signature Details + + isGroupIds - If the isGroupIds field is TRUE then the enableInstances field shall contain GroupIdentity object instance identifiers, otherwise the field contains AlertIdentity object instance identifiers. +The AlertIdentity objects referenced, either directly or indirectly via groups, by the enableInstances field shall be the AlertIdentity objects to match. +The id of the enableInstances field shall support the wildcard value of '0' and matches all AlertIdentity objects of the provider. +The service provider shall check for the wildcard value in the list of object instance identifiers in the enableInstances field first and if found no other checks of supplied object instance identifiers shall be made. +If the enableInstances field contains a value of TRUE then instances of matching AlertIdentity objects shall be generated, a value of FALSE requests that instances will not be generated. +No error shall be raised if the enableInstances Boolean value supplied is the same as the current generationEnabled field for an alert object i.e. enabling an already enabled alert will not result in an error. +If a requested AlertIdentity or GroupIdentity object is unknown then an UNKNOWN error shall be returned. +If a requested Group, or the Group objects referenced by that Group, does not contain AlertIdentity objects then an INVALID error shall be returned. +If an error is raised then no modifications shall be made as a result of this operation call. +The provider shall create and store a new AlertDefinition object in the COM archive if the generationEnabled field is changed. +If a new AlertDefinition object is created then that new object shall be the current AlertDefinition used for the specific AlertIdentity. + enableInstances - + newObjInstIds - The response shall contain the list of object instance identifiers for the new AlertDefinition objects. + + Requirements + + + MO Errors + + The operation may return one of the following errors: + INVALID: One of the supplied groups is either not a group of groups or a group of AlertIdentity objects. + UNKNOWN: One or more of the requested alerts or group objects is unknown. + + + + + + + + + + + + + + + + + + + + Error + Error # + ExtraInfo Type + ExtraInfo description + + + INVALID + Defined in COM + List<UInteger> + The extra information field contains a list of the indexes of the erroneous values from the originating list supplied. + + + UNKNOWN + Defined in MAL + List<UInteger> + A list of the indexes of the error values shall be contained in the extra information field. + + + + + Operation: listDefinition + + + Overview + + The listDefinition operation allows a consumer to request the latest object instance identifiers of the AlertIdentity and AlertDefinition objects for the supported alerts of the provider. + + + + + + + + + + + + + + + + + + + + Operation Identifier + listDefinition + + + Interaction Pattern + REQUEST + + + Pattern Sequence + Message + Nullable + Type Signature + + + IN + REQUEST + Yes + List<Identifier> alertNames + + + OUT + RESPONSE + Yes + List< HYPERLINK \l "DATATYPE_ObjectInstancePair" ObjectInstancePair> alertObjInstIds + + + + Type Signature Details + + alertNames - The alertNames field shall contain a list of alert names to retrieve the AlertIdentity and AlertDefinition object instance identifiers for. +The alertNames field may contain the wildcard value of '*' to return all supported AlertIdentity and AlertDefinition objects. +The wildcard value should be checked for first, if found no other checks of supplied identifiers shall be made. +If a provided identifier does not include a wildcard and does not match an existing AlertIdentity object then this operation shall fail with an UNKNOWN error. + alertObjInstIds - The response shall contain a list of matching AlertIdentity and AlertDefinition object instance identifiers. +The returned list shall maintain the same order as the submitted list unless the wildcard value was included in the request. + + Requirements + + + MO Errors + + The operation may return the following error: + UNKNOWN: One of the supplied identifiers is unknown. + + + + + + + + + + + + + + + + + + + + Error + Error # + ExtraInfo Type + ExtraInfo description + + + UNKNOWN + Defined in MAL + List<UInteger> + A list of the indexes of the error values shall be contained in the extra information field. + + + + + Operation: addAlert + + + Overview + + The addAlert operation allows a consumer to define one or more alerts that do not currently exist. + The new AlertIdentity and AlertDefinition objects are expected to be stored in the COM archive by the provider of the alert service. + + + + + + + + + + + + + + + + + + + + Operation Identifier + addAlert + + + Interaction Pattern + REQUEST + + + Pattern Sequence + Message + Nullable + Type Signature + + + IN + REQUEST + Yes + List< HYPERLINK \l "DATATYPE_AlertCreationRequest" AlertCreationRequest> alertDefDetails + + + OUT + RESPONSE + Yes + List< HYPERLINK \l "DATATYPE_ObjectInstancePair" ObjectInstancePair> newObjInstIds + + + + Type Signature Details + + alertDefDetails - The alertDefDetails field shall hold the name and the AlertDefinitionDetails to be added. +The name field must not be the wildcard '*', or empty (an INVALID error shall be returned in this case). +The supplied name must be unique among all AlertIdentity objects for the domain of the provider otherwise a DUPLICATE error shall be raised. +If an error is raised then no new identities and definitions shall be added as a result of this operation call. +If the supplied name matches an existing, but removed, AlertIdentity then that AlertIdentity shall be reused otherwise a new AlertIdentity shall be created. +The provider shall create a new AlertDefinition object and store it, and any new AlertIdentity objects, in the COM archive. + newObjInstIds - The response shall contain the list of object instance identifiers for the AlertIdentity and new AlertDefinition objects. +The returned list shall maintain the same order as the submitted definitions. + + Requirements + + + MO Errors + + The operation may return one of the following errors: + DUPLICATE: One or more of the AlertIdentity objects being added has supplied an alert name that is already in use in the domain. + INVALID: One of the supplied AlertIdentity objects contains an invalid name. + + + + + + + + + + + + + + + + + + + + Error + Error # + ExtraInfo Type + ExtraInfo description + + + DUPLICATE + Defined in COM + List<UInteger> + The extra information field contains a list of the indexes of the erroneous values from the originating request list. + + + INVALID + Defined in COM + List<UInteger> + The extra information field contains a list of the indexes of the erroneous values from the originating list supplied. + + + + + Operation: updateDefinition + + + Overview + + The updateDefinition operation allows a consumer to update a definition for one or more alerts. + This differs from deleting an existing alert and adding a new definition with the same alert name in the fact that the AlertIdentity object is not changed between the two definitions. + The replacement definition should be stored in the COM archive by the service provider. The operation does not remove the previous object from the COM archive, merely removes the object from the provider. + + + + + + + + + + + + + + + + + + + + Operation Identifier + updateDefinition + + + Interaction Pattern + REQUEST + + + Pattern Sequence + Message + Nullable + Type Signature + + + IN + REQUEST + YesYes + List<Long> alertObjInstIdsList< HYPERLINK \l "DATATYPE_AlertDefinitionDetails" AlertDefinitionDetails> alertDefDetails + + + OUT + RESPONSE + Yes + List<Long> newObjInstIds + + + + Type Signature Details + + alertObjInstIds - The alertObjInstIds field shall contain the object instance identifiers of the AlertIdentity objects to be updated. +The supplied object instance identifiers shall match existing identity objects, an UNKNOWN error shall be raised if this is not the case. +If the alertObjInstIds list contains either NULL or '0' an INVALID error shall be raised. + alertDefDetails - The alertDefDetails field shall contain the replacement AlertDefinitionDetails. +The two lists shall be ordered the same. +The number of entries in the two lists shall be the same size otherwise an INVALID error shall be returned. +If an error is raised then no definitions shall be updated as a result of this operation call. +The provider shall create a new AlertDefinition object and store it in the COM archive. +The new AlertDefinition object shall be the current AlertDefinition used for the specific AlertIdentity. + newObjInstIds - The response shall contain the list of object instance identifiers for the new AlertDefinition objects. +The returned list shall maintain the same order as the submitted definitions. + + Requirements + + + MO Errors + + The operation may return one of the following errors: + INVALID: One of the supplied AlertDefinition objects contains an invalid value or the two supplied lists are not the same length. + INVALID: If the two lists are not the same length then the extra information field shall contain the first index of the element in the largest list which does not have corresponding element in the other list. + UNKNOWN: One of the supplied AlertIdentity object instance identifiers is unknown. + + + + + + + + + + + + + + + + + + + + Error + Error # + ExtraInfo Type + ExtraInfo description + + + INVALID + Defined in COM + List<UInteger> + The extra information field contains a list of the indexes of the erroneous values from the originating list supplied. + + + UNKNOWN + Defined in MAL + List<UInteger> + A list of the indexes of the error values shall be contained in the extra information field. + + + + + Operation: removeAlert + + + Overview + + The removeAlert operation allows a consumer to remove one or more definitions from the list of alerts supported by the alert provider. + The operation does not remove the AlertIdentity or AlertDefinition objects from the COM archive, merely removes the objects from the provider. This permits existing AlertEvent objects to continue to reference the correct AlertDefinition object in the COM archive. + + + + + + + + + + + + + + + + + + + + Operation Identifier + removeAlert + + + Interaction Pattern + SUBMIT + + + Pattern Sequence + Message + Nullable + Type Signature + + + IN + SUBMIT + Yes + List<Long> alertInstIds + + + + Type Signature Details + + alertInstIds - The alertInstIds field shall hold the object instance identifiers of the AlertIdentity objects to be removed from the provider. +The list may contain the wildcard value of '0'. +The wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made. +If a provided AlertIdentity object instance identifier does not include a wildcard and does not match an existing AlertIdentity object then this operation shall fail with an UNKNOWN error. +Matched AlertIdentity objects shall not be removed from the COM archive only the list of AlertIdentity objects in the provider. +If an error is raised then no alerts shall be removed as a result of this operation call. +If the operation succeeds then the provider shall not publish AlertEvent events for the deleted AlertIdentity objects anymore. + + Requirements + + + MO Errors + + The operation may return the following error: + UNKNOWN: One of the supplied AlertIdentity object instance identifiers is unknown. + + + + + + + + + + + + + + + + + + + + Error + Error # + ExtraInfo Type + ExtraInfo description + + + UNKNOWN + Defined in MAL + List<UInteger> + A list of the indexes of the error values shall be contained in the extra information field. + + + + + Service: Check + + + Overview + + The check service allows the user to monitor and control the checking of parameters values against check definitions including limit sets. Violations of these defined checks are published using the COM event service. + The check service allows the consumer to define checks and then link the check definition to a parameter to be monitored. Figure 3-6 shows the nominal sequence of operations for the check service: + ---- check sequence diag ---- + Check service nominal sequence + A consumer first subscribes for check events before linking some already existing checks to some parameters. The figure shows how check evaluation is normally triggered by either a periodic interval or a change in a monitored value, however, the service also supports the optional ability for consumers to trigger the evaluation of checks using the triggerCheck operation. Finally, if a check event has not been generated for a configurable period of time, known as the maximum reporting interval, an event is generated regardless of whether the check is in violation or not. This maximum reporting interval supports the situation where regular confirmation of the non-violating state of a check is required. + The list of currently violating checks can be obtained using the getCurrentTransitionList operation; to get a full report including non-violating checks the getSummaryReport operation should be used. + The following figure (3-7) shows the flow chart for determining the status of a check: + --- check state diag --- + Flow Chart for Determining the Status of a Check + Each time a check is evaluated, the procedure indicated in the flow chart depicted in figure 3-7 is performed to calculate the check result. Each check link can have a condition included which determines whether the check should be applied or not; this allows several checks to be associated to a single parameter and applied in different conditions. + The service defines five basic check types, constant, reference, delta, limit, and compound. A constant check is used to ensure that a parameter value either does not change or does not change from a set of specific values. + In the Reference and Delta checks, a value is compared against another value which serves as a reference value. The reference value can be taken from either another parameter or the parameter being checked, and can be the previous value or a value in the past, specified by using a delta time in the ReferenceValue composite. This does not affect the logic of the flow chart above. + Limit checks monitor parameters to see if the parameter value is either inside or outside a range of values. + The final check type, compound, monitors a set of previously defined checks and only violates when a specified number of those monitored checks violate themselves. + The service only publishes check results (as check transition events) when either the result changes from the previous value (for example a check starts to violate), or the maximum reporting interval expires. This reduces the amount of 'no change' reporting data being distributed. For situations where regular reporting of the check result is required, even when no change is detected, a low maximum reporting interval value should be specified. + + Table + + STYLEREF "Heading 1"\l \n \t \* MERGEFORMAT 1 SEQ Table \s 1 1tc \f T " + 1 + - SEQ Table_TOC \s 1 1 + Check Service Operations + " + : Check Service Operations + + + + + + + + + + + + + + + + + + + + + + Area Identifier + Service Identifier + Area Number + Service Number + Area Version + + + MC + Check + 4 + 4 + 1 + + + Interaction Pattern + Operation Identifier + Operation Number + Capability Set + + + PROGRESS + HYPERLINK \l "OPERATION_4_getCurrentTransitionList" getCurrentTransitionList + 1 + 1 + + + PROGRESS + HYPERLINK \l "OPERATION_4_getSummaryReport" getSummaryReport + 2 + + + + SUBMIT + HYPERLINK \l "OPERATION_4_enableService" enableService + 3 + 2 + + + REQUEST + HYPERLINK \l "OPERATION_4_getServiceStatus" getServiceStatus + 4 + + + + SUBMIT + HYPERLINK \l "OPERATION_4_enableCheck" enableCheck + 5 + 3 + + + SUBMIT + HYPERLINK \l "OPERATION_4_triggerCheck" triggerCheck + 6 + 4 + + + REQUEST + HYPERLINK \l "OPERATION_4_listDefinition" listDefinition + 7 + 5 + + + REQUEST + HYPERLINK \l "OPERATION_4_listCheckLinks" listCheckLinks + 8 + + + + REQUEST + HYPERLINK \l "OPERATION_4_addCheck" addCheck + 9 + 6 + + + REQUEST + HYPERLINK \l "OPERATION_4_updateDefinition" updateDefinition + 10 + + + + SUBMIT + HYPERLINK \l "OPERATION_4_removeCheck" removeCheck + 11 + + + + REQUEST + HYPERLINK \l "OPERATION_4_addParameterCheck" addParameterCheck + 12 + 7 + + + SUBMIT + HYPERLINK \l "OPERATION_4_removeParameterCheck" removeParameterCheck + 13 + + + + + Service-level Requirements + + The check service shall provide: + the capability for reporting the check transitions; + the capability for requesting the latest check transitions; + the capability for controlling the global check evaluation; + the capability for controlling the individual check reporting; + the capability for triggering the evaluation of checks; + the capability for adding check definitions; + the capability for modifying check definitions; + the capability for removing check definitions; + the capability for listing check definitions; + the capability for modifying the association of checks to parameters. + The check service shall use the event service for issuing the corresponding event generated by the check service. + The check may support the evaluation of the following check types: + Constant check; + Reference check; + Delta check; + Limit check; + Compound check. + When performing a limit check, the check service shall: + check that the value of a parameter lies within or on a pair of limit values if set to violate outside the range, or outside a pair of limits if set to violate in range; + declare the check successful when the expression evaluates to true for the correct number of successive valid samples. + When performing a constant check, the check service shall: + check that the parameter value evaluates to one of the expected values; + declare the check successful when the expression evaluates to true for the correct number of successive valid samples. + When performing a referenced check, the check service shall: + check that the parameter value evaluates to the referenced value; + declare the check successful when the expression evaluates to true for the correct number of successive valid samples. + When performing a delta check, the check service shall: + calculate the difference, i.e., the delta value, as either an absolute or percentage depending on the check definition between two parameter values; + check that the difference lies within or on a pair of threshold values if set to violate in range, or outside a pair of thresholds if set to violate outside the range; + declare the check successful when the expression evaluates to true for the correct number of successive valid samples. + When performing a compound check, the check service shall: + monitor the check links referenced by the compound check definition and count the number of referenced checks in violation; + declare the compound check violated when the number of referenced checks in violation equals or exceeds the defined count value. + The check service shall provide the capability to process several check definitions for the same parameter. + Each check definition shall contain: + the identifier of the check definition; + the description of the check definition; + the details specific to that check type. + A check definition shall be applied to a specific parameter using a check link. + Each check link shall contain: + the identifier of the check definition to use; + the identifier of the parameter to monitor; + a Boolean that controls whether the check is evaluated; + a Boolean that indicates whether the check should be evaluated when the parameter value changes; + a Boolean indicating whether the check should apply to the raw or converted value; + the checking interval; + an optional check validity condition that yielding false prevents the check being performed. + Each check validity condition shall contain: + the identifier of a parameter to use as a validity parameter; + an expression operator; + a Boolean indicating whether the expression should apply to the raw or converted value; + a value to evaluate against. + Global check evaluation shall be controlled by the enableService operation. + Disabling the check service globally shall pause all check evaluations. + Enabling the check service globally shall resume all check evaluations as they were when they were paused. + The addParameterCheck operation shall be used to create a link between a check definition and the parameter to be checked. + Individual check evaluation shall be controlled by the checkEnabled Boolean value in the CheckLinkDefinition object. + Setting the checkEnabled field to TRUE shall enable check evaluation for a specific CheckLink object. + The checkEnabled value may be set by using the enableCheck operation. + If the checkOnChange value is TRUE, any change in the state (such as validity becoming VALID) or value of a parameter shall cause an evaluation of the parameter value against the check. + If the checkOnChange value is TRUE, any change in the state (such as validity becoming VALID) or the value of the parameter referenced by a check condition shall cause an evaluation of the parameter value against the check. + If a check is required to be evaluated periodically, then the time between these evaluations shall be controlled using the checkInterval Duration value in the CheckLinkDefinition object. + For periodic check evaluations to occur the checkOnChange value must be FALSE, it is not possible to request periodic and change based checking concurrently. + A checkInterval value of '0' shall mean that no periodic check evaluation shall be performed, and checks will be triggered by another mechanism in this case. + The checkInterval value shall only be set when the CheckLinkDefinition object is created. + If a checkInterval or maxReportingInterval that is not supported by the provider is requested (both on creation and update of the check), then an INVALID error shall be returned, and the change shall be rejected. + The check shall be evaluated if the CheckLink object is enabled, the check condition as defined in the check link evaluates to TRUE, and the checked parameter is in a valid state. + The triggerCheck operation shall trigger a check evaluation and immediately publish the result in a CheckTransition event if the check violates. + If the latest CheckResult cannot be determined, for example a getSummaryReport operation call for a CheckLink object that has not been evaluated yet, the associated CheckResult shall contain UNCHECKED for the check states and a checked value of NULL. + In a CheckDefinitionDetails only one of nominalTime and nominalCount is permitted to be zero, an INVALID error shall be returned from the addCheck or updateDefinition operation if this is not the case. + In a CheckDefinitionDetails only one of violationTime and violationCount is permitted to be zero, an INVALID error shall be returned from the addCheck or updateDefinition operation if this is not the case. + If nominalTime is not zero, only when the nominalCount number of valid samples including the current one over a nominalTime time period of the checked parameter have passed the check evaluation shall a new check state and check result be calculated. + If nominalTime is zero, only when the nominalCount number of successive valid samples including the current one of the checked parameter have passed the check evaluation shall a new check state and check result be calculated. + If nominalTime is not zero, but nominalCount is zero, a new check result is always calculated (which then has a new timestamp). + If violationTime is not zero, only when the violationCount number of valid samples including the current one over a violationTime time period of the checked parameter have failed the check evaluation shall a new check state and check result be calculated. + If violationTime is zero, only when the violationCount number of successive valid samples including the current one of the checked parameter have failed the check evaluation shall a new check state and check result be calculated. + If violationTime is not zero, but violationCount is zero, a new check result is always calculated (which then has a new timestamp). + For reference and delta checks it shall be possible to define the check to compare against a reference value. + The reference value checked against shall be updated once validCount samples of that referenced parameter exist at deltaTime in the past from time now. + For a delta check, the delta value shall be calculated as the difference between the reference value and the check parameter and supports both positive and negative deltas. + For percentage based delta thresholds, the percentage is calculated as the arithmetic difference between the parameter value and the reference value, as a percentage of the first valid sample where the result of the calculation equal to 1.0 is interpreted as 100 per cent. For example, if the parameter value is 14 and the reference value is 8 then the calculation is (14 - 8) / 8 or 0.75 or 75%. + For percentage based delta thresholds, if reference value is zero then a divide by zero condition will occur, implementations shall detect this and the calculated delta will be +/- the maximum Float value. + For a constant check, the result of the constant check shall be declared successful only if the parameter value passes evaluation against one of constant values in the definition. + For a compound check, if the minimumChecksInViolation field is greater than '0', the result of the compound check shall be declared successful only if the count of referenced CheckLink objects currently in violation is less than the minimumChecksInViolation field. + For a compound check, if the minimumChecksInViolation field is set to '0', the result of the compound check shall be declared successful if any of the referenced CheckLink objects is nominal i.e. not currently in violation. + If the maxReportingInterval is not zero and if a CheckResult has not been generated in that time a CheckResult with the current check states shall be generated. + The maxReportingInterval value shall be set by using the updateDefinition operation. + Each transition in the state or the result of a check shall cause the generation of a CheckResult and a CheckTransition event. + + COM usage + + Each check of a provider shall be represented by a CheckIdentity COM object. + The body of the CheckIdentity COM object shall hold the name of the check. + The check definition details shall be represented as one of the specific check definition COM objects (ConstantCheck, ReferenceCheck, DeltaCheck, LimitCheck, CompoundCheck). + The check definition object (ConstantCheck, ReferenceCheck, DeltaCheck, LimitCheck, CompoundCheck) shall use the related link to indicate which CheckIdentity object it uses. + The link between which parameters are being evaluated for each check shall be represented as CheckLink COM objects. + The CheckLink object shall use the related link to indicate which CheckIdentity object it uses. + If the CheckLink belongs to a compound check then the source link shall be set to NULL. + If the CheckLink object does not belong to a compound check then the source link shall be used to indicate which ParameterIdentity object it is checking. + The definitions of the check links shall be represented as CheckLinkDefinition COM objects. + The CheckLinkDefinition object shall use the related link to indicate which CheckLink object it defines. + Changes in the state or result of a check shall be represented as CheckTransition COM events. + The CheckTransition event objects shall use the related link to indicate which CheckLinkDefinition object it uses. + The CheckTransition event objects shall use the source link to indicate what object (if any) caused it to be evaluated, most likely the relevant ParameterValueInstance object or the COM OperationActivity object of a triggerCheck operation. + In the case of the maximum reporting interval expiring, the source link of the CheckTransition event object shall be set to NULL. + + Table + + STYLEREF "Heading 1"\l \n \t \* MERGEFORMAT 1 SEQ Table \s 1 1tc \f T " + 1 + - SEQ Table_TOC \s 1 1 + Check Service Object Types + " + : Check Service Object Types + + + + + + + + + + + + + + + + + + + + + + Object Number + Object Name + Object Body Type + Related link + Source link + + + 1 + CheckIdentity + Identifier + Set to NULL + Set to NULL + + + 2 + CheckLink + No body + 1 + Parameter::1 + + + 3 + CheckLinkDefinition + HYPERLINK \l "DATATYPE_CheckLinkDetails" CheckLinkDetails + 2 + Set to NULL + + + 5 + ConstantCheck + HYPERLINK \l "DATATYPE_ConstantCheckDefinition" ConstantCheckDefinition + 1 + Set to NULL + + + 6 + ReferenceCheck + HYPERLINK \l "DATATYPE_ReferenceCheckDefinition" ReferenceCheckDefinition + 1 + Set to NULL + + + 7 + DeltaCheck + HYPERLINK \l "DATATYPE_DeltaCheckDefinition" DeltaCheckDefinition + 1 + Set to NULL + + + 8 + LimitCheck + HYPERLINK \l "DATATYPE_LimitCheckDefinition" LimitCheckDefinition + 1 + Set to NULL + + + 9 + CompoundCheck + HYPERLINK \l "DATATYPE_CompoundCheckDefinition" CompoundCheckDefinition + 1 + Set to NULL + + + + COM Event Service usage + + When a check is evaluated and its state changes, the change in state shall be represented as CheckTransition COM events. + When the maximum reporting interval expires the generated check result shall be represented as CheckTransition COM event. + + Table + + STYLEREF "Heading 1"\l \n \t \* MERGEFORMAT 1 SEQ Table \s 1 1tc \f T " + 1 + - SEQ Table_TOC \s 1 1 + Check Service Events + " + : Check Service Events + + + + + + + + + + + + + + + + + + + + + + Object Number + Event Name + Object Body Type + Related link + Source link + + + 4 + CheckTransition + HYPERLINK \l "DATATYPE_CheckResult" CheckResult + 3 + The object that caused the check evaluation to occur, most likely the relevant ParameterValueInstance object, but also be the COM OperationActivity object of a triggerCheck operation or NULL in the case of the maximum reporting interval expiring. + + + + COM Object Relationships + + The Figure below shows the COM object and event relationships for this service: + + Figure + + STYLEREF "Heading 1"\l \n \t \* MERGEFORMAT 1 SEQ Figure \s 1 1tc \f T " + 1 + - SEQ Figure_TOC \s 1 1 + Check Service COM object and event relationships + " + : Check Service COM object and event relationships + + + COM Archive Service usage + + CheckIdentity objects should be stored in the COM archive. + The COM objects that hold the check definition details (such as ConstantCheck, ReferenceCheck, DeltaCheck, LimitCheck, CompoundCheck) should be stored in the COM archive. + CheckLink objects should be stored in the COM archive. + CheckLinkDefinition objects should be stored in the COM archive. + When a check transition event is published, the event should be stored in the COM archive. + + + Operation: getCurrentTransitionList + + + Overview + + The getCurrentTransitionList operation allows a consumer to obtain the latest result of a number of checks filtering on check state. + + + + + + + + + + + + + + + + + + + + Operation Identifier + getCurrentTransitionList + + + Interaction Pattern + PROGRESS + + + Pattern Sequence + Message + Nullable + Type Signature + + + IN + PROGRESS + Yes + HYPERLINK \l "DATATYPE_CheckResultFilter" CheckResultFilter filter + + + OUT + ACK + - + - + + + OUT + UPDATE + Yes + List< HYPERLINK \l "DATATYPE_CheckResultSummary" CheckResultSummary> updateSummaries + + + OUT + RESPONSE + Yes + List< HYPERLINK \l "DATATYPE_CheckResultSummary" CheckResultSummary> responseSummaries + + + + Type Signature Details + + filter - The filter field shall contain a set of object instance identifiers for which the check result is required. +If the checkFilterViaGroups field is TRUE then the checkFilter field shall contain GroupIdentity object instance identifiers, otherwise the field contains CheckIdentity object instance identifiers. +The CheckIdentity objects referenced, either directly or indirectly via groups, by the checkFilter field shall be the CheckIdentity objects to match. +The checkFilter field shall support the wildcard value of '0' and shall match all CheckIdentity objects of the provider. +The service provider shall check for the wildcard value in the list of object instance identifiers in the checkFilter field first and if found no other checks of supplied CheckIdentity object instance identifiers shall be made. +If the parameterFilterViaGroups field is TRUE then the parameterFilter field shall contain GroupIdentity object instance identifiers, otherwise the field contains ParameterIdentity object instance identifiers. +The ParameterIdentity objects referenced, either directly or indirectly via groups, by the parameterFilter field shall be the ParameterIdentity objects to match. +The parameterFilter field shall support the wildcard value of '0' and shall match all ParameterIdentity objects of the provider. +The service provider shall check for the wildcard value in the list of object instance identifiers in the parameterFilter field first and if found no other checks of supplied ParameterIdentity object instance identifiers shall be made. +If a referenced GroupIdentity object is unknown then an UNKNOWN error shall be returned. +If a requested Group, or the Group objects referenced by that Group, does not contain CheckIdentity objects for the checkFilter or ParameterIdentity for the parameterFilter then an INVALID error shall be returned. +If a referenced CheckIdentity object, either directly or indirectly via groups, is unknown then an UNKNOWN error shall be returned. +If a referenced ParameterIdentity object, either directly or indirectly via groups, is unknown then an UNKNOWN error shall be returned. +The filter field shall also contain a list of CheckState enumerations of which states to filter on. +The supplied lists shall be AND'd together to form the complete filter. +If a CheckLink object matches the CheckIdentity filter, and the ParameterIdentity filter, and its state matches any of the supplied CheckState enumerations, then its latest CheckResult value shall be returned. +To report all checks, the wildcard values may be used in the CheckResultFilter. + updateSummaries - The returned list shall contain an entry for each matched check returning the object instance identifier and the latest CheckResult for that CheckLink object. + responseSummaries - The PROGRESS pattern is used to allow the possibly large list of filtered check results to be split into several updates. +The size of the lists returned in each update and final response is implementation specific. + + Requirements + + + MO Errors + + The operation may return one of the following errors: + INVALID: One of the referenced groups does not contain the correct type of object. + UNKNOWN: One or more of the checks, parameters, or groups specified in the list do not exist. + + + + + + + + + + + + + + + + + + + + Error + Error # + ExtraInfo Type + ExtraInfo description + + + INVALID + Defined in COM + List<UInteger> + The extra information field contains a list of the indexes of the erroneous values from the originating list supplied. + + + UNKNOWN + Defined in MAL + List<UInteger> + A list of the indexes of the error values shall be contained in the extra information field. + + + + + Operation: getSummaryReport + + + Overview + + The getSummaryReport operation allows a consumer to obtain the status of a number of checks and the result of any check evaluations linked to them. + + + + + + + + + + + + + + + + + + + + Operation Identifier + getSummaryReport + + + Interaction Pattern + PROGRESS + + + Pattern Sequence + Message + Nullable + Type Signature + + + IN + PROGRESS + Yes + List<Long> objInstIds + + + OUT + ACK + - + - + + + OUT + UPDATE + YesYes + Long updateObjInstIdsList< HYPERLINK \l "DATATYPE_CheckResultSummary" CheckResultSummary> updateSummaries + + + OUT + RESPONSE + YesYes + Long responseObjInstIdsList< HYPERLINK \l "DATATYPE_CheckResultSummary" CheckResultSummary> responseSummaries + + + + Type Signature Details + + objInstIds - The objInstIds field shall hold one or more CheckIdentity object instance identifiers of which a check report is required. +A wildcard value of '0' shall report on all checks. +The wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made. +If a requested check is unknown then an UNKNOWN error shall be returned in the ACKNOWLEDGE message and the operation shall end. + updateObjInstIds - The returned updates and final response shall contain an entry for each requested CheckIdentity. +The first part of the update shall be the CheckIdentity object instance identifier. +The second part shall be the list of all CheckLink object instance identifiers and CheckResults associated with that CheckIdentity. + updateSummaries - + responseObjInstIds - + responseSummaries - + + Requirements + + + MO Errors + + The operation may return the following error: + UNKNOWN: One or more of the checks specified in the list do not exist. + + + + + + + + + + + + + + + + + + + + Error + Error # + ExtraInfo Type + ExtraInfo description + + + UNKNOWN + Defined in MAL + List<UInteger> + A list of the indexes of the error values shall be contained in the extra information field. + + + + + Operation: enableService + + + Overview + + The enableService operation allows a consumer to globally control whether evaluation of all checks is performed or not. + It should be noted that no check reports will be generated if the service provider has been disabled via the enableService operation. + + + + + + + + + + + + + + + + + + + + Operation Identifier + enableService + + + Interaction Pattern + SUBMIT + + + Pattern Sequence + Message + Nullable + Type Signature + + + IN + SUBMIT + Yes + Boolean enableService + + + + Type Signature Details + + enableService - If enableService is set to TRUE the service shall be enabled and evaluation and reporting of check will commence. +If enableService is set to FALSE then all evaluation of checks shall be suspended and no check transitions will be reported. +If the enableService value matches the current enabled state of the service then no change shall be made and no error reported. Enabling an already enabled service has no effect. + + Requirements + + + MO Errors + + The operation does not return any errors. + + + Operation: getServiceStatus + + + Overview + + The getServiceStatus operation allows a consumer to determine the global check service enabled status. + + + + + + + + + + + + + + + + + + + + Operation Identifier + getServiceStatus + + + Interaction Pattern + REQUEST + + + Pattern Sequence + Message + Nullable + Type Signature + + + IN + REQUEST + - + - + + + OUT + RESPONSE + Yes + Boolean serviceEnabled + + + + Type Signature Details + + serviceEnabled - The operation shall return TRUE if the service is currently enabled or FALSE if the service is currently disabled. + + Requirements + + + MO Errors + + The operation does not return any errors. + + + Operation: enableCheck + + + Overview + + The enableCheck operation allows a consumer to control whether evaluation of a set of checks is performed or not. The operation allows the consumer to select the checks directly or indirectly using groups. + + + + + + + + + + + + + + + + + + + + Operation Identifier + enableCheck + + + Interaction Pattern + SUBMIT + + + Pattern Sequence + Message + Nullable + Type Signature + + + IN + SUBMIT + YesYes + Boolean isGroupIdsList<COM::InstanceBooleanPair> enableInstances + + + + Type Signature Details + + isGroupIds - If the isGroupIds field is TRUE then the enableInstances field shall contain GroupIdentity object instance identifiers, otherwise the field contains CheckLink object instance identifiers. +The CheckLink objects referenced, either directly or indirectly via groups, by the enableInstances field shall be the CheckLink objects to match. +The id of the enableInstances field shall support the wildcard value of '0' and matches all CheckLink objects of the provider. +The service provider shall check for the wildcard value in the list of object instance identifiers in the enableInstances field first and if found no other checks of supplied object instance identifiers shall be made. +If the enableInstances field contains a value of TRUE then evaluations of matching CheckLink objects shall be performed, a value of FALSE requests that evaluations will not be performed. +No error shall be raised if the enableInstances Boolean value supplied is the same as the current checkEnabled field for a CheckLink object i.e. enabling an already enabled check will not result in an error. +If a requested CheckLink or GroupIdentity object is unknown then an UNKNOWN error shall be returned. +If a requested Group, or the Group objects referenced by that Group, does not contain CheckLink objects then an INVALID error shall be returned. +If an error is raised then no modifications shall be made as a result of this operation call. +The provider shall create and store a new CheckLinkDefinition object in the COM archive if the checkEnabled field is changed. + enableInstances - If the check is being enabled, and the check is defined as being periodic in the check link definition, then the provider shall generate a check result immediately and start the checking interval from that check. + + Requirements + + + MO Errors + + The operation may return one of the following errors: + UNKNOWN: One or more of the requested groups or CheckLink objects is unknown. + INVALID: One of the supplied groups is not a group of either other group objects or CheckLink objects. + + + + + + + + + + + + + + + + + + + + Error + Error # + ExtraInfo Type + ExtraInfo description + + + UNKNOWN + Defined in MAL + List<UInteger> + A list of the indexes of the error values shall be contained in the extra information field. + + + INVALID + Defined in COM + List<UInteger> + The extra information field contains a list of the indexes of the erroneous values from the originating list supplied. + + + + + Operation: triggerCheck + + + Overview + + The triggerCheck operation allows a consumer to request the immediate evaluation of a number of checks. Any violations will cause appropriate events to be generated. + It should be noted that no check reports will be generated if the service provider has been disabled via the enableService operation. + + + + + + + + + + + + + + + + + + + + Operation Identifier + triggerCheck + + + Interaction Pattern + SUBMIT + + + Pattern Sequence + Message + Nullable + Type Signature + + + IN + SUBMIT + YesYes + List<Long> checkObjInstIdsList<Long> linkObjInstIds + + + + Type Signature Details + + checkObjInstIds - The checkObjInstIds field shall hold a list of CheckIdentity object instance identifiers to trigger the evaluation of all linked checks. + linkObjInstIds - The linkObjInstIds field shall hold a list of CheckLink object instance identifiers to trigger the evaluation of. +The wildcard value of '0' shall be permitted in either list. +The wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made. +If a requested CheckIdentity or CheckLink object is unknown then an UNKNOWN error shall be returned. +If an error is raised then no evaluations shall be made as a result of this operation call. +Either list may be empty in which case filtering on that aspect, check identity or specific check link, shall be ignored. +The two lists shall be combined using 'OR' logic, where a CheckLink is evaluated if the identity of a check is in the first list or if the link is directly listed in the second list. +Triggering a check shall ignore the nominalTime, nominalCount, violationTime and violationCount fields and requests an immediate evaluation of the checks. +Triggering a check during a periodic check shall not influence the periodic check (e.g. it does not reset the checkInterval timer, the successive valid samples that passed/violated the check or the maxReportingInterval timer). + + Requirements + + + MO Errors + + The operation may return the following error: + UNKNOWN: One or more of the requested CheckIdentity or CheckLink objects is unknown. + + + + + + + + + + + + + + + + + + + + Error + Error # + ExtraInfo Type + ExtraInfo description + + + UNKNOWN + Defined in MAL + List<UInteger> + A list of the indexes of the error values shall be contained in the extra information field. + + + + + Operation: listDefinition + + + Overview + + The listDefinition operation allows a consumer to request the latest object instance identifiers of the CheckIdentity and actual check definition objects for the supported checks of the provider. + + + + + + + + + + + + + + + + + + + + Operation Identifier + listDefinition + + + Interaction Pattern + REQUEST + + + Pattern Sequence + Message + Nullable + Type Signature + + + IN + REQUEST + Yes + List<Identifier> names + + + OUT + RESPONSE + Yes + List< HYPERLINK \l "DATATYPE_CheckTypedInstance" CheckTypedInstance> objInstIds + + + + Type Signature Details + + names - The names field shall hold a list of CheckIdentity names to retrieve the CheckIdentity and actual check definition object instance identifiers for. +The request may contain the wildcard value of '*' to return all supported check definitions. +The wildcard value should be checked for first, if found no other checks of supplied identifiers shall be made. +If a provided identifier does not include a wildcard and does not match an existing CheckIdentity object then this operation shall fail with an UNKNOWN error. + objInstIds - The response shall contain a list of matching CheckIdentity and actual check definition object instance identifiers and the actual check definition object type. +The returned list shall maintain the same order as the submitted list unless the wildcard value was included in the request. + + Requirements + + + MO Errors + + The operation may return the following error: + UNKNOWN: One of the supplied identifiers is unknown. + + + + + + + + + + + + + + + + + + + + Error + Error # + ExtraInfo Type + ExtraInfo description + + + UNKNOWN + Defined in MAL + List<UInteger> + A list of the indexes of the error values shall be contained in the extra information field. + + + + + Operation: listCheckLinks + + + Overview + + The listCheckLinks operation allows a consumer to request the object instance identifiers of the CheckLink objects for the checks of the provider. + + + + + + + + + + + + + + + + + + + + Operation Identifier + listCheckLinks + + + Interaction Pattern + REQUEST + + + Pattern Sequence + Message + Nullable + Type Signature + + + IN + REQUEST + Yes + List<Long> checkObjInstIds + + + OUT + RESPONSE + Yes + List< HYPERLINK \l "DATATYPE_CheckLinkSummary" CheckLinkSummary> chkLinkObjInstIds + + + + Type Signature Details + + checkObjInstIds - The checkObjInstIds field shall hold a list of CheckIdentity object instance identifiers to retrieve the CheckLink object instance identifiers for. +The request may contain the wildcard value of '0' to return all supported check links. +The wildcard value should be checked for first, if found no other checks of supplied identifiers shall be made. +If a provided identifier does not include a wildcard and does not match an existing CheckIdentity object then this operation shall fail with an UNKNOWN error. + chkLinkObjInstIds - The response shall contain a list of CheckLinkSummary that contain the object instance identifiers of the CheckLink, CheckIdentity, and ParameterIdentity for the matched CheckIdentity objects. + + Requirements + + + MO Errors + + The operation may return the following error: + UNKNOWN: One of the supplied identifiers is unknown. + + + + + + + + + + + + + + + + + + + + Error + Error # + ExtraInfo Type + ExtraInfo description + + + UNKNOWN + Defined in MAL + List<UInteger> + A list of the indexes of the error values shall be contained in the extra information field. + + + + + Operation: addCheck + + + Overview + + The addCheck operation allows a consumer to define one or more checks that do not currently exist. + The new CheckIdentity and actual check definition objects are expected to be stored in the COM archive by the provider of the check service. + + + + + + + + + + + + + + + + + + + + Operation Identifier + addCheck + + + Interaction Pattern + REQUEST + + + Pattern Sequence + Message + Nullable + Type Signature + + + IN + REQUEST + YesYes + List<String> checkNamesList< HYPERLINK \l "DATATYPE_CheckDefinitionDetails" CheckDefinitionDetails> checkDefDetails + + + OUT + RESPONSE + Yes + List< HYPERLINK \l "DATATYPE_ObjectInstancePair" ObjectInstancePair> newObjInstIds + + + + Type Signature Details + + checkNames - The checkNames field shall hold the names of the checks to be added. +The checkNames field must not contain NULL, the wildcard '*', or empty value (an INVALID error shall be returned in this case). +The supplied names must be unique among all CheckIdentity objects for the domain of the provider otherwise a DUPLICATE error shall be raised. + checkDefDetails - The checkDefDetails field shall hold the CheckDefinitionDetails to be added. +The two lists shall be ordered the same. +The number of entries in the two lists shall be the same size otherwise an INVALID error shall be raised. +Only one of nominalTime and nominalCount is permitted to be zero, an INVALID error shall be returned if this is not the case. +Only one of violationTime and violationCount is permitted to be zero, an INVALID error shall be returned if this is not the case. +If an error is raised then no new identities and definitions shall be added as a result of this operation call. +If the supplied name matches an existing, but removed, CheckIdentity then that CheckIdentity shall be reused otherwise a new CheckIdentity shall be created. +The provider shall create a new actual check definition object and store it, and any new CheckIdentity objects, in the COM archive. + newObjInstIds - The response shall contain the list of object instance identifiers for the CheckIdentity and new actual definition objects. +The returned list shall maintain the same order as the submitted definitions. + + Requirements + + + MO Errors + + The operation may return one of the following errors: + INVALID: One of the supplied CheckIdentity objects contains an invalid name or the two lists are not the same size or there is an inconsistency in the time and count fields. + INVALID: If the two lists are not the same length then the extra information field shall contain the first index of the element in the largest list which does not have corresponding element in the other list. + DUPLICATE: One or more of the CheckIdentity objects being added has supplied a check name that is already in use in the domain. + + + + + + + + + + + + + + + + + + + + Error + Error # + ExtraInfo Type + ExtraInfo description + + + INVALID + Defined in COM + List<UInteger> + The extra information field contains a list of the indexes of the erroneous values from the originating list supplied. + + + DUPLICATE + Defined in COM + List<UInteger> + The extra information field contains a list of the indexes of the erroneous values from the originating request list. + + + + + Operation: updateDefinition + + + Overview + + The updateDefinition operation allows a consumer to update a definition for one or more checks. + This differs from deleting an existing check and adding a new definition with the same check name in the fact that the CheckIdentity object is not changed between the two definitions. + The replacement definition should be stored in the COM archive by the service provider. The operation does not remove the previous object from the COM archive, merely removes the object from the provider. + The operation also cannot be used to update a check definition for a check that is currently being used i.e. has CheckLink objects linked to it. The CheckLink objects should first be removed using removeParameterCheck before calling this operation. + + + + + + + + + + + + + + + + + + + + Operation Identifier + updateDefinition + + + Interaction Pattern + REQUEST + + + Pattern Sequence + Message + Nullable + Type Signature + + + IN + REQUEST + YesYes + List<Long> checkInstIdsList< HYPERLINK \l "DATATYPE_CheckDefinitionDetails" CheckDefinitionDetails> checkDefDetails + + + OUT + RESPONSE + Yes + List<Long> newObjInstIds + + + + Type Signature Details + + checkInstIds - The checkInstIds field shall hold the object instance identifiers of the CheckIdentity objects to be updated. +If the checkInstIds list contains either NULL or '0' an INVALID error shall be raised. +The supplied object instance identifiers shall match existing identity objects, an UNKNOWN error shall be raised if this is not the case. +If the check to be updated is currently being used by a CheckLink object, a REFERENCED error shall be raised. + checkDefDetails - The checkDefDetails field shall contain the replacement CheckDefinitionDetails. +The two lists shall be ordered the same. +The number of entries in the two lists shall be the same size otherwise an INVALID error shall be raised. +Only one of nominalTime and nominalCount is permitted to be zero, an INVALID error shall be returned if this is not the case. +Only one of violationTime and violationCount is permitted to be zero, an INVALID error shall be returned if this is not the case. +If an error is raised then no definitions shall be updated as a result of this operation call. +The provider shall create new actual check definition objects and store them in the COM archive. +The new definition object shall be the current definition used for the specific CheckIdentity. + newObjInstIds - The response shall contain the list of object instance identifiers for the new check definition objects. +The returned list shall maintain the same order as the submitted definitions. + + Requirements + + + MO Errors + + The operation may return one of the following errors: + UNKNOWN: One of the supplied CheckIdentity object instance identifiers is unknown. + INVALID: The supplied object instance identifiers list contains either a NULL or '0', or the two lists do not contain the same number of entries or there is an inconsistency in the time and count fields. + INVALID: If the two lists are not the same length then the extra information field shall contain the first index of the element in the largest list which does not have corresponding element in the other list. + REFERENCED: One of the check objects is currently being used by a CheckLink object. + + + + + + + + + + + + + + + + + + + + Error + Error # + ExtraInfo Type + ExtraInfo description + + + UNKNOWN + Defined in MAL + List<UInteger> + A list of the indexes of the error values shall be contained in the extra information field. + + + INVALID + Defined in COM + List<UInteger> + The extra information field contains a list of the indexes of the erroneous values from the originating list supplied. + + + REFERENCED + 70021 + List<UInteger> + A list of the indexes of the error values shall be contained in the extra information field. + + + + + Operation: removeCheck + + + Overview + + The removeCheck operation allows a consumer to remove one or more definitions from the list of checks supported by the check provider. + The operation does not remove the CheckIdentity and actual check definition objects from the COM archive, merely removes the objects from the provider. This permits existing CheckLink objects to continue to reference the correct check object in the COM archive. + + + + + + + + + + + + + + + + + + + + Operation Identifier + removeCheck + + + Interaction Pattern + SUBMIT + + + Pattern Sequence + Message + Nullable + Type Signature + + + IN + SUBMIT + Yes + List<Long> objInstIds + + + + Type Signature Details + + objInstIds - The objInstIds field holds the object instance identifiers of the CheckIdentity objects to be removed from the provider. +The list may contain the wildcard value of '0'. +The wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made. +If a provided CheckIdentity instance identifier does not include a wildcard and does not match an existing check then this operation shall fail with an UNKNOWN error. +If any of the matched CheckIdentity objects are being referenced by a CheckLink object then a REFERENCED error shall be returned. +Matched CheckIdentity objects shall not be removed from the COM archive only the list of available CheckIdentity objects in the provider. +If an error is raised then no CheckIdentity objects shall be removed as a result of this operation call. +If the operation succeeds then the provider shall not allow new CheckLink objects to be created for the matched CheckIdentity anymore, existing CheckLink objects are not affected. + + Requirements + + + MO Errors + + The operation may return one of the following errors: + UNKNOWN: One of the supplied CheckIdentity object instance identifiers is unknown. + REFERENCED: One of the check objects is currently being used by a CheckLink object. + + + + + + + + + + + + + + + + + + + + Error + Error # + ExtraInfo Type + ExtraInfo description + + + UNKNOWN + Defined in MAL + List<UInteger> + A list of the indexes of the error values shall be contained in the extra information field. + + + REFERENCED + 70021 + List<UInteger> + A list of the indexes of the error values shall be contained in the extra information field. + + + + + Operation: addParameterCheck + + + Overview + + The addParameterCheck operation allows a consumer to request that one or more parameters/check combinations are added to the list of checks that are being evaluated. + The new CheckLink and CheckLinkDefinition objects are expected to be stored in the COM archive by the provider of the check service. + + + + + + + + + + + + + + + + + + + + Operation Identifier + addParameterCheck + + + Interaction Pattern + REQUEST + + + Pattern Sequence + Message + Nullable + Type Signature + + + IN + REQUEST + YesYes + List< HYPERLINK \l "DATATYPE_CheckLinkDetails" CheckLinkDetails> linkDetailsList<COM::ObjectDetails> linkRefs + + + OUT + RESPONSE + Yes + List< HYPERLINK \l "DATATYPE_ObjectInstancePair" ObjectInstancePair> newObjInstIds + + + + Type Signature Details + + linkDetails - The linkDetails field shall contain the new CheckLink details. +The linkRefs field shall contain the related and source links of the new CheckLink. +The related field of the ObjectDetails shall reference the object instance identifier of the CheckIdentity being used by the new CheckLink. +The source field of the ObjectDetails shall reference the ParameterIdentity that the check is being applied to. +The two lists must be ordered the same so that the correct ObjectDetails for a specific CheckLink can be determined. + linkRefs - If the requested CheckIdentity and ParameterIdentity do not exist then an UNKNOWN error shall be returned. +The number of entries in the two lists shall be the same size otherwise an INVALID error shall be raised. +If an interval that is not supported by the provider is requested then an INVALID error shall be returned. +If the checkInterval is not '0' and the checkOnChange Value is TRUE, then an INVALID error shall be returned. +The provider shall create new CheckLink and CheckLinkDefinition objects for each pair and store them in the COM archive. + newObjInstIds - The response shall contain the list of object instance identifiers for the new CheckLink and CheckLinkDefinition objects. +The returned list shall maintain the same order as the submitted links. + + Requirements + + + MO Errors + + The operation may return one of the following errors: + INVALID: The supplied lists do not contain the same number of entries, the supplied interval is not supported by the provider, or a period check with changed based checking has been requested. + INVALID: If the two lists are not the same length then the extra information field shall contain the first index of the element in the largest list which does not have corresponding element in the other list. + UNKNOWN: One of the supplied object instance identifiers is unknown. + + + + + + + + + + + + + + + + + + + + Error + Error # + ExtraInfo Type + ExtraInfo description + + + INVALID + Defined in COM + List<UInteger> + The extra information field contains a list of the indexes of the erroneous values from the originating list supplied. + + + UNKNOWN + Defined in MAL + List<UInteger> + A list of the indexes of the error values shall be contained in the extra information field. + + + + + Operation: removeParameterCheck + + + Overview + + The removeParameterCheck operation allows a consumer to remove one or more parameters from the list of parameters being checked by the check provider. + The operation does not remove the CheckLink or CheckLinkDefinition objects from the COM archive, merely removes them from the provider. This permits existing CheckTransition events to continue to reference the correct check link/definition objects in the COM archive. + + + + + + + + + + + + + + + + + + + + Operation Identifier + removeParameterCheck + + + Interaction Pattern + SUBMIT + + + Pattern Sequence + Message + Nullable + Type Signature + + + IN + SUBMIT + Yes + List<Long> objInstIds + + + + Type Signature Details + + objInstIds - The objInstIds field holds the object instance identifiers of the CheckLink objects to be removed from the provider. +The list may contain the wildcard value of '0'. +The wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made. +If a provided CheckLink instance identifier does not include a wildcard and does not match an existing link then this operation shall fail with an UNKNOWN error. +Matched CheckLink objects shall not be removed from the COM archive only the list of available CheckLink objects in the provider. +If an error is raised then no CheckLink objects shall be removed as a result of this operation call. +If the operation succeeds then the provider shall not evaluate those parameter/check definition combinations for the deleted CheckLink objects anymore. + + Requirements + + + MO Errors + + The operation may return the following error: + UNKNOWN: One of the supplied CheckLink object instance identifiers is unknown. + + + + + + + + + + + + + + + + + + + + Error + Error # + ExtraInfo Type + ExtraInfo description + + + UNKNOWN + Defined in MAL + List<UInteger> + A list of the indexes of the error values shall be contained in the extra information field. + + + + + Service: Statistic + + + Overview + + The statistic service allows the consumer to monitor and control the statistical evaluation (e.g., average) of parameters. + The statistic service allows the consumer to link the statistic function to a parameter to be evaluated. Figure 3-9 shows the nominal sequence of operations for the statistic service: + ---- nominal sequence diag ---- + Statistic service nominal sequence + For each statistics link the service allows a consumer to specify a sampling interval, a reporting interval, and a collection interval. + The sampling interval defines the interval between samples of the linked parameter, the reporting interval defines the interval between reports of the current statistic evaluation value, and the collection interval defines the period of time which parameter values are collected for the statistic function. + A consumer can create several links to the same parameter with different intervals, for example for the function 'Mean', a consumer might define two links with different collection intervals, one for an hour (D0) and one for four hours (D1). The consumer might also specify the reporting interval of half an hour for the first link and two hours for the second link. This would mean that the service provider would produce reports as shown in Figure 3-10. + --- timeline chart --- + Example Statistic interval reporting + If a statistic is defined to reset on collection interval expiration the currently calculated value, and any input collection of values, for the parameter being sampled is reset every collection interval, so if an hourly collection interval is defined for the function 'Mean' then every hour the current mean average value is reset (this does not affect the value reported by the Parameter service itself or any other links for the same function and parameter), the set of values used to calculate that mean average is cleared, and a report is generated containing the final value of the function just before the reset. + If a statistic is defined not to reset every collection interval, then the statistic maintains a moving evaluation for the collection interval. For example, if a collection interval of an hour is defined with a reset Boolean of FALSE for the function 'Maximum' then the evaluation will hold the maximum value obtained in the last hour. + The consumer is also able to define the sampling interval of the parameter for a link. This is independent of both the collection interval and the reporting interval. It makes sense for the sampling interval to be smaller than both the collection and reporting interval however it is perfectly possible to specify other values, as this is a deployment decision. + For the statistic service, the list of possible statistics functions is deployment-dependent, as any function would have to be implemented in the service provider. There are no operations for the creation, modification, or deletion of the statistic functions. The statistic service defines the evaluation of minimum, maximum, mean, and standard deviation functions, however the service supports the addition of other statistical functions by implementations. + NOTE: To ensure deterministic behaviour, implementations should endeavour to respect Nyquist�s theorem. + + Table + + STYLEREF "Heading 1"\l \n \t \* MERGEFORMAT 1 SEQ Table \s 1 1tc \f T " + 1 + - SEQ Table_TOC \s 1 1 + Statistic Service Operations + " + : Statistic Service Operations + + + + + + + + + + + + + + + + + + + + + + Area Identifier + Service Identifier + Area Number + Service Number + Area Version + + + MC + Statistic + 4 + 5 + 1 + + + Interaction Pattern + Operation Identifier + Operation Number + Capability Set + + + REQUEST + HYPERLINK \l "OPERATION_5_getStatistics" getStatistics + 1 + 1 + + + REQUEST + HYPERLINK \l "OPERATION_5_resetEvaluation" resetEvaluation + 2 + + + + PUB-SUB + HYPERLINK \l "OPERATION_5_monitorStatistics" monitorStatistics + 3 + 2 + + + SUBMIT + HYPERLINK \l "OPERATION_5_enableService" enableService + 4 + 3 + + + REQUEST + HYPERLINK \l "OPERATION_5_getServiceStatus" getServiceStatus + 5 + + + + SUBMIT + HYPERLINK \l "OPERATION_5_enableReporting" enableReporting + 6 + 4 + + + REQUEST + HYPERLINK \l "OPERATION_5_listParameterEvaluations" listParameterEvaluations + 7 + 5 + + + REQUEST + HYPERLINK \l "OPERATION_5_addParameterEvaluation" addParameterEvaluation + 8 + 6 + + + REQUEST + HYPERLINK \l "OPERATION_5_updateParameterEvaluation" updateParameterEvaluation + 9 + + + + SUBMIT + HYPERLINK \l "OPERATION_5_removeParameterEvaluation" removeParameterEvaluation + 10 + + + + + Service-level Requirements + + The statistics service may provide the following capabilities: + the capability for requesting the current statistics evaluation; + the capability for resetting the statistic evaluations; + the capability for periodic statistics reporting; + the capability to control generation of periodic statistics reporting; + the capability for maintaining the list of evaluated parameters. + The statistics service may support the evaluation of the following set of statistic functions: + the maximum value; + the minimum value; + the mean value; + the standard deviation. + Whether the statistics reporting service supports a specific statistic function shall be declared when implementing that service. + The statistic service shall maintain a set of links between the statistic function and the parameter that shall be evaluated. + Each statistics link shall contain: + the identification of the parameter for which statistics are evaluated; + the related collection interval; + whether the collection resets every collection interval; + the related reporting interval; + the related sampling interval. + The evaluation of a specific statistic shall be reset every collection interval if the reset on collection interval Boolean is TRUE. + The parameter referenced by a statistic link shall be sampled every sampling interval. + The statistics evaluation value shall be reported every reporting and collection interval if generation is enabled. + Each statistics value report shall contain: + the start time of the evaluation; + the end time of the evaluation; + the time of the collected value if applicable; + the evaluated value; + the number of samples that contributed to the evaluation. + When resetting the statistics, the statistics service shall, in sequence: + stop the evaluation of the statistics; + clear any results accumulated; + restart the evaluation process. + The statistics service shall provide the capability to enable periodic statistics reporting. + The statistics service shall provide the capability to disable the periodic statistics reporting. + For each valid instruction to disable periodic statistics reporting, the statistics service shall: + set the statistics link status to disabled; + continue evaluating the parameter statistics. + The statistic value for a parameter shall be evaluated after each sampling of the parameter and after the collection interval is elapsed. + A consumer may request the latest status of the statistical evaluations using the getStatistics operation. + If a StatisticLink is required to send periodic reports, then the time between these reports shall be controlled using the reportingInterval duration value. + A reportingInterval value of '0' shall mean no periodic reports shall be sent; reports are required to be triggered by another mechanism in this case. + The reportingInterval value shall be modified using the updateParameterEvaluation operation. + If the reporting interval and the collection intervals align, for example report every minute with a five minute collection interval the fifth minute will align, then only a single report shall be generated in this case. + For onboard parameters the link sampling interval should be a multiple of the minimum sampling interval of those parameters. + If an interval that is not supported by the provider is requested, then an INVALID error shall be returned, and the change rejected. + For the 'Maximum' statistics function, the highest value shall be reported, in the case of multiple samples matching that, the first occurrence shall be report. + For the 'Minimum' statistics function, the smallest value shall be reported, in the case of multiple samples matching that, the first occurrence shall be report. + For the 'Mean average' statistics function, when used with integer parameters the result shall be reported using a Double type. + For the 'Standard deviation' statistics function, when used with integer parameters the result shall be reported using a Double type. + + COM usage + + The statistic functions shall be represented as StatisticFunction COM objects. + For a 'Maximum' statistics function, the object instance identifier of '1' and name of 'MAX' shall be used. + For a 'Minimum' statistics function, the object instance identifier of '2' and name of 'MIN' shall be used. + For a 'Mean average' statistics function, the object instance identifier of '3' and name of 'MEAN' shall be used. + For a 'Standard deviation' statistics function, the object instance identifier of '4' and name of 'SD' shall be used. + For non-standard statistics functions, i.e. ones not listed here, the name and object instance identifier shall be communicated through an out-of-band agreement. + The link between which parameters are being evaluated for each function shall be represented as StatisticLink COM objects. + The details of a statistic link, such as reportingInterval, shall be represented as a StatisticLinkDefinition COM object. + Statistic evaluations for a specific parameter and statistic function shall be represented as StatisticValueInstance COM objects. + The StatisticLink object shall use the related link to indicate which StatisticFunction object it uses. + The StatisticLink object shall use the source link to indicate which ParameterIdentity object it uses. + The StatisticLinkDefinition object shall use the related link to indicate which StatisticLink object it uses. + The StatisticValueInstance object shall use the related link to indicate which StatisticLinkDefinition object it uses. + The StatisticValueInstance object shall use the source link to indicate what object (if any) caused it to be evaluated. + If the StatisticValueInstance object was a result of a getStatistics operation call then the source link shall be the COM OperationActivity object of the operation. + + Table + + STYLEREF "Heading 1"\l \n \t \* MERGEFORMAT 1 SEQ Table \s 1 1tc \f T " + 1 + - SEQ Table_TOC \s 1 1 + Statistic Service Object Types + " + : Statistic Service Object Types + + + + + + + + + + + + + + + + + + + + + + Object Number + Object Name + Object Body Type + Related link + Source link + + + 1 + StatisticFunction + HYPERLINK \l "DATATYPE_StatisticFunctionDetails" StatisticFunctionDetails + Set to NULL + Set to NULL + + + 2 + StatisticLink + No body + 1 + Parameter::1 + + + 3 + StatisticLinkDefinition + HYPERLINK \l "DATATYPE_StatisticLinkDetails" StatisticLinkDetails + 2 + Set to NULL + + + 4 + StatisticValueInstance + HYPERLINK \l "DATATYPE_StatisticValue" StatisticValue + 3 + The object that caused the statistical evaluation to occur, may be NULL if occurred due to evaluation period timeout. + + + + COM Object Relationships + + The Figure below shows the COM object relationships for this service: + + Figure + + STYLEREF "Heading 1"\l \n \t \* MERGEFORMAT 1 SEQ Figure \s 1 1tc \f T " + 1 + - SEQ Figure_TOC \s 1 1 + Statistic Service COM object relationships + " + : Statistic Service COM object relationships + + + COM Archive Service usage + + StatisticFunction objects should be stored in the COM archive only if they are not one of the standard functions. + StatisticLink objects should be stored in the COM archive. + StatisticLinkDefinition objects should be stored in the COM archive. + When a StatisticValueInstance report is published, the object should be stored in the COM archive. + + + Operation: getStatistics + + + Overview + + The getStatistics operation returns the latest value for a set of existing statistic evaluations. + + + + + + + + + + + + + + + + + + + + Operation Identifier + getStatistics + + + Interaction Pattern + REQUEST + + + Pattern Sequence + Message + Nullable + Type Signature + + + IN + REQUEST + YesYesYes + List<Long> funcObjInstIdsBoolean isGroupList<COM::ObjectKey> paramObjInstIds + + + OUT + RESPONSE + Yes + List< HYPERLINK \l "DATATYPE_StatisticEvaluationReport" StatisticEvaluationReport> evaluations + + + + Type Signature Details + + funcObjInstIds - The funcObjInstIds field shall include a list of StatisticFunction object instance identifiers to match. +The funcObjInstIds field shall support the wildcard value of '0' and will match all functions of the provider. +The wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made. + isGroup - + paramObjInstIds - If the isGroup field is TRUE then the paramObjInstIds field shall contain GroupIdentity object instance identifiers, otherwise the field shall contain ParameterIdentity object instance identifiers. +If the isGroup field is TRUE, the requested Group, or the Group objects referenced by that Group, must contain ParameterIdentity objects otherwise an INVALID error shall be returned. +The ParameterIdentity objects referenced, either directly or indirectly via groups, by the paramObjInstIds field shall be the parameters to match. +The paramObjInstIds field shall support the wildcard value of '0' and matches all parameters of the provider matched to the functions given in the funcObjInstIds field. +The wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made. +If a requested function, group or parameters is unknown then an UNKNOWN error shall be returned. +The sets of matched StatisticFunction objects and ParameterIdentity objects shall be matched to the set of existing StatisticLink objects to determine which StatisticLink objects to report on. + evaluations - The response shall contain a list of matching statistics evaluation values. +The operation shall trigger an evaluation of the statistical functions matched and return the new evaluation values. +If it is not possible to return an evaluation value for a matched evaluation (for example not enough samples available) then no entry for that evaluation shall be included. +The evaluation shall not trigger a report via the monitorStatistics operation. +Requesting an evaluation shall ignore the samplingInterval, reportingInterval, and collectionInterval fields and requests an immediate evaluation of the statistic. +Requesting an evaluation during a periodic evaluation shall not influence the periodic evaluation (e.g. it does not reset the samplingInterval, reportingInterval, and collectionInterval timers or the current periodic collection value). + + Requirements + + + MO Errors + + The operation may return one of the following errors: + UNKNOWN: One or more of the requested groups or parameters do not exist in the provider or statistic functions is not supported by the provider. + INVALID: One of the supplied groups is not a group of groups or ParameterIdentity objects. + + + + + + + + + + + + + + + + + + + + Error + Error # + ExtraInfo Type + ExtraInfo description + + + UNKNOWN + Defined in MAL + List<UInteger> + A list of the indexes of the error values shall be contained in the extra information field. + + + INVALID + Defined in COM + List<UInteger> + The extra information field contains a list of the indexes of the erroneous values from the originating list supplied. + + + + + Operation: resetEvaluation + + + Overview + + The operation allows a consumer to reset the statistical evaluations so the evaluations restart from the current time (without changing the collection interval), optionally returning the evaluation up to that point. Resetting the evaluation will affect all consumers. + + + + + + + + + + + + + + + + + + + + Operation Identifier + resetEvaluation + + + Interaction Pattern + REQUEST + + + Pattern Sequence + Message + Nullable + Type Signature + + + IN + REQUEST + YesYesYes + Boolean isStatLinkGroupList<Long> objInstIdsBoolean returnLatestEval + + + OUT + RESPONSE + Yes + List< HYPERLINK \l "DATATYPE_StatisticEvaluationReport" StatisticEvaluationReport> evaluations + + + + Type Signature Details + + isStatLinkGroup - If the isStatLinkGroup field is TRUE then the objInstIds field shall contain GroupIdentity object instance identifiers, otherwise the field shall contain StatisticFunction object instance identifiers. +If the isStatLinkGroup field is TRUE, the requested Group, or the Group objects referenced by that Group, must contain StatisticLink objects otherwise an INVALID error shall be returned. +The StatisticLink objects referenced, either indirectly via statistic functions or indirectly via groups, by the objInstIds field shall be the StatisticLink objects to match. + objInstIds - The objInstIds field shall support the wildcard value of '0' and matches all StatisticLink objects of the provider. +The wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made. +If a requested function or group is unknown then an UNKNOWN error shall be returned. + returnLatestEval - If the returnLatestEval Boolean field is TRUE then the latest evaluation result for each of the matched links shall be returned before resetting, otherwise a NULL is returned. +If an error is raised then no resetting of evaluations shall be made as a result of this operation call. + evaluations - + + Requirements + + + MO Errors + + The operation may return one of the following errors: + INVALID: One of the supplied groups is not a group of groups or StatisticLink objects. + UNKNOWN: One or more of the requested groups or functions is unknown. + + + + + + + + + + + + + + + + + + + + Error + Error # + ExtraInfo Type + ExtraInfo description + + + INVALID + Defined in COM + List<UInteger> + The extra information field contains a list of the indexes of the erroneous values from the originating list supplied. + + + UNKNOWN + Defined in MAL + List<UInteger> + A list of the indexes of the error values shall be contained in the extra information field. + + + + + Operation: monitorStatistics + + + Overview + + The monitorStatistics operation allows a consumer to subscribe for statistical evaluation value reports. + It should be noted that no evaluation reports will be generated if the service provider has been disabled via the enableService operation. + + + + + + + + + + + + + + + + + + + + Operation Identifier + monitorStatistics + + + Interaction Pattern + PUBLISH-SUBSCRIBE + + + Pattern Sequence + Message + Nullable + Type Signature + + + OUT + PUBLISH + YesYesYes + Long relatedIdCOM::ObjectId sourceId HYPERLINK \l "DATATYPE_StatisticValue" StatisticValue statisticValue + + + + Type Signature Details + + relatedId - The MAL EntityKey.firstSubKey shall contain the statistic function name. +The MAL EntityKey.secondSubKey shall contain the StatisticLink object instance identifier. +The MAL EntityKey.thirdSubKey shall contain the ParameterIdentity object instance identifier. +The MAL EntityKey.fourthSubKey shall contain the new StatisticValueInstance object instance identifier. +The timestamp of the StatisticValueInstance report shall be taken from the publish message. +The related link of the update shall be held in the relatedId field. + sourceId - The source link of the StatisticValueInstance shall be held in the sourceId field. +If no source link is needed then the sourceId shall be set to NULL. + statisticValue - The second part of the publish message shall be the StatisticValueInstance object value. + + Requirements + + + MO Errors + + The operation does not return any errors. + + + Operation: enableService + + + Overview + + The enableService operation allows a consumer to globally control whether evaluation of all statistics is performed or not. + + + + + + + + + + + + + + + + + + + + Operation Identifier + enableService + + + Interaction Pattern + SUBMIT + + + Pattern Sequence + Message + Nullable + Type Signature + + + IN + SUBMIT + Yes + Boolean enableService + + + + Type Signature Details + + enableService - If enableService is set to TRUE the service shall be enabled and evaluation and reporting of statistics will be reset and commence. +If enableService is set to FALSE then all evaluation of statistics shall be suspended and no statistics will be reported. +If the enableService value matches the current enabled state of the service then no change shall be made and no error reported. Enabling an already enabled service has no effect. + + Requirements + + + MO Errors + + The operation does not return any errors. + + + Operation: getServiceStatus + + + Overview + + The getServiceStatus operation allows a consumer to determine the global statistic service enabled status. + + + + + + + + + + + + + + + + + + + + Operation Identifier + getServiceStatus + + + Interaction Pattern + REQUEST + + + Pattern Sequence + Message + Nullable + Type Signature + + + IN + REQUEST + - + - + + + OUT + RESPONSE + Yes + Boolean serviceEnabled + + + + Type Signature Details + + serviceEnabled - The operation shall return TRUE if the service is currently enabled or FALSE if the service is currently disabled. + + Requirements + + + MO Errors + + The operation does not return any errors. + + + Operation: enableReporting + + + Overview + + The enableReporting operation allows a consumer to control whether reports for specific statistical functions are generated or not. The operation allows the consumer to select the functions directly or indirectly using groups. + + + + + + + + + + + + + + + + + + + + Operation Identifier + enableReporting + + + Interaction Pattern + SUBMIT + + + Pattern Sequence + Message + Nullable + Type Signature + + + IN + SUBMIT + YesYes + Boolean isGroupIdsList<COM::InstanceBooleanPair> enableInstances + + + + Type Signature Details + + isGroupIds - If the isGroupIds field is TRUE then the enableInstances field shall contain GroupIdentity object instance identifiers, otherwise the field contains StatisticFunction object instance identifiers. +If the isGroupIds field is TRUE, the requested Group, or the Group objects referenced by that Group, must contain StatisticLink objects otherwise an INVALID error shall be returned. +The StatisticLink objects referenced, either indirectly via StatisticFunction objects or indirectly via groups, by the enableInstances field shall be the StatisticLink objects to match. +The id of the enableInstances field shall support the wildcard value of '0' and matches all StatisticLink objects of the provider. +The service provider shall check for the wildcard value in the list of object instance identifiers in the enableInstances field first and if found no other checks of supplied object instance identifiers shall be made. +If the enableInstances field contains a value of TRUE then reports after the reporting and collection intervals for matching StatisticLink objects shall be generated, a value of FALSE requests that reports will not be generated. +No error shall be raised if the enableInstances Boolean value supplied is the same as the current reportingEnabled field for a StatisticLink object i.e. enabling an already enabled link will not result in an error. +If a requested StatisticFunction or GroupIdentity object is unknown then an UNKNOWN error shall be returned. +If an error is raised then no modifications shall be made as a result of this operation call. +The provider should create and store a new StatisticLinkDefinition object in the COM archive if the reportingEnabled field is changed. + enableInstances - If the generation of reports is being enabled, then the provider shall generate a report immediately and start the report interval from that report. + + Requirements + + + MO Errors + + The operation may return one of the following errors: + UNKNOWN: One or more of the requested StatisticFunction or Group objects is unknown. + INVALID: One of the supplied groups is not a group of groups or StatisticLink objects. + + + + + + + + + + + + + + + + + + + + Error + Error # + ExtraInfo Type + ExtraInfo description + + + UNKNOWN + Defined in MAL + List<UInteger> + A list of the indexes of the error values shall be contained in the extra information field. + + + INVALID + Defined in COM + List<UInteger> + The extra information field contains a list of the indexes of the erroneous values from the originating list supplied. + + + + + Operation: listParameterEvaluations + + + Overview + + The listParameterEvaluations operation allows a consumer to request the object instance identifiers of the StatisticLink objects for the evaluations of the provider. + + + + + + + + + + + + + + + + + + + + Operation Identifier + listParameterEvaluations + + + Interaction Pattern + REQUEST + + + Pattern Sequence + Message + Nullable + Type Signature + + + IN + REQUEST + Yes + List<Long> statObjInstIds + + + OUT + RESPONSE + Yes + List< HYPERLINK \l "DATATYPE_StatisticLinkSummary" StatisticLinkSummary> statLinkObjInstIds + + + + Type Signature Details + + statObjInstIds - The statObjInstIds field shall hold a list of StatisticFunction object instance identifiers to retrieve the StatisticLink object instance identifiers for. +The request may contain the wildcard value of '0' to return all supported statistic links. +The wildcard value should be checked for first, if found no other checks of supplied identifiers shall be made. +If a provided identifier does not include a wildcard and does not match an existing StatisticFunction object then this operation shall fail with an UNKNOWN error. + statLinkObjInstIds - The response shall contain a list of StatisticLinkSummary that contain the object instance identifiers of the StatisticLink, StatisticFunction, and ParameterIdentity for the matched StatisticFunction objects. + + Requirements + + + MO Errors + + The operation may return the following error: + UNKNOWN: One of the supplied identifiers is unknown. + + + + + + + + + + + + + + + + + + + + Error + Error # + ExtraInfo Type + ExtraInfo description + + + UNKNOWN + Defined in MAL + List<UInteger> + A list of the indexes of the error values shall be contained in the extra information field. + + + + + Operation: addParameterEvaluation + + + Overview + + The addParameterEvaluation operation allows a consumer to request that one or more parameters/function combinations are added to the list of parameters that are being evaluated. + The new StatisticLink and StatisticLinkDefinition objects are expected to be stored in the COM archive by the provider of the statistic service. + + + + + + + + + + + + + + + + + + + + Operation Identifier + addParameterEvaluation + + + Interaction Pattern + REQUEST + + + Pattern Sequence + Message + Nullable + Type Signature + + + IN + REQUEST + Yes + List< HYPERLINK \l "DATATYPE_StatisticCreationRequest" StatisticCreationRequest> newDetails + + + OUT + RESPONSE + Yes + List< HYPERLINK \l "DATATYPE_ObjectInstancePair" ObjectInstancePair> newObjInstIds + + + + Type Signature Details + + newDetails - The newDetails field shall hold a StatisticCreationRequest for each new parameter to be sampled. +The statFuncInstId field of the StatisticCreationRequest shall reference the object instance identifier of the StatisticFunction to be used. +If the statFuncInstId field does not match an existing StatisticFunction then an UNKNOWN error shall be raised. +The parameterId shall reference the ParameterIdentity that the function is being applied to. +If the parameterId field does not match an existing ParameterIdentity then an UNKNOWN error shall be raised. +If the type of the matched parameter is not supported by the matched statistical function, for example Mean average of a String parameter, then an INVALID error shall be returned. +The samplingInterval field shall contain the sampling duration interval for the parameter. +If the supplied samplingInterval is not supported for the requested parameter then an INVALID error shall be returned. +If an error is raised then no new StatisticLink object shall be created and stored as a result of this operation call. +If no error is to be raised then StatisticLink and StatisticLinkDefinition objects shall be created for each function/parameter link and stored in the COM archive. +The referenced parameter shall be sampled immediately and the sampling, reporting and collection intervals started. + newObjInstIds - The response shall contain the list of object instance identifiers for the new StatisticLink and StatisticLinkDefinition objects. +The object instance identifiers of the StatisticLink and StatisticLinkDefinition objects shall be held in the first and second fields of the ObjectInstancePair structure respectively. +The returned list shall maintain the same order as the submitted links. + + Requirements + + + MO Errors + + The operation may return one of the following errors: + INVALID: One or more of the supplied StatisticLink is either requesting an invalid sampling interval or invalid function for the request parameter. + UNKNOWN: One of the requested StatisticLink objects references either an unknown StatisticFunction object or an unknown ParameterIdentity object. + + + + + + + + + + + + + + + + + + + + Error + Error # + ExtraInfo Type + ExtraInfo description + + + INVALID + Defined in COM + List<UInteger> + The extra information field contains a list of the indexes of the erroneous values from the originating list supplied. + + + UNKNOWN + Defined in MAL + List<UInteger> + A list of the indexes of the error values shall be contained in the extra information field. + + + + + Operation: updateParameterEvaluation + + + Overview + + The updateParameterEvaluation operation allows a consumer to modify the intervals, reporting and reset Booleans for one or more statistical evaluation links. + The replacement StatisticLinkDefinition objects should be stored in the COM archive by the service provider. The operation does not remove the previous object from the COM archive, merely removes the object from the provider. + + + + + + + + + + + + + + + + + + + + Operation Identifier + updateParameterEvaluation + + + Interaction Pattern + REQUEST + + + Pattern Sequence + Message + Nullable + Type Signature + + + IN + REQUEST + YesYes + List<Long> linkIdsList< HYPERLINK \l "DATATYPE_StatisticLinkDetails" StatisticLinkDetails> newDetails + + + OUT + RESPONSE + Yes + List<Long> newLinkDefIds + + + + Type Signature Details + + linkIds - The linkIds field shall contain the object instance identifiers of the StatisticLink objects to be updated. +If the linkIds list contains either NULL or '0' an INVALID error shall be raised. +The supplied object instance identifiers shall match existing link objects, an UNKNOWN error shall be raised if this is not the case. +If the supplied samplingInterval is not supported for the requested parameter then an INVALID error shall be returned. + newDetails - The newDetails field shall contain the replacement StatisticLinkDetails. +The two lists shall be ordered the same. +The number of entries in the two lists shall be the same size otherwise an INVALID error shall be returned. +If an error is raised then no links shall be updated as a result of this operation call. +The provider shall create a new StatisticLinkDefinition object and store it in the COM archive. +If any of the intervals are updated then the service shall reset the relevant timer and use the new intervals immediately. + newLinkDefIds - The response shall contain the list of object instance identifiers for the new StatisticLinkDefinition objects. +The returned list shall maintain the same order as the submitted links. + + Requirements + + + MO Errors + + The operation may return one of the following errors: + UNKNOWN: One or more of the supplied StatisticLink object instance identifiers is unknown. + INVALID: One or more of the supplied object instance identifiers list contains either a NULL or '0' or is requesting an invalid sampling interval for the request parameter or the two supplied lists are not the same length. + INVALID: If the two lists are not the same length then the extra information field shall contain the first index of the element in the largest list which does not have corresponding element in the other list. + + + + + + + + + + + + + + + + + + + + Error + Error # + ExtraInfo Type + ExtraInfo description + + + UNKNOWN + Defined in MAL + List<UInteger> + A list of the indexes of the error values shall be contained in the extra information field. + + + INVALID + Defined in COM + List<UInteger> + The extra information field contains a list of the indexes of the erroneous values from the originating list supplied. + + + + + Operation: removeParameterEvaluation + + + Overview + + The removeParameterEvaluation operation allows a consumer to remove one or more parameters from the list of parameters being sampled by the statistic provider. + The operation does not remove the StatisticLink or StatisticLinkDefinition objects from the COM archive, merely removes them from the provider. This permits existing evaluation results to continue to reference the correct StatisticLink and StatisticLinkDefinition objects in the COM archive. + + + + + + + + + + + + + + + + + + + + Operation Identifier + removeParameterEvaluation + + + Interaction Pattern + SUBMIT + + + Pattern Sequence + Message + Nullable + Type Signature + + + IN + SUBMIT + Yes + List<Long> objInstIds + + + + Type Signature Details + + objInstIds - The objInstIds field holds the object instance identifiers of the StatisticLink objects to be removed from the provider. +The list may contain the wildcard value of '0'. +The wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made. +If a provided StatisticLink object instance identifier does not include a wildcard and does not match an existing StatisticLink object then this operation shall fail with an UNKNOWN error. +Matched StatisticLink objects shall not be removed from the COM archive only the list of evaluated StatisticLink objects in the provider. +If an error is raised then no StatisticLink objects shall be removed as a result of this operation call. +If the operation succeeds then the provider shall not evaluate those parameter/function definition combinations for the deleted StatisticLink objects anymore. + + Requirements + + + MO Errors + + The operation may return the following error: + UNKNOWN: One or more of the supplied StatisticLink object instance identifiers is unknown. + + + + + + + + + + + + + + + + + + + + Error + Error # + ExtraInfo Type + ExtraInfo description + + + UNKNOWN + Defined in MAL + List<UInteger> + A list of the indexes of the error values shall be contained in the extra information field. + + + + + Service: Aggregation + + + Overview + + The aggregation service allows the user to acquire several parameter values in a single request. + Aggregations are generated either periodically, on an ad-hoc basis, or after a configurable timeout when being filtered. Periodic is where they are generated at a specific generation interval; in this case the periodicity is an aspect of the aggregation rather than the contained parameters. Ad-hoc is when the aggregation generation is triggered by some other deployment-specific mechanism. + Filtering is where an aggregation is only generated when the change in the value of the filtered parameters exceeds a specified threshold or a timeout is passed. Filtering can be applied to both periodic and ad-hoc aggregations. + As there may be a large amount of time between reports of an aggregation when filtering is applied, the filtering concept also has a maximum reporting interval. If a report of the aggregation has not passed the filter in the maximum reporting interval a report is generated regardless. This allows there to be regular reports of an aggregation sent regardless of filtering. + It should be noted that applying a filter with a maximum reporting interval to an ad-hoc aggregation will cause the aggregation to generate reports in a periodic way if the maximum reporting interval is left to expire. This is expected behaviour. + There are a number of intervals defined in the structures of the service, the diagram in Figure 3-12 illustrates the use of these: + insert timing diagram + The diagram shows a single report of an aggregation being generated which contains two parameter sets. Each set of parameter values in the aggregation report contains two optional durations, delta time and interval time. + The timestamp of the first value of the first set (T1) is defined as the timestamp of the aggregation report plus the delta time of the first set. + The timestamp of the second value of the first set (T2) is defined as the timestamp of the first parameter (T1) plus the interval time of the set. + The timestamp of the first value of the second set (T3) is defined as the timestamp of the last value of the previous set (T2) plus the delta time of the second set. + The timestamp of the second value of the second set (T4) is defined as the timestamp of the first parameter (T3) plus the interval time of the set. + The COM archive is used to hold the definitions of the aggregations. + + Table + + STYLEREF "Heading 1"\l \n \t \* MERGEFORMAT 1 SEQ Table \s 1 1tc \f T " + 1 + - SEQ Table_TOC \s 1 1 + Aggregation Service Operations + " + : Aggregation Service Operations + + + + + + + + + + + + + + + + + + + + + + Area Identifier + Service Identifier + Area Number + Service Number + Area Version + + + MC + Aggregation + 4 + 6 + 1 + + + Interaction Pattern + Operation Identifier + Operation Number + Capability Set + + + PUB-SUB + HYPERLINK \l "OPERATION_6_monitorValue" monitorValue + 1 + 1 + + + REQUEST + HYPERLINK \l "OPERATION_6_getValue" getValue + 2 + 2 + + + REQUEST + HYPERLINK \l "OPERATION_6_enableGeneration" enableGeneration + 3 + 3 + + + SUBMIT + HYPERLINK \l "OPERATION_6_enableFilter" enableFilter + 4 + + + + REQUEST + HYPERLINK \l "OPERATION_6_listDefinition" listDefinition + 5 + 4 + + + REQUEST + HYPERLINK \l "OPERATION_6_addAggregation" addAggregation + 6 + 5 + + + REQUEST + HYPERLINK \l "OPERATION_6_updateDefinition" updateDefinition + 7 + + + + SUBMIT + HYPERLINK \l "OPERATION_6_removeAggregation" removeAggregation + 8 + + + + + Service-level Requirements + + The aggregation service shall provide: + the capability for periodic reporting of predefined aggregation values; + the capability for requesting the current value of a set of aggregations; + the capability for controlling reporting of the aggregation values; + the capability for maintaining the list of aggregation definitions. + Three modes of generating an aggregation value shall exist: periodic, ad-hoc, and filtered: + Periodic reports for aggregations shall be generated once for each cycle of a specified interval. + Ad-hoc reports for aggregations shall be triggered by some other deployment-specific means. + Filtered reports for aggregations shall be generated only when the value of one or more parameters in the aggregation has changed by more than a given threshold since the previous generation or when a timeout expires. + The generation of reports for an aggregation shall be controlled by the generationEnabled Boolean value in the AggregationDefinitionDetails structure. + Setting the generationEnabled field to TRUE shall enable generation of reports for a specific aggregation. + The generationEnabled values can be set by using the enableGeneration operation. + The filtering of reports for an aggregation shall be controlled by the filterEnabled Boolean value in the AggregationDefinitionDetails structure. + Setting the filterEnabled field to TRUE shall enable filtering of reports for a specific aggregation. + The filterEnabled values can be set by using the enableFilter operation. + If an aggregation is required to send periodic reports, then the time between these reports shall be controlled using the reportInterval Duration value in the AggregationDefinitionDetails structure. + Periodic reports for aggregations shall set the generationMode field of the AggregationValueInstance to PERIODIC. + No periodic reports shall be generated when the reportInterval field is set to '0' and reports will be triggered by another ad-hoc implementation-specific mechanism in this case. + Ad-hoc reports for aggregations shall set the generationMode field of the AggregationValueInstance to ADHOC. + If an aggregation is filtered, reports shall be generated only when the value of one or more parameters in the aggregation have changed by more than a given threshold since the previous generated aggregation report. + The threshold for the filter shall be defined, on a per-parameter basis, either as a percentage or an (absolute) delta change in value. + Parameters in an aggregation that do not have a filter specified in the aggregation definition shall be ignored by the filter comparison process. + If filtering is enabled and a filtered timeout has been set for that aggregation, if no change has been detected in that time-out period, an aggregation value shall be generated with a generation mode of FILTERED_TIMEOUT. This measure ensures that extensive periods of time do not elapse without reports of an enabled aggregation. + The generationEnabled, filterEnabled, filteredTimeout, sendUnchanged and reportInterval values of an AggregationDefinition object can be set by using the updateDefinition operation. + If the filteredTimeout interval, reportInterval or one or more of the sampleIntervals requested are not supported by the provider then an INVALID error shall be returned and the creation or change rejected. + If the sendUnchanged field in the AggregationDefinition object is FALSE then parameter values that have not changed since the previous report shall be replaced by a NULL in the values list of the AggregationSetValue composite. + The ordering of the values in the AggregationValueInstance object shall match the ordering of parameters in the AggregationDefinitionDetails structure. + + COM usage + + Each aggregation of a provider shall be represented by an AggregationIdentity COM object. + The body of the AggregationIdentity COM object shall hold the name of the aggregation. + The definitions of the aggregations shall be represented as AggregationDefinition COM objects. + Aggregation value reports shall be represented as AggregationValueInstance COM objects. + The AggregationDefinition object shall use the related link to indicate which AggregationIdentity object it uses. + The AggregationValueInstance object shall use the related link to indicate which AggregationDefinition object it uses. + The source link of the AggregationIdentity object should be the object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used. + The source link of the AggregationDefinition object should be the object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used. + The source link of the AggregationValueInstance object should be the object that caused the report to be generated. + The source link of the AggregationValueInstance object shall be NULL for periodic reports. + + Table + + STYLEREF "Heading 1"\l \n \t \* MERGEFORMAT 1 SEQ Table \s 1 1tc \f T " + 1 + - SEQ Table_TOC \s 1 1 + Aggregation Service Object Types + " + : Aggregation Service Object Types + + + + + + + + + + + + + + + + + + + + + + Object Number + Object Name + Object Body Type + Related link + Source link + + + 1 + AggregationIdentity + Identifier + Set to NULL + The object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used + + + 2 + AggregationDefinition + HYPERLINK \l "DATATYPE_AggregationDefinitionDetails" AggregationDefinitionDetails + 1 + The object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used + + + 3 + AggregationValueInstance + HYPERLINK \l "DATATYPE_AggregationValue" AggregationValue + 2 + The object that caused the value to be generated or NULL for periodic reports + + + + COM Object Relationships + + The Figure below shows the COM object relationships for this service: + + Figure + + STYLEREF "Heading 1"\l \n \t \* MERGEFORMAT 1 SEQ Figure \s 1 1tc \f T " + 1 + - SEQ Figure_TOC \s 1 1 + Aggregation Service COM object relationships + " + : Aggregation Service COM object relationships + + + COM Archive Service usage + + AggregationIdentity and AggregationDefinition objects should be stored in the COM archive. + When an aggregation value report is published, the AggregationValueInstance object should be stored in the COM archive. + + + Operation: monitorValue + + + Overview + + The monitorValue operation allows a consumer to subscribe for aggregation value reports. + + + + + + + + + + + + + + + + + + + + Operation Identifier + monitorValue + + + Interaction Pattern + PUBLISH-SUBSCRIBE + + + Pattern Sequence + Message + Nullable + Type Signature + + + OUT + PUBLISH + YesYes + COM::ObjectId objId HYPERLINK \l "DATATYPE_AggregationValue" AggregationValue newValue + + + + Type Signature Details + + objId - The MAL EntityKey.firstSubKey shall contain the aggregation name. +The MAL EntityKey.secondSubKey shall contain the AggregationIdentity object instance identifier. +The MAL EntityKey.thirdSubKey shall contain the AggregationDefinition object instance identifier. +The MAL EntityKey.fourthSubKey shall contain the new AggregationValueInstance object instance identifier. +The timestamp of the AggregationValueInstance report shall be taken from the publish message. +The publish message shall include the ObjectId of the source link of the report. +If no source link is needed then the ObjectId shall be replaced with a NULL. + newValue - The second part of the publish message shall be the AggregationValue. + + Requirements + + + MO Errors + + The operation does not return any errors. + + + Operation: getValue + + + Overview + + The getValue operation returns the latest received value for a requested aggregation. + + + + + + + + + + + + + + + + + + + + Operation Identifier + getValue + + + Interaction Pattern + REQUEST + + + Pattern Sequence + Message + Nullable + Type Signature + + + IN + REQUEST + Yes + List<Long> aggInstIds + + + OUT + RESPONSE + Yes + List< HYPERLINK \l "DATATYPE_AggregationValueDetails" AggregationValueDetails> aggValDetails + + + + Type Signature Details + + aggInstIds - The aggInstIds field shall provide the list of AggregationIdentity object instance identifiers. +The wildcard value of '0' shall be supported and matches all aggregations of the provider. +The wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made. +If a requested aggregation is unknown then an UNKNOWN error shall be returned. +The filter shall not be applied for the getValue operation. +If an aggregation is being reported periodically, using the operation shall not reset the reportInterval or filteredTimeout timer. + aggValDetails - The response shall contain a list of returned AggregationIdentity and AggregationDefinition object instance identifier pairs and a matching list of AggregationValues. +The new value shall not be published via the monitorValue operation. + + Requirements + + + MO Errors + + The operation may return the following error: + UNKNOWN: One or more of the requested aggregations is unknown. + + + + + + + + + + + + + + + + + + + + Error + Error # + ExtraInfo Type + ExtraInfo description + + + UNKNOWN + Defined in MAL + List<UInteger> + A list of the indexes of the error values shall be contained in the extra information field. + + + + + Operation: enableGeneration + + + Overview + + The enableGeneration operation allows a consumer to control whether reports for specific aggregations are generated or not. The operation allows the consumer to select the aggregations directly or indirectly using groups. This affects all types of aggregations, periodic, filtered and ad-hoc. + + + + + + + + + + + + + + + + + + + + Operation Identifier + enableGeneration + + + Interaction Pattern + REQUEST + + + Pattern Sequence + Message + Nullable + Type Signature + + + IN + REQUEST + YesYes + Boolean isGroupIdsList<COM::InstanceBooleanPair> enableInstances + + + OUT + RESPONSE + Yes + List<Long> newObjInstIds + + + + Type Signature Details + + isGroupIds - If the isGroupIds field is TRUE then the enableInstances field shall contain GroupIdentity object instance identifiers, otherwise the field contains AggregationIdentity object instance identifiers. +The AggregationIdentity objects referenced, either directly or indirectly via groups, by the enableInstances field shall be the AggregationIdentity objects to match. +The id of the enableInstances field shall support the wildcard value of '0' and matches all AggregationIdentity objects of the provider. +The service provider shall check for the wildcard value in the list of object instance identifiers in the enableInstances field first and if found no other checks of supplied object instance identifiers shall be made. +If the enableInstances field contains a value of TRUE then reports of matching AggregationIdentity objects shall be generated, a value of FALSE requests that reports will not be generated. +No error shall be raised if the enableInstances Boolean value supplied is the same as the current generationEnabled field of the definition for a matched AggregationIdentity object i.e. enabling an already enabled aggregation will not result in an error. +If a requested AggregationIdentity or GroupIdentity object is unknown then an UNKNOWN error shall be returned. +If a requested Group, or the Group objects referenced by that Group, does not contain AggregationIdentity objects then an INVALID error shall be returned. +If an error is raised then no modifications shall be made as a result of this operation call. +The provider shall create and store a new AggregationDefinition object in the COM archive if the generationEnabled field is changed. +If a new AggregationDefinition object is created then that new object shall be the current AggregationDefinition used for the specific AggregationIdentity. + enableInstances - If the generation of reports is being enabled, and the aggregation is defined as being periodic, then the provider shall generate a report immediately and start the report interval from that report. + newObjInstIds - The response shall contain the list of object instance identifiers for the new AggregationDefinition objects. + + Requirements + + + MO Errors + + The operation may return one of the following errors: + UNKNOWN: One or more of the requested aggregations or groups is unknown. + INVALID: One of the supplied groups is either not a group of groups or a group of AggregationIdentity objects. + + + + + + + + + + + + + + + + + + + + Error + Error # + ExtraInfo Type + ExtraInfo description + + + UNKNOWN + Defined in MAL + List<UInteger> + A list of the indexes of the error values shall be contained in the extra information field. + + + INVALID + Defined in COM + List<UInteger> + The extra information field contains a list of the indexes of the erroneous values from the originating list supplied. + + + + + Operation: enableFilter + + + Overview + + The enableFilter operation allows a consumer to control whether reports for specific aggregations are filtered or not. The operation allows the consumer to select the aggregations directly or indirectly using groups. This affects both periodic and ad-hoc aggregations. + + + + + + + + + + + + + + + + + + + + Operation Identifier + enableFilter + + + Interaction Pattern + SUBMIT + + + Pattern Sequence + Message + Nullable + Type Signature + + + IN + SUBMIT + YesYes + Boolean isGroupIdsList<COM::InstanceBooleanPair> enableInstances + + + + Type Signature Details + + isGroupIds - If the isGroupIds field is TRUE then the enableInstances field shall contain GroupIdentity object instance identifiers, otherwise the field contains AggregationIdentity object instance identifiers. +The AggregationIdentity objects referenced, either directly or indirectly via groups, by the enableInstances field shall be the AggregationIdentity objects to match. +The id of the enableInstances field shall support the wildcard value of '0' and matches all AggregationIdentity objects of the provider. +The service provider shall check for the wildcard value in the list of object instance identifiers in the enableInstances field first and if found no other checks of supplied object instance identifiers shall be made. +If the enableInstances field contains a value of TRUE then reports of matching AggregationIdentity objects shall be filtered, a value of FALSE requests that reports will not be filtered. +No error shall be raised if the enableInstances Boolean value supplied is the same as the current filterEnabled field of the definition for a matched AggregationIdentity object i.e. filtering an already filtered aggregation will not result in an error. +If a requested AggregationIdentity or GroupIdentity object is unknown then an UNKNOWN error shall be returned. +If a requested Group, or the Group objects referenced by that Group, does not contain AggregationIdentity objects then an INVALID error shall be returned. +If an error is raised then no modifications shall be made as a result of this operation call. +The provider shall create and store a new AggregationDefinition object in the COM archive if the filterEnabled field is changed. +If a new AggregationDefinition object is created then that new object shall be the current AggregationDefinition used for the specific AggregationIdentity. + enableInstances - + + Requirements + + + MO Errors + + The operation may return one of the following errors: + INVALID: One of the supplied groups is either not a group of groups or a group of AggregationIdentity objects. + UNKNOWN: One or more of the requested aggregations or groups is unknown. + + + + + + + + + + + + + + + + + + + + Error + Error # + ExtraInfo Type + ExtraInfo description + + + INVALID + Defined in COM + List<UInteger> + The extra information field contains a list of the indexes of the erroneous values from the originating list supplied. + + + UNKNOWN + Defined in MAL + List<UInteger> + A list of the indexes of the error values shall be contained in the extra information field. + + + + + Operation: listDefinition + + + Overview + + The listDefinition operation allows a consumer to request the latest object instance identifiers of the AggregationIdentity and AggregationDefinition objects for the supported aggregations of the provider. + + + + + + + + + + + + + + + + + + + + Operation Identifier + listDefinition + + + Interaction Pattern + REQUEST + + + Pattern Sequence + Message + Nullable + Type Signature + + + IN + REQUEST + Yes + List<Identifier> aggNames + + + OUT + RESPONSE + Yes + List< HYPERLINK \l "DATATYPE_ObjectInstancePair" ObjectInstancePair> objInstIds + + + + Type Signature Details + + aggNames - The aggNames field shall contain a list of aggregation names to retrieve the AggregationIdentity and AggregationDefinition object instance identifiers for. +The aggNames field may contain the wildcard value of '*' to return all supported AggregationIdentity and AggregationDefinition objects. +The wildcard value should be checked for first, if found no other checks of supplied identifiers shall be made. +If a provided identifier does not include a wildcard and does not match an existing AggregationIdentity object then this operation shall fail with an UNKNOWN error. + objInstIds - The response shall contain a list of matching AggregationIdentity and AggregationDefinition object instance identifiers. +The returned list shall maintain the same order as the submitted list unless the wildcard value was included in the request. + + Requirements + + + MO Errors + + The operation may return the following error: + UNKNOWN: One of the supplied identifiers is unknown. + + + + + + + + + + + + + + + + + + + + Error + Error # + ExtraInfo Type + ExtraInfo description + + + UNKNOWN + Defined in MAL + List<UInteger> + A list of the indexes of the error values shall be contained in the extra information field. + + + + + Operation: addAggregation + + + Overview + + The addAggregation operation allows a consumer to define one or more aggregations that do not currently exist. + The new AggregationIdentity and AggregationDefinition objects are expected to be stored in the COM archive by the provider of the aggregation service. + + + + + + + + + + + + + + + + + + + + Operation Identifier + addAggregation + + + Interaction Pattern + REQUEST + + + Pattern Sequence + Message + Nullable + Type Signature + + + IN + REQUEST + Yes + List< HYPERLINK \l "DATATYPE_AggregationCreationRequest" AggregationCreationRequest> aggDefDetails + + + OUT + RESPONSE + Yes + List< HYPERLINK \l "DATATYPE_ObjectInstancePair" ObjectInstancePair> newObjInstIds + + + + Type Signature Details + + aggDefDetails - The aggDefDetails field shall hold the name and the AggregationDefinitionDetails to be added. +The name field must not be the wildcard '*', or empty (an INVALID error shall be returned in this case). +If the supplied reportInterval or sampleInterval values are not supported by the provider then an INVALID error shall be returned. +The supplied name must be unique among all AggregationIdentity objects for the domain of the provider otherwise a DUPLICATE error shall be raised. +If an error is raised then no new identities and definitions shall be added as a result of this operation call. +If the supplied name matches an existing, but removed, AggregationIdentity then that AggregationIdentity shall be reused otherwise a new AggregationIdentity shall be created. +The provider shall create a new AggregationDefinition object and store it, and any new AggregationIdentity objects, in the COM archive. + newObjInstIds - The response shall contain the list of object instance identifiers for the AggregationIdentity and new AggregationDefinition objects. +The returned list shall maintain the same order as the submitted definitions. + + Requirements + + + MO Errors + + The operation may return one of the following errors: + DUPLICATE: One or more of the aggregation objects being added has supplied an aggregation name that is already in use in the domain. + INVALID: One of the supplied aggregation objects contains an invalid name or a supplied interval is not supported by the provider. + + + + + + + + + + + + + + + + + + + + Error + Error # + ExtraInfo Type + ExtraInfo description + + + DUPLICATE + Defined in COM + List<UInteger> + The extra information field contains a list of the indexes of the erroneous values from the originating request list. + + + INVALID + Defined in COM + List<UInteger> + The extra information field contains a list of the indexes of the erroneous values from the originating list supplied. + + + + + Operation: updateDefinition + + + Overview + + The updateDefinition operation allows a consumer to update a definition for one or more aggregations. + This differs from deleting an existing aggregation and adding a new definition with the same aggregation name in the fact that the AggregationIdentity object is not changed between the two definitions. + The replacement definition should be stored in the COM archive by the service provider. The operation does not remove the previous object from the COM archive, merely removes the object from the provider. + + + + + + + + + + + + + + + + + + + + Operation Identifier + updateDefinition + + + Interaction Pattern + REQUEST + + + Pattern Sequence + Message + Nullable + Type Signature + + + IN + REQUEST + YesYes + List<Long> aggInstIdsList< HYPERLINK \l "DATATYPE_AggregationDefinitionDetails" AggregationDefinitionDetails> aggDefDetails + + + OUT + RESPONSE + Yes + List<Long> newObjInstIds + + + + Type Signature Details + + aggInstIds - The aggInstIds field shall contain the object instance identifiers of the AggregationIdentity objects to be updated. +The supplied object instance identifiers shall match existing identity objects, an UNKNOWN error shall be raised if this is not the case. +If the aggInstIds list contains either NULL or '0' an INVALID error shall be raised. + aggDefDetails - The aggDefDetails field shall contain the replacement AggregationDefinitionDetails. +The two lists shall be ordered the same. +The number of entries in the two lists shall be the same size otherwise an INVALID error shall be returned. +If the supplied reportInterval or sampleInterval values are not supported by the provider then an INVALID error shall be returned. +If an error is raised then no definitions shall be updated as a result of this operation call. +The provider shall create a new AggregationDefinition object and store it in the COM archive. +The new AggregationDefinition object shall be the current AggregationDefinition used for the specific AggregationIdentity. + newObjInstIds - The response shall contain the list of object instance identifiers for the new AggregationDefinition objects. +The returned list shall maintain the same order as the submitted definitions. + + Requirements + + + MO Errors + + The operation may return one of the following errors: + UNKNOWN: One of the supplied AggregationIdentity object instance identifiers is unknown. + INVALID: The supplied object instance identifiers list contains either a NULL or '0' or the two supplied lists are not the same length or a supplied interval is not supported by the provider. + INVALID: If the two lists are not the same length then the extra information field shall contain the first index of the element in the largest list which does not have corresponding element in the other list. + + + + + + + + + + + + + + + + + + + + Error + Error # + ExtraInfo Type + ExtraInfo description + + + UNKNOWN + Defined in MAL + List<UInteger> + A list of the indexes of the error values shall be contained in the extra information field. + + + INVALID + Defined in COM + List<UInteger> + The extra information field contains a list of the indexes of the erroneous values from the originating list supplied. + + + + + Operation: removeAggregation + + + Overview + + The removeAggregation operation allows a consumer to remove one or more aggregations from the list of aggregations supported by the aggregation provider. + The operation does not remove the AggregationIdentity or AggregationDefinition objects from the COM archive, merely removes the objects from the provider. This permits existing AggregationValueInstance objects to continue to reference the correct AggregationDefinition object in the COM archive. + + + + + + + + + + + + + + + + + + + + Operation Identifier + removeAggregation + + + Interaction Pattern + SUBMIT + + + Pattern Sequence + Message + Nullable + Type Signature + + + IN + SUBMIT + Yes + List<Long> aggInstIds + + + + Type Signature Details + + aggInstIds - The aggInstIds field shall hold the object instance identifiers of the AggregationIdentity objects to be removed from the provider. +The list may contain the wildcard value of '0'. +The wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made. +If a provided AggregationIdentity object instance identifier does not include a wildcard and does not match an existing aggregation then this operation shall fail with an UNKNOWN error. +Matched AggregationIdentity and AggregationDefinition objects shall not be removed from the COM archive only the list of AggregationIdentity and AggregationDefinition objects in the provider. +If an error is raised then no aggregations shall be removed as a result of this operation call. +If the operation succeeds then the provider shall not publish aggregation values for the deleted AggregationIdentity objects anymore. + + Requirements + + + MO Errors + + The operation may return the following error: + UNKNOWN: One of the supplied AggregationIdentity object instance identifiers is unknown. + + + + + + + + + + + + + + + + + + + + Error + Error # + ExtraInfo Type + ExtraInfo description + + + UNKNOWN + Defined in MAL + List<UInteger> + A list of the indexes of the error values shall be contained in the extra information field. + + + + + Service: Conversion + + + Overview + + The conversion service provides a set of basic conversion definition types that allows the specification of a conversion between two representations. These conversions are used by the other MC services (such as Action, Alert, and Parameter) to define conversions from raw field representations to some engineering representation. + Conversions are associated with other entities such as parameters or action/alert arguments through the configuration of the relevant service (action/alert/parameter). + The conversion service does not provide any operations directly, but allows consumers to add, remove, and modify conversion definitions via the COM archive. + + Table + + STYLEREF "Heading 1"\l \n \t \* MERGEFORMAT 1 SEQ Table \s 1 1tc \f T " + 1 + - SEQ Table_TOC \s 1 1 + Conversion Service Operations + " + : Conversion Service Operations + + + + + + + + + + + + + + + + + + + + + + Area Identifier + Service Identifier + Area Number + Service Number + Area Version + + + MC + Conversion + 4 + 7 + 1 + + + Interaction Pattern + Operation Identifier + Operation Number + Capability Set + + + + Service-level Requirements + + The conversion service shall provide the capability for maintaining the list of conversion definitions. + The conversion service shall use the COM archive operations for maintaining the conversion definitions. + Updating a conversion definition shall be performed by adding a new conversion definition and referencing it in the service specific COM objects (such as ParameterDefinition). + A Discrete conversion must contain at least one pair of values in the mapping. + A Line conversion must contain at least two line points. + A Polynomial conversion must contain at least one pair of values in the points list. + A Range conversion must contain at least one pair of values in the points list. + The service that references a conversion should ensure that the conversion referenced is correct. + + COM usage + + Each conversion shall be represented by a ConversionIdentity COM object. + The body of the ConversionIdentity COM object shall hold the name of the conversion. + The definitions of the conversions shall be represented as either DiscreteConversion, LineConversion, PolyConversion, or RangeConversion COM objects. + The conversion definition object shall use the related link to indicate which ConversionIdentity object it uses. + The source link of the ConversionIdentity object should be the object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used. + The source link of the conversion definition object should be the object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used. + Other service objects shall reference instances of a conversion using the object instance identifier of the conversion definition. + + Table + + STYLEREF "Heading 1"\l \n \t \* MERGEFORMAT 1 SEQ Table \s 1 1tc \f T " + 1 + - SEQ Table_TOC \s 1 1 + Conversion Service Object Types + " + : Conversion Service Object Types + + + + + + + + + + + + + + + + + + + + + + Object Number + Object Name + Object Body Type + Related link + Source link + + + 1 + ConversionIdentity + Identifier + Set to NULL + The object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used. + + + 2 + DiscreteConversion + HYPERLINK \l "DATATYPE_DiscreteConversionDetails" DiscreteConversionDetails + 1 + The object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used. + + + 3 + LineConversion + HYPERLINK \l "DATATYPE_LineConversionDetails" LineConversionDetails + 1 + The object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used. + + + 4 + PolyConversion + HYPERLINK \l "DATATYPE_PolyConversionDetails" PolyConversionDetails + 1 + The object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used. + + + 5 + RangeConversion + HYPERLINK \l "DATATYPE_RangeConversionDetails" RangeConversionDetails + 1 + The object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used. + + + + COM Object Relationships + + The Figure below shows the COM object relationships for this service: + + Figure + + STYLEREF "Heading 1"\l \n \t \* MERGEFORMAT 1 SEQ Figure \s 1 1tc \f T " + 1 + - SEQ Figure_TOC \s 1 1 + Conversion Service COM object relationships + " + : Conversion Service COM object relationships + + + COM Archive Service usage + + ConversionIdentity and conversion definition objects should be stored in the COM archive. + Each instance of a conversion definition shall be represented by an object instance held in the COM archive. + The COM archive service operations shall be used to add, update and remove conversions. + Other services should monitor the archive service for changes to conversions they reference. + + + Service: Group + + + Overview + + The group service provides a mechanism for other services to reference sets of their own objects using a single group reference. These groups are used by the other MC services (such as Action, Alert, Check, Aggregation and Parameter) to reduce the complexity of operations by allowing consumers to reference groups of objects (such as parameters) in operations rather than having to supply large lists of object references. + Where operations of other service mention the use of groups in their operations, any reference to a group object instance identifier implicitly means a GroupIdentity object. + Groups of other groups is supported, however all objects within the group of groups should have the same object type as most operations expect a single type. + The creation of cyclic group of groups should also be avoided. + The group service does not provide any operations directly, but allows consumers to add, remove, and modify groups via the COM archive. + + Table + + STYLEREF "Heading 1"\l \n \t \* MERGEFORMAT 1 SEQ Table \s 1 1tc \f T " + 1 + - SEQ Table_TOC \s 1 1 + Group Service Operations + " + : Group Service Operations + + + + + + + + + + + + + + + + + + + + + + Area Identifier + Service Identifier + Area Number + Service Number + Area Version + + + MC + Group + 4 + 8 + 1 + + + Interaction Pattern + Operation Identifier + Operation Number + Capability Set + + + + Service-level Requirements + + The group service shall provide the capability for maintaining the list of groups. + The group service shall use the COM archive operations for maintaining the group definitions. + Updating a group definition shall be performed by adding a new group definition and referencing it in the service specific COM objects. + + COM usage + + Each group shall be represented by a GroupIdentity COM object. + The body of the GroupIdentity COM object shall hold the name of the group. + The definitions of the groups shall be represented as GroupDefinition COM objects. + The GroupDefinition object shall use the related link to indicate which GroupIdentity object it uses. + The source link of the GroupIdentity object should be the object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used. + The source link of the GroupDefinition object should be the object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used. + Groups of groups shall reference instances of a group using the object instance identifier of the GroupIdentity. + Other service objects shall reference instances of a group using the object instance identifier of the GroupIdentity. + + Table + + STYLEREF "Heading 1"\l \n \t \* MERGEFORMAT 1 SEQ Table \s 1 1tc \f T " + 1 + - SEQ Table_TOC \s 1 1 + Group Service Object Types + " + : Group Service Object Types + + + + + + + + + + + + + + + + + + + + + + Object Number + Object Name + Object Body Type + Related link + Source link + + + 1 + GroupIdentity + Identifier + Set to NULL + The object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used. + + + 2 + GroupDefinition + HYPERLINK \l "DATATYPE_GroupDetails" GroupDetails + 1 + The object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used. + + + + COM Object Relationships + + The Figure below shows the COM object relationships for this service: + + Figure + + STYLEREF "Heading 1"\l \n \t \* MERGEFORMAT 1 SEQ Figure \s 1 1tc \f T " + 1 + - SEQ Figure_TOC \s 1 1 + Group Service COM object relationships + " + : Group Service COM object relationships + + + COM Archive Service usage + + GroupIdentity and GroupDefinition objects should be stored in the COM archive. + The COM archive service operations shall be used to add, update and remove groups. + Other services should monitor the archive service for changes to groups they reference. + + Data types + + + Area data types: MC + + + + Enumeration: Severity + + The severity enumeration holds the possible values for a severity. The numerical value represents the increasing severity, therefore CRITICAL is more severe than ALARM. Normally, for checks, only the Warning and Critical ranges are used: the colour yellow is associated with Warning, and the colour red is associated with Critical. + + + + + + + + + + + + + + + + + + + Name + Severity + + + Short Form Part + 6 + + + Enumeration Value + Numerical Value + Comment + + + INFORMATIONAL + 1 + Indicates a nominal situation with no consequences. + + + WARNING + 2 + Indicates unexpected behaviour without directly threatening consequences. + + + ALARM + 3 + Indicates behaviour of serious concern requiring the attention of an operator, but not necessarily a malfunction. + + + SEVERE + 4 + Indicates that the monitored item has malfunctioned. Requires operator attention. + + + CRITICAL + 5 + Indicates behaviour with mission threatening consequences. Requires operator attention. + + + + + Composite: ArgumentDefinitionDetails + + The ArgumentDefinitionDetails structure holds the details of an argument definition with a set of associated attributes, such as conversion used. The conditionalConversions define the conditions where a referenced conversion is applied. Only the first TRUE conversion should be applied. + + + + + + + + + + + + + + + + + + + + Name + ArgumentDefinitionDetails + + + Extends + Composite + + + Short Form Part + 1 + + + Field + Type + Nullable + Comment + + + argId + Identifier + No + Holds the argument definition identifier. + + + description + String + Yes + Optional argument description. + + + rawType + Octet + No + Holds the attribute short form part of the raw type of the argument, e.g., for a MAL::String argument it shall hold 15. + + + rawUnit + String + Yes + The unit for the raw value. + + + conditionalConversions + List< HYPERLINK \l "DATATYPE_ConditionalConversion" ConditionalConversion> + Yes + The conditional conversions to apply to the argument. Only the first TRUE conversion should be applied. + + + convertedType + Octet + Yes + Holds the attribute short form part of the converted type of the argument, e.g., for a MAL::String argument it shall hold 15. Must not be NULL if a conversion condition is supplied. + + + convertedUnit + String + Yes + The converted argument units. + + + + + Composite: AttributeValue + + The AttributeValue structure holds an Attribute value. It allows a list of different Attribute types to be created whereas List of Attribute would require the values to be all of the same type. + + + + + + + + + + + + + + + + + + + + Name + AttributeValue + + + Extends + Composite + + + Short Form Part + 2 + + + Field + Type + Nullable + Comment + + + value + Attribute + No + The argument value. Must not be NULL. NULL may be represented by having a NULL in place of the complete AttributeValue composite. + + + + + Composite: ConditionalConversion + + The ConditionalConversion structure holds a condition expression to be evaluated to determine if a specific Conversion should be used. In the case that no test is required, i.e., the conversion should always be used, then the condition field should be set to NULL. + + + + + + + + + + + + + + + + + + + + Name + ConditionalConversion + + + Extends + Composite + + + Short Form Part + 3 + + + Field + Type + Nullable + Comment + + + condition + HYPERLINK \l "DATATYPE_ParameterExpression" ParameterExpression + Yes + The expression indicates which entities are applicable for this check. If NULL, then the condition shall evaluate to TRUE. + + + conversionId + COM::ObjectKey + No + The object instance identifier of the ConversionIdentity object to be used if the condition evaluates to TRUE or is NULL. + + + + + Composite: ParameterExpression + + The ParameterExpression structure represents a simple expression between a parameter and a value for that parameter. + + + + + + + + + + + + + + + + + + + + Name + ParameterExpression + + + Extends + Composite + + + Short Form Part + 4 + + + Field + Type + Nullable + Comment + + + parameterId + COM::ObjectKey + No + Holds the object instance identifier of the ParameterIdentity object to be used in the expression. + + + operator + COM::Archive::ExpressionOperator + No + The expression operator. + + + useConverted + Boolean + No + If set to TRUE the converted value field of the parameter value should be used, otherwise the raw value field should be used. + + + value + Attribute + Yes + The value to be used in the expression. + + + + + Composite: ObjectInstancePair + + The ObjectInstancePair structure is used to hold the object instance identifier of an Identity object with its associated Definition object. + + + + + + + + + + + + + + + + + + + + Name + ObjectInstancePair + + + Extends + Composite + + + Short Form Part + 7 + + + Field + Type + Nullable + Comment + + + objIdentityInstanceId + Long + No + The object instance identifier of the Identity object. + + + objDefInstanceId + Long + No + The object instance identifier of the Definition object. + + + + Service data types: Action + + + + Enumeration: ActionCategory + + Contains the default Action category values. It is implementation specific what the meaning of the values are in a particular context. + + + + + + + + + + + + + + + + + + + Name + ActionCategory + + + Short Form Part + 4 + + + Enumeration Value + Numerical Value + Comment + + + DEFAULT + 1 + Default category + + + HIPRIORITY + 2 + Category for high priority actions + + + CRITICAL + 3 + Category for critical actions + + + + + Composite: ActionDefinitionDetails + + The ActionDefinitionDetails structure holds the definition information of an action. + + + + + + + + + + + + + + + + + + + + Name + ActionDefinitionDetails + + + Extends + Composite + + + Short Form Part + 1 + + + Field + Type + Nullable + Comment + + + description + String + No + The description of the action. + + + category + UOctet + No + Category of the action. Value taken from ActionCategory enumeration, although the use of a UOctet allows deployment specific extension. Extensions must use values greater than 127. + + + progressStepCount + UShort + No + Total number of steps that will be reported if PROGRESS reporting is selected in the sent Action. 0 if PROGRESS reporting is not used. + + + arguments + List< HYPERLINK \l "DATATYPE_ArgumentDefinitionDetails" ArgumentDefinitionDetails> + Yes + The list of argument definitions. If no arguments are defined, then the complete list is replaced with a NULL. + + + + + Composite: ActionInstanceDetails + + The ActionInstanceDetails structure holds the information required for an instance of an Action such as the argument values to use. + + + + + + + + + + + + + + + + + + + + Name + ActionInstanceDetails + + + Extends + Composite + + + Short Form Part + 2 + + + Field + Type + Nullable + Comment + + + defInstId + Long + No + The object instance identifier of the ActionDefinition to be used. + + + stageStartedRequired + Boolean + No + If TRUE, then an activity event of type Execution is required for the STARTED stage. + + + stageProgressRequired + Boolean + No + If TRUE, then activity events of type Execution are required for the PROGRESS stages. + + + stageCompletedRequired + Boolean + No + If TRUE, then an activity event of type Execution is required for the COMPLETION stage. + + + argumentValues + List< HYPERLINK \l "DATATYPE_AttributeValue" AttributeValue> + Yes + List containing the values of the arguments. The ordering of the list matches that of the definition. If a value for a particular entry is not being supplied, then its position is filled with a NULL value. If no arguments are defined, then the complete list is replaced with a NULL. + + + argumentIds + List<Identifier> + Yes + Optional list of argument definition identifiers. Allows the provider to verify that the correct arguments are being supplied. The ordering of the list matches that of the argument list of the action definition. + + + isRawValue + List<Boolean> + Yes + Optional list of Booleans that determine whether the supplied argument values are raw or converted. If the Boolean for a particular value is TRUE or NULL then that value is assumed to be raw. If the complete isRawValue list is NULL then all arguments are assumed to be raw values. +The ordering of the list matches that of the argument list of the action definition. + + + + + Composite: ActionCreationRequest + + The ActionCreationRequest contains all the fields required when creating a new action in a provider. + + + + + + + + + + + + + + + + + + + + Name + ActionCreationRequest + + + Extends + Composite + + + Short Form Part + 3 + + + Field + Type + Nullable + Comment + + + name + Identifier + No + The name of the action. Must not be empty or the wildcard value. + + + actionDefDetails + HYPERLINK \l "DATATYPE_ActionDefinitionDetails" ActionDefinitionDetails + No + The action definition details. + + + + Service data types: Parameter + + + + Enumeration: ValidityState + + Convenience enumeration that holds the validity states and their numeric values. + + + + + + + + + + + + + + + + + + + Name + ValidityState + + + Short Form Part + 4 + + + Enumeration Value + Numerical Value + Comment + + + VALID + 0 + Valid. + + + EXPIRED + 1 + The parameter has a timeout associated which has expired + + + INVALID_RAW + 2 + The parameter raw value cannot be obtained, or calculated for synthetic parameters + + + INVALID_CONVERSION + 3 + The validity expression either has evaluated to TRUE or there is no validity defined, but the conversion of the parameter value has failed (for example an unexpected value for a discrete conversion) + + + UNVERIFIED + 4 + The validity of the validity expression has been evaluated to FALSE and therefore cannot be used to verify the current value + + + INVALID + 5 + The validity expression has been evaluated to FALSE + + + + + Composite: ParameterDefinitionDetails + + The ParameterDefinitionDetails structure holds a parameter definition. The conversion field defines the conditions where the relevant conversion is applied. For onboard parameters, the report interval should be a multiple of the minimum sampling interval of that parameter. + + + + + + + + + + + + + + + + + + + + Name + ParameterDefinitionDetails + + + Extends + Composite + + + Short Form Part + 1 + + + Field + Type + Nullable + Comment + + + description + String + No + The description of the parameter. May be empty. + + + rawType + Octet + No + Holds the attribute short form part of the raw type of the parameter, e.g., for a MAL::String parameter it shall hold 15. + + + rawUnit + String + Yes + The unit for the raw value. If NULL then raw type has no unit. + + + generationEnabled + Boolean + No + Controls whether reports for this parameter are to be generated. + + + reportInterval + Duration + No + Periodic report interval. No periodic reports to be generated if this is set to '0'. + + + validityExpression + HYPERLINK \l "DATATYPE_ParameterExpression" ParameterExpression + Yes + Expression that determines this parameter's validity state. Can be NULL if no validity check is required or validity is calculated by implementation-specific mechanisms. + + + conversion + HYPERLINK \l "DATATYPE_ParameterConversion" ParameterConversion + Yes + If present then parameter has a converted type. + + + + + Composite: ParameterValue + + This structure holds a specific value of the parameter. The type of the value shall match that specified in the parameter definition. + + + + + + + + + + + + + + + + + + + + Name + ParameterValue + + + Extends + Composite + + + Short Form Part + 2 + + + Field + Type + Nullable + Comment + + + validityState + UOctet + No + Holds the validity state for a parameter value. If the parameter is valid then this should be set to '0'. + + + rawValue + Attribute + Yes + The parameter raw value. The value of NULL is a valid value and carries no special significance in the parameter service. + + + convertedValue + Attribute + Yes + The parameter converted value. + + + + + Composite: ParameterConversion + + The ParameterConversion structure holds information about the conversions to be applied to a parameter. + + + + + + + + + + + + + + + + + + + + Name + ParameterConversion + + + Extends + Composite + + + Short Form Part + 3 + + + Field + Type + Nullable + Comment + + + convertedType + Octet + No + Holds the attribute short form part of the converted type of the parameter, e.g., for a MAL::String parameter it shall hold 15. + + + convertedUnit + String + Yes + The converted parameter unit. If NULL then converted type has no unit. + + + conditionalConversions + List< HYPERLINK \l "DATATYPE_ConditionalConversion" ConditionalConversion> + No + The conversions to be applied. Only the first TRUE conversion should be applied. + + + + + Composite: ParameterCreationRequest + + The ParameterCreationRequest contains all the fields required when creating a new parameter in a provider. + + + + + + + + + + + + + + + + + + + + Name + ParameterCreationRequest + + + Extends + Composite + + + Short Form Part + 5 + + + Field + Type + Nullable + Comment + + + name + Identifier + No + The name of the parameter. Must not be empty or the wildcard value. + + + paramDefDetails + HYPERLINK \l "DATATYPE_ParameterDefinitionDetails" ParameterDefinitionDetails + No + The parameter definition details. + + + + + Composite: ParameterRawValue + + The ParameterRawValue structure holds a new raw value for a specific parameter. + + + + + + + + + + + + + + + + + + + + Name + ParameterRawValue + + + Extends + Composite + + + Short Form Part + 6 + + + Field + Type + Nullable + Comment + + + paramInstId + Long + No + The object instance identifier of the parameter identity. + + + rawValue + Attribute + Yes + The parameter raw value. The value of NULL is a valid value and carries no special significance in the parameter service. + + + + + Composite: ParameterValueDetails + + This structure holds a specific time stamped value of the parameter. The type of the value shall match that specified in the parameter definition. + + + + + + + + + + + + + + + + + + + + Name + ParameterValueDetails + + + Extends + Composite + + + Short Form Part + 7 + + + Field + Type + Nullable + Comment + + + paramId + Long + No + The ParameterIdentity object instance identifier. + + + defId + Long + No + The ParameterDefinition object instance identifier. + + + timestamp + Time + No + The timestamp of the value. + + + value + HYPERLINK \l "DATATYPE_ParameterValue" ParameterValue + No + The parameter value. + + + + Service data types: Alert + + + + Composite: AlertDefinitionDetails + + The AlertDefinitionDetails provides the definition of an alert including any argument definitions. + + + + + + + + + + + + + + + + + + + + Name + AlertDefinitionDetails + + + Extends + Composite + + + Short Form Part + 1 + + + Field + Type + Nullable + Comment + + + description + String + No + The description of the alert. + + + severity + HYPERLINK \l "DATATYPE_Severity" Severity + No + Severity of the alert. + + + generationEnabled + Boolean + No + Controls whether instances of this alert are to be generated. + + + arguments + List< HYPERLINK \l "DATATYPE_ArgumentDefinitionDetails" ArgumentDefinitionDetails> + No + The list of argument definitions. + + + + + Composite: AlertEventDetails + + The AlertEventDetails structure holds the details of an instance of an alert. + + + + + + + + + + + + + + + + + + + + Name + AlertEventDetails + + + Extends + Composite + + + Short Form Part + 2 + + + Field + Type + Nullable + Comment + + + argumentValues + List< HYPERLINK \l "DATATYPE_AttributeValue" AttributeValue> + Yes + List containing the values of the arguments. The ordering of the list matches that of the definition. If a value for a particular entry is not being supplied, then its position is filled with a NULL value. If no arguments are defined, then the complete list is replaced with a NULL. + + + argumentIds + List<Identifier> + Yes + Optional list of argument definition identifiers. Allows the consumer to verify that the correct arguments are being supplied. The ordering of the list matches that of the argument list of the alert definition. + + + + + Composite: AlertCreationRequest + + The AlertCreationRequest contains all the fields required when creating a new alert in a provider. + + + + + + + + + + + + + + + + + + + + Name + AlertCreationRequest + + + Extends + Composite + + + Short Form Part + 3 + + + Field + Type + Nullable + Comment + + + name + Identifier + No + Alert name. Must not be empty or wildcard value. + + + alertDefDetails + HYPERLINK \l "DATATYPE_AlertDefinitionDetails" AlertDefinitionDetails + No + The alert definition details. + + + + Service data types: Check + + + + Enumeration: CheckState + + The CheckState enumeration holds the possible basic states of a check. The meaning of the NOT_OK value is check specific and detailed in the relevant check type definition. + + + + + + + + + + + + + + + + + + + Name + CheckState + + + Short Form Part + 6 + + + Enumeration Value + Numerical Value + Comment + + + DISABLED + 1 + The check is disabled. + + + UNCHECKED + 2 + The check is enabled but has not passed the selection condition expression. + + + INVALID + 3 + Check is enabled, has passed the selection condition, but the entity being checked is not in a valid state and therefore has not been checked. + + + OK + 4 + The check is OK. + + + NOT_OK + 5 + The check is not OK. + + + + + Composite: CheckDefinitionDetails + + The CheckDefinitionDetails structure holds the definition of a check. + + + + + + + + + + + + + + + + + + + + Name + CheckDefinitionDetails + + + Extends + Composite + + + Abstract + + + Field + Type + Nullable + Comment + + + description + String + No + The description of the check. May be empty. + + + checkSeverity + HYPERLINK \l "DATATYPE_Severity" Severity + No + Indicates the seriousness of the violation based on its possible negative consequences. + + + maxReportingInterval + Duration + No + Maximum interval that can elapse between generations of CheckResult reports. If this value expires, then a CheckResult is generated with the same state for the previous and current state. If set to '0', then no maximum reporting interval shall be applied. + + + nominalCount + UInteger + No + Number of consecutive valid samples passing the check for the check to be OK. + + + nominalTime + Duration + No + If nominalCount is zero then this is duration that a parameter is continuously passing the check for the check to be OK. If nominalCount is not zero then this is the period over which samples will be used in the nominalCount calculation, i.e. samples further in the past than nominalTime are not considered. + + + violationCount + UInteger + No + Number of consecutive valid samples violating the check for the check to be in violation. + + + violationTime + Duration + No + If violationCount is zero then this is duration that a parameter is continuously violating the check for the check to be in violation. If violationCount not zero then this is the period over which samples will be used in the violationCount calculation, i.e. samples further in the past than violationTime are not considered. + + + + + Composite: CheckLinkDetails + + The CheckLinkDetails structure represents the link from a check definition to a check result for a specific parameter. + + + + + + + + + + + + + + + + + + + + Name + CheckLinkDetails + + + Extends + Composite + + + Short Form Part + 1 + + + Field + Type + Nullable + Comment + + + checkEnabled + Boolean + No + TRUE if the check instance is enabled. + + + checkOnChange + Boolean + No + If TRUE then any change to state or value of the parameter, or the check condition will trigger a check evaluation. Ignored for Compound checks. + + + useConverted + Boolean + No + If set to TRUE the converted value field of the parameter value should be used, otherwise the raw value field should be used. Ignored for Compound checks. + + + checkInterval + Duration + No + The interval that a check should be applied. Only applicable if checkOnChange is FALSE. If '0', then no periodic checking shall be performed, and a check will be triggered by another mechanism. Ignored for Compound checks. + + + condition + HYPERLINK \l "DATATYPE_ParameterExpression" ParameterExpression + Yes + Should this check be applied, if NULL then always applied. + + + + + Composite: CheckResult + + The CheckResult structure holds basic information about the check state and the value of the parameter at the time of the check. The timestamp of the event is the transition time of the check. + + + + + + + + + + + + + + + + + + + + Name + CheckResult + + + Extends + Composite + + + Short Form Part + 2 + + + Field + Type + Nullable + Comment + + + previousCheckState + HYPERLINK \l "DATATYPE_CheckState" CheckState + No + The previous evaluation state of the check. Initially UNCHECKED for the first transition of a check. For check evaluations that do not detect a check transition, this value will be the same as the currentCheckState. + + + currentCheckState + HYPERLINK \l "DATATYPE_CheckState" CheckState + No + The current evaluation state of the check + + + paramDefInstId + Long + Yes + The object instance identifier of the ParameterDefinition used for the check evaluation. NULL if compound check. + + + checkedValue + Attribute + Yes + This is the value of the parameter or for a compound check the number of checks in violation at the time of a check state transition, or if it is a report due to the CheckDefinitionDetails maxReportingInterval expiring, then it is the value or the number when the interval expired. + + + + + Composite: CheckLinkSummary + + The CheckLinkSummary structure holds the ids of a specific check link and the check and parameter it links to. + + + + + + + + + + + + + + + + + + + + Name + CheckLinkSummary + + + Extends + Composite + + + Short Form Part + 3 + + + Field + Type + Nullable + Comment + + + checkId + Long + No + The object instance identifier of the CheckIdentity object. + + + linkId + Long + No + The object instance identifier of the CheckLink object. + + + linkDefinitionId + Long + No + Contains the object instance identifier of the CheckLinkDefinition object. + + + checkEnabled + Boolean + No + TRUE if the check instance is enabled. + + + parameterId + COM::ObjectKey + Yes + The object instance identifier of the ParameterIdentity object for the check link. NULL for Compound checks. + + + + + Composite: CheckResultSummary + + The CheckResultSummary structure holds details about a specific check link and its evaluated result. + + + + + + + + + + + + + + + + + + + + Name + CheckResultSummary + + + Extends + Composite + + + Short Form Part + 4 + + + Field + Type + Nullable + Comment + + + linkId + Long + No + The object instance identifier of the check link. + + + checkEnabled + Boolean + No + The current enabled state of the check link. + + + parameterId + COM::ObjectKey + Yes + The object instance key of the ParameterIdentity being checked. NULL only for Compound checks. + + + evaluationTime + Time + No + The timestamp of the check result. If as a result of max reporting interval expiring then it shall contain the expiration timestamp. + + + result + HYPERLINK \l "DATATYPE_CheckResult" CheckResult + No + The check result value. + + + + + Composite: CheckResultFilter + + The CheckResultFilter structure holds a filter for the current check result transition information. + + + + + + + + + + + + + + + + + + + + Name + CheckResultFilter + + + Extends + Composite + + + Short Form Part + 5 + + + Field + Type + Nullable + Comment + + + checkFilterViaGroups + Boolean + No + If TRUE then the checkFilter field contains GroupIdentity object instance identifiers that link to CheckIdentity objects otherwise it contains CheckIdentity object instance identifiers directly. + + + checkFilter + List<Long> + No + The list of GroupIdentity object instance identifiers if checkFilterViaGroups is TRUE otherwise the CheckIdentity object instance identifiers to filter on. A value of '0' means match all. + + + parameterFilterViaGroups + Boolean + No + If TRUE then the parameterFilter field contains GroupIdentity object instance identifiers that link to ParameterIdentity objects otherwise it contains ParameterIdentity object instance identifiers directly. + + + parameterFilter + List<Long> + No + The list of GroupIdentity object instance identifiers if parameterFilterViaGroups is TRUE otherwise the ParameterIdentity object instance identifiers to filter on. A value of '0' means match all. + + + stateFilter + List< HYPERLINK \l "DATATYPE_CheckState" CheckState> + No + The list of required check states to filter on. Empty list means match all. + + + + + Composite: ReferenceValue + + The ReferenceValue structure defines a value to compare against. A validCount of '1' and deltaTime of '0' would compare against the previous sample value. + + + + + + + + + + + + + + + + + + + + Name + ReferenceValue + + + Extends + Composite + + + Short Form Part + 7 + + + Field + Type + Nullable + Comment + + + validCount + UShort + No + Number of valid samples that should be collected to update the reference value. + + + deltaTime + Duration + No + Delta time from now into the past from which the reference value should be sampled. + + + parameterId + COM::ObjectKey + Yes + The ParameterIdentity object to compare against. If NULL, then checked parameter should be compared against itself. + + + + + Composite: ConstantCheckDefinition + + The ConstantCheckDefinition structure holds the constant values to compare against for a consistency check. + + + + + + + + + + + + + + + + + + + + Name + ConstantCheckDefinition + + + Extends + HYPERLINK \l "DATATYPE_CheckDefinitionDetails" CheckDefinitionDetails + + + Short Form Part + 8 + + + Field + Type + Nullable + Comment + + + description + String + No + The description of the check. May be empty. + + + checkSeverity + HYPERLINK \l "DATATYPE_Severity" Severity + No + Indicates the seriousness of the violation based on its possible negative consequences. + + + maxReportingInterval + Duration + No + Maximum interval that can elapse between generations of CheckResult reports. If this value expires, then a CheckResult is generated with the same state for the previous and current state. If set to '0', then no maximum reporting interval shall be applied. + + + nominalCount + UInteger + No + Number of consecutive valid samples passing the check for the check to be OK. + + + nominalTime + Duration + No + If nominalCount is zero then this is duration that a parameter is continuously passing the check for the check to be OK. If nominalCount is not zero then this is the period over which samples will be used in the nominalCount calculation, i.e. samples further in the past than nominalTime are not considered. + + + violationCount + UInteger + No + Number of consecutive valid samples violating the check for the check to be in violation. + + + violationTime + Duration + No + If violationCount is zero then this is duration that a parameter is continuously violating the check for the check to be in violation. If violationCount not zero then this is the period over which samples will be used in the violationCount calculation, i.e. samples further in the past than violationTime are not considered. + + + operator + COM::Archive::ExpressionOperator + No + The operator to be used to perform the check. + + + values + List< HYPERLINK \l "DATATYPE_AttributeValue" AttributeValue> + No + The set of constant values to be checked against. An empty list means that any value change triggers the check. + + + + + Composite: ReferenceCheckDefinition + + The ReferenceCheckDefinition structure holds the key to another entity to compare against for a consistency check. + + + + + + + + + + + + + + + + + + + + Name + ReferenceCheckDefinition + + + Extends + HYPERLINK \l "DATATYPE_CheckDefinitionDetails" CheckDefinitionDetails + + + Short Form Part + 9 + + + Field + Type + Nullable + Comment + + + description + String + No + The description of the check. May be empty. + + + checkSeverity + HYPERLINK \l "DATATYPE_Severity" Severity + No + Indicates the seriousness of the violation based on its possible negative consequences. + + + maxReportingInterval + Duration + No + Maximum interval that can elapse between generations of CheckResult reports. If this value expires, then a CheckResult is generated with the same state for the previous and current state. If set to '0', then no maximum reporting interval shall be applied. + + + nominalCount + UInteger + No + Number of consecutive valid samples passing the check for the check to be OK. + + + nominalTime + Duration + No + If nominalCount is zero then this is duration that a parameter is continuously passing the check for the check to be OK. If nominalCount is not zero then this is the period over which samples will be used in the nominalCount calculation, i.e. samples further in the past than nominalTime are not considered. + + + violationCount + UInteger + No + Number of consecutive valid samples violating the check for the check to be in violation. + + + violationTime + Duration + No + If violationCount is zero then this is duration that a parameter is continuously violating the check for the check to be in violation. If violationCount not zero then this is the period over which samples will be used in the violationCount calculation, i.e. samples further in the past than violationTime are not considered. + + + operator + COM::Archive::ExpressionOperator + No + The operator to be used to perform the check. + + + checkReference + HYPERLINK \l "DATATYPE_ReferenceValue" ReferenceValue + No + The value to check against. + + + + + Composite: DeltaCheckDefinition + + The DeltaCheckDefinition defines a delta transition check. + + + + + + + + + + + + + + + + + + + + Name + DeltaCheckDefinition + + + Extends + HYPERLINK \l "DATATYPE_CheckDefinitionDetails" CheckDefinitionDetails + + + Short Form Part + 10 + + + Field + Type + Nullable + Comment + + + description + String + No + The description of the check. May be empty. + + + checkSeverity + HYPERLINK \l "DATATYPE_Severity" Severity + No + Indicates the seriousness of the violation based on its possible negative consequences. + + + maxReportingInterval + Duration + No + Maximum interval that can elapse between generations of CheckResult reports. If this value expires, then a CheckResult is generated with the same state for the previous and current state. If set to '0', then no maximum reporting interval shall be applied. + + + nominalCount + UInteger + No + Number of consecutive valid samples passing the check for the check to be OK. + + + nominalTime + Duration + No + If nominalCount is zero then this is duration that a parameter is continuously passing the check for the check to be OK. If nominalCount is not zero then this is the period over which samples will be used in the nominalCount calculation, i.e. samples further in the past than nominalTime are not considered. + + + violationCount + UInteger + No + Number of consecutive valid samples violating the check for the check to be in violation. + + + violationTime + Duration + No + If violationCount is zero then this is duration that a parameter is continuously violating the check for the check to be in violation. If violationCount not zero then this is the period over which samples will be used in the violationCount calculation, i.e. samples further in the past than violationTime are not considered. + + + checkReference + HYPERLINK \l "DATATYPE_ReferenceValue" ReferenceValue + No + The value to compare the current value against. + + + violateInRange + Boolean + No + If TRUE, then the safe (non violating) values lie outside the specified threshold range. + + + valueDelta + Boolean + No + If TRUE, then the thresholds contain value deltas. If FALSE, they contain percentage deltas. + + + lowerThreshold + Attribute + Yes + The lower threshold of the delta value. Must be of the correct type for the entity being checked. Must be a Float if percentage threshold in the range (-1.0 to 1.0 representing +-100%). + + + upperThreshold + Attribute + Yes + The upper threshold of the delta value. Must be of the correct type for the entity being checked. Must be a Float if percentage threshold in the range (-1.0 to 1.0 representing +-100%). + + + + + Composite: LimitCheckDefinition + + The LimitCheckDefinition defines a high and low limit check. It is valid to supply only one limit; the other limit is assumed to be the relevant maximum supported by the type being checked in this case. + + + + + + + + + + + + + + + + + + + + Name + LimitCheckDefinition + + + Extends + HYPERLINK \l "DATATYPE_CheckDefinitionDetails" CheckDefinitionDetails + + + Short Form Part + 11 + + + Field + Type + Nullable + Comment + + + description + String + No + The description of the check. May be empty. + + + checkSeverity + HYPERLINK \l "DATATYPE_Severity" Severity + No + Indicates the seriousness of the violation based on its possible negative consequences. + + + maxReportingInterval + Duration + No + Maximum interval that can elapse between generations of CheckResult reports. If this value expires, then a CheckResult is generated with the same state for the previous and current state. If set to '0', then no maximum reporting interval shall be applied. + + + nominalCount + UInteger + No + Number of consecutive valid samples passing the check for the check to be OK. + + + nominalTime + Duration + No + If nominalCount is zero then this is duration that a parameter is continuously passing the check for the check to be OK. If nominalCount is not zero then this is the period over which samples will be used in the nominalCount calculation, i.e. samples further in the past than nominalTime are not considered. + + + violationCount + UInteger + No + Number of consecutive valid samples violating the check for the check to be in violation. + + + violationTime + Duration + No + If violationCount is zero then this is duration that a parameter is continuously violating the check for the check to be in violation. If violationCount not zero then this is the period over which samples will be used in the violationCount calculation, i.e. samples further in the past than violationTime are not considered. + + + violateInRange + Boolean + No + If TRUE, then the safe (non violating) values lie outside the specified limits range. + + + lowerLimit + Attribute + Yes + The lower limit of the value. Must be of the correct type for the entity being checked. + + + upperLimit + Attribute + Yes + The upper limit of the value. Must be of the correct type for the entity being checked. + + + + + Composite: CompoundCheckDefinition + + The CompoundCheckDefinition structure holds the object instance identifiers of one or more check link objects to monitor for a compound check. + + + + + + + + + + + + + + + + + + + + Name + CompoundCheckDefinition + + + Extends + HYPERLINK \l "DATATYPE_CheckDefinitionDetails" CheckDefinitionDetails + + + Short Form Part + 12 + + + Field + Type + Nullable + Comment + + + description + String + No + The description of the check. May be empty. + + + checkSeverity + HYPERLINK \l "DATATYPE_Severity" Severity + No + Indicates the seriousness of the violation based on its possible negative consequences. + + + maxReportingInterval + Duration + No + Maximum interval that can elapse between generations of CheckResult reports. If this value expires, then a CheckResult is generated with the same state for the previous and current state. If set to '0', then no maximum reporting interval shall be applied. + + + nominalCount + UInteger + No + Number of consecutive valid samples passing the check for the check to be OK. + + + nominalTime + Duration + No + If nominalCount is zero then this is duration that a parameter is continuously passing the check for the check to be OK. If nominalCount is not zero then this is the period over which samples will be used in the nominalCount calculation, i.e. samples further in the past than nominalTime are not considered. + + + violationCount + UInteger + No + Number of consecutive valid samples violating the check for the check to be in violation. + + + violationTime + Duration + No + If violationCount is zero then this is duration that a parameter is continuously violating the check for the check to be in violation. If violationCount not zero then this is the period over which samples will be used in the violationCount calculation, i.e. samples further in the past than violationTime are not considered. + + + minimumChecksInViolation + UInteger + No + The number of referenced checks that must be in violation for this check to be considered in violation. If set to '0' then all referenced checks must be in violation. + + + checkLinkIds + List<Long> + No + The set of CheckLink objects that form the compound check. + + + + + Composite: CheckTypedInstance + + The CheckTypedInstance structure is used to hold the two COM object instance identifiers that form the identity and the body of the check definition in combination with the COM object type of the check body definition. + + + + + + + + + + + + + + + + + + + + Name + CheckTypedInstance + + + Extends + Composite + + + Short Form Part + 13 + + + Field + Type + Nullable + Comment + + + objDefCheckType + COM::ObjectType + No + The COM object type of the check body. + + + objInstIds + HYPERLINK \l "DATATYPE_ObjectInstancePair" ObjectInstancePair + Yes + The object instance identifiers. + + + + Service data types: Statistic + + + + Composite: StatisticFunctionDetails + + The StatisticFunctionDetails structure holds the details of the function. + + + + + + + + + + + + + + + + + + + + Name + StatisticFunctionDetails + + + Extends + Composite + + + Short Form Part + 1 + + + Field + Type + Nullable + Comment + + + name + Identifier + No + The name of the statistical function. + + + description + String + No + The description of the statistical function. + + + + + Composite: StatisticLinkDetails + + The StatisticLinkDetails structure holds the sampling, reporting, and collection intervals for one parameter statistic function link. + + + + + + + + + + + + + + + + + + + + Name + StatisticLinkDetails + + + Extends + Composite + + + Short Form Part + 2 + + + Field + Type + Nullable + Comment + + + samplingInterval + Duration + No + The interval between samples of the parameter. + + + reportingInterval + Duration + No + The interval between periodic reports being generated. If set to '0', then no periodic reports shall be sent. + + + collectionInterval + Duration + No + The collection and reset interval of the statistical evaluation for the linked parameter. If set to '0', then no periodic reset of the evaluation shall be performed. + + + resetEveryCollection + Boolean + No + If TRUE the evaluation will reset its value every collection interval. If FALSE it will maintain a moving evaluation of the function for the collection interval. + + + reportingEnabled + Boolean + No + TRUE if reporting of the evaluation instance is enabled. + + + useConverted + Boolean + No + If TRUE then use the converted value of the Parameter, else use the raw value + + + + + Composite: StatisticValue + + The StatisticValue structure holds the statistical result for a parameter. + + + + + + + + + + + + + + + + + + + + Name + StatisticValue + + + Extends + Composite + + + Short Form Part + 3 + + + Field + Type + Nullable + Comment + + + paramDefInstId + Long + No + The object instance identifier of the ParameterDefinition object used for the parameter. + + + startTime + Time + Yes + Time the statistic calculations started. This value can be NULL if the start time can be derived by other means, e.g., other start times in a set of StatisticValue structures. + + + endTime + Time + Yes + Time the statistic calculations ended. This value can be NULL if the time can be derived by other means, e.g., other times in a set of StatisticValue structures. + + + valueTime + Time + Yes + Time the statistic value was reached. The time is only applicable for particular statistic values such as min or max. Shall be NULL if not applicable for cases such as 'mean average'. + + + value + Attribute + Yes + Value of the statistic. + + + sampleCount + UInteger + No + Holds the number of samples that contributed to the statistic value. For calculated values such as 'mean average' this holds the number of samples that were used to calculate the value, for non-calculated values such as 'min' then it is the number of samples that were in the set evaluated. + + + + + Composite: StatisticCreationRequest + + The StatisticCreationRequest structure holds the link details for a specific parameter and function association. + + + + + + + + + + + + + + + + + + + + Name + StatisticCreationRequest + + + Extends + Composite + + + Short Form Part + 4 + + + Field + Type + Nullable + Comment + + + statFuncInstId + Long + No + The object instance identifier of the statistical function to be used. + + + parameterId + COM::ObjectKey + No + The object key of the ParameterIdentity object being referenced. + + + linkDetails + HYPERLINK \l "DATATYPE_StatisticLinkDetails" StatisticLinkDetails + No + The collection, reporting, and sampling intervals. + + + + + Composite: StatisticLinkSummary + + The StatisticLinkSummary structure holds the ids of a specific statistic link and the function and parameter it links to. + + + + + + + + + + + + + + + + + + + + Name + StatisticLinkSummary + + + Extends + Composite + + + Short Form Part + 5 + + + Field + Type + Nullable + Comment + + + funcId + Long + No + The object instance identifier of the StatisticFunction object. + + + linkId + Long + No + The object instance identifier of the StatisticLink object. + + + linkDefId + Long + No + The object instance identifier of the StatisticLinkDefinition object. + + + reportingEnabled + Boolean + No + TRUE if reporting of the evaluation instance is enabled. + + + parameterId + COM::ObjectKey + No + The object instance identifier of the ParameterIdentity object for the statistic link. + + + + + Composite: StatisticEvaluationReport + + The StatisticEvaluationReport structure holds the set of statistical results. + + + + + + + + + + + + + + + + + + + + Name + StatisticEvaluationReport + + + Extends + Composite + + + Short Form Part + 6 + + + Field + Type + Nullable + Comment + + + linkId + Long + No + The statistic link object instance identifier. + + + value + HYPERLINK \l "DATATYPE_StatisticValue" StatisticValue + No + The statistical evaluation value. + + + + Service data types: Aggregation + + + + Enumeration: AggregationCategory + + AggregationCategory is an enumeration definition holding the categories of aggregations. + + + + + + + + + + + + + + + + + + + Name + AggregationCategory + + + Short Form Part + 7 + + + Enumeration Value + Numerical Value + Comment + + + GENERAL + 1 + General aggregation. + + + DIAGNOSTIC + 2 + Diagnostic aggregation. + + + + + Enumeration: ThresholdType + + ThresholdType is an enumeration definition holding the types of filtering thresholds. + + + + + + + + + + + + + + + + + + + Name + ThresholdType + + + Short Form Part + 8 + + + Enumeration Value + Numerical Value + Comment + + + PERCENTAGE + 1 + Threshold value is a percentage. + + + DELTA + 2 + Threshold value is a delta. + + + + + Enumeration: GenerationMode + + GenerationMode is an enumeration definition holding the reasons for the aggregation to be generated. + + + + + + + + + + + + + + + + + + + Name + GenerationMode + + + Short Form Part + 9 + + + Enumeration Value + Numerical Value + Comment + + + ADHOC + 1 + The aggregation value was generated because of an ad-hoc implementation dependent reason. + + + PERIODIC + 2 + The aggregation value was generated because of a periodic report. + + + FILTERED_TIMEOUT + 3 + The item is filtered but it exceeded its timeout value. + + + + + Composite: AggregationDefinitionDetails + + The AggregationDefinitionDetails structure holds definition details of an aggregation. + + + + + + + + + + + + + + + + + + + + Name + AggregationDefinitionDetails + + + Extends + Composite + + + Short Form Part + 1 + + + Field + Type + Nullable + Comment + + + description + String + No + The description of the parameter. May be empty. + + + category + UOctet + No + Category of the aggregation. Value taken from AggregationCategory enumeration, although the use of a UOctet allows deployment specific extension. Extensions must use values greater than 127. + + + reportInterval + Duration + No + The interval between periodic reports on this aggregation. If this aggregation is not periodic, this field must be '0'. + + + sendUnchanged + Boolean + No + If TRUE reports will include all values regardless of whether changed, if FALSE values unchanged from previous report are replaced with a NULL. + + + sendDefinitions + Boolean + No + If TRUE reports will include the ParameterDefinition object instance identifier in the AggregationParameterValue, if FALSE it will be set to NULL. + + + filterEnabled + Boolean + No + Controls whether reports for this aggregation are to be filtered. + + + filteredTimeout + Duration + No + The maximum duration between filtered reports. If this value is exceeded, then a report is sent regardless of filtered thresholds. Ignored if not filtered. + + + generationEnabled + Boolean + No + Controls whether reports for this aggregation are to be generated. + + + parameterSets + List< HYPERLINK \l "DATATYPE_AggregationParameterSet" AggregationParameterSet> + No + List containing the parameter sets which define the aggregation. + + + + + Composite: AggregationParameterSet + + The AggregationParameterSet structure holds the identifier and optional filter for a parameter, or set of parameters, in an aggregation. + + + + + + + + + + + + + + + + + + + + Name + AggregationParameterSet + + + Extends + Composite + + + Short Form Part + 2 + + + Field + Type + Nullable + Comment + + + domain + List<Identifier> + Yes + The domain of the parameters being referenced in this set of parameters, NULL if the same domain as the aggregation. + + + parameters + List<Long> + No + The list of object instance identifiers of the ParameterIdentity objects being included in the aggregation. + + + sampleInterval + Duration + No + The interval between samples of the parameters in the set. If '0' then just a single sample of the parameters is required per aggregation report. + + + reportFilter + HYPERLINK \l "DATATYPE_ThresholdFilter" ThresholdFilter + Yes + If the AggregationParameterSet contains a single parameter then this field contains the filter to apply for filtered reports when filters are applied. NULL if no filter required or this set contains more than one parameter. + + + + + Composite: AggregationValue + + The AggregationValue structure holds the values for one or more sets of parameter values. The value sets must be held in the same order as that defined in the matching AggregationDefinitionDetails. + + + + + + + + + + + + + + + + + + + + Name + AggregationValue + + + Extends + Composite + + + Short Form Part + 3 + + + Field + Type + Nullable + Comment + + + generationMode + HYPERLINK \l "DATATYPE_GenerationMode" GenerationMode + No + Reason for the aggregation being generated. + + + filtered + Boolean + No + If a filter is enabled when the aggregation value is generated then this value shall be set to TRUE, else FALSE. + + + parameterSetValues + List< HYPERLINK \l "DATATYPE_AggregationSetValue" AggregationSetValue> + No + The parameterSetValues list holds the sets of values of the aggregation. The sets must be held in the same order as that defined in the aggregation definition. + + + + + Composite: AggregationSetValue + + The AggregationSetValue structure holds the values for one set of parameter values. If the definition sendUnchanged field is set to FALSE parameter values that are unchanged since the previous report are replaced by a NULL in this list. The parameter values must be held in the same order as that defined in the matching AggregationDefinitionDetails. + + + + + + + + + + + + + + + + + + + + Name + AggregationSetValue + + + Extends + Composite + + + Short Form Part + 4 + + + Field + Type + Nullable + Comment + + + deltaTime + Duration + Yes + Optional delta time, from the timestamp of the aggregation for the first parameter set of the aggregation or the last value of the previous parameter set otherwise, for the first parameter sample of this set. If NULL, then the first sample time is the same as the aggregation timestamp for the first parameter set of the aggregation or the last value of the previous parameter set otherwise. + + + intervalTime + Duration + Yes + Optional delta time between samples in this set. If NULL, then all samples in this set are given the same time. This is usually driven by the sampleInterval in the aggregation set definition. + + + values + List< HYPERLINK \l "DATATYPE_AggregationParameterValue" AggregationParameterValue> + No + List containing values of the parameters which are part of the aggregation. The ordering of the list entries shall match that of the definition of the aggregation. If there are more values than contained in the definition then it is assumed that the parameters cycle as a complete parameter set. + + + + + Composite: AggregationParameterValue + + The structure holds a single parameter value with its definition instance identifier. + + + + + + + + + + + + + + + + + + + + Name + AggregationParameterValue + + + Extends + Composite + + + Short Form Part + 5 + + + Field + Type + Nullable + Comment + + + value + HYPERLINK \l "DATATYPE_Parameter::ParameterValue" Parameter::ParameterValue + No + The parameter value. + + + paramDefInstId + Long + Yes + The object instance identifier of the ParameterDefinition. NULL if sendDefinitions in the AggregationDefinitionDetails is FALSE. + + + + + Composite: ThresholdFilter + + The ThresholdFilter structure holds the filter for a parameter. + + + + + + + + + + + + + + + + + + + + Name + ThresholdFilter + + + Extends + Composite + + + Short Form Part + 6 + + + Field + Type + Nullable + Comment + + + thresholdType + HYPERLINK \l "DATATYPE_ThresholdType" ThresholdType + No + The type of filter to apply for filtered periodic reports when filters are applied. + + + thresholdValue + Attribute + No + Threshold value to apply. + + + useConverted + Boolean + No + If true, and the relevant Parameter has a conversion, then use the converted value for the threshold comparison, otherwise use the raw value. + + + + + Composite: AggregationCreationRequest + + The AggregationCreationRequest contains all the fields required when creating a new aggregation in a provider. + + + + + + + + + + + + + + + + + + + + Name + AggregationCreationRequest + + + Extends + Composite + + + Short Form Part + 10 + + + Field + Type + Nullable + Comment + + + name + Identifier + No + The name of the aggregation. Must not be empty or the wildcard value. + + + aggDefDetails + HYPERLINK \l "DATATYPE_AggregationDefinitionDetails" AggregationDefinitionDetails + No + The aggregation definition details. + + + + + Composite: AggregationValueDetails + + This structure holds a specific time stamped value of the aggregation. + + + + + + + + + + + + + + + + + + + + Name + AggregationValueDetails + + + Extends + Composite + + + Short Form Part + 11 + + + Field + Type + Nullable + Comment + + + aggId + Long + No + The AggregationIdentity object instance identifier. + + + defId + Long + No + The AggregationDefinition object instance identifier. + + + timestamp + Time + No + The timestamp of the value. Use for the calculation of the individual parameter value timestamps. + + + value + HYPERLINK \l "DATATYPE_AggregationValue" AggregationValue + No + The aggregation value. + + + + Service data types: Conversion + + + + Composite: DiscreteConversionDetails + + The DiscreteConversionDetails structure holds a bidirectional conversion between raw and converted values. The first element of the pair is the raw value and the second is the converted value. Both sets of values must be unique. + + + + + + + + + + + + + + + + + + + + Name + DiscreteConversionDetails + + + Extends + Composite + + + Short Form Part + 1 + + + Field + Type + Nullable + Comment + + + mapping + List<Pair> + No + Defines a mapping between raw and converted values as a discrete set of points. The first entry in the pair is the raw value, and the second entry is the converted value. + + + + + Composite: LineConversionDetails + + The LineConversionDetails structure is a bi-directional conversion between raw and converted values. It is defined by a series of points between which values are to be interpolated. The extrapolate attribute indicates if values can also be linearly extrapolated beyond the initial and final points. + + + + + + + + + + + + + + + + + + + + Name + LineConversionDetails + + + Extends + Composite + + + Short Form Part + 2 + + + Field + Type + Nullable + Comment + + + extrapolate + Boolean + No + Indicates whether or not values can be extrapolated beyond the start and the end of the points. + + + points + List<Pair> + No + Defines the bi-directional conversion. The first attribute of the point is a raw value, and the second attribute is the converted value. + + + + + Composite: PolyConversionDetails + + The PolyConversionDetails structure holds only forward (raw to converted) polynomial conversions. They are defined by a series of points for the polynomial coefficients. + + + + + + + + + + + + + + + + + + + + Name + PolyConversionDetails + + + Extends + Composite + + + Short Form Part + 3 + + + Field + Type + Nullable + Comment + + + points + List<Pair> + No + The first attribute of a point is a MAL::Integer, being the degree of the polynomial; the second attribute is either a MAL::Float or a MAL::Double, being the coefficient of the term. + + + + + Composite: RangeConversionDetails + + The RangeConversionDetails structure holds a range for a one-way conversion to convert between a continuous range to a discrete value. A range is defined as from this point up to, but not including, the next point. + + + + + + + + + + + + + + + + + + + + Name + RangeConversionDetails + + + Extends + Composite + + + Short Form Part + 4 + + + Field + Type + Nullable + Comment + + + points + List<Pair> + No + The first attribute in each pair is the raw range, and the second attribute is the converted value. + + + + Service data types: Group + + + + Composite: GroupDetails + + The GroupDetails structure holds the object type, domain, and set of object instance identifiers for a set of objects from another service. + + + + + + + + + + + + + + + + + + + + Name + GroupDetails + + + Extends + Composite + + + Short Form Part + 1 + + + Field + Type + Nullable + Comment + + + description + String + No + Description of the group. + + + objectType + COM::ObjectType + No + The object type of the objects referenced by this group. + + + domain + List<Identifier> + No + The domain of the objects being referenced by this group. + + + instanceIds + List<Long> + No + The list of object instance identifiers of the objects being referenced by this group. + + + + MO Errors + + The following table lists the errors defined in this specification: + + Table + + STYLEREF "Heading 1"\l \n \t \* MERGEFORMAT 1 SEQ Table \s 1 1tc \f T " + 1 + - SEQ Table_TOC \s 1 1 + MC MO Errors + " + : MC MO Errors + + + + + + + + + + + + + + + + + + + + Error + Error # + Comment + + + READONLY + 70020 + Operation specific + + + REFERENCED + 70021 + Operation specific + + + + diff --git a/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area004-v001-MC/word/media/image1.png b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area004-v001-MC/word/media/image1.png new file mode 100644 index 0000000000000000000000000000000000000000..99affc6fa9c9a948a7d0814887d6f96da3b1af86 GIT binary patch literal 35930 zcmce-2Q=IN|HrF?wv>KbRV_sqs*2X$TE1xQt#;KGi5Z)8P^}iNy;ao=L6IOvYn0kM zh}aSmJ0b{iKYsuFzxRL6J$IaY?zwuJR6b4e8Sl?)JfDx(M*}@gR%R|{1_lP!=gQ0e)e6rLFld!|}{s^nN17-nD1`kqoH|Dz||r}`lG1_Q&Pxmwk5gB!b4 z^Un(|oD)6i=qJ8-k@IQnkZ zVDNh6Qn~`HIX>QKq}K2`V(yH!ZPoP304J;@qz}FwypdChjw8s%ceS>tb&sZue+j1TEnn{6=62h}4Z7Ia7Mn*o- zSUhlgOmg3zlJ}9cZOySmh*;(A&@+0im1Jzq%~EVE|7|?z!_YslLoD0gyiotQjTrMd z#bv^I^uhjA|7KdqNM%SZlafV$QevVBXElx0x>QJ|+ITIUamvR|f4m?Geu-3fn{`+< zB-r2_1H&)aJxLYmmtX4x%8I_WicxgnFO=INU%*uOVraotEZNO^b!MkdO+&)v*b~9E z>%*{IP!ff#O)A@-4I7o(UgCh*h>5M_o13lV(%__+fU%|eqswAt1_^)ECH+VKzElW& zqQoP2rLge5=xE{wHmE>GI=9y3?=5QJaPs{lao;!>TPgMk@P!Lo-9|94inw$ck!&zp zx`RqYKY4d<%zQ@E-Km&>w0a;6Q&ur8`G;5_ViW!hO>J9zaS6C&KGgE%;m|wM&#Un3 z=5biKbA}80$=*S*TkswP=cgv8|FUmj>(4d<`{yS|l;W_Zv{*3%dx4-nwiwDC>(+sA zt?{(NSJNIHrQnFu`9{bU9NJ8rhSa}sK`7hpQ_4**kvYuwnUz` z=KRp(0h|AtXI5gF^oX)y+)*Q&qu2KPMbiCj8LXc|FB3km<4U58r{zmN@&Om71&lUa zo#M#*YaEdN&GwEqAJKSif_tIf$I-bJ$x7XAdHou=C7-w|mwnDyUS$nMmU}_E|5fK- zlU$atl9XG<{?Bg&Q?khjv72?iuTi^99QhD%TkP(7yYrJcZ)gJj%uJc{H{mIyg&?wQQ9 zlw!Gm-?I-RxcjG#Ym~*6oZR_vI3dBfpEwR0z5lJ@jdHqt7-#uO#8D-$u&&yfw`N-v zxJmej6s%2zs8SVOqoO~JHU^ju7W94%#_um>KXKP=s6GA~RDZngF6ZxAp*CnU)6`=D zp7Bo#B(ze}W%nJu>~^rHlt4%qbnxQ6$B#!Dk1Tw5OH4n-BihI1{bc(hm&Nnn_Sf2A z>!(mue&W&IX%QR$pLV-{biWe)F*>$$C)f6Ov-8epETs6y-ku|F27~~D6vy@1vR2J` zoNRCI?eKM`Un}h8gN>K^hsR|w_aBbvpS#pv+`(gN1KO^04_1F1whdw7wB-x-%MK0Q zzCRW*>%t^6Ad>aK(E@2r*~;#y5fl1Gopvn{PQPlJ!CgSS#O@!*8-pps2a3n}*q^D? zUp{9+tZW^@L9LvWoJ6lTG?JIo*^D`^FE3dB1qZ}n(WdhpY(OCA4a_1OyiXT*+Nul8SrnLvYleTnGzrlqd4j5xX-YpL{V zvM?Fbx?YC>Zpqh~kEc!pXY7e96Y%(dl}-LhKXr1QC4h(jdVJ#A^z2807B)abn4do> z0oeM)m43W6t;sz?oD{M|&Tm?Xz#fV}U1-LoJ5AE~JV$=r*6s_kvkeI;!*W_dNRK5t zoL()&n-q_kN6Tji_F-v$Qv&UO1VX|u<)x_c&bi%_0%NdhJ z6@KV9?Wt+%79k89U#~a9wJb><*75J-tk;w4sECs2PuhJ$+h`}OcjLhycktxR{BAA| z!yHXfL)Q=G8PqOr&`3$pg|PkJYe!A<6_d6$T4BMX@hK@Lx0;)`Gp+zjGM;}sn24?B z*Ai>4*8&o3iEWnZM9YR|&Qb2)VgGvh^@f^ggs0t~-VE8GLhSk^tELqA0AhNd^Ly?) zuKPfg4Y=vX$qK)EbG48SlVtkRmXAGt0k_lN;psmYw#p6S;3B#Z9|BpCiashcEK7Jla+4~u0|t~-6uCN{v=akrWJK-+!xJLVmWFY z2;RChD9E8vNqo(N}UPytI4D+>^NFSS^)nS^|2-02^ z3rbWn_82%NzysLDXl^T6E=mK8KWjJb6k9Ms?id;uYb|fV{E46SjnWD z5kDO#Hn6j)w2~WyhOA4gp#wUK$h}K79!vJ924ER~qgj-gOnRSXq`7yG-ESn%G08N# zetp8(qMdxvhYYTmwvS!Pe+*Z|+5%NXOt4eF*46HAG_ZhfadJYneN|PXS>VHhwhJxx zC{YgG57R%m5xSuKu=RWnu7Pqy@U$`R2vUem#!$FpSN08s{WPgva$_K?0?7!Y5fTyn%*X}uvdWzrf-hrp5bXJEs zO(y5WUpYP~;x-kIN@IC@=U|Vli~pV*53;eNg$Pbx0QTZ|Y{0`R2{hKZQE%^f-%_@m zMD&8ixieqb^*wc9f}~LVRMifz-bjNsb{3sAw(BeG?k4Trmi{$k)e$EMo%xMQCGQ$B-M&FP-cQZSc^o9%7t4KGFCx?o{bi5!(I1LFXpQ8UIv?ejVMr1mzfm+@(X#znNGHfPM#PS6h|WK~>^k!26G{O#a@ z_5DZPhngXyMg*%?++ksMQ6X=Di8oFcLNYTnF5EB#>ct>V;QD610lFH`A|W-VOUv-z zXATY>*oI;qLJtGKYo#!Ei7U-N$qWr^wEouj+|lGaOGSJ1*$20N(K4wH)a>i#`j9y+ z@)1z3IAZ%HDjiI)$qSzcCH0)FmKGKgs(L)9{o^kTnBv-h9~aKu)yxnVSf~;IjJn0Z zPx!OQM_qmspyRri~tomIE1^=40pY~Bi zV2S)nd)zk;+tT`r)wT+bLLIQu4W!KxNp zg=!zIVqRf$H&$h6(AuVlf@e>9tIx(#?glS_R>YMuc{lT<(^8f2dDZOK{?pFm%Qbw{B}w3G-sWOsze_*4DmixMM{Ie_~;wpINMp+omL2e7!NcgLc zQOYCSCHrj}ls4@jx(9`XIHfg(=zkW_cg=9xpSzplw%c%YaQF^x((vM&%R%9Sv>Pqf zm6g|ELu{ive&!PK?{96zX4sCNM3N9kCb$l}o>m;PURnal63!m3jOw4t6L(TIse4sK zQ<4`jl<`l?1*!K0K&_*bsEGbDPrvB|w{?=We zpBrL|^fRrx($EDYiM~Pgpu4kbRC5ejtlUckWotX6U0&)lY%7&3Ud1Q4W>A*S=m&%_ zuA@nJO4yGv3r~l|A`bV7h6pY@%Qgw{SZ0`I`rEjkJGp8 zMy*9}ZNuR<+J2N0dwH)%AoGumpYH7Z7UZ@;#o%>6!S&0v7fGaipxLQoc@31gJ9I(V zeSUt^GraJ;dMLB|-2C~IK%7&s>Lo&yf)k88*p_VeP$KKyW;f0DR+S#uh`(sn6vaR> ziH05?KVvm>R*pqYCX#8d4xOPJM$dT=VsH`XG$~MA zc9?6pTmH2)hKz~Qx)7UgN}AuQv|6*6%8zp!a0K&GtKaI2w=UCS5>#Srh)bP;!t7Q( zBB_4nSG7WjjE7=D6s-r7u~BA@9?LhW{n89smACo(w|G79%;_+bir39uNvzW3q55=1 z@}ZBqI{$syam}YeVL(+w!eeI$qT?=ogZ`+g-)i3O)6Vf)DQsf{Zz#A!e;GX}v_tS7 z8uG9gt2cBQNrNtXl^Pj01_l5J_yc`Qq}SiNt=hY-zxl(5mtpiJ)B|J7;KfR%2bTBL zlY|9GM{&&ts;|CWfaT$Q1|Qop=Wu-2c1K{AD}^4|i5gs@>>HWeaS-tRX@v4KQ4Kb5 z550BLSIu*5J&(wRAqD*R0*i-rZL`5IG-JoTQ{GWlS<3In)t#L{_iK_l8B6rb7cA>N zYOMbBi#?k;mQ~M?79=K!y&WmCe`{8rHH$YbnJv4d+zUU=c+LGt!;by^kqIH*bh6Sn z=|U&6=@BJ_Xu8CrZD{TBg^h0_Z%rXN{Z)UJTz9d3@KOx*Dp&mX)YKFQ|tuI@%CP2X4E#wBsr{F+kBNQvkGySSjrD$01ir;OXn)w6E8GYR1+-QriKv zr!N6KuO$vvyLAsj53hkIt`vV)CliMbB1g#6TRU(Hs|s0wwbOi%Dyr63+j8*Id;v&A-h?}6IL-T z^~_>d456P!J|K&sDf6kO6Ungeo;)>frbd^j7T;K5KcGR?{ZC`u_eXGl}pufkfK_Lel0#5Ls z*B%D*D-FoV(5B->RP27{X&~&AWJd&#^SI6)`*# z*xKmM=I57_BZ;RiD~Xz9vU9*;x0z#8>c^oFzA(@5$?%~wI|mB8ihsxmhD}s(^^B@+ zR+F|^Os&pI&wJ+FE1M6zO8!actqG=DQB)*pB9~R_AhP>vn4;lbjWUC(F%`GLRW@c8 z%IMd;Elanz^Rsi>qs4%>6Ci=5Kt_qJcwbq3>8{h-fy4H0-+|`Dc=}u4f3XBQ+f(|cDiw99d zuc{!I6Vl08wr)ady4tW&)%Hahn*EU18*QD+oCh0@mUz7?r3^n^_dc=;`7$+O2RpV3 z<&e&CzAe4xqSZTnruU!#(JCMng>xr9?kFiOws?xyy502yf0{@4{0yidzYu>1&n{j1 zI_Ra5Z)eRA;;h@$=T$80RzR^u_+4F~iP!3_3Z$KqO=7Lz2(7gRCHtGTZ{LPk)`|ai zAE~HdDHvN2U|{2YF~it%aY4CWE2U=7u)Mi(tmd;NN6$f|&XXFMSghF+h5K#|AU+3( z{oQxo&<)yNnX%UP#D~~F#47bor~I^6chT>LD+zGBCd3;lb|*dLU7SG4*RT|swQg9~ zLXXLeG(2$UDi>kk5|Qp6x#=M=qGP2jsHSV6 zd(_vXJfWi23K9Q3es<74Oka;=XrU#Y8#Ex{oON%d$aw~nOy144YgxS}lp=up+ zV~_WaWNy$hq&TAP{{6}k$Hg7`-IUZ{S(ZX&P0V=5{B-hePgnthveMz3B$r)-&yz5V zmdXwKa-mlrXxUE9Ziu^0iU!PRX}s*~LAFhDCxQ2R&qv(YUfdcI$r7%k$%?C1IlcSA zn&iKqVrNqv9yjJsZO!zQcHNc1a>@D?w+N#8#rvl}y^2x{^WM?I5UuzdBgc;fGrL(a zj~_o@7w}Y3*{Gh$W4HO_+om)Ywcplj)0r~O(AUq{hTBA z9CpaVYQWbAj20Jtrk`4C(-=H9+s>*=Rv7^c=+M7NJt~yaNZqd5G5WH9{%3Q*<8D7W zryDQ{k=u=I+@cbZ_{3mmOBeDjCCN*kkke$siiB=a7~Y*-5taH#zD>u@gIF2%z&}0S zZSV8IQ=<_q{DXRb)z`to}2T-V?|UJj9)U-$=LDortTjAyR<$nhA(0y6%sB6zn5ukp02 z!o}`0OaA3^^OCPdd~jhQ94L=T?+&*;vIR{FtK18SdfhWB`pMT8tDLNUNnj>+iAII2 zz5ZtljH$Qt^nD=@OfQc1WmUJo9ypY_k=~8^deQ1Zh^FnNxIX^p`rGP?)a1ZnZ3yL>pHWma*P0q5wDq9WBveVJocVb$hQM>KS zMvux&)=$2)CK0D1)-EI&DWuj@NHtFZO+ z%vwXw>C+9Aodk-c>-d#Mn&lY1gO$WNbht^vvA#jFbd^_8iMv3(n7l~B7UFtbJZ-CU zM|PEvGN-0P%uV|bI37eef_@{-%H`(Yv)0ULf05bjKT5GhdU(Y`@dd#(hcNdb(&n73 zjZqbYm zV*R+M2Jyasiu9hn_hIOmt(2R!ELL7RagyE-^wmrH8~VRb10r&5&+3MM8;gR^pW;*zIs(c`&lY&PMG5V zjdZ-kJ@TZy5xU)t94k{PI2YXS+dANs?QE5tAt~ykN9bmvhKIS62I(v~-48cbshoa| z3z+65xzC@qM%w-=i~?QT`lk-}vCe)L?qlX^z;2{J_PC#YXrn+OD%d%}!-`+2pSDS1 zQb24~6mr!%c?7Uv`RBIb0wo4dVN{V)Bqa!N4}VTM1}IN?fp4%w;Kh1*8&i9&{&s+K zSYEE&d*uHQR(~S)HkjsO70JAhwjU=-()-p5bIMVG>)|?(KpANQuT)LOnZn~b1$W*( z9G(tcVy4ERc0&Wxgx_(?>!;+{@nXRDL`5gUKnSQ+Tw1y!I0YT};j>n!v>&cm-Y;wJ zJ(@Nl6G!tARVdAIQrj=4Z4N5*`h}pn*0*e^{r>I#VwF$#iv@{w$pN!7Z^KI&UibV@ zeZKzg;Ny>g5iuR{DCePCj?;%Y{Xu1RoiLpNQB(2dx9gu+@w5j_QLneJ-CHd5e3QtHn+LgCrnDy|wdkg4k{$B|A zo93HRlMJti0ja*?PXp3YJ6xscSA%ki8GjCB&C(EKWBjLg2E7rX(NJyO+&5Vm5#cxr zw|WNL(qs9o%ppYAkOfIo_{{=yO{py%?Pt#nJJy?vbXHzAKE`jW)aYx*{(+Oha|c_b zF=n=HiVlp7qeOqwHv>FEw{GM@eKW=ysKX0Twv8=SJ>3rGaG)bR0kyh& znN7gIboz9Op;B{wKygt9!8^IwlG@W8EGK%xI3c-qP)XghEv`y3%~EMzWC!~I3` z7v2z`O0!bs%=|v)CDjqaSM8ln2NuO)+mL;q(V}GiOFP+xx>nzRKFpCB&{PS-YLH|! zO3Y{WA?YYo3Y@Ur9bE$Ih{nGl9~P69=G!?A_ET)4V|2}GO7=%K1}C%0FQJVK<~;H@ z3A{Agl3^HGK5&`NwQg-?7hct##nPQk3)v`1cRChF=NmKP0s^F{foM6;JX?!mz|t0$ zk}?I_raFRvWShBX16q{em9QdrV%WT9flPkJ)wf6F-qs(*%)X%{WoEv5I}D+~h%%h% z;AizeNA*P&!^lCx`{x2l9nTd;N{+7T9w5qq7Qbgy!e!c4#46k%V8&J*O1kPd+_dLj zbxkyO^K6;QU1eqUD#E(4k&%1yiWN#-2>)+<$W8XFqES$+>oERVWdFlLGxH?B;p6eE zZe!ZsaWJc3157|Vf-}3(B+sr^r_vechTr=W*4WM{kuW&ruN;o5(@Hu&^tSz+pBiC> zi@If6kF>b~XcOa+v!Kbu-PL!jtvA-|VMw#|u)wVejS_cJ>D~31!KfU_h?T%<%=NL( z$bBwK^Ju9Xrnuk&DVep0;?6k&Xh?y?3v9bmZ*Vk5dUktF7x3(J-K`o=sD@~HFjLP(v+jKw*yVvH@sofL^okKUes6O_wcjE)!hovl0gUTetG^eHJPSuoZB~b1D}7BB)K&nP5^Q z^kAp)+C=u56L6#Un}@JlxiXouI`AG)kKeo0gWa0)LO7^_fcs^F^r%n{E=+TwJ2Z+J z>gaqwxMW$XUIp3Ffo(PsgQw3HY~@t@*^eM?RlGc*k^Pe-i$8iWzmDGY@ezqwY_C1~Q~h~RR(yVe-po>qb$^K7m=)YPT)(LArPb>- zZmp?CM2V4{UGg=|MG2RUQ6MkW0EIkH7_E4l9xg=A#B!X?pd|dAI>B@TD>bR11Sk8+d z`qQBBKfZhGQQV78s>=Xcu@kX%ZoLd|83v#cKe)?GyE;{6CvBM6hGLK+;nrls^yxF9K4s@*`Id(-GIS2s zQ#z_a`kz5d3a0eX@O47}99ju?Q=BxGA0H0*=tmYRtyw5jXjuf3;x)g>Q(`O9Tw->i z``SoUoOQvHaGYZr#7cT5*mKQJJ{Azihaa;WHRseSVHL6UAS*N=^k>}3yP`BK(PFRn zJugA$iNX!9<8i;98V#4LSX}E#T0*#4O|qx@%ERg=s^uPNXLaPU>!T0f$5>G9=`A0u zQ))V-E9`i}Xsu@L?ff}ghq}j3DES$a+gQ1kvHb5O`K=E8vwlfz2?XVN%w><(yBPd^ z`UVLlGMh%lB?GnsdR;*x90$&BE&-SaoIYKLdSy2BTmB7(FL{kL{rh&QIjV2Nd~F2o z%tsXVyF2@*gQa3+|0z7ZKU~jnb}xi9mn}t^Up5tWjp2dTjUoEEV!`kQyp)Y;(aSN& z8GR)~^RN)R?UdM7|1P^O<$>NMlpOt&-ieKCwfqGBCZjIH1=jcVqiScVYs<6=}E3k4eiJjx96Vv#) zaX@_scW?V3pgR_6cQ7N4y&?0uvb^-e?T5o2InLO4&v(AX@lP9WJO!NZL*K}=v|5!A zEP}bNrs4frnvnQ|+t{6=9WyH{P3KF~=4wgqG3KoYk*3X%-yXRWT|#YjvsuTB8#ltt zjH~?J{F@0QIipM{PCJWy{SK!!u9s*I#Un>0^VMEIVKd$#1wM!Y93%i*=n{1fx3uwW zsL~4}AJigF`4-p}0xfSaF>n=DGrAD_KrWNp4q&eKvu-;0kQi`_ByB^q%y`MLU1oi+4^H`B~H zQ_5IBY(0cJNKd*|$RaU&%nidbFf4X5sbM|+{*;IK*c2GHwlL?^$zXRjEkaD{O$?A` zEfofKjhh}0fGGc4ZY=}6RQ;4bn>+q+_%2&!=a^R3<=7nVA%p(U*4dzxh%OGb(S1B~ z@Nuv6B=YWLO}tA*7!q6&LZuW~oF=cFRMn(U;MOIT-r90$G`+bHbZYlzN4}g&2LJ&X zf2sRYWT*s-B~4tTGvQm7N4_eps;6QsrV3qJYs+Yb#R`EEZ-Jn=NB9W~hE<#ED(x(X zir5AHr2VdE?eGJ|rLBAC*w*Y&BFZ55K3{~J@eRKI-CR7A2lXk%AiJD-V?`yfg%fP8 z$%A6Dt$Us*_koK1>=`i3jQc>N@n;w1WAAu5uvm(9;YM;}I0RHENtm;gFMM)6O?oQA zHN;`^<9PLD84sHr;4ZDX&na@nOOH?v0v42Zv{LqG`jGUaaECt3CkL}5k^W-V3jIsR zHl9srz4E5<#nQ2$O?rAd>SeQS2+c8PyVojjgjUIjrx*1*w zx;z;4z*e%H^!}x0>mD60jmYRI#;N$c>UfLfe+RaYQJQLvdH*~pMe(bmZ0_J1Z{#h$3E!xYn@~kV!@MXdvBkA0K*_nX?lh`5 z#j8YMe}P?We`oD=c>KzWcY!_LwA$-svOSi55!->;&1IG5WQt^F%A|%>{~lm+=63Ec z;M-D3I=Yh)(RMZ9)Ia}h68b3XN{{jTTXOKqTwf~{Avx20twp7^Wr4K+W_L*T4UOLa z=?XHxf}u*o_gP$Mf>d%ZGCNzCdy(1pSF$#Da(}_`<}r!~{e5)dja*${^IEbNB44(( zZt6<_BJbs+Xr>dCXV%jY>E{)D*PNjam%avd#D9>a*Q?Ia0?voDp82aM zhw%UF58c_8P}g*Ag;6#kt)K@ld1CLr>1RCOt0r3}%km!&Py*7UTkMFF4e^}>%c)qkNhfYl<^aVCR+21`pz%Wy$MU2?XvzQk0bIfIWo zqm(3nv}&O&+i9L6^`O-D(um2kit>!zmgS^$-lh(v@c-5J0BVXnf}L#|IOK@8tjxbm zyRJjnoM#N^;6Q&j&T;&+oL7?6I#TAVzBa{E21L@Y3v@F8R|4$cE;MlHv&~o1F$jec zJXmn02@PL?_al;8m*@2A3)thM&ZWKp8pksWB{kf2)I|5I|l<p-tN$F&1wcq1btn}Ky1ugZeM0lgZ~ zHLvb4CHo9BgmNk2y`&Dy+R9TN;GmDc4jhiZRwqu^eAi%W9+4<}wf_(2tD~b($#qh% zXdqpF$&&GGAbNjE#{fB3uYVkgFdgd`D?@d?qnctmQ_O3jjSW9iY%TJm*2@tx(-tYD zUCoASRb4L5!Er;ucWbk!D1M92GPAkrO^lm732D>g5%Wg;@1_=jhIOaAM=3jKROcTg z|GhRb?W5nnmEEVS1CeW!H)r4*r&)Pl*oE;GC*@}YykzO&{-H^+YEcH#Z~yk%G<$-B z60rB3xaRNrWB`!sO-I`)LCVv?*=wig0HbGI5nMP1mMu65Qcd8r;q}%XJAZgciq=Fyz=q}DRje}qy&r)EBDOxiYGjXP-J%2z zYkQ$pvI)z}_fUHHpEK5H4=d%2GEf>T>sYv>RR_}vXqt(JscToQfjnscq&(nAB#BGE z94oiFkM-j&V&P==vbiN*b@Wj)*0R{$v}L4Op9eD^Du4N$gX#CcX^-JGN$ymjKQWkY zaC;NhLjqZ|pw=`hea!*t0q6EM_~XN{BK;Z{&(EZ;uW77U=_xGBnbYFHm*(zQi$lIw z$!tzEwbY5Qb0mFPP*hM_Or$p=J-5EuYumu^C&WR1H(RzppNCgWPcFTv=wHrSFqN4* zz6|KdcKrH3$Y&QZrRW>vX@4pTNr|o-vm1?|ZvI`X(mf8_zl|B<<;!{XR`y*k@O9Sb zkE0V!0rR`Wgn9T!v4ZbOk#>hUr{;t_p8VIt`X@1Kh6vWC^yY}z0GvsO5Cw&ILQR(dkbYM zU^c8FkhFr{@wGIh%fcMO@fyFC6ugiwD0^yi&zJS0rkrE z*5AAr>~C{!Og%yQm3(oU@EPq0;l(ulcs(7Gmj-~2CSXWviHgp+Qm~{gDt+OvVpk+< z8&GjL7I&~22VlTSl*GE1o4b8^AbA~tzlsC#qi|A?4YQBtvH(jIGz-lpal3bY0iY-M z&DY8>?9+*Bi;IaSNuoCr9Wcxx#xFB3jH@%Bt3|L9GI+qPY>X+`U0(-GCFxq{#zsB( z(BcLOJ7A6U+f>kNJWW#Wz0YM<`TY&29}Ol|FX=HVeOcmmJybrN1- z=V-jy@J5>6a!0upfZO$?!Egr-CsPgPwzfdT0$`yLpgaaJ{W{;t6#WkHkf5E1Pu#nA zp{BXkA0V~J&j@$h`BKt#Nsr>`V9%_sWY)oNbjr>jG->BxS=gk}ecTO$t)fP(*Lo&5 z(Myw4Wn#DTYwkyuJJImmS_nOo`0DM zpuvcSps=02W6{Auhb=8F#R-mAK%=#@MS$Ixmi~K|`15260dnx>T_u9Qj$+C$wOdvr zA9~OB616lJ5buM>M2ut&dNZyC#I4a41MPIB+;QtDPGSD4SHC z4myEz0Vq!r)Tg{Q$&u#?8^NVT>cQg5cNlpKYy7LFt&oR2mw0%*Sxi;dM>Gl ztN7lmX1k6%?A9Mp*lJFGe+4HkMlu@^Lk84G3gx6s4*)WV^IvqDxEqm8U4uUuucCAq za5D1)$Yy;JOIHs3rud>2lfRv2JmhdZeL@fe{#vI9ZKbx?vT?mAH(?-?$I_yQx0$*c*OM?@tyxnlpW1gQ!q<9L_ zUt6}-Jllwq&0P;TBI2E@MO~&*1kEzPxv5C}25P0i%K5&yxUG$X=|E`^O>$?#31SPt z+;#uFaBlG`0jdt6TfeL#Sr}{UJpy9(A{>DQP|dqu^~5-QI$x8wbVc+&Vq>QY5QpxI zNQ!;%vXS!$MB13ermf*{zHA!+%>UYtQ&*eZ(tcThp`g~x273i$Wz$Tv&j8?;cBtF+ zqsa$H%Etnx@c4ca7*-_7`WD!ryaJTem>05ilf(l6WdL4hm*t6=4M&M|fIU-7PQ_uo zo3YpCfHa}h4Wlm!lv#)UTV|Eq1GN)2J3oq<0sF>vq#gy=y6E=rf;ao@w%K{4-Zb@& z=J!@U?1IjeJ{54KN=#j0};doYC3vGVaDY5aQ=_*EY|(=h=riHom^5h7>)%HZW;7#m;lES0-7ze8yajY0S7kq{QV?mBRPqk)Tca zR;efMqUX3gVh53b0ERlarIK|m7vBJ^_SqiMXysmDNfghwZxcUVDjz!MDdoG=ipr=% zaM^vHnb-JSWXazHt?7K}xn5;+%L6u}YjwvawfCL@hTb<$toJ{A z_G}P<}x1aAM6u__mT!)i&a=nY_H_eeKd5u&*$T@P4S%{3QPAo*777cn7xV6VIC zS07&gW-*NLZEc=#>N2AZG0suC6n=+JANIucyT0*i-E zCNwEo;bTiNpGs!(YUFMMAI>SH(O>&yH6`EL_#C!~Lxef=izF^3t}1M4>u3f4zbF_@x_yET3Q%Hd+IEF`49 z&@}xWfPepDWWco_0sVFeh)$y&8`3I;VIKhlxfkag7%pZd|00I#njsazf#ZzJi~*=? zxJ{JX16##%pwu-61XjSj`Yw1dCbv+pfAK(fv;;qlLzxdEc?Kt|<&1!#(VZSXpuXrz z4Xba~tnroaD;^GT8-c@d3k)z%)BAj{kj7eoZ;3C}*nFm=Gnz8vVMZ0@SX%JKgGypD z?obBu$Wl(K3i~vIA)33;b+xD)n9{h?aMG9N?t3(B^~v+dah0Q{tzc%k0L`MV#G9H2 zm=1-HW~y&lO+*Z{VNw(bVb7mE8(XcT?HuimiQX%pxn8_A0~sqaH*=qC0|DLB@(t2; z+L)zMpdAzl=rczU&pqwua_BXb^zRyjQ!r}aR{WXZjXYKhRbOp(aq<#bg|IM%QZb8S z>u_7u*1Zah<;|q<4doqOBj)u>6G{D+S&z@>e9-mje+uxv{SPELA6)+iOaXW#JLv%J z88CIFJqP~%{k+H?g~?`e^_&dE8>kwy_fLi%6*fE#+TO4uq;?QkIFWDzjcef4EKdX) zZa_`21%5;WT`F*Q0Q*-9pdbx#+RV#?wkbt{mDRy2KzwmG>n{YtuVesSS*oe}LpIS) z9~g{kwFCHn>jBVobuCaGr1J)OyjfqD)AV(*PPsOFo4r^q|i96o7fE`#i!nJ&%GrM zdqU!w$5Bj<>(@UStUh*m0Zax0^D|7Gugf78Mwe#n)Bt@0uvo_cLfa@Mc1dctw`Q_V zcoOF~USrJIUk{)b>wBeuLb3Ao9EjLu#x8XL)JbPAfubxnq^juAqfw^KdQT~9HdrN< zoLE|GFD!gSYySZ6jlFPTcX+uHUL$trj}qT*gR*1aC)QEGFm|J6vqNU|pn$vrQ0S93 z-xm7`1k01WAgaMxs!s+MoS_x_IKW7h1B&Y~pf?BN!Fvm->9$7+(N`}RP!UOqU%q_z zwgYcP5Qp;Lnj$-Q1-4e{${?B7@Gq0Ea=PzVES3t1`uwE{*733swdGWM8Bat z42_g{Gs}R1Y<%!%q|*`LUJMZyWP(IpEvvH}Ma@*DR*RVgHt~i)gcKTGJbtAJUT z|D9t0?@EU)W>$(RCYED#zknI9cx)f*3#6^0G@1GQB{>L+#M4~=iJ!XyY@Q6rNqq`H zrDdHc`b?V)j6+m!#ob~*nAiPfRs7|aO5-6>RNdePy7a$U0Cn8}vY;-jNjr0KbR4ip zPU63H1kP)Bn~jfk8LUkznbPUSlTB)t&4cD>>Rwu~252qVPF-VP_?}~-bALwplZ1`= z`FBu4m?zx7?CjbUP`L(wkB@KB!!juN2Tq9vd|B(NxWCc|BD_YijfxC=u zOX&@hXq5?_V|DiMiza1ULX(wbLE|3>(Cy_U8C4yxW0AW|aA_Pac2dVJvNc#Lk2l+2U%PtT*+^rbq4e0dwIp;i?@5Gav*f7SfB z&&GI(lmTRSZL1k3njCq1+0~KPmma#)ZZ19BFPSSBCpU9DdktvEOZA%%&3rlUxy{Z0 z!_mp-k`1puLYNFTNnhJW0GW?7i;TMr1tx}cK1-+sr;ATqRft!8EwrW+G@N**UXg5r%IRyqEG#spuVD?&H zgpPEA1{2u}t!2i+O(3ny#*jz+2Z=}Ge{Fqr>P8cxD>O)rnWe)~e?g*5exs15qh)!y zkX_o(jzql`6|ieVTOw0IXr|jlhR33$Q??K_LtJIp`-Oh$EB4jFosRzW_(bJ$v=CB? zPTg@pfV!dzZ>q5xPo{213)u`&W$1}cO^=rD$V^!Z^_g&aD+j_EeS;h0l+bhL#Gfo1(Ci>6|dI;kN_yq)d z*vR?A^ImlwciW6?=})O=ZzN}@pBXmx{r0?9P&^-RM$rlMfV9lQjh0G`R!s$7G$oPe zBGZmUsj1c0zkcA`c1En*e&7d;|MOzwka5*< zmeI;6UN$*jMc0{|j&C^I1l|=B5RsxOf;zaL&y+(7`c#IDs+90wZW{SkS?SzDu0Tt! zdLSf`8NxB;;k|R$&j6ce&I8uiWVIej`?7*=QFhiYZL}ue9Xf2}3miodu)_^_@7oFK zsI-xWHYS)|mB)qRg6C`0k*^vt;{9c~4U2}OlOA14GQ)sUb0Lhho&ciX%o4iJDv?`3 zeBrh%;iFrku2bv&D*1+&371jZ+46J&PppCSTfBqHvv-_@WteSeavV>vL#j!0y2YP} zc^4hm@Zf~vZl+~rqYLbr%`&$oV8ZNd%~BIbq-to!ltVK0xfROOp8d40Yxp96)%5Lz zEv<}yuoGuZ+2f6S`x93Lo)9FuAyS__rD;3rmOTF4#gRRdRk%Abx@oTBKEb!jZYGAa z=^kN_lHF29$z#UHA^90IDP|c^?bI+aw{W`bpVb8^=ZW`2FMPcR6dLPL)f0L**gFLq zZgEKdu6=T@IPBo?X+gFLyQ&OTdX%8g(yOoRvMX}b^1bN7th!*D;vr=6ap6@RY+SB@ z2jTH4r6upGrsjzp&{BGQcj`cn`{_LiYC)DJ^)Qv?wF%aQCu#TQPR`5hcQeCy4sk-! ztYn?@K}yg6!rnWDN7jTp@NVC`bUI1$MG!w z^9)&IZbq7oZr`K}7yDSM=0sPf^|2Ubh0iKH0eVq{pcz67?N1yD^*pTV^{5U>_~yWj!%-pUbt3blN4*4=*R)soxy{ZZdzjy!s$m;t z#>&1vv94b1ZCmSL%M|gay}n@9c^!0{Jj(to+dnt%f{cKyY^idlBZg)c}g39bM!pQ|3l^b-`|mVZ2xI2 z+T;cLpWtVSz+-T8n@{wz@jolaT0fQ~RG+I|l`^ltIB2D8}I24V+q-0gt_G?e!=Q0Wy1WXVL4DNH6qs4WeB+MH|#`m?y zSoeH)cW&nQ#MBiFHUd;gpOJ41^J_BUk%1FnBEtnyAqNgTOcc~0&wZvPjmq^jktjA6 zfP#?=(L2!tweA5aW+%sb@Xr!?02(Vu@=<_&`GoBRyDMHg6tU_ou%SWJ(dVVf^Tks2 z6XBW&9}O|3+%SBfDqq;ynO2SZ8g5_mS7?z0{?J!j8^CJKJ^#oP&sMcUYYVc6KncRm zUT&!6w5hKDORUhuZz2*+saJuK+ld=cHrbJN$nS*)Pe{nA)cpeq zdu18g*{l^XVz=c^g!%1{PRJh#hNr7)wa&^Ei?4$~&k#5C6{mYOkc`1)9NkE-Mt%Id z{V9C%+31ugh}l{cr$U9sC(B333m017n?R^5_DFMaJw3T7_!j}v zU#1i~VNXwbxh!{{$=3lWjIbkl=Yfi!mb|zRg4+gcmoaS#?mHr zk;D5&j!1}E*PwiM)pVH4AeNT!FVCLXu0z9|KHd~3Tcv?*Q?IhqySMw;D|a5u&5rvN zExEk+YAA|nKhkzTi3FpAesHv!g5L($oSz3pMS(3jc0ezlT?P*L;EGkEO(o_e(_Xb3 ztJ^zGS%5MbQbZ1WKO2yL^i*`TDa4d{6_CPBw2~N_y~gnYda$rl!xNV5EADEvVy)^}aOg-`%0ve1kE4EJ}# zOLh6Q;3D_w!3Fvok|2^k-(du<`X)K_`oDNQn2271={k} zU(^3I617~|(6u^Qq*0~^I1Ms7C49RN(qwS=u*YJns9p2w^I?KWL9>nKYudD7 zF$zUU6|$TfMD)F^HTd7_x8c0NIq2C{oxYNYsWx@sb$RE)Bq_`6yw6j(j@!aZ>2(Jj z|AJDg7?fOT;1lQW4jo414^?h=euPY=Pm<@}Jfoh>R{EoYB>y0TwfOrW(5+%*IF7b* zwFNWI`S?ji5w~xAja>D$>|_>s{GJp=sl5moPjf{}EZ^R`o9Xu%)o&Sf7ltsAmh*5j z;=~gMfOU6Z{Afy0A(oTJsQ;cJvs&Cx70Xz(n(vn_vDfRk(`%}6kJB>>GV@;ELV{MWmM4#8@5vep6 z=PYW(xFPGa<-|9EKpkwj7}V^)hg-|Bi=Zb`n(Yu*^*OM!(=B`irH@{Jj%U)Hbb)aS zlN3@EYXO+!>`48F(F%DxKvPsahizcq@@L}wB<-a8nq+7uzXBayRQduFEre1381Dr(7R>Ga)4coHw6=Bl4rmsm_fSb3(RqQ7q}a1emPVbXFPI_s(ApW0m_nsj3EX{?elK7JD-L0JYM>>|@EH3tpe^^c;bSY2EcP6u8k$iFY|v z2Fqx1F6(0t2Vn`XnyWFADcIcHg*77h_0sq_FA*Vu#&AiUycaLnB0DlhF-QeU*(&KD ze`y!CewH?bmX9A6w=4POBQhakSdm1|-!)pl?@-)kMPn)$;HIzETqrCvND053zvFWd zPZt5BYcYME$ZGWY1n!qUFgS6~3=ynf% zN~;bHiR2SP?jmun<(KI%p{Qit7Hub@&(xKBbetlxW9T;xw>P;4{75S}HThaCrMR-3 z3LBXA6#DTfjVvQWEAo&~w6jo|DJvce%dV0p?dtH%whPqWY!ams@>H~XtMMvPkSHNv%Ot$OI}y5mtql(0`#ui~ zW0CAgvw#HBlLhlo-3BzBY4=*YI4$mEt!k5w!swOFt-^Al@ZS=mfBhdrTrWdx|KnLP zLp7YZz&QW~`a*(eF%}e zduYgu#;)OU3p<>xnGGg?m)X@$Hv7KDE|{MvbH8IIv{V}E8#XdS zWpCO2J4MO-(wVZ8Wy#Ujp#?)AqMyZ9F3oE)_F=>P@jh>|z(??X<`#THv)0+I+yNf6 z1=+Itz3?tSZ_H>&FE1nG9abdH9=3Rf@n5O-P_~)xdD^GebxEBE~X3t%nSxe*j_y^UqkGeaKu?MEMJL8 zgv-7T<<@QH`W-8LJkzcae?)4(Z(k^wFMS`tp&T%`u-Z1E+=?Nj(H{F9y)^@gxKYXi z7msvglG;g9WSYG58UwLFG+ZG?|BBeS^*?6mTZ|LL6sCqEe%4Hhkb*DK>5=|UG!4?u z4)nx;vwIwbaEKqv<93p`xG%EsK$uy-_2T_^o`Ly)f=*^^xh&wY1(pK~C@25-JE#ZB^|9;18ZSlV=%U}n>hX1$9V7fdrLF&lR+DWky!i8;q z!v%{KwUcgvQ|7zu@&N$=kVvh!cGFj)-tzr8tePgFk%2t?*J0J-cIAcb?YEEUW_##c z*VugF1X5I#GU&Y=|5|9-8hq_r10EqpQkPC}aNl@{Id0?&rq}%hCK<~If2ngA2I|+< zsla0k8ujIYDBbxV;`;u8&c;ZZ=23x5ct%-Uh|Le0D9j8rR^rSZWFDnf+hezr%P^MR=S15G_?m}G* z3*GtJ2Jv0Ct}D!mdXL$AT52P#>LnQ8nG^0C?Yez|MlL4V zIij;t+ZNM}9>eNe9D;*-q{}&NKW5|)kx^ypn_@s5yau9QvCTD}zOh;U`TPGC$8QoU z){WkiWm=_*z)xr|-D$%?v9BUL;xBVWW|rB6%pM?6uO zt#6Lc_-^jh!GNw5#JA_Csbq9Pn-6W*m2)fUrm89o*K3uXkkkm*>}%xGLMvmbNzRV1 z?3q8R{!aglhnP}tVQ<)2|CPA31(UB#P8viF zFJT~q?RjuWcjn5k`OEpyCg3zTWB7FECxr0IU>R(DwjXW}<57)QMTCJzG zC!(d2^R4Mz{Jz-W&mqM-*96En0qg*}J!|cVgG>kC^+#+)SJcIqU zjuwtU4_12niXB@AyP*3Ah-p_E+CkZ^ySd`fzu5T+F+beF4_VL;CZ@9tNyptf}AFkJ+o zK!gbB=yMds5dhcy?b*WK2ZHgNb~~S`fPRFOMjEjE?jX$)rvMv(nSaG*(D{W{yXi^e z-M2t2@Uod$WE2w`=xTLKs(|vvZ@?c=Ws#=@a6>+=;lK+frlf?-Vt)wq@9t{vV_ryR z(vYPhb1=pT6zVZ?mtQdKzl8C;u{_mr9e8S>J*F z^m#)~@{d!gm+wA&g(sW+C51#sY4#(|{u@Fpb8f0=G9`|keDWPh5N$+>xCU)p`+dpF zc)sQRhMHYRFG1Knb+mQuS2BUaHYJniQOm4eM9Zvz8g|Vn2T6)@{;~)ujNA75#Pj-0ZH+Z z0DUKY@z?tuJ{*>2Y`}zL9naH+SBDgyo?X_SKBLL{T9kb`9k10_o4>?T=urJ-+VCaa zPahAx^0@tm8j9UFs6c>?TGmO}?6J+ksLREMVDF7WMRqE!bX;Mvg0X2k4UFSqG>_44 zGDySb))c;-{bXp+_#vg65d9|^O7NAWv^c)u(P%^Ye}u-#PmE9?Vv}t2QYD>S$&gGC zB5PT!&QoPCJGy*=y~{y$zw&~y=OqFRx9Hn4wZ%)?9;~pLY^PN*iF?cBX7PlfYET25 z?jBTU6DJy!RUV?pWz00Fp#Z~co)-oF65`_3GTGfaeY%9y9WFIW#!BG&LE$-}VK?0L zn6!&)jG;Zc$6zPo8Ihl6zS*to$iO(lXrm%osVW?g-KHH{l<;Q{`u;f>j-n>Jo%!tF z;Ei`m?t2y{Mwa8e8ON{{Iec8_!lFpnc4+N zwRv9sZeG@S>@Q8b!i-`!L?c&cstZ;OI7LYW_E3FqcU zz%Y0ZG&DjDNacrjLlZ{rOUCmda)BGd_Tv-fgK^+p4SJNInDtQee*U@5BqJ?#pDDWs zZNrlDeWv|`HvWyx(E7)r?c|`n6vg_A@!OO18#xJ|Kbn&+dbFExp`}JnP?PL<&xC}Z zla<`8-u)ULHST+Co|^>a*}=6RiVju5EuBWfeypkl5dFaHa>bGHr0ON_4T(D8ACh3} zoXPLJ`uEBnkz*tU6}Ah5B-UOMo3kx4l2JC;43unGx@46oEFrH@rg+0B?Adxw>73+9 zT%<~ehcDUMo+ltvPsCFlVDGRssOn0UvQy#W@1L!yK3^)1df0S4U~IJA-|q!XCKEC0 zLe5@s&RBFZq719#KmVbfHsl_iaXsQ)YUQTU(SRMx1X;Dbz37UVOtw|@>7T*YjRxf9 zV0ntEC#$V72EX3ioMB%{B;*xr_Mr%sYGY$48;eOQr9ElF=-De`+7xPVd3Nv8ux|Kx zPgDF;&60|`&_~iR&jB=FUlA_ehj06J>-{S>4_i+c!4=cl+S;R6HS4IJ-y8iEzAz8h zs@Of>wQWaSJdf*3i}T{c6&tAm+;&RJ4(x^kshBDc@{i0ZA(0>97WK%jRnFLU+2QLN zd%@w;RwQ2vObP7-LzAvt2lqdMh`*7t*lGHUXRx_lIQ3#Z8e7>gp4=|OiQ_I%`^d6a z>+?Fr>vgiu82wN zeO4ojjcWieC;_5VL{U4vXs2XbwMFNU2jq9hwMF%`2#Quq40n%O%J|cGbGK>zLnSb)X|g6Qg^3uL}59l#k>W zFyVR*8asSF&EW%fjRbZS|F;)lWanm9DT&qv$Su24n;4HHzy(9(LQ_A_XWMH3QMAXL zX-_Fe_D^$tYW<>@VZ-6EajjbVk%X?OsC$bRb+Ofh9%PW87S0UcE1LA@dlW8z7UA{PTdmw;XK^G?7n!Sumtv{}vxVjq>W78q%iW-5~ zCG{Nuw4^%CN|@N2)56C-VVjy>`dwU1+zP6IcSV)tP0cc;fPsM-4t%~Vn;YYIFKKRg(-$=7c0W?^_S93v&|qL z;cgZT^Rr8bpW*;suhz~ZXMjniWg4?`lHWwmL^Ul{(%Id5RoL~GZ@fHLoQjQ=nz=#8 zAd++<g)5nJ&ja8Pbl+lVtY9zg2vz#?TvuxawK9auQjPfKMZM=ypuN&97I zm1TP5j1ljkdST5WU&&PLGomvv+9^$rF6Iw5bL!U&{uy`jA{ScuByrYEnm+;=E|`IdX={)h=zGM^So%=42f{SblthPNN$fM|vFg)EeY6YrXUZk*K7;SxvI|lVrQjS_iWmGn~2!$7$b5br)o3FE9RF z#EY9M8LN(CxIVRnFfBjRiIt=^08Fq6Y7;2+%!x7InFy2rG zNLbh8i)>V4L_dT#f6;M^wzV|{t23l3;R!#B;@{bKBxyz%PKO%LB>My^oy{oGST1wi zyCvuq5maJ2i9v!5e>gC_rLj`sk`^meB$dizHape~PPoQv%DVQeiD|Uc4&SvhvSIXH zoIFfN&&R-%ajdHmI4LRIvQ<`?LMn-3r;0*j2lithU}NUc#q*kGGhG$30+*kX=lD{u z@%u>LPY$iicVR-8QDKWB{y0m}eE&Mo;d0cXo6r0QE0JBvm0dIkq;ygCLmPh+K|L~n z5%lm-!!YygpRpi0!bdaD$KtIoEn_5^_y0Afa=YlM^xTS_Y1AgvY9<#J-)Q3Pj2Dg2 zT3OF7>WO_LXNdFM>>DUl8XQ3-h|exs&NVVMg+e@QkI7UCT*Z{)ncki*c?yUz&iN&XbMH8TZmH&xw+$ zG_tU$j(WLR!AL%QS9)gf+Du)ir->J5Db?T9xgw1KIvt_2OdWRxXqL13UUYqh;hmcE2%c+(iw(Z&wXIoVUy!q|S z0oKO^0l03@%gsu2(zCNeaek>wDb`wdA&>Euaxd2HgEk%OWA$->9fEAb$D>u|ksudK z^w>$BtTlk-a6ba3dnxat*n*2^kl%bm<`}Ipa~g#5&`;5?_3o($fg9w!L+)IC8l>G9 z(J?EY(T|mi1DG6FK0U-{*K6Ddx1n4=^?iu`6Z3+lJZY)&kNGYg%j(7JQChN(@amZ_*HnC%cvOgA`lfHwhZ1=Sil>uCvG%k5{eZ76B_`QJT7C2E zQLeH+elvRO9XSinFH(^Mg(Fd>v{-Dn5IcRUO3VpJ3mmjSTyHSXzkN~D$iP(wqRW5&gP297^Dah=lg&@$A8YDbF+}N2IIT`sd z^?x>v3`V{f1vo#cpY!hs-9)Ul!@3EK_ka1A=z+wIGHSYIOZrmvgb(rs^`y-7nu|&HQ;ry_qnD_PCaaMtverxDN5}hKuQAEP;>YUamO%ReEo= zMt?1el(=k}OT1~X)6fogrGy9r~E2_-7d5aZWhvWaA6zMvUW_a_>Pfnyf z%9Y4Y=T5Q-n^rW`W3>Qa*Sg8%Cr*5FgsLa}i085oO-+(aXHa#Fj8rSA-U_Nr8Mn3w zE;JzBT%hhlP2@_{FJ%FZIo3esd2hd~!!V7ej_k1XA!GR(8Q6sC@?C=O#6Q>;)Mu4* z_Pr3#z}`m#a%KHe6ef@$nW#&w^DzWm)~ERC#|225h_1 z50u3`*ZT+&Od_IkMBc;yd_>X27e33TY3n zMIb|JC`BcRSUn3=Qs04sHNY_I>4v(tclc5aA&2uDnLt$i{~&BTrB%0*|NN=6I_Sug zh4I#3ps=M@vk4W9$3P@$a!5x8byN_f*6k6H4|s}}VW`0L!on8`qpjG~vSSl#?Jo_kq5mI7|j1--uwewNx)XlW}mf|lL6&ixg zPQv^*3amr{`fPzt4+u8;qv0$bV5dk88my0%mf zG7`6L-t{D`4U9Xi&?iNKFy;hRMB*ANZ`k-Xd5BwJPWFdTx45gmnK@hra?r%MNd|L% znzLniEZPm*Zz`yeLP(yK(=p_vrHM#7)Qjh&^#|cf^lR@)50*UfCn3PDrElepPtNPt z?X<9X_P6fn30)A;IOW_5h0a0&Xus4KVhBd>;tTO|IgVHk+iP=w_QU*p!OyDhM5@*r zr@!A@sIdyd4d3v_lxDTa5^%YoESQFQ2vdVZK6$f*=$P*RlZB2=fX}-3oX_g;CVG0& z6CqNEgYl*C-lcvFx%<-##ccfrQy>D7dJ^!a$KB!@3|;4K!bL0YG8($c`X&Yen|y8{cvYSK zoE;VP77X+=?J4@ zx6Z)p&l`@e3-^OHL^5T@CPLnVB!JlV#K(jOqNK!uMU@gO<_z`#cc4hum-g3)c?<5q z=>7xvPxtMCs&q8nE_&cVe(dvbO8HL|ypfQ!{~^wJ8j4F&L}|BTe+&3FO5bNnwwxE&kONzO!+Hson!H&#I)Pu*y5S_)%0(BQfX3nWKh~uiIt)P~guD|1V zlk&kGK^>1gaCjPvP{($dGqvX=x4AxNIu^`dRoL7YG}o8zl9f%3>YmoW+l>4E6ycB6Fi+t!jn5|NfM6B@NYbM>E#`EhATeYedF>OV z)Az#SwQebTOKv8ZV{7DHVCP$W7-q{UzGlQ!)BDLF6mtoPt(8a&Juh0rHLdmxLW|eTqW2CPxawM zRQiG84A0R}=@?4-s=1bs52dWQ1!m?$s{*mp&_J^QIua$%jg4O013ssHH}r_2z%1Xd zBi>K9KDWZAlXKq=PZTt8E{C4&ha?&rT9!QlV1C-2wOJ=%G}y4!6-Cu-_X|2s0-t`o zD5%I%yYAi>0SXPm1aW<4<66u_2Wz==Kj3b-Z1nx!B!)kNjtL|-8#IHx|ItWq3QUfc zlpy8D*rRwC^zQA|nk^mFe!fZ@!0-7^qO~6gIc%SyGjarMj}yUnij5Tk_@vq5A~{@z zI_6vzdVT8E&|BV+=pR#-r}2+xZSZ)qvj3?C7-$W>^icj zy<|hrrz++9MR-I$s`x#B15WNYZrU8HuG13V+FrlvGxu%T5WqFa7E9-;KwnY-0wd&eLzA1lrtTeN1qU?_*SMFvu95CHn* zURETh&wFzcFdP65{{Hrtsi`iSQ>Kw^f7zC~trvMB%R~RVExgMq6E758_rsA<$LKo%SJ0ZMfHc*?^e>LM*SJdxPF5#(4+C}1MoH*JHKM)nKH0~f{R&RhOZqq)#~mB)2}#(|O?}K*A!qK}uapY+ zgc?g+^Y=K-AX+NAB;;!>IbvJbo!$$bNU|?SPK_EDE9U{p)!k(Jv>->9)!Yca#~K*w z8uQ|}+tqEJeC@L1I95h}+xkS7Sgq1@3#lczFZGJCoQ@b6W81X~@gwG;Q6C67sS0R1 zGKhGx@0uBV9^s9|m;!&qt@^p+L@hY49~mhZsKen5*SXp2Vcd`qY*PY$>Ph4XE$}JT zQMSwl`8X~j@BmEf96lgL6yuG{^}ED^Na8&}*B^b#So`u~B2?jS)Esfyp-bE!1HM6P zsq1Cqp)c*m@^;i35bT+fqUcs7=_K9!!VLdtFweu@rd(4_N{artwTMfPd}@(Z8Y?{S z%BY7Hc&#|MY*9wL`VBuUgq2{Ee^4&E62E5Zl7q<1E9sE`qKg`H=~4c$j=XM8%j3F& zqGo&Ze58nJT{d2t=nb@eDuKwbs7G?X-Q)ikRK4Dj*7Uh+$LPmXhQ8ovXevhg zzuuXBAFKiKT}8Uqz@VBL2rzL3kxR9eOjXJYl~!$y{CJ8mZkSx?33u?so451An4ZKroDMn zAJjj`6*WA8hv5O-&$!t>J*599Rc5Q$YH8R3x26IOF|*MLEVnB=;8F7DN#I+tRBth9 zBC*^^^S={uJ#=SBpYiIFNaueLGiznxs<-fd@9Em55Dz)CnymT!qbZL52%g! z&+mL9N}IGgESDLhoR%V|bdQltNK-~KYgFw)i9rESpQ}TBsd%($*~VCT4jHn&L@%>= zBp}kkJi|jX&ALo@u==nfL%;qgG@b*K&F|%PL*b)$h4xUd5gcZNr9n7{cRmWjVa(uM zJ<5}iH%}Xl!Pz?smG;fO2035@(8i-bZ^Nj+FfJO={LK>qg>(grj9yJ>?$6o2s z=}rqW6k~yIwy`!0uuBZ#;nf*^q`U3NY-7Sdr--OZBYsbfE*f_H2ezZ26sjfkac#P* zgmR)kdtbGU0SWoF`U#SYWY0tW_>21&?(i1%?z%) zb7VBh!ql!_Lz=yq{W-gJ6f=u6UhJ9`r);uOYyb@&@{R&ed{+K8EZe%a*bfTQ+eQ*- zirHED=`xydtX`WDIJk}Au*;LX2CPRLaw5+%B2Sr|oIKd`Xm?xESWMMAPnH|>Uv=Tn z0nZ1ultY+ASh!FMgflEiF2~INSyO;|^qdF8P3AB9R!K)LI01cC&yPU}9gdjA3&Z9G zs4ULthz-xl{Ib>J2>dW8F7<0%(KLkBrt+eo`o1T85-CSOGCoo~6kV0tO3MITb&Z-*Z~Vibp8fKP-7$1i*J0E7 zZbk7DRIQAvzZ-g`=wT|tCPiQu7v!%$6g2*(;+c$6!^CRYWva|7Ln=bJ1I6GFDf+~P;FlW4e{&d|%qG$RY&_W! zA`$&0p!2xS9c;XT;o$@~1WM)yI#1B_(_I=WFZ@rZj}jhnNgR=s@U=R?SM=jtgMBqM z+i4&Pc=6v^lE-2$lqI}tI3e~cBw9$=i{xSjEijawV8&LI5iF0gd zv-5XD`=3Xs+x?|HXlCRaW70*1V0qg=cpZybgae@i30MnJdGp)Ii{xMDg!mU}wxu^T zaHj3aBr0}c(bAkj&>e}BD#M?*L(Tuiy`%j(R5uAxbpUNM0~M9QQ*Sz2>qFj_D)5y(uG2C{G?%3!`6&-L zFO?-1ky#}~f94J44Zf=E!8(PRb1W;PC19-yTmV3>tXTbX+fByV=rM)MY&utgtpC(S^9}TqVQ`VbzQXt>~N=IO$;Ga%W8QSJPw(UZDNT)DStl-wa zSVB?(KM)(>p`28tY!7peXjbdxO|vx_23;z-z}Fk@Qa3_^;|nse{(7#GJe((tB!RD9 z6(?GJ%IB$Q8?{y+RO%MBY?y{3ksbc;46@2uU(4FYF^*Rw8kFp87b6h5*O9vT~SlI;Y*9JXG? zF{8}cE4mvYv5*gXyWIgvUix?Wy2i>23+oIX5%}k*->-GPG0sxw$&n#-hXJ8~BkGCi zrgx4%cInCgLE|KyHC8+LCNx$Y`qx&IEmTCoBkrx!e=~-|$8~Cve!D0A1lL; zO?`|{s(yz7Toe;tQ-{27LnJl+=)Pc<@n;0P0~9pquU7`h3vN4AgP$rzt0gSXg622Z z)NhTlQd5Ys;8iiCkZVz}B0=K9Y?DD97X_*1BmsIei;=9SLfom9SO@*PZ$28{N?vOW zsNB*G2H!{fC6mlnX!KR1z^ZH#o-4Aaym05LH=n@6(#<+$?^eOnwHxCoJKxKF@eyB2 zcjiS_B{@0kb4#!!cN+D64cYMCl}mcPc64M?VxEqMCfWJO#GlCK|7?_FN_GPoyGwOF z3wuzc$%H0Ic@4*05ms&>}UU(*1}H<~*=(-#?8o9fi;IG8Bk?jbxm^|cr9FygifqC^;Q#__uAD#BFw9x-JtX!7?A<hl zI1D5DnH-%3hd;*)%_nO|v+RKvkX^BH7)>r&Y3nC)Y`2pwVs&^bQBw&kS1$;*$>m4A zCxNaft1+Yqgth|{2*L-+h>NIAv4~M_gHc#w^$f{6JBZd{diJI#o4ZJyy3H6*QZ_y| z3oqG)O`Coq!r|7IpDmEpl*NLtyhG!5Qdw7RLTWdu^H#TGZarr?E(Yu6Yq1m=1YB$l?M365awY(tdn=Q%NUvdhnl5mmV zdnzD5aAFqB`D0jO^P7YWk7_ykBCHgkx=SwM140`!k>kk5UEms}r0l9Bf%k+X#3Bj_ z*C>A<1=Du%VqdVl(OW)C?(rmAl9S}aF<&EK*sfB#eBzfc!H(m_-HFCr(uv?$C$r^b zF`DEY&C*wDg&V-vZV$M38=NfWc&Tf+S$>6G&HG0V%G>rpdleFOTGO_MB1VTfvy z9%SJ-7iovvRdDL)E2jL2Y90xT$tlkOy68LlnJ9SlK6|(sn8O()?faUlw!VTZy(Erx zoO+9USF<8GLRFZ|4N|kpS?A_1Y{6`TaTjMeLO#H?5C-v*aJXJl5^uqVp;&uu$TbPt zH9Bzs-8u$NQ|?3-gZYvjJFIw)1_XZR4hyJCH*GkmC+R*yH-ivgqs6(0(PUl)x-(Lu zoiC0XGjex~%IG0dpvf3xJ3ueqyB2DMne07Z$Ni^I?RQ8~K? z1rsk(>pM-^Ab;rwNFi$;S=6Z=7mE9 z;q330*08U4#`}hJdJ4qXCZvc+H%BvoG*tPW{p3Mq7g}lmAk$$l8whn$<|ei49s3Tz zE3Ga3wO}8{^n%5%mxMv?Ve!PI0y#Yx{s0D9P62mK;p-(-teF>jz=526%|MNhLA|l4 z=9AxmiDpe0e%!hH56(7J0r^K){ze5&!mvHG!!-O1DB_<@m{UQuRyaHQ9;*$T)?b^N zuUX?ocMqZmFsUgU6Qa_XDy_2Z_WsV!rD*!RDes;>tZQN*Z$*U~<4~-YGCZzf%W5jc z5`BTpr_aw7qiBij-~8ING2paeYg%02q?I=kVd*aD-tjA0x;#ca{h*ShnfW(~h}dMd z-utF~NRM)2smE+SrPNip1hR#8uIXz}iYI|(1*pz+6$HejW{?;*19qN_r-bZNm8Gol zp0rr9C93V3os-CJ!Zr*aLV8qdvCeBy<_GJ2$z3z_P_(IHWVHVnPczPPZ@RkHeB8?K z+!lLV{Y($|&u6Jdd@w}^s(;sRZjZ~s^}dkMJf(HkQ*Dl8l>VpJdt$0t7FwdO?pO}769_5>}QLK3NyYB|MqQ^cq zn37v6Ah z>$BHInhxD<)>yr;7W!&GdQtg{xzbERFW53+lj^gTotA+xq@oBnL!YAcu*;H=tv)E?I;Q>AHacek8Z zF9<4nDqRKe!FX~)=SxM)W#8`oBGcD;nA<#}ggb?3XSm;xH*u>!LUw&826omdw&sEE z7RBTY>fy@oyz8@Frm9({6+jR$--2v;fV-NivckjX9O>u$>7}}|ElKNW>#TAkppaWW zIf6CoGTvQ&J}4_Prte%UFMno!JEo-=V>$SI9Xd4zpPIy7&2(m}O<>T>4k5Zn1^h|EQ7#Bk zI_f<7>aDLL%IeYgRIi%;5U~qMqXNuuFqA%)AKgoBAtCr#rAVrn{_)5KP+ZFTzBR~N z)TfM)1hbF!kk>!M7w=2V)7>Cl5$D^$FAbKu!kr?6(qyGJ>ZH)0{wq38m`CC2x{wiU zybzo6(NCPTP(x*b5F^E=#w-W2{wMV!1|aruJ>f@rj$CAAPrU3bXf!3Y@@_>vY8CYx zgW}f@eNVt2&7$@4n-sKd)hKa~q`J&MUS5MfaAMO_>0RE{@I&O36F`ohW|KSwiWB6wV<`jBL$W>qc=Y_>pe~(pWg=-3V zlYR}EAvocUU8wUQC_Hb6z@z<6WlMIT^s5y8Oi_9sK#nl>;ewwy2_TL5JT(MI@ui}Fod~evCn(pGX+R13`fp069%#(b=R403RVk>XahV)J| zbt~R=9#1U3*~v|AO4ZlCsjZkl<*~!&u06-Y-9m1wxPnHG z#eY~HC8yk8E&X9?=#C3MY7x`suYUA@yXJw4PLbvBjuf?=`kcQzqkMK^w8xTiS7Wyq z6VgPVdIb30I)ACb$G+r>=;5#WcjdSj-BH-Px^PNR^Do`0&;I=rJ!$ev;%KDje!=`e znMqX|9{V+-mjwGyF?4ua7<H45}$PdW0)L*TG|-4W-PI+eD5i9xQf-!49K+~be@%HlOspKRT8dG88sCAa&F zl{!41$)+~{;G6$YSb1UblnJS>xyq{T+(y9;ZkrM=R~EP|EwIBrnxIk*|j7??$)a5dGgEFT=|_Oxj6TJ%Kp&r z3_jg8GZyfFwUAD{d3^tgAOD_lO1}Reu%IC^Yv-4_J^ZXy*Pet&>8ZS$JjbBMZGOAZ z%{u*B&zB`1qy8zeO;E}YnR@w~QH{qrcfSSGrWfsK0M1G8iwY1=%~JlEEbcNx>+~`8 zIj`G3ik?2&ufcvab6d;#-PZ4t(bwe6t;Ve;st29qp)|^mdKI;Vst E0I_f$od5s; literal 0 HcmV?d00001 diff --git a/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area004-v001-MC/word/media/image2.png b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area004-v001-MC/word/media/image2.png new file mode 100644 index 0000000000000000000000000000000000000000..126279f21b456d0d6a7f822ed1aa886e252b8795 GIT binary patch literal 24541 zcmeFZRa9JI*QHBBfZzdwySoH;g1fuByF+0~2o~Jk-L-Jn;O-vW-R*3?zfbq+V^@9I z#b7X~+Jh>#ylc%lpS4325Ec;uHVgzlIacSF|Ni_?9JPBF zsib7*^ZNMKcps+YjTM=WZnFxatIg+v!)S<2?Xt2T8*tD4CoBna>GIXnr*o#?b{UWzC%gz>)fcO2s z++Ck?-(WcA`4U#yUW9Zu6>%u^I{fP@iS3EiOr|^ly|i+3)R%|JQpj~AO$}z#&@qYW zfeNQiBiv`1r;|I9+AgTS`_6=_-`fofe+fi1-xI{<{cVR+?mqBefB8N_q5x>ckWR}< zlD^a?xwX-W{9}(8e&=Q`F^I_NL8?(}>|AhXX0M!|V=|`)`X2w}PfkX?LlwtBQgpn- zxy0w)5uV)fr;W`ot*b3xt<;?7f;6>Kir&!BVkg>{#Y9Bc2YMZ6H%{$xKQ^B2JsLig zlv?>h+cw+uUNc(fm^gafESARcA>+Lt)GPZ%ccRas33|WQqwO4MZOQ{ZtuQZBX44%x z==4m@`LV$IP>g4{7gDb=L5LV{YoFqe=mu6E%)gm@*JRW9gR)2qXE>4Qqs#7%d0gu+Odfb#I<_T#`C-PwBF8tHB_cLtS;Btli1 zojpO|Y<$DH{po3O0`13Yt0IA{rxXK!-vn>ixJwwI-i*l-0U_(0t6iA0P`48}d5$7H zY&PY`v0CahP4-_ayP%A;>+f_WjD_J)f@JV@~rknBbe;qu@jB{gj{7Vd6p| z!(Xr#^t-pn{Esw?vKcl(wZkBJ?suvtxuI}u-)vM|u!h38J4vBm4#B5{%b$z(y-?Tm}e7e%atlM55&P7u9kVi?v{2}8M z<8g0}e&w6FneNM#yTIdSxVziN@r7M7gYne8mBs7|{iQ_F@>E1s4Qs%7#Shl4`iB+fLp}JN?-OOsmz4} z-7RNxSHLy#h@W;RbMAbiqjNGo|G|vK>dnZY^Jk)i<0@#HrgMLNo@bO-R>sM2DUr?4 z?Dk$lh`VpD{N&G?4suiM1J=NZg~9~tfBy)Iw43vtnNd&_<$5Ucg7P#idWPn(m|T!oq+UZlj;WPM z4o*)aW%_7|%CeZLn39o`XIrK3I1Jf`{4M&_Xfa)`KZ#19iGaa;HE$md{$YyD+lEo{ zu#Ob2ycm5mtbNb{Nt(wPo-Gi*!oFG`&to=T6e=t(G*Le+wy==Yy)yDC6qEH^ieF1b zY8bzCX6CRj-%JgArDbmY>Z0+7v~)UE3JLD7^647>Ffb@6JDg25p1xak^9$c{11&M1 zvKf!%qC3g1<KEyGNd%$fvFQa^V%kE&{*2cNUv9NC z`hf88>84Jqo|%)FEK_b%>^SuXYO#n&Ko?Aqu}H9ZQ!V)m-+iq`eJOW5qdPY({b8C; z9yINIeCN*4P*7gb7GVDGRp7s>!+VYSpQ{5j6L64$qx?Ufhr|L&-meF%$(K=(kboxJ zRK|sH?)p%UmvHme_FU_}#|8$RkEP}t7{$;IRMhe|Ii#J@cpeMf?94V`wNz0s zMFtMYM4Pi>Sf3VW=pv@ zQ#A`6wmqm)tgapn96Yx{NzYtf{4!7~dti948yY#RZ)G2kZAQ*%+)zx%FPBwSf6ILY@ZOia8~ysrKT8-75hgq%BTijCqZFbJU;Qi1 z?@P{9isJ}jVMD~8tbk&oQFqP!54_`UvsVm5%=}ig|7is=bf5-ZU4`BHnNoEIRIcNU zh=Ou)e=zU7Q1t+fGwUu|9CP~_E<$l#x9zm~wvF?-W`no>aYe|#8OmWt>uYNp-puQ_ zs18w8+w`Ht;o;h-;NaI~?4+5ToU@*(ZV@OH!LI6ahX&Q3V$=Ol-)y$|%QSrGxf(e! z0~L*tvV9t4&+j6|93&7<`&I`0VI=n_<{<6c^-#TTp>Ry4C}g<*%&%YkRHqi7DLV~& zYpX_-)v62#$53!N*)N7dqE!7sG^YDmJoNTRvHTB9e?&=G)N=K`er35;T4*S`)7}`A zJTmT0&BUDh-s$)2<2GF=>RfS^sb9%o5U{J|W&H%<#l#|c!q|1$|D|AH{cSFwd|dNk zwW-GWRvqHeAaA*_lw$pJ3ex9UhCV6f`3AQ2ssI!En%4iIR?cXRaW4ikY4wB0PWZ`! zI}uj;k{8Lf9NuGVgK~JR87W%qiUYkt{@i@m8XhrmbrSRH-KGb8Qp&E_heX~-4_FJa zNP#lOr~Xk3geMCD9o?&Q1Tqp5GlSmv(r6n0jY?gz0UzH_{xET>J=*NFVHmRTTgML$ z+ttm5H6LPj_7}#4ff`WL`+92%epJe6RRpnl%ta4jxf{4B@Q6)sJ^OE$hL-sC z{)nXCM+YjM$D?FCC~|F1kNB|G#PqRatK6KkMAh+^aF@QS!9=ShF*u_Q#BcTMfbE8p zpHLlLmz%;o7!JK8K#J|H{}|hK#(XgNczI24IU?-MJ2X*O?Dbjg-VS7Y)8q=z;mvmP z8^ri?5mTRFU~JS@v8J&N=k`E6{`_TyWq-OQ?(tdb&gjv7INniYOYLapi5skAU~5}4 zI<7ljly=)v%GjWWh#8+B^Fluj=T7esXB$Tsr!EOYufSb;8>;Lpo$>R%yA!incZA1e z6fa77GdC_hOgEk{>xlRueAiiCg(wwYHIPpmUD6Tuv#l*a@tj2SmpaH^+`@v6CT=`v zfBzF11B4=5FSd!Sp`8&osNwMj?0HRHLHuvto&A3Kz}M_r~`<3MaSwlWtxdu%Fm z+m@0{6oOJ9o4N<-bFjHKOe3d2CY{8gE$9s2p4GNRZuNs|?=(_8?e5m1xQK}SiNF;P zlcQq@C{XmV2agjk?cn<20{QxYJhsL+_Dz|w#RnI8B+W<5^)H*wN`7sXi3{E_y^0_D z;60X$#ZmEN;qQQf((xG2=!4APtm`%_PQquTwXRRHv)|OAnC8qZRyxs*`FYCBT}epL zR0>zh92}|?Mg_4WIp#mIY+az!Zu_fK!yr635JF#H?Ir`CXuS8jqb55uyg0C;((Y$y zY&=F%QuiSB)ksg)-B6Bc(2WBlSivV@oy}8gO7Zp(ED=}Utm67BUap*6nzP6z%H%u9 zjWO^K+nZPhZ-GWl7A!x$CN^ZyiJ;<{sMRBn`_@E}pkSMytd+p4H^x>wXUQlBh8}w2 zd)s8OID$Bu`c_*o!P4H#d zVB*{-iRprB?Nk@;MB581+)p3(?X}7$iFJo_&7(Z8o-cmJ;Q*2>J+sAys+%P;I5(tMP)T%TNs41j2W`f>*^(r7J&Machi9A{sPtyu7^p9#+wQIyFLRtdGVcNs zGAZ%z1zPr@_`06Ur5DR(k2laOEOy1U5Shav{82p`r@zt$mxn)K%HM265Rs5b!K4CZC^+~7f~kP# zpPNzbyVvR+sG#1B!yBsJUNWaWpcjHnN;4R5Ct|g%MH*Jqk#xWRXWHMhBgD`{>E}Z- z+L}_Y8)W^eI9|sOoKcEbiSy>Mk@-BMT|LAWOJ*l5_D?4h8g#mLtv>5-9%6hood&)8 zkmnVxU(@v$!w^$nW*IXs?b^Q=5PCVP5B9#fb5`$QjV)4@M)bDN#a$* z1;zce-|%rHHaODHfYolG0zyQ5-LK#Vn=gkM?|4+PzK(S5MESAF?g^+1_ZwS~Vm&3Q zgOPzZa3yy&>9xD}o51Bun`xrgdLkT*#o)u1DEdpz4xJ4==O`d~Ugg{+DZrer+hJ)k>zB z;8wn>P%PxjHUj>EUUrq#-PMIB_dtJR>3#y+i!6{XXk>({qkD-p$^(>5@23~)cs8dY z`+&QrM8Tau4>OH~yXm6gRu9!qqin|lSYeN@@K#3(1QZla=gXOxz>$lDjg4X9ds(M0 zPYKy(p#0{uOP!Rmt)_{st<8dfuYocDk_$fL|Kp5F-&S_3ZS)V)opK??yaTT0 z3!n;VWI?fLg73aFwWpY^9Ft*Z!p27YTL|Gv_ErCdY1tk9LyBM@3kBQ$>nHG8JuJ}F z8P33 z%xn9&xl}1&<5xSoLjb3z(e6BWb`Pk@D(6Ik!G@1O^P3|&-F^51K8mLKa&+frX{$ku zK5~7iNwT`bZm)!8Oo1oq-pZQklMm%xh~zGs9n>YO-~jdRjEr~Bl%M=s-(}m@6n$3^ z8TJ?jyrA|b{95xF#V%1PK+u&4pQTnNs>m`5J(kctJk`L-0Zqf4OqWg+*rl(e7HKGCO(Z2H<-v0G?7N3g1GnyTYpE9_#3VU>vwn~620%v{V5vW+ z@>9xc@TZjJGiyuxtJb+P=`5b}fz-C~UYp?+qHCy&)D+C_$t#a4Vd99yI;LfN%t8Kv z7&kKRyWQc+tp~ns2Hr8i!4+n9YhgLHRJ(Xbu8eZ$pH0Z2YC6+xEoq5yb<{4a@SZLS z@W!ZwMS@6vSf%y=nC!>;n=E@h_w1X$-wzteOvoY)nVw20fV9a zx90TW{ubH8#StNBY8oJWtM10W&`OIHAY1~jM@{Om?W;bvuKA|YfcKUEmzE1x& zY5lW(>sIcZbjtL0z4bvU=}QQ3uD(kCPcrvDd!=Rkdkx+zM{YD@rD&imJ4fAxnHdEQ z&n4MMe7N7H=PfY$?SpUNbn;B36g#Lk&Q>tS;b2Z&Ge=Kk;_`74v%;^_b)TVi7ZpstJ?X_ z_w+M}75&K6mi?`#g4pv#2%tTEx zEb92c- zw^RkA!?*OL0W-OjOrfiH!oJ( z?*<5ZUS2%xWfo8@wK`bbMgrd8n4#iA%SoEiEbhWBw!4dINk7GfSB3uwrnP(G6ScqCE_SY*9q=^dS*19TFM^ zp{PGbX|=r+I1pF+#8Mtt+ zt1&Ee4EsBVfRx#^8^eU9L2}gpmJV1_Uj2Wk10}Ia9(;7Y!TUQb+dV!S9fO3*6mudE zPM#=uc)1@_EY}~6PTg;2`s$vnwJ#nTOOguW;T5A{lQ?fU4>`2MUwF8?*TxWlUbMKz ze&l!0{?ep!Wti+#L2S+C(#<|y`S1aYA=9^ScC5i6ZISpbAI~>_J{P$$&~rA1w-{dB zn{*RDw^b#lP;k?HctVCgSht*aMbk;6|MnIH{WozORXlRFU%n%whn#+*SczJI!Rlv< zibOst4SM&xmGTs!tx;PB^-I{uaZBv0Z<^}31)mfz9kQt|x668%BB9!Z9{Ow*(Chu{ zi9{xYVGWXfo4j!3fDTo99R=3<{!u*MWeUtY+%f(a?4+WhEhj zVCJj4YyqlNia2~D9T1wRQzS;0fVQ44U-p1hwPIAiI$J9K42YV^c1S_MBSU?TaPikR zv}PMoZi$*NJ1vv@JUHf^h3|pd+PXY&w25No-`Bw*xWhgC&HYsq0b4;0F=0a(Ft*SE z4+!Wamp@PcO2?u86*Ti~FS2!HFK_gAdt0PIoZ0>iUXoNU`Db+U2|?|ML& z?OL<&%NGZE{B6{@zf}v3y{yAj`s|gjZE>$!ZrHx&Jr0i&>I+Lr2g7z6>#DXb#4Thp zPJ2Q?hdmo2C&I`G%f0*T4GnZ*!qp`8peBX3l2{td-*F+v{1s&kx6poL_P@eS{wgDGTIt)-DEMp zx{O{;;pHAfUQH|^zS3B+ePW~@gnC{HVA8pY?514}#TNgeWt;P!3gyj;DB*moYb`PS zELmB=n>Af48+tB{(J<|g3CXp9GvnGbp|2MMw$!N1B3Lo$znj5-@w$vb zHSW*klXkrN3w)oSbo35=BiY9H#l)u-h)p8L*OO+7(5xo17S zWSAqPve#j9LryAs4Rvta@z#nZBvi6S@>&s6%4$Oo*eO4lQL(Wz&G3KyGG<9@mz8!$ zpLuROq+wxVB!z`rfnPS^qu|JH!536?1iVdryMdLg+ zNJ`m^jA=jP&^eX>*65egh(0qn8U9lqe)2NInQQo2r%YyT_nZ)v~C|PJ7+KYz5gL8O<(PkDIRMS8g_} zXDaQahsNeBI)J?uoe^Fg2wQ0xRef|y)EtF68d}31Db^5z=lp+#C`WFN&P$hA#y0S% zG5Qgj`V75iL_j8lYpPZw#Vky{x0qvT=n?Po*WnSDBX_#YKO0#_>GD1o0YVwa<`xyqEV=Y$-QD@Hk}VIRa2$} z@HJsG!vua4n&aH57i)0|+}hX{a$iZYB%5^T&ktD+R@GUjub`-N6G;Ccnuj{*TrPB{ zet8lNT`~ev4a>Q+?P8w8M+e4T{!0zM#r)Zx9*R{@v%I>*Ei^z82^%Y(8r}saLjAv| zc##oF51n^r>)525qQWj3F!Azf*QraRO8^r za-acZo3*Sub_x0ZK*q$K@ix>qwp)R(8}!HW*nLvui6K# z3Cf<1MYlLm$Z=&W`2%)$SJtMNG11ZBqKFVu)}g#Ke-wMz@3riVZ^MqM2)YpAo|PCs3Yd zm_>C~AYG*!T;wQn-ZI$fS7*|hDmza6CwK<2wW#&yEHL-0GYJ)Ume0F(n7p@rXYYCp z0E@rMFjfG%V1L1yD88hUa$ccsj;GqgTh#hJvxROI;wIYHabipNyaVy z+CD}9u#5b_$IxUb@{#KR6!qwKJi~pvP-eHeW|4qvsMV)N(<}5bZ{~=}PtK?HRSNb- zkEZ)FhJp!JOUzG2(lk$xeQ_1aJM9*S$83h_#7N*eV3is*Ng`Z$$u)l-Waac-s!-SY zBnw2)kS94q*QG2rJRW9ZPm=qO$l`|-MmZB1$Raw%}}-wVOC~C(X3Jw{&=mNAPuDCY_`Ml>g492IrlFCYTGnb;9-qtBDRUAdXSR3Z zQ7n!85||yY>Qj@RZ$c0Tq%m}Sdqn;sduj<7KhTcyjq_9)Y+OFS3!@yr_-CuK*5Hg! zJQsjw0-V$TZnXZlsQ3S2!2TCE1X!u>`VfeKTLEKzrj~oVNggn58B;KC6+f19+kN-$ zhP=_s-~#Nme-=wc1`&GZp4-nS%hg5t4V}v4##;%v_g2l7AbU&0Upb;SlVy&EKzLh` z;gEv9{<0tR4GpQMrw8M#T^A>{eyua>)s(PB@71W zywUz*8x}YCZe|$M-$-lm&MNZXe`FuQa~FRaxAXk{NAnb1T=jaDGeTa8?pFOV!^tV> z#tPN7cl4?ykOe@m$_aMw-QLn4@7kZsxJ%T=A~#8qH|_@&ay>C_>iQ<`hBsd}y>1Kx znJ-oaTi%z-$!pItnQD-wGZ0!;WE|6PORh5$dbTS^GW5;V=4F`p$v+=9y3wDD%gB(l zN^x!U5bxZ)5P`0j0++L^58DDf?NsI>{O=w?N63VFjoUFxm_oNcnQQrBbBy_KuJnK0 z*RGY$@~3!iQqdLw>CGTLAw%Vs zx?R4owq$_3L2_WvWyBk-Yjaow!1DQmikd5jMU5AM2j5o}dHb%O4F`V}91@#GUM=Ps zFVr=&m8c9=^7AZcck;m_6U4^q5DYRz)?flTjv9ItH6#|>+Tb5`oE)2az-@b$Z($0@ z*Tn{!-LT$Xm=YltqiaF*&c9HlcCoXELiHwsXc`(R20JO%7E>VnIXdg?L>?aZ_3lYy zVvnnvnD?$6=XO9Jv-<3Nl<%Y$>LuABpl<5mmsAx$teJG+_Ixk*qlT4}CUTRdlLY3?Ik9 zjL)z9l_Kj#gvnh6<*zhK@xfOo98%dz0o$QBhpzKr z`1&Td?D6mu9{X%xeD#Ip&|Zf-?djTMz^nx8><793!lsZaDjqA0bbMWO`eOm7U2)uNYd$IVBV>-$47A85kkTv#MC^7hhN zKVDgU;&XMQ^a!~Om@hGCoPhnQ8VrOD-TTP2*~xnF5*FaW&1 z9Jx!ItRwuxm?#-#@f1M*z?T$SP@Jfp!7=1`VazDd%iv4pp;|yrX8(|Of|6#wi}}!m zi&07AOJG-T<7R1_oU$%q-j}n)}Gx3z>3#ieou}r&~-Dp0dl}~US`%|5G#2%@MT@A`H$`U3O z?LRFECgMe|A_S{ZD_devZy1$Z5e23M=*Wiq-Ox~*7Pag}UllkeCg z>3(XVzVclwyd0O@T1757g=&8r1;VTbe0@cr(9b%wq3v&ILZUMXRJy`68YcDg*@7au ze<;|#^mK1cuexcMi!rH$)??Di=wU|hc zh`aian+gHG*J;T)R&DE`!gk!UqeY8pKV(?T<@NPk+)^~8Uihrn3jD>Heu2e5H@7Jz zGSu10%4z5t?K7<8+I*&;r%paP`H!QSF=gA(Pf;{KCVyc{QV+wDfyI;6_te?1q(tM8 zI#>+PJFv^GI*PftlS?Ao$9`try|kHjNZ)zG>5lpnRIRlO3lZh+HYVQCm8Uuvlk zHU)ruN>tTOu@DpgB*kINZECm5$w3u~0+IlIL_2)Ohp@`mU07LQ-c!B+WySm{u8hD%1ZTCBC8Zn&-_v&J6 z^=vVpnZ{LgqYzOHj}q)kU@7teVNw#yMMVV-w&E-;AQ+?~6W_SiXfH|zt(Qp>qpzgh zom9L!1ZIiuGEy&%QxNvS*)GBD#46XK@t6O(K#Mdw_cB#1FF_-)h;{-l>uZ+{j#|0R zsRIHUwCJ>l#=<2^@)!(R9Q5AE+QWmRWNst&sDiqqS4HI9YZi;?Aw)=^wjT%$UjF3< z!aEJbqqU|af|0yi0N1;wS{8<{1GR0%nxz29w+e2>C&$1ON!@!NmLoFu3afk$Rmp5t z+0p~-scNMs&3kFmn|5Js`EA-~T)?i|7@?pdA#M10Ryhqg`c~apb+6gtG23&YWQ+NaJ;idaH zK(BUup12Ly&gPW|k10jR?Na-nbrkz6ksq_9y`IIZSMi8W80|yGMgtug{ip)~ThP$P zC1-spwkcdi;$k=9>RRGOIHE9pO}QCF7i+?>Tl7T(0BzM5Rc6#eC>p^1Wx=8FF(B(9 z7nIo)n&Ucb^~i?Ak}Q<;GC@Jcwb5P|>rn7zeyxI|*{-dP&HrOVUc*YYVdM>Av*-(d zhOhuT|It&$>T)IEGd)cMD|a;FvCXvDk<)jH6lD_UH{8kn=OK*TYYVX#=?a|?k+6C@ zHrz5+9K9n$<>)BaA-F+^9WRZEG%j~c?fTVj&`Iw!Jkp5>d!4v|+|Wrp8YwaHLC72X zR2>C&?v!5S<3QYvn~Lp5WWp7dRYL=d^3$ny5G2@iA{G~ zPclvF@=fc49KvF=<{Ja12=Y^5hs%x=WLZ8XCP&Ln9lV5-H%9SCQ$wy4>(3~B$cl0T zn-1J0-IiA#qDDpYs!=R7*Sn@{I@!j$#vN;d1eqa|3Yqqnn?aPU{#%qn7cY^%CFRo! zu>vkGngv&$_UCrq-zriLPbz9CVk1hHhGJ{#m{i%qMwdPifrGBe$oaUlZRnN8U9h>o5TF!>3!*;cQv)j zzs`z}g{+*2pM_{s*Kk{5ZVvPOg#ArCc2vttYB5Y+@`sFtuOhE6qW|p17HO_R0n}0s z!}U~JX6$ou{OS~Ul%|=;dW6-W-xe|C5DwzqB6`-NJt)y_gy~9E6kbVrotXTCquQxn zyp#5B8|Z~CHmT~p0v$v131mRbcr_*<$23)D;Z!Atc^?53Yljj*PUGiWXE(xs$ zhk?fNSoyESn#cz;v;fpv2T7&FR*7ZBF?CD#A=WU7PM;gmJiuEVblb6LPZ@#V5&kWg zrgSqVCH?J*EB96*d2f2fFv_wkA6?A}Q&5ZzQ1rSg2_sb%PRn{?0gNcbu_@Kmfe3W| zcY()>`1^?4h1hyN)-51L*}c%W_OiQmv?)#BnI!*v2Z;ceJ=(=TaSa-U4ElNNDcOV} zT{-!QstL>A9|itGc^q=IgP1k*H;hPN_97UWGVHkZ297?!8 zij|QT8(r0$1yEqs{^47!$N9f~ULo}z2m;a<^05a0rh!5npzRAHp?$og_XkX~Z&yL$ zK2h6Zv4TB!Rs-UTF8(aV#!~Af2PyA~fzO-NaIfRK0{V(sA0;VG$#MhYsFIMK_rcw( z-Rxy2f((06h3N5APg~I)$--i?b#!yvS`!B;u!8^McziVIwV*}6{|X9pYbR_k4{cam zg`LlVpRv!A7~mQVl)%k#QG2;OLOVa#Dgs$b3#7aU43+%+OV@ryE!ifIj+rWx_AD}y z*W=&7Pm*nkvD(}OXRB*^XX4Y%0l0z46+f23)r#x#^4{RS{`DU%)iyn9Pw1}nY`LM~ zjKTR=Ban&{p4iTl4zlTXDvyd;rV9O9tqe?@$lDzcs2W&V{W7zi?^#+>(M{T(GZh}t z>*1optVI^!FJf5OL~+D=5bUFDH~#Ce8T%tguKc4|a*S}0@QiK-HA}0r*_>$Pd_#^w zwSbB(-?kea|16El)Efh7OhECxP57&(ued0UGmu>(sweW&7}L6=)4!EA4ee5x5_{5d zK>wvR&1a^#rgv4JEMO~FnJZMd5K!n`l!^!Ug)SB!w|qjQU#?VNk4|Ov&75cIIgW~w z>2N_;m`?-IUfgvTfUG-@?4ODff10SBt{msDiHlI|n>MVVFEt7hmmi;I)yQfRuaeKv z+yC_SciXxe9JuzOAJr-5Ibio|e=(}DQ?}speH-v8iirAUF-8L+OIVi zPNisuuk5ICa~ZCHEm(O@wa0CIr?hn*cef=`GzJB+(7e`*YL{wbaQYE#1tfOGr~1bI zO;Ymwvr{py^N)FAr`X=8l2Vh4(AX*e2jPD;CBdcAyi;rHJpDS@Fyqsy)pWmXhtN(mr`=OjNx)gIHgRW4&Ora(kp z3$bp3jgBl@s>fG+rW?fT9hphLyP>X3K#3aAJ9hQ>Q3Z@g$(efcCnFNeCtG%f!xazt z^WVnKw;UEz^rn&MA*955q6S$9=f;EX+OvTAX8A={9jKlRl zCYD`uJQPZb%GcasN3T=F0=ajsOM%Z^ONi6Zszd=D(mO1ot28NnhC~F6Gj&H3f*t|x zyd<_P4`yc`Nj$PB&X5J5(E-=#abA+~6+miBkbrho@o-=p508$i$PfGUKa)^Bx=}2H zEW!xe9H!fa_mKoGqxis#(eK1_cLO~&%9qmuPc_*8{F$NZ?T|4{#sGoIaZLaL1n>jD zaNgvb*o&YlGs{rSM-F)4Bh{cib#5C7jPQh37NmD3fNd3KPEmIMgDq0&h9>Cr0_n~Vg~m;D5TsV{eG zRpd!;_&i~hDQ7*7-8)`y$xu-V47ShVJ|l&6owfshNj=Z2$G@w-F;ziV8B2w;F=`~6!HT> z)yAkV|NbNxYs~}vY21P&=PlTe4AS{Q>XS{`==+?;`=lT3ypHeyL8`OI9H}JV5-&5& zYw~WbwLOvEftrl1SFBh-m9;$4kg9edFkn-2{qoR}DVz&kan82@wLIS-*yr>x(Q3I# z=hNVZXg*V_`@OBh;oC=20X_@Xb~85fnM&o2+IhbfET<&XS>K zo5 zt~=a-_gR*Aaw`^l5gr`+i2wR)YgAfak|U~`TEYIx8k*@a=RW`z8<|QVep9df_ZvA# zO+gcK(Bb)U0P6bSBtUeDdp)!%a&xIwBwp&_9oMvd`ngsa->E+Bb1{Uw>~QPB5nml; zGyZNi_L%wIJe2F@Pt<4{0@!^h828!G-aY~#AhR{Mepz`p*025>Tjd;iI6zneUv_e= zr_an0W4x^03Z*8TT0OUU-9;y*Ju5CdbI{3+ibElsfk-JRP=JZHn~rGS?@qhN(~WL? zN-y|m%F&05G9YR@AmM-}h(1=%R*}Mw-p*)N*^=JimUmr4EvRdQSBh z4wo2>#n0u952h+}V}OjV&Gm0*;2$H0;Hj7yCj(C_^c zE1%nl%Pg~&30!6rO!|Zt6Rwyke%zCCGyhEmzSl(H8X#AInIED^Ft$zI&XPuIiEC6? zPZue%Mh$Nh7XvU(R__;Kv~kW?q&SNGE;nrx%_yr)pXhB?yoK8mPog)(cS#vpYF8H8 zuQ29puhqA95>EQd=Sn&SYpB`_PqP3(v#ZQ{}!}@PY@!54&upr@aUsq3;hdTUr9=3Jgp*8PtNO00mPf(0(bg0wc z6AhURHzD1kE6bmut$-sO3CtsIo)HFsTy?7749;^?+L~b9Y;53RyqtX&IFzl5k9(S~ z3<0%^-}ZQ46lzitgnkJyA@jSjE37q^!?Lc#EGEJqKjx~Q=*Zq3ak1L!eD;4#RLne@ zaZKejJTqZ#1OS#4N z_VV@xyDH4>}wXpRQt zv_p=+|zE;9soj^bk;=SJ&AZN(H=V{e)rff5;-5zuxtNov;@es+5FrY67Qpu|5 zr%3<^1n_e;pMEGAru#v$7p6lDMq*Heyj{_!dKgaiL%iRp)Us3dZqHiNI z?(gd`&4IxpZ{`|Q=<6Ff+?D&)(aZLQU1#{{XxR7hModNucL)BntHy-@hoowk11lfPDYNdd^#or}shBpGjSk}|s3Eh|OT`$Gkjr6+xCj-o}Nn%~k;u1;99fYHmyAcH4CuN(53&I2^|# zk2Hn^85vnI(wHXkGEtW*7?^_OZ)~-ii~W%p46F%*YEI%4*7gquha8kMdsBK5$*-qF z+HF!L{GyE#1Pq(+(?q59DmS6g23aDGUapQ~GQdbGplTp;*yMVoi7uUHAB?)NI z#67j|zfBow88EXB>&J|Qx(v~8Tczg{^2fIPezq4Y%_5~0@J^V0kkn6&d$IjpmS_Tj z&|pbv4nt71+`eO!It%ZuCJ`v|xW_wQC@*bp<%wl-c)}XB?h+jq@VuX4l3kN(Ql94* z%Bq=v%1HJz^;&>tKV@YFtrUt2u+k10$c16{%Ay|r(&l!I|Bn#74`N3_UNr-CM}&H4 z)h3k3saJk;sE^Loe0fA-u3MpY94UE}u}!WihInXf2R9EPCL=KpKW~~;lf;v+Ay|{g zg=NXT7*fJg2$b@Yrbi?N#Lbxe@b8HE|Me~wQaer8KQ9)+>Q5XYUWxDE@KYn&J`}f} zW(Ml;svq5t#U`%~5YYY)E9dMHw?HPHl+jFts!(q*WZ{MFPy;Xg@5lfD9snG7U~V0e zusvAs(=vD-=@c4(@*@wNKO6KrHB7;iyx(#J&}h2;An-(%9sPd;?)w1JzKQhxSmnVP z)NPoK6aj+(al+*97y_tkXO{t()B3Lwum9VS`Trmil9_iHJjkeFlir>@pPTMUD)hpC zmzJ_wskjPt@aHS$B&DbHo0~%vjGgx_IvZBiFbfWw+1-1HkaGg*!v&8!jL~ymuE*Od z^ZT%DW`p6q*IArcVuUEOPEe*FPvsmj5fM&AM8f`JZW24AeNqa=K+3!9BOhiwn#N?b z3IcA9ko|wua-QLA{_o#!OYPCtDq5=6m)dHt+Et^rid|ywU22q~Hc^{WBWQ@dN2ooD z+JxFvh#6Hu{4d}Car__r{!i}vxQ{yz^B}p7E~Ytb(Rl$>U?G3RG?ZI!IdoMO7X2Nl`3go(~-xInC?_-kTKs%319MhwxM6uv6H zl(q-XP>XI^0m_P{l|*Pf$xfI0E6>||6VH z8d(9R?Rm%X{IU#&ER&mVNDor>SmaJuth~Gt@0+sS7)=v5RQH`b2UbA7?-Ww5*&T5A zbcI70Xt#ear_2Jq9cAN{WQ#9P0U>``V=kZm~*i+NU6H2m{66|7;YFI`-^+|f%=*PkSsf(nfho>4I4z@!)-K@YE zZ$nMQe)hq`5NTcvp`yI=FHEMO8Zc8YRW-%+BQsby{&b-B99>;=nn)5qMdem_ShD_) z^HSifHDDlD$_P5#STCshQ8W*uq{PuVxukHt*b*VNHBt@>!R@QcwH=L8Aua+a53zrz*(_1rm{DOxgtDkq5mI>i4l{wm5gt-G^5f z0VSCw(Q14e7d0FsBTUR{FH7bC5&LKBLE&b9AK)5XSsKWmy@Lj|mRz)(005l-W5eOo zr$Y{NA2CVKNnPH|GvGz;e=r%8(*aaY5w3Ru3#+xSVWkdzao^&KirDlkYHuQz_vuq_ z(YdsoJ_CJcjqOsf#bGO|X{+`=l*}rKTmv#Bw^U8=yJuH^mLD<2f|!zIBox`;*$;&D zJ$}C=TJW7GVr0|Z zvd&Sa@5|uDv*Oo@h2hFAkJBs&s5mqy%_qtGcl~McfTNqq)^dX7gJM76=P%Apqs4Qor`|~RsZ+CG~m<#NG1|V(h&=X8}`6QU1x<{8NXCi z-HSTdkwOLG-ly45PLNk3bni5KZZ781K6(Hs{^8@z;oEva7EHAB=c&9I!nJ%c0SgTA z*|NLT8UUz9`&uY-wD4vNCELuA^_&|sg=C?0-NT}2uTJ`z_5GpeH>+v#-PUgiRv>|N zf~mB#OvocsPK`Ogk-eU~=@P9Y#A6csnTCE!q1TFu-eU$ol;Ap6<jK7;oDKv@Nx zYtc2ukFS%_Rkb4BuWNVL2Yw*wFx-5O?i7~Si3!naJpf$kXT9Ei8n(q|#;CJp-tf1|=tJ~biTg3; zah=3cTnwTvw9kfHgP<5UfIh=#NH*w}z(Jp_v=-$c2uL z-U2Kzm)FQvs;bf<5sH^S}XlboQcwNsZYAygn5-wwleX^|iWD=KJ^cY8Ta~AW^@b&(WGX_1|QF zk(0>A8aTbx*1qL0R@47GIexm@qCG2|zeD1KkClgg$z#P>+XR0LcPc9V_;b~nRQheCNl zp41lBn3M%s>RXj09T-J?{a(+={w;^v=#{81~p2LO#Ije>Li@Wy}Rh)kkOp!Vo zZ+xI`lYJ+KrJzuK`<4L0ZwpLCro3+i6)V4xADUWF((q_dEIK{vDM2(cv-UYp-eDyC zdoj~F8T5VpbY5Fr5>>ZSD*G#|0a!}2e>*)>ftEUa@pajClvmMvB$phSY~26@KM2jp z%*^i)wI5RaG8~FKZbC0SS-eHne*w#PM2)q|w21G^kW>7FMUJZfvdm^7Kt{{0%=ptlx3?ikODC8eY!?wgqkdMD8ZFK34(TQ@Q`3OnuJ#stbf+TU+j zkaYE5uaM!sHxYuM`?+6sufE*EjnZ@??0dd}-89Ao$vN9;NE*iGv<(^~K-ZtXp#%g5 zvJs2@shwxs?&4m581C5Zbr;Q^8WRtu4b%-qrx;lpPg84NI=wynWrJVmp*y_WI{)^h z#Z^FzpC=>p{@*HY_f%2vD@QbT?k#ems)f{BQt$M#wz8nwAII7^q6|R9{_G=4&Bx6A ziS#&RKLszm;AKnlbiuH8T-H_0z)6Gu?mQ=;Jme95$d6sQU#}_XW~h##Z@MpBBC1zu zmQzv1db#uVVxbTQ%Tj^xK*&0ug-AuYFt#wJkA)zLhp2PKGofLj2lXynTeQ?p>sr41 zS_%pZk_zEcFb(zWnfm)367r-?qgI#p%gEsU@H5a?1g$txS!%LIoVYie0eD2xue?M^ zT&A^^Ud|c}j^xWleLe54kExr~z3Y7Z*f)6ME~%`vsk2nqvoFtQZo5o3uq;>Fy)7^j+n16bVRBc zg&ycSO^g?2F>J5}vfPgUP;TKZAm_8ijisC~x`JI3Tn0HlVHYtmxrTmDQCr3OHqiE_ z4Pp$;%{u~ur6tK*gI|BoIVX%C-jy_FSr2fH?tenhFu0$QN!#ECHk)e~y6fw;B3Oms zj7(gJX|4s?2e~ut@B1D)lvjofHhqce>SlF+v6~*1HS^rI*yb9D0SzxU3W-p8$>Mzp z9*%A2mw(})p-GbB1<@S*F?}{X-W7l7eIPIezi!V0L2lXpy?5{+7EZ-)Y`5qy8jB7TvCCDt_Pq8f4h`9}sR!V7sQ7aXZ?H534WJ$g1VYM;`mwaIpnDJp ze}_Haa}fHWxS<8HMq+f{B6xM4G^v zWHWc~_Ab}fS9cz}2>w2B6kJ-I) zE{SPSoUmZ8o(_9%k%yXVE>mqrL zm;5NHHS>uG4K-KS)Jgnh1zt#?mQ+W-R_kZgGg6l$S*c9_^jp@@p%RaE@^14xG5y={ zPtlsHQ>*I5!5k(RMom@$FCF<6y4QxuFbTL-cC&wROC& zGQA4)x0De4=im6CQ#?@)G?4p{VOC?J?3sc4k^yjy|%8sgp%57gcqU)2Bfk zdOGr5+i}ASa^^;0-e5By_#5b}u;^o=rF$jNk3|E1bC&#n&!;+jr+9*(eZLgIT5W8-#hMdmM|-8S5s9fVwKqDe1a;begumOcZKn{y=O zGt_N=HpMUnFAk5dXqLn)eeR}ZALiOV1Jj7Gc^NbFc9EB>Cl$ny8IWAYU8d~tvpfwu zdyN;rXOJ72eoZ36OI_X3nnl1M;me46$0rQuk7#)?_gSTe@5i06pUs7_+!UhzIEmNq zua=0L{BcCWwcPe+Z#q~ zVi$vzpWo2jG~P1E5WF-Vo}7->#}X$_ok^O9?v;_xjA~YYb1f#Pff`%gJ=%d|)X}!1e3EB9O74<1L=qzgF891;rsyxf9@K}Jw685A@Jk^+$$B-L z)PGt9uiEb}SbtqTI5oq$0q9ry3=+RaBcD{BcvECi!RHxswOO0w+tcp3DS_Z7Ep_7o z@5$U5ACCrj(iLQH4&C5$a+KcSYP<-SD>jEdMc6%kinUv9zhTq-X6}zO)0S|Vqppkz z+++}dxcr{#0^(+(!oMPcFZvzaN2bBo3#grVQ*O zOn>}|b<XiMZT;7-%lD^)*; zNMucR&d%SPO3uI&dC#`j*M!HvB0;7tIYGlUWx}jS=o&pg=fZa{1PWf8Zt?#&W#{o9 z6=?p|`Y2J(6m^BkblY!TewFY|nRw|TVIJYP?y(XAT0Ysho+6D5M;6Or+JuLvZ>=-347-3r;WKoS zg3dKaO3F=1B(@H+azL!ixk{F_3i0^+-EHy63tlz?CMMs*)3O9cF%kinnc$wjVpbVey7+eV5$a8deq&=( z@wFj-ZbTrSiI0Kh{U9N7DPQ*0h;7EQStIzCWB>byt!Heo6$hX%on`{=GhqQ5Hda1{X1JQ2aNJF0|_c}6s~mw%|pY{(F|{F+%{mhL27 zSG`!d>5hI|2XQz=(RRjVH&H37s664?X(55yF#8>-$!j>b9L=Tk$`#&WWVt<3?;d`tQa={hP}07W{~HNrr(4%vJ-N3clsaR~)? zs6bNa_TssBPmif$YiJ87Dappv)&(3%4$IRWJ2^f+8r<%$+JkY%p(`%YkDeCR{b8=^ z-+QN%A=b+NWq%8r_M>v1YS{&aU@ALuN+Qh@OiHOdBIy-CD4V~t~cyTz-N0f z0QCG`vq7!4W@OIJBLWvoTPPo(!>e}GBm?Ff{d>SRz2_D*hb{ab)BQxrdY?BqG?o4G zsBt^OW=C)&i>er^kCHH1pD1=t%@jy-s-h-0r+C!%=|lI^{K-2s%m*mY6EAYnnXSG} z4&`GIz=5fnpgFJw_GasuGW~^<`ZA+VDZY&9bS|(`r=4b0dA{9+n^Nlcr4LTYdKF-j za{I%lY{=uT0!8l7^YhtS|MGY$l=#k+5V0u%*;1U>HvH>OIK_g;Hl5U;8c1B~)ZTN9 znfcz;;^KSU&`n7jY0o&)62|;Sf%aquU$%+v_&vJ3GByx?8i1jAR{uDYDFB|w2?cgC z<{>BDT;)XA!jTJ|;+GgJC+h@$*>@V#9iNNxU-DQPPm^tJ8C0ZghQrTWi2l_ow z;C05(Fyqp-g%ORQ@h4re8b=!0^kp+to+`=Ir)er-Z1baW5`^x+z=+w~H{5u0JpCMk z&kwZGAd^Np7bGwkOZjoawmtJWxClglPn0omEKU0aB)^@tcd8yv6`x{bt*%?gIg$i z2l=*tE8&tX7V-Rx_j{ZjpYO}C{yo-7^+sWoGIQMlLs)=0)(4M?%e3)p>*Egd1={dP zx5$WQF3*!=D_7gFeDLGH&j3a&iBWMFG8-xbCD8g3+BsN>E0lc7C818UC^=itJ&A<~ zCJQ@n@URYAF2W`jQb;G}=Z#Aj=);E{BmkL(5Y9K#i}D&$M0u=H3D<>|ejAzrdMbG} zu1t5&sjlM?JC7xeQGbYnE%5+%;m!f?I1?#(NaewC2q1A?OSjQYTrZ-3JOJk-CM_*= z(1Ridt{k%tTst7%O%^>paQikyBX`NctTCW11SlR?&HnuVi7xuh5%P*$qo*NvA%t|U yRi8`Q8QJ?Uy2uMwf%Jm`7~%gPud6Z~Dbth9ER#;Ap8!<=6Wk$aaDoJf;1b;3gF|q4cWK<+Ew~c`1b6q~?leK?@P7B3dq--1 z&9A9xilX{7z5ATqd#|+~StmmAncILx>tv;13O` z`H~9*Qy`tuiCh@JZ&gMs{x?KG_~Ac9j7Covs{;MAjLweaiG5qXdY31=4Ft-919oA> zzP`)87k4*$XlWFT@bDa{{Z3fm^xoeX9*$3rfr*I;4MRyuY3%=g+VB4oerRCyk5O-| z4S73_b&s|A0wp*-ogngqt3-zeQlYgZSz2Z$1wSR4fxKX}Staw9ohg4Lj#HmxmrS9! z3d@e*#!(v%MSgwSn>CfDW?DL9k0S@+=$lQ((G`nsWN+%uOTF!o%kLrD0#8mil-E|M zk>rW$MM-h$JeQ81=v6*m&3uWb&chd9OP(*0_iJGSi`rXns?CQ@w;d~>_!G0ad$%|;-}aOJ z@ud!Mg_Cyv4yO+!bJopR0vikw|9Ut>V`5;N?a);T?nORZpGN31bA7*`A>`rH+Ah_) z+uApeVp@fou70ACBQ?ObcfOl{T6WvQtO4+JgPyd z^z)Uy(XR;schVY4R+eMz>4y0DvsOUQVx!o=wOzP^)Z9?koAuY$z50POJ~n)T2{Mbx zknON^mpfm5yR#TVwe{(aH#A-J_R3V)^>9%|#Sh)-%A>n!)R6}>Z}w}>IJO-&zo$fS zTx8_rW<&=3DZJ`DEuE4-omI5x)IIQ{ksuDHQdN9}r=u4^#KfHDAR_nXcjs<*W(=(_ ztRzgu`SiDl!-mLOc1#Z=k7KzXxWgHnq9BIw`l+d#dom;5Xi~ zO>1*Fxrawq&u$&0%`w58qpKk~p74zMbvE0-U2@(JTam3ke1y3%YjN|k8APcX8j$`L zBJeLa=|7E@>W(TL^`t>ZvOj(_a4q)~7E&M259gk@V*R{5@4@a5Qx$y^G?TlZtxjV3 zanKN|pk&cy)APop+eVna?F%eKWiOf)^0k=Ap?%xM>6a#~qXlWsZV-rI!L~C{L!ZG0 z1r24TTUSiTlgHsQ#Zjx@6V|8_Doo9qW&2?mL${MSAY~kB9ZbAn+ZxDB;yuH3F*7Zh ztwU~Xf*mt@f7+36jg?Z}89p#NaUuzej)jR?yP3qRrvW*6xKDgneCteO3l%ZH6gzi=sBOx@J&8KIbhi+g%FuTaUHQz(X&|K}dwV zP?5aHr+u$ME-;9XqQ0(00qtAK7*B;Y^R7~F@o0i((|#h73{qO7ht$b&lhg|jB_|@| z$M^*D@IDAkOg3Su{;6ICLcEcmFJsM!$Wh}C*^F*7H~ji5P$(o#1}#Dlb`m6~LJl|G z2juC_-{GFnk)vk&Lij1;{e{P#iu129ziPS@Gc0OHTLBBI_-nl!*gzDPfk>lCuH~8R zO{X1>nubORmgF>9R7`AnC;gAob?ZuAYaFtAMWVZTg_`5g;P@hNh3aog(}-nhC9WbZ z0{AMZ20mIZ-PBKBPm@tGnKKuD{ri=4Dl0f>_XI=6Gv8-wlRrUCgk~@*NJ)*%G^JiS zg>+?8FI07mDRBJfnymlyBH`cdL00Mc4YZyfH+8r_K_BJdhq!Gp#&SUBKX_;Lu-$-i z;4ki%W8F3x(v5Jsoc+A(&GH#Z3@V;1-khOEHP(@pT`#%d#28*`emtnjo_O z)`+AU*?8C6sTap5(d`G4t45ZVv2>tqKfz9R-lk7h4Yu3LH_<|=pH3n#ddj2ltUU9M zWUU>v%}(9Uf9F-U=gf7Xe!OXMew{WIn&G@2x9fh8gO$X^-Tyvqj(U2^=yDdu|HHld zC%VwKnAok{_#D#T#_Yf5fU|N#~2m9v1#Q1^PbCobN49e_*a##*#`M@cgk?W zE>CEq`*H}%Cil}2Ha@HAg^7X2%1)I2i|gOXfrHyg_JN!I>VRieY#?U^M>8rC>;n-r z?QvWwSn{{osxP-qd!Uw37VG;^zFBH`2a{ntO%vVU*Xj&o_1_0lAMa9ZPp*9Rm`xFu zd%MRMng`~1DQ9?@*zb)B;w!v*@56AIbNOpbO?SFI9}9%6hVE1oWcDiF*A9)y!#(Ro zgMgT(FT^C(b&fZjADB*~n@(!BuICY=Nl(y;h@8AvdOC9ire|hQNY9&TR6f7)f};gp z^|^I|LkE8Ky>7IB(x76q-B)@b>yG(Rtao)4W~M~mBLIXWAfZtJIfKr;Ec*4=fP?ed zZV)p`B*meGbLbE{VvO2_>{J}9`kM>lfodJ)Np;oOC{u#jQdjz)`QKi;EqWk zr=Q*+pFm6gTb=-ddiuqBnftC|Qvk4Ok-Yc{rhH1Ab3UIT41VJ&gN_|UMfy89PPfDB z(Wz8>B;#HVjw4oGYVX8D2Cp%TC)dtH*%oD?$Xq5~4gByN!1>SA^W!lvCB}1ual^QORn(kG@o*uUp zan$AtwbjrdvrjC4gZ;dGuOt3bhV8QTt^KobISWv|iVFNkaygW1!B%JRCCPTu0A;ZW zs)>-1TT8zyqvPt}`5!UqBQaF1B*lX(3WLU2=C&u|2Ou*%#%Rc;Y<3a()oKr|ecp+S z^19W>y8vH)jq#LadyTT<<*{7YfyU#EPt8V&|Vy2xkj)M!Y13r3}Pn{e` zP%yNTpENZgB=4Jova<)i!cu^#IPoYyGY)EU82!+tm3`qcSv#1YsU9s8DNb(;_72~n zEnd!3MZ{CBJdVxv*LM7!7qc7`oR-dX>v+YIBIZRt{V|!- zbn%n=U}33Gf`Ur$xL6HqT!BmxNmkw|F!MahXnatdmar;{RK5K7#>!2NWP{@ z#AR2_eCW3@`_L08CRQclZY*tnoI-oDYC#=8wT_8w)}5VvdC~IfOM2Vgc))EosML95 zKK#bd0|ah3gj*QPjXCU?W4x^xa>@cmlLYp#JEB${bmv=xM956`VQ#3fTm9R8REqaE!>Cqf;k{SWf9h8|3H}2j5<&N))o(3L^;_e>c%^8o|F?*O zj;}7k813IyKZ&P|1;MvAYp{HK{om=Av*@1!K;6YA?2a~`@d#xPWEg>_hw%S`CeL^^ z@Zv|yly9i@^%0)UL%krg z{Ci0B{1!Y^?>MXWfngVB(|F?1Ma+~~|GbWL(@#Y*ZpEFK{6maRwL}hovuDN;o{r~^ zwjqoJdgU(#Uf`rxIT4;-?2Rf%E)Q6EEp(eLHc=V1JxPJh$-R7Ur^?@*P?+rJ|%Kx+4#5#t(UsOASmIo8x6c&!lKyJkJdLoKRL>*E%GuKOuKc&*QZ@ zEgvra^y7)Rul*46Hlg91r`ps&L^!v{7z@k>@f>-0&PB?vR%v*bh_x}4w97lAE}M!G zVHKU`Ys!&i*MW|8S>x+ls>97vxs*6I*S{j4t27|yE8B@uZ8r$RgCqm5lxlZhmX@{h zgadZ-dRIpwQ&NUG39osKX6C5cL-T>Ku-0m+z24*GhT;3Xm+X71So_WQ_Cya?UEQ3= zmt72=FNB}uvY(|iAuTPqk1SO(6M?EOd8{91* zYchO|{GJHD!X;}g_R}iib#z zoalx3Qx;hiM8R*+spa!vfa!WX>m9pL$n(Hf*me2YH%hWdK|vvHP+Of%{a!cMwG?Wn zKDX}PIKCnvM}+`DhxoL5>(r)rarDHN4|-mpJ+Gw$s37k$YJyW!sU*4JYqK7 z>GnoOibP*O_XRCDclx?ffA&bW>B)g;f>YgaU zQ%@9%)jSaS(HkRHmpS6WBmi2b0<6a9$FcUjV($*@+)3|04&kVXM1JTMw93(Ellv~Fc@r7iqf1QntFf@jbw|EyQ+&Cpdola_q;Q8;1HV^vw-t9-X|<^$*>Q2HeD z3qIViP1456_^1+AC&Hl39M*Tryva6=6ETn|9)-(5D>ut#V~+llQyXU4>-3XrvJ02_ zNu8`%UMWMXd~e1|xtH;g)v9ua6XaT4Raux=DKo0-$+`DvGL!X&1uD|(H!SBKHuQ-# z0;rT*n9*}CgiPfh9mKnNlrY>l6j=h5>@sAQ6{YODAnSc*2+g8M46E+ak!MWdy+2+T zO`jlDbr4RKE?hJ)MbB-*F|t%BVVrO%K2~IHHdV8@76M|{3g1FC- z?Wyeqj>uqBXqF-Lc{I;)LNEi*C&@(}6fs59A~AH;f-!P|BN~{2vNFM2b4abk$YXlB zudUy>hA{)1A~B3#s}YPidVB$1M8Us~ntG4CluLMYQ>)Fi%p}g}=n30ZV`U!1SrSXoEx9?3k*0 z{+o8?+x%lFLy*GtX93zM$YcE303)m1^JC5Piq;;kc~1@(l8bT(qg|Xlemiut2b`{L18} zLU5owyCtkb@c9*rh6keEI6r8mr?&4}PfDtR38kLs$UE0tu*P{Gr8st%W4 zBQl@>zYR^Z1`D;pN|`%EuQ}h{wq9zGvWtlWX@$(wW(65@;Yz0L9> zsJMh{Mx)Bdx0tHUM9kxM$ylX>rmrt7)tuR?y%;c>-203E;o&pJDtE*jG;v6Dr)s?p zUy=xs2$Y892jByQH^a&n$Sjf9w~T*_-<@~`4}GDcrn`l)QHy7#OYQ-H+W%)C1*HK5 z_K=tYCdZ{83l66LoUSBLUjQ^{5acg}4LD=}UVy=*%l>cP6Z2MgsneFW*={qt`pFd7 zfRpC_d4WOOK~Gl_Q%;ohtI#k`8>+x${VzP{{{_+B*8VxSi@oc^9HX=5DsK#F3CN-C zd2xj6ndFQ5Y4LS?+bFIAw060{=S!#dOT2co{u2Urw_tSPkX`@60+u`>?(g^jocP6Y z_1aDFq&x~?H~Krr`0Xr`5ZvMRCXYf|j}CAMu{9(uQz}eU^DXtBP>$$OYKK?NBW_L$_Mu$H+vr+^19`t`QIk`W-J5Py61hEY!KPIRJ2boIyZn@n ztT*>^M}Is9u?=v{v4#>_2>|V!LraFb6vBDJZ1O9OkWOO(huco<$lvI?vH#&Ulb84B z@sur9H@+5Z($J!?m^<;H9DjJbyt*Mch0DRQ`4<5Ad5YKvwhO_9dYQlK8s%zWNGqH9 zyg%aOv51==>BeRw1cZcG!v0Wo<_Bm6G2;Sn&T-X!FJw1SV>ahoLB`j@hz%NcO0*6z z9Kq&|afi#LL(9PA=E7H?u;bbCLl%1dfn=dZuGCgQ1f@!z%$Lgf*l9qx7*xP&Hi&7n z@&ok~9_M@I-uiK_Vn z>!0pJ@)5k8J+X(C-1$4;@XS+LGc4HEmCb6SNbP;O?Fw)S!Qc(%^3>5U>zxE4M@d%c zHUx!$@uO~V`zw$ zu;o+QW}my=-e_Ba97vp(3J)z-Jw3-QH_pv?igwS%aw9Le7P;M7s^;#`fe}3Iov-w{ z$65615}&4ds{&#j@m#wugJHsx#n!H=&!(3~gBbJ9<9#izT7Za=vxgJ5)%>M!!1FzD zk-WlN2C|ewXFpzGHbg;FPQtq1`;@?2$ZhHix4& zKP+taB&~vODsx7FXN;dY6@riY;tq z%3oMEPV}*CSJx_idkFE%IkxhMrtvwZ$?Ut-b?q~~*QWs~K}fz@oS=2TIUpvcO?q5d zU3y&N*oVvd)MFE3du0BP^MT>_pm>5@)${VY>VI z=Ac%PVyl9T9Hn+Lo0oPwf|>D?}KryK`B+x}JZ1Q}I|N54AJ#R6Mm=fw?M>T&QSEwUd5ZS4u~)^ukKMXLx;8SiXxCJl>Q z3oX8hqZu{#eF?0wjDIpJDacD*sSRpsYOC=GkNqZma6fSCy54U8tD-5@CGP_vZe~q~ zskSX|&7vOTTLZhKlvLHZ48unVX)iRP$(pD|-lyZ-O>eiTZ`a{sfq|2P)n(SIIq>Go zojm|L!WV26@?ujA{hyr31;U;`?c;?afZgq2hsscfW{NtpMdaitq10$>$^(%UaD;b1 zB8nC%of^660hq}A>pqA z*IlW}1eRTIJOoDOek>@0Wa?VrZ9KI56bJV)ISo?yUFX5^-mRXiF&KoQ*iDfx^G|me zMK^xdRo$kzOYH)RW=rrc+^PRV0bTFf|1SZwk_c6rbAI=VGe%9~32p6HlXZe-<1G|# zqx^ZrPbatd3Dcw*t|xi%N4CYP9+Wc!roe%lj9!2Rzj@^k1 zW|pQ*|K(5F_nCGL36dux^XoqbEG_pEF%{?S3^R%#TD`oY%vo*~Imsu6gc%o$osvp` zqbsagN%}a+wHFs0&C~oYcFJ1Xb{JlH5c6V1vq-8+zkc2OK41?q%^@N2k_1TG6d@>W z%f%*a(Ik5Ft#WYG2`Hy~_e_7eOBjz0#9;i8)9~J)8NlyYP!@PyeULsg|P}05ET`wVkR<_{8{)K5gN?w+>rdOgjyscSyg~ zVc+TL8K%f$9obQH@Wo7nT|daVFb^?($>gS4c>UpzFyVlde4w0hgZr|_OWBqPC1s){ zyll29@zpG3emhP*ieTbGkOVOm@aZMi7)7@J{5Rm+u}+aV(-IIvYq1V!U}UnqBg4t|kF>PHb6yQ% zo4=e-oxjj&=xKTDB!~@cHo8$ura!CDLADShlz#;Mn4c{uNr{h7F1BXbIj9Ju1X-F! zyc;Eo*h~#!qaUv!7HWEobzSdP^g3Vq)CJOp`0R0q()|^^1t&Js{>e-Rxjoqob=ZT( z>LT^qg$M_+{V>YUQ;&4bikO1dz3jJ;T{`DxK_xUVVbo>Iop*$U^DJf7P{DE`43J+b zCgI)A610PWYQErtmaqP;x6AcI=|phBO=ji;A|Q@PUXR@xA1(~Tv#}w%w}80-7e(L1 zf+)Hr!wxy%SU4GsI7w;gBj;%`U>>G#JO!Yp-yr))m9!-^VO7klX8=h@hM zYCWpW)BVcQfTlWD$tW&sLko*?YaxJ>x6bzYAEzf5TSUhRjTj+)$#59Iy#r}khhH6t z2<~h~7f{hum#T$7@=aU5;-I=n0FTrahaM@Cg>JuKk-K{dq(etJd=!7gXbg}$qu8*YufXO6hm38dv%S81icLTCcLX!KI&rCe^jKYt z<#*T#z(uyHsC2t~X?E_n@Cn?Q(QeJkz#2+P_N*OQI18t?|Hsp1YJae-lwc`+Um8-XomW3&m^*@w2 z=Bl$5E-X&&tpTj15@)KN?@iieGw}=oAPmznRnpMU%qdFB#rZB)2NPjO>3HI%V#Kk; zUDaM@wri^RF@zr{JIGP9fElg_@O0;r9m$}dlA3}waq&iny58m*tc45B$1~6_&)ZWC zDL*og;Xw|Or}kdko3+3CIC9^cL*2xsih^mXXNpAn>q9(mSZ#M%$w6?!KWpE|yAS5& z(Y9k{R=f^Zm5msgi_H>8%EL+X(hiFCx}-@tM(kvA^^_B7JSBt`3tFKst1E|#f63kq z8*TQ>;S*%DMItXRHBU7HvgLAUyJpbHI%3K>;*3_ROcUORfb#=1<3d_Rk*#=Q?oM);y_1zN){Kt{Evl(-hyR&Rj7WxM2-|3y0 z*8xj#DPPZAr!uKfETCeHiW<7b@dANIe zJo1Hqw{$h6C;NJVR|8li)I~19&(WjBaNBpx!(USr(tST{Y{Wizxa#dZ#yzEoo0<~C zp{)n4XBu!Zr?%+~mXC?R2`5EsSW$0iP#?|h)cpBzWc*?*%Oc>I88Eg+m?tyLzBt++ zuiS8}|7bJk`?<=1bzQ2KojKA}_oBcZS8!+x_|9>{AvXs$iQ^jq zDz^)&fAS$mCZB{A8p;Xb0!yA>D!ZlLn}XX;>cxq`C8;lXRywU5MT2IN1BUdXM@2bx zA0B178h(^xZSmSnH)bd@O7?dcv?~FaYJHmeh5bOThDVn?=YA4o0r9DO$ZbXLy3FtwOI9Usv1*G}Uso56}cXZ5>?e#>DO2qWnTWM?_6uqI;9j4t5Eer?~ClX#L7RX2|a|xxV(ioA91&O1zFO3erc+|4R8VBIiD75HpQ9o zPMrHIOL0FqbI-P^6>*UtN;ICwGMWk|>tBEdHImRzK15L4{flWTDc!f6X<2$5xMW!Yh|K6(%Aad? zYUytU#Rv6{E}wSVaVlAi3@Z8-Q6_t!=ew>LzQ0KwbUxOOK3;|Njnx_mBO0X2wWJQ8 zHkTqHq1a-ut5lW!^p$gZk(h(_avpyE0*hSKgZ9tnkE30g5B|hii_iqV2n$eWP`O%@|7*c zR^Cf_k-XAhdxFC3jP4a^r^^NyvUul2suea;<&5m@?aM1$T57CguJ^9-!GH~9PnEvK z9S%GwGwF3hCwQv1vRgkCghHUn)}N6z_Gioehh^y2nJ;^$kR-dkB}N9Xf7XMU3yC2j z0c49uCTAM|8LNb^`j^?4)m1H19>3VRj6Yvw&J-j>4wHi8@WT(=DAV)!5A@!^^Kvc2 zHg+HYG9Npt&!oKSW>vGkMjhh|R9%~7XC~`Ye{b^`b#`3_yco0dg7{DYKylr7VDiFI ztqx||j|TXed8*o+9{hZ3A(Wz+5L07z3ccg4Enh3un<-mbWd)7EUW0k>r{PPmkF!*{N5~Z-pN;M49Y9t)?wK>ErZDQ z-cTm5Q1_YmOD$qJ;}0ei`{bV=>l`QWztn=PnF}qcCQ-oaoe{K1c&@)^aPXo>B`WFQ@mzqs#}D8NNE1$(Q0J-ZP$$<{jP5M&2Zms zi0!U2L(6j#{vu`YK6{bvW!1}87-}LU|6+)5{-6-0s(KcnagwNP`HHMfcHqGKlL=d= zTiaXkXfqb9&W5n-UF>%-K>*u(sh@l1`EiRDmW&N!+R5T~{76NST>wq>VsBrc^4oT5 zO-N{HlyZjt=a%{jMmUt^N{-)Cb@(WcMZdm+d00&u6ODQlIdXGa1`Ib}Gb=v(5*S36 z8S8R+dD=RA+fpHY$Sjo2WVaZr>jOF029HTGiDuJ$im5dthP3=ZfAeb>T(_upH1o-5 z__^d!Nn9D1CJI!K`>~k$izKYuVi(pzwM{?{*}1St?w3CYcBMqNj~|=>Q)%V#So=R& z>sv3vX3daI-!l6j^fYpQY+?e?%qeo=D`DRx>F(D$g;|`6m^FqGu$Jd>A#Ek@-}Eq#kE-?MQ+s9yBbIog``)yD39ltCLFXB8X@ocP2)h-e^H6kvK%D zWkDo5t6?3B8grXY=^t4psmxEWU)@10?znY5_AE(Z533_>_$WncRng@4O111X&<-{m zuBiQjZ<6SpS9Dx*Ug4!SKB>5N^%7OP7szD6N$e8hUo-#Y zFLYik$eCg)RVSjp2ysr;77H~Onk@Lj&R6aZtS2YTG3z5q_9(bz!XT)9>Y!j81MDJ` zeCez#g`_aI#IOi6gc@+U@k-+rb6N$J5$sVg#TmB8+(XXL*z{L^OFvOYKrZtqMF}z| zxEnlxy*n&!V}U9vTL7;F${)G42r7Wxx9zS>qd;_-f6!3a3VpXLd-Ivd0?lm>HF|e> ztmeiFRH&Wi=QSTOMRWh^dxz#)WO0%f@aa{u0?~zT2u

                  x|X9@fSu$b)le!rk_)jr-18j1H7y^N$Tr)D1Y?&5e{`V>L2pt zF^WbYbo#BB#Aag3EEa~8$%o}qXNyG0ulps9i7Bu1Gi7CxwP$6z)ADh5%uE$##<=xn zPcG|;TJB{KL%*Org%XRJ&YH6Wc=IqdYS+crX+GWVk^z4D+94bJS;wxcELwSiK!D{X z??EbAspyr|o@Lf^OxT12=m9P(jQug>DT2JinQ3?xbK?1(;!^6D>|&yc-}S>g`m(70 zje7B>_y}U!nhi9OgQIXQCc}(2 zau1ySOnMUA0Q0Q*+JO+fefp`a6>;@>~Wdb2z~!>FDj6>C6X$ zxv%EFvfUfrmkfd$liC)Cp?5|BMyKk%?$=qreFKclw{vg^Gu#hb+pF!M8vfPP z!65ej^jkG9eqO1rGei)O#}$&MH%>INCU>TZ%GcVkgZOKjJ!fzT0xAJ|f#$@FGMQ21 zsECkhd|-gk@d{lCKVl9)nZeOM9^KM|i6dp0wJsE*kAFU#R5_EPi5xJ&D){)5H^H;> zr6+r%$~^5YOwRW(=&YOS5a2dRxWt9!Nb=DmXNS05bmb4Z+OO65liuh)%I02P#51ku zkFgV^jGjVvX=Y_tW8mVNG{`+V@bPI`{2=zl3=gN154f}Bw>;|LcN2l2@m4|=ny9dr zW7iCimNUl>7}Hdl`ic(@y-kspGYB7IJ7>Q5yD;hyx|V>7e%=R5Y4-*^+Yfs32VRUHP$NG6qd^dXkbMZYc8DqynVCQqdz(-V}Y zi}(t>HsH}kDfQsZWE787p6cc=uUkb*NXCan)Qj*!Zw>$0z;IZ8rk4)Y_EFx)Kah&N zWpV%ehK9MfwW%Ik^iW1h)1R^}Pxg64+q?nGpT7n^W{a+gI1#Y=lj2%90gmN&X2Aq4 zo?cOiq#ge40e)v9`+G874zh`a`tY^)32-)VoPbRZ;%J-vD}x{38SHaY0kzCSd){89 zH73z$JsdC;#3BfGE@)S~bEniaJvVt6L(Gm}u|ESOz(U)|3q{xDU$pye*C>S{u z>@d!okR7atNl2b!PyodNhcNji{nx(%SHFC97j%?|GGcoKz`nq_6h#sChg_ms&0#9< zo3HnsnahM5pf~|TxIrHLnrax=zJ1O6{8#}D3+S!yPAs6%mjocvi7C*Y@I`+x9L%(farzvoE^%P4Ln4 zrzo6bWO(%GwGSEhQ9P-{<4(6(y~(1>Em0#;7`Snd8zA#I5#sFD2P=8p1c`6(vikuw zWx3e^5ltfIi($j*-(m-#Ysm<3&i$KlGYl~v7tDsM| zt+p4H@cN<*XR6`yNR*c6+x2{^Gb>2V#cJ7mTLhix6DBRUudBjheGFSS2C%rA$WtRUAx0HLRa%;(M*rQp!+zG)Xnf#)9*#U zKTnLbLd>>|?K`lw1P`~vtXxvdFqY$;mPViS__RRc0FYgCMU?lnF+!wD&dOViOU16tz6SmH(&nVoF9C~mZs+Q0kk}_V^zrb{@oM;t5Re5) zPPlX>Hgn7rbwE=(UG2E==+uimHp{*wdK+uO*&RX7gQVVkaO*-#o||4ws~(jm1Xh?u zG^WqHUk~%yPv3!ik)`D24oj&ss^qyY7Xw7Y+`+yU`Ip1i3aGjfoSTBlr(ze3x!VEG z!DcwW>YhN<%$j1p{b>`osqR&YIgNlwm=CzPSgbJDL=s}Z34^`3>{rWQImchnNgE_K zI@KSJ7MGR2Zbjqx>D20hjL>cwk*2Am#$b@&LMBA;?qF>B%IGX%lbAr#GWZI; zVD--w6fnZ^B$m}vCrXV-KBjuP6+J2OO=*Z-gP=3WF}H9?MtYNA*5cJ)w++kjxUq{t zjke6tG-?HoPWKO?A9EWdeArnqaklQz1GU2Lo4Cn;OJ(iXjL29K8|#92%t zTF3;BM=+v>NN+?kA*4>{x)Y?n9Z4}1j7~D0U8pyy*R2=wZcFc*uiMlCi`|+7&=Xkc z@K-f!*ky2N*<|ARgu%ohCPF3q60k;Ey;&rI4c3r$Xg20Ji6|(z82+$nJPDe0PV8!< zau5qz)dUi7Xlkx(&l(B!wrF-DO`WRl=N2_5HKV7rdd#ZlMy)M=)U13s%IqxRe4(n06k^gD6#zq&%3Q;q){t#Yax!RJD^EPB}oLvoHiR z=G(L&D;Yh18Dy2}Pc_Oupl;cwssNc9`X@R04Fl!kT(#qTWoFRd85^phdgUX5a&D<6 z?=qRqGH1!+Z}f`|LS}mOAbrIncu>(tLE#1+P?5zTAA|I27&iT?3}2`SgHO4#Ac(i( zGuyo5Nby=OnM%zl{k+dewK5B+Tgu}lKt{RHfpMI(vv@`tF+%lGQ?%~$iG9Uq$>Mf; zu%SnV%bjXPN#fiGv68h-GX`mlXhurzDKrywuu>;D)* z_aI)}zCUce0$MQH1)Kn0Q687)X|m1u;?E8^BbD|F=;}P=t$7_YVg|g*tcI~QZL?r; zRS6En@K_Ck=y#8#9jUvTS;bfX;-CIEeMjKEnjh|qpD{)CK|x<+#8~;}+3!}U<%7v5 zNv$f%wz76J_|zm`;2d@l>h6UfcRmb5YZd{POts*xBFbPs2GKvolrUgb;O#gRJSAcX zuJo9JZIKvQ!0Tm{!GK+pCjpCMsYnb#ok6rt4#iR>LZ6;E!jQ5!Ldd*}*PZI#oz}3DRwD1h1p`zYPI}*qDrTV5c`|}9 z{eDRx9Dwc=RQj}kfDvw0z>KxLgY-BQt>xk5Y}BF-Dwu&jGQk*yuTQyI9g$q#0&4y$ zk}n&R5Pmj)stO_uEGY|UHC*8lbd;3|1ynV%n(876@~_8e_idN zYRd|qC_s*xPmr}8mBNSEYWU%5!}>34Qnsb+!!i|8@v7sEx64J%&xOsIdCD?F&&s&R z0t1OHMCE~)H<1h`Nr@py!i3#LP#B=XwspAcPV_lNg1>)G7}6_!T2$<{Ae_N!)O+V8 zLu^DH8#l zbcZ2-3E!G-LwuF`Dw7XdsdNIEsaOKoez<5p2b?fD6;&sXlHtpO{W zIrk+l`GreWI!7p41#+P-8CwHf*>XEhoaimMGdIcBH20zlova>^sU_)xf-{y@4pFT0 zCeU}x5|*T>LPE0mJ zGq|^wBfTbkabm(IRxLS!Lm4;q4}`^K;JT8T*mbE(#0INCL0jO&>&l@`$yqslR7})P zKHN2^VPr5=(y@;IkNw51ja1p=^R9>@Ti`oGw9|Cf6hO!xe{*6ONTS`r&e z^C6B(%^tctaogV83vXxH?S~h5j-TxRX8+S+*kkN*8-`gQC9E(BXQhcg5|F$?va>_< zdkm*N#$JzL2BWJ2kJZ*=o^pCFiMyZveUw12js}`|i}>#E^5~q;y6M-i&0_?%b;byQ zZqUBdqbB(U>W?4u<%jMbjz^DM9e0=|;%*ecujpPWeX`X^+ev+1TYfzF2643k4Q9G` z?KeOplHnga#;jR!$;W}vwTcaJs~$mBf`BJ8Vp)Jf6ND(PPD%}C+M zc)za30q)tt*B=e)9e_Auqi>(oTD{*u0R~ROcx%dMshtYLI+ZJ|t&M=$Af}fBgz3lj zO0LdmQvuEfnsR`iC~`$ulD-xbc79)HIVivx`(mdVWIZnTk@nb~;P1X;9*2nn9@vrl|!g{@l zR_g89^6ff2PGL?6eAtA#&ij<7fA;+70vMeCtC5d@d`!n3m-gF6U%lT--|(~yOVU`Y z@A`8qHda*KB~SFjGsOPef@111>WK!kRVdaTp5ef;tb1Eii~dGKdg_EbIw_LGdtZ_B zfVfHdi-^_Ym_=2LRP_Y%zssRO2$a{NK*wcWoL1+ftwLyQqYJ}`cc|HJUoQXN>3X_G z60FTBXU(R(X!XbUS!Tccq8nIHGoCc7?=LWbNIwXDSW9-6RNg0W7CZZrNg{< z7M~ie&O=;?YB!?t7{{k;6~07gJ4^NC04-K(qAaP!H%r|o?KRS@MM(*waQE3?aRUg$RrrPOBFqO~zpS0Om}Z#88#-BBl5SpJO|(UP4&PR($wx8_)q9 zGJUW^GN>JaQ_0*{nij=ybii&$NeL(lNDEaIf>c3jC`#lrfI(0+5PIkxLWezg?R~bd|L8x-S>EJe=9zidTKB3k z66D+pX;9b?t>NS|t;Yo!cTbWa8V;WRHTNK`N+fB9@06XuT*p`V$fdy(&UtlqKiJVs zABzVx1a0mw{)K+kY@q!;kw_GT@G7kq*Om{22LM+#)>ca^ZXS?R*JBe z;=sl@My=@k`bOGtbEd_kLe&AIs_|SW4=JT9ozOrelnE)tfBGcG%v;Yh!QnOc=e>Co zg5+J@oq6{`?J|G1!sU0tyr6Z0dVBF)cwF=Hg=K7KCo_=DJGLyayH75P7P@U3X*d8~ zA#odOSzv|{@Z32TSP6uCZJO47=tC*LZ6ZD*Z>jFOj7yKYYS&{p&r)OVeK2oE>%}JX z3B{ygPmF9ZfYt*lU3SRSm0rJ!2;YXoqf)wgV(`|mfVt|4ON|?l@Yjyj#DBmEBt4H; zVSJhB^ zCn8!vlS9RAYq&?sST4j=e;s+M8cb-4w6cmhcjG&5oT4C`F zLd&FTHwOwOKk)X_{CqOu5*9KR}W(!X3IYXGj__WdrezBT;>26iswRLKA-{_%fs zkZLc+OqBy=D{DBu@Vx}TK-%L}w3$R$69U!Djs(htV>@idD80fQ!68I8`e1E-vh(0j zbv7xltm%oP$=1@{Gazrii#_26d}9ZZcou_GVX@?6V&=1A1l2QDfFPx@!6XJU^>?1! zku5Xz|7Ujci-`)5*Xm}=SUPj|DCY(W&OcOyMuRa5_zV45f_1Au&vtf2bY%*YKEf1Y zXlUp%N|xEyWET`n0i!!V?;&OtmHjF3Dv$)~RX5ZBM0667p59GLh`K@1;@gk!lWc@h z>KBbvl3EWucpK8jCr27Rk2WLqX7KQ^VJk4W2xO(_D?)A^o#M0W z_n;m??JDYW<=bu=X@mn=<3k_zHVP)lg$Bz9EGvy-j>#;HwByDn-l}RjY`F|i$Lc24 zoz}A8COGD3f(9I-k)U_rz3s2Ei3qAMq;X#@$(-Dmu5_kXo+1zTmR3d$Uf*p9#PfYY zycCklQRXT;5mN6Pa~g|PWT^Bbe=))2>3oz5^E%|{3+iMPDr zdRA7Vn!R8zP)yhx!Xr*|)uGgZmxY(lf-)a?O+{J}S5T`NZx?;3M-h8~x|C%f7KFE6 zK^Mz}gbaeC1wF)nnP$Ebr@!!xq%^cB6hi}ivKuK=jV@8bEEH_~Eir)@#mPUo zqX~=cB3BsC0|r;DFON-0I_<*?Km)xIyztE3HAhuo|IX~T`_4TO2dGkQusbriu)PjT zRu2bs?UAagDkX@C|2v@JGh5Tq^F!p&3G75yc0s3=!&(>OXC~=B(~IBK8f0R#STg3x zjPF}F?%9tL^B?AlHx<~L2k>847f6EB$Zr(XK?8!Xj%*C)hmCo=+^N*sVDSf4CTdT9 z$pV~yf7WcsYoBE#=2!D>=T9=xhZ>St05n?3xvQ|{ep9yb!A4!VmcfONj~3ChxS0WG^O{_x;@?3bk&;F`#3BwiBT)`kmkf4`fod=QY{09~$9F)WV}FgR%zi zHT|Z(U^zgyNMy!&V7bPXIRAtO7k3nH4Xly9Lnc?|=c>~lWI61jlP1klPxW3C0Vwq9 zIq6s1Mv57UA8-DC7V>`Gz;f{g*FbDX2k`|)3%ml%5wR|GKbRIcpa;dPX$3UCKwH}lb(O57nOKla@gMGgNhgG;ZlLv(+c z@c~Kr`5^L|Zb-;WcTWT0PAQCEh~*bkXJi#%?PkN|bQ3&YeUG|us=TuRO)~0s-kC2v zwgR8=jvbJ`h0`w-JAgk^X8nyi`)6HeuO(j6I#48m+kYSp)ah`j&w~;d8E|4T$;iO? z)kEWyqE3UV*DG0t8k0{4fvv}Ar~tTfY5V;YWaq&D6Pa?}TMGo^|2!jvN7JxUft3_Q=q%9ncI0Mn;pM0U)SP9e<4h5McRcnB0JBXOWP>@+7ao@$KfdE6o(u zBBS8Apl78k7rwyp06ONXu-h}PzNX2a<4#B}e@GhMrUkW2F^L>5Bl+Q8zX#vIszZjv zk7|wNmj4-qfK*l?%o&%ksC{?1b%zev3ArW9W)-c`F}I}0XMg)`^PkmlCQXq_ex(9x z3nTE?5i!E_vb3MJ#9UuyI0d=5xgY(m89ObMz{&cBd#)MCO1g^3@;ttgDgYZzuL$hX?i3ME2x^Z2jMu9Jn7Z&~*bokQt;G)U+k(p8Ny6=x=0KhH^ie0Z41!(>B@ zD(uoI7Q>2clHBKfEYuLL(d>ngHB>8o$91)KF0P0+#2=B(w=3rLAz?*+tGRU$)C~7s zv0(e@c=z*aq15&6GOWv%>m8I%$i6R2jm>u+F2H(wC|-`>Jtg$<%3_lvtm_{G$;&cb zvBt24n1cNF#KwMvrCCbt;gSSKhyF}p;||R}n@w{16-U|47q>EHD5>LS+E>{Id7~|{ zq*xqw%|2IdW&*zJa7(VR5S^;>Jh>KYUx>E|-4PoJy7lZb;+gH-N0oX@cUxHPcaE!q zZ8U1nGVCU&dkYYkmM6!(Ek3FkYkt9)7P>w?+dcXw7P{X6`#D&#>ynIsOaV!)<@l#b z>9&QnfEGr(93L?|yHfqcz}T05Q`~9Vu2wkHo?5=}FEL1h(uU+MLAQ|XxFsp{c$y=pLLzoQ-8y1rKlF{tFUxjlJygZI&FZ8#KJ(e_J^#N;lj z?GNO7Wxwd5QweoKJ105u+bx0e9j>KvsB721-LhoaHa91uQgYbxR%?>iE4dte+TEf2 zP^5*c=WT3ll6UDLU2G%7n{&#cbeUkkY}6L+gPve^sGN~pmP|AtY@z$`HLeFD8I&B7# z<06G^b%sTV@fu%a=>1;d2Q7q%rkbgW@FZSdnzAQ4nYspZ1_d}8n@pJfQCgcNUSyY7 zIl3MvFjH39Y3NJQ6E?wqM#kx6UdvbT;9I_m`BI(Zha#``mqW??%mO-80y>RF=vgba z8-le0I`RTKiFB+5y`Dbw`bX7YHV{o)f_52RT+Pa4Mt%~V-4yXhvuo~|&$i!^c^3cG zH<}tja8>Q_v>-inegKmA;n8JZBTjf;DeB<>%WVsdHj z+@^$v)B5el=y`wZer@DyKkN_TfP^JPZWBfB4mEU^0`Y`9l7ACABIsc&qxH+_@sn`J zY!ff(Qd#=h;cj6B&Dy1yQ8=X;Gi@wh!RREnaZlqR?sei5`q z;?r2Z_U?#=(omFnSnVkGHJWe9#Y5A1zeqb%KWhA0Et=0~`Zttb7iW&bqiq>PoY;@W zA2k$xVw-j&f7qYNvy}`dTyi4?b#7E`JWbg2J2zi4LNbDIxsAQtt~oB`tZ%qj6Dp#& z%6_e~!J6OdYfTIbH-(EnI)Bte(KzB7t3gnu`w6bX?S%bWZmpLI#7C^E>RdcOc?ZjD z(m}=#^OKZo_H1xZriw+5-}vu;M;Oy$oB!=U2b8z$rd@Fab74Rf;u($PJ(N{V)Nf zL`)|)BTjj1$Iq;an0I^7G{H6?l&YK&NDIaVarVsD!;z6#jLNo-urF-N1uj3{p z35uT>MF|Z1Ug;UCi0?Ntvz3zYs+>B3xP_h$*(lLyb{z(h|JuhPYLEH~y#u69a&ZcD Q#!?vS-M;Zb$1d`J0D;`mm;e9( literal 0 HcmV?d00001 diff --git a/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area004-v001-MC/word/media/image4.png b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area004-v001-MC/word/media/image4.png new file mode 100644 index 0000000000000000000000000000000000000000..e2cdf4eaf49a121e17477d6536977d7b9f111317 GIT binary patch literal 60771 zcmcG$by!sI+dYbcgp`0VGzua}N;gO=NOwy&(mf#3jgktI(%s!1(p^J03_bLmJ$^s$ zd*1h4-|KhI_m4ANxUbo>oxS(-?B~AMz1F%3Rg{;;eoFcj2?+`N!+Qy3B&5ejNJz+7 z=%~ORtSxF7uz6wpURe$a$@4W5(w6`vq#Iz@mmMS|m$yhrd!LYy_>+*3K=vsON`k-# zDCVMaqDV;PQQo&ovB3LBPRi0^NF~GMyTBV%BUxz)Bsk(Hy*U^0F^2tnEhi)-oG!%g zqj*LfGT?MbA0$Lo-RBRM(7ffgsZfvUyyz-mFVu~ovtCeb=HhYE>hOe2F1UqKK^&2u z%%PmE5tLBk;8_KY_~l(1Ob!~~mx&$e-jX&_yy$cUhB(O|*`}T?Lp)gDN&M%p^Pn;M zjmw{RU>Z+C9L8E2K`h`q&bh~Zp0tCX;xaZQW1+eMJ3aR;PoF)*172)(1c(iuzrg?8{O`R= zY?=4m2PRUe$NN;Z$J;jo$1vZgUS2el`IeFG$byPJORB;>w-(Q~n9uznf9Q#cEi&X} z%|DWBU~kbnZ{B3}`m@ftX5mBE$p0**5LBy$2Rv}#c9G~P?G3vx0@Sd8)vDT?Z~%&7z7(i}M?m^P}CU9_+)-`;{1!^Xr|mySd?Mq(Way245co zEu!B=g9APDNY*}sx@jpXQQacfMrSp*=r~cqm6dFyQ?)8LtdSXMseMjfxpD=5s24WZ zI4^-AFtYarqhgB$shEqgnVZ?VdnOGc-7Xa9Xf~bm6Ac%J7Yk6P!&hjMgqpdD{**@V z*pBGazfLvurR3+ayl~AJqc~gYO52xP2;=} zoVKfDye-gde++~6ei{nk;PqwuNYMseicYwXpwRlTEV6S?Tr2?fgLWU$Z<>9@H)}|` zljKTieioFbzNlCWzVs#*KGML^ueO;SJin;kXtlH?*_kwEHCk6@v$kTct0NvHNTeME zmzy@W+9+g$YnwHXBS8ZR+_A91M2_`F{}ABSet*H|@*2gOXE_iWNNMlN{(W#U4ryO) z0ri_wza!^EB}T5P1>EG_^$=Y>sqsD4AEo98A}070ZW>M@Jt%yX*=A`qy5!fQ{jLme zW?YN`ovekAep?o=_wBt}itr+aTA^maEu=c1Yd}pedcs_Mvj+XrHE0jd^#uC0d*<2m z=dAvX=<7yWM#|bz!VDT!iXyCqF3CsjGptW%Se=7I%cB~guOkmOTMC8co>g&jDK-}n zTB%m9HGTyyJ`bJYlIy7P5+z+yMcTz;L&2kuDcKlk+NLh~5amT>&yv)USESXncRXS#vekjWJyQH35i$c_ z&E+`w_$r%{DGd#CB40wHJ_O}|xO~TIwa^<`^0fuIsr)WDXmoP2uhy5qSg(uzaO3rs z<@j|_7$G3}ClM)#!7cLrq3yN5G*XQo z5J+dH!y^AYDh+GcjZ^O&JOY0+KEW|LsH`$E1?nN{Dy-phJ;I1_xkC&h5TSlIPxNCG zZF%nST!l2fP z)|0PM^6ePfx(9RVsX{l{p3}ZYMx;Rz{5Y7HLe4hZ-}lcR`>&ZYgC}}$-hb#<42DgZ zcW%T*u^PQ=Jq6-G=Z-_JNt&3lazn~bWnE|4e~vP-|{VdMFpy0Ws;#B5kt-WQf-`zvZ3|Dv2VRF11Q6zK>dh znKrUo-9WD|zk?4UbNWY(k^2m@n)`#_d>t|lnzUT5_7HR9>2LAe(Mu(MA+DdGhu+ZL z`P+gPULQ^Bt9~tYCgyX;B2d=&nvtp=g`CH#g<*Kqhi`P)9v5j;Y}#;6ZaxU6Ev9En z-W(5WM&f>8o#fp4+*$m>=+` zc}RXk4nI5#1(x7WYj(f*-{jS`@^?W<{LMKM|F!uK_wosOk_T^WoQv6>IeZetCzx=z zN1P=L{cx>D91RD}XxGsI2%=vC11T9iwLg7=JLc*1UdEr(-F#4dT%uu{EN1z6YF=Px ze2frSCVQs4yCj+?3vxwE?jT&Mo{si*beH%CRNUitZ+HkeEy|I})VZXKNv8vA42t<5 z0%;*r((6H&-ie6hNBF4Qs_VX&&}U}}`i#HEsoSr0emyZea&^rnpwvv)-4txMaDl`K zZ_=|k#HMt>GF<&ImjLEHM)%R&3O_L}=)1r1^kkM0{LmFWfbkTOKbtAS{)F7d_PvUL zpJD-%9W~9IGC9bop6Az>XL50G0Iv(A@D=*v=f{21Y(T`E%r~$ptdZ8XeM6wBz0==o zVQu|se0xfO$BRiW#%8@#%Bkxe5+fp-#W+!#o+1ke=LPJ;-0r>+wct_v8nzPp0|NA~O(4ZPGG} zey(h0A!m#IuRA-hOueW&ppLk+bEJLTi@Fg?BZJ%vK9YhTI=bF$+n+e{YFFF$?5q-I zWIVd4Vb%AfXyM6Hl%0zjk=F35uP7GNbf+d_ZVvK-rFBgAJcG7wM_H*ARZuKMV0{X8 z{Jx@8gYuKhVWlw$@gRvP+DI)%lVg5w=d-rZPzszR0YW0p4DxNF^!BCQ)lMwUZ2fJ9 zuG^+I3L-O$OfM$*%_(ABE_qVL?BnB)kJe4e*ENtDE5aQIT3^fT_@IM@n3I0&wasdx z*$wd1q0wBs;~h!P4TLB#v?*y#S9BVnW60eJ)QL#IgwY%{FpicQ69P&Np7%tEFwe|s z?=u<-AV)<>RR|dy+makDR68gKUoKwC67yZYDk{bvEtdT-bUTc;&$ARe2xahVlDyT+ zQ=Y?Dp;PZw*?g6y1HE_DQ*~zF<5~(zN_u{Ns6wQ!?x|UEAQj~!1@^&Ta1-)2-IPLv z8`Ux+jx|bRa$Gv;b-|h3Y}1v-ZjEwZb1&6Wt2c>~y{`-(G7H)BFfaD!S4Rwz`_lxf z-2&s!s2nBufrw6>g+EpuOQxF=G1ioy)v#0`^8yFw!#l{bX=>okOG1;`Ru9If7jb3Q zW;vKtn_cg?8bow4&N*Js^kMCDqp~|=X6nhwVK+_GzmjPng*O{G*bkexsy;)<6ZWpC`J@H9Rip|R zj?ksH9}2L|Hq_8!VO3p4{R>aQ-9ARRJR^*c+rAkslc3GZZL9RgxTttaxg|p%sScSL zIK39fs2mzQh>LTsOXO@11`l*(&7-=<@kqy_UJ`Rud}s3S|5K#}I#~}R%TxLzgL)Pa zpz5)fek9H4CGzGC$@M{EiQ{;T>dHfSTd9#*0iA*jiV`Kwz?X+U<>1e@+0nCg&o{fM zNx2HNH|K`oTe>~hn1*#;%^>l=;MU)3^;u;@i1v|=%rjPp@#~LlA*cQ#O||KY#i;keA6u3(XRP<{u8_Qq455v z@NH(wk&*_in;}`EUT&J;=ZSG)-%nTy-IMvby^S=ws4V&?_@G`p{Rw=2ep2sVM9{gH z4wH*)ME{Z5(&z^7tb@N$Z@xR9Q^Xic=>TKvmYD}p`)Pl9CV&w|ok@9W&(qAGj^1u@`NW!}fg>jv&3UFdhkOoz=2OB9|B z+Qe_q^8|OF0r|Mx@JwjvemJ-7lHbif9yEn27^cEXaIt3;b?I8HR|cTRB7e}@n#yK( zC4&&;O{kg(kEFL)K@;W5H9IMgh^RfmVN-%fBCNI{4za`Oj)#$D)!Z?ns=6lpo+h;Q zKG(R|W7*q2HtHQ#2NNcBiR|4Qp;MSP8Yt5~{!Q_|kI2Zt0RgX9fY7?p0APvLTdI=I z>N`?REs~YHau)W*Mh#6m)&%B5J5=O*5G%*Evpeni&C0VPri+dD^>s0>kl`9){yh|O z+0q1#`H(p)nZ{(Jtx4@CHFWaqM@!M7@%+gfLtJZLCzWaCOoY6$P+cpc`6FvOI&>8h zHX?|XMeSO{uAGeq=MyZZ?Lfj5Zcia2g}rXrz;ulHrk7b$p)1&yKyFW^W(lwxTuxMu0ukcAx@VmYhzes+AJq0hMrAY=*X45Dg{cUbjIF zu4r6o2%dvi49>14tmc12rGxnr$?vQqY1CM-eZEKV?hvwy+Q+ z8YwN+SAV`gfJnDMRZwhhlnGRfhaN8w??c*~=`nE?x&}l(5B{(uovz&u%=jC*UQAmw znQ>3w09lx*R{_;{KME~R)tW}Vw6POe9C5_;TF9;S^zU!YP5E~~)iz00#yf%%3Ux+~&u8|L$kndX=F?AWcb(xQ_vltf_t_7>zP( zzY%SNr?96dC;e+K-*oW?Iikq@iy@g(G(eT+li$zk_xCN^ho`@w1tQJ^+$FU*vaS51 z4~PR<1G$a@nO5PSdwdDj9D5FTOoN(*$w_}m-*qUEO|b}XH` zw6=DG?&WnCM=4WXnh+=~&8J?;q8)q+XIV)msjhqigM*z&2IGXchKv09t8JeV{s^ch zgBtblB$n-t5S8A8+@U@ZSlz}_suDvJ&r^5_BTAr0(yg$;wPg4d%ki~nJI0mm6f?@= zUL;VtI(7+dS+Wm(ym;zek{u{4e4v6lKTqmQReE+>m-n^NLZN78YHUp)5}2(#3sg63 zEGqEh3A&lKzL$iPvfUxKz_=+vKq@p3_oK84QRaV%@5 z@%NM6vM`Iqw`bwu61#mc*^>3kC1P5^y$k?vb6S0(OFKI@WXc(7c}2xzsjGI4oek8z z;_od4i;A(1<;{6q%0#kIz+;I)K|yzy$~5A(AAhJKAJNK{!P;m77)G?3FLC74uqBuH zx#@L!usF7LyH1dQDQ5jt+mZ*0?QfR|80XX7o4dCExpbwk{Ka)0Yp+Hu&G=XP4_a59 zYPxmgevYOe+00B#U78!|%e5+oKpNiEpX^G4StxYJnkj|dmPvOa9p+sQ()mh%w&^T&nF zCMNeZNz;YcAp5|V#7%`TJ%JJq2 zZOlSeX6_UIi`n43ogw?h@>^kAlpMpIcettrpE6K{d};fv20oSK=04%kF!oS6<$WCg zVrN(Bv3T5DMzL)#D$4KK0_=5ZxShfNQGEmC6AjE5gn)$2xt@Yq!&)5g`j_Eo};!jZCA zc1^^p0;&az1yfuW-KWwJVN<1?Dv~YMhJ>uN?t##uBEH19^|hGo6A;~Fuvg-@44r4T zuHetDSTF;y5`|AKHJkk`Tm5iP4-yGU%1O!+?X%&iCnKmF zUY^Wa)YM%JkKAF)NY|Cb&87N(@Ykg@5@7o?)$v)|bP8xRv|Py1l-;YN28SEyH9JmM zpGIsB!&t4g9}1~(4y@3~tna;R+neLw$fw|Z6A32>X6;e`)+=^QZ}2!OTZ4wLo=uza z-a9wtZGO~`S=ctXnB02mp{qN0rBvto!lYX;)N}nxcGdkT1 zIye(}^-Aqb$UWx_{*5JeK}@&LAXo)i zS>N`J?I58+=Joh{x2cp{=r|u@vc|s>i;ffo{7A)$H+l{p=-S&E1+&V;bNXp8lSNP} zkx*_9IUa7$h}f+b?rtlU*kJJCQ;?I>?H{UDRi$3g$WwOhRL


                  PAJBm$PJM#y(y2 zRT4Y3X>^HKOr1+BHTX?l&8p|1SJO-PI=dfJh*6^=CPPnBi+%JU`PO&Ol#&P_y|G+|C-hOO)%dbPYWhZo)xFt0Tw-4jQmD(qouIbMfZ}d z_GWu2`qT?S_-1MlFCN-VWYFxVB2RKnk8r4c)p8!HT%q5amF(jgWp$73iO&CO=r82( zAjS)DP~p?R9y*X)VH*t*Oj-&lf>=~ekELNQs)@A#*Lo~_C@YnKx<6f`F8_GApCAHM z+&taqxNKyV8J@bdSnh0iPaaJG3YC)D1S_ZK76#&_slJ1VF7uviczKA$fbiUBKDRJh z_i-rjI=^+$V zz1Xo&;8~g+ugWK{wT`ii> z6yg-9)x=#qtnmse458D^Tf>GawTvH5f;T5ee$|em0p#$hkG3`{_q|Y{i6Q>XBNHKg zEj6_o9o=IFAGd;71_#lyq^M{}Zkob&=DZcH%Uw)z|jwrKp{X5zG_$p#O zbido%hZTjE(!-K66(d^0SzqCIbP#M>oDW{U4B@xOb54V^XQE_7pP7*~o5 zVXqcPopevI-1bw?Z2pCE|KK$p|k&Z$n3g1B2uBzx_)>GO}lth$NeqTt{{BaL!kB zrxFOw>Qy*UKwa^v{eeJZ+}WBKK+3DS6pho;PgQMdjbF4%zxe6|Gve4_T~|f z`H;D?(;#16MC)8R-BVoMiUc+{daL9qsU7QaYIgIK3X2KcH)YP17!H98T zt7{eZ52EVK=g3InsN@zD8Z!NI4?t)pfLFuZp6Z^az#a8H#v4l2Ckx-2k#<(a&+!H0 z0cAs5e&;VhcZfU=k+{;0Y}+8&9;^3f4_?O1*JOoiJ1NcYl9iN#W`|_VsPkve8?mn)<^GD zV6@9y5cU$rqJlA^m1=YEncm!JpF*mtu$=eGLFEqlNnF)Ly1EgYp@ZKyTV^Yk3~F-6 zTNd=0u6i&{Wt01FHwS;5EQ$WD)E;h9_zAuOTX*sd4gP|n2m zhFO{_o>4n5Epe(r4z{un3fu=ZbarVwd%yJv$Esn4{E9TRv-fzaDr>~`UlR2FggKzGxbiFct zQtN*4fo@Cw&BkK zM89VWlrVdk#+Ykr3#0-tls*ZEukOtCS*>%tB9d;OW!Xw z^|cgs;g@g53Tr_9cyUH_@2-cs|I%O3sVYA^+wa2vO6R}40M`(AQR&!|2M`ks&+Akw z6kfi0qbD!-hNXe_p9yA-$J=D}s;TZQ8>3s%y;PW;Bkmg~;o(skx+)0r9@@Z|`u6Rc z-_MKMws{#U1!I*@g@SglX>NOPdrV523uE#d(R-A|fzoe>!P2k#$BvhD<_oqRKoZ4G z1^W6Q;j1HIFxY(C8IRzS6^F+vC@*p{JbnrrKG1KPe;CjH; zZ|{OD^0N*w2A*V=t#Sg4kDcsPXbM8=$GZi$OT*BI;GCS{yJYY`&!ga%*T8C&IERdH zyhH$7U_ud#1F$q8EDZm>`Oo&U+VuDD9s@+sN=$%Jxk!c~Mo6UWn@R4@4uTU-?m#FJ z@Wq+%n9Jm*6KWe6U^cjENe*XQK3t7T_(N{6bItQvIt$PN%4)d3WHsZt+Spu39l(Z{ zaLW%sB3H{H0rBw&jk}EwSx~9DfEEF8^aScxvsz3si(6NXlI5J2yru0Fxc9$||xarFwnf3{x+~3Hn@645FjR^)bb6T%`2~X@ScZ1Wo*el4% z_2Sc}Q=Q@jWMmMbUclY~;jhmA4S8@BYR8{$lnHYKv0PV{Jne44IfAwhlsGS$1Ru$f z34EFyeL6Zl-BrE+tVOO2-i~5df9zr&H*v8mS_#s)V!iJ2Wi9 zgb|jBuI4J6H4vKF%%608WbU9@KF$IpmB6y2??8q4*6ulgrFA1nJnx(3i{< z10NLLwET5O=*Jpqtg}3>NKP)l@qxEX$A2LY8xbjvD4|#yZG;=@w%|W9Hl`pklaq5^ z*|Nf-*?c$xKO*Kmpa*O$-B)aCWdPsyF~w27#%T(M(c|l(9A1F`g(m(9~ zl0o9`uKK{0o}C@)3Ox{&LVX5G%uIQvt9m2y)k-EEM2C4Fmv(O_*?%cv0Ek?w(^~y+ zp>7;9eD&^3ogNe10!s5sA8Yb69#ugT=C&ThqgVCEH?%B9I&?AS88RVVU8dp^-X=0pGsiwA^GiEFPKJy1f*Bsa6BYxYhSyAFEZ+ieuDy4Ds>hk`~F7 zFrP1ywODLRg;FA(_?bM-h`NzfH?5$pLE+WWv9UHl2kPIfh4!qBe(ODM9n)a}4I5zf z1~J3foUG(%%aYU8<*d&S^|qifz9@i1FLuk#a{5qPx!3nX*xbzQO=NTPOCVEY0mReU zFUv}nOj$G@ERvm<(D3niK-lZSZl%}M+U+-8_TtZ@YBg;X8P-D=_n>_~lHx=%(Ne@B zJr_7kq5Ca0_2t5II^r}edU(+v_QLo!s^WkfUS2*@kh`GS#}YrkdycfUxVYCa4b9pU zO2L7|wyu%FzFR;?GrG@d+UU_!1Q+A0%CUF-OVB^6AeX?AG^K_va|iRSNlu zKZy79d~4p$s07=u-bB84r^4<4DB`@t-F?e`JewCBb=GFrA3KLsLHYS4r{-)O`dL3+ zY96?_xK;{n&c@b7XIu8Ql2LEwL!uS@LPJ@ov%WtSBwBkVl^yVd5}-dPd)JS@y^AZU zV_8^_{XXsheNaL0XTt4Dw$Wj{ySzT^#JO<*CT0`u9RFpD_KVK@!#Ynqn+fs0_{Vm~3 zL3XxiZXq^PqYK^JJMT41K~E;BT`ii0#9Ks)MW72zH@sZ+CtniR&4c(AAY zvC%MOKt6pYUtSWOUPB~}v3->yt3}B#CF)a8p-pb@^wW3M7KlPWSYGXJlkN4Q2!_SF zEY|NXE)xRms`7|Gi&SRqp?8eAFHj=g-O6cw&vIO`e~~IdB*?H_5=lVBQqQve4b(Lm z2k@vS{Sg*t!_DTlVG8&Xc_m7Jp8g>fSZnqPHg(s)G3&*z0vsj{0-3TdfEg#Gz<7WInH7LsVDvzVqFd=3OC| zr6Sx?vD^YDC!<-K7fvcRdNWV&Q7PIZ05BDd+zn1g~S35P7rTdrJmmczmt{iImHTgF1v4Lz>gB9(z&vN z`UBa3D}+upE@n`(yJPX&&gpQ#j9BRC`GCd(k^mXTf~DpyADqG;9~BrF5%+#V_Mgietse( zTQ;hQP&T)lF{G(*U+4K||+n^Ga;UAEl&F$q%qGy^GL0f#kmO$vmkzM~D>= zT;0i^({(nYcd?46kcU_jQ&3L}^sG(17hH{ABB+4*&_62bH92|2#@(q=st4k1nRoVG_gsJ_iD)=Kd?21_;~u~S zO66NpL+~EVY4sbyzb=_L#;CehGkKgK^rxX35Rjps_pXwSE(0#kKUY8qOi^bCRS5zR zE*mr-;SAIzpUOrf&QEW^6z}mT=VO7NJ{5UDaxbZ-&OVJ6#xdYwN&LSBGznr7E932) zX~5ecA!fuNJ^wF3ubIBGdNnW)F>vQ=VXBdhb?+zOhD?tsy9vYnZvol{u=@dOn5uJy z4NMJxfyoCK0F_sNy^svlPd&Q8vuN+g)l0a)LW;!!1&k1SVeh+IHd{A^^ZWO2aSa7b z4f)nHDe^YJ;&*Zn#7^Ir+*b>QHR|Gm!e(>sW8N zw|PpB1g?l7L#@=l(;88R`QKk#j7{PJ>!igV`~JHr&+*i`lf4U9`%3h{dfVzd03C$_ zs^l41AE3{)UFMl<2LT%axd_Q)0LQy~#wm*Ac-*!gFY)N-sg8Yx3L@qO&RwTd_c(Vn zFM|tk4t6G;*S)7VZ$r*-(-)!9;68=*EWgT{REV zdMke+3aq3Q?DbWA4Ud#Gy8CROhV2bDh(+?#0Vwxma6o6auHlKZ^HX^!M@vgc^TI-g znM>giBoDtuGK4jRm+h)df#gE>e9))fk0GA9@`+pda!*eTl>hJ53D;rz**kscEE7#d z$B}PazK^bW0t37_-3f;e?-fSc8kb}<0C;4g)zec9`<9dx1gHvtILNHc>GA~{Nq+}e z_}q@V)8*wDy@eZ|B1{&)s~V*+Zm7{q0M`>x`w(+gWs+CJ?M~EEgs5^-P>79(`ecA2 z^y8%fz@t@JZ$`xXF89P2;#okZX%}3VnkXUxgXud!7+sY8k?9L@Jnc|oYha!ibbF~= z!{@4M$_LIu-=z@|2)%|(N&<>s-U43MA1Yr>d9cC3_DCzF>rxNb@U!_BOM_|Enc7~u z-$rBO`;N}@<6^j-@rO!J%ubph8jzm$&S*oE-~IqA>vVs<1|+nr<%o_^ztq!~(9jZ3 z=O!0Sx(MR6P*i5uPs<&QNyl1h^>?dTnoQb`6p5w6qEj+N0}cgDwQ}bmqEvccku?+v zL197a4|d^Y@KIx};pgds@ay}r$;o%06r1i~?|y5QFpCyJ4?WHK>tWY zy!o)TxS_ae9Tz~wo5TsRY0Bstr9w(I%wl{PZx!YF?K+?d=(jZk%mGkMV8T4Do5x9E zy?ze#yO%aqu01n}8}EzIFOYBIJ2yx`We$U2t!YEE0%T-l=DK>)&ZdA8tV7$zqaY1i zYk*4mIj%0a4DZvaApl&a`S8XsW`}?k6QkJBFqHkA$FfodwHJ^K#k-#pSxmcvGL6~y ztF~E=MFE+jV{8l^C>9KZ9KV*Wmj*lj+9}Myw>vz<9&6OFd`0i4?fv-0yiGw>Mse|* zg`yS9s2mw8HU$;Hq*YhM16|@UPa;|DsK7v>w zogm}FbS(n3Dqr(x!BD)QNa0X`u-B^UKnY?6FBAtN8W?86?u#6}ZJ7jWr zy3-bEJ4r8tD(5&Yt1;~WX>qS>Z&W1;oXpZ_%3E8_786~r^0@v=C?uxYxt{gzKF#dX zZ3WNsobQYEjMGu{@t<0a4LYWto(9KDa?DK=iK;9sjXRt!s7w;yHak#wQy>grGf{S@ zv6xfPPQVL?Md_f6aalVm%GW+VL1+lqYtaEh+)nZ3Q>jJkwLS+SlCG{kSgNh=VQ!ATP&{om$K_`0532blp^CJV7l*(2Jnv6pvWWSrsD<5G&wMTl)Ze=4 zz7elX&&>^`@e)W6&@y{ZbjZul?iGeF6?o%fiy-pIPkosD8_MiVIb6Wiv)m5*v%^my zK2REIs0h5OLU*R5x)Q4*Qw}hkeM~(r`XdME`bu_66Smg2NP0_mBVg1^*5G;o3a2gU zemrjf(s{Z~kSq4ADCNt+(zJSz-PmP&ryl?SA2qnJ@C}L{OZKEE)Oy3^Tp!OP@EiJHSvT=LDqAq zV|bB-htz(8{GQVMR}<`x*FEzg1E%v*K-E}fxfvkh`)4jE53B%`_<*)&G1+#M9sPY) zgzd(6?Ne`x^s$i{iM&4D6NR+b#y16kD08v70&hsTS;n~U9j^0Ui?sglot;l1 zR%%Rarae!z%rc+08a1>pIv=fsK@)Yw?caapSGAkB<| zB<<*~Ij8b|4q^=~90Yec5SsF?8R^E0FZ)$+H@}Ui&tMec>x)F+2MC8Zw{GIi#f)+5 zkeYZ7$TwiBBs|=+At?-IdEODPy=et}(9F)3}Lia(IZkytspA@xzSXqZM5emFF_yTxn(O zH>@SCNJ@RY)zwhImB7;kGmBabZvfj)q-~A>rj(7`XLPu3$_f+o9VfF&YKpCMuJxsB zvIz$VSmmF+7R2tCe9uMs_(~h|7D|=p9w*OK4b}MkIBnb;cVgvcq+>a8$fwsDf6kaN zxgvm&8tHLK|2OjbR-Hw`aI| zx-|WxPa&ZA|A*HO*XVyYXLZ3)$X5-4i^!~1GW2~Ei+-r$uDMIt|LHGf3G`r1)*0$? z+9@UidRQQ=JeJqmQW_sucCD$%V+uIAK{E8gQYxy&WTQ4)LDr7QpZ~MOu4W zizHG(^XSp<14gFMKc+fR{t~DY6Q`*>{Ncp99;Sdo`J`ua4*olTyWF)?Z%zY1Vs*YE zsK&2T+ONY6_mF&`K2-$K4(=7d*(o$Nuob2GcTuLuIvcxbg73=oyZq3v>Cat4z=7oDxFNVX$!|t!2 zn-puRel!`hq>w-;5TOj~sB|Qs7$ zx^})Q4^Xx+)JIhZn=pf5baU9duguMB?qak-1(07(_0+Dfg10{oq;4FXvLk!k()5FNRCX) zJrzHGNJX~XREA!6yFSJ)_CYzos9sd0ueg)*5xx3s6xZ@W9L*(fBzmNpZf`qu;fGU( zFZ5R28LF&IF`owcD+72sJ-@|s!wb?&i8#}xBK?U@BTkX@V+*Sm@O+`;{LvR-v4YUa z2}EZPeqQksqW_LnCWIl?^DO~EFX1`#U?@SE>eApt1SdAd16k8O&$$6iAp-nyM?Hh~PI7=YJQgO3 zGhTWLZL9ea%qs8z~x;c`GQH1ZNbqY)BeuHz9nln6YBM#0I;bU z`UyXOmbARBd7)ojT<)asrD*-Hrh*EiKKvzbSN3*BytQ3=@d>BscT!HJ_gqSUId_hYIe1qlgBo|Z2r;M4%5 zn#m<|k!L_y{nuKx6+iGN721mLNauXqCBBnmLz=UTJt^HpCkG1mHoMQGDdrnK z?RKE@y1m2#D8Rt-a&Bjrsxlw7Gn+%VgBI2Wu+oI@NNwVQHGCM5iEVW?+IzGOqVB>m zO}GCPbZUqIb2COJkrlI$T(Fq)G4-t!MrT&|;&9kIN+4SfR~T7lBpNpp#}k3F_Vz3W zFr_hdoIi#MTJ{yf??T3Ia?AU#^(}Np&m{k}cwjW^vUV{K;8yvT>yQ&O6C8RdeFWuTP*j=ukD;n2tEVguDnDyZyjSsGrfM6*tsJ+ zkWBJs$NmGUEz>AqLKI)AJpS9GyPIC-yZQ$lp!n-pUPgDZ(l$Ou!i{s_iH|-3Z0R1D z;1xHHr>Lmf78Bzn1ifl1z7xm)xkaN_?*CVd#>q28Hl|Xbj!nTzQ4WS54TwKM3bjD!U8?~Y_`C$t=~hK zhA#LtVz3haL1o1FFsQMjG>nkR9`1wH^O4v84AeRK=x+JmVs2#iTl~ho|8n$L!x`n3 z{y~(o-D`ToobY}F)y_Fg!z;^fY?lS|k>J&JpUoAuL8<1C1_rVZ$q5O5@-sIyJY0m#Xt_3*k>7?in_g93HLSd>k!+dmk_bBrMOQ{WrbItnjp#HIii-^5beW2Wt?(xcriyULVyBucsUE&{dIx zRn?aV3${(G?Iwh-ZX{Q40*`>wPYE{9s0{qAfq(s7fF+>KVG&k@jPpM{Ba-40s$I?1 zTu0`^K^eA;=6t7aGOdXg1P?e5VG###8v9Ewe#1G3cTx4>1zp<^ zpaqjVLw{&Bps18w~E3S^Y^WS=Rtd@=kWZImrN(veIXM7bEO0fC3%5 zny4tzBWzQX$dAk;b94HGg^?K`b*IF#YZi8Ct7{T@&^IFAAKfHS<sBd$C2vBL_5D=8G$n=ZRn9;- zuZv5i?-emcES5^_fuH_l4bU(D1dQfx40La0du*EMDS%t` ztU-5Gd44x7^jWw66Qz7lBj1{Kb9TlzK#`E>#>(~gmVZP0DjZXsAYSqIu%l43wj!_y zlaOXBExLrs+AM9RAu#q-T3-WW&~!si*Wxv$h?xW}?NIW7QmZysk!c7K(7?U2VWGQH zW1~HRz%oVvlX2a9Jyid;UU%pV&`&{2G7mV-yVssvlsUN}0ljMR&wP}=6I38$b zjXNsY!H(lB%dyQ~2`puB{_3JtC+5e7tD$oV;RJ!}bpB@)av(6|%$Gr-Laob%jg-}0 zuO47|4;BetK!63K>J8{Ye0U1@hL#z)@L+{adarx4g^J=*z5Q-spXHYQmr@Zzk3i-G zTHBrw5!BR8jzP7LaWPbcYR49u(|AH0973D8Ze~a)%_OwQ{V)+-l~Omyw_OvtZ|X9N z3iYShM_ha41^t1x!#b~Gpox*t8tUxWIrNz&6S6{cb#jY(I>DqwT?3v$-UQ=EhNfw> z=NS^dbv*cRFgvL&B(#x9RXX^ISw18!H#_^=;Y8tGNVpK$WMyJnQ1MN6{(%7&Is#h} z5qSb~5ADqM6V&cO?VFrP3ZOIV5yh_|*zy1HF)^uM8UsG2)5o4CmIlho{D6xii`?HC z>%btD^%+8l<5`%pR@l%T21?8RZwx2Bpc&T8D( z0E}6gGsSSc?n;OqX-*MxbBi}&wcaUg>L@7h-9$wgpJFb+76107)M3}FedfSvQro z16xv_4q>}iz!gA_65k2sR^$nQoZimB2Aa^%vsyOGj)Sd<*)E?0&L3t4tghbeOe{KX zZbET1kB!D=BbHqteP!A*(s{7`yyDdZOyyQk$>M{&5e1{Jn5T{+K<~k(_ek+ifr0HX zR@WcAB@91n7qSJ9o)dv}qFIp`YPu#1bY`mK{B(8SvB-Ne|6hc?byQSs+c$iPg3_V_ z(o&+Nh;&Jp(%pziw=@g_0xFGCB01y`LwBdNba!_R%`o3NUibYx-}kL|t#|%#xn@B3 z?7h$PIF4U!w&c;+kh2p6-0I!Z`shk~PL06Nt+U2%!KB$0Hr`sE%Kl24X<03zH@NJJEu`0%HJ7SQR(fuHeGrCdH-PV^vK^$rPSU~oMRl<5gH)6 zf(vYVU~;k^cZs;x`n(Is(;^4EdK=%=@#{HC8UjR6z?Bt0SLnSxBZvx{j00T1OEo+_ zF1Jk4Fy8aX!F=^jDoIUUElq`d5y^aqg=H=rQg{B_8`a+%^;)k|%QeU zGka0;&wS5ckgVp}eTo?>oM10T(p802ue9S4zq3*R93mM>8&95p?UR<)!aiHHrTk5j z$1OFc(FH-jZ`_AJ2W+h*iB;t3KDc^nNE-LEy=uI7hzjxL3S4gV5dk(ksz3uKPL1lf z2|^}#K!|Q&Ll7NLEUka8^G9YqooDoqvYxPB=)IAIQkfN`5GNhG-4cIw-^=ebj)MlW z+Wyy%uP>aaM+H=_ZnDNplv0F^s@at58?p{@F^t{0yW*SJqurBj?e?BAw^4gDw&JFX_Dh$jlg(0<*yHq4;&%`9Jdg zC`I&m4lwOI-aN4AUt-dXdU%1ez8sZ*9e~477fO zXcf38QM8SED%y>k$-lJz)t@)lfBE_9r0zPM;gIn!yN>?#KVQ{o`8)*f0H4NE^IrfC z@bOmHTIQS(n;7rLzNo(-S~F6#4Cs6O{g*i3e_|rU8nh-!iDWi+W`47j_^q9n2}J=~ zoT#5a`;7oc4;padCBo7i+Z3T<0R+PR{Hq}*D!BNu$l4v|@ww0P-{9py&jiY4i@_~zz?q!Y}Z~L+d#cXPu#CLS{uPIZy?#3k+TnG z&u`(gDYnx!VQ2TrVtPrj0n{W&EUBmWuz|D|y#cwu_+ogAQ%`L-NDqio!^#_ZJI786 z1`9$c)_NO{;4ipc=4|X9Z(98X8^?y+){sSfnFmKQol9qlD~dwhc=x zEDo+9B5_^=)o1y?4(s+k=FZv}OitnE<@@Vm$4@aGju2EMg^S@htH)dG!V*_L-=(Ra z84P_Dd_<(eegxpt`C;}{+O%RN+e=jiCjNYWIVT&&@l#72oN$fjx4(YPof+QDe4@lS zSArCn+fv(#a`dq2J=wGjjtF`;rY~A%wV3O_6)s$v^N&vG^;Qwi%)D=9K2K7#uGm5< zPGtLj2s=o7nzhiLznwJY)#^6>mQvVt+Ct=()?S)RXV^29ULu0iO*bTzl z7SgUp_;|IfNk_$b>s8r)ydV9)}lGSeta~x4SJrd{Z7E|pUMusdu*f+l<8-zeZl}@d^Vp$tM zyHMOdJR4eLZZd3m`HzpMupx7IdM0V{>soE2x<}Yc(> zN{M76HcH=OVyWVu7uje3YRf7ZAN9&DU{UE6yE0T!&s&P#-8_R>->tZs8yRbt);qO2 z7prxEpF#&a&!HpqR_Sv3fSyv6GvwE zI7DQxdf|q@C@HtvzLzUoP>Qc`NE5}Nm1xT4Fxj2+6ZLgETJ9x3V zWfDx)EoFANY-&ql&eSZQOr1O{+bX*CumKjeS6py>m45tedpT5Yd3X;;mO1RsI-Q7! z)M(ok)ovE%1ka^-6>C7@SUpNF^I(_PvXO1aGMM*rUwxl~m-Qc9XSI(OdfG;M4JhMZ zkOtL-qLP;qS7V0HjMxi;>QhWDf56J#;2uCnT@$(2^IdOPyQtw{Fs{m0vKx&ZW`E}- zD6pd_1XgCaz*|kzqc&Yw$F}2V8HR-dH@C$TErq5w2Cqi4%gtNB;Qe-17p_f9BQ9ZD z>~JXMa(Hd_A;7#rxIc+7IGDtt@%V#fxrm_K-88eSlk@q=Z|6J9-*j%~21F_KD(9Ot zP+BIowprw`S^S7#5be}253y~4*I%aoIX*nNt=lxOPgA9kw&sW{B{}e|zCKW3ueJ4| zI*y!l#+Z(b)#56j+?zLIuU|7PEqzxhZJw8&hpY7%XyC|tD#XYaN-t*w>CKGx8}v=* zce3;ebKy?~j>MX)-)|&$CmiII%bB++A3U(qFu;#RHTS8?+*PohOt}s>ZpQFX7n2+c zTA?g;=)&BYol6!31?2WwC^5@gs#U<}I|uL+RzJ-oo>V(qw;#-lIYIV={(~1G>^ahg zY(I%xy!OvGIDQHoqxj%ADEZk-Zn6F3_E9O%EyVD>8sgi|yFRm17n}>bLtB;EW#X;9 z)et_%B3yYArNoHJxTJ1=?i~+WRa{7CxG0SJCqpC6jhxizAN4zi5gid+ip%G@f;s9U z96=CeF(b97erE_B$bqOE>BW&QRAxM#`JVek9p?I|?M_9(kkwJ0&@N(H!fN31gslLF z>tuUHYg%$g)Lo%=B3Z4nhGL{Af;OP1b!h0(cL-muUA;nI{T&XtD@PEE7IcJ<(>z%e zrs+D0!=go_L-UYr3mf}wUfPvcpTNE-K~joOC9dDB`~_Rk!jd}jy>F&;4 zae#nYMv~0V4qN$h(;f5hk6sz$Oq)^CL2|U(Zr&8pi}Ol3fl7^hpV!{vZbhsjaxh#Z z-(hVV=i<;X5xDr-CYw8di*?SO$#ixp7YnnpyL6@n6`#GDr?cLW%57v6L*LSdaRrr@ zvL`cOCv|vuceU6?>YolJfy3YXN443bCB&yCTKvCwrZA8CliXMOtX&$TbclL?EeAgz z9(EELx5ZKSv-TuqZvE%jm!80iRL>cJ^>~dOLJ>NR=Xr~j;!A&u+I1g|`Hu~zXsOJ5 zWCHuxl@L2SS(siy>ncms#&9h|T^UC62$?x`!ob8~=fN@jW=ddvz`;xQJ{^B~^bo!4 zPTkk>`BM#UvsTgE&%#%Bxl@N_w#HEQ>yn!X#*#AG!~!4r%S2J01XNx&if%ss{-!U? zrsPfxttK=7&^P<)isWO8i@#HEex0oVx79US-(s_ziQE_2Ep%= zr}OYvai$ekW~8B)TVI%2zX-Z5YqU$b@(JoJ&Rl%K>r|-uwNgwGEsw!3Lx4J>!GpvN z#66+wE^u;zzibcT&q-DC7CwCTL9qai;RzgSJW(ij8G zF-MC>qtEnfU6n=^73Mp({HY(^hKsxEu=j-0Y;9TpVIW1Mo?bQI?#`Lo9)mwp-5+NE zy|<-VIb&_A+`H?ToWHxds)+KtI5$z>%dr$ zfV1sY`#YtP#EMrp&~koUW%@Pw@TRKnkagA7@Q)gc@yo#zkE(+oOcDILm58DFvAB~V zeh3|&Ohn*PNBbO%$LPp9!qTsoqcN#9o&yHk_kL9+BuxO%Cw#`>o4jGUHCFxX-MjCc z7QYSaxGXAR-6jV6zxo@j?(6xLV18{X0?@-e^Pkm&T_Ed7CU!Oc8hT`hf$3$y>KFJ@CM z;+>1zo2h}vS*OTDy@z#&;jFE6F*x)+2Ny-%7IPWKu|2581*a){H!Dng7H2La~X0kcZIT$TG1FTsFueud*GM(~C zm?LFUrk>)H3EV+L*h45Rn?`S*^cA=8+QHCe52T!>``4acUZAaA)wIWl^m9beg{Aw_xELU$-E z^HH*k$YX6y;;GDO8G~e0`>-%#`EJ8^aTUtVg(G$ahGXLM4_lTa|EZi$%se4gl2eG%wNt6hO5Ac~J2HG1WKb#G+qTgC zl)rrF3nFoFl=@PlR=BvIMhP$~a zHeOjWh}ktLj(K^5#h;9g-38-}x4RT{#oX-dvRzD<+9_Y~2!_o*IQkQFl8C{%1@yt} zaMp2q+yS!HPI z%=OO91wGK)Di-EC#<7#Fnwgpgz06GFEHWain;wu6g=}R^F&k+(iDZ(<4_T~m&J9(T z(B_s?=O7F1zH2x*6t(?I*;?)yV1}M0HpCw-KR=<`bP=~x!mT!|ca>78LmfiguUN$( zycDAkLxq~&Bi1!a_3f}#MK5yFc^XH5Z`)+zU=6ul#&Q>^RD_mp4V6e;;WLLxc_u|- zl?3&$9vdO7P0Kb*uzl{HziUR4b8Hex8%77wg^8@XMTfxhsAz=Kndh!7IKG{;j@d_m zBAF{R_lu!&_AcRM@Sra3T2iGvv|LP?-R&94_0Z$``KfTaIRY5r^|%pRp%T%PbQ!tn z`yNf-e^EH$$~k)dGIU4hBSsBRhC<87bD~;<->n?bDw+AY_(W5z z;-gWV8bg?DP2i84w6mmP^yf!L?c8g5Z@= zw^tZ)?mIoPtx`#*OXmHuA@%;Ij_sheI)TiC?;!TqL4NX`XSZq#;%2|w$`;&TOlr30 zqBygkoYc)3A7(xl`{ zy(RVc$E&#<=5J}14-YT*ynQ{uB8qY-+pob^8I*%jj4!RmrlY1s9`j^i@B-C5lF9F? z|B8c-?xk{8*+cf^y=Hu1(^U!$Q$ve?Ks)}BXs~r@DcW)QLoZjNk*o!4p?-+Cjm=A5 zfY;o11Gj6(9J2CHS)XVA`IS>mYh1w#YW7?Ccqs?SuQFMq`MaL__@S3tJzVY^hTJ|L zKHQ7iHS_!*`5yI6V%6$QU`L*|8bV!vmFSS}$lDN3| zx528U+JO61NeFnXd0P>)gHxF#KaDw9N9(zTSF0>%2VLuT!-6#6TmI4~xH)Gf$-_Xj zfO6-hoSnwD)g$hps8@IbFC})Pq)T6qnBA=)ra#Yo)~*8*Xn0SO^r zi<-x(@aSD!d5^6{YK?Sr+sE(7H|nS3=O?D#^9aqNqWb=s#{8G28@9fI&B0AmNsj9C z6mnkcLQyMCw`N$mmg9o*J@OHjR5l6B_=E)G8yeF4WC@>&mxrxR!Hy0cGRYVx=QNwL zj89B}>AHJ);o_0$6O3a(%jZRMN_CFRKTX+nbv*~{)MHOqHdv7TBt!zqA$BuH#j9NZ zjpgSn=BA`DkSN(k?ndWHEBjj5#xw6z&V7d+kNa zxJ#wh^Ue3Y1tZz1Bu~4*f`UNiAH7NI5!H#WdIQuQGTV|G)K?YNG zWBH9)9ktau^iqj_p)Bf83W|ULT84<42tF5)@=+gm3we-C0s^#q?wWQ|Y53LQ%v2h5 zeronQXlA-{ymF=73+i-cqNlrzSp6901-;@(&lXF5*t948+@LSOS$I zIR3!fmY&(+chSN~`Uk3@qM^s;=e0WJYkA8O<5v=E=`RQhY-V0@bkeQw1%}$83Jtw# zN)1U)4^k|}E>dsIM$FBbSTq7STz9d>CzANyTs4GW>Q`3O;{0ShAM^1&E%UUP%#ZZ+ zJ(&{L_=oJEB7!GB6=&%R!5p>ct@n!UbChXBhM?il=Y~-nfowuIspcy&WI^ON?UL*0 zhB5Rs(VNnvCO|Y8LRl5D^dU2wA;wS8Oj=dev%dN^C`lS(`cw@=ncQ@y@^s!9T{Qr(k`!0%DhAt-%ct&Bbo648pNq41KcSY0-BZr1^&NZH6%9| z`>9fX%wAR5KeKm@ymjS7SwIDthE~0vX|{s+^n{%Uo0w&# z=VJmT6`Mv}TZ{I#+udjGF9iI4tmshNcz^a2w{%v(( zSY^=*werOXi9JefodmPIC|l2rF~gb+)*Z{vV=RCpc7WX?-TbwxN{Q8P-JI0jhi|Xu zdFWia%nRzzK`HCrorw511|L)n^b5VAgBK#&{khXj=6bNlJ#WqB|7rnn`=%W{0x<%4fB)FVC^Vj@;N_O%Du6A0S&hh2QINxQf{oGo$K+#Y z$|;$LI{THbIcL!WH5=n))J%rML721OxPQha=HZi|VtEXc!})wFXl`^}$eNou4-jP% z0W}xp7o?qDG`oEc9-W~%u;ibz95kD}qPsd;k^{$(x)cgOP((!|E(zztkar~jOvbI; z(W!%3)W{|jvB@=%Q#f^F=uB)+F!A-!)Y^DzrRK}Mh|URYnZcq}@}2p?TcA*Az;T(B z0!>!5f(O%VO^_1G4HtWSioft$PZ9^o`hD9rTDLftUc#Nsj+c&BW$~yW$|rI8xJ|d& zWpXaOuf?W@i7PMWUiT1CEV`AkeDj>nE1Z&sXp#koe|~p5Q+jFH109&()59spOD=gv z=tVRXA_cbT`@~6~9ie%xJw1xV`X71^Tf0ZKMi3vTK2Cmq{?Iz@y`#)Y^~dKj)KnbL zH@Q-fYXF_%bnsm}rKt;K^fmOKkFq;p{V`@5fY?#a3rh5y_%hPr`||n|&eZ&_8*1}w z;BJwPn3{TS?E~kvi)EWDFRP5ZocVXB&!J*A){#iDMc(eM)si1xyXg*R&XIpxHl zp)i#SFUo~QH(fo`jL+ejBwNVA?-UuMR(6z90)$*ljFZ_R&R9RFy`4$)WdzRZ(Uz~d z#pbtvPWVo^WNNl*Q@(rf0`zojwrHD=OYNb0?utJw#=u>@u5KlkAa80@3f(S&UMuAx zNcM#>J>2qlm3UBfnL^k(+Vre$sy_ZOh?7^UQcwX-lA9g57dslymK(lHh%Xr@c4CAR zL||27;!e=_L+WxvzPsfONIFSEkTWdH?;Ky zvT)|*2Ekh_ENb3-Ijkb*?lkQB-$qb&Q~6xXMbs0Gz4XIBWa5;PwQ)&EbY%VvO_Ul^ z5h8X`#y5_RU60QfsR1?@=vq)egq-b5eH@zdkur>e>b|l4&@+VWAm~Hu|IF0YN)~=3SzZ^L^5p{qA0Z3wa!Q zu>DX|QdFa@deSwxS$DW6_pVmtmt_&Uw%t!Sp2rQNr;-d^isi2;3@0dI*Tsd-+3QnCowZ) zvvb}xW&O<#Mc&$qJ_m-+g{32$Z^~qwt~10+KhB@q*En2PHvUcO zLB&1?oj3aR|E(EqP5%<7=;`GD_33|xrT^cjoc|3r+2aVX9*0K8$Nz*5*FosXv9X`e zRG~`{Sn;B>M)N_YOm?C#y|=>?H%``0nSQR-gpD7peKOeck(Xy)Lpk0$JnR4uy-~%< z>JtbEVjE9)ug=^;5kU#*4?N4rjjG3tsvh4@fNtw%cUk=sa1Qno0>?J!+{Y*`%xub(JY1)e(teu@%UtIGD7YRdi z7Vf#}9)gqYwN8ToaYK z!+ghqEbbn?7J6UZCk+b`xaS`};+NSkXNu5VGu@F14}^W1Q4Yxp96<@!JPK53C{riP zErx3{Zh!IsNU5$^vz(}phg^5xiY3!wv)AguWgg>56?2UKg1&;l4i-+13sbs9IZ_b0!Nk(Avf5*w~bAJVNP*uNtP(8CDPuC|Qs=KE^yQO3EBXFVWKYd`Hx%qp|J;nAo94+~NVtGY8DP7o_C-2GlgU;m}Q#Jk0zkq@oYWat0((@=2I zHq6>6&&;3H7t#d25{Mc94nmI9kd2~yeCX2aDZ<(LcT3ygZz4Z4-!W9D3yKi>%r++;s$t3%a=h^4nQ)O0k{c8C1zHeps(x~KQFtX zY%Ry@>X-j0Xx%YB_*0*wKZsfH`Di`puNm?Ur^XuD_J}jfoJZ*^o&rzITjrjyhS}+l zbHDNb2A1Q^IENg3xdZq;+_&V!$|=XS)5a}Y+ztS-*b8EExc%>beKyn7JcofPbhNO~ zt%YbkrNQ&lqOE0u-2c0u*HgwX->@pkWj)nCS1_%cv%edQav>uj$pYDP%|n=PNB*8O zbiX1Q;CbOV2?s{ohHR0zXKPJi;{V>_&h)tk=1qSGj0j>0r-$#^pYf4!7R&Jq^eyNW zgNOZiZuR)A>OOk#K=oXP0euB-#jhS9$h-1PkW-Q4%jfUU#Xvl6s=AyEbn#}rbr3q> z3IMyuy}i^Ngx4#%f*Z(F0>q|}Ak?~gOFkeX}SN9La zJe9N45{c1nc4;JRK15#K?|2T`oCEFiI%kS8F^Q@W0;Ry>SR@R})S{ebV~B@L6~ZC; z4egMcQ)ole*n(bnJ&twL^s>_dP=KP}KEF!GMWcrR)f+V*@UH+W7K!>e6XYCg;8d6< z)bCVp_CO+70`Sz0Q#>#G()P7J#l$>+igZvt(L6?usKHX)vD@JKVg8v?x@5axK*+Ua zC_f~GM|}N?EiS%1a;6FQDypxrQJOY1>*1q+#wUGcIOU{(Ge|f*khAITF|~;FGdr19 z$+9=I{1$R6O1qL%nZiC~kRAr}e~eyD!eaWrrb!R_XWc_ldt$q1hy?RLyX6JHvoSw` zp2B1!`>t~R9PqKozm6zuFLF8|zRvNH`TV&p_qFEAFowCavzq%#rJtLLAn`N%3Cb_z zqce!+ELw9W1?1HtJz=h~c2=WBmsG()Bo7j(Oe`ke;p15Ooo)=|H8nSjXO1y2Wy5BU zo)(NRUI#iLHVsr0vu{JrHxcy5WTKl@ID5mm8!ilQv%TWdwTsUEFYC7JEu9hGkjxrQ2R+PgIVjfDe!jf?`Dww}Vu_~g{RjDOyY={SWlirr) zJo?B2^xn47B@|cR-J3M{+UU5>rPE~uwis?A!JIRo+6pC70%F>r7wE`P6&3g5O4a88)ZrUv*{CFTQI~DSxDF0tT?{h@bz1C6dv->o0pFK(` zVB}jQZ*iBPVrF4kf@YVN8h{13fKI^`687jUanHyVH7W1 zkjz7)#ERs4opKaC_fQ9aT&5z<&Sz-eFi^Sn!_;Z?DVBiw_1?Sv8@+ot8wGoIzg;6K zFZdgi+d-)sb(^En#xiZpcWr!a5w ze9jrxv0}AV&P)VA-LbvSa&bxDNj(-3M}D+(`oy$KB%EM!-Y|$Et|3P=J~GuHJ5hC~PXI!%Sw1w0ojjan|L*>IB6Q!H@o={4XN33u zMA!7x$7QZx;m`ogISBNTp|987ihSFG{c1*GFnYm);|7h?HBxrVF2X4cC~WmSR+~;= zcAcKSWJXLR(7$YPM}pQz8S}5}uG@n{Lv&A3ag5JxQHa3v7&TQk+sl3a5ppm*W z+yE~icX5Tdwq?#t_0OY;KvI_0RcC^#?<>{WuZVN9m zn8q*_QPkIo5@9wUnK=#}h+F|LdhM>(>1!;D0BYo9C~9U4+&-YuVO+lqh&VHysq8%H z04HYEJf_&w19!BjR5pR}_x=YcW-2y}mt-^HDa%_5(zY*3EV)>)enrhM-xPuIh?u9q zDomA;lGE0Ss%)6gi->bYGbcaGOziPzdC9(p!XXs$@!S!qtRF$Ps=E*x-fEgfXeJsBE4ky8f@V9PpKv5#}(47 zv+oYa3Esi=wGC}R`e?LHf9i?SZBCEhTKxNP6emMPx8K75ogmK%x?)&Z4Fshn8B+g9 zgsHB|WvOnn-^xWmZ}>7u6M#w$wodFp7JYrV&1(t*0mFoN`1KTr*h(Mq;W_s?M}M>= zBfHo*9g3>EOl;<44i>K6l#a0eKg^ZWIMdTQIpeJi#+4@}Ug?(drb_#G5EcVwPtnDX zrAPL${Ix4~eswS3SzaK<{su!)zgT_xufzRcMDo9En<0S`W9O_}r4a3R!s)bMQz@s; z^ytR$_E|RPpn(@b4k`K)60P<(`P|hWRaA=L_|LHV_wE1tAHuhv@(a~VpBYIi1qd-2 zGx4IEqxw*%%Uf?Al>HB?58mT+7!bqX9+z(QEU$KXE_1#&7YzP;2Z?_VhLUimJkBvi@%THF-|&}<_51)yH^>pw&Ae=yhoe#8HKI*8kLZKmBdqHa9re|&B_DWzZS zL`Y3tk)zW`j8-xNO!ABiN20?XM=!{ckBHE z%hBpglKE?LzkOz&4P>VizAx^~L)31YdH>P?4OgN4Tx7*#aEIv zjlmX!Y8SC#JU8DL@2dZ~v1=T%6lJyvHpBgyEoz}qlj)gnF(|N#BodBYzSGLMep0e0yPzzInP;( z^CDW}7eH5Wa#KsAxHOzb%$0;XP2yE4sR|IW7=ONyhPinnROB&@k1R@Ecno&)3`13g z`5eeCALW#U@7enszD)1{)aMzaGwY41;x8f=zV5T=aew3Duw}eT0U)iv*;@~3X&u3A zdrKx*CSckh(}sxh-7iu0>V5hS%8p)sbH}NDc9I*_$Bowz_SVh2^WRkXPd1|#kg?5( zOf27>&!$^G7CAgKcbJo&mXiAvyI(LuF<$G2*Cy(o0lc|74n5?6HI3Y{VRPUW5?MZU zB>_3Ps$qO=Y+?2w=I$vNj`&jJW==tOlCC6b)O(RD^5*T^mr0HFNsM&mn;A?;hIDoH z`G^#~N<_ote)GB6n*xY&Lu&A1G<2L*uNyYD^>BfvYAuAyPP3K|ahUC** zSnlY+!|z_6`o2I_RlNs-JHn&2a`DF`vX*#WG2yBGZH~bI2RT%Iz_xDrAl6=svD9Rl~OuNk5AatBA zZ(n=nc-ZPpOBdAYEe1L`muqsPhLl~0s(#K~{l%K-(Uo9u%6jDYqC~l|yKJGJ4)*WX zy|z3<&7;+F&-ZmB@(QNv3b<;c4zIGMB%i{>C8UoBLPy5Hg!8*B%~rE9?w5}_Q{G34 zrL_;Hol0YdY9Fu0A5;H*6zR*Cz6qL|7;A_c>5-_0q0E%yY$=R2Cj6h7R~^2?z
                  6=xg{_^nrfoKcMUX4OT^;XUYG9uK!bSe04IjFtiG#Xc-x~_2whKDN4#(
                  z*o3o7e0=l3-@g4Q0v!gApn2hINGc>mcMJ4{EkE(c?^DHmNtdGhlP@QR@XdR*v&(8&
                  zC93|$=E1i(y>CU^J_{R>6_9lfY2zV6rsDnA_ulkDSzKHI_EJ^5Ma2im~i1VfsOBc0{8t`~2{FfLwB6=|{w
                  z8J&yH3@)31hZ#{}HR_S{ka7o9S7W>G5wyga5T?)QE`Sj9O%enLpav?XH55U0M(9o7YNkxbT)EK|!g_K1p#K-X
                  z%sRo`##HV-$S+4MuTxB@JR>O@_Se(|AV+xn(rTP?=}(pqC?^uf!>;p#dhndqX@j>4
                  zs#+iVPC5Y-ytrZf)oqS7%+qD4V|R`sABU_&pAPH_SvMcajUbvjKFNp2IwQH8K{3{a
                  z3k#yO79*+u0JuA9uG~d9SJjYN>m%nBmW0S`1jI+dw3k%lq*eZr^XoHqsi@Ai
                  z<`kFN4(oH|rppa_c3nV3wxQzHi)X<_^C`QCcA>7c781&{=KEO_M
                  z@q2!8WK&SP^0~4tAq52&H99t1QfbgRVYxvQS9*TKK%8b_OH2BS)si8ta`{i{g;f;*
                  zh`?y>u>9ebuFFi$0AWfN<_19Hu}DcN>W0$qi(Jk_Mr?|31_!?ahxTL5Yag;<^AweN
                  z{08DMFrS*txOJBQ!y_sm;~>7RNI~Q-tQ$tdvxLSNKc4~9$Z;0tAee@kjkWx)8uXaY
                  zN5B5@KZi3>5Bnw`meL3`))1eb#xl2?jm?w-jJ=MW2{Y)jZ>)(ir5xvv8ouiEeh`!K
                  zyq}(X=>W93ETA5oNK
                  zbQeukSLFh+JgB{Y#Pw)$>*Jo>fEgKjac+s3>^jQ>6|b(t`e{03z99&@P~6xjFSODC_5yWi|e>bLvEEu+)0+W2eFsY9dR@i5_#WD}+}fCui67
                  zajRW$duz|IVILFdPywBJ`H?6gB1sI+^Y!cVNkfj-3thbg+LtepEplo86$h;EL(o%q
                  z)3iuLJ(A&|vb4PE;`=O(9B&P2Ois{jeWLLX7C5~a5)AlE7@&-3?ML32p-Oq@((mGFW+puha74}3A3L9A
                  zoc&~*E`&-2G7$ARAkJ;uIwRhyCv9yJQXUre=VR0MEuGD
                  zLfRUxLLW@n4hnm67mlpfSI*)t&;URf$|cC(&EZGL06DIWsLG+<{Pk>VU0
                  z+pP6=n*Wp_}#hko7&HCNb_>K4P(_?N{byy#FhB4l=NHTFxUFuv7AS$-+<
                  z#PG*1j}t2lgJa6c<~9r-NMObFlrT}CX$>%L4k)KU8i10iy<@cCJ~?>^@7yFd;N9`I
                  zjDjfs!UQkd)Dz4%T(v0yd>mxon45bvm#5{@zConH>9wb0NBQr+ldRX)&X`ASVUtfY
                  zvvKfz^$XC|S39B?1e&s-6>gKIK}d*B6QYh6`Ig;Cdv0n%fBaBCLH{y1iev?Fi#-5J
                  z8Z?ZL*2iQH{0>N?u0*+@KliLIa@^w5EP73S@<=NQK#ysT0T?qceo(xsLD6|e{a(&=
                  zbK*J>0^JIEUlWo)=Esk8&ln<*v(}_kI$+!xQ~`cgk3Ak*MYe(Yy}K!Cofc3N2uU8h
                  z>hLp>sgRYGM=L$nVXL@_X`vAhdGS`s|2xamZd9+;deOM<@;Bi(AKxFub)g1~Uue0_
                  z+E)X;spg@UM}Q%52vFXuHMSz{0Rm_Ti9gQlK8`6qEY(>EQNJmsW7X;t>c17zBiYPcPe(O{O+(Vu<5o@
                  z188}%K!g!ped>fAnEI18l1-0Acil*-YV5@qE({|=L&D|6fsW`TMHqJ~{eufHVoQZG
                  zoPcEVX9I$BJ{{=^mf+Ap$+cBoh#50vjUBzmgSOo%D~)!#(5;JqG_S5iRD0D`J80Nu4P{T%pi
                  zG+2P0E`Ie@*1&0NB0R1IT^0xKqOeuUuO|mHOm6Y<>*Suvl!^EJ*vt;YI0N$Grm8$-4WV2jl-^ErLxVEtEZak+U?375Z9A6iBQ0+{B-rKFxY}ow2;}rvsO3
                  z?N@t2q;}n4?Hz&gvoVgoZ;c$LT`9M=eD9?7)S9WsC6stSY!LOEHYpLYeV^BWRi%&7!Mc)$E=(MWl)oK$qZEI~SuR?Sw3-5e
                  zfkxwM-&CQDn-S_EZxIvGKBqk_N&%@9Oz{gg)5&hGv5-fA!*l~Pkb!6mqX6f{PDZyw#KdZ
                  z3xXmJV;DZz?_I|1ao+I8#|GuNR*+m8yM^-9OXK5!*8L&Kpvu6|rfoj1+7Dmc<(1D(
                  zJppAg*Jbc+t@XZbj_xGptN>}?{G@};S-r_Cn&;|eHjUKm7x{~OACeZ0tlF|;9Cjq*
                  znZ0xT`}71IcFt|_C{%Cl>XJ%Vj#t1QkpZW*_H=ynU^C8~Zd&(Pzc`EbY+F#DpXIg_
                  z8+ofVrTR8~Aja&aY*Qi2=bcd;iU+@dAG^7G=*?Rh!>lRl$`45Hogo~oC4fGGtk&-&
                  zi1kkJ$l_rfYd`n10AXogU>9PXWtQ~9G#ojtu>n=~rnb
                  zighCecdu$*aQfjOT&?|1qgQXaR~lKKQ01!Zk5`T$|G6q8Sz!XtHm}(#ttWW};XaHX
                  zd^HaDmP*O<0XppK;+=HZE)udOcYR=B>!TZVCp;zMvNI=En2TN%?k|Sy$vJ!e{Ez>Q
                  z^A@t3Tg%wYHi%y|Q~0pVMM3Eeaub2v&xHN-9S~1&+tvQlNZC@(PsV+d8R_v$-0P@JMo)D7wOSx--3cGE&4o|z6V;`$vv>lG;DQfAKab>tT*m(
                  zUmcB{-=Q-)ky@#mUt~wKXt`(O6wf{-=;-cNj_km-UC8LmFT99Lq=4iN2yfa<3nEOc
                  zB4c85_YQM|Am;@?6F>>Z$`j9R~$4IeiO>!?(_iK@K&se6h>
                  zq&%qYTFCo3OKz@mpc}u;UjTRtqNg@3a~E+e_VpdXmY`FoWwh&FWJ`URrm;_EHIoR9
                  zrjCZt7XvSUPHC3c4JbPuB$ZI>;=X04L0q`hOMR@|7m;Rwu^+=h{uSQd6h_B$kJI#M
                  zVQn-T)#cpwbm7SAj}a#iR-o0BO-z$&(+QLGSO1qu$ge1_Fsj@@_y
                  zf^fg=Y%21RKKNA4?^1@BFF#0XKx_RZ+m7!KNN{K_K$N`9&hMmw;dVi7N)B^Zz^r_L
                  zlwEp5bQ?p4IA>Z9)@0BL6bEu&$<{SVIo7`HHtY-cwlH&oUNh1wU@=YHOIzRUAKs9x{H*
                  zUQJ68qzQ+`=u;h{=98_o|6p=j
                  zldvFS@zj$NJOd%!av9@tppbpcq02l_;Z_u|$HU1#ynDs+aF_7syJm^F66pVe*b+$;
                  zD=mlri(wb+5!C-b?7d}F)NQyoiYTBUprRs32olm#A}s>aA<{8}(%nNd7>Lq2bST|Q
                  zHz?BG-6b&$3^@#O?s=ZQ&)IvQb9&%Mr!0vw}9nfAwoE$1!C1ypKB#tLo>))7}tocWU0#r(m8z=9*Tq
                  zEyS>q=Igf>@}=ED_45Fp1?NwR{q6KII%)qSH*8|FViD^k&tci0>a8t_1h)4cY+fT*
                  zYgR>4IgW*Oy`{X)OW}b~tw??Swr2BFlQ4Si;>PdUIm6lAEXoPGB+RHZ7Xal~!leJb
                  zZuSfIrBDtv*Z{<&{5U+MqKcpFPk;}i{Htq@IZc*08uQkD2l&)#_zE}DA2SoI`-yhQ
                  z+ev7clsvW)orG|FoK$Rt$(Xji_bf`>0lxSxkT~%O*~sZ_9vgc}umlDa1c`rnM
                  z=$YL;am`_9Xumn4xE*D3IsKdDmFM0@TV2qhi(f|jT_xEvjb!%fA$LqHlIEd96FMj@{`9toQ#&B@_S*#>E?c!o)VY&
                  z+C8?G1J|++b`2k^hH%4{K)yvYiCSTgcs#5-k&v<=P{F-u{?db(2v#n~jEo=dh0g{d
                  zo@iMmSno4-Gm4?t2ghwYFNe}apFDYG^mLW+NsFtU@=dJ);;Pzts;IWVQFmC|t9EFf
                  z?AwntOBdA@-{&d%{rj30drhvZ7~_)Xm-TNmTtv<@Z_K3wx-xPsS2_2~H4tAFQzGI<
                  zvgyVYEu+e~GcWfKlZqE(*8);K!WM5^y)Qfnm4FY*#y;fHuQ>SAzkhZ(pLE`>=Q|ZL
                  zGZi^yW2A~jH{st(>xF1+j>6ih3ICs3}=WDG1QMH|1~Ut!rgPk$CXj_FoOZcmK56b?7Um8S>!I2g=V
                  zV~-wcg2Iw2J;zh>!2s+AW#_v6lWH};NWG#yOn=}63>L9Y-uB_^2VHvkQ8;ON>iyfO
                  zB800VXp0jjIoV(__=e@2IwpQS)Ozqi5
                  z?v#;^G(LEjT*W4w13VRNaW;hvOhD7!HlC)mZpYJKRqr&pZM;^#dv+V2YPdXuz0@xY
                  z9T?Dc+t;u+v2aU`;dUqGskf@hvbUZs(1xw5zW8T3xj8e;udi?YY@kb>!hb|9u<`O)
                  zBh{?7q&78+A~`R^H>Z5W#E*jt&5k0XCu;jjk6fAN!q!UYzR0`5ReJXZ^@f8jUpeJw)HPPIfJ^
                  ztXBO@4z*V2k+dgjEWS*>i-95F6;pz_j!bV!2G&^W}avi5i5D{5CIZxq!$i4SRdZMTZjIUwHjq{zSyVx&4C$>ZquaYe+Sb{sYiU!3P<8Ls>3Kwy`Jcmjuyo3hA~?
                  zx!_`Rv#5YvBFBKO
                  z+m`0Fk3=z2B|EKU$?)FIVlXF5dDfSoiSn;F_5*)WYm}#wiFe+U0m`;$4dbZZ7HO|f
                  z`gOb!Tra@s$Ps!WQt+Pr+O6AW*`Pl_YXK>0oOAKkaj5(Kf%(&&I*NS9
                  z^TqVilZ9p9eD}w+8$nv!mRC{kq&D)zh-lU^jeg6HAc4|+opxz)o0mfHnm5mPTf{q(
                  z#)*;o-dR}D8er}hqM!0vO@FVmqDM_S)!oFRvw$
                  zjEorhp4fqpXECF(LP1BaBuGn3J5PK5ch71QQBhTOwehqx|1?aj?8Q`zWmPS|v&GFCWod0MZ>m~6%>k3e(E>o&Sl$UwNj}R(6
                  zehSR1SP{fn^bUA$3Z3^dO?TP)_SKryw
                  z#0Ogp|33vZfb~ixifZ~tJbFTu;7ozbQT%5@;(v5p|G(rXoZqjkXd2eskIfiXR!~SX
                  z-+bevX{71O`0}L*hKT8V4)?B?z#R(AwhGQa>u<)9X2Hb=`JCy>+RFc$u?P;68WgvJW)WT!MI&3iaYFh=o%;rr^UVmm@ylql
                  zDfa~gY*59+)MM{m7})GH2`=#6V!M3a=q}HuKS+YU0?ur_#MVthzxXQDBHQgq-fsLkR585w(!CwxPJ6+K-*xoh`
                  z*qP!LHJ`cd#{D%|?G>ifb8iqg(qy=g#H5{GI*x1(*ZYiXPXMg^+bcnxv!~|*VV3Pq
                  z{C4_jKDt*}ta2W>*++f&RrY0)IcW
                  zx5;nz40L-C0IS`)DO`P>Pw(Ph0e690BB|p+-&B?1
                  zDFOr326J?7_zu{2fb`HgPtD&b7$apa;nY9TAIA;9qJb&W@uv&t;kNqm(?a
                  zx>hy_@fUCxS!
                  zy`|hIvzc1^cpS!aZ}ClrS+<*=947TemS*{yIbLcw9~oAQ4Zn>{SYKafW7Bx9@Pf=?
                  z-?8e*9nT>B0MKbwcogw0-e#H_$n;tZ_=#fuzMCefUs+h1f!Jn_OnV%q`rBfAD
                  zcka`1mB2WkNJ!X^5&S+(>b$kZxYQC}rH~UxEMLVPVAf+HYI+v_6FF8Io0Bz5qGZ}z
                  z%g=(j?IZD01ZHHvW+snf=<8!+a$!*`YqHX)>zpiGL^ttHJM_29pu%6
                  zbNLjk(pmimHq0(-F=_{Z|B3ov7B)8*uz15ny__M>N`4C8U@vN!sop4D>DzdW3ZG#I
                  z!!Vz+z7%BF61KYN!KdOaEIdO+BZn}n_(OHxxA{w)K5nmlDyqm)EVHvKiY_$ol<+E<
                  zF+yIRH9br$j7{W6RTs{CXe-9bJEWCVpt+{GqS6}k7zFdp*63-fl>);JpHVF@Ydbz)
                  zX;2v|GuTGeN*TfPpzYA33zyd#UJ$`aXs@*poINlBl{6?l#%;wyN7r}c7V6Vfe5WaF(CC4PBu^t6F*1>iK&%IPD8>IgQniah}G<9}>CwJxX^$_y#DrSq11WHT0|QTkf|<7{iTuRk3nsFbLm_IPh#
                  zH#{$pNt#d%KtNYcp7IP(?WY3AU1be
                  zj^@4x3@a9W{wcT}%W?WOE-tvDar@}zY4NPk)*1)mnBSfGz+(
                  zw%QjHHepI_H|ehJ;O#P@kDLUn?4sY1OlfV7*gJEvKWizsaQM>cTG!S&;hh!Iu-f2$
                  zDI5J&%~sql70SdgR*8CM8QuilVWDtvS(z{!{#IyF_4^vKSzNz#JBH@DYp1DKAUXGA
                  zr2hJ|;lpBss<{HDq^7DGn{4;xayp3}6rcS-vECw#hdXj%!I2HZ+3@KzBzSyKa0ew4
                  z8=lm_$#PUtATw(Thaqbo!TX*wF2g5m($bjUC=M@5FnAvY$TwZtTA6*Ww|THJgM9ou
                  zQ*qU6I(_!O^44tKr)1%W_Fec71=F^kiZ|WUoSx{q?og>Wjyj!}K?POX#VR$@fq39e
                  zEAvZK=V96jit#<}<_uarGaZ{T0bA8OKW`NdK0T@KKuL~8Dc(C<;>ww1XoyXUXCW=?
                  zbRYZrO0Mt$U;2SK98t~c?snl*eUnyKagM59%38CRbG7>vO-?qG6$kC$acFuiHs{*l
                  zc$c!-Fv8vi+wh-RfMfw$Rh5OERrZQ}3xrgQ&{Ww;95<9d
                  zMJ4*N3bp&2qo@-fp{);pocz8nZDhT;5E$C(6&xy3`gZxpJq)+La5hwkulEz8z2*hc
                  zk!~-Csnw7RS*)xEgh-eK4W!RiwHI+LG+d)7=R0_83x|Jz3OkG6PbujIfOO%8uQ&eg02A0@#kfg*ZB4#Lh
                  zo`}?j(ixE?O&w$&coh9O@GuFzi8U^(N5Av4n(FvT>NlHs>6IqPw*)s>4OmC(rR8KM
                  z6boKVY_q+8hcHQIe+*{Vkl+MXAze|9O
                  zAiyJ+Hdc?P`T%R&&LCSZ_}EN~cdOmsk9oV_h2TU!I0xT!AK^mt0FOL0tfCk$rYIMy
                  z*TDVdD*C~9@I@~OL}Ac~GmM7IBRsMC=Gktoe4Sq9Y3T(rJo#dJKa3n1O}%BC1reS<
                  zI4qsin{0Z-dugGL9=1c2b+rIqGn`Totoso@f_^0-Gz}{E`>YuW_FW37@m_!CaOJ;^ITv26Rg;4qy$(g7HzAd5DSdmbR*?kLeQ`vv63Ec{IIO>Qv
                  z7Mg?}Km4Ie9Gl3fR%P(Wg_1@H>$Wh!-1r=PJv=;eon6fJ$x3luLehDr@sjq59QbZi
                  zk@@LfblCfo5(@GT49RUi^BJHahiO#>*j`Wi!w2mc)R3hHO&{-sco|WDP0oacoZ5_ZZ#8S
                  z2w#sQkxxPh(`IjYxqfNCx#0ly;&bkSc}^2|)wyw-LUL4=?fFiuFc1Si$YMsXPIR&4hHXt%
                  zJQ#j`n6TI9xt%r9{PDy>`%*c=Vu(3*;gfQ+BX7(wzv24}e!fbxzd|B9J
                  z4ssek81f}LW+ZR6Cn7?mv@Zp{e;DCx#@Ds5n4}!2mt`hhshal%Fdsa;=BxLec{R*?
                  z#aZZYa&0{|Qo=z+(^rX9BTbnJ+J!TkfoA0`e|M#_%+_~E&{%q+)w01@=N-aM;ltO1FQ;rt4fL)t?PDE{P+LkW5Gd_KyJTsdTJ=*zqN9*yb&}ycG>Ru
                  zXg3}nKJIwSGSHv3n3mBI`~=fgv33QoT)H_UpqbXc_YOmA0BgSn*%jn1@UQ>(>;I=S
                  z5H8G0cE$gp^^6CeS`_n`302^g=IG`CX}m|O3li}y{;bM3-;3gbM_ny*Q;S3Kko}(U
                  zEssJjqo4YS62tEII9RZ7gKVZK-BfcRd6Qs<;FjdV6`Ka^
                  z%Rj@zdLVnif;!+}vl^~Wz<>}#*TC(h)k7T;rTrY|iE+E6xr#SZR+C~D-?6*r{g?5+
                  z&wWKShq4bNj_h0vw%D1txqo^_m$ac`JBP_9d#
                  zJiAKf#|8S+%Cb``K}T8A;2Xb7UYMWhiW_EoYnBgL(sJj4hgPZCKEgVdUvIkqv5|L?
                  zqANU*>V@=&cO8tI8Tk4vmsHAMb4IwLo4u`PM?&3!D4)2SR!kLO93ujJb0hsX9;
                  z6fI+Xo@N%B_V3tn8#bQ6s+2FWU-Z&cmJ$1=J#zPe#xb(y_Wmpnv-Hmu78A1>Bk26Y
                  zMr3xJJr>nF->ppY1Al^e)o1mkd}e3cF|ujw8WMgE
                  z(Y%y!cC(*KE>m_GZ?Y7b{7F~J5A$4VzbGv2dThAlEQ3v)Km!fNBDbA+{S`^hbPm70tKmNXKm!TW!dUV_>Xtl{O*&rkXv$JNF
                  zm@7WA8_z{d`oN}VudOEkR#1%Xc$B4NzMym!FZ{VRxP2qR>d)f@1t
                  zq$u9Po=h8UGljy(#qEo^uYHm(EQa+OwThdXdmpC@_3D{+Lrl)A#~R5W)V^*!gN1L;
                  z_)4+(#7Q?|t)Snx$ZytKTW?Z)|K+Wod}u=mp9nPQ*)Ovw+E9JhWn~{XsMDk-@z?Rn
                  zEraD98wu}?C@RdIf3MtWeS;ymN-|6P4MxnIVqLCFt}ZV17>_-T%uKY?&A%0u4N%n5
                  z(6?m`%+Y>+6l1`!T@`8>$r4w1$h0!FYI7%IcJ`w7_4zjXu$uj7JPlrE0Qp<4d}MFu
                  zJ8c*8Kwq1BtQ)aV$pZ;lP{PAgd!T5BCl<-By~|H4-tzl9MKZM7Sby)pF*1uowLPiI
                  zV}mVFHSHNV)iFCp#0uDFo>4P?m{KY;Y@e~PH}}ljTF8?^Lt2k%+gf|Q&OuPC#KRZLiI?Gvh^rvtj|
                  zp&{GGP)+xn&{EcuMgUo!k{3emK?cq@&N_
                  zP!Ko1NS`Fo!wn59Vtn{4C65XyIj^_C77dM&&5u?u=zJu8hm=N1
                  zq%X8nR6wASg=&HPTW3L5VZYc
                  zxy9Rd)IitO|FAjQ9|%FLsf0Z@NJA|%OtQ9~uagH6_P9S3*xC&}=KHkV&`6KB`!^jh
                  z=>G&6|B%rC20Q+j@9fgUw*TDw8dU2C9rrww$(4Bpfg59KZaW#Nrq-Um2v^e8EvFHN
                  z$%0m}WhHz(wWpMz9?As}u0nn4MgZ@nUiZv@ZhTxC
                  z;_=KOO3GUUWV_7(ZAKrjcrC>a$-+>ikv9OXZa1mwo@sih&_^?;P`n)750me=56FVg
                  zPb`;Nt3+hVuQiN#xt%dbm*jXhdfBC)S=)))FF>j)n@r```{F3@06JL6ZZfA6oZJvM
                  z&{s+vu{TdNPcP8wWTJe@i0mdH{M=bJkBX(O>r*OYxq{Zu`EcY}2h@}Prb)Zf_Iq9C
                  zF+$#y6b>a5Jr#%opNm6oVc1!aY44I*X-{HG7zbd@66elwF+9<)0UuX#g{BmK5r6vE
                  zT(4__2c}qLt+#UANn|!WW}K%ZT5#amVEN&F1EO5{EqJGq0_^Z_ohbiFh8Mp
                  z-Ls-y(Q~!JtkeT$!Vgt?D^Ygj3oIOkxG|$zH#Vl#LSMrg5qYqDKaLzP?*4JxAXB9~
                  z`Hq*MVzR@v9U?NLC|M;{#c%jlt6Qie`D(Xs110WG`w+Licb_s<)
                  zv29%I3I5&#)67M9;+i6^hSU$Y4WwYLiSUGV+SFcFi1t&Fi*{eK>4A_-juNh_4~s9@
                  z45p4Nv0lK@0?HH8eBok}+p~5SzcYUDjlLlHQ>pFDyuhUf)Spgus{z+Ax5bE|YYSgJ
                  zkC7TI@{-m@rnv|tWykxEaVtonpd^0`Sao_@zY=11==#>;308IyF>FSra~~*59Xr|f
                  z8>Pqi8s_ymF0rO{V463Na480dKvZTM62;DcfU#=YhK9*Z(q80c+(v56p~{ydO=R8r
                  zTfbiv=~0^cwgqU^ncsI=e0td5GSseLRqM>$MSLRE-Ce>R7u7nPL=r)kg6L{Ir^LLw
                  z+U$#~ua7~4WPwJO#u`&x657CyErKUhJl?Qsv2dhhnFohAAwVQ?>0ja9FEq*l>7de~=U>_-QcW=9;CL1hXJ;IC4x
                  zV!I`vJap6oNgU_%oNv2q?d7g|tEpKC+Z*{@BZS00mMiHfv?5g|Y;u;B)T=#vu;rJldyBiRo{gF-t=^5H!c}$aOZJGic>>@@03|QX#HyHs&{tq^B(Ue#*)Z
                  zWuTx(RX~9uNpm#VKCQy|I0JREkCgOyJyq3d2Tz%uHxQdKTIq=FURsYsx1Bn0m$+Xo
                  zHVR%0CdJk8RDpY4n66_rX^p29LS0X1fAmEJ@_F
                  zn`haE$s5}_$>X*$BuFKZ8&c2j@$roJ@JF6(Q_4IGZG>2jhQhBiE7RjtlC`F-IH4w<
                  z_Q_7RJ!6qqcP?kv9zbd*$6o{v+zkJ6Cr#7-t8M#N9znbri;?Q99!!?az8h%4jWO?v
                  z&gat~TA+UO4kF1cS$fel=+1Rf=D*6e*#_M&U3C>kbNyh$P9x7!Yhi68+x5NtMb6zL
                  z^VUgsqQ>WSUFIbX5It)5Suuc3-@MQ@{vBG=?ofO6k{etWhQ-L;0Ft{uvm-RO%h
                  zPZHdp+Hf64xE#CD4`;&S9?NkvCo(&zk3;>Ecf)-z+$E9GfGM%stUSbPK9|DX+ft&s
                  z-0_q0wa0o~3C^mwnnF?mm3Rp_0tY=QPuvQ&&YjKlb2z6intXT=eHJirTxlKoCh=Jx
                  zH_kv`TFpsR{RYhpL^<5)XHUF_nzQLK@9;48()J>W_haCOVV$G437Zxp?1AF!yj9b;-(lrWdvo)CO-#_VPZ&|99H#VXc#EN{~
                  zojlL%pKsD$rS;>DPFue^{n`Bd@ZGOxA!|hkC1sF`Fq1IbIrI~qmYWZGr@TUb`j!Nu
                  z_X&5I9xanCM7juF0cW7?`*PF#Mt%GHuxI<}Ryo7dd%b@O1eITFU>sUWYg-D7pQT19Wu6(lId=h*Rz
                  z>?Yo$$&Tu)&C&w}2DbypL$|Qql0@82#{WwBPloo!-FF&s)~fZz1jT>o`={1tbb4hw
                  zAu(*RQha9UC4W4;s8FDsd3eVa%U<0|%
                  zOtwHAa9{J3`QwJ!$??@_EaV{~#EY;6U#VI8smal6&y7*DC}8B?kf3L14a$x#X&+r{
                  z#`~v;zvf%SCbA6siTus?@T&fjRzgHX@UJ1k=ze?`kbxxdd#X8b&&)eu^0LI07}k|+
                  zi2;qjL+{%`zA#$d#iCT@5C{3%?G|Asq)!IL8rmqq=^j(*rt+G9x0DSuG;-JPiL$t{6
                  z#^XWly*;N$Fi5In=w8ms>|&DXa?qO39^S(37vSMCF#*8~l}FS0vi_XOv$}0?$SAS7
                  zxLF4_=`!{lw;*rNx-{=Z;b=|c@`rdHOu)R_)x9o4!HpuDeo~er7-6l&H)odBslWk)G0-Op3HpPV7qr@0*=JQDW;fem$Y7q^i{BmrA#1mBQr=
                  z079BoP7^~$D5v^O#LSf2rVek=arTE$RR#ND=7n1tWA}Gm#7zatBB%#)Mlg8PG
                  zHyT)Yc^P}BxFc4zBc>N8eKb0VPb4o~m-~`@#vO!tz`u#Yg18t=nAYR))q>G-|pH)rLl%PaHdjK+o^BdFvlVMbfORL0(yH7Sg)(zXSv%trCRg`tv
                  z(9&+Lz*AgbNYK?80c(*{uPn2E`5ZNz5#MlM!i`&o_vUz}a*qT(uj0q+@dkOr_FGb7y
                  zZQvziB~a4fDBsIZ@~gy+Xg7A9$)Ef6BgF}VgGl6ro0N~Qc$QPkcGS?YEVWQaU)&ws
                  zTJuPP-hnbOD*n%N(RrWLDPnoS;G&~#(#Y6?tITSV3S`}KGBVu|4u39<=P5U)?3M`o
                  z_}6I!Cs%>dFrzi#x8-MbUu?6@Z_?G%H;YEtS>edmD#di5xV(qi*UMel%4oo_{w`a^
                  z!#?Nu5@wmNkeT`_g~s!@X>8$OjeooIN`{p;S7o?OcmBDyY>CiQsvg>cwP0zgF06T
                  zMQ8lt#pNCoSJMsB1{U$t;z%BeJfCSZppZRDs!A=BP*U0Y&^D?(U7a6L^GIG^xu-Yy
                  zQ%W6oM-FtGkMeqDUs)Ernws;a>#WlHGv0Ri>?uF`S8kDZGd;635n`?T1|Inh;2P7B
                  z;FfJdxAUy?;NaDXuN+4k9NGkmY8(?PU2jOsx_gA%O=myzA6X?;CP#k^PB3k{
                  zcaulgX9zF`3gjp2;mo&W07I37izG`eDSrGuWb48QE5>J{=)1L_i~#Plq9awqG7fl~
                  z=XQcwC~U$m9!Y(9TI^;~xL`>8hw;9Q{rjm;``;K`IR{QWQv*MdlI|`=QkjReDhn%Z-LEm7p{!$)dq2+%
                  zGGY8I-XFa{++$aUVr0EHdWt46^IBT?kFZ&v&cxAf*EKg7ENX*d3!Qb%Kd|G!dN?>Z
                  z6Mhi3IS~5Z;&)Fjn>)XDEyCOKR^fZ+m;0`@Mb}oHzW=JYSe-CX`dSPP2Y%_x-qx@p
                  zmh+Xo0+y4;=w%Co@FW{z{*aXn+leoOV-1w!tNR%ll@N
                  z3voz`)IUt3v(jf(e;<4XfOI+)rB9losbWgP*T5V9`}P0j8K7hTpGM7l*!2@i(i$j-
                  z^P(>P7nk2OJ#U*SSUxwWz^()BXICa4Qt@50L?iO*`}V1!dj)2|fTOuS#jx%^zx5sk!2q1ze$jFr6CkCSz|#5_8#KHiYN1jtY?2!+7+-{Zf4d828K7c^sw{Z(G=KHK
                  zodXXm$Xgf#Xs73i8C`WgIJp;y!DU-V<~Mb_ljG(bN@6uyhr2H&o;ajQ+Ws+T(-ZqB
                  z^XgSM<@}Chim%QGwTeDq~t5JJAZ#hS#^2NEhP-en)gVsyCwBRO0tf|f>=rXA<*zGRaJQ;;&ed##xh$a(Q81t|1H76
                  z*GY>MO+Kt=B88_RkdO6Psnu{4We@+jzj2D0M?9@x43v(-azBwc&4T1kiTPfxfb&eB
                  zX5y!?Z808@IX0u>=uoda`V=4hwT-k?>GQ$QE3Igdtr`9VU#a6MNEq+yoADr6+B{sN
                  zPT;?+cDrr(%dkF8n8F+%Gni%{=O9^P{h{MoKUdW8=a@(kLx|vrE9oT4s8p<|qDfS
                  z?X)%iF{E`R^unffx?2kZFN#Qj13NK{uEEwJ(6*e^7eHdPet&EfN3&dQ{hevZrbLSP
                  zLl(g2SAO`sKeOtE3)u;C02fSrs)FQ!RAzPXq$^M5-
                  zd0S(gjjBm@DccUL-p?HJAc8LS8;PDabFfCAXSJoBj(Gr&bU)j=HeZVAjaH3(X+`1F
                  z#HBP=r1X~RscS|Lw%~n>*kvJP?VCWlyp>T5QzhL(lk!JoNz?peQK3r2jIasMpR1+b
                  zN;P~`DvpJx`ci+>-4zoajjvVFTPp@o!xMt-dT$jNj$sc!cn*z7uL(6;%*zV9uAr}C
                  zkcT@E%{f2!1_ky%4br)NsU&fNTOV+;{n5>GKNiybjPJ$MaovfN-Hi^d!CBFaX4#2&
                  z2A-aEEVc6`O+WR)Aki7qCc6WBbL_L9?l<@_o2jx7`LmZ1Rc^;qoLQktg
                  zk{brUr7$Pevquy6I?~!CpwTo%`q$*KlyUK&xxMNKYE9PFi9HS$(R;_Y
                  zfoY}1VFAYX&YG9_Dk9l`hwXuvlfy2f}8R1o}kcIGB7KbBtb40_u
                  zzy#95ZYzc1;c~B1TAvXRGGih$syYGi6X_|Ny-}@YX&LieRP<|-fi0sH|4CJ)5upD-
                  z1~2K@X<*1cVEtJs$g5vU;qF_h5%&l5!&5oXFI9F|4IRDth_Qmxdwy@sz)_z){HrZJ
                  zc2mU&N(WB~p+1l4+Z7;|no^beAUq+%_wF7Xgt}oxrRyzhc6n5G-D=b#Z
                  zD^jZc&Kt8ky;yl8WN392pUnNBoU4qWg+65J
                  zUDtu@yB~y7aHYPJ9A$5);-l6w$2i
                  z?82~ZzJH!bpTcN0U5|1Z8ABn~gijuxbsbsV<4Y<{uEIx0)yJU}@hapwK~-KyEHYR@?kAEYT&
                  z6D~fPCHMypX?xUlZ8R5r?K`fVx>3Z{;G1m85X4n32uv{*RXxJQkZOH*
                  z`j@8Yh_!K{0vR%XYOnR|=y<(r^>MJdU{Do&s)U6PU28}h%=h)9XyoHS_YYgj%D?cf
                  zP?nzeXlS@)NpifwJrdJ}=dlC?ioTH4?`B+I^Nb1RgAvIgLPm1&gCQP$1|q4OopvkO
                  z)s+S*vz=}UYZc4A?;B=a2QAsk*}cOxJzs9SE6($q8e35b_+-e)LD%W&tFKN88;ZSPdO>KeLHB%!v&nG1g8z+>%hQZvSHGGUrHWqVE|!~`_Ix&dKjn7j
                  zHRKkD>S)wvA7DP?a={ddW`LCEg50A1GkXb(v|{P73U8;co^u5TuQ4ubw=qt?{jfeo
                  zZ&5;yDfN?JJHsjW(Qm$xEg6*e{Lvemb@+u{6IIr$wE3b+E|;%Kb-|pvu2FEG1u_Bq
                  zh~5xe^cjZ|^NG)=glwv#1Z`uHlLnRS9c*Z->}qJ$c;Xb8R4%y_U9%sqbo`uF+pZjW
                  za?*l63R`#o4nf+Y+smb$S9G^&#c91@2i3G1C91zy84?G_(|u;*>b8ers2h3#X
                  zUdigfFPD_EX>!x8_}sg$%c@T4!Z$jUu?=|%+ZK5zTkNlS^o?cN`h12la9m%~XReU;Sg6<;S6nUlhsyyclZ|K4slP%~#cCrM5vZAusWO#EaevdvP`-Zwno@dB
                  zR*&Bdw@nt|)%oA$5gH9qE5?3b^^Eo_j{fUiZg12cKknrl%kZ&|iV;j8&NG*sHB3>t
                  zkxmvoo$FU=iVTDexGNl{w3Gw>Z_BsuC6-+HD#vOIWBx_Icf=;g`}`pl3&S4zPJ-ZZ
                  zwN)H9Bq&6vaHR-PUgOW-lh+epzI@5p8WVJosp9M{kw^>h1Rt0
                  zhDZJXC4@W6SO)Hl#17a11K~IEH6xnO%;ke5m&4kQ+wTalm5bW+cN?A$^d$r4eWZ$Z
                  zS1dc6x}s%veC+ioV|rre=0w!(a_J)wDWtUp;_k&80b{kzOmw>1Z#+8R#F|mLcjebm
                  z5PZ$^tBxXkTJJtL8BATsO@g$`mvM2z7X2}F`c-TEBcgB|3teCsZbIjgFQ___KLFh1
                  z-`L^*(*Fma{69a_oUyQ7<5=U0nesKV0QvD6j}2-fN)UE;T)c(nVaR3ZtOx=%Rk(B&
                  z2zMw&zTC)M4#s3@5J+y!I)uh>$G-M*=WzzYGkn0SGjdjr@PK3S>G{V?yJ%S@HI|dq
                  zJF>&w?eqxvllI4)ocf97iL6jxeOdIHDs#7X@_p!hjK)*AHUA|L4Xp-z!f+_ZmwGpM
                  zx?WJXEoAy17S$iat?>v-?OADOkHhi_@XZ6QEum^zP?EVKBL_7~We7Jw=qQFOWe{v+
                  z+qZu!PBl?$+N$gBg&+-7Bf`rX20*%n*RbYh(LfOARr=|rT(jYs8Pk<
                  zYEYoLr)1Wn^1PwO{(hTz>KXa8Y2`zpyq=g*MSWUWU)GQsmIY
                  zn6wwmuk}DQ^6E>#AbNF;Ovfl4h=DzPUaqBEAwh#`1uQR}W3<1>wt9fn+yLca2LNhH
                  z!fvKLHdFn*0NOe{w)Ap=IdJujS8YcK+o5THWAIQzKRbW#{?v*)&K$#e(=jilZa#`aDh#;e>|H
                  zbA0^l5CdX;ajze<%m0nF;alyOM(^yZlv-+M1lICQebFgiut|j<4@*QN;n>inH8&vp
                  zlG{ld8l|iRSnMl$Z85f8yFI@XnIFqP`O($Ff_I~fF;2d)Gab1NdbaG~B`uit$f_djs+fCn5LJ^?w;&-?v)ou`K?
                  z<24<)gvkQL*=}g~@WQ}F-ln_2FIYDm8h11=?On8p*8m^S_9PVB?W*ian9=K9(n|qD
                  z^T@pg)Xm~=2l>IDOzCOP0Zo*HM-HTG_w}U7JF6*6Q>ZquajC+cBa)vISbQ&%$0kXP
                  z9HM(`qRdKmPubzI%ewWvErvh}i=ijPF^5m~78qr&?f34@fbUN-frbXIY6xtGOy#lR
                  zSF6Qu#Iw-^B65=QxNWhecrtmY&f%Frma?#rZP9@MkBKy>bSPKsCo#VXH&~e7cKiKH
                  zpq}o0N)4t0zr)2r^*2VFs11M&m*l@YD}KKW>HsTp(Tui_+?5h2^*FZCwT+CGkF4*m
                  zXyPQ0L?7UDc8uh@-GC8Ht8_&pCw`M&MDM3n`UJ)lTWrT8AhkbGHXZTLmAM;rFYwpi
                  zgdI+G+F5oNGy>T*Fazq=%dO`9rjHcLd|dmJ549tQOo%%snpYfr)B0zh361nVWCIeh
                  zgLR;?=`?2@>EIs@uM6Z2+S~Z&GdRUZb_8vS<))`$UiWLoZE{PNRd&SYe~*ZfWUQxQ
                  zTw1tRdzXN4`l<{<(OhtaO5ge=U-VEfp;Pw=e%0l%kH+!?i=>^TDlj;Y@ZCI0YtMW)
                  zdSnwU{r&JyQjiXtJuzPW2v|5m36z=MDRKpn)8XHNk{I0UqOm-hDN&M9Z!HHwC{KSG
                  z)wG1*Cfam|wfC9iK#t~`S7Z^hyJ-!>1sUEs?lIFqzNqzfdJc}Ur=Mi6ssZR2~Ao8Au6
                  z=3|XpB0jKZT#FMq-vjCn^ng;pK0TTXYvcyBAxFy>>M(TEe3%}fQWW{Bz7hev=c#gK
                  zaCNxKkR&C5Foh$PXNa2lb~b&}<3IRw{k{W1P$0s-OdkcSx_#<`RV=V&nCQ3fE5=M@
                  z@&H5PCb?5Y58Da{Dn-ySTfhr!cf=D(tbRO%PtDnpyK@QF_liA{r+&|
                  zoVQvRUhrJ%@_J=Je^3{Iy=bAZ!=3sRWBs)of$RHLt{76WmdXeQa;bq-{-Glfx6@;pX#e?iDOMlv5x&a>+8(=_5>~3pEn9dwwoM39EQvY3opAR|ir#7?QVGu{tS@u$f^|SkR
                  zXj#xmGcmg6J&3c;DV*tDFiZ|oW8ZJs@ZPIiB{RKA@)K?UmR(LEY^jJ7{s!*Q(Dl1F
                  zCA@@h-8Lpm?$htA&i(f<3mA8v3o38V8gRJHYR6x@J8=$kILdF0S*s39oX7{h+~Aho
                  z(PdRXYnqK3gTH2`tf$Mwg@U!G1D9pIsuC3Lx81C0T(@(Dhe<0c%6CkIC{A%^*k9M^
                  z$(7D=BBY=B$uwE6Pd{LCoxK>OCF{7{O=WNh0`I|D56w%yhjkcCs$+
                  zIchH)03-1|i_H(>1oS(}0pR5B>JER?kMnp`JKLl$Q4iIl9(qv(YUSJxmLek&y(xIS
                  z{Aya_^d32--E`E67n*zE^D49nXFAvW&PMW8hts<>qhC{_k-E2_Qch2N;N@k#XYNWr
                  z8Wycf|E1`X8jss4E*vbm=I3V#qdCo4ZrRp*xQSS&{iO~uKnOv?>2d7}xLGs=U0llk
                  z7nZZRg7U8h8;d$vOER=seM@jvmY0Ug#I*x=(4jtP?3C2}?vTY*#qKqJrdQgT2B#)x
                  z0J#nq=eX)V6qqC;o|Zeho+0&zK}ij(uW+Y6|6P|saS3kJ*L)dk>35UWozTShd(>Dm
                  z+e`G%jlah1aFZ1m2RpxoW}@VFW8|Eg0y>cZ@8r9`K#GEo*yHrSLRaWs;{$RQJ_<6IEg5`OYXZxt+63oIfO5Gsbk^oW?@juQEc3u3h!1N
                  z@$~o;8z<=cwtfKl{q+6E{ER=>!yJ9Rp3@y1{-&qG&jS;()sS0($2hv7bfBG<<{e&Hm=Y2m
                  z9Geh(bt^K!3`ovw2ZhMfH*r^8^1eb41O_}l;j&UW=bEfoNb77`O(Vf@%*hW
                  za@YR5v{lWZI?K>=!f6Y;M!xbwza_Nkk_*a9wSt)u>Ods@EO*T|V756EjDa1tk?lU-
                  z)c>yMdOXNvphkbcM6Y31+V9$xD=`bc((eQ239-c4&4eR4JXS7l-ZCH*CAbXwxUE7a
                  zA-|3a1|u=8sC$eFYLS3Wl6r8i$qChV*5)Fo~JT=650<9g9XAVVxCxmOA>$
                  zVFSnc&U2?a@s=}q!pS?5=p)DMhd|zxWzCYX{wT9?$`)*t=avvXabE%mDjM?w2Hurg
                  z>7*)g&KY=Kai1&f5ER|EIvrT#LKSDZwu^PvV$kY$`WcF&f`ih>bboX
                  zp10TDkZvAo{h2j`)jFkv_(PNY!{{}XWl(BNK={l5CZZofcjthX;V&+yx+te4qQYFW
                  zq5rIEp3MgD(AndbTi@g~OAd2=Y@&FNdSV4qf91;v79Yl}fZO)MwY`lhYVWfVtD;!{
                  zpsd|do6KwH7XDhvlD$$vRi(bqm3X~}PW;t&wyHW9e9CJ2NJE;1<(%CS3vikc<>;f`
                  zavgqCzGZ@)utM#S);L2x+0t)=GuhI`772)xYQ;_TP$x9o`zF;i%btB<o*2)7rW(M(ryBqQ>+|Ul|2n
                  zul!#%8(ZiAg?AoPvcR|z3y9Msh;u*%Te@$Uc925#K2mPJ=H46d7pqsNPIz|#%FXY*
                  z^E~Bk?umm6@2e?)K2a_vch{jx@k+cnV3I(r-P%{I-t{?eCS;Cxo=K)1cH#=y`T-E<
                  zF2ujWygjNoxp=E#xV8-FEr6Tg>qha9IY3Giub=@cU+;Pw{@6J~Q^*L2SsLtiQfV^#
                  zTI1nYR+|rw`na#1{6-i$3(^M5$hc;)9%J%6D`D{#jXeB;Y&gQU?}Ie_rM!`$qp1rJ
                  zecv%p0x@XIR>tv=XbrcHXz;WgvoQKqNueTNdrkFLmBfupE&`kUj%QS;2d~C0^yQXL
                  z#DyIFDx}c5y|lYeFWn1|bG#Hpz%QJ}cFEFrb$)8X-@b823DR)&%`SFq@$`f05BjW&fIu&2(++y4cz>OfH))G4
                  zsa$^#a9thunE!Od?wQ1;4KXIi4{~%+h*pQ;MyGKEV?_Q!oo6VGjIqqaPiBE0!2kz!~KtZEJzrs+CU1mUlwYd@}7Yt*r)-if?br#c`v
                  zr&Pt=6ANh{dA8y5fmA2QU^AJ-fK3SxeN)RT*2Mx^!7t*`o
                  zjq0XFzQ(4F*@)Wu?>7N}p=)_@GY1@i539+>x3R!y#K^iC}mj}WdF)i
                  z2zinPbgqAW2Jkii>-q_LROoA3YwpLb@xj}CN`Yx|J&iobaRtwR
                  z1}#L#9K-bY@7yIhg12a%9zRIObQB7JphesL-JAVXk`E}eUx?4-|EZtM27bEdFNS%)
                  z!V6agXnPKq0qssKaQ*|k75{ZY^V26!BOp)p!){-re;W38)~&*t{0r@GBu>5vVPumc
                  zG}8{s#dIqdG`@u4(|Dc5bT>BKwT6GMhBvB+$UkKQh!8DbCA?C7i*{D)2#M2$#Z71l
                  z^_$QBnhP*lUpaL?o9;=GdHk%$Z!7YOi-YYmd-0M(lP=%pt*0||H9TOD>!-A+Bn(yVj`uwtV>EdDGD
                  z`Yl38y}oMzQDbGP5kDeBza!AtQ%zS(Oz^Uvp7`_sDOXn?MkMhLd_HS3yJDqw$gWcS
                  z<<}$fK?9ebyx(Vz697C3WZ2E>cD|a+<3)8*sAt&eTl+m*s!ls
                  z%V)1+Ykvi9R<`g(Q1@L&$1#>M8NjakUw_}MF9S1H?Qm^*bou}G`9~3kg$}7rQ~=fG
                  zok4C$PJcOL_DwEO(o#;&hxwWH@x!*R0+#gCdyKq=kj456DVbhBQjr01pfXj{+6bOJiDi@?S=rxk%fa
                  zpPO4O5IlP|$oot1@qkJ@%i!P;aKVJpfyGT0108^kom`WBr~RTHeYp_Q3jtquA4poS
                  z%QxB+LH-@C#=9xryT?Tex}_0!(Dxh`1rx^+)14?vYNsybC}Z9xKXgV7!*ph*SUy;P
                  z0u1h?Ei!wG%pWg;w5!_LdFeRE3p_9Kn%yE2ZyIeUmCJrlXX-f*6&jNCdV6|?RP6Z;
                  zHb^IScI%usBzW?T!ub6jTh?p?yPM0U4GoG_FcZ_3f0wSyhw>`KRk^e{M(*iyD6GuR
                  zqA&CsSGSDUzj!&garIn_{+(b)_9S_7oy6Z^h4A;U?y-eL@pbNT-s-1wMs)V~28n$!)D4_vhv!6mLH))7#IvAxeQ2oBxol2C@yGTj@JYtoL>hm!
                  zHq;C_w@ou#4IhI*6s^xoy(r2>@q#=SdK)k0oaL0<9Oe2gtlwS&c1EyOywXg>Of?uztNh=Wo=Rp@N87y`gM!d3iaORjRmh!MS*n
                  z5=S;)R5Rtlo)mfey_2~DANQ5~Swo>s!q-PByg1JWnRm@l%;r|1VGBmq2*!6h^kPAm
                  z#_|7r!EFSF(`dz~XEwe%)zn&c74jTUelJWCFOgcy@S3;RuETzRos#ek(I4H-jeke2i16NQuet4y`vu$Ibswd~`&x=op{zWadOc_>5cWd+5{t0jVV>(5mYTW|2-N9t8RT6RAU8NZuA3xb@BFt}!G5x_alFc1)hqG_
                  zN0!Q=N1pbM?{6XkF`!0c9`-Ee|CA{0AM;W9ol#$m%Nu^840+8XH~Dsyk
                  zcTw`Fi+y(~cOksD^qK`|ERpKoFyTZXeB#?GT|rk?Ucrug9$;h&6Fi4U>c8GIQgQRoorR3hS9??T
                  zF8#ehSHHM?0Sv6#9J7JP8U9#j#GGEq@K`B|ZEmOVWK!Ltdt4)qO!t=PI?lqU0{GDX
                  zTS$OsAkYNP$KVJCG=r1H;3i;1}h8j!vFur
                  c3o>!$v_t!TTsHrG|p?XaxlYmGcP(
                  z@Q5L5JrnQ`y{W94A_|JvD-;y}uP7)8;35Al6ckrZ6qFrf6cnK(6clpDv_@4C;EBf;
                  z5{eQiD3wt@H>$C~{YNfpGVf8!hN-uKI~bqjWu#E*4RC
                  zcouvr;Mbvil#n8L$VPTJw{Ig>-N#F`szi%I-aFH!sdrPOCtI_n9tk%`Yvc0Pbf{>it1HIe
                  zz`pXeH^j(lUbd!BpQ~S=;<@}b{
                  zPB)8>;{}rpOUad>?_G;`v35ltre9fGR92RNhsR9TM@e$KoBX4xnIN5m!bm?ibtaS~UdQnK
                  z1u++Lg2Zyp4GsVB0DBj;;0ca$dvf(^l1LYofv{)i)?Ks*n0xc7QYMy6`~D1TowyZ*
                  zU$d+gQVS~n#Gv0s8+=R>-FYKbB=*CwiMF`*^guWszMJlCpKUkIb|g54!`N(VVl+w}
                  zD_#_3+ACRU*^iEFjP?xuGbCZAT3#CqPRY;zh7f0D#53@6_@H3RZLU-r`KjAhMs=2GWtatt7rZOP4SVoWUu2i?9E#c%!8TgW4
                  z$x3$3pMVKY3BtO`jWWA`E*hwmTALs*`0vKZ%%G*6KTR2|jlM$VANlsM+>huvDh(#B
                  zX`m!zF;5T^tJBU($IAtu4VsS4RHgf|z7U75dpwDo8G$-+@|2h>;YS%QK>COUQs71|65`
                  z9(%+}S~}0>!B%2y@0j2F1HX&ZEqH0Y*p=ArEN~7`I=24I()_*nYVewY0jq-DI3&<5
                  z8lyPJe(DJ}m#tBJ?dr#g=1Rw7^t984a5Hg_KcPnK<_&jQD+2J1G)k<_4$3JG%JVa2
                  zWyofB_OW#db8*2idlwmtrV;OxzuR{0N;}olB?o;Df<#1UN7WXlb|Fnf-*iT%tGcef
                  zeunGxFDz8Nr{~_G-Lu6*tFA#RQD~8(h3s|wad_4>BXC1RV`ul9D8H16M|JGu5wm%=
                  z-(t2M7i-G0>^&m&(3jJ3%kU~=Cw-sKToD?1VJE`9==S;Z^R{&Z(HjCqXo)GuD{98qIkELldGYJ&D{_I5I9g5*)76_10q
                  ziH``Vu?P5?;_Zx1!=*u-W@bV!8BoV(R^(Cn>!QKJ=(hNKqkz)7?!pDS4e5
                  zD_>nb7o&{g?Ow+P39%Zd^Y2GbnLh^%(|k8;T-a|HfKM$n7gNQ=jGswd^;N34vZ&hQ
                  zQflB!NK{hruU5ZCqyazB5LxNJTGjjEM4oB3i!JaZ?cH3J8Q$HqfqE>5bt
                  zBBHG!mkJr$l7qw(D$rG30kTS|FABtIuuD6`Y5a@^T({Y4Un?B8722;_4W!mclhtp`
                  z!i&wdEq7wZ40ipE7oQvUi_~vEXwk2=IAxTNQ_|Wn?|}qq7=}m4sdb1$_bp_qHn)8T6tPcxK-5k)pX6C
                  z+9FCC=1emVZg?XL*@(E%?xKITC(g173OSdTE-i^Fi_+LiAe+-BJ>cOr2<4h#mR#=~R64&m_+C%(z`nKE)i=|_E**HCI>K`Is
                  z*4!HtVv|=%1)p3r=q?X0)~S>vvB@RYsF$05iXDZGxUpW>Vtw~EN8XHzwGutSk$)E}
                  z&5p3j?V)*J-NU}Mm@Abq*q=q{Yq)&fcg7Gj@CUxcc)Fg1gdM-KhQH3Cv;4DjZi!3P
                  zLg!a%j|MEvB2*8<%jH$qX@h{?>gI=`$@)enrI6z6+cGPOd}&zc)t!uyM!Dw8=|@+C
                  z4#Tz2`2X#7aXO5o^EcI0XIiugh40^*`-ZnHTzWt>|9*v-j|qS#JAtc>xSw~
                  zFUD{ke7K+)VkmlpR^{hHHX?I-LR2SG8HXbBOYCUc?WF|q1SCtoOr
                  z5epL99;lx_#i&$$WkX!D1s^6{{mEQou$FzNOrRG*tE0;12dvU%`jNjv6!{4qS;$CX
                  zS&P+rPFIUz0mW8`ut@$})1x8xP1wCDyuPue=6ZcV$awbxZ*jzA<9YpBo(2C{aVjBNpp!RdaC)#Zgd{E12REBAXQX987;Zs$8f8%Nt5+~4yFPBS0
                  zh$IJ!rwxS2)E^n3<|UPqKF=Ga|4awgS$M0}Ydm)kA1~+mFn?DSpLpKUU@YOndJD<+
                  zS}ZVAg^3E9bGNw4yVqD}wBFx6szjU{v@xIur9Nq%GKx%Is1kJSxMXidE@2w^Exl{m
                  z911Yw0+#sm=C6q~hLrWO7KB7&gHQcID-);(9qH*H*TZd|)tQD(GDB|{e$C{%$v~S*
                  znI(?ogFY_IN>>>aYfX+E?)NWp-|~tw#ZX53H4$6$8-`bz?Tr<+R`2XF!j}XaJOqhJ
                  zmZ2B2kKS*V!|mvb1BdZqaffQFeALu*5f?R`!8HLEu$B^8(&o?vHu)oXv3AEJoBNZ&
                  ziXqJ1pS8z%c^VlKQc@gxD8m#_Quy3J(drflD@pEQVkm|A`P<8vm*#%(TF=$b4!(tj
                  z;#1d@B`j+(JJ!d>k}ym~SX4<3DqBYYeZOYb#=J!UY&{As=Yn|O^
                  zBgAx>fq1F*JD2C5$TBOv;LmjnZ~;hX*FUIfDA6=^AR-?Ymh`C5ky
                  zKI<7x?AQC7ETOr&W0gZnku2Ofx7k1gZ~I*9_|6BkPWog~{=UGAh2MS)l_VB(J=!E_
                  zFk5fgPFK^%z;zN~rAiWH7v*_a(a1m3Qp9V&7}b5tF+Q)&IG=&+w(>~OdnAuTqAxZ-
                  zZQKz3O0yRL=f(SSFn3#h;skd4f;Q6EJmZoL=6Eu3kTYS{8dtaNEh`mdDow+PdrzFM
                  z<(zpCcKx`MJT`8+@Kg2lk&tE>ozbv3RLCKcLd~!(EjXA9d{c~$AXo|(G|EsFZEtcr
                  z(WrYvM5MaJ^Pgimx}T(X{bpF6cfYj#EJ~_-p_I;QH?HK;O(o5GeiEH?TfxlKu3*lU
                  z?v;+UimZr;sI75a|IeRM>R8|2VC+sDH&N!=D~~T?pK)42qoR}oLu)e|TzTlF&nt#)
                  zja9-lRQonGoj9y)q
                  zn@%>HEoaNFIux!}JZuUxJ)1CC4;FwsaL5Izx
                  zq|Uxv>5T$Z6t|rtTD`D~>kj!sgb+B^-`t_z^Ss*cQx_L317D~eym_(c
                  zyF^1hB9hb+Fqs8e0E(3xb*w!0T|KOboV*(`!a*
                  ze2_Zh_BIENLhqYH4#7v=kyK+9wOo?0fnct)NN3B*cAdz5?-dnJuP^5V@J3Yo?mv^s
                  zj=W^$!%Ug!fiT#co+wD%x^r={mGzJ7R#AD#u|s!ldR@hrYev?aO3&K)w3A~eY607;
                  zL6B0EruMPRsgIx`Ifu-1PEP!xl=_{*NaV7~Wbyu2u&>-k|ML63qi+CB8_Q0|oU3&n
                  zfuB@5^(h#!byCmc@il0M|#JWj^WtQFoF3VIt@1`lcW`DmYCQz#}1%OPRYUdpm0HydBC;uN>GWJ$~`*aa5hYp>`p}(M>>B1tfE1ph?r5;rGRXN~6{k;^YO^=mZDfsHs
                  zQouSa6uzg6o@tkn@AjX4s9DoT52j`Xjxw`-3Q50P%rlP2xVX0u%0fVg6DJR^v}x(P
                  zx1UvXD5wf$PJfJkRcND9yE#6u+l1GC&dgI`ypfbT%kh3?*ACD!<3$W{(y%{&V(Fy(
                  zCeDTi-(6bMdni+#|Jdx93vNgX#ap7*CM(sgUtRnb3d-WAhDM`T5yGGPusZ;RqTA7tc5!l7j@Z~K&y%6Qjo0J42HrS*Fr^sa5P
                  zS?!-`PX~SrNjVbhcL~d4H*fUVPJQge~ZP@G`5SHtNn-J{wAQ)rQ!hCbLAR
                  zWC+f0Fv{%z(vH4al5i{rSf&VLn@Oyf(9eZ5QUkUJ;RDLD%D;@yhf1vbx~IvVXNf*
                  z7FO}Kg=-5g6CaRoe0||0^IOBveiECa=?z`;HVb(sU)QR~hp~m7FjRlVsT-Y6eEvhs
                  z?Q304X7r>Ew1J}O^BsZgikor>vL*7OZfrmV*}^3tl~vxsKu5xM7|P=;B?$1Lv1@s8Fl&Ye2=QG1nxi&2~}ZVha2tL+K~
                  zZO6IiewyO9cP(O=$&+h<8oEX8TwpC+4xsm$)9#;!bj8_z2tsyN7iu_+>OIKe5V9$)
                  zR0wk*?#ME=2HByF#GzAi5(QO>GGy{_QC^~bU;9@Nqg60^7k!3Ps?JZhQ!YxOw0IWN
                  zaxbz$Av4bxFJ1)I>fZ!z$jZs}yQQzX6N6w)M-3DK6BeD7w%zf#I#t2U?>?H}RlMkZ
                  z4~QbPGxK^`K04m|jl{)wZnHm;sX1oT>D~_NcE{&6?|bX(pq7I!d9NQnr~0c`(#$vU
                  zp|QD)7`U^!ZG`fCabrhymutHtR9W7MXYGPcC*ry&o{qb6&&I13qCQ7Y`xzH&P(yFN!V`{eJ;9&
                  z-0-H`6DEvX`
                  z-(2|)@lKZSmKc(=T4oDv%hHekv{jlO6cBj%NahZUt8W7p^%LG)ERSy8YRFC;2qtF|
                  zL2IZw_zRn!RYVmus7ub-oj>?9nSHtzCX7#qrD@mG==;NU{a1fKHfD6*;qo~ZSM)+z
                  z9O8!p9V7iBX`nxloN$Z?rtecJy`*oe$hjv@y!KfpKuq?tP2V
                  zd~pg^UT*vkw}s&4%-$h?%>ABm7lS#QeOQ~;cg>X_JLc(9Y`KZG#zd6yc|u|9Qg>j#
                  zlBTjA*@UGf;^us$5M%J=6A~hx6%o}&4T%U^zb62aQimrIlmDY{lOdqcj$
                  z4bm*8ZS$^m>xt-xY4BE6=f;zTDZ=P4=__P=b57RxRC78Hnbn1El$C?_X@rRL%v!uv
                  zYa>JfRQlocmA&QiDs6vKQP@%L)L0`6)V+ZIo)=U#^zO)6z3dUEOP@+Qmr4K1JVl>R=K@+C5*
                  zXCeV$CE~9Z_gR2tVlLvP{7{LVMq!a&0PE(*_Nw9Mug&U|7y^!*&{7^>hobo!Qm5{D
                  zv4!`RI)n9z39E(32*}Cys$S!+OHHlyx%><>--?f)2H+
                  zK{;{jxK%mSlMrxD1o$s#1afErOnqjHdSqYF8kgD6N$>~&!~eehU-p1m|Lf@K>Akz4
                  z*W!CqwBDW+h62s@qw=0K+(V%xR@nDq|JYeZGbq1zFiUJh!gewr#K6AC5)9sdX&>f365FUz9h`}u&}LJ
                  z)Bo{Z{_}+b1myVx3jsD>*aaM2p$hV755yg;=ZX#nk2$)+q!)FgD8%wa9t6w7*=i2L
                  zOg~qQR`M6dW@dqIrJ_fxUw0fU__a48@i?Pv
                  z))RGis_i_XONDNhTTP(CJShbQbxpcQwoief*d6#m?16baM(^(E>cUWb)@V7;5nR_p
                  z``g*CP!aM?8ZXT=gzy;Axr>8#6idbDC5}&r*I|)4DG_{vzY~6PS|zVtaU{};Xcn8Y
                  zs}JB0IqWXkcIEW5mz0uz`3X_TG+MKdLA|s{I)$!4M3&*tW6{Os8N%P_cJg%$Nq2nv
                  zdH7A57)g}>e5H=P-?)ZDiM}t$4yxAuz8)-!y~acveECfUNsgR5mxZOfFBg{>9xk}x
                  z*frS)jC?bEy=sO7OzWgu30G=i+V3Ca*|(;Be+xf#z-JEkf~B8Lu(Bym-oJTcwKeX|
                  z^6677my5OCQx@}FcEV-$i;lUr+eyS1p^Js@p4GeA3dMmtt_@Y_o@R`H&V#4P0ax#T
                  zH@l4Dyj;^9`Tt}vx3uyfhY1Nv>|ugS8(O=5v1FoBMj$g6$^jS)Rd(Q??mi7+~%?kXzB$6cw(~kiB=*ig1Gor
                  z+@V9TREnxliST-Su;%NpIGI}2d^HB7GbQq_m-p&Qdgb=mumZ+4;n1W*qIEv&n(tup
                  z$@c3r`1dUH^XDQgVIID#=j)UntMmT+_Qx{NjSuHcGSVmLfRcs!p#55B#)L4EsGFW0
                  z7^2R*J*H5|fu!ylxYjBC~=n2T@=_PiiF7-#d%8Z-$HCca@_;#f6FfIb?WNd|nteemdaO
                  z879E`=rK(F@L0qZ5lExs+Mmf
                  zY5lDCb{UfI2)Ox-DRzQ|E?iy=xQ8
                  zcU}N5&P55huv2H7U|~$Ge-&|j{d#`9(Do+9=&c%HT~7d#|2fTDXSMRE7k5j4%IC7f
                  z!lua$jVSyxi)js-Rr)$mgF+5LG-zMXmSPRP00}+>(4KlCAYtxHqF)EKa?b{b?hl#~
                  zsL|A#t3O>+k|<0L_PjWG2Cq|@)A672I(BE75Y%S=_z?(T><5jCE4+R#{Vlz?3UYn^D>{UhU5=@^FXP}
                  zE&-0RMt<**&HV1+1j+bRuFc`kc~l`7M@X;{Z>M;#P6?yWalN~#5YYkviQF|%
                  zPph|HJz)Iumd;>S+GLJ=f$gUz_U0u*oPS|`MK4{Q&0)wr*=;_d4Z~U*F=t)FxisoM
                  zHtv1G6OmLgo3e|f!W*#Sn$=CGXIVK_b8GX=bfVv>&}Rg9`ua)t?~=jhs0AFR%gS}~
                  z>rZ0aiRz8#;)>IE4=&lmn_+Y~uFLvYIO0DO68~p=>_1`@6#m#XCb;e|D%ik@l7Zp4!oA{M>CT6T8B(O(ArTqrd9M3Zx9)Wc^xUAH
                  zqPUa^Uy-V5r?3Ti!0;Aw7}(k(_qieM))G-r%71Kq7=y3^JRjUl9QUJHrrGG{++QZa
                  zXNP*&fROb}A(2S20PKuPb#I%x20oniqoNxUz&}JTdSHyoJM1v^R^F>rc(F_3)Y@u3
                  zm0W%e4MF!YG;_oA)Nd3vvs>XS>8(+wu~mHGIW)Js(+J9|
                  z$oKNSSfGjUy?^3nzn5ir->^gw`Andzf9yNuQTW!{EK}u5(`nL)3Etk!B$0~+JP1&O
                  z`0P%#P6_DndH{jqua_@3;bmPo2Zh2ephL&k7-yunXK6<~^By(UJ!cLcZOr$Mnm-ex
                  z3>mGsk|}6v(9OMP$$uvmz4;)7F`I<;(`jg}Z4U6h@0sw;_~)JP!)!py8H|p*nyh4g
                  z69UVZ*M6~4f9B3Dkv2?)s1!48HFxKjbTnP-EULf#jWhr`?we{COO74%>>bmK*tb@H
                  z1ONWjkov$>EK!53Vf6r{FY7y*IjjbYWxEo@sZbzHVY)Jm)XSBljQj78Q4iZO)Jw&C
                  zigPff#|`orL`39Cz&^Ykq&|3L%6(LO`HgdCE-43WV9_jC!3sw1V-p|dZ`JX5yrTqE
                  zD|+Ug46uy3m3@vi}>|L%hPP^$B8xV8ifTfURh342+Hs@h1A>J
                  zu-#N^4_ceuL{c>x-_C<3VIPN&TW-+cclVWdjR@ANh|j6!=F%8z#F!Y}YvJX?MP`7b
                  z69_n$L8gq;{qedNKFagpx?w{EJ@an#H$^o`lDo=-Mu=k4g&!{*TzY>K(%9PX@k_53
                  zGpiv1E0IlIrKzmIsG85Vu{cES76|dMRW?KdD*QDfl0xIPMR`gpdq-YHL3(o@;A@r&(Hd@NmT&x_RQ0c2}r(7
                  zwAQ@Z!O_g}FZOb%yfIo?2Dd?m+Hy0Z(;c|g|u4&K!n5ayVnMxM1?B@xr}E3Ui(E=p4idRC4rH=a|Xau#Hi?Nt*J+V{IeP#
                  z&@>8IsWX<3Dz*4I*pAXckCgPAslU}4@a4KGGASf$OX9iR5BR6+7)oByJbB+H(FFRD
                  z{x-XjEJ6~_E2}>hxSdzLv^C?xVs9D1W@;juJ5&GptxeOTW8D+ZPqLmfb160fVjyuN
                  z;_u3B0+HDcaq9iQo6#*Q|89nFKe~EHZ%9+G*R&B_WD^w;De||}*E&N(I5ml)3*Ifa
                  zU+yd6@-+lFsET
                  zem1C3QTF3UII0Z;=vlnlr$;R6@H@wIucsJi-YRU*lM5g3hU5>2M2xQ)H*j5Le~_nvXDoT^`WShJn&
                  zC4kw<*>vgPyU1_A}X1NVh))+MO7yE2Rs?a1%v?dpT0Mogma1h~KWHpxd8
                  zx&^P{yr*rJKeoBm8dFay>&QH4Gjz&Xm)yQHk}l4gq1c
                  zsxqCSibfr|rf7qfpC-wHZW|an_Xhhf?H8S5FM=Gqa@$p%0_HH)!yER~Ly2plX4_<6~kH);+BX&61=k
                  zmF$XxV_tEQX0b28tL(&C8KmTE`=X#$khvP@wwT1Z{aS3`2QL}>=WOxA{k`8+
                  zc&&|DuR+bpSYzB%ock^xBXy+BU@Jwjm1`-~sd;}VneI{rW>TTUCE*EIkoS@L;rF_W
                  z7r}_753F$nUNg(-GR*f_DHaeTaLSRp@-
                  zm9Y;hnk<2wV
                  zXnxdQb+xhxiB_NkoMg6Kn<7XYC|g(9s7iP<|DDmo1jY@FRaLf@72eq(u8bFS{P!Dg
                  z4Qu`Fi^JHR?NE0~MDp*u`m)9ikvDG?WPc1rMAm}eh)^%UNr#oLV}r$Rlb4?9O2D<{
                  z2=@LMxK$5@Yb;W(bw^ZS88IY7~1A|rT-P?vFA^I_~6UI($Us>{v
                  z8bGpuqo2PKDqk-&K4jFY0<(VFapleobz|HPGcJ$E%`g2RH<-LVQ$}&8?`HrT!QP&!
                  zu!8z!(1sK1zA>CD(&VuDCed{Pxp?uMJ1!|HXT&jI^s2~Rw)Qa5CiDOq({I0Y@pscM
                  zF)Aae?Wp-K!?z(p)`Fv9>9ZT&_FTU_Y-GSyQFepn(2rUT+2ktY-x}$$d7!t0$VIJy
                  zQR=>R?fy%-gecLCdAh9;PjzuY1`!h6z24C6=yYs-`Eh+<&UEh{-*oZ_n`7Z}7Z@m_
                  z-^o1HD!gwRLd7DnDTXQ629?kzB_ukR34r3mFyx0d4D!
                  znMrz;;k!R^7k8wb{5&1-Q(wH=I=7(A#`Nq5D(%dR-Gz~;Mbjt+|u~Tk!P5+1%D+(A}Bgl~oj^9B#FaEGeDf7KHS-#(bf`wP?rBDYzdU(s~EudJ9
                  z)P#fAI@|8rR+(B}YN^R$eG_2aNnEth{Q$jwGsv_%0#=-3-89rM{DS3Ax;p_BKl_39
                  zv(t#+Z44SvI7Ev_=(s4Etk{@M8oYi#*Pef>J5t7BsIFtUY$XQrR!A0c5&_b2mkVIa
                  zH@vTG@@1_^YT1u0DW$;I-5nkJ@mF8tF!Db`cLk0ssP4F|4U%EyeR!wNe`Gnt7ZG3b
                  zq}W=@8T-r)5lSD79n-8Yx%mA&{c8TFxSYvq@TtBL|I0qv0;W2)4R#wPafj;0RuT4w
                  zbgtJg#U{=HWcf1!6oaF+i3(}h|JYY5t44G1$2NYS>nE5?I-2Oi=VZ%$)k(I~jNjv}
                  zG{t5|l;toWvMI5xhJOC&`a>grOPpQ14!W9e!JfTc>_!c?q#SezX{}~T0
                  zUjcC6x%UL+2TX#%_;@S=AW6*CFjOgDUK;jIQB(Y*4rKh0;=`hvYSzx~jKO#t2UA;h3+_(L@gQ2o8l=VMjZZtZ*M#l(U!Gl7ugYX@o(
                  z>WBmy{?%yLX`b}f9fGcH;;_#MzyJk*HYgRcQ*!=t>^n&OD2%*^AztLx%l-K;A`Pu@m{fBaYkuGdz=5OI#=0_6i_SP&x=6Lt^
                  zFox?JNwH~U&hb*H3|;}eOy}{?v!>$B6G3v;lYqnGB>|@jVIkP%ulBqA>l=)Qb|q~o
                  zsRotSw4i6ZT2(7cqH-(0XN8~ON6G*xzvyNy)T3#mx9wX_n3bNX;sCh(4d(+QfIWAT
                  z5*~g&AY{#3wk7$5`Gz1&h!$H;LBB@}ARn4IINM`KZst
                  zfW^hg&s)iCKk7rt(M8|)BGuB06s9&sl{z;f-ireuOAc7~iu0k&)^U84pf}7rv;`w_
                  zBQ-MkY~_&T{6tt1|2?&WVgyLj*2X5pDVJrnz^|lsFX+~OJ;i3HK0hxnM|mX1BVP-P
                  z*Y~DOZ^sX7O4x1r{riCVIv8@ViYRVkqSoxR9i1m6_Yskfo8AV;))WdVGD72vg
                  z>%wY&u420&B}3OPd`Kg$t&Msh{gNB))$<$~n7!&#I;G>D&TjG=e~OSyGT!c!WjwS!AhI`B
                  zXMq(jDu+^Lc(2S>u@DrLP`dGXX2n@IM0>$Fr9{S_jag0LhItWSn;n?Cjx@X_fnNK@
                  z4%yt+m51->I}cwPwU0RSNjm{
                  zTi?QHC8Ns>DMXu54gJo?B9y&QQd6m*dd`0t^7geM*)AmhnIZZ4SkH4~xYL>JssV?(
                  zr`0aq8CDhn+fnPzNJzMly7_ElT9zR0nHPGo5Mh)NT7j1ow&ld0(j%P&a0Tod0(pX(
                  z_2aJ2SBTy!x)kWn0(3gpMgKBk|IrRvZUo@R4*k5*pmK1_+t-4$ts~XWS<>6S=<;$v
                  zgd%}ta{+j+d+;X&(_IPMnzDJ}`%BRdy2R>O#+^y$UvWUVqL-5ae%v^$#UX6oE+yqj
                  z|NMlO&%WVX@`N>&LL&2&d8C2H$W}iI6lw+9xivYW-KO9*byj?6DF6wbPaO*(2+tUw
                  zyQ*96XH)JHYa#5`x+7rW3YSZ}q?Bh2?{O?28Zhc&B>_|Ed>yb~&M%pOaEQEnkgs-2
                  z^Ewh=In=nsEdNb$@s;bxQ)+Q7pa5h!J%_dqE!PZ=vZE3bnR3#(Q+L6oZj{+i)aV_w
                  zlONY)+u!C828v6|8v9&kC%=y8$nB^{WCutlEQa8;r(c%Ktwf%4P#f}}gndrFtNWx{
                  z|KmdfsP)mD4-XGXe7aZ^V2WsKC;f%+=$O9@PteN-qIGw%y?o+jlD~oP(~xld4QnC3
                  zp0W_`&V*Y6v)YWB_mM*!(LC_nza%)|f3GwD%2OR>AVX{XCOp2piT=mGGyLAhQ%-f}
                  zY!G_Fh;k_GC?y&e=CMfc#rMdAKfEF?GgyT-kes-j>entXVg7ylKktEcynh$d{#{J_
                  zcQNhX#k7AH)Basd`~O-@yUKsrg|h?%N2l%jEakxbri2tvN6?g{&eE>5{BRH>=in>1
                  zN`l+l91}a!5J)`sDo{xQ8pbT0og@_&M)ZKGlL2+@Kk{8->Kx5q3tB~*kBH)tkeEJz
                  z&e}nCgnsFvrzZLyLY!072lqb9RroS
                  z+sXqWu?cK4s(Z`A5YpfMf9QPSNnL=tn`M|OLKE^Qqk+mX#|cdfNV@p7hgh}
                  z64=UALA)@Kk15808UeMl_mU)MhjfKzc0m4K7e$GH{v;za(V!=4@sYK{A_RnO`YUz)
                  zp*+reKZtGtYqyFj(?vor@0cvX2Q9!rQed{uKQk|Tf0z`JDXg=18fOG*7yZoek)19X=+tyAre@?*3HOnamcFVf
                  z)^60{%-D7>e=g7%Gwyg!x6nuv-h*erxlt--{q@c9@t*qDST~M*OexptcN0XD^J%26ptwT3Zyeje%{gaONPzqb}E&LAoL@V%x
                  zAMkK;#KNCy*xC)jEvjL>UD>$|Koj1`3kCmU`@Q06PZJ&OhlhTmPRkRo=0*b=i%K&+
                  z|JtSb%joiaP2)aCADHh#E6+R8U->LQA&t!`niZ6V=oYhgHVy|7y>r3x=R*l5Pj~K7yJZ2&H`FJx!yrLBH
                  zC{wcq=oJ0Um-hRQNl0G6Zs%Vxi(PCYPpT1!oiA99#97=iB{hN8Qd%P2eE99oM^3H)B@xx@@^zUt^Vhd5^$FThEOV7{zJx%-
                  z7E0%!1DT4p?9KZ4f;=M_sJ7g)ek8nhR`UIwZa_c|@NxY?*|ysaY9%Z3`+cf8i^kuY
                  zZ0-1dH~!dh>w|M^Cve&Lf7yFzU2^O_ZU&~%G;T%VKRvOMrD=mwUz&b7~M
                  zRf;?GtncHbym<2lbgv8P6+U119_VH+h+)J4>WpC{XSc;#4*v=H-u!6@j&Zm>HOt}-
                  zq9^brYYM$!t9yxdFnS?z(-aA#1c;)OPHGuWJLUWu&YbA1+XEpy4SVeWos@bqw}?#J
                  zySZ@S}i*@Mc4a9B0H#AU#
                  zKGCpayex%AkBTSA?k{?7sF!`e-Fu)m^UK0zWCiLlQd~Q+C#zTWLrG=4Sk6nzNN}3p
                  z;Q~*3_VHawba}d_M_2^6h|F4fW2F(wG;!_omQy})>zvf^6V
                  zcm}KFB!K_Z1bxX<1Wgyq2tB3|A-4SiT56>!tm^nJ%Uh~(s#&c6!~u^j8n_(9B*Jyj
                  zu#q}>+qqPatQ!d4IBnh4e)gNTtN&Tp`yLV%+NMLBI$hVb$1z-lZ<&k*oG6##h)?Z5
                  zL?K$$)Zr;`8jxPYB<)roo6ZfvhTRRMr6pL`L9@5cz=i-`Tbg=5-IFT&F~C|2kefDN
                  zqp|Dt(3;-6YvWXStK?M#W7mwkTois#gx`)c?oWPb@i~V>T;R2MG@Qs>-7Rqs@-*0Q
                  zkk?J)l0!8q97-mAZv8<8GR_G6e?Vf;<4MnIv@Rs6sxM6C!vYu&d2`L
                  zmBME^?aD)4`c|8vfz
                  z#yQv!qM1)@9X|Gf?B4UOL4wdTA(*OIsC6?kd}DbY-?u}Ac-)McjZ;wVT-eSTfe
                  zf?8-D{U(+vs`u}=HD{RrXV+t_erBBb-mbqgY%gczdRZClGKq~}a++&KzR^j6!IG_&
                  zeUr{=@v#(D_M;omw-*{x!@MumRsk1b8!RWhKjg1{-t`PnPBRC^3#eJPVFr_>?^^9%
                  zG_65}qtqr;CgDO8^CcO-&U9R0y&{X3HqVsxo`1qf!*t$}I(K{**M9AI^t*3}cXvg-
                  zeL!Ow=h7s`z+9$krzFAG@H5DxPkxrhXwm8Swl+{(|EKo9wGQN8_~zXgI|C1W9FNry
                  zBiglg>rs^I*2NcQK=K(w;rj1waMR8uRj4SdrectMBXbFX;55y0@zvsQbryS#mb
                  zYh8QuSyV+hADV?{tkmL^AwWD3F52D3ZqSJNuLfJ)nRSZA
                  zj+njnK2?lJb$mJDS#CAISbM5jcG03U-{$m3!?NJ?m4XoD;sY&kWrJ^T=;%VD9i+;l
                  zkAYD%1KV^fTfSc;Hd4s=c{hIk3^5POW
                  z(C27?X6{s*#pF!T6Ws5EaKvYk<&GB@4BR^s?d+-x_@Yf@BTlnGv$bP2w*xUf?j{U?
                  zx|!Kzi>9=_`Qqx;$A1F
                  z`_Z==dWcQWLk+5*r0_efB?DcxxQuzel|^rdE}*t6=1~U$>jpbtP#~mr&h_m#8xrFJ
                  z9mub<98Kf_q!Zp;Nm$}%Vd(QujJHpnyZX
                  z>~k0dPym~GC)EkL_$tYXp0XWJAh$hMuKe-K4vZAYu|Y=|Y7d^Ym(OwicoqbtzB!#O
                  zJz)fX4i~+EdzB=%n>Tm)kpxow`*!4fnuz!r0dP5@=5grD6yA?Uem*|fIi@i@NChUP
                  z;I-cT)+c!KQe5sfxU|~%>w{!}b)*68KH$%i;I0z%l=b>Lr_n&h=o6>nvKf<%JOw3X
                  zha!#|z$k!rg=7tx{%7zdyCE}*9K5m&Tbp0IrHPE
                  zA&mt{mPieB-$oFfW3;U1ahX1#eRo6pJHz{#xp@!sjGi_6(`(y|OW}}30HhA+O01Qd
                  zkg9$hENePnEGwT{@_S9_XLsiPIaQ5j87M8WNxF3ciKPHw?6}>cd4v!VA*Z=lgkaRi
                  zK-Y}xv|9b46d#Yr2j?EV?A7|vjg4=)G>K=fTd_Yii(@7)-d6<>rc#KBS@VMl0WxR)
                  z+psl}n|C)ww;WC|CpVJOh9kpPVeu@skX$d*M6?Y?{>}-%HIxhTG`B
                  zwfCJtO}$^YfFeIdKtVt{NJonF9#j;hO9@D*N(bpRKmb8Ny3#u$odBWt5GjHo^j<>m
                  z9Ri_*cJuqc^Uiy}-23T%yywF+^JH>n&Lnf5z1P}nuYDWz6nnLzrL`O$8l#Peco7{
                  z7H@?R_<|tnUn_L^A)$AIO}%lhShf!3n=Ym9uZ-o=!ech8dvt@d*suK%BNzJ
                  zel+xT#yQJ3(^Hl|tw`-r=a>8Nk78h)_EzuB(kvg36#)TPYn8?Cg#l@{8h0`qfm^^q
                  znWdiGbYxT0%t*osP}xV5mR
                  zj6r4P0(Qt&5N4_;>rOFV9V+JCE?sIkr^^Bz@4Kzzs)HzeZ@WCo_qeduzHG8GVF!Pn
                  zjoqBq3#Kd+%5hSLG}GpH6wsjFNZ#fU
                  zE|D<($V{ZG=7+nb_fSpCizfeWO(LC7jQ&!x5?F>lMjxS2rGyyIdk{Z*#}?%E*VS={
                  zGplDh>+1E+t110Gka*~4ZDgJT(XL%Ha|9k(l
                  zEOLG*2&bT9(KEk`vtp%E7^>2`RfZ^
                  z&kJu7&joR8YHr#7sn|iv*B%yt|7%eMX(1;{2;Yr!hMb*^DAnsLoL8X0ZsH;8O)Rr%
                  zJRk7z<^3-WBL~L=LoCOG!%gnmt4m8S3)C#Nv9Aap{LRs3UZ{E=-G-C-hCj$uyu9@F
                  zTEdD-DI$OP(a3`R7ry*MFY<{6a+0f1=ePxR##5O8(95{7c=`&l)EQXub6V)lEoIDx
                  z%GBcf7aS%niWN6BPR^=vmX40Eu1O9GS?gFtxqv^32rDp|H5&&*huW8R?atz>2eaA~
                  zcIYm}+MAsB%`8mH+1asrbvhFCLq-2IS=Z)n)x?fsfNU6JS{nyoeNBlBG-%Az_$=mn
                  z`F%WOX94;MuB%XVbvbopq@%DuO{-b&m7FM~rG#y|E(TMv;4C+pWu83Y9fZE02?A+?+Is{!+OP(=
                  zA%Ae*qRP~b-y4B_00e33$O)}EI=Y>$ueTy#mnfF8N({6x0MpLlb2gja`?}AK?ElvJvl4#szm7X)<_|MtFNRY-cC1w;&LQa?I9ca;-&s*Bw(A(9Tzv+GS8RiS5H
                  z2w+iHGcZovv!k#7psb7F;UUKFfVa^Z|@gAijEqrptOHogQXOym^MC;HD-uaSv`PkxA7gY%GRrC$^
                  zWuByBOZlZ+C)A^b=2BBziT#^8B{fsMM=uZVP-wKw4W1=y_Pk_+$XK%oq!}1xQ$Y?M
                  z@69t5A_}!p*wr87u>sj8Ng_7&c_HCWLve`gU+#SGQ~0w(2TH^4aZ_c!bg>B7?#rvS
                  zLjgf`je?=dT{^a#^68>A)x!a+5D@KQo0uK^OBgv{sneg;wwR2Hp`Rc9D2ZGU&%|6d
                  zo!s1N3+LxZ|E?IDg?&XAu-E{FXRIrX2TrEHQ;xw8yht?xN&)h5SdcTbTP3|DV)gKj~fwfbUV#
                  z^8}!#{XndOHa7*yLR`zag1lO$?b3mG$(ug~C)b1AC1!)K-6To0>OZf&wV#*@CueGU
                  z)c~v%ba-?{*}_P#kx;}^Fqc8ETlFgqduCRyd3E)Nru6j_!OMv@~
                  ze=|)z@=|}Z-H;xY`Mh_z>bRYU0w4UdgSF-hS4cqdH3@Y$^W&wKDT5VOXMG|e#7R8K
                  zZy!AWJsTOa?yZpZ)8f+ThnbTNTs@I@P0%XX74qWKhx_;S)0-3wirmJNNBgFGI4vyN
                  zwy}nKl`C%D)B6#++8(CjE*eRHQpOPmAL%jErpT96lah}mKNV!lf*X^vA7gBm7oXCe
                  zy$Q^=@lu8?MA9JNgsKW8zeF+uug#qheiUdGMF20~bTL=peDqj_Co^0*c89jj^&q3W
                  zeYkg3qKR;&nAshOrC?Ersj1PZ?io-(KyQ4Y>ur38xc4m-6563|%!%wRoq-sC|DB#7
                  zgIkCpNE37@-bJ`MmNxsu?SdITJ2Tj5^$S#6o_;anJ5Dbl))@HMZcSwWmxvs%#)Wd7
                  z$nl!%a0o0+E44JKdKCBj`8^Y@vw}LL;VzTZa8m{~f=
                  z?WL%pDOG>NVszi1KT2VqUi;)l)1%LaBgfh7st@D_EpZJ!`DK2MvvlI*$pbJ&2+7_r
                  zBF>w5;dvd-xe_Dpz&tRoLB-phSB_WtiYFg?{4waSgG|s#`N8V_*NMpf^h9widtFSC8Ct)l&AK5g8Z3Yna
                  zqAF0rOgtT(Z#T{_iQU#`Rgp~MwNh)*9jba~M@GM#;Cnf+gS2kAnwKj~d_l)f7`OEy
                  zzd9UhOy|Ajre^$`a0KdRCC5R!O5mVsiinQK5<4}guU5STvLp&+)G9~ZVT_{<9AaB=
                  zKhRoNm$(l%2}{evWpJBd9&UEcJLecQ$K8Uw+E-7{Ju{QyZfZHkE0#DD#Kbigj(!j{
                  z_x0$obhB+yOsH?_d(2ewFsR&6v>UpwXYbKrB!V{LEh)^
                  zjbOww(u!b9qtka@gsQ<}qyGt5G}rqZYJ!j2Tq#zT)ymI&p+n5&uM^$n7`|7V7w30v
                  zwQco6Sgn(68A*le<&+g^Dmy}$g?cq1a0^AZ~VY_wxXqnUZgGMc7%xkJvm1^W>&`J0KIp!#bdlvEd;$`({o!SnAr{U3uYKiPV0mHU?
                  z&J(q&I^XB*sx+H>K9>pDEwPBl7%d7+GFNA
                  z=Lzb>G^v}+y%e*j^%ljSjOo49DgK#JDr%nwA&c9=+L%<12!GPr2?
                  z$EW(a@2-gI4F&=4{3fP2(sFSvmI?!hjN=k)#+I;gL@u*#@-Kd4}KZs>`YW
                  z*?gxZcVfYbuOOpSMLidHCLGzVp8Cs4x9-?MtmCiIhFOW^{#%9k?#hI`q~Wy}^!ozM
                  zg~6Fg4`xiWW9^!S7+0HI`#L}R%O6B7?xt~rIK?`cMlB`klS_`RG`BQBV~YA)TLku#
                  zrD>fBj3bz?<=+Zjv9OO;
                  zSL|}JLWXB9-mV~$?vtlJqw&;uJo_8kgP7@(Byg{MipRMB8@Od9!0-RF{2x9%M6AqU
                  zpBkD`5fF^P0@sRoz#oHzS15EAlb?Gi$Y>@{LP5L?WShEQjWf%w-~(lbOgyZC+xpB)
                  zf{z%^2?!Xu|D6%AV2thGdmYe}wdQQ9o&UBaraE59EsFLq-bB(_{--Ln+{tA#c3u-}
                  z@26eU4d62CR2Z7i$I7IORLN2Q<09_+`ILg2cYELtZXxIwa^E@1i(yq-V;+g^==n|?
                  zYdiHR>&E-mG}IECPg~~?{8pxs+26@rKxA4IJRNamxBi(M)a=H4vEg2D>Uec>oR+fA
                  zcstI9vpE*`JwFtt7D^7icP8|@Kn-A&(cqMTKq@#ZrAw5w2C%?vyRa`cfe3%mx(@ff
                  z$CISxGIx7tn!*sY*L#^%Pc9dQ$u>>C4VW~lnfN&-P{-q~!;2McFeiD{sZsTyp?aoC
                  zyOG*F54m%$=^0R|Z)eO*-RbB~YC75ECTvZn43Z&NT`073i4>IaT26K?a7_9#ApqmP
                  zT`zb7F6p`m%*w+DK<(4rSiRiO`r8wnFKH|`(GciOvru<(t`2AQ&~G-s&BNh$d5$=o
                  zl<{IVQzw&+GQ8Laf;A@wL2!^+n$g%HK&#>6Y?^WtkUcU9uM=05#OliZQI)H6!diEg7kEI@-K
                  z7alU^HUpv;28~Jf6^X}w!z|*+i2)t@C~=0eTwv6W4)wT;4Ib$igoHoa?2NszY|=R0
                  z2(H0H#8gu|1qvry_h*l2X`MZ8@#e>tYtLx#5Qj7Wb!dL`TzN%;8o)$9ccQT?Yxpna*#}0%?8MT=KL0I;^G-O3hk
                  zmXVt~kE`|AVKvMiS6mvGr&4%zma#bHc9H$KBp`cyyW&@CDckWS#W-&sRG@tJQ7L5>
                  znVWICgz7szuLH8Y0Qdvl``BxY!#M=x{V;!zfdRR~DC%bE{!^%sF_)C~fNNSoaVC8m
                  z-w;yBS7)HontJQdaZzV6>6tFI^{w>`k8sz(EvI47JyY%5nKGxe@j&|PtDL@|CUL*T
                  zAu`a3jfT8ze-
                  zNxdKbx4k_Qux0e2p5<(_stwUfbKvYgSPTKPI=sg`J7dzTytSNS#`){7Pi9UFQ+leZLdrj;rKP$tz2C6#c^}*>A9#I
                  z=bxMeGXs^Zzs5^3xGPo@ayU1t-c_wJ@ZcFPQni)Y?hcUm&>^;%Xzo2Q8BRv?T%mw3
                  z_driEa*`K&?3qikfD*by379w)@5;J_xRoGCP6b|ruZ~bo
                  zFOHcsOa47neq6JM@kM}wCS0t0b6P-2yB_lVAR;jm^JJ|gU0t%zrn)J#g$j7cIq$MA
                  z(v7`yCW6_1*VIZCAI~VwsJCohf=J#0>du~E)Qj_4TNz_SJ`B9;7sp5+k26EH1xWDO
                  zaS*7MG@tNxRs#`WCjQ4lYNIH@GIv|sRMLcWm&N-i<+I07<(y8ALr-0?>QL>O@5$zU
                  zEK{x80{JA&{}MYWYJDbDbqi^ZOP4&#g*}{5-gpzc^1~|ZAx?NvW(ZU|6y>jbD_w~N
                  zCI(Fc?)61=*m&Zh9~a5+^s#rmN4XTVHYbF*A=6*4{n$lIs;Z;YLeD|61?NVpss_bp
                  zeV9Pg#%v>j)@*Kt1^Fnr2P!(v<^2O*g>WN-wDFZWnF}=oY-t@^{3~mngLYKV(N1el
                  z#o5Iyy2e9HDi^iE0(5D@f*Q@a?B_bPh~ygv7D{r|=>I|2<);-rP=~HJS+(2K-
                  z?K@LbQud=GaTCQ4%sUK}PkMjeE}D#B)&+mfmb$upsH?pA;Qn##bze^hur%AxD+G}(>Ydp}b5a$WkI0Y5do@}Poct_VG
                  zJ@wo)vqk2^nOZvfY&^GX$QbkzZ$MtAz5c2bP?fA&?yj&K5pMvGugaNdzeari3iseBkY+jXpK0o
                  zcMH_43ieA2dQHeKj;#~-w?+!kz~@p2HL;~yYQ6XURjDhK$lO&Vv2{CV1>(p#a&!#(
                  zXzuF`o3vu-8(M0}zP5orL==q+ZbCqzr^V>-6NzMBf#4!x(i9~&d
                  z&UlJtM0G8h8nMv9No%`x1;RNr`K60~nqTO)4+MV>HYymb;c^}t&hX&a1#DAqdq^I^Bb-aKndY4>(LAT1vo&!XnVVqc*2re&Fp-f9>!dGM4US{5*+BP8e6qa{
                  zN7)`#la9m(rX9JQ!y*krg-z?YfNF!$m6eycr#WnGaW#hf!o923Pzrgh9@&Xd(Os1S
                  zd58}2xJzpq2ZM}XS&V%pgLjOZG|N!YAt~g6pqjBl3}b@=5{&+3=OmLGY>=bnrQ-bP
                  zY{r#IOx>zKO#T!4n3jfyUH-i>7ty5H7|Tl79st|;k*U|>_vBdB(W!?|F2uBEzuLpu
                  zq3yc)*BE@A-!R}yJ;PlS$A?pl``G3AmK{DEMziNi;d4G|Op??mFR53=Gs099baOoxztNq)Urp`UVX)5U2HioZB&2GKgm`jL
                  zmqjJ|ZCBcSHL+*0lK_lkFz|#Y8=oQkWlM{S!PWj8Gh0-Q{fq^7X3Ef1FMJ
                  zndVaIWEGFiY31a$X?sQ*vyV?7+APg%?9$p7IqHEuLb=p4xsImyyO{w9UApn#OJRNZ
                  zf@HpqDnDlZj{VsZSF_7fth(fJX3#s^I$=Pw8~EWY?m_Xf10acSNs}|uN|Q3E&S|EL
                  z<68@-e8UPAQ24502@G3eJzSf7CBk9xZKq@~>`4lPmZgmU>OIKWs7k3}pm>(d2uMD=
                  zvfR0iH2LF;{Tp=i4HF-TUL0(5afcgRw&4
                  zJkKsBZ}pHvQg=a^L^=DgkPKF(l9Mu?z!OV~O|K~6Ep1o8m&I#ly(=5?e~**JqX!KY
                  z4%p93Q|(vbb%axu8DB*O+x8TmzVbVLyGb~8*k#tX{VTdETW$=*(z9q77(p5)EqC#;
                  ztCF&sEPHpnS@9>pD-pdT<$`%y!J7#`x`7#bt2AfNG(eKy3VrZ51;LBR8whAyP+4vbygUi{S=%R3-1
                  zH5Sf5I%14T+FavUB=L&wN&F11=!~AA9HAdaKecmMzT*@baK5^ICNBEEBnc>W?4Y*H
                  zlI;Fu&G+H!j0TegwhkgfCu=`u)lwz>Wx5&T1<;55);Pu~@a*%+Fpj2QYo6e}g_$Mx
                  zA7gn7dE>vxTl11R`k{ua@I&u3XLW=Y+Ll2
                  z+n43Vf$QrZS~hPn5SxLwbi~YxXipi730HZ=72%zbaCR(Fk0=aGMCkqa2$5su5r+ir
                  zLDxnfDaXd%&EsSCPZPHZTqu~^|495VI;(ST
                  zzd+SGm*EFRHnSqb{k||mURrzdHh+Kpa(L$UncaIKZpbZ41=1I#a7XLNSx=a}YDwE=}$JcMu#u4h^D1J!mk?^ase}=-IssXg2L_9m+q$m0GhS<
                  zg2Oc+dl8usT)T4vHo_b5JWmtU`UgVis5j9cV|gP7GF(}#dB+43D!O<5e1RurZLpj1
                  zr}M_$(OMx?(YE+p3r+r>ENnD-da!%3sbUY$%3*aE5GCEj+?vL5hn4!}+u69IwRvS`
                  z`;~4(dw-e6RO6d`PY2No_6xT$RPL~|*}dJRC05Z~(v+Jh5u54+;i=8bINR0A`0bZm
                  z9s(W#3JBxUTBlAcKEnzmUy|WUfJ=|}Un5I=#`hm4xJSM*LKnt1d13=m+s=WhChSx0i
                  z))~lOdfZfqY(bR~dx<9F5Mvr2{o@g0&wS%QMRJi`lk~^^FOH)kb~)f*b_~W-%4S6e
                  zbKJ!5YN?{~s&@yKlakFpz>Yv*4KiSI;B9XD^scd5Y&xPvICmo#uod^P*nf6EXbnS0Txo10P>(KGzGuFImOoxeSCf&%W~eQ0y7%`MZ3_Ml_DtGiAI
                  zm6~Y5GG%Fs)lp=Fr0Sef>{FQ_rH6YtyHwJ%Exy-nSF$M$y77W{27Xg=(MfGvB+9YJ
                  zA{ccilU-jfAL+Q?xj~mMsn59h(a#GG)=Oj-I)Cda1uJ2XA5OTpKhP$O6Jk=eTc(b)
                  zGH#*~$U(WZc0Q5>HMXQ{9j4^MY2%_SJtgO9;v!rot0sKa`vW+`8+t5W6}Ba;wxPQI
                  zhYJjzm`!;AEw#1GVZHiT_Y5%on_e5JyfuVRB4;QK7*zHG~e>_o1?uQf?}5rp~T>f~|jGZ-T|mrY60Tlo`M
                  z457PqDtcFHpGft}$8B&U_y>9gNnDX=z2!;($)3g=kbA1mihmw1JV6_XtFShmEeF{?
                  zwbiXLL#njGH>B6U&mVGzYQ<+Urp-A0G1#+WfJcYCUKi^tmO3o7ZpC`8aO98n7$s~G
                  z_Oa9LLW?&{y(Eqi!VEJHh*|KQAkmpqdis}#_bZ=vBEG@SR&tE)5Col&&>bQy&*ok5
                  z)b)nD8N)*Yg1Gaa0Pw;Uv~zj?2jfNShP}(1tSKAzvcdMb-_O|oyV*HaGpg%SBl4yg5F(U
                  z2nb#h{5wV!&kymoHiy?I3;)ZBA|zUCfoE;9#qUf0Bo+-38LGLVX~Wk>Sn8cDim&*9
                  z_IRmSM1?UNcH0jtpLU7i7fsH*gRf)bxryj~hdJTz63%ezQ}I@RI_KHLYcVP=row{&
                  zxgX0n`mhF7xcA)ww|`Ycli?x!La(pSkEqh|SQ^w&{e|DJ4)6khLR*@tOTYFz3oY`^
                  zU{_Fh*%R!%9e7L`+Un9+u7TOn7X-OwuM5f8c$h)0n|KWbZE9dkX2{4Gh&m}vjuxh=
                  zEgKviNiz^#Lrbuzuv-p)$a~%;AmhD6&NM$~Y&JD5)F6r%c_?dTca0`HPHv7A_|^Jc
                  z5X*RSMMhF1)&B(wyO`Z3S&yC5JH08~?ASfS4-JD=e-asTokNlSplOR-Ec
                  zA-ylSfvj-7>aQ(gG(P2hEP=9b@A%S=L*V)+t}zas|CTGe(WzV^0N`VGg~&PevyO=iEq{IwTCO#Df}52_`gJ9J;#
                  z9T{#<@79##h|Z+8+)4}3l*yyE{&m4BHroHCIMh!ku7a4CUoJVl
                  z*0ji`MPeeEGV}Z*4gGm*e@>aNm^rcMpg7O~+7f?t+@gc0L3Lvp$!qZv0qH5DtthMG
                  z9en1`kCWR8H*fwK{4<%&d$(F8*gmST$?mrOpZj0Sjm}jSpPjEdLT)z%<&^h;<`Zw`
                  zqYIkrT8oV~2$~Fed}!Kj#d|>ptbUqF`L;Ai%kg1l5g&Dpc1Cg=Zih>Q
                  z2U@)l?y-I1=v&k#c?~#-_P9(I+|sOYlF);O72TDye){wE>wO*dJ`4Mqzse%(Guz%Zo&@MQh49JNPJEDx^*9=n_V!iR|w
                  zGg&+kqZ3-ccKjg3?YUKjZHfafu0yL2bP@dAfd>2suN)@L3W3{jydRD-FCqTD3ji?Q
                  zr8uzHlze8fwYc;SXGENIum7fSE+gZ8#3z*&gS>;D;Y$|BWEEY`C>u7vmam;uXXp2)
                  z^M?%I7vmX^`L1xxlWZ;GJLqDiaYnJ9S|5A2opP1~vSpawa*kcnd1@3dqGW3O)k1*m
                  zpZaV#?Y1JL^vZ0lF<6zSva!v_-(CKX;un(dnBsffOt+V+31+RAb
                  zK6pxR(%t!L7u_VQ*B0G!)t`{oxTAl(xMY#`-s-|b=QwhlHl`klcTpNZOI!pL4Jr+1
                  zLzXCa@dQ!AOdXOvO%j#bxAP&SdHw_|*`s%w?gAdGS{dwyI68{H$8!W?VBhaEw=NeA
                  zZ3v3&zYjkP7@0P4b?y53Sk~#1g}ku)$E6Tq`G@$rN=6)Rn`58o(ohq|ok+|CkDw$X
                  z2zq#aamZ2D`Rd22f$f)Qq}$>W!P#DIByM*;uI29gjMy(HmuOMFqGZ|_Chf?8o9idw
                  z^)#r+;zN~Yb3f1L@3H{%s-kW3ngSVXg#h{Ne$80jX{*_@Tejy(5!Sty%0KwdZ*UNC
                  zaG4`iPV6$AYL)7R8P~_Xe?D8*&heTh=AC9qpe`|%<;t!{wf?UhuU!Xx@x#|RP0(`5
                  z
                  zg2{uJ{!CRRj>0$ClE$7R+^JaHI3#7YuG;KP5Qf7L-{vfuPm%
                  p(y57%;O9L4hW{5=kYwL2;iLB4Eb-rk|IyE?yw!YD@!CB2e*sf%1Uvu$
                  
                  literal 0
                  HcmV?d00001
                  
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area004-v001-MC/word/media/image6.png b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area004-v001-MC/word/media/image6.png
                  new file mode 100644
                  index 0000000000000000000000000000000000000000..cbfc8ccfb1f2740176b40f5fbc44e79aa12602f9
                  GIT binary patch
                  literal 27153
                  zcmeFYbx<2&<3C7C3xy(umf~(LF2$`BcMTMGDDLjiV#U3_I>Aj
                  zcfb4NZsz9xyk!_By9vo|_IaLmwlWCLN10En5%1DSJJpcR2YAO787{yLf!w~@iqwC-Aiv)TMLg4KX
                  zq(p^P-R2LMklj?paFJG-^R8b>e)D_hanf?V98;jbrXEl6DJv)B+t=5sVQ<1hLSE-{
                  zz1VA^Z27q?^X(fM3QAt|W+uDVEV|U2m(r)6nLFQHPL8dcT(<}RGk8;TqT(&VBnJ$3d=?gRio0Nw4RSKzQzFrb0vnoa2(bC1U;!KAdtkSr
                  z{x@LvW%Qxj8@9yQmxDKODxXYGf}N3-04S8c1au_~&Y)Jziw^b~>KP)(<2!p7nHlo4
                  zx|%VC3#BbMkiKmJCOopz%<+Lz{6yq=Ie)ZOF3WwcVCTM7_a*THuB0oW&%;*Ua!_>i
                  zcQ;SIY^|AZ78=wBW@aJu(EBy+ZAM;8AMdpQlHKY2cl%RkGf^VoCE;szu3f0(Ezbso
                  zlyDcSr#kYh$UV`^JB{^#w)5fVPh;5(g79B5!{lEsIbXh9RD`H8)joCX^66_eF7O%t
                  zpq{MQ>t)8o!eV7{UtHdWyykQHwf1|YB*z%VR!8{x%LNsU0#8_|k){6G_}d#jupFL1
                  z6&+0k_*YS%TR2fQCOn0)I}-h9b>A@f0Lz}+iTh=z;9Q_fIii74Ggh0K9!Xof2v)rp
                  z2j>zT6Ma5#?qYb?Ie{sGcxPD5Xf#@9wwig7NIy*gH-F}0Sj*&c!*l642WchvMjK>ENI9==ZPFk83{8>us^N$6097DqsLsdnb
                  zP1sHWVzq7IYojsJ9r(GdrnB}hluUJrv5t&8`!mCghxK>BR~gr9-CJRqEbxpLaP1=g
                  zRagB{+Xp194&MKr8iT@{dVU<8&iiR^sk(km&fg~a-jY(atoF@>DN(NXci0YE$TZkieUA2LQrG3VR(prr*BU9+s|*2A66?Fm@^-G(T;L`j9p9Fd
                  z0;}l1L#BaYTaG!(ztSGY-(ihWuHnU@G3dFYL=bMWB2y>k84B9dVdFA&ul{2CRhBEz
                  zWVO4PO{NBJv4TIW`kSzN9KLwGPSPXpxDOmKsegi}R^9K@!
                  z;YgkhsWg`f$)JKML*;E8M`L3|By5sbXeTP59pU#rSn2b)EXdTw*Xh83z>o7yR=v7C
                  zZ_MWtVqn0iV7fZJtcRWt$1UJw8%%F-86WnKVtKNd%(D`qw1)nfKxBQ~dB4XbbUAM=
                  zP(aOyou*y=z13J>JaP{FjDZQwJt1UV62Lbx?kaOPD|<=QiT7TwbwA+JttC*k7;g}Had`m3UTXZ{
                  zvwBwwI&06S#CiiIF@rb1`lba5Hcdv4an2O*ecRvvd3)!0S&kF4**kh4=ucN?>`fFJoQ#OLdhLiyX06<{Ze#M#kBfU6Z&y`h
                  z4DaPn?kjB8*48Xf7yEx9zIH#!0;McxE+wM4j?0CZm{7czm%|R{h{p;{TEDEga%|R-
                  zz{az5ZK!Apk^|$?n>yjt&_83<681lXdJI=ri9OOO1O+wp8W{pTLPJ6_Ub$=;e{D2V
                  zV=@orLbeh4I<^u6o6&GR+8jCYR}ieo(_^=i6wAxY%W^0eJMG{5sl^(4ssh%ktmk>j
                  zj{nNoc$gU-L{^1<`+H;@1|`7)SL4%vtYvwQ42`a&D>$QbaJM`7c*|m9X#G&jMO4mL
                  z5s;cnOmt|?>S{_^x&_&*ncuGrFXka!1c5Dws?df{XO*UIw#X=Q
                  zXgju9nVBW!I)l;i^XLx!M<)Ga{V3PPn_H!+C0u&%w`J6Xk(zjC%_b04NFhbLqQoEa
                  zAy46wbz5q(-+~a`NiTiy**A{1lDEIEm`(MKZA^V>zic6CUk?b`?KkS7ilZWvJQ&w_
                  ze_Q_UHa&_~>}3Fy@I&8LOO!+CNp5RqNXVyZ?w+5(xA$*h`8Q>f|357iU2Xs8r)Se1
                  zYkns(G<@$)_Mcl|<8<7TaBS_CLsDM8KXw7?w)gs{Zj+IZ*SXUNg4#Qkl~1QiMEoDJ
                  zlZ;a2Gb7|LoWbz9pYCr*1kQb|7Ks8jXeo!H-ebqYJ>*8LmkGjFH)8nThKB6Uq03^B
                  zHuwWmso_Ygoz9twm`LDL2g+|$0SOn{=JA#{hleCbrlZ|q9&6QW3Ba&_LlaSY3pwFT
                  z(^&B$4Tlqo3`PO>*`?3s;94H3!s8j98n|h&Iyxj|Fr%UA?MRw8K|0?DzZP#!`1R*W
                  z@PTbcQha>Ci7$U7#{qNa0t^dhU`MpyQ1{1oAxMVr=B}KMMh2hnTlD=cajQceuLt4R
                  zvqf&JO{9^z_MMB|1)4YanBuGXHe!loqv+K;ncV^1JCjv$WBEqp{42#-?%p!b%^?kM
                  zhbfo@QQ-SG2Tku~x*5bHm!mFlZOGZ^NV-97r&p;at2+ljh17Mvbw#*6JS=>+QuYTO
                  z5%?5+C#Pl7i3ItFl1Ii5_N%WDwND>q_W@JYqi52$J>_MO<&xT@7{*j|ChhRCgOQ_?
                  z04!3_PjFOqD`Hi%?&e#&Ux9%J?ykpF1`m0ivkiP`-C=GNT@+fBE+;6xHTb>uTNVua
                  zlLNnmA7LG1tf|ABlF=$Pe`#CQFQ_Tm-1Ie6i#G$IS3w&$p{X8PV2Q51Ef-L)cp~`%
                  z}L#byWk@BKz-$;OAl^5lH&*{JI4AyqU|NQy$kFhU)X7pHC>@*s`Uy)RA
                  zrwd>2yv@~`>G)p1*<9fyhtvv1WcLy9$IWEU2?*!EG2fO-*TGWm=loGAtG@cED#nbn
                  z-8Xjcl>ezUl_WgzNPYi$r7nNXl;#bbw
                  z=DzofV)pM|2`Z<23WWL_Xj+bNM=WzjW_>*$&uPC^O(=6|LFqM!vu|rB{DJQD?8>EW
                  zsP9$yodfi?Wl3)-i~b3?99i0bh<;33@W`jLI>E}6aol%~51bIDD!qNucyJ@0P7eD{
                  z>sv;RS}+_ut{Eb8==|!7UsA@EFM!u>lV)=N%ui)1ac*#zbWGLEQHP?*YAWxz|$lLjg*Oh_NOAyE262543_UhJ=%r{4G6
                  zj(POwn=Y)zFIA~6*~|x&nn&}ahoeKzO&s+H>jTwb&yqu)4XNZCj(
                  zI&bNN=jd2s;Soy0ur6lH^#+&Q2#wGtUP2=_dn=l@v-|cBwc!XXg2Jr3P(iAq4N?d
                  z@5rSSPdf&tu6r!{zGJ*sQ1GOpp(*@_&&31Y!nQPG2VwW5M;(7-JO@X%2G@!Z*;^{C
                  z=E|n&mq4!XpP#Ze1O;UN%_w_qqE$+^txB!GKqkn)G($jorA9e$HJ13!L-+A
                  zms{ZR+IKkVMNRs~Wnva2BpCb7u52xWu3X5(qC~TBqDAea6TJ*gy<|lJFBSJ
                  z#(=8=pZ!Q~Bs^UPHPl^Bwnw%*6pbg*qX-m{!^VzXUDYo|_7BVV)%~kkmy|>)pC)~;
                  zygY#8xPH9!fkDe)_6k_blR2(Gq;U1$Ln2e1YJu_jOUL&YJ{y&Vr$R;;+lVdrWy?q}
                  z={IB50H3tvw2{fGmKLJ23MT0x*u_@B
                  z3LLZVGkjYeg>mfCIu^WTjFty`cAt-3zSuUs1kv5+I29jm%h;Kub>TPQ
                  zmW0MR3{XkN&lkdx?%+?aeN__50!i4}He1et!H?PFt4sWdWG#{!NsooM8_7o9g5}kr
                  zDD`}jZ+HX0R_W6+PSo{%uN2hXZ@{{J
                  zxoG$F4K2eGw+Q)CFys~K2((J~nQ=ojk?BWJY7ZB*+ubZ~Ly^>3ZhlX$nA4eJh%OmVmrY@56(xhis>>6v{MQHT1|i
                  zY)vU2o3$IhxLdH?{UrHqvp<0;G3YB>%gY1XLu8?0NWy;o)9PJiK5
                  z{L|!}rHApmV%fcz7uEPJ&jwOAjM&9S1wD{I$`?uJC!Mx
                  z;v;oe*5?OIN%ZQrxt4|Bek{
                  zt{u6;EA;YL&)UNeJpz7cs3aAU2~NTPn0%aB3Yrh2YS#C82MdaGRh!
                  zGKToBOpXZ=tXjN^)1jEd
                  zU||V3R-L^w&Ti|P(tVcouFT2c$NM*X{zHHN6%hUl7XK?CJWDmx(Y{3yBnhocS0ksn
                  zs(8A+>B!$%jhKGf3HwSG{2ti+2jz^&c)I
                  z7ba{+Ia|E`2;x@@4b2<^jJl^hQRuu?FDj(-L2UZ|`slj%Qeh<(jim7{HT`g}BXe2%
                  z07ufLOS&N85HrSqqylUTo34%3>^Hy+#T*-_GB^@-ckbu&G>&udbptY2Xun~~Pb144
                  z4#*Fs?x}S@$vCf$DXm9<(F50smPtAlKgpoZ*lo=OP~nMBJ#4>$F2NzkCw=kGc5b9!
                  zCD8uitJ&eg^ow$>SL+GKVwXc#z*QvS!tmjsQ(7d9jGS|t&bx4YZNGbpuKgAom@@Tv
                  z>{{{1F5vjV^IGOhqNL?7ca(s@`J=
                  zYibez?$e0hNrqFNC*3sw#GUG8{QMbThxa4f3dnuvj{eRU#c{|QM*n4gdd2?^bboJ&7?i>|Ci#^ekt@4s;^wI9_
                  zj)Vc(BdxQ+eMN4M*SnR-s-xK9t#n!L|2vd)(yuyZ^MEgeL6(>N4`w#(*x54l*eECl
                  zqKAxhb)!>)X3BMl;Rlm_Y{+X}pFOQs_ClUpJ_MSxFDkZLQ9R9CMhSv@4TrsOUu`%2
                  zCYVA?*bkeM=bad>86y^5>avFqfsT?&Yc%YOS~^9Lrp74K$Kw$)bP?2I!+C9W_S
                  z-rQGYWoIw1B;4L&lPBiO-3g-?d;Qh^?yRh#f{wc$LX68aZ?K0-dwGBpc(H$yVA14p
                  z-8{2ZV;9Q)@|-4HI{#HmLGN+@B48`n;mUs`wKHYvwTnR>KmvxU|{~!Z9-N%SFXc}c9AP?mvNF2
                  z*Tx8rgYEmiw%6!g5p8*R_QA
                  zhe)M;{*P%}49C7b_G&)Gdp#p#<=kXcc}>JyRrJh}cw{9GH%6Sw!`m}mSxKoL6
                  z*{agMu4M|g$`j;QWdJ$L#zf*#HD0$0mu((+!J6O~Dpb(IfQ$2IQ#Ga^-^h4fMTJo)
                  ziJYy!g5rIzYD_3NOm;CmCbTe2)=EW;hLeuXUi}~fY8f(F5cR?)e@tQHqD+*AP($@U
                  z@~?56{eU3>MCD9XP^9#GBb6zVhU$32RNj^O*>`xOdx`RsGN>!_`Qnnua$Pdc}~r^`$h0;>Eop`91154VUN|
                  zuV|>P{Z>i#Z_D@nSy@mtUx|>8>2!Jo-Vwee>CedfSv)hZVMcCD804zzE34vLiXf6x
                  zN~Kj>zC_xrM_TGf^W$~2o$@0yr3InDruyz{GNso7?G{Y|6#h4d7A?6M{tSRZ{`l6)
                  z?M+o|1KsQ!41_dFziZq4_g}YOAHMg`o*`j79eB;%gD7J2G}Ojeh^nlOuJHj_N&o-t
                  z|MeBPyZ*mg9}LeS<2aY~AC0eH$q%kQcOt`O%Wx+2wXd(bYUyF1u7FIIBsu0|N<^v%i_1DWkq{P&nVHrX
                  zTWmi}WOYACQeXzu-SU%o_;T=5i%hn6>eq`Zxshw{mRG!W%+bf34>vHW7Ibp*%F`>C
                  zZ;*;#lU33k!^7{?eXcw02eq80AMQF{3yhY_kWZFwfJuXOn*xu)Hlw~f=Z-zLLY$+%
                  z(4vgDN*4^bcicwP3PHChDE-O&9C&Y&(nNmjTEBW#pKVjFZSnYP%(bn~3F6u{DqW;A
                  z5v50xQ`iNrmN(cwWaoCILG|%rDpF=Gr0bN<5oJ{n@LhA<1nlOat-u)
                  zK6;eT?W`94dqe%}!y{`JyHj~0m155D
                  zcuYz6Ikduv3Fq6Vx-n)b*X?%gUIlqqAs=ZXcl5YX`i->m`vva5^|`gMYCK4av%hL)
                  z_t43gG3jk^9K*|#4;Q%a7<$n&=cwc%aMBDC7t)2Cp{CSog|2$1E3!bF1eJol6<;)g
                  z*4P05NbT2vr9fD=2aeu_qx?SAhyU@8CZ&YvicrtD94GweAQJ(VyHOV&?lk4R6&*iE
                  zN)O`HKX83?5xqPiJYB{p`|gdR7g-WnWl}}Sa2Sc9+T-i}W}>w?m%g8gxuUaBIDu6+
                  zy_Xe&&1!M@V$!}d;7WrD5QEkzn!%cVy%!JCib91^
                  zEwNbmR+5!W6O$#&W{ZOb9XL~~X$^Jx-Y$up1z+*w3ECVAm%8WWiHh<_65CV9FRf(3
                  z{E8_yM8u`DGi02xoul$bhGV#25i&PhvsatWQzKjII8N}A*1N74tAVEdw{*f%CmG!l
                  zE23P3kF{8I)0#ic*&~hGQuE;x*s3AjG9$Sn3lFotr@R!PcPc{^pCpgQx4wtp-?6yZ
                  z{P=yo<&ZoB)lS#$9vA`9S|l%jT+4)Yr;*1z)5;14L`N^&8At1jWc>cE&}d6+B4fq{
                  z9T^9NAS^F_Y>8`^fTq+I_a*qj-GMikN#IXwPC@|etKhy7y}XRpH{6fvwKG;Q`#`s9
                  zBN$bxb~UzB8O>%j8;s*jZF7Dfj#Q-Ui$de;stP$36NW#f(Y=YT60V}`1@zo9i?TeB
                  z4}XdO*2xQ;EzB
                  zZE6w;>aB2NWxjYA9>Gz4A?4$AQ2BzR^qw37g|R=jZ2i|Xl#(bf$m)t!9i){PTkpun
                  z`zLBT*A!~L2L$~tiz)2NFMwqIDh6lj8Sd(HsS_sdN{=RHVuECQyDb$ypt$M1Axi7b~sNk*d$0lt5&~@%l
                  z4_jkMD`)nO-^3tvs_v!GBTdb^wK^J=oEnkcAv}9U
                  zRr#mG%8$L{{!f&YrbB#2IIDO)$v6AnVAb|uy_Y!*vIEh6{Ckj!e6*OhZ*+HGV9BaR
                  zqj|4S*4DC`oFFG?ovwN_J)|&Z{ut||N>@E!Ptha=A3=FF;fb6%xw9)zKEY8le3RED>7nmOZ0nUGbZK}6LV?GCI}^99cq|-W0PUyNrYKV
                  zb2EqG!lkd_N#L$!2zmi4&E9A2K15vRWkY@7?7c&{C^sfDPfWr05+>0_fq~9>Bsl5%
                  zf+(`aR{g8~Tc-{q5skLj!i?yEGAb%To5#a^r$%wU6$W{!chK)%G<=V9o&9T4s0
                  zc$fafj8T?kiB0%@nIXo(8DV~*^pOT%!Q41cFKBMBk{Du$eFBS=p4-@V@lE_X@K=6m
                  z#&A7}V|++4Phx<-zwSGmfV>WgH11_DscM@90RYDMzhqC=_(j=
                  zu>**W!djC6>FQd$Wd~?=br}{JNZ0NRTNupzBz;3umKe<=vm2B
                  zmU7%MF>00`IQBYUenPoC3=@MmbTp=(n#aD*26Kpokm4ZmNw3q74RO!6w%>TV)&oSE
                  zjwG)W@=j@5sih=ym_TwhCXwP7zjLDgQc&sjkXGTqUxKOQkre4}<_#r}=I@u;5LyWr
                  zWD)Thwuvkf7=m{L1#PW*BktG|%LQ(xjHCOxVE=mfO%Zm=m%&ox%hVd%bUpP4nQhK?
                  zLh#2C)ucEyLHMOz+c^$yX5)x*5V~YyNyOOzITFpY(n#$PSYe)|h4T+`SpO8A18AU#
                  z8FN2=Wx+PFL+iw!AFN(x=QOg$)
                  znMl^s1)6djOrldR69&E~BEcOfSy{V@(he7iE0}MG!ZQTID8GF9h=_bLdhp@wtp9G@
                  z1bMAoqx&AUB6*-K2S(cZ)U50PLp9jqFaMDAB67@vm)O>SJ
                  z2&olI@~+vRTTImDk@7rEw_+3B99KDCeRw2p@Je@{k$-w1x!K&1zT@Z&QWce!Mx~q4
                  z%mZ^JC5C2tEQNIsVI}vIkx@D<`D8*MpCCWSJG)?bJSaY0o+)2iP6A6#sczSSH%>EH=3g&y+0g(w9j9$^r1eN*
                  zP=p>v4#U@%QCn|Qa#ymf->8~|#2bu1l0)ywpAJ5TtKs|C9#}{k4>6p&W~+p8bm8+B
                  z;KjW1x)gq0WA!n*_=wx-2I-K$Kuh5INWIp{R4g($BCK`ZMYsF_p}$6Q&(rLHz=cdFhRIUZ*lEOqqts4^MD{B1qe}vpy1of%*h27BMY78%WqhZkS~%Zu@#?C
                  z#DiM(gw3L#-jZC~?UQk!lX4nIm;6N*R6zzrX>)r?p|WsP1-aIGw%I9R@7s*7d~IwF
                  z8O8YJJ9dh>L@ibne2h)+(fh4emsbw5j#($w7Mr_g7Ag97x>5QZ5*iH;zeD9F(FwWK
                  z`AT7Ga#WNAIdr~!ID?x*8+W1*u>ex@T}k!&2a^63^0|-rs}?^L8w6uY17-gZHxT_H
                  z`7SS5hv|nOC(EV-$soZmf>S}8vEMx`WqoCG^o*DBB85K!a4#+q0;tp#dlH{J0b?bA
                  zbpxY-Pp@k5oRH|7&%1Fr7EET(#eMt*B4VsB@;^r8VSG-X&xR#Hhv7pF@Vfuo2-*Ld
                  z3;1u0;BtlRx+eNwOgk!Mqy1mnfl20>>T!#{(rqh3?uQ~5m!JpKD{;Z6p?Esh1b4K>
                  z(%`}oI>Zwp;0ZSBz?~vBpW9*T$}(FSy0dL~Yuf&BT%Fp`U+H7?2C$kGv%TceNWOmr(cLB|
                  zjRA(n2j=xqAUu|w8OQg^^{`GYGj~O{=vHyTX~VQxa3*Qc+R#}j-4-eoRDVN-wy#HE
                  zHoP>xQ@d#IHqfQHJp%x|zpeJgd&fxfWs*grEY9n)p4ZS75|iL^WSUtj!7U$ds$2B{5;9AkUtOCL*m`Sj2_
                  zkCxxn#EHYUVMeq$m+2|L78^7YDX*XR<}0IHXGS}TPL%YB+JHQP-HtqV7~s2lA`YZP
                  z1@7LRdpHJ;j*%16m7EB#a7m}wV)I!p<9jpwB)SJCQ4QC`ypMRTciVsO0&0KyGVLHUiJ&IMkg5YR
                  zd=T^HU4;7DRzd?GA;cU%gyNUL<%;FB-ZbQ<4oy~*6ZZS1KS^2su8_%A3d~Ix#N8RJ
                  z*7X;Yp5pUo4Ul{itJ|&(ak8YCYSWmqj_^?G+?&V}*|;8=+(ci)xd78`#~&BdrLzzr
                  zqG!+IPXkFX1DnaiS?42L6Rxe{j`4R5o?PAgx79m2&eN)0Jyh$bF@)UCyr>79n-aN5
                  zLHFxv{5bi`NoCK=Ewn_|yyZPRnQHAfBc&UW9w*YZzRGGcTZQ|=Eg6}u;Na#4ok~Cm
                  z2j;Gb6<-TKwV?}x=j=DcKWcsu=r1F|nvkv)(Z>QU2wQJz=)#Kqj`yd&1Ns7rtP;+C
                  z5f;d~O%(uIR@!p}`Kn*3s6G`dat71Io&QPN*fs?RP+*1=gK$9m4DA_=M{uJ`SKpsZ
                  znFP}?YY^*iEeN)1Co7Tfpk;|*(+47655)ISfiQ3(5opWex9rlbPNdnRDNOZtH&oB}
                  z2Z92qph9`&w~Nm7?gm8!Po?8E2imSW63)~P{Yebm$=#f|uEIKZXQpH=c(FnI^!6r@
                  z+x2PMd%^58S(_bu2axztg7mZf%kY>!Tiy6rFJOhS8e#4`W8P;4_$);(86>kY;z4Cg
                  zeOLZ-rgJ7uKx<~yxn^bDPrsAyZg^APk={p
                  zu+@BSh}Bi9rl6{t<1WOc9oF8}FJX7-MpaVsaUu&ckbH7UKW1%>Q_lR|K_2%F`eZ1T
                  z5@b(?>JPTcE2fKO)iD;zn=Qfwc}C{{XbdDJ1yVO2fk(Kai1TZum$;noh3g=c~^IY{Ym4awy1{xmv?vQ
                  zi$My3bh!Xv+}@!!I(LBN+?}ArMUt_MqO%uFbBy>(q+e8)WV7Dn>dZD&rr+KIHc=ZM
                  z==0E1Lw3a}_1lRiGn6tF^f&L_pW;~WLHR`bOyI74XLY+f*%}M~B)1~(=rX_fU=fK!
                  z;m$kvOCAezz~pLNJb=%)Y$Y;nSz~C+QpJ(q>p&}@bd-k9s}%mBpESE*bdLH}fCTVR
                  z`9Kj#x?2XLBX@mH2=4}T1#ie&8-nYj*YP5golEPCVuHA`CTuXZSCLdwZI*3=96!89
                  z*LEO2d7A?;a(xqto60-0u3i5{6-eCBpwDOAR;uniJ4r#?ei8#;`gNPH*W_y~iGK)I
                  zY)PAOf$3RU@ok}y&gL{P_od6r3){l+rPj&i=UwK1l2a=YXo${|+PSd2BulpUYt=1~
                  zuiRtWk%Cnj$zGL8pWVUTyt!bwjUSYS2h2-%p-Ql=Hz+OTFGG}1RrJ=C^bUJ}y=C=y
                  zih`zfeT7q7%zpyQvsS2KJ=*qMOGwZbp*oT77l*ivv>v=sPpC>;1j2?LwU!Xp&872_
                  zsr9JsBenf3k>+W$_aB)Bz*@`>%05Dmcy&k3rbSt{J*8QF!iDp^uAho#tQ$G%Gr_;_
                  zUKWr+=|YSh9BL*G(yCX(d6v{6{mRB8$3HPw7z+c+`F_ls{)(J*)<4%_;pK;Z%*cq`
                  z{|$P#Qu37=o;11NsYcr=QKA?_CjSyqL;m*_Jyvl*2<8esSmCt5T76fa0^n_jQ&N=A
                  zsdd&s#(MiP7A-uF-}h#(o=)-Q>Yf3(&Ll!mZ5~PF7Zn#R)pXLwoEgISjQ+`2`23*AD6@P-M2gTYdOkQWb(upNe4XM*gN$uEU
                  zvnfrvp~>0rwZ~NrGF{_ubx=zaADne)l7TVFx-_4lb_x*EEKz&g5A^%)dMs2s<4=KH
                  zWf@659r5N8&(l85cMkR-Q>xt_9gEofXz^hn*aF09-1K_L8Ch9fLDX){A>8hC%3SBN
                  zamGH~=Lt!pIU0UEpQH|M@^>cpegF$BB|T-Y!gt%wI^vme+oe+P`_mSOl5Ee9_V!Yk
                  z{65Mnk~-0M$&vyzOANFM5`Qw|4x`KTsw~FeJ?=iDVrsX>A0#d?P0U?DoYXUo!TDoJ
                  zDe)ti6FA-BQoKH?-bgwb^jSjMw_k-+{DY09yc~G<$l8Ym2@4chYj}Z(%WvDl8EOHuC;ZZ_=Z3!xx38j^(9)$?uXdzQ$@Suac{AI6qM6so{#MoX
                  zqMzKmlg31~i$2a+aJZCN0ujgmc#*hZhr>EeLJTseYFR8ff6u*BBRD3vVMawpr|E(*
                  zU78rUceOrII5{@=&i+m|{+KNW;j_RmRF7TeV;s;|Y4XpEe=2iJ|6Cu8fRZjR_hDkr
                  zUnh%%Z7%Gk-Ksm>KWx9^muB$PS;iTyJsl!4*RH3PKfARF($*(EZyAd4IqoBEB=`J7eWNBc3
                  zmxc}GmfWh
                  zEHy$VE4^P3sU+NKog9z;QNs@;*Z74w)xc2h`QF@5M+H4=h;H}$-y5Ro$GHK1+r3QO
                  zv!oPTjWgIy&^u?Vm*)>Hj=BS1_Gs8*&Y|D2Mx6AZiV1sKi~(2^cyZwaAoF*@K}%yA
                  zY2n%`z0?ZF_tzq=gjE?VwP+J{kGu!*Hj-iQ=@4`P$+FRjp{O@7PonCWviA_;A>WfM
                  zDJ~rl*X*vHdFMzigG8hJXJD1K-$fFpEt%8_2!76*a`NNjJx|>=%k+pM)Gf&*gdjvs
                  z@vZiKQNHp-jrvQX(wV7>y~2s?arG44E}vEXSGr!-xyLYi(4q|TC*?8I9&?y53dkx{R#PhB8A
                  zXBu>=kyLfl3?$vg8B+lHzsLJ0Xkb<)y{-7ZBQ(S1*v5rdjLAgN1OL@O#YK#E@!G3~
                  z^_~p&cX9_FyZ?|LF@WQ(Sm_mc|MGo|npkllq3wZHiKLXXX8%S_53c0aO}BdR;1<{f
                  z9}Wn$msE(7m_*Hy#X=+!xgTNn>-xAlb^BIei%*S34vLLfoM4*>2NTESq%(k$J9q9r
                  z85w~IV|;r7m7r>0*CQHmXe8Mk6OkPuzu5|A_YQN%TLM9Vyvslkbc6
                  z-#${;f0zk=_oYU;5$0-N2SRU1ycS?KDY42mZpye4*GWW^1%eG0Pi&GY(vq23HF?x5
                  zF<}RqZrY9JTqtNAs<2MBfRXyIl@i^kJe3AwrT5$Yvlu8yRBy@4<0g@Oo3+fGWXpYd
                  zVoVOhJ|jp=NkIdg)s-r1cp3U}d0RdvIlUENnfS6(bG(w!4p#01fw!-t!t3OvD*Nq(
                  z7!_2dUcgYOMtZxJO(MicUKM-glj`-@=5vWlS4AJF-kS1|>6R_Hy?)`Yb7FZUjk^!P
                  zOOZcl1e$-y%bhP;hLqJzU*ZEYuvF2|LDhEGO`>eW;PY5!F+
                  zffrklcuz7vT0;rTZgorJ%Os}t!v2#I?SwNtd=s|8d!_DEd`!3MnyCvykPeNrO1~4q
                  z)c9#>UckttI+|3LWn5@wv9fJnRZ>NL7NM^~H3LtN@phTY-T0@y5>`3r$PYin;EIDM
                  zHS;r>mC{RpY3MP~BC)%*D7$@ROx>AC+8~}Ot}OMiGZ8mt7!iF5{9aF6I
                  z$dBngm=~pl)b1^Kj6f5`rM*AXEQR25+*r_*KRB1Y5#ynMu(5fxRU}{VX=x=rG0{S3
                  zi=8DR{SWVBJ=4$4n|A{ARHfWmdY>3RM4>x>X!_xzBA|Jfv?5zJO7FgN(&^sm!1fLx8b?$xmx~;KgYHe&hR@x*Ns8%U
                  z)Dn8>v>q`X2?>#ci0$!-Pz*X{-9IOxB2m%8MDszM`5+dA0?oK;LBtYq+23*tIF|F
                  zu2-`$RTBPOw3Zhlf-P%k~##pL#ung{#~7ERF!RGcdiaNxt(pza~ZKfA%~{WK7wOE
                  zf3G`_CD}1RmCo}t?g7)P{yZp#E;``P_khaTY8PviO~=1++tW!)3<9xJ^$`3$C*Czsk1`Ug`*j4Hmp4?G6+#Ep)~w8>^NipuprMeF}ACWBhY_){Pu9z}EZT
                  z%K!Pj$@&U8E?4usr(@%Vo>%MNDNtM#+Z(tNxWYXJJnU|Y_#Xci{fu94QPJaXh0<*M
                  zKu_qpdU;sXuwfq#$N7P0CI&nCoDP
                  zpvivObCm)6DzSaQbo@LU82@RzxR6#3>0*FP3Ez^!T?HR5_duG{3K)@Us6C
                  zZ3ABOD;D{A7U-@V`5v6@!@A*eM6|NJWr%TrvUfg6OW`5?XoMdZLU@+U`^eqValE^-
                  z))z(t*v7zpFcd{hY;`7mO>uhV;I?T(%1z`Sw&kEdi;Oe6)$p?30nS-6r4z8Soi;pq
                  zKU0#mXKKt3l&!-kJ$Z9viw}37yw+q})Q|rz0wv$4dmwA?y>JW&+uOGQ_Fn~xA*Al4
                  zCUZbIc9%~G<}+Qi{Tt}cWq*VJ;&$hyQ-R@eoxQ6&K^wZ{<*TF5dWr9vu_r1znEXAp
                  zX_W!!{z^>rxI3HN18kvudnChGZAD;acvu|t-RJb$QM~u+^=0$hBtsUB+NUiV7r+H>
                  z@99Bm@%%U=#KbAl0tTi_z!ePvh;cUPqPa+si54h$1?c$-{VLjh^~Ew4*V`lUYn@e4
                  z)2Ypp54zB^3-;Q~#%NXs^!N(z)YM$ScA&-xXzpsOpZmW!-km9ow@J5MaYr{B7T<{4
                  z!nNCTV31BY9ba&L0!l5%t+Ce8t1@h886+6HbGga47`;u`KR4E?J1wax*MQov0jZiO
                  z&}mkC5kN$#lU-s0BaU8h)+xW@N#dcbHiT0@J|!nN0YxZ;7G3&^rcXXMd)&t~1*;Py
                  zn7h`cfWmFC<~j&_GVCC)vH0kxH_6IV6p%H|i0JI6kBTR&L&Uc74uL4Bx|%q{GL`fS
                  zW6nw6oTAqnz^u+!rP}7U&5x$|oBc;QI{>%%5QcNs(HNor7YHTMsb7v=-^4VLr}ov|
                  z?l?@}-}RJsJJ;<3Ez?RzBR(7G#nkCU=0d{-&{vd8O&_P{
                  z{D_+>_VhcAAMz;iI2|zOYcWJ=LFCN39=f%8BdPR>yb($JtJzRgY$9T7R)noqkc3wFKB;*3e9VSF0M1o9<0i8hH3bdskL+l$%%lLhGCE8Bt9
                  zNh(q;KmUN}x&nQ$A_NA^#^xG%^kv!EUx;(fw&`xM~o8Q9te63wMMAsEcp(W@JkUmd_ukjFHL3;Er(olOMS
                  zt6RR;t>R
                  z)6|k?kTrjK6C^g)uOc0FPv5Z&)q#!e@)32`mF#7&JYE&e_@l$A;wvOfhTm$8=h-UP
                  zwQmGJq5xSc?h*uAxS8GK9kF-WU8|C`FEdaeH`l$oW{*6`JXWyYzcjkpPtA1$>T!1$
                  z(MEQzhZ*Xz7+}x}>j|GCZ=4RdW&s~Kmnp~?aJ~xrEu;AC0
                  z=#5=)S}h0Jwz`TeB-+n5JqP$ye8=MRdbECn{eGsjt^IWZ9ThpR2glQVX&qZPhSJ!u
                  zh0aC<3`st{PU&DM=;jrnHoATHYE-LQf+5@SqP?(a7fu@VG%3YcXp1-_nZ=zhjmRHd
                  zSf6`xz&Z<0%8q4L@4@n3*3AKEeC-j&r*}UJ=_Up4T6|jPSj<`p0|Zn3tmc&M)^g|*
                  z!TiCamcE+AFfB-0rCq-m&YQ9+*vaHmtFu}qk->nk3
                  z&r;}xV!}1Ls5n7DjMuI9q`h8&U=laZyV;F%9EnFwluyQ)Ogg%+ad$qnl)W!JoU~^d
                  zOqvPObNvaqer+}1sPmdeQ8l|)1>2s*s
                  zJFj6K7jdV(y?0`vFR0%hD_~LeKyspwA}o4|S?xXud#gNgdY@@SHdU13LO_bEs$#<-
                  zrxusDh+JwOp0XZ(QCj->tDLfVO^gLd&XRFq)*^+1JSrtaJubX+)+pxH-FLY$wRWs`
                  zr3K~|```kcp6lI3zZ6~o*qyah3F4>PPt`A1^&G`JJFBbwO}Q$Z-?F!GP*!2)@U~zD
                  zhoq#G>=AN+;_TY$6^M$-5pnp|)BC@b_mx3$L~WM|!5KWbg#>q(03o;pg1a-gySqCiK#<@%xVr{-
                  z3xm4{cZY0~efO)~+F!d>`)jABYPx57`dZ65&pprSQ7DDN0O96?1;o5L)hfFG1ch^%
                  zt6lX|OLO0*nwIP{?t{N_<|KXJrsDulMQiF1ia`Pz_cysKsZV%?)uCAtFmK
                  z{z%!m@qmp)8Irl6ANT+*ITr>xSV
                  z8qspo+E9!-{8&l{y7G!BPJC23@@DE{8CMgdTIn0;5rH1IW3@5Vs}~e!3lvB)!JjJD
                  zMOKIzy=Oc#s%zaAd_~=Tyej&@?FZAMtZ!HvTwOxAG^rjq%al#GPDO{IFx+mv_wzGB
                  z9YgF1=-?dCqOY=EZGAfE8gNb{pEWFz{*a__v+`38I)Da6aC3Lu_eHa))nvL
                  zMXx;2aZ+vzB4iwzO4h{16eXbc(nzd_vm3NGG4YgoI4N$LqEtT~@&zq`#i9X<5jPo!
                  z;sJ_z{FGbBO%u@vY%M?wU-~|N5om~n7?ln1Q4^t=BudAAQnuKEjX^&78@G;(j_s^2
                  zOvY=d=q7zaZ01=z)Le>-T$lrTh+($yUYxu~70G~t{t=Dn15Um@B~DP0
                  zdG*3IY@Hwzog!^XJ6Q}JTe#9Hw;E7m$iP-Ygp3!U&^L;bF><7qp2&Zn(6#SqUbfT3
                  z2veUfLyt7D0i?BMo;ALSm+c$uVuAL2{Zkh3ed==(MdZD(+@D&%Qo=Wk&@&ym&Pmd=GPAxbJpJL%_Eu_c0bTO1xnh9C)
                  z^!D79Lb}4UVz%adn6&jTc|TzwP+SOmS6sOisgVpHq#so|4xF2M8z@nHLkTHrB9AuI
                  zOj4fsl;ofI0YH4Zn@}&Pc7r*nwXoj4XSP#WMMzgCd*#z;*xq@>xY%cE3j5da0s#
                  ze{OC|*?tPK`{tl+7j+z6!G91zfo{zLf#Z&3uKb5i*I4p*g$j~MaT2CFUlALaeieCw
                  z+Bas+z-+Q$jrzOy9xgEPwGiC$QSE~)(LBgdm$(YQ5S^RkH)$1>0j`qizx~l=*3@AA
                  zT$prBvSMjfm20l=(RXkk^=vbfpXo?cjB%Ksh>A6copgFh=2014Ae}v0D(c+I+ZlP9
                  z{aouIQLpI;S4@GrMk+gzhxoz&ggVW>UsG62F8zTyJ&)lBcO{uf;-SE(w$lLciXccj|JJtV~BBd9JTpVBn
                  z0cXR6C(L=)P<%!qgk&fsdQ7l7yGaw!-5Wfxcii@rgp_hmo5ttB1SFV*0JB5BDELJI
                  z;S_b5-6|6W4`6L*)sgvQQ~_kRWSmwKj;%RX+#3+1VlZT;cu~(7pR1Snap}VK3sFOx
                  zpFkCss{;E$?S@(sScL5
                  zlhR-AwwpAg*VVnR$O|a-1$mE>tPUl#|$G(ppLa7J}4S1mqsa;nkWdBagNl4
                  zbF?xo;_WvDAuy{c-bp%_nZ-qQCqsVZ1`rVu$W1~qlGX3`gyD^2YuCn!v>wfSJ!nJj
                  z!VCf
                  zCOne#Ml|n|*oR6Y(*#e-xmK@79D^TC&%;$3Hocy$;}%3VV5ggWOUdk
                  ziS`q|m(&M=Q7+r%BIc+8?jrY&
                  zgon>+#TIBChXL-7(_@f@^N~@LTc!Yp3nqdSgIvN5lqj#}P#`d%?
                  zc_q&V^KOVQ-T1#*ZT-(WDFF&T(txP^yjOtZMfmD&M&I2pWTspH=dQgX=`+BU
                  zr45`1=z)s3W;W2BjXE>B#*c%S%urz7QUW5jrBGwnh8B;+`%`{8HAz
                  za*sCm_S=%+q?Z`}_-IuOsc1Z;Pn7%nj`HTwDqyaAw8#kpaqMhdjL>x=TF2G`ib!~L&-W-XpXCr@iGTYkcP|%I!
                  z8(mnD3Fg~87a-X1lA6xPT`P9yz&moF*PcZXk(e0?B3L2ba1_dq6
                  z_=m$1ooj1*O?e-@BKOz)PS(Gf77SR*@h1D(l3;BWBI1>>d8VG}0GHVG40vh@#
                  zQqRwSpSIOPPoJ|K2+Dn*3QB;an{MKS>w`!C5lN@QS3qyWFbaYgIJmW!BK
                  z^3^RWfhU_&52;Lw3rHfs)^O+Yv&`Q+(dJ?FHW#f}bE!yJ>RE;#%mm5bz}E*I-Q6d9
                  z58_{3<-`dHSOFrz8qWCBFlhpSIu9Xd*ta%%a_Zc!RUBmXwSW9+d312XN$Nh}|+C6V(T9
                  zHPeqj($g)GTfH$*_gnNgcUD!1qk&@Hg|WDU_GSiA#wg1$c&w6;Z;jmQkSnB9?tUSu
                  zYor()()dQXI}46UP^Ogse7G~GBo+r%QhzBjT*v+};lRV>_#`3oBcUn*KGk
                  zdAuz2i@7C5p;0y{{bm^5dQC$HQ~vELqvcm&BeK@wa^>ySsB!s~C_od)DbOFZu8sq4
                  zMP^1no|t)q^2t1?TVi7(`vG@u@n`pxa3pkCYm2@E99wpG&0DY|>}IPnTOWO-vZ^DH
                  z)D7*`bhqKbxam$AA4n1bDtY^5f`8*YfL0bMmBSx&ed`PTT(uS^Hy~f4EX}L696zoL
                  zhvrgO%cA686r0+U$3Piztmdmw*+9ulSu^l?1wm(=m7Vg7Iu7C9gRSvG3z=2LFdYcad$Fcr|;B$Ncxb&{8!ueRMjiL4Bi#=52^@-olAD
                  zJ$xKR%lbJs4W4uW&2UkZY@ts9F10BY(V|
                  z=R)2%_&7$Wr)ly002`;4CJcD&cJOOu7By`glL&v@%|1cVA0
                  zCnb$+Kw;K%CVlguB7WIxv=Gx%N^m9XZUx$91W})1y}7BbhiK-*?n9ZPO*3h8&(WW7
                  zL-U8nHZ(^_U^$#6R8^UD$@G-AM^o@ZNOfB6Pft;UB$oOrlS+ULKSDhpN3@?@dLbz(
                  z@XXgYVxje<1^22I(S6NixwPnJbDgNhdyg5*bnp52@P3^T_a>GUNw&qKb`(>x_&A{^
                  z*j4wWUQITN^y4xKh-@$Bs5rX1dGM@>Yd04yZ6z>_qI#AmP0m`R?ACPsQ9yDnfEy~3k!^-ld4sBFRriS=#y_0MCv-uA84#r
                  z-EkUhOylCJy5l;FAsXFx8TOxCHmKf@QRdjnk=2c76cg0MfHxWmE9)kGaoV4+`F-y1
                  zzAx-Fw>VuYFK!Rd7je@hIn*m!8`mqOYxhAdT`LVXDY3v@h|hW?jfqtXcO9h7{>JoU
                  zA3l-4!D%Btbj-a19kK
                  z#1tt`Y3F`9uH9siDH$0N4!E>MJ61l?Rec*BoJ=`?6B!fU2)Y#fKn^eOPkXo(<$
                  z$$ZwCoz8>La7$iLo5JAYR~mMKr3PZ{{we#6;$3)n3WbBi>4Fx5l%#g&+&Ac%u%KR)
                  zk8=lGC5WiMp@3Mp--UD!IvTp)76m=XQPEZXfmT#BZ?;+hqw7xQZGU?s+I
                  zbhEFE85+}Lpg2LExT{tMTl|oi!==Y@71=P~sY+9ElU&K-R*+G$j~$uhS5IWm$6AA7
                  z@ZAq*RV?M&(ZSFBgjD6p@EPy%Css&q=)(uQ&&D!omnG+h%dyscS!BR;pTG^9kl0CN&^P1S*&?0_ZfpK`NcbMM;@$S_^;^T2X>E&cv>~q>7jEOEO
                  zf>(C#kU9Dm?XSIZ9{1sdFnYiazFbz#K^7`s=$QQ*3Io~1$&ETS;Tu2DeIyXHX^txS
                  z_LO+zH*bT1IdUi`XLyO|8z0(}+bW=18Z)Bye0Y;V&YFD_MlrE`zfm!^ao*H!=Tyl;
                  zFrh*bq6weST{_=iwK2Ri^qK827-`;H*1E&$3Maykof8Y%@$i0hxlkS9@Y2
                  zZo1^eH00O{OI951$wfq`=BTiqg_~QXhRXPCQK7AH*SA8jY|K49ike8iZ)}E`U9gqD
                  z68`c^;fe55WAVc7QIamia43_fKIDAEj${?kz+5Eiy@I
                  zdT#5A2FJ)wUxl+zMvPhF5_KuNzI%L0HIpEcAHfr)meN2!D3}0+7B@t^00F8X)NDGw
                  zEWV4TYjMASAMLaqZ1BnBL<8_dqhbYajt3S$`zK=C1<6LH8`ke|x2IkA_RicaL}11;
                  z_VW3`;{sanp4YwK5o7xD!sUjU^?(a~kkmThs;Wys=5j~BxpM@GsbUF_l2$hCrjbT=
                  zU}8fOXnsp_vZmTMQ%gdS806GkQ~q?=?6q6_PT_k(T0Y3Y*>_iX*g$BC+m71juK-+K
                  z22)u=UJ>>%T`UB_NRw^TKp0DOg
                  zFkRVYmtWUZ(T2t6=0`BoFkL(C+F0j{0l4cfPQ{4UKo`{iQ1jDDckk)0>K>u~MyNDJ}e0LSq$vCfnP!MR_+0e=T
                  zzVWy}lE;G|&D7kAH%1I;M&;WLh41o10pLNd4EYiF!@%5WBE@1PQ^_
                  z7P1tnTy&9?D5=R~^!+;1J_}+5#VKTIpDC6neIIlvTuvf6b;gxAGMSOogwjJ}
                  zdkkhIs3S@%ER3mfdIq=ufLzYRwNoR!^}$QU?(QSW&dTmQT(&I%wyGK2I>W3WRn;Bo
                  zgi861wfWWr1_Sq1%F5_W$L{cA#Dh9d1FLw<
                  zB9QaIm0MkbZK3L_DxOBbJ3_{|Xe}H(L_ba9iH$|%PQYIMF(hgsQc5V4)uPe2-79AP
                  z*10|j@~HeehtQ^Z3^t43#r)o`ng*u>%WmLvA$0}c-%~YGk6iywt}bxY
                  z4rUUbjJfng9ui_I$1}6J-EyDcyW6sbV0feQCvr_j%$1h5%{Rjaa!Ab7oaI)uAl)jZ
                  zu0d%y6E^;3N5<=zR5sSH`CGw(+)7F{3H^mEjqS+?t_l5qzjK2MW#%k5_6;vO9p_s*
                  zySnkWG%>ClD=~L(GeUz8*k&yfcJnH$PP5Lqzy210=!pFqjs@H1Wov8jaZ)DX>DKk=
                  zQf{*CY_J_I$I^_l`cxDS`Qiab#$Sh6sj7rAJ_+RsIyrW`QW&D98OE!OkS`sDYulJD
                  z3fMgx2T$l)y3A-*Oy2A7b
                  zYkxn&=wxx?AAO(+?p1p|=eYKf3gIu+8-TgKd$eRpB6oAZ=PveWf4VLkE(sk$dcjqQ
                  z*z070WUk}mAJ!2jy=xj%Kw&TVzf1IXcg@u2R4d|Oh6xpLB_+UkDMv4`Cz;>>h1wc)
                  zI0N<&Z61EfFPj6T++
                  zx+fVi7S>10QQG1MDCl3E^BVK=x3ipgNAcP1|6(tO0zkFI2Y;S)pr{{s76Fpz%QFHT
                  zP@mwBydZ3jj?Q}vrawJA9fbhs(X~~C?sNDw4CKyVEtuVjy>!icnTX-opG@RbTsV;(
                  zA0ta>c?Xr?-(Ef6*@xqBW&w&~drWXl+9I+Fh8F`=|(v
                  zOHfDfU*)L5bCqxSyghnlHX3){Z>eI+42Cw%!{h`}`hlzE`oSh5I=Ux^?MAt3I}3SB
                  zdC>v3jqy8xE(7RN9Q8`co!x|_AK)N{!`JkU80k?+;NtED=}5T9aeava&bb8(RwsE*
                  z4ogMV^orlFUr36eZ4(HHQB0R@21Mwh0gx!bqQ5ppLh5rqIXxd9XGv05quQf^B{;^I
                  z{yp@{aVH~yL}xZXklM;>6pBppp;h1^KAy*cpOo|Ii{T+;pGNQNU#B_Sj!02TECTWt
                  zaHXXj$U;zuFn$%1zcTegM?5Z9W14C*mFyWt?jRIbX$i+VmtDJ&`ItOzx9~R0V}26u
                  zo>7Fy6@A6;Ja6>WHhY+fjlL^YLq-h{Qia@7_)!E?!RDVs79
                  zEm^w_ck`-eS#mmx(&)#SFu|@rX^jX9a$;+h&xrO$DBrBJ=bS8y=e|cp{x!LIe-7Zq
                  zU;P(y*=pQmwYEyHOC%|*7am(y!l+HVmzF>}eC`JNtI~6%4se^gd|Bs9LvxUh?cv2=
                  z!@o&gu5rVnqGU2Hc)*M3m71l)wJdicrdyfl63mh2AJzL?Jajp
                  zAl2UNrpdd@5;pys{Plgoetxs<9&&5dK8L4*G4
                  zR&#EXwV4SC!GBIjIFHcDYVi1kD>k64oRck{Vz6kaj8247|GFyMy=NOvDRnAO;SGo7
                  z;~^M285mk-clMo^U`v^8gmC0}`ZaS~Tm)M=Z=(a0xMXHd|B-%h!XkPFhj03FTy&IB
                  zL%qHW4O(oJt4q>my0KyG$hJ0v&&kpIP9}}TOdolu=>RNsWG#G|`S
                  zK(wQ_L1Pny^#%=}jRuY>-w|3hAuuB;3yqVMVz1-ogo5nPOd35@BI6By;ImR_xN8=4
                  z>;@r$zw6r;vb%APU{((kis(uIn!nhY!!!*1CK4~Z?e$bfVsUGlef>M-_Q(B}9wUmJ
                  zV16d@N3R~_-M!RjZ$;?yn7rju-bYX8Svkj1Ewk7eMz%GrKQ{7~;vwSc-QY&Ux^#;q
                  z$3bl@Ru_mSB}yISunnOUBQr~E_u3U?I1F;!ng3v>h=mnDa@wotDT6->E;|t!u(6~=
                  zH(O?Vs=6NwI_3o)-QdglU$+xE2#Y&^%g2N#Dh7Jc14CNQ9GUPRT4`q*#!<)T&(hSi
                  zRT2g;`E?0Q1m~?Z&icQt=g@O5k@7{meQ=}&X!GBiiQwmh6T}r#f9$%wqRgD(A6&+JG1{TA_XvA1%;j9E_cioVjOG*zZ~toe!wJ}e2tzXdi?
                  z>)WvM+Zoi5qfqr)w(XzN{{@I{f4WVxQjsS(#p-d>f9qvrhaEtgC6W=B!0q_TtG`Rk
                  zmX_#0RkpXb)H2KS4ab#}2Ah!=+;a6)*rP>R!$=7eM
                  zNl~X#hRTweAQ?e^Uw{8odB+foDo-X&GNq9)A)KBz{(Gsz%%Aa^;ar(RN#5{tkz}47`r8@K;lKP@0@|_&Zj`%pS7vqR}sYsezC(4)I?#S!%#(
                  z>XEqr$3n_Cvv8DRN*#Wkt2ce9zz1QtEC?|1
                  z^>NvU;)^HW415!xr`mS{enAL9#W6t=OrETUppBA^r-QUO@xJ=p6-QReu%V52Xt?h`
                  zT-`0SE2AUfj&jk(??y<GZucTQjSbiP-3vo(!9)M`EB|u+bnPgVGt8bp;A6k9hk}
                  z>S1%_{@I%?&rIk{2kF(HsiH5YEycp9u_OuEE|os99y;oW6DiBf08&$JBopRP%BScy
                  zIrsX@SbBYtobBi>2|g}%eyP~FWW;t2kkH<1^;MV^nbvXMX$eQdgF&@zKI(r^Wzd#_
                  zw>^&{UlNOi@yhjFX<>h!XFk=GsMq7Y&p;
                  zT>;OHUiTBi3r^~YQVr>ptT~{-b)Y@#7M}Uc_!DV>bL&i5hHYCT{&RMVXJmNiBK2P{
                  zo!71WG(U%G3VTRX?3Gun??5k@@c+U4`NJa_tcVP%Va3=x;6Y5Uq{P08mJ90#{5Qcl
                  BCfWc1
                  
                  literal 0
                  HcmV?d00001
                  
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area004-v001-MC/word/media/image7.png b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area004-v001-MC/word/media/image7.png
                  new file mode 100644
                  index 0000000000000000000000000000000000000000..9edbeace61b0a546cf62585948322d203f426026
                  GIT binary patch
                  literal 39314
                  zcmd43WmH>X+qMZsN^vb(++B;iySqz@yA`(#Mj3^Y+a6I+l_g2H(T%R53dLBUiazgGWk!vYMEFLoz|-D!pE#&0<-n8CE|v
                  zYy|SM&(kC?%jqzs&7;2m`XuCHt@CEp=fsZ!ax)m(d?JHh{WHKkU5DQc<=E-4jBxL5Nr&LPB$ZzgPwB#4><_;%HV)KT2$ie
                  zjR;b5csg=&Z%I+PFD38H!!9MJ0u1xCHp@4zek-<@gEh@P{;!*k@l`OZco
                  zZEyX?QEnfk`<9pAG?wA^26pApYWC_?*1wpLej2+TNGZo)<>2T6j~ko~?9taWvT2Q?
                  z5u^4NmRg<-_qgm$EhskIA3y$l5|}O(uN4?QyS%V1LkHQn~co
                  z2&U4m@#te(y{C%OFOXiuJhS;zaq?C$ddP?5M7=qiX#5O388d&JV`h}6llo1ZjH5!Y
                  zST`p*In)d3=?qc~MnH@ViHf2kSa8LBV2SvdOFUfPku<0&{?r!hdybC523)=A%(9nw
                  zaUKr=ymdcyERdkRW}Z&d1;Ork_m^dk1Cy;({ymOAP{m4B5v?4DWbEV^Nk6iKw4<1K
                  znyLjE$51c`QlZw7Ow-Ti=^7lj-~|Q8o4UXGqeA@poK8jUavn$^eux1Tou${BU0EL-
                  z)?<6aYloZ<6vCO&SKB_6UURru!MO)aK0jDZ`@emhaFcTOWLUyx9sI(k>9pyF@SeG~
                  z0(>2zPIg=3i9c7hk(X&{W0Uu+tf(m6&diU2l^IO8#`WjGrZjk4IqIp#w7&ayj@F?P
                  zKieVrH?3h^VB4u`F_bZngaophgv8%sK95JTXB|&0{~zr=MI~P|Ak1$hk26pa;$+k+
                  zHFIOGRLN{ijM2tJRv2qPNvdm9HbX}Rv<52+Ggp5aMW?i1*^G-lUU9zmr6rfxD@&p4
                  zx4?B`dA~l{3YF`3tkS9`y87H)=@`VGve*NWsG*PAKC-B?4N82O%<#kr3Ua2G8Fr$C
                  zP*E1|E=dnuc(e_Hn!KNwZVe-Pie|G-LDq#}&w|j2gQdnw`^2Cw;xer!=|=i%-)VG=
                  zPU+kk&m)_4I8G#4%8l=`snV)5gTEs
                  zTV|;@|9JTmH7Tv(z4?4Y{5f!js?wcIuDqrmLGdcP)^^fwwWBAGhlmHegnBu0zC_g2
                  z@Rv8{dQ_ZST+-}$(og&$f81<-?Afm+M?*@$M&xdKT`j`YeG#^*qXKDf-_rE-t{}iw
                  zxQ51%e`P|)&T4!~IO6AWn4udp_Ql72>aBGtB}{$x=9)YPR;;>ToeM?ZT%Q6sjmZF5
                  zLYmFuV*S2?C8IAnbDLC^dOjTTq_ck$TvUdPD&@$!5W>U%?aZ8*qOTae6quJr4%T08
                  zzhHCGhSWMQM3IsgB%0W#aG4BusTPE3_rCSJF+Yz($*Zou>3`DKC7_VAqv2Ma9(MBN
                  znqGCB@5MoaEG(|RI46*JU-1VrK-vVHNz`fPMMig-TTl4e*%Mgakmqw_vm8^9=Lb|M
                  z*-LXdiTnE6RE>^${q7x`Lw`Vn+tq3EdEp29`bC_So?e@Sk(^wHLtfO6Qp0-mrV|8}ryd~Qhyq_G?fRNE
                  z1eISO>o2jB2ucm<@buAkiMx7nZdgQwP^g~)s<<@qz*VMd+t9e7lPp}e=+o%#QgKia
                  z@h5+MLMbU_Wloo~(0ljn>GqecCmPB^v#FZCntBdVuvS&8(21x?)BpjSZn{`y)(MTIdmPN?{rj*7at^!w5dDFLuEytj({fK%M?=#__^&DXdvk|6p0
                  z^^I+lV&*GX&*njGV=eVV1w4J6{r&wCBS#p-<*O^#Nj4Pez4In;+Xs{f^gu>wRbs0n71VvuiS$yZnj5SGPGI5S93wF}p=aO730M
                  zF~I5EyM#e*f*eqZssLYDBOPIb-5%^g&6_%^MabLor8c390AW)yDq2p9jJf(rIKpl`
                  zGFH}mvj<<w;x|K$Lm-5zd8SJ^9(}hYu0njY0CB_V-}KJ
                  zWj?ZqmBT^W3?Zi4Q2C|MtaSSPcB)a`xxr@RLT;qN^92T*$tGxq3TgX+4VUGs`JkOK
                  zkuW|omO9MU(n+@bpX}?CmwN~)6%`88@6(=@)5H9VFcjlt35gdry96LN!h8@S_)>L>
                  z-3LV6Gp!_Yo&&5eh+GSOKmc>dMzvp6J-`4`D5`>?q7mO?Fu!ZP=JY`Cqn@nh%a7I_iMG1H%*
                  z?=kGgh^Pby_2hlNx@A7a)_%yoOv**{u4}a0%X29)D9!tQN<$H6c2pvF>nlOE%9cW>
                  zDUw`Xc=B8&cvEY)qe)3wm~Uw7`S(OuZae@lD-fr=s=%7UaxDAwN9@%WG-z7ki(KnV
                  zZkq8xdP0hcN#2izw9C{Ne-t1d1?S`-=cCQ@p@nQ|-i4vjp^1z8-5SRBM9h*|9qmM;
                  zWIm}*O~9UZ>mznob_E^t!)Sb_H=aNZdGP6-=|w<$vo$9`XP9NvI$jAr?d@Gb_giC$
                  zDUOLM0a;FlZH_d`=;-4|Y_+1AI};DZRQ0AZlIOoryhi5)b~hE>{(egHm+x;6x+><3
                  zTM4QhZa(7*c=Qf3J==64E4vfe2S-FeubryOX`ZE3wv?p~lg^h6d^}pd
                  zfr=xhBIV-x;0I6CU%T}a@5)-z&F(Ok*zbB{<&ITHpRjLk4E-8T@z2SpQZaQsJwCne
                  zdMq-sbG!##5NE|{^!wxHt>+M)m5aF0^%Ml0k9GAx`Saqq=7IYpBvf)eTOIdym$~H&
                  z-Rz`o@LV5H^rcXQ>XuUYmb1q9I`f-Vgm;SQ4<83+K-#rFr+%v+cUt4qFhNXmPUdEkLhb;s0w5CaiJA+=O
                  zu>GLdmk3u1#S9mMDF3ctXcDh{dj{^m2LVw09_ynBYH>iw4$*1cE!Nqke^UzG)^Wpa
                  z+yLwk>DT>1K28EF?$^?$x8We75DNmz8dh%!D);>?ZJ0ehk6o6oXlf%#R%>4__wE6G
                  zNlmDkd-q!0GR<1;=IZt6-Zhw;jeyoLoAX4a>~{mdQJT+VJl$KcYej&f<2Ens6WHf^
                  zRocz~@sppn{%W=MkZPlY{i^?4oRQ^-v*O$$Wo-`*$h}$bQdt>Dp5DSSH1$JM)S0^K
                  zYBQZlba!*pOl9|Dvn@}+2F99=0UpUUeL?Rmcs#N!HQ!jTF8og3Jw27=}sge(N8M*dZ9MrFjc3REpxM-bG3g?
                  zB}lW`5Ax2HZR9a8m#dFrq*aF&hzdd&4{ca9)xY;{I8U|uQi*9k3YJ$4*ZJQtQ@Joj
                  ztRs9&
                  z8a;y&a0IeVZeHOo@L~O1iN-t%iYWcgeEYHHdzR8{F41u(wOXlhqon%%4P`
                  zPt|@(!w*b+h}!SXPwjAH<)hY3QI$`9YS)Fh-=H89JJts_M%)YY^2V^}k^k!*?gRKf
                  z^T-%}S}0WAAR6`dV2POc5V?`%n10YVo4<;>(t6KaQ5g;Fy!7hh(VC4Tt5`zZ_MKKG
                  zZ|~i!7}d%$!RzOFz9H}7;eB!iJo8N2sHOore%+>DC6udAzkXTZ`wi1bg@>XvC1tVM#>{A&7xayp^U4TXb)jkHZTZoX&o-32rok=s=bs3l`
                  zv%Tb5_P0C=?vt->BmJ-_@kPN)SdI?m2>k=yFf>KO?`G$rWPFGwQX-}P;75nnB#1}T
                  zaZ5S#EQ9fcR-;l1v!+P)<(LISs(^4^bmEaR_2^nzE0S>@u;SGIr7rP#>ki!~mWL&c
                  zQoA@DdBXCuM8aiht6ygnwAu@(+!8toesPiSYeg27>Qd;jcgm|nvMVDH)FRS3yV`8V
                  zhbP9ypa`|OwY!z6-sZ=rZA(hhZ2cfPDBXFwPZkAF@Yhs*rkE@md9!2m?Gkdv-@s!3_%4N$^as6h4X4hvip0yXNZUQ+WN=oPy`rjL?
                  z2F#WQeBID|ZmX5|(UOwX-xaJ0qe;}ivS=r5epM1LUb{dM-D@e^d5
                  z)Ul!vYm?S#oOo1DDP58TBV`qa9Dun@Lu*)=-#f9ZyE{sXjZK8MnEzh)o^?32oCbw?
                  zBS4!&B(%L8RP`XIB#Q%X@cj-EZ<6^cD5oK8#Tc@ZWECfG^uDCijfKVYjoDm@uTt!%
                  zm;1&3?NW{bPWgwnoc?BRj856tJTGxat`A~w9fG4TI$^5qAJPWBfdj
                  z&1pF8xW4MJpiNZw-*z`>b#|@Yj*1E26AtwIZ~vWxp%47F*H{bma0G=LzprHG5h=q6
                  zNVwbNx|q2s$;r*)$$=6*5lAU+hXzDf2Rvk?r0^tv!DxhpSjZnVVrjzu+cLOtIJkjU
                  zk2g=W_LdetSWbjq^rK@;BMk|?wt&Ce{@}*47a^TVp#MiWQ1$;sg5TxLq4tEpjPaj`
                  zrqwIJPJ~-D+5HRdOmk>(Sb)4>bwmMt$m$e0`Kmwd-yr8VO&`w~`$q5oTLJDxbY=Mx
                  zfIZd*ey-Z9G=#$`BVhdNt}z71No*beTxa98_&g_o{Qvf?0m8tacR*%&l_v6!s*Lvr
                  zlSF`*hJBk!3OxFs4@#cj0V^2&ni`a0F{WKNU#s&M7x`4ffwD&Kd3y$V3T)42u_2EW
                  zE0syv=84ep=cU>Q;`bAkFLEPpFQP;fSxAyVBXH-hVBm|m`{?$Lu=$pPlM{L%Qn#?sRLMoFm;C}DDJ`G=I@w~$WN51JCb6GvKRg(-blF||tXKIIP3
                  z_k#g~PU&Lb?3ZxY)y_qu3WMKx6H1@i;Eb5OCT{G
                  zN~l?$Y?m!3t0ehZBHzJpnXl2Ik7*uJqs;;u`L?72kaHx#S+vhcS(T1$x2GamS*Q9O16D+woQSBE1jiz-6tR)(lczNCS5%nCF-dqC0di_
                  zp2B{)x43$YF{^f}p@N)VZQzw=uHylMBNNMTgZd1x$L%fA`k(=^rQ}oIW&^H3TkKaeZs
                  zB4JH_Z>05<#CEOMs7xBBE4_6NBC)eqoGSZ@Bo_g>&2*e3Wu-M@lo#KLgmd3vW9JNf
                  z$;QJY*hc>STdTJo(r3byMdP^=
                  znVP<%_XVVoaN^FJ?;uxP96ev9FMnpIhcsAS+*onQ2BA*!%~)t){QMrfcB!TOoDJ-K
                  z3K1ACF6tdEbF?2;o3^Ubjm2>D*@0qL%GZ~kpu1BuWhZKqzSNJ?rdCt)Z;`Q3nels_|s~f!O2+Le@--zN$?-&Iq{F
                  zJO$D$o!i;QuJFzO{i@HgXswx+6?gUHlRR%%GAC`ikKrIkdHI5NR5dS
                  zE}i}{mDY$_BE=X3g(s#NVq&O1@10`Xg*`1%8J-tM?2qH6lBa!?ea)SbXHdB)jRz@iE)r#kWxVaQi`Ce?ax%rXtRkt;lwJN%9CxCp-Yl~kjQD)Iuw
                  zVs{pd`lb;C^O&ktc6E9l8WldLUC?bFk>Uy!#Ji6cG0N~#Q7Q?c=0l2Sq*GAYeEp@z
                  zIagd#lP9%p$ILI|Z|2LXzE?=sA*e0vEeWAgMOu##5qt`i+{9}Hj~t!)6_fAne;?34
                  zUuqmemX)n@SGmlhq&YMlv}5>tiWLVP65ZLZu1Qn5)hVKjhx=
                  zV(X&`$*;E)=2RdNW~%E=Pf*>w${p8rLK9!AH
                  zisXCTUks;7DF00^(!~T&(qSAiG1VLWHiVV;CG#%wkI;WfItDBG}ByscSc
                  zCDuUyoRmVn>$0>w+wjQW9ED3Mi^p%j))Luh%)7_?Ifc!06zq&gTBx^lcgs4XCCu(s
                  z6tpd1N4D@f*+(8Mi@iRuH#M_tonPQFgBZ)Hsh6t{ZlWIy2e2uNL(J}V6apglo6-rQ
                  zWUncrCW(~?+(Z=$I3||+6awCZBT9qQ#n_viIk$K+KtvE!woZm(eSFXiL00W*xfuaV
                  zK~Z`yM`|NZ60*|603}PdZOZ5+=|iR;X|ZGf-=_5Ky!Y>x7w#Cg?ugQyPe?#x%{c0~
                  zZ1^Ces1C{*IR#SPseZZ|b){TP~H27XfMcuaqeX9Z;0n
                  z8aEXtpna7{WS>ke+&*(?ypNK*(p9uy6Q!g(jHaYwc#7)ZcA%j@W)^`-P$N=`R6!>d
                  zOO?^NpABlT1J&Tl((~#kvg5rWTBZx`zsdsDvCxeq)5#V^!6x3r)!5h4syj_wVfDAo
                  zM}^xnjXvQag*R-`CaskXU1n`pAHrKDMyJTAp>Fc9fGA7FG@%LOhGY+v-sL68z)llN
                  zv`S#MT^8&LfakDG#g9BUGFEPEDHD@pcr4L45|ag(GA&54WD6^JJX37n6b;ml>yus6
                  z#fl13$m)7v{-n{!x`+7|D@v&>{|)wOz?)oFH-i0(C1q(ax$L)3z`Fsb-NZtIsEfBz
                  zPsPo`o3+Tr>-W!+0C<_awiKl{S$}1&lQZ`+IQ+=)*+sH!jnZ05n`-qGhHMuNR
                  zI3Yg4c$FxMkz3iR-47S>-{6?2*zb}_2HARE!Kam9)-8;#g-~ku_(;a
                  z)akHeY|yk@fTzb=8{0A(Cul1$&UHK(~PtqN|&F|A8Lz!tYx8RLCB3wqquJYy#9oBSZ2(09@j;n+8s
                  zqnCVQ^|>>*VDk$QiFK*e!O}
                  zq~Ad4Fc5V;V&F-_6t71ICbES^3n1C?3&LZyQ1~G;hO=r2+^UmdY
                  z4h}lYo1MI`8LqPbabRBjIwe5b3UO+ZRF7rF7vd+I+hFZTRC71P!Y4Lk|B~9?C
                  z4ra_&hqEPX&`k&QjeMx-m-bzW!M6p
                  z^Usdo^0(cs$de0S7)S6bbcN-rSgJFzL`U=;3g|eQbo$s+aWR{f!&OL60=#rJ)`W2n
                  zqgZ#2X+~&!zpmkuFBy!j?@!C)#_1!wFBh)W4PDNA2xEe=pvU-)u)e5C{^GF89m+T24R?v@T*-K6iG&uf(FkgFynNKc;md+BfzuY^+q}dE(sCFy~ZZzANDT@
                  zBrzyyjL?VFdv@v<56Crl+2LcUFGJ?;~=|I-2OQslp9_v*L
                  z*|x>-P&4D&*eX4Y+>&F%gx-p!F5K~QkkI+U^~aY4FaB{eSK4cMn^M&w9DV1B7Th(!
                  z`;i?BnpefuxDkpka#O%JR3vTxt`1?kff*BMq5l7TOm_znD??*UGtASPlY3_$Va-D4
                  zzyrEJ-o0V|D-LJZ0!)fvohl_n&9WzYZAW5kTAc`?m9)SrHrXkOVB<7$#)@>5_8@s|hKTkV(
                  zG>KFmd}Yn6rjbjj(KP=!gdhwls|}~ZJn=$J
                  zDl%OY6Mk&n{}>#+`DfECBJ?V&|5@Jb?1%IP<7uJuyh?W!g|Wc@_^t=S+vu?$&;~u%
                  z=OlEM^>JuZD?38HE?G>kqxqIvc2Mt;c>+t5Y|T!_yu+hq`nRnu|IC{q#U9(DA-Rfw
                  z38m_}5yPYQbw@k~w}>h$*B?6;=k|H6v#$7{XF{HbymEVi9=pshg~c)q++4tFcI2GJ
                  zhn0^c(d-~y_7qK|C%U>`|01Ngu!8RijG%{lzAco+yC+TSj^}YbI>BbX48+W4>)xY3#n~qg)ze
                  z-ic2#T@Nnme<_60*bf2W!V9Zk*7unK%i{ZPYm|s;dofHeMWTl7yrsFHMmWLJqWC2#
                  zw|s@}G`8lUeb1(G)t}k8(eh<>SXrP;FEHo#%n~GtM8IgX0U@$2!>vRO+_*CLSQ_(d
                  zRB5O*zt|t@=PB%Po$+E+jF9v4e>>F6+kUCvHIy(h$wE|PCmQy87g5T4tyK)*5^v~f#=8pG;Z#RK9Kd0rT
                  z^DS|no2;#2_ze9KqnNs%<tM{}6H!$U#m7p>I6a7^&9qJ|s$ilL(0jeeukKyT}n`%Qqsc9_u<
                  z>YtHTX62QkIa#i$x>otBhuCO^?Wn-;J(L0Y2SDT^DOU%pqO72k&=e^
                  z38|@7nQ4iM#e{pC);5cbUn=?EXb7|ZS3??U_Wa%2H?aWQ`IblphEc|alb_dSHF+Om
                  zYL*{oN|M$GNcGN7pOR0UU2zT6L@iZb>Uf*1P4dFNtuKToOwVG)5OsX_H?;hF^78rR
                  z-Mdme&Lh^NBZaA^6x*seA9TDQ_hwwz^wHbfZieX>ycqeRtdntFor37t*ijn=aixB8
                  z5fRolv>v?S@PL4}_Su>Q1LMj3!lm;=rryTZhV&n`druzT^iuh!mDS4g`Ly{tKCD44
                  zNpEkyvPE#9*mZGutZZn3j^o2%^G53A)CFaE8aKwzeS{T3tT({q9U^B804Bypjk$+BiKtj^`TCAiK*Mc#<;z?
                  zNo(ljPZK8UR|U<{bfR0c!DKyOXCMdc{{4&ySip3SY>HW|9$ygf`i#qAlA!61RPzZ2
                  zs`9dBV|VK2rBIno?Fy^mgFjCLAcAK2sO^g~xqf}Vd14Na)8H&I%Y*Oo@APfHn!!Vx
                  zi@9%R8AbnXsn#f8mFs+5G5GYA&^L>T-SdWjyNDAyb!cVq$tf=}u>%*&J2Jk2^_pWXL0W+w;^EEqjZ5Ju@Kj{#m#fgsSE8@4E
                  zbVv0byjSJToFW9WHU#)_thQAwT@S_Y59Xc4G%PT+s=MJ%9Vbji+jfE1+TOMb%2|~^
                  z8xZ?X%Ke)xOdjfe){O;YZa$u}iIi#}T1jxd)NqCBs{{-9NS4v~y6@oOy>0HY1M$Y5
                  z_Aw_65ya=^;MmNpBr!zB(DAV2B8+o;tHvuO!d>RvDzmy_1$t1njxo@Qm69=ces?pql{H;%0g2JG}d{iWytnj>uLk5C*OahFX8vPI8layP
                  z?&~rTi-9<}-t$kfj+2z6+A6oUbi2W2yb>Qe3FzzX1#BQdDbd96uPOtvGjiF~;tWLT
                  zn$NV@kQ?k5%=7bWe7^Hp7i?+Q1HDt#Yx@603o5>f(${+D
                  zHJWn>b%0|0Z=Arc5H!>N^eqIexU}ylz>aphx1)vk-zE#r$NK0nT|tPAO%t3{?LhLO
                  z?RfBtFab}n15*yWIaK?yvc*$aiwWE?Pm=9@G#K)>c2fYSZ{PL%t?%Qzt~`LR5dY^X
                  zu*?PXUY&c?=O0|J2I6J$;6w-c3D)dEMy=L=qX1@k8OYt1-)x6u(fLjemKb*MyA=Q?
                  zHGhkbk0imp+nC#krB#=kExTmpA%4w|=GDCi{+Gp)wRQ<KO_7>oDO_1*3IcnMgJ?VshH@WmpO~#h_>vvamgf@0_&D$^bK(#p4ag2>!aGQi42~#zD
                  zK8xWsog%8F(X6#hF-dzB(Mjg4?gQK
                  z0*J~IDRS3V3xx=4$DP`XaWa5Ii_ja;{5tBM@cq;~wM~WSL?@Oidv8E3#a??@IIHxil=5UAR3pD}y&rUD<
                  z#dH|lFx!p$}xAKKdgzYaRq#Zo9wP3XQ)!+irq4a9|
                  zm;VJ3`cqhqk#sf1DQ+WKXPQb)gs=Y|mv5iqrga|f9WSrx5rP69|6_~*bRF0JS_se5
                  z@AU9LiI-~JyfqRkP67&w$Qtq*9?zcUCZB8&q~Ffs>M`?{83Q)eiUDJ8n}dW!V#X0t
                  zhQN7PI2P6{`Yo#xT=}B2)#X3R>b)?H@#Q4LE4JHF^LVLtFXP2k0#kkOe#@cUU@
                  z+WD*oO&N9?>629nn&)CiUu0?NPpmXy>*dQD7AyMV$I8rg6Uu9djZJ3;U45^F$JUU4{~?JNXxwHO_-zbr87Ste
                  z55N3;8tDbRbii}jEO(sTr3Ign?MxRJmACnwtMRx`ud(;=t4+a;dIbV4fwypP#$E}N
                  zsJ69+2qP^t1EY5+RQ`0~UDn5J|`X_slR(a2Y)Fs&YxAznc%;=-iml8iv2QC=?Ncx>gIU#~8b58QV&&49NSq^dBBJWx`7z$E
                  z14237($n9rXkFJ;u|TOVrQpV1JjN3iI^NU+5qXPU^RXA;>auV*OnbN0_f~!y-t^|s
                  zFI;w_hw^)xUuvexr%{-g#5Yc}2$8`7tr|m)68o2XURA`rWV{L~Uh|0%Tb<(IJdH
                  z5``~&NrfIUL24ksXMU}le;*^*&9%Na&AjZDYNb7K_zF;4duwL^WtRTnx5{|vlU%F$
                  zk}E_Q+)RM08uU@8;%0Her$oy$pz@(vA>Pz{il0g&47*@(o^sJ$Na}Qz?knENvrQW2CL$+UGo5y
                  z{9|K_eKrTiys62K;da@uUzi_BRiey;8zjHK_oFg3dY}z
                  zw{&-#hPRg>1A%!ssz}{ZuM6BATP>Et-pIe-5a6)7O3K8-7EZf4rH-XCSsi~;%?Fd?
                  z;KrqOyL1Em`TV`xoeiZ!1a8(fI1tzRHXaf0a_8MVdGZsQzl>Gz=RV>76jwtxCeDj=
                  zi(j&`va^-i{mWw7O>#KLDqZ*9S5j$=j4>CCH?J(^m}QE_VZ7EiHMpq)TiI3a4;MGu
                  z+mzk&Q|!&GWA2&k;dX)ui0Z5*R-mB-A|oc
                  zx6NKftReU}HU8e=cN>t;6-cmCRMh4$7K*dNSO@ThlUUI2-lPV}5Mnm`9Y8AfNlRSn
                  z7&pc(q{L^on2J9P5PlGl^3zkTaD{wL(+`cCHZwN(Sa>$Xh&EBmTB;Uybr~Au8Pg18oQ6Ej*cgsG)0kW|R6G@0kkA1retPXM{e3^F
                  z`>DTOEW6c%%ubQTJKL2`!f{VJ3_+~BR_bnRD)JG9P^`s#uYixRQTK^oTNCbs`P=_H
                  z43R_oe@j(b!p$`#04iFEp1Di>zf)+P7Ul0%dbnQg#~H}jg15c2*^<>r6tIF@5XGx@ulq|{hG5la3oPH-;-G&GtytQZYr4_$8dj}!O)k=R!f$GCHPb&kmu
                  zH2$Oq7Ih^4*KLLq-et9Aj=R+KeE26-)NK!ydM#!fEB9>=!ps-q)&6fawBu;L@s+~s
                  zee@i5Ur$Jg@Wtpbsh{spvt5}b%GBhc}kU8vWD4+4?vA5Vjk6RKKG~sC&eXIS|kl>ivyI6<`1z-RQnZ8
                  zmF0$Fe4vXupX08lWT|8@v5&R~pFT4%z}Ml_*bn{+mPih$>jq6mV`SGQQG9)Fx*tSZ
                  zjCV!XdY1cohMupp(AfguMjX^=*XWlc`|r?d<{H*gF_?!%v{
                  zggjqiqw5{L2S}xFHH$R%;r(;YQ0`93;vat#BI8>LWz`=|1q3Z*LPA`NJ39jQ^He_{
                  z>fI&duOq$9jt%re+T0k6+ej@=KPG1WXY3@st&D~Pe+88U#oNp_X{Gt7yc)kkLHs&p
                  zadvdQcCkuV#yv<@8FCmXN{?2#?x9LC)cG>)e-$R1$kI|tPW#JN2h{yNp^x5V8;@k3
                  zoA#3AC&0w8QqDqQf9tmYhwnV@)Z47h!P)kcNWZkR0Z_TYSe6g;`1;6`%f~zWd}LWy
                  zi1Ez$Wjj$&kT_a7*)+#w5|fI%jo`YB2K!hHfe}V-tWYt%k=~-C)OYY(pBI)%Qwt6D
                  zkB;q8pYp}n0rqGlrE#Y{c@KX$L7F3AI&m319+kg|WVPSvM+47A=pZI%L!k9E1FQey
                  ztAE9i-h8H(I$0jT!E5JSnm8#;FmJEg%Eq>!U0^g^4h@(iub>%@-sM*8Eg_p(v~t%C
                  z&C7)QMtHHrXSmafhsq8?TO@6n2by_#>39iGQWLl|IZYEyQX{_)^dCH;wTac%eInj3TyY+#Dy1Xl!oB
                  z>B2K@8}ByJE;wbl+hJ=Q=yZaYTClH*e|I!_r3MiheetL?l>BopQj~Exe@Zc2m&{@r
                  zH9xvOa>-V=o^(`0TV0R>=yP-Ne^P8JwRbo_vWsZAVGc$KF9F+XyPT*Cm-y$Dw{@zQ
                  z@RN#iqrvdycbXZqcII{sjwZX|M8_J>b}K%;5ywUlL;;@`RPS+ZI_IjP&~~gPUVX|r
                  zBmLzzKAwa*5!q&W^lY>@^z+NA+CkH!NiRdVAGu%gV*plV)CCmcZX=EHNxxb74sl-ESF3lrD80mb?x6rPz_h=J-i)
                  zwJEAqH(&k1Oh$3m&e$lDkwrQoB{1|Vo6XM2OH(!Bm7()rGnt+lZSkN`i&>z1@ECE_
                  z`QdlUAe1|@ckejj1x&jQ(S(eYrh2t@5rM9N5sA4HJsCeTO2}w}9O&iCGl_SZ=@c+#
                  za=u)HxKw}IMNmu6M-5jbr&GEkIj|0g&!etJ93c1rz*H4F?&6OzGMd>#jor|nUqrL+
                  z71QqBv*!GFEWZo9=lz|MnzXfr(X{RO7v<=XE_hdpvjkEorJJ(7GbhZ{#TcxOeK6;u
                  zVSF?^*|D>^G8A4n>`Fd7-D_bSBiU`B)h$RHChA`*utLh(hs(2w
                  z2E4)CT`1gXkW(MJ01CIM8VV=eD~;BtsTzrSy#_z=QN}dL$RxXc0K?rKwXpW?WL0&S
                  zjN`2JkAo`m!!Nd4pFX5$7~#i%JHql9tf*sG
                  zk|&dxlP7QIbdMW9)Mp6(M~fABG~6c4x=lkbf2(SJ1+4NcnoSjh;R!_8eGA
                  zWMt5#<4P!M^Ah_JnC`mxAUtK{X{<%LeJVffNV*+}nZf;4GFAR&cdP{P@!CD;sf*(-
                  z460hYn)5Rnm@L2XTUU?WDuytw?}f_+HJQb)4$hCej3ou_$$tN38Q{}}6=9Sxf9O~y
                  z9|BsJ$1e;G@J9v)7Ny%491iL%y@r>(ay{qTa-#*P#Uv{3nXr~e);-TeAD`v1t_s!z
                  zjuCq9*IoVT3g5}y+kBb(WZzsq+2fF1!DiV-GLeI(E{sga!jvGa^9;r0mWSSr*>jNYN6a7EFEC}f`&iwP39-_4(O|_#)_!(2^fMY!S?&Tm
                  z_-+{*!jXHuE9_`cdG1Us$QfaIv%1Qe+sWP#`em?u;<%2Z9ofNHL7-F!XzyJ{-q+m8
                  zKN6!&W{Ku3QZqGgJ`oqOol&3}bP!d+%K)x}cZH0ptEP4Ww5)&Cu+XK;7Yn94qpU}e
                  zyDwW=B!NNil8o@sWQ{;6al`TCd*zjGWXTIx6{8>uaf9n8d0>`UUa>VHXzzOGB>z#C
                  z7k;8;7km}*keciM(A2C|X?o#0urNru7{o;$;(h-0q8Ofz>5eHk>*AuLfbSSkZDzZK
                  zb3FqAExZg}<^n7c1tAiZ`-tCtq*}r=f-_xS|1zbjd*w$5?(&~idHl|aWeWNf3(~Is
                  zM!|cB7%cvbDLR5z#T-hj`pEfsniX0QBE)>BYx-EID8xX}>%0g_(-1{xJa=_b7p}QV!Kb
                  zkdT_%_<(DTq@cse;}CeMR-c5e_Wq#xc6VYuf{+`_>9C1ROiaOj($S_2p-h+=1Eer?
                  z%)hYdOVaIh|SwkN*wUASz_J=!H{P_M3qFzfnxfFGkyt?a|e*cF?H>784U7T~D@E
                  z>{(eh%}E{4lxqe;wivA0W-}K|b!9ft%e!FPI&YTZbF+J0g_{f7z6Y}ltl52q%g{*c
                  z%yb7(R`4l@eRn~+MR!%-l-v4~hQi?hHgz$X*}bSjU5JMx+i*}&9U6TD`Id7XoWEZ2
                  z-9_fM=Ky8*QX&kBA#T!9TyjS3No}-CEC4*3&3Le@UWVgXUG${E0DX
                  z-TNiE_9TtnKSK8UDMcG@ZsfBU9qg7c%a=M0F_yAkc-}bdZ
                  zR&EXx$q`+2#Q2iOr}otC+hcKfT?F>0L?+p9QIsH-#5sG_)K^T_*k^(2OV&ThJk36w<3W2fGO&E|iivf&vLgcOi8ENT
                  zBXX3b2nmHAQ4cf<&~fA70yVD!Lh(I;#-r~aX6~xHTl0YwI=>1uuQ)@(n5uYFEDFMZs%Xkt+dIby@
                  zZLwzr8bn5kki8kt#eblGh`NO&raMwyFB@V#QVv0}#lV$aW9D+(p5rK`K
                  z%h8Pkw|~EdRNbx{KZU_>wv19ml2R?yVhk->#C+xhrrjxe6$ouHjHsjPqW;__Aeiry
                  zr%;B+UnnWERf86eGono9y<2Hh5%@tC5N*rx3tnoGbOcs!Gyb~PGQGDZ@`*ggo4yOj
                  zaB~&tWk!bTjdsCupLPfg?jk^S|*Z|r22WcgS+%9f?Qg!%k{
                  zN&-im)vK)#lYRO%ZDl8+GThQ-ng4$=_f}DHZe5#bLWJN65+D!=1a}GU?(XgoTno40
                  zK@;3v3wQSb0RjXq+_i9u!lhsK{`x5DIxjqPpSlA?FC58mJGSEj0is)-{4@u9JPWQQ3VjcJU8nZ9Dq@VAIj5I
                  zAZabiY3qH&t=}EQTB?5rthbOJ0vy<+1#dTYUqnljbA@2(4sZev+LgtW>pYpsFd=bmhxibT!7U0ZG54w)co`K#*E@TqfPzi||ik
                  zK(K7#y~OC_mP$2DWh7OU!~Ujt9PQq=xMJ9W1IPl<0akwK1pwt+`h4z@tQp^UpMB85
                  zfRG=yHG28&`5ZT+95t1bKaMIQ@o_w^2F2VNOtJytyW;vs*d_>q_so~{H$FMP-Sc6X
                  zW(I3Cocvz-T6PXf$zwC9USiXkORIBd`t{5=zgb{fJ&1?veLHG`<=9D)rrp4KUzW4y
                  zi)w(mF=>x}vP|u&;a{E%4iBu1dClQE)rD2z8WiT7X+Z8_jdqZ!yUN?TY)rzdh+VfmiN^W0MP|_3-By6ncZj|ED?w0=c_&$@&H&USG-=h#kTHi=L@0&
                  zWJ5sf)#4!~Ww|@GVc*oExjvu;$|{kK>A`yH*=)2YQ4`;bw_FR*w?qd0QjNUI=e1jo
                  z7JnoORRqj9f3ohciZnX1oSz40jGWpfVL~5rJ_{u?-y$$v^F0}v0q!yv$Vb_o9o3_^
                  zpTA*TGLgZq#T?Mb)JIF7zBkJH*xNU(g=ot1Wolql&c5^?IY7+;%~KeN+i`yv5aR+^
                  zj0^=06aazGTAmOhDCYK}G__cNn&|TY;XpHr7UFLj0ES-6QtbkOPU!Z?eFwvk=d2-M
                  zGHLQJtso-KTi2C*8ox~LHix+(L87=i6$IDfa9LsLTTsn%p-Oza+(FFl_
                  z2=CCW;ZzY0Xh#To(X9^%+=>?{`frM9^brGZlhk&!wE?3hH*PHNrH@zApmN6_z;hJs
                  z>%%)`>*u&^e&;}hh=EAL$M>->0!MKysy^YJukL2jZ5rvMGhieWeMEm^VgR_9)0rK+
                  zp`q}}EQBFI6$tcG4{)>2E#fF&V&WmCOK)5xI)61QEd(^@!8W^G3YdiB1wJPadilQKJ2$#z4)KrP~?B$UZnK||rK
                  zgafd^xhy^yc>@`WLelE#`y5NTG*i|Z?7`nlp0nGw2Nsq;^vuBNUF;(RLy5yUg
                  zqB+lUgVgGwe*fn>@G;nvy~&p6xTnzo()GvQ`m;W-Yba;O3S?0=0i
                  z=}#SJ1@_lyfN~$KjEj3Gf7S0|5mhVEd~2)I3~ey6v?LQwXET>A`ThZoeQhcS9ope?
                  zV}qw%PZds~A6)wqiJF@msYvwMa$7^Q`_aUj*WNqxM;9dLZ39f9JaXju6kfRQFl?^4
                  zPdy&MV^7Dx{Ug1O$44Oi<{hXaHTgnKPHpGLxmKWGjyqVSb>VJ**q#yK&_SQ55}E2n-5}@;07}`8x#f$7^p`P%zr8%p#@``J_u1YPa=+($dI%wPqC?y*K|NhegTt@172<)poYq
                  zJ!Jc4CR5Oi``yipzQUdxVymj8yg2a7){z)}w3^p?N2;q>5DR=7kkR0{VUGR!(yu|4
                  zK}WAYs-kQ;U+x3WJI2hi;YL7JfOGf9veTPONAK@MEWOxS69Jox_}^YloI2AVvC>I3
                  zgA*)y^~YT=Y=Bq-jZx6IxV)6qog=Ff?I3^!Gc?Ud>7K)IcE20eczR&z
                  z2@(K$&wBKzn;t|!$gnqRT>vEi_>fZ;8EF>U>*_{mgZCgS6+2oT2mHi-n8$T)1LxHB
                  zE-=$lLx9LK1Ojb%5SiEE=H^z(JFbA)boWt0KbPI<4>MiH;}wdgl=^ZgDqT@)=UEKF
                  z?5CcDpFcam2iBd%7XTiIRU{(H_Zu+U7gT?y%~9?P00-}Mt!2}JenlkptU0r2>fMtL
                  zGG1>bFaz2?@G@!VY?7%pAZd&(j?n@$PHZL3kECMvDMT=?0Z2O?J*wCnN5M{hGgY6h
                  z(Iq@Q0&6JInaus1fFAb38&!=J@5RnCnway;4n!~mJ|1>xl+IDH=W71x^weX`QLK)S
                  ze4_148;VsY0J#9^5M`a0K2X`>;y69=u69iTUdx9r6c)aQB9|@YX6ovv55JPRn@Z3+
                  z1Lpv=-ISUcZr?Q$hJvW7YRwzR87P=mi{ZKe)(kU(%3O4XoW4mNcpdFA{2V@5svvi~u_<*OtP{f5
                  zZy4C^Kfd(o)6!BwShzG*fq$-lkKn5pLW)dp34XrbBU;kSOCvW~vRQfbkgtkDqks=K
                  z`9a`S&da_l8LZ2wAc6LvKmmQCbr%`){{U6Fptz*AB2}I;L#zLZTBO#?Fe*Wt_re*i~FClGO
                  z@{L2+MiGXtsw{pdw`s|rp<&9shj=wuFu2?xja=6zGGDAM$HWPF*07ld$-G<
                  z-}FLj%og9icP;8mY|%Iz_xha5b}@6Q9vU44-Onpl=kF!Y2fr5p!xI#YaF;x#mo~U~
                  zbb1HJwG9}vNJoELlm*`iC!!(A`PW87{b^(#8_OC~Y79^wK~}3$RwW;J+bmAAxGfq}
                  zE)ET8d$!~>*VD(f@0u+nRK3m5WLaVf?LmAsux}7;Y;O@P^kQh3@wm9-I+Op}Bb_sW
                  zpQ)tI@5o(Yb0n@~a4z|>)Ub){7%|7ncdF>w2LGHNgg~?4Pz6&sq@z{F4XQF-3Z5}P
                  z|4q|!L3UX5Oel6{nn1q2grmaBIu;f6!pa4oPP(7q)dIVfRE7i
                  z<05H9;w3cGap>HnB`wT~I{%l{Tg9~@Ro2`aea7@jS%D+!%lEaurvvo_%s0N}Dm=t@
                  zHv{g`frwKe0o@!)Ze?aUR5@tccD+emiUYP-bbZh8WSwP0CG1@Ug*<
                  zIE>BjO{PZfa1Dt2j{OSk)eD#Z68k8s;j$U_8cAIV{En!!+)v>2$qxnW41ccH$Oy^D
                  zOK}%wK!<
                  z4&2Iwqrv?01a*{t+A@eref**yW!(A;^k!jG~f^FK6B=$wER#;Ahj2AEks~qF&(EY!K`aftEgM<1DtSNA@2}`YYSd=^O
                  z6b7cdx*FZGeV6`7geV;ZO@mB^KTIm+&h;iXZNrbze@t;C4u!pM21`
                  zV>?biQgEqEC53rReYuNX!B-_&a_O{v-qON(NZekhDrX2n8pfBvR_*5Hu@{FAh}wEx
                  zLx;~M(Vh-n7f*SF?_fUVK!3HeRbPnr^qAHXq(soHr7|K+GWIsUtW`K45bp)1m0(;#
                  z$~wah9yp_724?RDeZD*RERiyhqACM2)f3{}=A)P$h0^Dx3(**y1jJ&Mo^{dPSlCwrpz3i!sZw1AI!rWsb4U*b)Y0
                  zRGr=`L^&N;!>X5ZO3ihSQ5h;148aY_6qNV9rxW{WaFb~Umxpx}&zJmhc>_I6RtNf0
                  z=LxJ!72tL$o-dx-;PTQBn2S?mzc-JAaZlE+?zeZqev!xsah?3&+u7u3>pp0ymO39;
                  z0n6Jvz1roP99D-EhrZX1VZ4F*`M$*Vp6fEb!eeO1@=+0@(EdivSscV)_@F@}O7~+Q
                  z-Zz!^n1maF%tkE7>7OEy`Kyi*YHFR)c#{ON&$aL9oRm0R43m
                  z4+BSMjC{cTVqh?>e|a*V#%*db5c;`v*9amv@+!fwCemBJt;D+TfCHtfHebq5td3eT%&kjN;YEWet?y
                  zbdeJA51TN!PiEfS8NcNA3mZ+{hx3CBAso7Jg`lW|WK}bi?qNEfJD+3s;n_CDC56-r9|61OgY&Ryt+B@GCFTi4
                  z9$GzuX}48%J+0UbjO8r#7|<2WF|TwOr4M;zp?s!9zrAWYV))CmU~s+mxdy9`%Kh?g
                  zJ2$7OWbVW263wG$5Z@$$#H+Lx&{vxSNpeH+p!hdi>d*f)Tidm*-u|J@H{c#gRP3T~8Q3=vvCNWMrs#%{;
                  z{u*^DT7jR(v||Q*ZPedQrj0iyp=9K8^;h~Pit~Ia;|7fwE3Ry8{0r2ie}h$NMTFha
                  zTh8TJSyp(~7WG4eh@V>^_&G{@O18jH$FcsuhfmvaCHuxJhNux^8cHX$%zM$|<&Ugb
                  zsB~*CUm7aU2QlhPr45UbnehQnxzU*=K{xXFT{M>1CT4#Bd8l}PbAB19Q7r(XQob|}
                  zT%k)cv!+!;Dd4YCD>r7)i=Mb71X*qM!U^2?yVQtD$F7@^JY|^f&i3;>zjUJ8qU0$Y
                  z$6oTuv&HH|^!MQ#A3#aQgDWHF_vg4-Gs3m5wD9`V69@nH-VB{P3~|+&KnrZf$HvUc
                  zQK2Q;(w|Ys5@aK;n*Ger!#q$+
                  zulYSatn56rGbXkLL*>#0?0Vp$pVQeqQ<*!_ZHq`-IsFx=Im;w(8Y
                  z{uHM&!i_FE+c8vLMB={|a+Zd;4U2+Almh=0v=1ozLr7wugd57;4|Q$&3Pa_v_z-u@5haEd!d^$7ir4^fbn#ndftH8lI1idS1kuYKHS
                  z$1gcO0c+Fvq=L_^Z>85z8Gn_ZCJnaPWv>lRs80u>3^FDAb&bI*_SK
                  zw_~`FIuqib(k6EwMd2pI4-ZF#&iq!-!jlZ>QuZ{Ex4xA9YZ~(GK?qzw*H|iM+@aSC
                  zH<<2ul12m1<<@~s6mBan8Y{wH%$F6GDkber?b)I^4a2;9K`Z>S|p
                  z_mdSxLH)A{$&eJg%v{f~;J=BwoPkrE`mcwKl<@&f^69IHT0`Lb*+%W$ZEw$2VG9jd
                  zI*rHM!Jj;z0aao=XF*$ZfJ{b8_&YM}?_*RA9#s-;0(X(5qeKU#y59AcQaU>>Yy!nro<;rxLBL3GIKj&<+*(H
                  zjDvG+u!O!BtY*RW<@)Vhk;5&pP0zRr7hGj+Sb!y3VLi@!#%=gpXG^JEnuzcCHtSBQ
                  z)LfrV#}U8v@^zk2JAxBxf}xq&x0Ofk2*3&=n`~Nq?OAG|wdAc3gCaka6tu*^5q0YX1
                  zspD2^4#i<>mV7P@g6@XkWd#nexo9o^1JE0bA0VLA`mK*l)JjM6{O9^
                  z%am=e6;F3$eQx6O4It*G{p9Idw{dq($h5Q5f8%JM^8OQS;_Td^YtaA=rpEedTGsru=1CqamLoj+Rgt6f
                  zp!4PHj@r+|8y^J(hmaOEl2zES@qrZ`>ucz6g40)gFOCESH}x>D*c1E
                  zqnXa}mxuVjew9InEA%a5dV=Z5WM#!>>1FO}C-CzIj=1THdq5#rmwE
                  zmni2RbHV|W@h+30=ykt>BWTTTkYRNul!OlO7G$lEX00Bi2QYTJ
                  z_GLee&o;m!GYuN*qUdVTEk^r|A^KjMLuTI+M^s0qw9+|W>1A%+az{wC@flEWTv3KP
                  z;lW#o#)buB&W<;My6gPsQW8#3CugS_aN1WimZLkj$gOyHvx7f7r)@O9$*tLP$D&VA
                  z^(u~nH#Bji{oT7vf26FBQyFP)wnxQjZFKssNH0Qc;?iD85b}G*;Qmi7z}zHGAx4yr
                  zt8U;6M3Iy6Vz9fHVX*9_K);*7gT90QajCF}n{FH4_qDu>-Q%y!uSlnx=O1NXilden
                  zXW5^(Mgu@j?_l7P;-3MrnB;m31Eve2H{BQl87zK{G9}WmQ}L{cV!g@9HUTd$+Nszb
                  zFqixSgY|imrTlsM_nzPk(2sPkeKN4xUht-8>WNG1QP)nl%1Luj({K{TPsj|BQ_~P?OW~7V0-d@Zd-yVd5{
                  z!mR=C{$ou2s-U>jz_M3Qgc@o;CZMe9-0Q1MQIPWZ)3Fm8SVW>s%5uOVIK;cbOue6Z
                  z0fB!W7KmvPw_?@A5#x#>W_+%+?RtpRvw||VvH9(YYV**v>EjPUB^}{kVY>T{{!PiA{(GJrn=5kR9zb%iy`zmQPml|qb9
                  zrq4}g+nZm2RYy&hABV)~m0E_pm;ACDnEw|4Fb98A7AW%dB7FY5np?8OA-}MXa*+?)
                  zp#b@48$OZRxQifv6T0#1o1KGW12Yh`)2p;&2ewryqoa3e0_(Fe8hknb;vs#!&$}5D
                  z6~Qc(5u3IRqyM%6MwVV)wTsQ?jgkV(TY9)Pyg-&ArMA)K5Wxj#Dl8Qz4
                  z_)WIOAT>k*@bUPl*z=!+hW=7uc#uhP;l;)4n0;#DW;)#Y)3`+?MN>&u0_!K+I&HHN
                  z=p>P9mWizy{*lj1F2zLE}HK8A0sU!I*!s?EIm}W-=Mv08LpZ
                  zG8icH&uJmLVzvFRMo4Jramen*g7$L))m8#s9qU1@zrd
                  z@GXc0h&XhvGh@{0F|A=yumrPW`>mOBmyECqA7j~q`x0S30)h$rjqVMDU}33JnU%nf
                  z$BHwrCogI=y4yqRmubmzUFTOz+&FBZ#gRMm@h^A_EwYGv8ZbxjpN&-0T+9w;w~cwxfWg
                  zYYo?<4L<5}9D6n8u-iqPHkE35pU*@nsp;@qf15~-Lhn;F-WLFpzB87(BkWg)3$D!TAKN`RJ
                  z3U;Mo(@a#m+}NKW?ro|#Gfd=76wIGkwWZ~nNjmb=Czg5!(?cW6{F!C-GNSO2VYi+bh4&lU&?@bMc_Iqdj6G*XKvAXlfuG+;8!2zz7W2R?IZ>^!Ml_<8cFBR
                  zW#CaCxXM`c_x3}zSfRZWXUlSPdg-=s#m}nFqGam
                  z>>jH$CrNEs=Yk@HQ;v8@1M<}0-Cyo%r<-ZLEWWVJ{3*bI&hhOsZ(>Y?O^}Lo*y9DeR9ABLmwoj=RpoS#Ip4~%G>ik{PMa-TkI(88i2jL^K~yht<>zw<
                  zyvdCH6VI4NfPOJ^!pdGEV;#2=~gG&9f%k&Qb|O9)CvqQ;Bz>?k_!szFG{Nj
                  zSh&dec3EbteB0qbO|yjSNodpSr8o9@c`p}lM4AbA8d>nn4e&cQ5-v06E$o1<=
                  zp+n(*$+3mfO43A=(Q`8Lg4EurqjnO{H?V`g>yHM9Oiigy6}P@5@;H2l
                  zlM&=yvj{CHS0qcz+0x&>Ult9RM8AqpDQzV7WEFzEFV~-#zvEL5hgzFK?Y9z#-ydq@
                  z_Pb3&jaI(Bt=n&TKRP;7RbSn6Cot(o{dI-j2l8y1@}Orh)6-yIqi%ZVNNZEU-E($7
                  zm6`3NZ}WTo)%qvWp*1>pB;drOGT5v-{>h^Be9v4nfT)ilrgcdVrdA#Ws4Zvul`&qP
                  z7K@2e?7dBzemEAJHU|QWmz`H5Z_6uhytiCyhg}S#(!*DPEAkl2%#+#la}I*6xyZM)
                  zVx!*aOFBLVnl9e2VM@IT0)KvNVYKoC2Z7K3nK1?r!O63xFJBG7gx|hXiZ&UM0b~i6
                  zu$=z$@EPt+Lx9P{Tzn$m^5&ojWEXM)0Skw2wnc
                  zgHaHDhG22Dwg(twcc}hr8@nOx`!U;S-3s=nxhPu>PYrMG?YtiqHXORyJBtC%Rl2{!
                  z13*ju`}LF0O9NScSt2{QGdY%d2%4>JXuglt@1&EQdW#)zGsCUpho{jiJ5(`U8}2Fr
                  zeVta<2Ozd-D6z)ODbL7<@#%hlvNe^5$66Dfc?mnVs4|9|adK*I)F;X0X>B05l?(Wd
                  zivcfXQK{aI*V?NqY*+Du@FP5SCtTmFLjD#IgH@(MMH#^|RAc7uuJU@P`s<#UrjE{f
                  zfDM*2lH6@jcognNl7WGKE%&7IaXV3oO{I4ayoW~C;m>`hv~dH(Y8D<
                  zm{!qx8U^WA9R)f5HM9Ch>BnRqO!gDRd=^z6FxANNC9I#D90k53C-x*2rb?H#;+_;&6`STY=zn2~BNn)8@y@!jHYg0&Ej(
                  z#?s2l$Q|jf*nCkw^)zY@ko&lJeLm@3f54adCH%T+SG&UCkuy*V%ZikSTMB~kad}dV
                  z@pf=0w93knR+TDCN8s|Ko*cr$J7+ZY0%VUW8((Kwbvok~7wKC>YEUE+VSRM+B}qCwsymvz_Xt6LaPFz==_jEnytRo@pHZ<`gI
                  zAn(kJD_ix?dNAkDpVT3A3A7t_`W4=Di=18z>lN_B!}60G+5(qDwG8d+lU{`)CU^w5
                  zXJ%;xeNQh|?P4SNxymh#PCxyU?`THE7lFo_mdW2e{rw2h=ri0l)Zjh6#w7ODjp}J;
                  zzwuXq5Fof`c@*;o6Yk1$p@|sr1;65}k_OB~tu=vtH40DrUHi&x7Rtm!J3Frp{hR12z`!tf
                  zYcKn%vCZQna1f|1Wm%tlCBR(}y{wm3tR_<%sFZ(m=`2_+Ry||5?F=)a?5P@Oe8y)m
                  z7qpbd1EmOe3;0P-nuiH;7E=*q)y0k8mJp3s`6uCmj|m4AIx`qb?8jf8Ra)pPa1V`{
                  zp>Jc=(?@$fUZ*6~#%0R$8lB1l9sd;yXRgArvU~lCdAgKJT0uYp)H=UM9=IYi@9(I1
                  zwjfi1_w@JQ2iN$N-5W3lI%W|G0*PQcstpArb^25B?gS39=k|aNHY*JN~J%Mr@D8!=FEr%U(=n
                  zKi`7i*%$H0$k${^*S{x`5{@Y<3T#$Tb#0rfeJSo!hjAQJj7m!z@nyh3!S7M!+q&~=
                  z=7N08#HIO4&DTj5*x%am3hiV?{A!`h-XTLju_X4k1ILXfeQAtH|sE#K5-J1RjlK}ku;)y*(>
                  z%BX_0bRXOwZ&or)nN1B}ul;>q;NLtVnmcv(TsvQl*@eB#Kz%B!E@ZX<13QjZFW+lB
                  zCnw~JrLf?L+NdCrR>Di;OeV|l_>w{h+`Xgy`>xhMM}{X^&E$Y2+EKRn{z7|!N#bzv
                  zJmK_9CfZ=KU0!snWYDDI{$*akPnyen1@)fQ_R*)dNB^Iwd4)*u>Gkz(2$dQsE+Y`2
                  z^)#yOomnWj9y-aSD0uZ!xvvo0HVNU5wUV+SCXXTe909t<6(J<;s
                  znM;MsD6vuhT&ITcPXO>lESXs?k>nB-F=$j;GxS
                  zxv)jvnArMy&r8LLPF+%RKZ)ld|VlB&AZ4}7ISNxDBTpXwHOpgIyuCkgqt9G(PA?~!`12A##_X4
                  zY|4po-3Wkms^1rmPr&P1o~uc3IQxx9;5IGOWn+J_+GHG~FMz9uu>su&m#m;6on1(u
                  z$pNC;sd{G(pjbqOr_n<=4q~KtN8G3EnoyG}#W#|UKNyY(l!N?J8&41}4lz7vDpVrO
                  zmy4B|$3*ORJO$~1>U9n$`jSm}wpl%pCeoM(u}=FD>-0F^eiA0y_OPve
                  zG60(gya*LOT}ZFxzQdtkkAxV|M=6s#k&u!;Z(gz)xt(qJ{8r%J^TWHJ-|;KEqIy4brg@(!
                  zJ78k;6WsZkw$z`;wjU{-3-=rEk?W1-l$$lMJ@N*C&6P{Yz`VyE8>_PV$w=x|et)?}
                  zHh{QA{&?ne^_5EB-E2~CAN%)lSS4B8!7PqxW?`m5+}pe|0FdzUOkxS8!oqo`t7qdf
                  zt0*@bj_ulg+e^D~7fj`{+cB!U&jL@&+nu-OJKJ&=ghcamC)4Y@Dvj~@Q0O9}#{nJs
                  zDZFvuhd|b6;DYzJcncZHk>LcmGGwWg%9nyhVs0ju0H!@R=Z{7XGuapU&}LUX2=o)A
                  z$W4lqd)_e4z<>EDfE>5_(m&_IX8%I)JbwRgu9lEq1czIeu&)0Jrk5cU$oc$~{cS3I(Bu$azK=niT#4
                  z&q#9zegz}}nTp@f5?CsP+ULKjc8;3Nb?1C;n5`XqU#|V@GxNJyw=Q+NMS9?V!aTcc
                  z5!1wpQfF^cJT58U(6wpF;Jz{a)qPX0+rpqZ*B}dTbI_T9fPLXJ%Mhj>_b*bCZUlod
                  zhi-pJ9^io2JPJOlKA}!e-($8}unf)qMC-CoSejLoUwpC|p1EYarpJV@(&5;Rvb3()
                  zMLUQ0htSYEEqq&U-SIvI=OOhtY)vGWJh=esfsS7Cb%IIXo`Yoq(^hAx1^z2MraK-sFt<_nGrARSi1I3N10vbG>JvJ?{)$$xN^93
                  zinXpqP`E%ph-Ff%?;WT#!+hSFW?PEOM%Tc0Kg3a=l^Q&^VzmL|D6mO#(jIc47AV#v
                  zDJYG{RK{dEu&<6cq$ZY3`O2$-*Epvl{cZyekemlq}6imgjhz!XnBNuWpV1dw#qaY^UshT%~zYed=I5NUxRHOm;$1bxJ-ljL2Qn5qiQZ!$t99VrzasNVT6lImW6V+JO0*o^7
                  zq$tM*WPWHTUNbk<{q!lZ%3*UWY?d*0R=eeUH7o7(o1S_-gjvc%GPXuOF27>t<%fh<
                  zZPCw^a5go!@d|kwUsU||-LY%(%4$A9lNwTwRn29tE>2AmC~$9R(CYKBM^!+NXt_)D8*`Z4gZ^$JpEcJKJZ#GNPJSy#5wE6(DQaxNL(8`(-U**VYqYgP!FHCpZtaJCP1Bw`{prB$
                  zI+4HGPmxG0Zxv;U&9D0)Vyb1`>umt9jV1Y8f}PY@eiy&5dxEOC%9@>fXXnj`-@vTD
                  zT`*+bEmffx8I)7)x58Dl$TD_MjHK*z&!3cya~VhHHD48zwAo~T+2qW7f!V@6miX62
                  zGC)USt{2#-bH~nH)
                  zPDjkZvAwd4q{RJFGW+z9Y+wH804BfpXVctJx>_Y)X~7SSB){FF|0Ef%(mwxG5cD!b
                  z!_3QQj(1eDw^}$re-6hoS^{Cw9qDxmk68y;OQoLco1if3r`qE|X;7k{sgFUu0S<*J
                  zN$F?`-DUHgidsONF4oFhE`2F=^^cEz!L|(hDHSouyiVz^nD0RYl%PfDttJ_~fT&}+
                  z>lB%AWYs8C$g*1@@3IN!@f3$DLVQ+D^l>X@?$qn4U4p?m&S(tOg%6YvKD7%A=46ua
                  zFu?5bG?Kw$f(!{63992}|2xWcoex0{A8$SaCvjjrg%M`S{|T6vVf~hgx3_5#oG1-y
                  zaKd;NLc!Z3Sj_+C{Ph93tk2t@QCmK!LccEO+mi@(s2|z5hsK8Y0yjSM*s(2pJ|A?(
                  zELGk`0cJ)6PmN`|RVGIQWxm~x*}o&7p4j~Vd!C`+{}xs&Q#w(uL33&ycYFXGGk${c&VT(k1t0&U(RvCC
                  zNefQ_t(QB=E_KonAVL|VlhH@`_b>gATH}8kTRVjC53U^=n~HpQHh_P}_6R6G!UK|$
                  zu&ky}y8JuLlxmtv_51CupHV3AAU{s7IXF}amu?3$d77$iy4FquhB%C0S5k=o^5Gp}
                  z9t(wgFK!dWAo60hydhbB0(mh{lf;^x7xFa5)@#b0sv6k6^{?&~9yI@p6EBr;1SVS+
                  zWFfxpTPuKY>_~qwkatJR~LxojsLf-_`k`Tp6YPo
                  zHni4@mm3iZSt89f&7kZn_!#TeMJrY^doy|>LuVx9wM}=W=R<9_TxDAG?byc%;4^HG#eP&iYzn)I8y#L2V$UqL=tNXs?fF+mKE2i>{|so
                  zzA7(gMAee?fwsql2<=>#gzMRM4o%{S^@Npi-4_ME^7j{W4B+>rO7{rcKR}EUF`+3C6|=Dp
                  z!;NMGp+m{uqWIRVh{ZV<7}iUJ5At
                  z6!k~0#2lMv^qj^up6ncuCf_gY(KQm|VVB;TYJOF+c=imhSxQt$)l59NB>M~C{m{kY
                  z=gB7y4f^eZvb*hf2|iWcX5h?X_<;|kb3&af^``^>D=6J>U~cerV-HqM=CMs+)0HV7
                  zRbaX8jrd!j+j0O&5m%|M6az^@8wnl0$!vN2boBH`&3?ERI-*0aELivnFSB}Fw}F7}
                  z_x%_vQ>+46ryEjj^Y$o!z^QYGpCYRA`wTs@S<7))*vqHc-qs;_+q^dcvt3SMDL;y>EE~_M~KA_?KL8
                  z78{OH+bnG3<}ZPU7J%2;6lCP(nK4`(1?sb4UEypRp#LW+y@BDQH-I*w`@FUpe?doO
                  z^@WGcYUvkaOxNfrracBtOwMQ5^@D3knCFVOpD^N+uDI1YOap~}HhuoShr1jm~(pzITJI!ZOQYG6=^c}8^aUso7A8-kJWoS#^Kz=0Ez{RobZiX}lV2PR=-!(oFmd;=6)qGFUJS#*t_mbBP|=3kqWJUTgkuGYQaH`|6DhAzwgtrsgz
                  zs$=(yiO;>!PPx%3SsPubXNWv5obK&-LGl#>qEF8#2V9-O*M97BjrSKzGX-81H$i%w
                  zb1KKy_u&mUi+mAxND3HUdaQ-7JCb>;-x~naU%Ar%7krJ}5Or9IvJhcnr0OMKxE_&P
                  zYwLEYHUV2xPQXbdZ!v
                  zzARgN#Q^M3PIL_OemKhJ-+r2Mxd
                  z)iq(5!18vw`$gZz=ah8qk)mwpUZ8U>%6KHr6_p#jLsh78g&nBB<(?SE@kF;zpo+=abz(n&?A4HFee89
                  zv1>mJr7?~N#3%gW;?IpHOaVZc%Tb>&T0XD9tZ?gvwh|7oy3N4
                  z15j1HBYtrK0K@T-pz&q4Qvt8%{Q0r`t|5q)_qkX^lkxAavlHrrvYmUNeyY+PN3-o$
                  z8r_aQn<`1b$XhN)(9!9&a80TZHF-ikfa4IfzbRp5Me`bs3K38#dOob6Fap_25luck
                  zulQQt51=fC@9kyzfnMtCM_=tHJz+tFMe`P+4PtMx(#o<*f3Vs1GpF<6exD!nFrNJp
                  z?f_z*QuW~jMsu;#`8T7CZgj1seVzM50NA+xE~Ek|(VVU$7=&Qfe^clh+Ih$
                  z3*Ah`<=>
                  zxp^CZ{}Utx_?<{tSjN41hobd_lHn1Zx&xwhU)A5*!|73EWKaMJs?pH-#xC_vh1IIv
                  z%U|mNpO+&eLEOO!3@tbL2jfnWmX;Qilq3Y$m*k>Xhy#1sZ0>>{WMmY1X18jXVW=?Q
                  zhkI0RxGo|st>jy(=w{fMNovqru~!i{BM;*-p>1mV2x+e)`wc)}f_E`6v&_b^m5x3!E_QMqY+$0FlJwz@{v}Zt8fr;B2{=
                  ze};j9=(4{V$XG~=qJP{q@JEjF;8@
                  z`WF}1-0ptt@U(cAiMcA;+(IDD>J~2AeSvhspJ1oy_l7;Q&~3AZGTWlS++3@@3u08E
                  z!SxF7ZU+X;MhJSd
                  zuI?UTiug_d2O9%O}adCB=N7T%x8io@bWt>spW4bK5
                  z&_`2CmY6$J03HxBR0_NcC31}Ln6LJ7@og7GmDX2CnIgS0dkL%tL&tgnsH9_C)b%vtcGutwH$7`oA0Lt9C
                  z@2*D0sweRuGVSq`goJhEM>RD8^^sv!m3Fz(g`V;54-tuaQ*tZv#78;S_VEJSnZr&x
                  zmTBwF(s;0!w)zI!uzdj+7M3taV0?KVGJlt|AKy~WCT1z*8AqZdY2V2
                  zwE>IRA3p+KB9$;yuxk-kzA{J#R4PLMkSHlPcG`TLlK!3rmBh-*%5b#K`ly2D8L8m3
                  zsi`R&+fu##9?iA`O!n)gu5lA1Jb}~fqrieqSlxg#AhdPudG36e2>zyRUxws)oFSdu
                  zxXas-29hQYC7~kU>k#$TdGQx4Mnb3MD|Kn9?0SsW-|YNzTZr{&r;n)5ao2&0!p8#-
                  z*zzWs6|ZZbG!E(9AB{2#F92g%)}AXmQOEbVq8_**HqCjxy~;0dS<4a%KQL0x-ksmg
                  z2yuaQ3$&XaAZ+&jg5nW<$}jk>3)sEpNgdajBp{N837_
                  zBR$jIeJFMZN?++wx80yvR<`?p)`^?jwSbfgbs#UCung_0ADj35C>y*^e0MW1eZN_{
                  z6w%07SZr3%`0h|Tr{JT`(8GCSADP?+&H{YuFv6bQ7FCo^hqXy{*S
                  zxVwvd%JQ`D^pJWCpx+q{8&D_~U+Y=zU;NJpuid)Ei#zo;iVZWym5-ihh*4Hkdm`>k
                  z0x27r@S>N^yk8z2_TB|!at;?({TO6ZTI5N>|30z^89$)wAgwUqiYlG_iMgAhADMx8l*p=@OZg&X8xPXHXmpy}Ae?)}2AHmvkld}5o#l!PET{<
                  zMIU-zCa2@UKTKO&+c~80Vyk&jcitoF-P0rQiArG_psKeg;4+l9u<2L}+u%PIEwm#g
                  zKb3*ScP;j#1@_xil_*7ac8s98tT8r)q~yo-qedi3cO`PV$Wm{vf9AoF#K+51B5G=}
                  z=bV7sl8rcIc#(&0K4L#qM%Fl4uuF#Ad5tEKPH=pqAbdJKF%Y=+qr0#IjWqw7X2u3w
                  zioLDwHobOlQNvDJ@h8G3{o`6XQdC#Hd4@^Fp-1K4%5mX@TGpA)fsC;q9bZk0Dh5aa
                  z*xj*DI+v5W?3TdK)h8g1vmUZ6+c|De(5_FOKhC5EE{)Nl@x
                  zy3^lZ-wcY0=3?z1HyWqa8iI<+U%PDZwp(U}A^vw3mm5R5)#`I8asZ3%$(Qox*6;Ja
                  z=NAa|UF$}ptpf$>Qf;*cxFTtkX!QEu40!;PdSF7NgXEV3FiMBax1Ag50|TA5f@+!5
                  zZ;QPGfXst%$_m^ZM%I+42!5|$bB9Kh)g=yysaRyqE8z<`Br2FQMngwi7v8f~o99S-
                  zYU*#AW69w^0pWb0n#Z%M(UV~zm$%D#-bD=^8F3mj>JNpkJZ~60lCk2$Virb
                  zvJcMt#|;CaX0ELRD_D3ExH{^C$J*(a7osyXzCkCbE~
                  zx5B@h?#b%(^Wr77rXPKJeFpfw6mBmvuFc5rSW$h1hzLGfEmk-~y}Typ#BnA}&tH>AWJgARjfdjOa6j$xwM1fI~aqpWN3TzXa0SKSguJxe7F{Y^3
                  z_e(!~X|h2O6~Bqh?HL>6jA80Dyt^I$@BEullsF$ZcjSfbrkmvAn}14u6Dz#!Aw)j<
                  zPF*F*kvj{6J(b;A*(Z~6cS}?_!Pju-5*RP$2@s44^%u4s^YxEq8ESL+?BuS;21XEx
                  zMOVanDU13{@-;?H{1$L7D0S-m{)`kRMUhIcI?;=rP3m+^?nhyC^xReL@0+c+JYTk)4vxg*F8{w5)-c~CHdpi?)CwvZway8LygDf%b
                  z6?)3ucD|13Z$lQJsc+BnZ}At(b#xn-R$^+KsgfT*Y_f?CF_N`fY7w*uEclv53d>XM
                  zV*12%GbBDgEOXqiJbXs`X)Jejdu!Wmzm)}0s{9GlDrf($bkTpapkN#?T}65uJ*!{Q
                  z;&QYXnaJ&XtF#n?Z+3`ONZ=R7KIV*lq0Oyd-=DRT0fm}$HkfwlS@p^b1SwcNL_jrV
                  za?KXhKsGJRBJd9*qs7v}?D2fZ!!H;2f~_f1IVuC_A>5^d!rgk{S`gNeD|gFHAcctY3v_d&Qzg{D{?s
                  zH8*t)@bjVz-mrL%9bXi|6PAS(Nvu-nX%a%1Y3t`|j9^!!PPXC)QSCf1si?&*`}FPM
                  zE6k1+uUHTP@P;e4IUXpEIhn8joUpwQ9+`sE_N-ZwG+~#l9%mhyTPLn
                  znj{Ua!35iXbRg>;opA-j(`@!Of&81=X^B)@W;#{}%rZXyt5)|BuF3O6B>ebSZveF|
                  zDi411cPJ6KCPPpd!&pqUgqA5ga6+^Yxef`26N8>7Jp43Wp9t`(`>XVrW8_cV9MQ9E
                  zZV>t|oaHG~^ivKc;{Jr;0gZdSHC-xnK}d@*ltvay8h}`mCefd~7KhM$=JB^oUF`M=e}-|3!JrL~zVm@!tz?madGuTvsl(P@rWgAvvJJt{Ru{2Z#@;^1d34W>k?3p~05jRmQfSlBO0&ou07VW%bYT?f%wZtVb
                  zL#S#xN?J23PNQl{Y?-}Rz$r3m6>J!Rd^cS1gvqjRFcR_!e68>JK-
                  zym7YtHidA;nq`MQg`e*s^QoICnW2gvJEk~9B*(XAQDw&_s&}dOodG8u-f~@vQ}G+J
                  zj7oZ+GcrTc9%igFJ?qestY
                  zt8&h51Rg%1H0Es(+h*0idvK{(C{(gGea56i`xSPKAu8qOJ5O&H+ArJCFt^O!I_O!2
                  zJ0R(LMDnZ_lOBV44!Id{Y4To|9(-?O7I!tYV3L4}bY)RdT)m-um-1x`nx?8ccadcf!D`UZMVmHxR2z9aZaOA~%z+(8%CD1fXik
                  zNsFG%9aNf+g}m)KwlNr`hPO^O4MY7a{G$9dQODBgy`#+!3TY{6^;q
                  zH0*7sM{FXa!)5FG?7F|W`j8{eWy#y-T;Ft7uHWlD4(Cq&P?}NFE6UF`T3VAiH&qo=
                  zP;BUJ(Mu77TT@U~+nOfF@&z?A(ll19v*>DB7_2j?XuGL5ynNEv^1^3?Dee%dCSw}|
                  zc`T9n3oz*wrrD0a?9+-I<1U`ZN`#vwXlRY7jeX~EY+l8WPOxvy?_sQ~QLYi^8Q=6V
                  zhGVYt^^xEsCZ^_H9`<{)f=H*L^NTF1R>R!~cYSF#>AFvLbjJO;$>5UQ&}c^S-8ff#
                  z8?w?u;D}I-{(2s)W*ew}N%krP|4z{kWkzn!iYl>D^maepedK3xMmzr>-j-hP@m-*i
                  V@2nuY{X+p>TK9C-%2lkM{TKV@1^WO1
                  
                  literal 0
                  HcmV?d00001
                  
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area004-v001-MC/word/media/image8.png b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area004-v001-MC/word/media/image8.png
                  new file mode 100644
                  index 0000000000000000000000000000000000000000..36f8f3442f76576111cdbf7a2743f3651b62228b
                  GIT binary patch
                  literal 16068
                  zcmeIZbyQnnwDyV9;!c6$P+BOi#ZrnxahIUQo#K|_v_L6N(c%zXQk>uvcPZ}f4uRxL
                  z?{{adx!-)V)~s3guUV6xaD
                  zV%SKjNTHzAd=G$WBqFy_KWoZ=K&c#kxsTkyvQU+ty)Nj0MwYv|w2c8=i
                  zqm=-sl%a&p#Nl(RD+Q*z!|PvGLEth|Z;dImnbrbviI+ULl--Z>^Vn%OfhZ|&TfY4I
                  z<$reLC0B9qZsrCz&l^fxdU9G~zO9jONRTalr3rI7p&I__O|Ux}&LmGDul+U^xJ}cm
                  zUavqQ0qU=$d4Y%pe5Zw?`};cxl&2bP(^##=FPn_5daqGL;H^fUATGN(XfHBmTf7mR
                  zc(gTyE>MFPRb>w6ZgOSfuRxM|9=_Y_wZT#vdl#dx%J1vmI6A%^2c0?Jl|7}2=2Cwn
                  z_naEal%S6=XTG(BANf55D%if2r1ySy2yg%9AMf@jYw12MU|pxP*6M)|H$B
                  zQH~8^7USa*B3tz3sb#wFuqA0sR+2!kgzb#U18z5;XNr=7SLe#IaJ#47fGz9n?de;H
                  zKNs})uVdw|KX10d#oR7DqOxCsLM?)vMXM4YlY$YfQ~6^;M+=`xO#?L)fkY>wC~&@A
                  zfuhpHfQvBj-RFDO$Esb57+T`o7~e+dF#vzO%8L
                  zd{10@eHOU-1?48;W|Zj9DwDX6o-p_I5hEW}mol02@5XvjCbr-thrp?vFCh%FBmoyz}!mtF4R}=)`}}7uKswT??H=
                  z^lT(fz^XqvOSgUe)Dw8L;@^GsGlh1RF|t@92wo{vYgO0ZDcx|sSyk++N=`JGI`X{^
                  z{DnE0wscLw%5t(kf4+WORQIiOOh!YV+qFGLP@3+PBLIhWhpLvlLad^HoKU$;TTX4U
                  zdY@YI(I<}a?3N=uSlYY$?*P{6Eql?fa=YKYrbtkx#*kx{q$Jm!hr+w7gBIW}NMiMz
                  zU+0VS^0%((s1=eHX|+=VO8TWhCgiN
                  zL4b-a+9ej3n7vbmW|pj!{lFAI`$g*DQ_?SlvoN%$Zj=f)s4UKXCe>nRjBVnyjl{1O
                  z!|8nYBHDIwkTUZ7l3Wx!i?%9>M`DY+Ac?8kyKl=GhPfa29gB{uv?(>?`EaLYeYH-b
                  z&j$Bx!Rtea#3EX0vo(pp4P~BGy9wU&ILCbLujNH!tb(9(UyMw=&U19ywGBth1+Oea
                  zlZO@>BmS`DLd?PBflBV6ywog=!&8uGuq8|^@4Y1D6hx~uB(mKrY>TEFz*QVtFhLKP
                  zlT8*K;yG^FY>r^RC>yiUlhUn}FI~M#-KOgw-Rb-&e+*lNrI2t^3J}#R*Y>
                  zxNl>ADc0Ln#SnMnCG;uxrnbzFFx_Tt-K3IgeQewHf{Xa+8`x8@81E-_J0MJmUGp`r
                  z$)Wc6wC0=pA1rps0`4BQs%}}DuI`$bOWKmG{bPT6dxb_UclCNk1fZ5JkL+u(4M=5%
                  zdW90f)`k19!0v0<-Bh*v2ssc<0PCrMCC!4&Uj#5MZ`cGf*=W
                  zmO5GJ$*2;bsCJR`SfMl&j@z6b(jK4r1>)dizTD@an0|7yuUW@p$6BJrpIWN^g92gc
                  z{V^wzg|cnE#Z(s(6HxRk=dp!UV^FswAYV7u_}}J2JX#xutED=>RUa7TNvS_XAJO33
                  z&UoLGYDzyr9$Upm-x&$M;TV#1AbE>j<`h_d5w}%q1<^{z#SRcWf2Nv)AIJh#R{Zqo
                  zWqJ8qGY1DNdntwVIfdp*b~Z{b**&EQ51_c62{VvDan8mOtfu1QbHogD-L&=q4+*;@
                  z=uu*&JbK0p!c)UBrdoY7wX#53Sv;!Wg&sl_xxBg9FqQ>Q0jcc>^ZXmjzK=RI&l;oO
                  z0Uq{>YNs)l8;kqN3S>eMu`GwF6k!vac!9Q)nXF^Lq?0f8hGacU;k&~)L=lofYER2U
                  zsn=_Y@2|qPny*K*{EpQtjh-)&C}_1-CdRhJQDq63MZ-9L?
                  zDnElh?mmAfel&u^s=O=sVU^H3SHDTNnGpKHm+&fJam+Db64Ifd#Y4-#P6WS|GjA(j
                  z_m|JOD2c4VWBoC+OyK2}Vl8-om5>ruaOk+iK=_E$QrP@B;}9Qr6j~Dp5X8i7+_>0w
                  z#X|n`S8U7pUljw}!T8FiKk-89AcEZ25fQ!Vsy@v7i}XuSft91*2Dg_ImD491j?vZC
                  z^JKf>;j57@CSp@C>)6W;SgGL0Q|J>Tii_uJUdGNOpO?0*fYVmi#&2n9OCJ&<2}V2C
                  z#E{Pi_Ysg2BSJmFwJlD2_ck#xfZ;sy*H$7TA}Vg6aB=R2oEoKX4tC)(L(yw%wn-n4z$0(xr*k5}
                  zI_`VH?iw2BZ$`OIrfCUoX6MV58V8=*?wkMqdYAv*=`vSs%py+UvarBimhg@qceZe$
                  zV2kN*JOAsEg;qzS2Q>UpZ@dETQKl@;FdcT^y;nn9R9M6kCkq3)4s9g!TAC&ADS$)E
                  zjr$MGmqOrxeEV&AqXm}gL7y*`Kpen1{L_%VgDvJqLoMA?tMRIsJ++gHIoy5g2U(Db
                  zf?MFlJG<}~*NVPKIU!F-B4j_+rH4Ihg-e~+zZkTCknp3^)4ho
                  zFn<&0(2x6ebhNYby8dxqZg3JfOx4n_JHdHip*pi+!Mv&J*O_hTlPHzDZmTgH@HK9I
                  znY*f-&Es~UAz=T*{qlGHYX$Wj(alCX!;Y^+t*}n7z-ZG+JI(GY!@rlM-&423>2J8h
                  zgV?Khzw?qL6nh0-o+7qfUQm0{Bj;93#E4$5cU<0UlVJ(1tbE4Ilb+q#Iq7?S&VwRZ9Tw*J@4
                  zsHV^+zo&*!OAn`j>&YT(l^{Od4iS_0N?YzOM==9}SK)v2o(z{;Z5=GbF+U$<%&~};
                  z^ZRpKQjcPL%q|*2^P1o%*^-~v_RXt|=sx{g593YtbtfwPfCd}vRT;PGAh;_z)V;vB
                  zqf3RYYzuRR2`noQ0U^yGMt>nOnU(0N+fj
                  z5^rud5u}rb4Cr@w$r#1E?%u&QRv(-xS?U7ze$qP5-c1eo5Zc*)QXjq)*I-?PPyOO(
                  z=n)^`^ihNP=A|Z2zho_xYsSrawW^P}6^wyBD1a{utu#-hC@+{zRn>mVE7m<;68yot
                  z8>2@SKpI%AP(HS=dy1~E^#7#}`rlVa|79;?NF{sFCLn>1m{>#UF0rljN55JS|MBbJ
                  z$F0G8B_dBU?bJG-_xfl2wmt6jZdvb7-MD`)^7O7AyDWI&x6>J6;vekzfsZSUKT{Pd
                  zeG2ua>z050!sDn`1JEM5e|oQmSjWh-+~8e%A`$Usd@1qZIHh)!!Q0eq_p_?_
                  z}dd
                  z_S_FmM=wM^5faej3mMr2nNnVXpe!r&jZ*?n2Xiy(!(%Fd3*r6zk?{Ob!4z)$Fw)`=
                  z*NFt-;`i#a%wzO>OYL8RW;+vKp7NT~_ATJ+5s{NuT~-sqlKE({8RJmfk>|~H@vmWC
                  zrYND`?Q3hlvjt?zzp5c}KWg#hwD=8DY@1{RG$Y2;pefjdDt9~2emfIRs(l{G;f{tc
                  zHa5?%Ez+ZD5{xRsvG5)dXucknmtGF%CSw+9Fl7l5aLh&&sCxh1RSv-$Sk*~f=2qZz
                  zyT@T0IkwmD(CEv{r@BC)6QT%wE(e@Pu7j;4d96XMww|=}$cYATH>{vRqJm!!-v-C!
                  z@i-#a=~JZx9?_HUO?%hO{XN%GW7_4Ownb4C)@MgoaE5e^KRj8NRa>}OPJ`pMs%#E#
                  z4n=(SDEWNQJu!u
                  z{hj%4cE-bb1L#qcawKD`mod3Pk-=qQZ++73|{0*NOv%hSXbONhEM&
                  z9Nwe;Ew001LxA1ZR?w-7%qZ8NKri3<$qZ>F<3@Lg2!^ZG{Nv!~3X5hHYD
                  zG08%~)%InR?SuALk&F|QA5Z0ayX&$oX6Kk&1IM<0d@m+IQkA8WPu^>n@#G%se--Q>
                  zUD|c^q1gi0F9HHGuRs5d#R^g8T#Y#M!dmsC$_e*E~98jkZTTjN++AMC#F#0HNVF9LdYK4+~kW*u6S(}F^A-yr+R20%mp65
                  zobo82J-fSkoL9U%xcv+pn*$k~$URitvV7fXE~>@B7V-6cT!LpwDZ;Z?v6n14@lY#d
                  zaJ1-H6j{JRZW@Tq5igoeKrqsCbcec&fz{i11
                  zUDiWVHt8$Hc#=(i$XqFjXWZ@Y{ltx%W7|Mtg^>+T9Z~1M!}6wK?zOShpWkzHcWU!}
                  zEwCQO=?KS-*x`JBQ`LSg%mvo`)bDk#{aoyYi`Qc2L6FiwgIk#nJ458*@SmX};&tL0
                  z>)-~&+Vb8KBXqQfqU1wAr77*~ITcTSXz)434+A|NMe}7k>+S
                  zfR1$chmSDy
                  zYM-C6S*Ihd;P8F9@n=jG8vl%tAf1
                  zUrFF*It%nA~N+1(Ta>W?W3wWweVxY~}YioGArmdaSZ$>G?K!U{)Yt
                  z;7XKNY(OftNu5q=#AmV+`<=@xNJ+q(oJ2D_gpQQ9d%8HKoyr|4nvj~GTz8}0F>2`|
                  z65=n_TOueI8U~7slerIrrKG(N6M;%)pLeolx4&gKV+QX*J%Hqmh1CZej)@0+!p=+l
                  z*XyrXr?#4*Zu|>L^a_Xb{u0rfWnbZ<`X7I)`@*3OvuD
                  ztaj7+Jk`2g#$}n4o+D7LgmC{QDzwr>ix$7QQ(z
                  zE_xrNw+tll;6JEY{w_T2Hjs5Vamu(G;ka9580ogk0yV99s0|8KB0npTZP0=}HUlID
                  zdD%PS=)C_preB>aM}NaWAl0Ku$zez^fJ#q~2H2h4N#AG9LG^>N(B}=Nw=d+!n=>|U
                  z%p4t7W2zDh7Iepg`&VajTcoFvpG1+yK{G>w<{E&)RS$Fh=*M_|%ydJ;}5-XnL^hHTwI
                  zqS@a;<>sCuhso91X#}z^+^JXNqI3ug2RM!RH;Nvp;`zZHXhwl&|N-)5m-#>B+hvvQ34PxBk6pc&U^AWI1i)15x+GS}}
                  z1b}0_6-9kGOO?pQtKFtNB_<_Gk>>9{YUO}~gS-4lYL1@Vz{ZIh#6@#4sq0V0qK5Uz
                  zjZ8rD^7cFX(oIjv@>d;nte
                  z`SKPgCFJU>^7HFyDrwUMy!7~m08Pa?K+q&{GNW&ip;D3&uJ=)UE-XH5=_|vCkKE)-
                  z5&I*lWp~B``j1%q1(7WoSts2eIlB3R2$=^MXoUad_e)$IXdE?tS724*w(C2dD;Dv)
                  zT@03%rxUWmM*5$JE-sT*RvpJ7th?9G0+|u{-aH<6CIRzR9^Vd=7u+U|o)QvfrJ8z2
                  z=GB~8!Z+09j)mJ&;lSs{q}rS-X*Pd?D)a*}V-JdrT~p8?RaN|Ol8szv`d$
                  z+BgQO9u0~kl99Vpv32`PlF*ZtAE%Zt0SrMbB5u_R*qqYohr25<
                  zK4tZO3>(bAM46qmaqHw#CXai2VuHuY{#H|v$cT)4r_u;Drk%=^d|8KR6nN&ntiu4~
                  zMmI1N9D~iDayRgL`TFw*sbi+jat3&snrph7mf^`f`rf<|aM-ATy_22e3a?o|Jv{KI
                  zSXY$cjv=N`)f05!5OA!aR#lx9l}-%?_o0F&*{kp3utc8)+?|`y?tSRC;Q6HflZ`Ie
                  z1@8q(RGHq0oi6`s10n_d(YSLLJnMY*G)=wt*eAEee%4Y+yV6WsaatX(@lYCX2#ulT
                  zOE{6G`Z(XR>gBWTI?Wl&rv%!6lxs$TH_nPN`eqdr2riebHF$dOHj}G(a)fTNzLTK!
                  zFww03!qNW1Km&XIRfX>1*tA1433LRUXzvgv62S7}*kswv)~>V(PkBd(XPNp9Cs@%)
                  zr|=bMcOl~eQeR-$0xvNgIxU$l%c2nzhRjyb?8lGwQx=8yR<-
                  z{}kYElw%w-(2xCx&_tnB>mj~ipSvwo>Jv}gm2{zitE__gy0Ze_MajKg?1hSIGxaAk
                  zbEQ=&g?&A)%z{g7!o~bzwG4d;t;b{exU7;%mQ7!YZ;S%n3cU0Q>33E--L>^$e}6R;
                  z6kt(Qr3@W!7lf`tW$nKt*leA-^0cs?C@MtfUA+-2>r%Pdb(N3B5PtqZ@?&bM3Z9oB
                  zE^-4$2SzCx8Ysn;%`wfa_KO0cv_BShH#bPLUjtMV2qo%B69nP?3Y@=+SPP9zW9WoC
                  zq|*`EpD;>_sl~l`vLfU*0$AL)}I
                  z9V28191H$Yv5(+Sh2W4La1#1cMMkElBj@WoF{4BJ#vj3AVz*0csEkZ`Y<;jhe$6%S
                  z+KJnzR|qH9fA0)J4i;-{|2h26?LlJ^FaSLs+o%4Znu0jq?Li~|qUA|qH|-VkFXt!3ASQmYbUgTv_ZL%UiIW;;zr1saFGewGeHmO*;zJkk@2`t->VK8&
                  zfP@0*2>-DFl{6)*0pt`2U&h{jT#5{}RFv0K{egj7@t%UVHA(=^1G_7#YUwJ|Nt;cA
                  z!p7m1r-t!g_k+dolZ(A&S>+Mv>J`1}UJjN}LjN%ZN5ivY6JVU+Vb$J~sJ~;DyZo2F8xFDZ5~JzQuybeoCnbgR;xM1_hih7(|N9c)?jC>kw%FwYd`al(pt`ir{L8-6dl>?
                  zltPxL`wM-e%fi)8Hbj!t>I(v#Qpx-Ux~sK6g$GkcD~ku}nzE4g(vCH5+|f;uRm1VK
                  zE~MOf9}s}n>YfJB61^~aS@aQ5Wb{V7R&4Fbq*tTzqmaaDivgQPlZDq?Be&()6|JRk}B!0&e$S4Yu3fpDY0Y
                  zhm>jhLLmba;lXpxY}=i4_&(zrjwNrk)04w^#N3=n&MOscfma)#tr>*u*5%
                  z`KEDMuKMISXyZoYFZ^18WcmFsr!i4!?}SZc$0QfeJAVNi1I4Jlr7e6Cke71*+wAiP
                  zIj}&UZY+C=R-JvsyJy9t^Cb(7v`AwI!y0}R!&i7>xr$1o1B>l>l>L4-Kobd0#+P!q
                  z7WD^eIco!OI=$cOI4w}21D-{;wdF>eUFqvxH$Bri3_APcWnuA_s6vxM@6wksH^tRM
                  zL0#(BT)2A@`cgXeS1)x{D+goMs!gS<=_
                  z=ECo9gFh(ycbruOLhxVNh9MyafYgqhbApN-r5T+EjlvCfPj$N{
                  zC2So(mBMIEQ@sJD!eDmAy1R;=F`*xTSS1+g>d;(H_9r-CM)ey8`%~6kdyW$5)k*Z3
                  zPHCZ%mJYZ?lR23wvBJ{Z;-F&EFnN?!HT9Go_(EBGup;46sH2A^r>r7D9QBMlxd4{i
                  zGJTvlj1X{ZnKZjz6X3bj?Zq{GEFUtWm(o|c3eYGlWdC(d(UoHVyx!UXanzaL|j3yQP1
                  ze|m=>4=DTg=rzCuE&ld6`ZXR9{q0c~xfTBHk;}e?*DWGpJZ|&L8QH?Q1fTNO>aaMQ
                  z^uVusq6z4x0XCfT>zh!!al>s=UwnwDU2Qf$pCVEDuY?CxkgEC+r?!+!D~?AFYpJmU
                  zN*h{$ko-*87!?|blKf5{OT0NtLuKYcr-RCCyr*@&SaM2j3OrTiKY0CT3yH
                  z$$Jl3NF&ZoxN(eWW-9elG@q@cOcF0T=#|i<%2U2QEJZp&g-}y*hKJ5Wk!0;VjUkOn
                  zU&(DZOCI?Bn?P(uG!QQ?!>_XRc3_(#-Xn8r*LWn6&HTxqTYOBM(kHeh?IFXAxjZX+
                  zxq3ZrYw#TV7v+7{6{X|D!#IRV4j8Tb&&>NHyK897i*iI*@pxHBpiap%b(kO@M$`cK
                  zx7aJv>5H#Xe5|;1Au*qVaduEwzJ!8*g2=L!P+1AhKGVPO+I)^H^bWPa%Y~TDH1S+^WI6gAaoB`uDX-Tx
                  z{dI^-?#a$f}H8;FPYQi(sIi?cLi7A1Rl@%ofJ$=p>WaE{IiI2ciPFH57b+mbn
                  zKhPQ_1@5U)HCEyagQQ(qk&|(y$wF^A62kveCf5D$5voQSk}@N7Ed1q)PIVcPwr;+20@SoT{fqsOL4riI@Zy}8T{#CbT+lM^wPw3d@U6#Msu|Z5vgJqrSFV)AKqW`n
                  z9=>t;OoS?A6I-;S_itbQG16$i@)rJW{ft8yH;E&Wc6-QrS5aE#D#Vf=M6Fxd6oTdX
                  z8R@`klH93gJ?|{!AohW1pRHmySK@_q+RgrSjI7A;k5;V-(xk0SB
                  z184GpDpISjQ&Vv+1Y4_}HwCBaJAV1k*K(?}{jVrez0K-K&uI`9?ZOs6=F`?{R#cS!
                  z=9mXd+Rn&k=D}lzaQ^z1ZRp#|IIRAqrc5G_saAyX13WTzA&!b)ZB4%eID9{W4S@Tx
                  z&s<~wUjQJ2{kaBb+5KHECGYo!oH!OIU7xKnpGnh0k%E7F$nT7W;oto96%qTp=B)7X
                  z;8Mp)gk4mX@E>jCBK{mdI=n2}H~9U-4fZW}tZ<7{->{2A*CgL@F;k1kBGbnTHdgcX
                  z+x3jO(W`cY&DOghd;BSw3(^@eT5ed|TK{h6YZk>uYN}dbrCv`gYEV^|6L#N_N64CFq<1qM~$d
                  z56<$lRpY@#Ec?6c8(mE18|eWsFlF-)Ye2sYrdK<`
                  z?GSY=P7-2`zMdkufWqZdy4A>;34->F>k-@CPjs&cWNNAxaAW7&Hhh-5tz994N)F}@
                  zm-q4ylV6f2fGiyVGCJ6@q=YyxZRWIsgRldhb`Gvr3BFH2&S#V}(oZ%i|0mbsyy`F^
                  zz-|4pGB^<1Iad}2arOEgQ4vc{F
                  zl?8eXI(NtT@WIlTCo1Ys7<8t}ao&R#+2BHxe+*q;v&CO+<+7bw!UmeWDajeXbxA1R
                  z$ERvngZ{4h{T?1rSpw|FJzl&^mx$%&#HBEOU)8?2wz(N{Q*pUIx$P?8kV%Qeyv1+o
                  zkZehRSIWb*!-qk)OLlXDhL`dV@1ZkmtJ`covcA=ZOghkypJC3oSf`>d**GQsz&+x
                  zKdgi9cOc%EIWY^7v@}Nf#y=g4_JhKg&-%*3iTnX3&>VR8a{=cxY$RCS8K3VxejWSa
                  zPvX$?)e+IJo-|cV(Pf-SG=NYLygfeTvPfKzF>fTqk6~ixh2)w_FRX#u9eY2?R;b}h;jwgAd+5h5UVD4(l5MOcCg>zEWepy*YAo%
                  zZOPuQeM6;B`hbKU-oh`@xWK0n=Wank?iWaMw~~IB#v337a^5|mY4qiwuBjp9ahWhc
                  z5(yStY}+bo6s@!`V=*9m`*peVklUgKHryCG|7Y*Sk0&m(^6Z1~{>1^>GS(rke*x~{
                  zx(qx%UJ0oR3OxBBGV9VBLDIW4rAA5JlTjY5K%5!LFTO7wZF)hk)9+7qs
                  zUj>K2Te+D9!k;T@2uYMG&nKF{wSV(flubWox@%KnX)?nuCcaGG1;P!UB$+NG?S&0d
                  zZEPF@L%`-qh6k5<>zjKcy2*1p4!2*~eRTI-(E2mxmn
                  z+bPK-g;)MMF3bw(yl)D4hlYd!!RluDiREmmsk!84eZwfgY9eF~!0DDdnF2B;NYd4)
                  zsgY7n^Pxu^b)}NV{R&!MYK9e9MS4EWBN-rvN5t2T4*#&8cq1!gB_VPiIut?dn~Nmc>k%+6B05bz*e@hyuAGJSu1c_ABn
                  z?rvC=W&Do)pl!B{%&ySvhP{_U70%{3k0$S4stf^}
                  z$xt~saJ9xMd!w7pM_c*#SAN$RnEsP0t?v+9Y!EfU*8FV2EjNM6;!a0mW$g)Qif%K>XI@G^oh0)c38M*hRl2ul{)QY4dlPmxX3&ig%3vWCzIEo`hz_+M>2QrFzbxO0vA*6O3$^X03!CVNGw-70mHJ2+B-uuvo
                  zCuIEl7jG3iGU3eEIVb)n`)7tMO{fmuD~voIT>C#jF!ZB6UQ*d%LOoc~z7y!4UAgjP
                  zP$CsD#~jo8iFM@L%AMO4N^a=0DQM~U$->(GZ6x~*lZQDjwPPU4PrSyq8(%=>D>J{B
                  z!qX-MJ(miU8PuGMKYF^w(1~djD)wFak=5ZMPZxln_L+n7RNK)$mtbj^lzmQoI(&0>
                  zH>LMxU&+bN5n-S>cKau5D4vZ7iSTu<9v}zd{rMt!
                  zADlU5^Wl0KgLYx3ySmeA#CeSQpXWTr@+l0oOK`8zX0K}8L=udo?jkZWXeIY_GO;87
                  zU9$Wc=AlDrCPSweL)>SyAKjIafZ)VtbsPX)jM|k_7RP4&-=VPJ!za6|s+&hm>Q6o5
                  z$dVB0h<^;~Rik5Twb0ny^+HGz6I-bsZH}3>XLypBs)&c+a~S=yB^J6wuDe196!lwU;HZu(fglEKLI&m5C|sHR(>#D
                  z&cP=9g0#5L7vnsCAQ>y9nC#9g+~o~Q0O)esg^=_v)3}Wh+O)V-e2vkDpT9{SDNTTLcUcd-k3LDx~}fEovUCWAS8he$r^Sw
                  z$IhJ{o)#06lSk@~1WrJd8QUI{%i{H$AM^fpdlm)Ke@Pj+=;~iIs2Up_BwmV4|T*Cu>EUCi-;QL
                  z`s)FvE3$C?ZDPU$@8bi>cIXZeSI
                  zPd{scPs|RtXdHPN_n{NT_2+JXiRkW`-Uv2A;tAYufsc02MBFHMxx#XhZ1|hevFwo*
                  zvb&b+m55;JTLyh{tOELgd+?C`f^NMAWE;5@Z3=S4-7Z?53iabe(`uKnMqW5GkIJb`
                  zSBE+dRcpz@!W#<^1@fdzOGNIX4{Vv!?&R=?RG}L(FA&f^pFJ(~H8JFnJkrBCHr(z;
                  zHjMi^yE|RoYQoz>$&oX44oHzr7jf!(s9Vn^bEOe1#x6=1Yg9RlNq>InQcUD}al*X#
                  zh+Iq;0N<8soozz-SA!M~5sP?=h9T?P3EU$Cz@NYZC1(4Xk`PhBGV8n0&nF>*DQ`ck
                  zck(X@9RHb!gg94ap0m65m36qp!Q3cpXWkA9oX)*deXVmLIhgW&=Clgi(0o*!4N}QN
                  zepgX_#VsE&E+(!RyGq5GA=l03l8N(3;OeUIe%UaBBK(KC^2e<8kj|%WGpDRyI79|#
                  z@RoH~Z;;t<=xV@W$SeH(Ysn|^MXINVuuk^#8#sOj9%{SPvaOD?w@fFR+iO#y*`rHd
                  zUW!Iq$3ir~S$_Z<-VqHJTR+C*MFu~+PK*>U6gFQoq{?aeb(S-)+BqNngEZ%O?y&@L
                  zbIei5Wih;B(VON!b$l=&xg*DyK#eXLUOf3Cd4rTt@36}fk7QN(@|Gw0RSC<}*)gj&n*ls9Ii<`)qi}~^mepvrn0-Wj-+ANk4g0dH3`
                  z>`y=M5M}J|l*A&G*tA8FUbJNJ>@eS_?W?`R|ztr%?TsasW!rLe9jX90g&!q
                  zA7S`lQU8adY?&Y%q)a~Wxk@(}QNG^RQupxq{@UX04?*m;abDiqSMKUVHd^tByl;1=sx#II_}!Z(pNIe2@Clo{c4y{esz
                  z1#4Ey!s_QY+Rib+MAj6=j>;B;EG#LDCH9|z&-#w)#wm>bO#et{sEnk;PO!9Al+IIoK_E1hf_P$x_>Mo9*c41w
                  zYVrt1%dDSU)sg~~J(yyuN8^`*MlBj2
                  z%KTQv&b#?_41c~@^Ddo}&^{d>A&qrn;t$S1Cm4a1$D%LW+h|
                  zOv28@J8@y6VzkCXd}&vexcGNE9S!J`O-UbenNq(Uo_AE!3`kxg*U;XXzV|MOYke5I
                  zH88}m;KUR3u5
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area004-v001-MC/word/styles.xml b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area004-v001-MC/word/styles.xml
                  new file mode 100644
                  index 00000000..ee967ee1
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area004-v001-MC/word/styles.xml
                  @@ -0,0 +1 @@
                  +
                  \ No newline at end of file
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area004-v002-MC/[Content_Types].xml b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area004-v002-MC/[Content_Types].xml
                  new file mode 100644
                  index 00000000..fbe325d6
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area004-v002-MC/[Content_Types].xml
                  @@ -0,0 +1 @@
                  +
                  \ No newline at end of file
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area004-v002-MC/_rels/.rels b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area004-v002-MC/_rels/.rels
                  new file mode 100644
                  index 00000000..d6637f3e
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area004-v002-MC/_rels/.rels
                  @@ -0,0 +1 @@
                  +
                  \ No newline at end of file
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area004-v002-MC/word/_rels/document.xml.rels b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area004-v002-MC/word/_rels/document.xml.rels
                  new file mode 100644
                  index 00000000..7af141e1
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area004-v002-MC/word/_rels/document.xml.rels
                  @@ -0,0 +1 @@
                  +
                  \ No newline at end of file
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area004-v002-MC/word/document.xml b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area004-v002-MC/word/document.xml
                  new file mode 100644
                  index 00000000..6f95f076
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area004-v002-MC/word/document.xml
                  @@ -0,0 +1,3920 @@
                  +
                  +
                  +    
                  +        
                  +            Specification: MC
                  +        
                  +        
                  +            General
                  +        
                  +        This section contains the specifications for the MC services.
                  +        The M&C services provide operations for generic monitoring and control of a remote service provider (e.g., a spacecraft or ground system component).
                  +        This area contains the following services:
                  +        Action
                  +        Parameter
                  +        Alert
                  +        Aggregation
                  +        Packet
                  +        
                  +            
                  +            Service: Action
                  +        
                  +        
                  +            Overview
                  +        
                  +        The action service allows consumers to submit an action for execution and to subsequently monitor the execution progress of these actions.
                  +        
                  +            Table 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Table \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Table_TOC \s 1 1
                  +            Action Service Operations
                  +            "
                  +            :  Action Service Operations
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Area Identifier
                  +                Service Identifier
                  +                Area Number
                  +                Service Number
                  +                Area Version
                  +            
                  +            
                  +                MC
                  +                Action
                  +                4
                  +                1
                  +                2
                  +            
                  +            
                  +                Interaction Pattern
                  +                Operation Identifier
                  +                Operation Number
                  +                Capability Set
                  +            
                  +            
                  +                SUBMIT
                  +                 HYPERLINK  \l "OPERATION_1_execute" execute
                  +                1
                  +                1
                  +            
                  +            
                  +                PUB-SUB
                  +                 HYPERLINK  \l "OPERATION_1_monitorExecution" monitorExecution
                  +                2
                  +                2
                  +            
                  +        
                  +        
                  +            Service-level Requirements
                  +        
                  +        
                  +            
                  +            Operation: execute
                  +        
                  +        
                  +            Overview
                  +        
                  +        The execute operation allows a consumer to request a provider to execute an action.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                execute
                  +            
                  +            
                  +                Interaction Pattern
                  +                SUBMIT
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                SUBMIT
                  +                No
                  +                 HYPERLINK  \l "DATATYPE_ActionExecutionRequest" ActionExecutionRequest executionRequest
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        executionRequest - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        Unknown: 
                  +        Duplicate: 
                  +        Invalid: 
                  +        Rejected: 
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                Unknown
                  +                Defined in MAL
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                Duplicate
                  +                2
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                Invalid
                  +                3
                  +                List<UInteger>
                  +                
                  +            
                  +            
                  +                Rejected
                  +                4
                  +                String
                  +                
                  +            
                  +        
                  +        
                  +            
                  +            Operation: monitorExecution
                  +        
                  +        
                  +            Overview
                  +        
                  +        The monitorExecution operation allows a consumer to be informed of the progress in the execution of an action or a set of actions.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                monitorExecution
                  +            
                  +            
                  +                Interaction Pattern
                  +                PUBLISH-SUBSCRIBE
                  +            
                  +            
                  +                Subscription Keys
                  +                Long requestIdIdentifier actionKeyUOctet actionCategory
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                OUT
                  +                PUBLISH
                  +                No
                  +                 HYPERLINK  \l "DATATYPE_ActionEvent" ActionEvent progressEvent
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        requestId - 
                  +        actionKey - 
                  +        actionCategory - 
                  +        progressEvent - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation does not return any errors.
                  +        
                  +            
                  +            Service: Parameter
                  +        
                  +        
                  +            Overview
                  +        
                  +        The parameter service allows the user to subscribe to parameter value report and optionally be able to set new values.
                  +        
                  +            Table 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Table \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Table_TOC \s 1 1
                  +            Parameter Service Operations
                  +            "
                  +            :  Parameter Service Operations
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Area Identifier
                  +                Service Identifier
                  +                Area Number
                  +                Service Number
                  +                Area Version
                  +            
                  +            
                  +                MC
                  +                Parameter
                  +                4
                  +                2
                  +                2
                  +            
                  +            
                  +                Interaction Pattern
                  +                Operation Identifier
                  +                Operation Number
                  +                Capability Set
                  +            
                  +            
                  +                PUB-SUB
                  +                 HYPERLINK  \l "OPERATION_2_monitorValue" monitorValue
                  +                1
                  +                1
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_2_getValue" getValue
                  +                2
                  +                2
                  +            
                  +            
                  +                SUBMIT
                  +                 HYPERLINK  \l "OPERATION_2_setValue" setValue
                  +                3
                  +                3
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_2_getReportingConfiguration" getReportingConfiguration
                  +                4
                  +                4
                  +            
                  +            
                  +                SUBMIT
                  +                 HYPERLINK  \l "OPERATION_2_enableReporting" enableReporting
                  +                5
                  +                
                  +            
                  +            
                  +                SUBMIT
                  +                 HYPERLINK  \l "OPERATION_2_disableReporting" disableReporting
                  +                6
                  +                
                  +            
                  +            
                  +                SUBMIT
                  +                 HYPERLINK  \l "OPERATION_2_setReportingPeriod" setReportingPeriod
                  +                7
                  +                
                  +            
                  +        
                  +        
                  +            Service-level Requirements
                  +        
                  +        
                  +            
                  +            Operation: monitorValue
                  +        
                  +        
                  +            Overview
                  +        
                  +        The monitorValue operation allows a consumer to subscribe for parameter value reports.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                monitorValue
                  +            
                  +            
                  +                Interaction Pattern
                  +                PUBLISH-SUBSCRIBE
                  +            
                  +            
                  +                Subscription Keys
                  +                Identifier parameterKeyUInteger parameterVersion
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                OUT
                  +                PUBLISH
                  +                NoYesNo
                  +                Time timestampTime samplingTime HYPERLINK  \l "DATATYPE_ParameterValueData" ParameterValueData newValue
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        parameterKey - 
                  +        parameterVersion - 
                  +        timestamp - 
                  +        samplingTime - 
                  +        newValue - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation does not return any errors.
                  +        
                  +            
                  +            Operation: getValue
                  +        
                  +        
                  +            Overview
                  +        
                  +        The getValue operation returns the latest received value for a requested parameter.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                getValue
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                YesNo
                  +                List<Identifier> domainList<Identifier> keys
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                No
                  +                List< HYPERLINK  \l "DATATYPE_ParameterValue" ParameterValue> parameterValues
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        domain - 
                  +        keys - 
                  +        parameterValues - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        Unknown: 
                  +        Ambiguous: 
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                Unknown
                  +                Defined in MAL
                  +                List<UInteger>
                  +                
                  +            
                  +            
                  +                Ambiguous
                  +                5
                  +                List<UInteger>
                  +                
                  +            
                  +        
                  +        
                  +            
                  +            Operation: setValue
                  +        
                  +        
                  +            Overview
                  +        
                  +        The setValue operation allows a consumer to set the raw value for one or more parameters.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                setValue
                  +            
                  +            
                  +                Interaction Pattern
                  +                SUBMIT
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                SUBMIT
                  +                YesNoNo
                  +                List<Identifier> domainList<Identifier> keysList<NullableAttribute> newRawValues
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        domain - 
                  +        keys - 
                  +        newRawValues - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        Unknown: 
                  +        Read Only: 
                  +        Invalid: 
                  +        Ambiguous: 
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                Unknown
                  +                Defined in MAL
                  +                List<UInteger>
                  +                
                  +            
                  +            
                  +                Read Only
                  +                1
                  +                List<UInteger>
                  +                
                  +            
                  +            
                  +                Invalid
                  +                3
                  +                List<UInteger>
                  +                
                  +            
                  +            
                  +                Ambiguous
                  +                5
                  +                List<UInteger>
                  +                
                  +            
                  +        
                  +        
                  +            
                  +            Operation: getReportingConfiguration
                  +        
                  +        
                  +            Overview
                  +        
                  +        The getReportingConfiguration operation allows a consumer to retrieve the current configuration for the generation of reports for a parameter.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                getReportingConfiguration
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                YesNo
                  +                List<Identifier> domainList<Identifier> keys
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                No
                  +                List< HYPERLINK  \l "DATATYPE_ReportConfiguration" ReportConfiguration> reportConfigs
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        domain - 
                  +        keys - 
                  +        reportConfigs - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        Unknown: 
                  +        Ambiguous: 
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                Unknown
                  +                Defined in MAL
                  +                List<UInteger>
                  +                
                  +            
                  +            
                  +                Ambiguous
                  +                5
                  +                List<UInteger>
                  +                
                  +            
                  +        
                  +        
                  +            
                  +            Operation: enableReporting
                  +        
                  +        
                  +            Overview
                  +        
                  +        The enableReporting operation allows a consumer to request the generation of reports for specific parameters.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                enableReporting
                  +            
                  +            
                  +                Interaction Pattern
                  +                SUBMIT
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                SUBMIT
                  +                YesYes
                  +                List<Identifier> domainList<Identifier> keys
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        domain - 
                  +        keys - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        Unknown: 
                  +        Ambiguous: 
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                Unknown
                  +                Defined in MAL
                  +                List<UInteger>
                  +                
                  +            
                  +            
                  +                Ambiguous
                  +                5
                  +                List<UInteger>
                  +                
                  +            
                  +        
                  +        
                  +            
                  +            Operation: disableReporting
                  +        
                  +        
                  +            Overview
                  +        
                  +        The disableReporting operation allows a consumer to stop the generation of reports for specific parameters.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                disableReporting
                  +            
                  +            
                  +                Interaction Pattern
                  +                SUBMIT
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                SUBMIT
                  +                YesYes
                  +                List<Identifier> domainList<Identifier> keys
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        domain - 
                  +        keys - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        Unknown: 
                  +        Ambiguous: 
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                Unknown
                  +                Defined in MAL
                  +                List<UInteger>
                  +                
                  +            
                  +            
                  +                Ambiguous
                  +                5
                  +                List<UInteger>
                  +                
                  +            
                  +        
                  +        
                  +            
                  +            Operation: setReportingPeriod
                  +        
                  +        
                  +            Overview
                  +        
                  +        The setReportingPeriod operation allows a consumer to set the reporting interval for specific parameters.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                setReportingPeriod
                  +            
                  +            
                  +                Interaction Pattern
                  +                SUBMIT
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                SUBMIT
                  +                YesNoNo
                  +                List<Identifier> domainList<Identifier> keysDuration reportInterval
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        domain - 
                  +        keys - 
                  +        reportInterval - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        Unknown: 
                  +        Invalid: 
                  +        Ambiguous: 
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                Unknown
                  +                Defined in MAL
                  +                List<UInteger>
                  +                
                  +            
                  +            
                  +                Invalid
                  +                3
                  +                List<UInteger>
                  +                
                  +            
                  +            
                  +                Ambiguous
                  +                5
                  +                List<UInteger>
                  +                
                  +            
                  +        
                  +        
                  +            
                  +            Service: Alert
                  +        
                  +        
                  +            Overview
                  +        
                  +        The alert service defines the structures and patterns for the publishing and monitoring of alerts.
                  +        
                  +            Table 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Table \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Table_TOC \s 1 1
                  +            Alert Service Operations
                  +            "
                  +            :  Alert Service Operations
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Area Identifier
                  +                Service Identifier
                  +                Area Number
                  +                Service Number
                  +                Area Version
                  +            
                  +            
                  +                MC
                  +                Alert
                  +                4
                  +                3
                  +                2
                  +            
                  +            
                  +                Interaction Pattern
                  +                Operation Identifier
                  +                Operation Number
                  +                Capability Set
                  +            
                  +            
                  +                PUB-SUB
                  +                 HYPERLINK  \l "OPERATION_3_monitorAlert" monitorAlert
                  +                1
                  +                1
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_3_getAlertConfiguration" getAlertConfiguration
                  +                2
                  +                2
                  +            
                  +            
                  +                SUBMIT
                  +                 HYPERLINK  \l "OPERATION_3_enableGeneration" enableGeneration
                  +                3
                  +                
                  +            
                  +            
                  +                SUBMIT
                  +                 HYPERLINK  \l "OPERATION_3_disableGeneration" disableGeneration
                  +                4
                  +                
                  +            
                  +        
                  +        
                  +            Service-level Requirements
                  +        
                  +        
                  +            
                  +            Operation: monitorAlert
                  +        
                  +        
                  +            Overview
                  +        
                  +        The monitorAlert operation allows a consumer to subscribe for alerts.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                monitorAlert
                  +            
                  +            
                  +                Interaction Pattern
                  +                PUBLISH-SUBSCRIBE
                  +            
                  +            
                  +                Subscription Keys
                  +                Identifier alertKeyUInteger alertVersionUOctet alertSeverity
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                OUT
                  +                PUBLISH
                  +                NoYes
                  +                Time timestampList<NullableAttribute> arguments
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        alertKey - 
                  +        alertVersion - 
                  +        alertSeverity - 
                  +        timestamp - 
                  +        arguments - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation does not return any errors.
                  +        
                  +            
                  +            Operation: getAlertConfiguration
                  +        
                  +        
                  +            Overview
                  +        
                  +        The getAlertConfiguration operation allows a consumer to retrieve the current configuration for the generation of an alert.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                getAlertConfiguration
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                YesNo
                  +                List<Identifier> domainList<Identifier> keys
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                No
                  +                List< HYPERLINK  \l "DATATYPE_AlertConfiguration" AlertConfiguration> alertConfigs
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        domain - 
                  +        keys - 
                  +        alertConfigs - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        Unknown: 
                  +        Ambiguous: 
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                Unknown
                  +                Defined in MAL
                  +                List<UInteger>
                  +                
                  +            
                  +            
                  +                Ambiguous
                  +                5
                  +                List<UInteger>
                  +                
                  +            
                  +        
                  +        
                  +            
                  +            Operation: enableGeneration
                  +        
                  +        
                  +            Overview
                  +        
                  +        The enableGeneration operation allows a consumer to control whether instances of specific alerts are generated or not.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                enableGeneration
                  +            
                  +            
                  +                Interaction Pattern
                  +                SUBMIT
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                SUBMIT
                  +                YesYes
                  +                List<Identifier> domainList<Identifier> keys
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        domain - 
                  +        keys - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        Unknown: 
                  +        Ambiguous: 
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                Unknown
                  +                Defined in MAL
                  +                List<UInteger>
                  +                
                  +            
                  +            
                  +                Ambiguous
                  +                5
                  +                List<UInteger>
                  +                
                  +            
                  +        
                  +        
                  +            
                  +            Operation: disableGeneration
                  +        
                  +        
                  +            Overview
                  +        
                  +        The disableGeneration operation allows a consumer to stop the generation of instances of specific alerts.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                disableGeneration
                  +            
                  +            
                  +                Interaction Pattern
                  +                SUBMIT
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                SUBMIT
                  +                YesYes
                  +                List<Identifier> domainList<Identifier> keys
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        domain - 
                  +        keys - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        Unknown: 
                  +        Ambiguous: 
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                Unknown
                  +                Defined in MAL
                  +                List<UInteger>
                  +                
                  +            
                  +            
                  +                Ambiguous
                  +                5
                  +                List<UInteger>
                  +                
                  +            
                  +        
                  +        
                  +            
                  +            Service: Aggregation
                  +        
                  +        
                  +            Overview
                  +        
                  +        The aggregation service allows the user to acquire several parameter values in a single request.
                  +        
                  +            Table 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Table \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Table_TOC \s 1 1
                  +            Aggregation Service Operations
                  +            "
                  +            :  Aggregation Service Operations
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Area Identifier
                  +                Service Identifier
                  +                Area Number
                  +                Service Number
                  +                Area Version
                  +            
                  +            
                  +                MC
                  +                Aggregation
                  +                4
                  +                6
                  +                2
                  +            
                  +            
                  +                Interaction Pattern
                  +                Operation Identifier
                  +                Operation Number
                  +                Capability Set
                  +            
                  +            
                  +                PUB-SUB
                  +                 HYPERLINK  \l "OPERATION_6_monitorValue" monitorValue
                  +                1
                  +                1
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_6_getValue" getValue
                  +                2
                  +                2
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_6_getReportingConfiguration" getReportingConfiguration
                  +                3
                  +                3
                  +            
                  +            
                  +                SUBMIT
                  +                 HYPERLINK  \l "OPERATION_6_enableReporting" enableReporting
                  +                4
                  +                
                  +            
                  +            
                  +                SUBMIT
                  +                 HYPERLINK  \l "OPERATION_6_disableReporting" disableReporting
                  +                5
                  +                
                  +            
                  +            
                  +                SUBMIT
                  +                 HYPERLINK  \l "OPERATION_6_setReportingPeriod" setReportingPeriod
                  +                6
                  +                
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_6_listDefinition" listDefinition
                  +                7
                  +                4
                  +            
                  +            
                  +                SUBMIT
                  +                 HYPERLINK  \l "OPERATION_6_addAggregation" addAggregation
                  +                8
                  +                5
                  +            
                  +            
                  +                SUBMIT
                  +                 HYPERLINK  \l "OPERATION_6_removeAggregation" removeAggregation
                  +                9
                  +                
                  +            
                  +        
                  +        
                  +            Service-level Requirements
                  +        
                  +        
                  +            
                  +            Operation: monitorValue
                  +        
                  +        
                  +            Overview
                  +        
                  +        The monitorValue operation allows a consumer to subscribe for aggregation value reports.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                monitorValue
                  +            
                  +            
                  +                Interaction Pattern
                  +                PUBLISH-SUBSCRIBE
                  +            
                  +            
                  +                Subscription Keys
                  +                Identifier aggregationKeyUInteger aggregationVersion
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                OUT
                  +                PUBLISH
                  +                NoNo
                  +                Time timestampList< HYPERLINK  \l "DATATYPE_ParameterValueData" ParameterValueData> values
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        aggregationKey - 
                  +        aggregationVersion - 
                  +        timestamp - 
                  +        values - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation does not return any errors.
                  +        
                  +            
                  +            Operation: getValue
                  +        
                  +        
                  +            Overview
                  +        
                  +        The getValue operation returns the latest received value for a requested aggregation.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                getValue
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                YesNo
                  +                List<Identifier> domainList<Identifier> keys
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                No
                  +                List< HYPERLINK  \l "DATATYPE_AggregationValue" AggregationValue> aggregationValues
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        domain - 
                  +        keys - 
                  +        aggregationValues - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        Unknown: 
                  +        Ambiguous: 
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                Unknown
                  +                Defined in MAL
                  +                List<UInteger>
                  +                
                  +            
                  +            
                  +                Ambiguous
                  +                5
                  +                List<UInteger>
                  +                
                  +            
                  +        
                  +        
                  +            
                  +            Operation: getReportingConfiguration
                  +        
                  +        
                  +            Overview
                  +        
                  +        The getReportingConfiguration operation allows a consumer to retrieve the current configuration for the generation of reports for an aggregation.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                getReportingConfiguration
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                YesNo
                  +                List<Identifier> domainList<Identifier> keys
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                No
                  +                List< HYPERLINK  \l "DATATYPE_ReportConfiguration" ReportConfiguration> reportConfigs
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        domain - 
                  +        keys - 
                  +        reportConfigs - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        Unknown: 
                  +        Ambiguous: 
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                Unknown
                  +                Defined in MAL
                  +                List<UInteger>
                  +                
                  +            
                  +            
                  +                Ambiguous
                  +                5
                  +                List<UInteger>
                  +                
                  +            
                  +        
                  +        
                  +            
                  +            Operation: enableReporting
                  +        
                  +        
                  +            Overview
                  +        
                  +        The enableReporting operation allows a consumer to request the generation of reports for specific aggregations.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                enableReporting
                  +            
                  +            
                  +                Interaction Pattern
                  +                SUBMIT
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                SUBMIT
                  +                YesYes
                  +                List<Identifier> domainList<Identifier> keys
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        domain - 
                  +        keys - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        Unknown: 
                  +        Ambiguous: 
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                Unknown
                  +                Defined in MAL
                  +                List<UInteger>
                  +                
                  +            
                  +            
                  +                Ambiguous
                  +                5
                  +                List<UInteger>
                  +                
                  +            
                  +        
                  +        
                  +            
                  +            Operation: disableReporting
                  +        
                  +        
                  +            Overview
                  +        
                  +        The disableReporting operation allows a consumer to stop the generation of reports for specific aggregations.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                disableReporting
                  +            
                  +            
                  +                Interaction Pattern
                  +                SUBMIT
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                SUBMIT
                  +                YesYes
                  +                List<Identifier> domainList<Identifier> keys
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        domain - 
                  +        keys - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        Unknown: 
                  +        Ambiguous: 
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                Unknown
                  +                Defined in MAL
                  +                List<UInteger>
                  +                
                  +            
                  +            
                  +                Ambiguous
                  +                5
                  +                List<UInteger>
                  +                
                  +            
                  +        
                  +        
                  +            
                  +            Operation: setReportingPeriod
                  +        
                  +        
                  +            Overview
                  +        
                  +        The setReportingPeriod operation allows a consumer to set the reporting interval for specific aggregations.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                setReportingPeriod
                  +            
                  +            
                  +                Interaction Pattern
                  +                SUBMIT
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                SUBMIT
                  +                YesNoNo
                  +                List<Identifier> domainList<Identifier> keysDuration reportInterval
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        domain - 
                  +        keys - 
                  +        reportInterval - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        Unknown: 
                  +        Invalid: 
                  +        Ambiguous: 
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                Unknown
                  +                Defined in MAL
                  +                List<UInteger>
                  +                
                  +            
                  +            
                  +                Invalid
                  +                3
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                Ambiguous
                  +                5
                  +                List<UInteger>
                  +                
                  +            
                  +        
                  +        
                  +            
                  +            Operation: listDefinition
                  +        
                  +        
                  +            Overview
                  +        
                  +        The listDefinition operation allows a consumer to retrieve the AggregationDefinition objects for the supported aggregations of the provider.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                listDefinition
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                YesYes
                  +                List<Identifier> domainList<Identifier> keys
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                No
                  +                List< HYPERLINK  \l "DATATYPE_AggregationDefinition" AggregationDefinition> definitions
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        domain - 
                  +        keys - 
                  +        definitions - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        Unknown: 
                  +        Ambiguous: 
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                Unknown
                  +                Defined in MAL
                  +                List<UInteger>
                  +                
                  +            
                  +            
                  +                Ambiguous
                  +                5
                  +                List<UInteger>
                  +                
                  +            
                  +        
                  +        
                  +            
                  +            Operation: addAggregation
                  +        
                  +        
                  +            Overview
                  +        
                  +        The addAggregation operation allows a consumer to define one or more aggregations that do not currently exist.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                addAggregation
                  +            
                  +            
                  +                Interaction Pattern
                  +                SUBMIT
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                SUBMIT
                  +                No
                  +                List< HYPERLINK  \l "DATATYPE_AggregationDefinition" AggregationDefinition> newObjects
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        newObjects - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        Duplicate: 
                  +        Invalid: 
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                Duplicate
                  +                2
                  +                List<UInteger>
                  +                
                  +            
                  +            
                  +                Invalid
                  +                3
                  +                List<UInteger>
                  +                
                  +            
                  +        
                  +        
                  +            
                  +            Operation: removeAggregation
                  +        
                  +        
                  +            Overview
                  +        
                  +        The removeAggregation operation allows a consumer to remove one or more aggregations from the list of aggregations supported by the aggregation provider.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                removeAggregation
                  +            
                  +            
                  +                Interaction Pattern
                  +                SUBMIT
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                SUBMIT
                  +                YesNo
                  +                List<Identifier> domainList<Identifier> keys
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        domain - 
                  +        keys - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        Unknown: 
                  +        Ambiguous: 
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                Unknown
                  +                Defined in MAL
                  +                List<UInteger>
                  +                
                  +            
                  +            
                  +                Ambiguous
                  +                5
                  +                List<UInteger>
                  +                
                  +            
                  +        
                  +        
                  +            
                  +            Service: Packet
                  +        
                  +        
                  +            Overview
                  +        
                  +        The packet service allows a consumer to subscribe to a subset of the space packets, with filtering capabilities based on packets metadata.
                  +        
                  +            Table 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Table \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Table_TOC \s 1 1
                  +            Packet Service Operations
                  +            "
                  +            :  Packet Service Operations
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Area Identifier
                  +                Service Identifier
                  +                Area Number
                  +                Service Number
                  +                Area Version
                  +            
                  +            
                  +                MC
                  +                Packet
                  +                4
                  +                9
                  +                2
                  +            
                  +            
                  +                Interaction Pattern
                  +                Operation Identifier
                  +                Operation Number
                  +                Capability Set
                  +            
                  +            
                  +                PUB-SUB
                  +                 HYPERLINK  \l "OPERATION_9_deliverPacket" deliverPacket
                  +                1
                  +                1
                  +            
                  +        
                  +        
                  +            Service-level Requirements
                  +        
                  +        
                  +            
                  +            Operation: deliverPacket
                  +        
                  +        
                  +            Overview
                  +        
                  +        The deliverPacket operation allows a provider to publish space packets with associated metadata, and a consumer to receive a filtered set of those packets.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                deliverPacket
                  +            
                  +            
                  +                Interaction Pattern
                  +                PUBLISH-SUBSCRIBE
                  +            
                  +            
                  +                Subscription Keys
                  +                UShort apid
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                OUT
                  +                PUBLISH
                  +                NoNo
                  +                Time timestampBlob spacePacket
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        apid - 
                  +        timestamp - 
                  +        spacePacket - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation does not return any errors.
                  +        
                  +            Data types
                  +        
                  +        
                  +            Area data types: MC
                  +        
                  +        
                  +            
                  +            Enumeration: Severity
                  +        
                  +        The severity enumeration shall be used to hold the possible values for a severity.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                Severity
                  +            
                  +            
                  +                Short Form Part
                  +                6
                  +            
                  +            
                  +                Enumeration Value
                  +                Numerical Value
                  +                Comment
                  +            
                  +            
                  +                INFORMATIONAL
                  +                1
                  +                
                  +            
                  +            
                  +                WARNING
                  +                2
                  +                
                  +            
                  +            
                  +                ALARM
                  +                3
                  +                
                  +            
                  +            
                  +                SEVERE
                  +                4
                  +                
                  +            
                  +            
                  +                CRITICAL
                  +                5
                  +                
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ArgumentDefinition
                  +        
                  +        The ArgumentDefinition structure shall be used to hold the details of an argument definition.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ArgumentDefinition
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                1
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                argId
                  +                Identifier
                  +                No
                  +                
                  +            
                  +            
                  +                description
                  +                String
                  +                Yes
                  +                
                  +            
                  +            
                  +                type
                  +                AttributeType
                  +                No
                  +                
                  +            
                  +            
                  +                unit
                  +                String
                  +                Yes
                  +                
                  +            
                  +        
                  +        
                  +            
                  +            Enumeration: ActionCategory
                  +        
                  +        Contains the default Action category values.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ActionCategory
                  +            
                  +            
                  +                Short Form Part
                  +                10
                  +            
                  +            
                  +                Enumeration Value
                  +                Numerical Value
                  +                Comment
                  +            
                  +            
                  +                DEFAULT
                  +                1
                  +                
                  +            
                  +            
                  +                HIPRIORITY
                  +                2
                  +                
                  +            
                  +            
                  +                CRITICAL
                  +                3
                  +                
                  +            
                  +        
                  +        
                  +            
                  +            MO Object: ActionDefinition
                  +        
                  +        The ActionDefinition structure holds the definition information of an action.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ActionDefinition
                  +            
                  +            
                  +                Extends
                  +                Object
                  +            
                  +            
                  +                Short Form Part
                  +                11
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                objectIdentity
                  +                ObjectIdentity
                  +                No
                  +                The identity of the MO Object.
                  +            
                  +            
                  +                description
                  +                String
                  +                No
                  +                
                  +            
                  +            
                  +                category
                  +                 HYPERLINK  \l "DATATYPE_ActionCategory" ActionCategory
                  +                No
                  +                
                  +            
                  +            
                  +                progressStepCount
                  +                UShort
                  +                No
                  +                
                  +            
                  +            
                  +                arguments
                  +                List< HYPERLINK  \l "DATATYPE_ArgumentDefinition" ArgumentDefinition>
                  +                Yes
                  +                
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ActionExecutionRequest
                  +        
                  +        The ActionExecutionRequest structure holds the information required for a specific execution of an action.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ActionExecutionRequest
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                12
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                requestId
                  +                Long
                  +                No
                  +                
                  +            
                  +            
                  +                actionRef
                  +                ObjectRef< HYPERLINK  \l "DATATYPE_ActionDefinition" ActionDefinition>
                  +                No
                  +                
                  +            
                  +            
                  +                source
                  +                ObjectRef<Element>
                  +                Yes
                  +                
                  +            
                  +            
                  +                stageStartedRequired
                  +                Boolean
                  +                No
                  +                
                  +            
                  +            
                  +                stageProgressRequired
                  +                Boolean
                  +                No
                  +                
                  +            
                  +            
                  +                stageCompletedRequired
                  +                Boolean
                  +                No
                  +                
                  +            
                  +            
                  +                argumentValues
                  +                List<NullableAttribute>
                  +                Yes
                  +                
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ActionEvent
                  +        
                  +        The ActionEvent is the base type of all events used by the monitorActionExec operation to publish a new execution stage reached by the execution of an action.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ActionEvent
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Abstract
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                success
                  +                Boolean
                  +                No
                  +                
                  +            
                  +            
                  +                comment
                  +                String
                  +                Yes
                  +                
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ActionStartEvent
                  +        
                  +        The ActionStartEvent type is used for publishing an action execution reaching the started stage.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ActionStartEvent
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_ActionEvent" ActionEvent
                  +            
                  +            
                  +                Short Form Part
                  +                13
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ActionInProgressEvent
                  +        
                  +        The ActionInProgressEvent type is used for publishing an action execution reaching a new execution stage.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ActionInProgressEvent
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_ActionEvent" ActionEvent
                  +            
                  +            
                  +                Short Form Part
                  +                14
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                success
                  +                Boolean
                  +                No
                  +                
                  +            
                  +            
                  +                comment
                  +                String
                  +                Yes
                  +                
                  +            
                  +            
                  +                stageCount
                  +                UInteger
                  +                No
                  +                
                  +            
                  +            
                  +                executionStage
                  +                UInteger
                  +                No
                  +                
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ActionCompleteEvent
                  +        
                  +        The ActionCompleteEvent type is used for publishing an action execution reaching the completion stage.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ActionCompleteEvent
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_ActionEvent" ActionEvent
                  +            
                  +            
                  +                Short Form Part
                  +                15
                  +            
                  +        
                  +        
                  +            
                  +            Enumeration: ValidityState
                  +        
                  +        The ValidityState enumeration shall be used to hold the validity states and their numeric values.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ValidityState
                  +            
                  +            
                  +                Short Form Part
                  +                20
                  +            
                  +            
                  +                Enumeration Value
                  +                Numerical Value
                  +                Comment
                  +            
                  +            
                  +                VALID
                  +                0
                  +                
                  +            
                  +            
                  +                EXPIRED
                  +                1
                  +                
                  +            
                  +            
                  +                INVALID_RAW
                  +                2
                  +                
                  +            
                  +            
                  +                INVALID_CONVERSION
                  +                3
                  +                
                  +            
                  +            
                  +                UNVERIFIED
                  +                4
                  +                
                  +            
                  +            
                  +                INVALID
                  +                5
                  +                
                  +            
                  +        
                  +        
                  +            
                  +            MO Object: ParameterDefinition
                  +        
                  +        The ParameterDefinition structure holds a parameter definition.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ParameterDefinition
                  +            
                  +            
                  +                Extends
                  +                Object
                  +            
                  +            
                  +                Short Form Part
                  +                21
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                objectIdentity
                  +                ObjectIdentity
                  +                No
                  +                The identity of the MO Object.
                  +            
                  +            
                  +                description
                  +                String
                  +                No
                  +                
                  +            
                  +            
                  +                rawType
                  +                AttributeType
                  +                No
                  +                
                  +            
                  +            
                  +                rawUnit
                  +                String
                  +                Yes
                  +                
                  +            
                  +            
                  +                convertedType
                  +                AttributeType
                  +                Yes
                  +                
                  +            
                  +            
                  +                convertedUnit
                  +                String
                  +                Yes
                  +                
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ParameterValueData
                  +        
                  +        The ParameterValueData structure shall be used to hold a specific value of the parameter.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ParameterValueData
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                22
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                validityState
                  +                 HYPERLINK  \l "DATATYPE_ValidityState" ValidityState
                  +                No
                  +                
                  +            
                  +            
                  +                rawValue
                  +                Attribute
                  +                Yes
                  +                
                  +            
                  +            
                  +                convertedValue
                  +                Attribute
                  +                Yes
                  +                
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ParameterValue
                  +        
                  +        The ParameterValue structure is a contextual object associated to the ParameterDefinition. It is uniquely identified by the timestamp field, relative to the ParameterDefinition object. It represents a specific time stamped value of the parameter.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ParameterValue
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                23
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                paramRef
                  +                ObjectRef< HYPERLINK  \l "DATATYPE_ParameterDefinition" ParameterDefinition>
                  +                No
                  +                
                  +            
                  +            
                  +                timestamp
                  +                Time
                  +                No
                  +                
                  +            
                  +            
                  +                samplingTime
                  +                Time
                  +                Yes
                  +                
                  +            
                  +            
                  +                value
                  +                 HYPERLINK  \l "DATATYPE_ParameterValueData" ParameterValueData
                  +                No
                  +                
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ReportConfiguration
                  +        
                  +        The ReportConfiguration structure is used to retrieve the configuration of the report generation of a parameter.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ReportConfiguration
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                24
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                generationEnabled
                  +                Boolean
                  +                No
                  +                
                  +            
                  +            
                  +                reportInterval
                  +                Duration
                  +                No
                  +                
                  +            
                  +        
                  +        
                  +            
                  +            MO Object: AlertDefinition
                  +        
                  +        The AlertDefinition structure shall be used to provide the definition of an alert including any argument definitions.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                AlertDefinition
                  +            
                  +            
                  +                Extends
                  +                Object
                  +            
                  +            
                  +                Short Form Part
                  +                30
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                objectIdentity
                  +                ObjectIdentity
                  +                No
                  +                The identity of the MO Object.
                  +            
                  +            
                  +                description
                  +                String
                  +                No
                  +                
                  +            
                  +            
                  +                severity
                  +                 HYPERLINK  \l "DATATYPE_Severity" Severity
                  +                No
                  +                
                  +            
                  +            
                  +                arguments
                  +                List< HYPERLINK  \l "DATATYPE_ArgumentDefinition" ArgumentDefinition>
                  +                Yes
                  +                
                  +            
                  +        
                  +        
                  +            
                  +            Composite: AlertEvent
                  +        
                  +        The AlertEvent structure shall be used to hold the details of an instance of an alert.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                AlertEvent
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                31
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                alertRef
                  +                ObjectRef< HYPERLINK  \l "DATATYPE_AlertDefinition" AlertDefinition>
                  +                No
                  +                
                  +            
                  +            
                  +                timestamp
                  +                Time
                  +                No
                  +                
                  +            
                  +            
                  +                argumentValues
                  +                List<NullableAttribute>
                  +                Yes
                  +                
                  +            
                  +        
                  +        
                  +            
                  +            Composite: AlertConfiguration
                  +        
                  +        The AlertConfiguration structure is used to retrieve the configuration of the generation of an alert.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                AlertConfiguration
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                32
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                generationEnabled
                  +                Boolean
                  +                No
                  +                
                  +            
                  +        
                  +        
                  +            
                  +            MO Object: AggregationDefinition
                  +        
                  +        The AggregationDefinition structure shall be used to hold definition details of an aggregation.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                AggregationDefinition
                  +            
                  +            
                  +                Extends
                  +                Object
                  +            
                  +            
                  +                Short Form Part
                  +                60
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                objectIdentity
                  +                ObjectIdentity
                  +                No
                  +                The identity of the MO Object.
                  +            
                  +            
                  +                description
                  +                String
                  +                No
                  +                
                  +            
                  +            
                  +                category
                  +                Identifier
                  +                Yes
                  +                
                  +            
                  +            
                  +                parameters
                  +                List<ObjectRef< HYPERLINK  \l "DATATYPE_ParameterDefinition" ParameterDefinition>>
                  +                No
                  +                
                  +            
                  +        
                  +        
                  +            
                  +            Composite: AggregationValue
                  +        
                  +        The AggregationValue structure shall be used to hold the values of the aggregation parameters.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                AggregationValue
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                61
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                aggregationRef
                  +                ObjectRef< HYPERLINK  \l "DATATYPE_AggregationDefinition" AggregationDefinition>
                  +                No
                  +                
                  +            
                  +            
                  +                timestamp
                  +                Time
                  +                No
                  +                
                  +            
                  +            
                  +                parameterValues
                  +                List< HYPERLINK  \l "DATATYPE_ParameterValueData" ParameterValueData>
                  +                No
                  +                
                  +            
                  +        
                  +        
                  +            
                  +            Composite: PacketValue
                  +        
                  +        The PacketValue structure is used to represent each space packet published by the provider.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                PacketValue
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                90
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                payload
                  +                Blob
                  +                No
                  +                
                  +            
                  +            
                  +                timestamp
                  +                Time
                  +                No
                  +                
                  +            
                  +            
                  +                apid
                  +                UShort
                  +                No
                  +                
                  +            
                  +            
                  +                keyValues
                  +                List<NullableAttribute>
                  +                Yes
                  +                
                  +            
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The following table lists the errors defined in this specification:
                  +        
                  +            Table 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Table \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Table_TOC \s 1 1
                  +            MC MO Errors
                  +            "
                  +            :  MC MO Errors
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                Comment
                  +            
                  +            
                  +                Read Only
                  +                1
                  +                The operation attempted to modify read-only data, which cannot be changed.
                  +            
                  +            
                  +                Duplicate
                  +                2
                  +                The entry or operation is a duplicate of an existing record, violating uniqueness.
                  +            
                  +            
                  +                Invalid
                  +                3
                  +                The input data or operation format is invalid and does not meet required criteria.
                  +            
                  +            
                  +                Rejected
                  +                4
                  +                The operation has been rejected due to policy or validation rules.
                  +            
                  +            
                  +                Ambiguous
                  +                5
                  +                The data or operation is ambiguous, requiring clarification to proceed.
                  +            
                  +        
                  +    
                  +
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area004-v002-MC/word/numbering.xml b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area004-v002-MC/word/numbering.xml
                  new file mode 100644
                  index 00000000..d159498b
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area004-v002-MC/word/numbering.xml
                  @@ -0,0 +1,41 @@
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area004-v002-MC/word/styles.xml b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area004-v002-MC/word/styles.xml
                  new file mode 100644
                  index 00000000..ee967ee1
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area004-v002-MC/word/styles.xml
                  @@ -0,0 +1 @@
                  +
                  \ No newline at end of file
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area005-v001-MPS/[Content_Types].xml b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area005-v001-MPS/[Content_Types].xml
                  new file mode 100644
                  index 00000000..fbe325d6
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area005-v001-MPS/[Content_Types].xml
                  @@ -0,0 +1 @@
                  +
                  \ No newline at end of file
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area005-v001-MPS/_rels/.rels b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area005-v001-MPS/_rels/.rels
                  new file mode 100644
                  index 00000000..d6637f3e
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area005-v001-MPS/_rels/.rels
                  @@ -0,0 +1 @@
                  +
                  \ No newline at end of file
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area005-v001-MPS/word/_rels/document.xml.rels b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area005-v001-MPS/word/_rels/document.xml.rels
                  new file mode 100644
                  index 00000000..7af141e1
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area005-v001-MPS/word/_rels/document.xml.rels
                  @@ -0,0 +1 @@
                  +
                  \ No newline at end of file
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area005-v001-MPS/word/document.xml b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area005-v001-MPS/word/document.xml
                  new file mode 100644
                  index 00000000..1dc8066b
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area005-v001-MPS/word/document.xml
                  @@ -0,0 +1,14418 @@
                  +
                  +
                  +    
                  +        
                  +            Specification: MPS
                  +        
                  +        
                  +            General
                  +        
                  +        This section contains the specifications for the MPS services.
                  +        Mission Operations Mission Planning and Scheduling Services
                  +        This area contains the following services:
                  +        PlanningRequest
                  +        PlanDistribution
                  +        PlanExecutionControl
                  +        PlanInformationManagement
                  +        PlanEdit
                  +        
                  +            
                  +            Service: PlanningRequest
                  +        
                  +        
                  +            Overview
                  +        
                  +        The Planning Request Service, introduced in 2.5.2, is provided by a planning function and enables its consumers to manage the submission of planning requests and to receive feedback on their status.
                  +        It comprises the operations defined below, of which only those in capability set 1 are mandatory. In the context of a hierarchical or federated planning system, the Planning Request Service submitRequest operation can be used to submit a Plan (4.5.6) to a planning function, either embedding the Plan in the request itself or passing it by reference.
                  +        If passed by reference, the Plan can be retrieved using the Plan Distribution Service (3.6).
                  +        Patch plans are not permitted in the context of a planning request.
                  +        
                  +            Table 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Table \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Table_TOC \s 1 1
                  +            PlanningRequest Service Operations
                  +            "
                  +            :  PlanningRequest Service Operations
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Area Identifier
                  +                Service Identifier
                  +                Area Number
                  +                Service Number
                  +                Area Version
                  +            
                  +            
                  +                MPS
                  +                PlanningRequest
                  +                5
                  +                1
                  +                1
                  +            
                  +            
                  +                Interaction Pattern
                  +                Operation Identifier
                  +                Operation Number
                  +                Capability Set
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_1_submitRequest" submitRequest
                  +                1
                  +                1
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_1_getRequestSummaries" getRequestSummaries
                  +                2
                  +                
                  +            
                  +            
                  +                PROGRESS
                  +                 HYPERLINK  \l "OPERATION_1_getRequestStatus" getRequestStatus
                  +                3
                  +                
                  +            
                  +            
                  +                SUBMIT
                  +                 HYPERLINK  \l "OPERATION_1_cancelRequest" cancelRequest
                  +                4
                  +                2
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_1_updateRequest" updateRequest
                  +                5
                  +                3
                  +            
                  +            
                  +                PUB-SUB
                  +                 HYPERLINK  \l "OPERATION_1_monitorRequestStatus" monitorRequestStatus
                  +                6
                  +                4
                  +            
                  +            
                  +                PROGRESS
                  +                 HYPERLINK  \l "OPERATION_1_getRequest" getRequest
                  +                7
                  +                5
                  +            
                  +        
                  +        
                  +            Service-level Requirements
                  +        
                  +        3.5.4.1 The following set of mission planning configuration data shall be available to both provider and consumers in any deployment of the planning request service:
                  +        a) Planning Request Definitions (as RequestDefinition objects [4.5.5.1.1]);
                  +        b) Planning Activity Definitions (as ActivityDefinition objects [4.5.2.1.1]);
                  +        c) Planning Event Definitions (as EventDefinition objects [4.5.3.1.1]);
                  +        d) Planning Resource Definitions (as Resource objects [4.5.4.2.1]) [Optional];
                  +        3.5.5.1 In response to a submitRequest operation, the service provider shall create a corresponding RequestInstance object, set its creationTime and return a reference to the object to the consumer.
                  +        3.5.5.2 In response to an updateRequest operation, if supported, the service provider shall create a new version of the referenced RequestInstance object, set its creationTime and return a reference to the object to the consumer.
                  +        3.5.5.3 The service provider shall only consider the latest version of a RequestInstance in the generation of future Plans, following a successful updateRequest operation.
                  +        3.5.5.4 In response to a cancelRequest operation, if supported, the service provider shall set the requestStatus of the referenced RequestInstance object to ‘CANCELLED’ and stop it being considered in the generation of future Plans.
                  +        3.5.5.5 In response to internal planning and feedback from external plan execution processes, the service provider shall model the status of RequestInstance objects in accordance with the planning request state model (4.5.5.2).
                  +        NOTE	–	Following a successful updateRequest operation, it is implementation dependent what the status of the previous version of the RequestInstance is set to.
                  +        Previous versions may already have been incorporated into Plans.
                  +        3.5.5.6 If a service consumer generates a planning request based on an existing planning request definition, then the PlanningRequestDetails submitted shall:
                  +        a) Reference the source RequestDefinition in the definition field;
                  +        b) Contain a matching set of arguments (name and type) to the RequestDefinition in the arguments field;
                  +        c) Have a matching value to the RequestDefinition in the standingOrder field.
                  +        NOTE	–	While typically the PlanningRequestDetails will also have matching content to the RequestDefinition in the activities and constraints fields it is allowed to add and remove individual activities and constraints.
                  +        3.5.5.7 In the context of a planning request that contains or references an existing Plan, the Plan shall be a full plan, patch plans are not permitted.
                  +        3.5.5.8 Following successful inclusion of a planning request in a generated Plan, the service provider shall update the outputPlanRefs field of the RequestInstance with a reference to the Plan.
                  +        NOTE	–	The consumer may then use the reference to the output Plan to retrieve the Plan or its status using the PlanDistributionService.
                  +        Where the planning request has been incorporated into multiple alternate plans, these will be listed in the outputPlanRefs field.
                  +        
                  +            
                  +            Operation: submitRequest
                  +        
                  +        
                  +            Overview
                  +        
                  +        The submitRequest operation sends a planning request to the provider, which then creates a corresponding RequestInstance object and returns its identity to the consumer.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                submitRequest
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                No
                  +                 HYPERLINK  \l "DATATYPE_PlanningRequestDetails" PlanningRequestDetails requestDetails
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                No
                  +                 HYPERLINK  \l "DATATYPE_PlanningRequestResponse" PlanningRequestResponse requestResponse
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        requestDetails - 
                  +        requestResponse - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        INVALID: One or more fields in the message contain invalid values.
                  +        UNSUPPORTED: An optional data structure used in the message is not supported by the service provider.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                INVALID
                  +                1
                  +                List<Pair>
                  +                ExtraInfo comprises a list of structures, each identifying an invalid field, comprising: A MAL::String giving a dot-separated nested index for the invalid field(s).  This allows for fields that are themselves a structure or list element to be denoted.  For example, the form ‘3.2.4’ could mean the 4th element of the 2nd field of the composite structure that is the 3rd field of the message. A MAL::UShort giving a secondary error code that details the reason for invalidity.
                  +            
                  +            
                  +                UNSUPPORTED
                  +                10
                  +                List<String>
                  +                ExtraInfo comprises a list of MAL::Strings giving a dot-separated nested index for the unsupported field(s).  This allows for fields that are themselves a structure or list element to be denoted.  For example, the form ‘3.2.4’ could mean the 4th element of the 2nd field of the composite structure that is the 3rd field of the message.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: getRequestSummaries
                  +        
                  +        
                  +            Overview
                  +        
                  +        The getRequestSummaries operation allows consumers to obtain a filtered list of currently available RequestInstances.
                  +        The request uses the RequestFilter structure to select the set of planning requests of interest, using the following keys: Domain of the RequestInstance; Reference to the RequestInstance; Creation date and time of the RequestInstance (as a time range); Reference to the RequestDefinition from which the RequestInstance was created; User ID of the PlanningUser who initiated the RequestInstance; User Reference supplied by the User when submitting the RequestInstance; Current status of the RequestInstance; Reference to the output Plan(s) generated in response to the RequestInstance. The response returns a list of RequestSummaryStatus structures containing references to the identities, descriptive header fields, and status of the RequestInstances that match the filter.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                getRequestSummaries
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                No
                  +                 HYPERLINK  \l "DATATYPE_RequestFilter" RequestFilter requestFilter
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                No
                  +                List< HYPERLINK  \l "DATATYPE_RequestSummaryStatus" RequestSummaryStatus> requestSummaries
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        requestFilter - 
                  +        requestSummaries - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return the following error:
                  +        INVALID: One or more fields in the message contain invalid values.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                INVALID
                  +                1
                  +                List<Pair>
                  +                ExtraInfo comprises a list of structures, each identifying an invalid field, comprising: A MAL::String giving a dot-separated nested index for the invalid field(s).  This allows for fields that are themselves a structure or list element to be denoted.  For example, the form ‘3.2.4’ could mean the 4th element of the 2nd field of the composite structure that is the 3rd field of the message. A MAL::UShort giving a secondary error code that details the reason for invalidity.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: getRequestStatus
                  +        
                  +        
                  +            Overview
                  +        
                  +        The getRequestStatus operation is used to obtain the current status of one or more known RequestInstances.
                  +        The operation uses the Progress interaction pattern, to allow the response to be spread across multiple messages.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                getRequestStatus
                  +            
                  +            
                  +                Interaction Pattern
                  +                PROGRESS
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                PROGRESS
                  +                No
                  +                List<ObjectRef< HYPERLINK  \l "DATATYPE_RequestInstance" RequestInstance>> requestRefs
                  +            
                  +            
                  +                OUT
                  +                ACK
                  +                -
                  +                -
                  +            
                  +            
                  +                OUT
                  +                UPDATE
                  +                No
                  +                List< HYPERLINK  \l "DATATYPE_RequestStatusUpdate" RequestStatusUpdate> requestStatuses
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                -
                  +                -
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        requestRefs - 
                  +        requestStatuses - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return the following error:
                  +        INVALID: One or more fields in the message contain invalid values.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                INVALID
                  +                1
                  +                List<Pair>
                  +                ExtraInfo comprises a list of structures, each identifying an invalid field, comprising: A MAL::String giving a dot-separated nested index for the invalid field(s).  This allows for fields that are themselves a structure or list element to be denoted.  For example, the form ‘3.2.4’ could mean the 4th element of the 2nd field of the composite structure that is the 3rd field of the message. A MAL::UShort giving a secondary error code that details the reason for invalidity.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: cancelRequest
                  +        
                  +        
                  +            Overview
                  +        
                  +        The cancelRequest operation is used by a consumer to cancel a previously submitted planning request.
                  +        The service provider acknowledges the cancellation of the RequestInstance or returns an error.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                cancelRequest
                  +            
                  +            
                  +                Interaction Pattern
                  +                SUBMIT
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                SUBMIT
                  +                No
                  +                ObjectRef< HYPERLINK  \l "DATATYPE_RequestInstance" RequestInstance> requestRef
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        requestRef - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        INVALID: One or more fields in the message contain invalid values.
                  +        CANCEL_FAILED: The cancelRequest operation failed to cancel the referenced RequestInstance.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                INVALID
                  +                1
                  +                List<Pair>
                  +                ExtraInfo comprises a list of structures, each identifying an invalid field, comprising: A MAL::String giving a dot-separated nested index for the invalid field(s).  This allows for fields that are themselves a structure or list element to be denoted.  For example, the form ‘3.2.4’ could mean the 4th element of the 2nd field of the composite structure that is the 3rd field of the message. A MAL::UShort giving a secondary error code that details the reason for invalidity.
                  +            
                  +            
                  +                CANCEL_FAILED
                  +                2
                  +                String
                  +                ExtraInfo provides additional information on the reason for failure as a free format string.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: updateRequest
                  +        
                  +        
                  +            Overview
                  +        
                  +        The updateRequest operation may be used to modify the PlanningRequestDetails associated with a previously submitted planning request.
                  +        This results in the creation of a new version of the RequestInstance (with the same key) by the service provider, which returns a reference to the new version to the consumer.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                updateRequest
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                NoNo
                  +                ObjectRef< HYPERLINK  \l "DATATYPE_RequestInstance" RequestInstance> requestRef HYPERLINK  \l "DATATYPE_PlanningRequestDetails" PlanningRequestDetails requestDetails
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                No
                  +                 HYPERLINK  \l "DATATYPE_PlanningRequestResponse" PlanningRequestResponse requestResponse
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        requestRef - 
                  +        requestDetails - 
                  +        requestResponse - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        INVALID: One or more fields in the message contain invalid values.
                  +        UPDATE_FAILED: The update operation (to Request, PlanStatus, Activity, Event or Resource) failed to update the referenced object.
                  +        UNSUPPORTED: An optional data structure used in the message is not supported by the service provider.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                INVALID
                  +                1
                  +                List<Pair>
                  +                ExtraInfo comprises a list of structures, each identifying an invalid field, comprising: A MAL::String giving a dot-separated nested index for the invalid field(s).  This allows for fields that are themselves a structure or list element to be denoted.  For example, the form ‘3.2.4’ could mean the 4th element of the 2nd field of the composite structure that is the 3rd field of the message. A MAL::UShort giving a secondary error code that details the reason for invalidity.
                  +            
                  +            
                  +                UPDATE_FAILED
                  +                3
                  +                String
                  +                ExtraInfo provides additional information on the reason for failure as a free format string.
                  +            
                  +            
                  +                UNSUPPORTED
                  +                10
                  +                List<String>
                  +                ExtraInfo comprises a list of MAL::Strings giving a dot-separated nested index for the unsupported field(s).  This allows for fields that are themselves a structure or list element to be denoted.  For example, the form ‘3.2.4’ could mean the 4th element of the 2nd field of the composite structure that is the 3rd field of the message.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: monitorRequestStatus
                  +        
                  +        
                  +            Overview
                  +        
                  +        The monitorRequestStatus operation is used to subscribe to status updates for a filtered set of planning RequestInstances.
                  +        The operation uses the Publish-Subscribe interaction pattern, with the body of the notification message comprising a RequestStatusUpdate for a subscribed RequestInstance.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                monitorRequestStatus
                  +            
                  +            
                  +                Interaction Pattern
                  +                PUBLISH-SUBSCRIBE
                  +            
                  +            
                  +                Subscription Keys
                  +                Identifier instanceIDIdentifier definitionIDIdentifier userIDIdentifier userReferenceUShort statusIdentifier outputPlanID
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                OUT
                  +                PUBLISH
                  +                No
                  +                 HYPERLINK  \l "DATATYPE_RequestStatusUpdate" RequestStatusUpdate requestStatusUpdate
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        instanceID - 
                  +        definitionID - 
                  +        userID - 
                  +        userReference - 
                  +        status - 
                  +        outputPlanID - 
                  +        requestStatusUpdate - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation does not return any errors.
                  +        
                  +            
                  +            Operation: getRequest
                  +        
                  +        
                  +            Overview
                  +        
                  +        The getRequest operation is used to obtain the full content of one or more known RequestInstances.
                  +        The operation uses the Progress interaction pattern, to allow the response to be spread across multiple messages.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                getRequest
                  +            
                  +            
                  +                Interaction Pattern
                  +                PROGRESS
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                PROGRESS
                  +                No
                  +                List<ObjectRef< HYPERLINK  \l "DATATYPE_RequestInstance" RequestInstance>> requestRefs
                  +            
                  +            
                  +                OUT
                  +                ACK
                  +                -
                  +                -
                  +            
                  +            
                  +                OUT
                  +                UPDATE
                  +                No
                  +                List< HYPERLINK  \l "DATATYPE_RequestInstance" RequestInstance> requestInstances
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                -
                  +                -
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        requestRefs - 
                  +        requestInstances - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return the following error:
                  +        INVALID: One or more fields in the message contain invalid values.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                INVALID
                  +                1
                  +                List<Pair>
                  +                ExtraInfo comprises a list of structures, each identifying an invalid field, comprising: A MAL::String giving a dot-separated nested index for the invalid field(s).  This allows for fields that are themselves a structure or list element to be denoted.  For example, the form ‘3.2.4’ could mean the 4th element of the 2nd field of the composite structure that is the 3rd field of the message. A MAL::UShort giving a secondary error code that details the reason for invalidity.
                  +            
                  +        
                  +        
                  +            
                  +            Service: PlanDistribution
                  +        
                  +        
                  +            Overview
                  +        
                  +        The Plan Distribution Service, introduced in 2.5.3, is provided by a planning function and enables its consumers to access generated plans and to receive updates on their status.
                  +        It comprises the operations defined below, of which only those in capability set 1 are mandatory.
                  +        
                  +            Table 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Table \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Table_TOC \s 1 1
                  +            PlanDistribution Service Operations
                  +            "
                  +            :  PlanDistribution Service Operations
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Area Identifier
                  +                Service Identifier
                  +                Area Number
                  +                Service Number
                  +                Area Version
                  +            
                  +            
                  +                MPS
                  +                PlanDistribution
                  +                5
                  +                2
                  +                1
                  +            
                  +            
                  +                Interaction Pattern
                  +                Operation Identifier
                  +                Operation Number
                  +                Capability Set
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_2_getPlanSummaries" getPlanSummaries
                  +                1
                  +                1
                  +            
                  +            
                  +                PROGRESS
                  +                 HYPERLINK  \l "OPERATION_2_getPlan" getPlan
                  +                2
                  +                
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_2_getPlanStatus" getPlanStatus
                  +                3
                  +                
                  +            
                  +            
                  +                PUB-SUB
                  +                 HYPERLINK  \l "OPERATION_2_monitorPlanStatus" monitorPlanStatus
                  +                4
                  +                2
                  +            
                  +            
                  +                PUB-SUB
                  +                 HYPERLINK  \l "OPERATION_2_monitorPlan" monitorPlan
                  +                5
                  +                3
                  +            
                  +            
                  +                PROGRESS
                  +                 HYPERLINK  \l "OPERATION_2_queryPlan" queryPlan
                  +                6
                  +                4
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_2_getPartialPlan" getPartialPlan
                  +                7
                  +                5
                  +            
                  +        
                  +        
                  +            Service-level Requirements
                  +        
                  +        3.6.4.1 The following set of mission planning configuration data shall be available to both provider and consumers in any deployment of the plan distribution service:
                  +        a) Planning Activity Definitions (as ActivityDefinition objects [4.5.2.1.1]);
                  +        b) Planning Event Definitions (as EventDefinition objects [4.5.3.1.1]);
                  +        c) Planning Resource Definitions (as Resource objects [4.5.4.2.1]) [Optional];
                  +        3.6.5.1 If Plan version 0 is specified in the getPlan and getPlanStatus operations, then the service provider shall assume the latest version of the Plan is required.
                  +        3.6.5.2 In response to internal planning and feedback from external plan execution processes, the service provider shall model the status of Plan objects in accordance with the plan state model (see 4.5.6.2).
                  +        NOTE	–	A planning function that is a service provider is not required to support real-time provision of Plan status changes.
                  +        Feedback from plan execution functions may only be processed periodically by the planning function as part of a planning cycle.
                  +        
                  +            
                  +            Operation: getPlanSummaries
                  +        
                  +        
                  +            Overview
                  +        
                  +        The getPlanSummaries operation allows consumers to obtain a filtered list of currently available Plans.
                  +        The request uses the PlanFilter structure to select the set of plans of interest, using the following keys: Domain of the Plan; Reference to the Plan; Reference to the precursor Plan of the Plan; Current status of the Plan; Originator of the Plan; Validity period of the Plan (as a time window). The response returns a list of PlanSummaryStatus structures containing references to the identities, descriptive header fields, and status of the Plans that match the filter.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                getPlanSummaries
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                No
                  +                 HYPERLINK  \l "DATATYPE_PlanFilter" PlanFilter planFilter
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                No
                  +                List< HYPERLINK  \l "DATATYPE_PlanSummaryStatus" PlanSummaryStatus> planSummaries
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        planFilter - 
                  +        planSummaries - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return the following error:
                  +        INVALID: One or more fields in the message contain invalid values.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                INVALID
                  +                1
                  +                List<Pair>
                  +                ExtraInfo comprises a list of structures, each identifying an invalid field, comprising: A MAL::String giving a dot-separated nested index for the invalid field(s).  This allows for fields that are themselves a structure or list element to be denoted.  For example, the form ‘3.2.4’ could mean the 4th element of the 2nd field of the composite structure that is the 3rd field of the message. A MAL::UShort giving a secondary error code that details the reason for invalidity.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: getPlan
                  +        
                  +        
                  +            Overview
                  +        
                  +        The getPlan operation is used to obtain the full content of one or more known Plans.
                  +        The operation uses the Progress interaction pattern, to allow the response to be spread across multiple messages.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                getPlan
                  +            
                  +            
                  +                Interaction Pattern
                  +                PROGRESS
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                PROGRESS
                  +                No
                  +                List<ObjectRef< HYPERLINK  \l "DATATYPE_Plan" Plan>> planRefs
                  +            
                  +            
                  +                OUT
                  +                ACK
                  +                -
                  +                -
                  +            
                  +            
                  +                OUT
                  +                UPDATE
                  +                No
                  +                 HYPERLINK  \l "DATATYPE_Plan" Plan retrievedPlan
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                -
                  +                -
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        planRefs - 
                  +        retrievedPlan - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return the following error:
                  +        INVALID: One or more fields in the message contain invalid values.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                INVALID
                  +                1
                  +                List<Pair>
                  +                ExtraInfo comprises a list of structures, each identifying an invalid field, comprising: A MAL::String giving a dot-separated nested index for the invalid field(s).  This allows for fields that are themselves a structure or list element to be denoted.  For example, the form ‘3.2.4’ could mean the 4th element of the 2nd field of the composite structure that is the 3rd field of the message. A MAL::UShort giving a secondary error code that details the reason for invalidity.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: getPlanStatus
                  +        
                  +        
                  +            Overview
                  +        
                  +        The getPlanStatus operation is used to obtain the current status of one or more known Plans.
                  +        The operation uses the Request interaction pattern.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                getPlanStatus
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                No
                  +                List<ObjectRef< HYPERLINK  \l "DATATYPE_Plan" Plan>> planRefs
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                No
                  +                List< HYPERLINK  \l "DATATYPE_PlanUpdate" PlanUpdate> responsePlans
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        planRefs - 
                  +        responsePlans - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return the following error:
                  +        INVALID: One or more fields in the message contain invalid values.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                INVALID
                  +                1
                  +                List<Pair>
                  +                ExtraInfo comprises a list of structures, each identifying an invalid field, comprising: A MAL::String giving a dot-separated nested index for the invalid field(s).  This allows for fields that are themselves a structure or list element to be denoted.  For example, the form ‘3.2.4’ could mean the 4th element of the 2nd field of the composite structure that is the 3rd field of the message. A MAL::UShort giving a secondary error code that details the reason for invalidity.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: monitorPlanStatus
                  +        
                  +        
                  +            Overview
                  +        
                  +        The monitorPlanStatus operation is used to subscribe to status updates for a filtered set of Plans.
                  +        The operation uses the Publish-Subscribe interaction pattern, with the body of the notification message comprising a PlanUpdate for a subscribed Plan.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                monitorPlanStatus
                  +            
                  +            
                  +                Interaction Pattern
                  +                PUBLISH-SUBSCRIBE
                  +            
                  +            
                  +                Subscription Keys
                  +                Identifier planIDIdentifier precursorUShort statusIdentifier originator
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                OUT
                  +                PUBLISH
                  +                No
                  +                 HYPERLINK  \l "DATATYPE_PlanUpdate" PlanUpdate planUpdate
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        planID - 
                  +        precursor - 
                  +        status - 
                  +        originator - 
                  +        planUpdate - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation does not return any errors.
                  +        
                  +            
                  +            Operation: monitorPlan
                  +        
                  +        
                  +            Overview
                  +        
                  +        The monitorPlan operation is used by a consumer to subscribe to receive new Plans, or new versions of Plans, as they published.
                  +        The operation uses the Publish-Subscribe interaction pattern, with the body of the notification message comprising a Plan.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                monitorPlan
                  +            
                  +            
                  +                Interaction Pattern
                  +                PUBLISH-SUBSCRIBE
                  +            
                  +            
                  +                Subscription Keys
                  +                Identifier planIDIdentifier precursorUShort statusIdentifier originator
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                OUT
                  +                PUBLISH
                  +                No
                  +                 HYPERLINK  \l "DATATYPE_Plan" Plan plan
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        planID - 
                  +        precursor - 
                  +        status - 
                  +        originator - 
                  +        plan - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation does not return any errors.
                  +        
                  +            
                  +            Operation: queryPlan
                  +        
                  +        
                  +            Overview
                  +        
                  +        The queryPlan operation enables a consumer to retrieve a filtered set of plans, based on an extended set of filter criteria, including relevant fields of the plan information sections of the plan, as well as the type of planning activities and planning events contained within the plan.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                queryPlan
                  +            
                  +            
                  +                Interaction Pattern
                  +                PROGRESS
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                PROGRESS
                  +                No
                  +                 HYPERLINK  \l "DATATYPE_PlanQuery" PlanQuery query
                  +            
                  +            
                  +                OUT
                  +                ACK
                  +                -
                  +                -
                  +            
                  +            
                  +                OUT
                  +                UPDATE
                  +                No
                  +                 HYPERLINK  \l "DATATYPE_Plan" Plan queriedPlan
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                -
                  +                -
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        query - 
                  +        queriedPlan - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return the following error:
                  +        INVALID: One or more fields in the message contain invalid values.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                INVALID
                  +                1
                  +                List<Pair>
                  +                ExtraInfo comprises a list of structures, each identifying an invalid field, comprising: A MAL::String giving a dot-separated nested index for the invalid field(s).  This allows for fields that are themselves a structure or list element to be denoted.  For example, the form ‘3.2.4’ could mean the 4th element of the 2nd field of the composite structure that is the 3rd field of the message. A MAL::UShort giving a secondary error code that details the reason for invalidity.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: getPartialPlan
                  +        
                  +        
                  +            Overview
                  +        
                  +        The getPartialPlan operation enables a consumer to extract a subset of a Plan that meets the supplied partialPlanFilter.
                  +        The filter can select the partial plan content based on: a shorter period than that covered by the plan, specified by time, position, or events; a subset of contained ActivityInstances, based on their domain, associated SubPlan or tags. The PartialPlan returned includes the filter criteria and a version of the plan containing only the ActivityInstances that match those criteria.
                  +        It is implementation dependent what is returned in terms of events and resources, but it may be assumed that any related events and resources would be included in the returned partial plan.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                getPartialPlan
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                No
                  +                 HYPERLINK  \l "DATATYPE_PartialPlanFilter" PartialPlanFilter partialPlanFilter
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                No
                  +                 HYPERLINK  \l "DATATYPE_PartialPlan" PartialPlan partialPlan
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        partialPlanFilter - 
                  +        partialPlan - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return the following error:
                  +        INVALID: One or more fields in the message contain invalid values.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                INVALID
                  +                1
                  +                List<Pair>
                  +                ExtraInfo comprises a list of structures, each identifying an invalid field, comprising: A MAL::String giving a dot-separated nested index for the invalid field(s).  This allows for fields that are themselves a structure or list element to be denoted.  For example, the form ‘3.2.4’ could mean the 4th element of the 2nd field of the composite structure that is the 3rd field of the message. A MAL::UShort giving a secondary error code that details the reason for invalidity.
                  +            
                  +        
                  +        
                  +            
                  +            Service: PlanExecutionControl
                  +        
                  +        
                  +            Overview
                  +        
                  +        The Plan Execution Control Service, introduced in 2.5.4, is provided by a plan execution function and enables its consumers to submit (and revoke) Plans for execution; to control their execution at plan, sub-plan, and activity levels; and to receive feedback on their execution status.
                  +        It comprises the operations defined below, of which only those in capability set 1 are mandatory.
                  +        
                  +            Table 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Table \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Table_TOC \s 1 1
                  +            PlanExecutionControl Service Operations
                  +            "
                  +            :  PlanExecutionControl Service Operations
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Area Identifier
                  +                Service Identifier
                  +                Area Number
                  +                Service Number
                  +                Area Version
                  +            
                  +            
                  +                MPS
                  +                PlanExecutionControl
                  +                5
                  +                3
                  +                1
                  +            
                  +            
                  +                Interaction Pattern
                  +                Operation Identifier
                  +                Operation Number
                  +                Capability Set
                  +            
                  +            
                  +                SUBMIT
                  +                 HYPERLINK  \l "OPERATION_3_submitPlan" submitPlan
                  +                1
                  +                1
                  +            
                  +            
                  +                SUBMIT
                  +                 HYPERLINK  \l "OPERATION_3_revokePlan" revokePlan
                  +                2
                  +                
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_3_getPlanStatus" getPlanStatus
                  +                3
                  +                
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_3_activatePlan" activatePlan
                  +                4
                  +                2
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_3_deactivatePlan" deactivatePlan
                  +                5
                  +                
                  +            
                  +            
                  +                PUB-SUB
                  +                 HYPERLINK  \l "OPERATION_3_monitorPlanExecution" monitorPlanExecution
                  +                6
                  +                3
                  +            
                  +            
                  +                PUB-SUB
                  +                 HYPERLINK  \l "OPERATION_3_monitorPlanExecutionDetail" monitorPlanExecutionDetail
                  +                7
                  +                4
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_3_activateSubPlan" activateSubPlan
                  +                8
                  +                5
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_3_deactivateSubPlan" deactivateSubPlan
                  +                9
                  +                
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_3_getSubPlanStatus" getSubPlanStatus
                  +                10
                  +                
                  +            
                  +            
                  +                PUB-SUB
                  +                 HYPERLINK  \l "OPERATION_3_monitorSubPlanExecution" monitorSubPlanExecution
                  +                11
                  +                6
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_3_suspendActivity" suspendActivity
                  +                12
                  +                7
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_3_resumeActivity" resumeActivity
                  +                13
                  +                
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_3_getActivityStatus" getActivityStatus
                  +                14
                  +                8
                  +            
                  +        
                  +        
                  +            Service-level Requirements
                  +        
                  +        3.7.4.1 The following set of mission planning configuration data shall be available to both provider and consumers in any deployment of the plan execution control service:
                  +        a) Planning Activity Definitions (as ActivityDefinition objects [4.5.2.1.1]);
                  +        b) Planning Event Definitions (as EventDefinition objects [4.5.3.1.1]);
                  +        c) Planning Resource Definitions (as Resource objects [4.5.4.2.1]) [Optional];
                  +        3.7.5.1 In response to a submitPlan operation, the service provider shall make the submitted Plan available for execution.
                  +        3.7.5.2 If the service does not support plan activation (capability set 2), the service provider shall provide an internal mechanism to activate submitted Plans.
                  +        NOTE	–	This may be as simple as to automatically activate Plans on submission.
                  +        3.7.5.3 In response to a revokePlan operation, the service provider shall make the submitted Plan unavailable for execution.
                  +        If this is not possible (for example, if the plan has already executed), then a REVOKE_FAILED error shall be returned.
                  +        3.7.5.4 In response to internal plan execution processes, the service provider shall model the status of Plans in accordance with the plan state model (see 4.5.6.2).
                  +        3.7.5.5 In response to an activatePlan operation, or internal plan activation where not supported, the service provider shall enable the execution of the referenced Plans and the ActivityInstances contained within them, subject to the triggering constraints specified within the Plans.
                  +        3.7.5.6 In response to an activatePlan operation, if a referenced Plan overlaps with its already activated precursor Plan, then the service provider should merge plan revisions into the currently active Plan.
                  +        NOTE	–	It is implementation dependent whether overlapping Plans are supported and how this is managed internally by the plan execution function.
                  +        However, it is common for successive iterations of a Plan to overlap, for example with a Plan being generated daily for the coming week.
                  +        In this case, the same ActivityInstance may appear in the overlap period of both Plans, and may be unchanged, modified or deleted in the successor Plan.
                  +        New ActivityInstances may also be inserted in the overlap period or in the extended period covered by the successor Plan.
                  +        It is anticipated that when the successor Plan is activated, then its predecessor is superseded from the start point of the successor Plan with any revisions applicable to the overlap period being applied.
                  +        Only the latest revision of the ActivityInstance is executed.
                  +        3.7.5.7 In response to an activatePlan operation, if a referenced Plan is a target or Patch Plan, then the service provider shall also activate the associated precursor Plan.
                  +        NOTES
                  +        1 It is implementation dependent whether the target Plan is reconstituted prior to activation, or the precursor is activated and the Patch Plan merged into this.
                  +        2 If the precursor Plan is already activated, then the Patch Plan can be merged into the currently active Plan.
                  +        If the precursor Plan is not available, then the operation cannot be performed.
                  +        3.7.5.8 It shall not be possible to activate a Plan if it is outside the validity period of the Plan, or if the start of the Plan period has already passed.
                  +        In this case, the activatePlan operation shall fail by returning error ACTIVATE_FAILED.
                  +        3.7.5.9 In response to a deactivatePlan operation, if supported, the service provider shall disable the execution of the referenced Plans and the ActivityInstances contained within them, subject to the specified deactivationMode.
                  +        NOTE	–	Supported deactivationModes are specific to the implementation of the service provider.
                  +        3.7.5.10 If Plan version 0 is specified in the getPlanStatus, monitorPlanExecution, and monitorPlanExecutionDetail operations, then the service provider shall assume the latest version of the Plan is required.
                  +        3.7.5.11 If the monitorPlanExecutionDetail operation (or activity level operations) are supported, then in response to internal plan execution processes, the service provider shall model the status of ActivityInstances and EventInstances in accordance with their respective state models (4.5.2.2 and 4.5.3.2).
                  +        3.7.5.12 If the monitorPlanExecutionDetail operation is supported, the service provider may model the evolving value of planning Resources in accordance with the ResourceProfiles (4.5.4.4) defined within Plans and any Effects (4.6.7) associated with ActivityInstances.
                  +        3.7.5.13 If SubPlans are supported, the service provider shall maintain the current status of SubPlans as ACTIVATED or DEACTIVATED.
                  +        NOTE	–	The status of SubPlans is independent to that of Plans and a change in their activation status has no impact on the status of the Plan.
                  +        It may impact the status of individual ActivityInstances, which can be observed using the monitorPlanExecutionDetail operation.
                  +        3.7.5.14 In response to an activateSubPlan operation, if supported, the service provider shall activate the referenced SubPlans and enable the execution of ActivityInstances that are contained in activated Plans and allocated to activated SubPlans.
                  +        NOTE	–	It is implementation dependent whether SubPlans are initially ACTIVATED and therefore do not require activation unless previously deactivated.
                  +        3.7.5.15 In response to a deactivateSubPlan operation, if supported, the service provider shall deactivate the referenced SubPlans and disable the execution of ActivityInstances that are contained in activated Plans and allocated to deactivated SubPlans, subject to the specified deactivationMode.
                  +        NOTE	–	Supported deactivationModes are specific to the implementation of the service provider.
                  +        3.7.5.16 In response to a suspendActivity operation, if supported, the service provider shall suspend the execution of referenced ActivityInstances, subject to the specified suspensionMode.
                  +        NOTE	–	Supported suspensionModes are specific to the implementation of the service provider.
                  +        3.7.5.17 In response to a resumeActivity operation, if supported, the service provider shall resume the execution of the referenced ActivityInstances where it is safe to do so.
                  +        
                  +            
                  +            Operation: submitPlan
                  +        
                  +        
                  +            Overview
                  +        
                  +        The submitPlan operation is used to send a plan to a plan execution function (the service provider), making it available for execution.
                  +        The service provider acknowledges the reception of the plan or returns an error. NOTE – The submitted plan may be a full plan or a patch plan.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                submitPlan
                  +            
                  +            
                  +                Interaction Pattern
                  +                SUBMIT
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                SUBMIT
                  +                No
                  +                 HYPERLINK  \l "DATATYPE_Plan" Plan plan
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        plan - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        INVALID: One or more fields in the message contain invalid values.
                  +        SUBMIT_FAILED: The submitPlan operation failed as the submitted plan was already terminated.
                  +        UNSUPPORTED: An optional data structure used in the message is not supported by the service provider.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                INVALID
                  +                1
                  +                List<Pair>
                  +                ExtraInfo comprises a list of structures, each identifying an invalid field, comprising: A MAL::String giving a dot-separated nested index for the invalid field(s).  This allows for fields that are themselves a structure or list element to be denoted.  For example, the form ‘3.2.4’ could mean the 4th element of the 2nd field of the composite structure that is the 3rd field of the message. A MAL::UShort giving a secondary error code that details the reason for invalidity.
                  +            
                  +            
                  +                SUBMIT_FAILED
                  +                9
                  +                String
                  +                ExtraInfo provides additional information on the reason for failure as a free format string.
                  +            
                  +            
                  +                UNSUPPORTED
                  +                10
                  +                List<String>
                  +                ExtraInfo comprises a list of MAL::Strings giving a dot-separated nested index for the unsupported field(s).  This allows for fields that are themselves a structure or list element to be denoted.  For example, the form ‘3.2.4’ could mean the 4th element of the 2nd field of the composite structure that is the 3rd field of the message.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: revokePlan
                  +        
                  +        
                  +            Overview
                  +        
                  +        The revokePlan operation is used to request a plan execution function to revoke a previously submitted Plan, making it unavailable for execution.
                  +        The service provider acknowledges the revocation of the Plan or returns an error.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                revokePlan
                  +            
                  +            
                  +                Interaction Pattern
                  +                SUBMIT
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                SUBMIT
                  +                No
                  +                ObjectRef< HYPERLINK  \l "DATATYPE_Plan" Plan> planRef
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        planRef - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        INVALID: One or more fields in the message contain invalid values.
                  +        REVOKE_FAILED: The revokePlan operation failed to revoke the referenced Plan, for example because it has already started executing.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                INVALID
                  +                1
                  +                List<Pair>
                  +                ExtraInfo comprises a list of structures, each identifying an invalid field, comprising: A MAL::String giving a dot-separated nested index for the invalid field(s).  This allows for fields that are themselves a structure or list element to be denoted.  For example, the form ‘3.2.4’ could mean the 4th element of the 2nd field of the composite structure that is the 3rd field of the message. A MAL::UShort giving a secondary error code that details the reason for invalidity.
                  +            
                  +            
                  +                REVOKE_FAILED
                  +                4
                  +                String
                  +                ExtraInfo provides additional information on the reason for failure as a free format string.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: getPlanStatus
                  +        
                  +        
                  +            Overview
                  +        
                  +        The getPlanStatus operation is used to obtain the current status of one or more known Plans that have been previously submitted to a plan execution function.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                getPlanStatus
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                No
                  +                List<ObjectRef< HYPERLINK  \l "DATATYPE_Plan" Plan>> planRefs
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                No
                  +                List< HYPERLINK  \l "DATATYPE_PlanUpdate" PlanUpdate> planStatus
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        planRefs - 
                  +        planStatus - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return the following error:
                  +        INVALID: One or more fields in the message contain invalid values.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                INVALID
                  +                1
                  +                List<Pair>
                  +                ExtraInfo comprises a list of structures, each identifying an invalid field, comprising: A MAL::String giving a dot-separated nested index for the invalid field(s).  This allows for fields that are themselves a structure or list element to be denoted.  For example, the form ‘3.2.4’ could mean the 4th element of the 2nd field of the composite structure that is the 3rd field of the message. A MAL::UShort giving a secondary error code that details the reason for invalidity.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: activatePlan
                  +        
                  +        
                  +            Overview
                  +        
                  +        The activatePlan operation is used to request the execution of specified Plans that have previously been submitted to a plan execution function.
                  +        The service provider enables the execution of the referenced Plans and the ActivityInstances contained within them, subject to the triggering constraints specified within the Plans.
                  +        It is not possible to activate a Plan outside its validity period, or after the start of the Plan period.
                  +        In this case, the operation will return an ACTIVATE_FAILED error. NOTES Multiple plans with a common precursor may have been submitted to a plan execution function.
                  +        Usually only one of these is considered the nominal plan, the other alternative or contingency plans having the isAlternate flag set.
                  +        It is implementation dependent whether the service provider will allow activation of Plans that have the isAlternate flag set, but this may be blocked for operational safety.
                  +        Where this is the case, the plan edit service can be used to change the state of the isAlternate flag prior to activation (see 3.9.5). In order to activate a patch Plan, the precursor Plan on which it is based must also be activated.
                  +        It is recommended that the activatePlan operation references the target Plan (the result of merging the patch Plan with its precursor), rather than the patch Plan itself (although this is allowed).
                  +        It is implementation dependent how it is achieved (merge patch with precursor prior to activation, or activate precursor and then merge patch), but if the precursor Plan is not already activated, then activating a target or patch Plan implies that the precursor is also activated.
                  +        If the precursor plan has not previously been submitted to the service provider (or has been revoked), then it is not possible to activate the target or patch Plan.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                activatePlan
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                No
                  +                List<ObjectRef< HYPERLINK  \l "DATATYPE_Plan" Plan>> planRefs
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                No
                  +                List< HYPERLINK  \l "DATATYPE_PlanActivationStatus" PlanActivationStatus> activationStatus
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        planRefs - 
                  +        activationStatus - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        INVALID: One or more fields in the message contain invalid values.
                  +        ACTIVATE_FAILED: The activatePlan operation failed as the activation was outside the validity period of the Plan, or the start of the planPeriod had already passed.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                INVALID
                  +                1
                  +                List<Pair>
                  +                ExtraInfo comprises a list of structures, each identifying an invalid field, comprising: A MAL::String giving a dot-separated nested index for the invalid field(s).  This allows for fields that are themselves a structure or list element to be denoted.  For example, the form ‘3.2.4’ could mean the 4th element of the 2nd field of the composite structure that is the 3rd field of the message. A MAL::UShort giving a secondary error code that details the reason for invalidity.
                  +            
                  +            
                  +                ACTIVATE_FAILED
                  +                7
                  +                String
                  +                ExtraInfo indicates ‘Validity’ or ‘Expired’ as appropriate.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: deactivatePlan
                  +        
                  +        
                  +            Overview
                  +        
                  +        The deactivatePlan operation is used to request deactivation of specified Plans that have previously been activated.
                  +        The service provider disables the execution of the referenced Plans and the ActivityInstances contained within them, where it is possible to do so. The deactivationMode argument allows selection of the deactivation behavior.
                  +        For example: Orderly (ceases execution of any new activities, but allows those already initiated to complete); Rapid (ceases execution of the Plan, but allows activities already initiated to continue until their next defined breakpoint); Immediate (ceases execution of the Plan and all activities currently in progress). It should be noted that it is dependent on the service provider implementation which deactivationModes are supported, and that the above list is not exhaustive. The service provider returns a list of PlanActivationStatus data structures comprising Plan status and activationInfo as a String for each Plan in the deactivation list.
                  +        The activationInfo allows the return of deployment specific details on the deactivation, such as the deactivation mode applied or reasons for a failure to deactivate. If a Plan is deactivated prior to any of its constituent ActivityInstances being executed (or before the specified planPeriodStart), then all new ActivityInstances and EventInstances contained in the Plan are unloaded or removed, and the status of the Plan reverts to SUBMITTED. If a Plan is deactivated after any of its constituent ActivityInstances have been executed (or after the specified planPeriodStart), then the status of the Plan and the status of all contained ActivityInstances and EventInstances that will not be executed are set to TERMINATED with the additional statusInfo ‘CANCELLED’.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                deactivatePlan
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                NoNo
                  +                List<ObjectRef< HYPERLINK  \l "DATATYPE_Plan" Plan>> planRefsIdentifier deactivationMode
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                No
                  +                List< HYPERLINK  \l "DATATYPE_PlanActivationStatus" PlanActivationStatus> activationStatus
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        planRefs - 
                  +        deactivationMode - 
                  +        activationStatus - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        INVALID: One or more fields in the message contain invalid values.
                  +        DEACTIVATE_FAILED: The deactivatePlan operation failed.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                INVALID
                  +                1
                  +                List<Pair>
                  +                ExtraInfo comprises a list of structures, each identifying an invalid field, comprising: A MAL::String giving a dot-separated nested index for the invalid field(s).  This allows for fields that are themselves a structure or list element to be denoted.  For example, the form ‘3.2.4’ could mean the 4th element of the 2nd field of the composite structure that is the 3rd field of the message. A MAL::UShort giving a secondary error code that details the reason for invalidity.
                  +            
                  +            
                  +                DEACTIVATE_FAILED
                  +                8
                  +                String
                  +                ExtraInfo provides additional information on the reason for failure as a free format string.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: monitorPlanExecution
                  +        
                  +        
                  +            Overview
                  +        
                  +        The monitorPlanExecution operation is used to subscribe to status updates for a filtered set of Plans that have been submitted to a plan execution function.
                  +        The operation uses the Publish-Subscribe interaction pattern, with the body of the notification message comprising a PlanUpdate for a subscribed Plan. The operation is equivalent to the monitorPlanStatus operation of the Plan Distribution Service, but only reports the status of plans currently being managed by a plan execution function.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                monitorPlanExecution
                  +            
                  +            
                  +                Interaction Pattern
                  +                PUBLISH-SUBSCRIBE
                  +            
                  +            
                  +                Subscription Keys
                  +                Identifier planIDIdentifier precursorUShort statusIdentifier originator
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                OUT
                  +                PUBLISH
                  +                No
                  +                 HYPERLINK  \l "DATATYPE_PlanUpdate" PlanUpdate planUpdate
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        planID - 
                  +        precursor - 
                  +        status - 
                  +        originator - 
                  +        planUpdate - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation does not return any errors.
                  +        
                  +            
                  +            Operation: monitorPlanExecutionDetail
                  +        
                  +        
                  +            Overview
                  +        
                  +        The monitorPlanExecutionDetail operation is used to subscribe to updates that report changes in the detailed execution status for a filtered set of Plan contents at the level of planning activities, events and resources.
                  +        A planning function requires feedback at the level of planning activities and events to be able to reconstitute the status of planning requests, as well to support re-planning.
                  +        The operation uses the Publish-Subscribe interaction pattern. It is implementation dependent which details are reported on, but this may be any combination of planning activities, events, and resources.
                  +        The notification message body comprises a single structure of the abstract class PlanDetailUpdate, which corresponds to one of the concrete classes ActivityUpdate, EventUpdate, or ResourceUpdate.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                monitorPlanExecutionDetail
                  +            
                  +            
                  +                Interaction Pattern
                  +                PUBLISH-SUBSCRIBE
                  +            
                  +            
                  +                Subscription Keys
                  +                Identifier planIDIdentifier subPlanString tagIdentifier type
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                OUT
                  +                PUBLISH
                  +                No
                  +                 HYPERLINK  \l "DATATYPE_PlanDetailUpdate" PlanDetailUpdate detailUpdate
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        planID - 
                  +        subPlan - 
                  +        tag - 
                  +        type - 
                  +        detailUpdate - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation does not return any errors.
                  +        
                  +            
                  +            Operation: activateSubPlan
                  +        
                  +        
                  +            Overview
                  +        
                  +        The activateSubPlan operation is used to request that the service provider activates the referenced SubPlans and enables the execution of ActivityInstances that are contained in activated Plans and allocated to activated SubPlans. NOTES It is implementation dependent whether SubPlans are initially ACTIVATED and therefore do not require activation unless previously deactivated. Where the operation is directly supported by the service provider there is little reason for the activation to fail, but if the operation is delegated, for example to an on-board planning function, there is the potential for the operation to fail.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                activateSubPlan
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                No
                  +                List<Identifier> subPlanIDs
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                No
                  +                List< HYPERLINK  \l "DATATYPE_SubPlanActivationStatus" SubPlanActivationStatus> activationStatus
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        subPlanIDs - 
                  +        activationStatus - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        INVALID: One or more fields in the message contain invalid values.
                  +        ACTIVATE_SUBPLAN_FAILED: The activateSubPlan operation failed.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                INVALID
                  +                1
                  +                List<Pair>
                  +                ExtraInfo comprises a list of structures, each identifying an invalid field, comprising: A MAL::String giving a dot-separated nested index for the invalid field(s).  This allows for fields that are themselves a structure or list element to be denoted.  For example, the form ‘3.2.4’ could mean the 4th element of the 2nd field of the composite structure that is the 3rd field of the message. A MAL::UShort giving a secondary error code that details the reason for invalidity.
                  +            
                  +            
                  +                ACTIVATE_SUBPLAN_FAILED
                  +                11
                  +                String
                  +                ExtraInfo provides additional information on the reason for failure as a free format string.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: deactivateSubPlan
                  +        
                  +        
                  +            Overview
                  +        
                  +        The deactivateSubPlan operation is used to request that the service provider deactivates the referenced SubPlans and disables the execution of ActivityInstances that are contained in activated Plans and allocated to the deactivated SubPlans, where it is possible to do so. The deactivationMode argument allows selection of the deactivation behavior.
                  +        For example: Orderly (ceases execution of any new activities, but allows those already initiated to complete); Rapid (ceases execution of the Sub-plan, but allows activities already initiated to continue until their next defined breakpoint); Immediate (ceases execution of the Sub-plan and all activities currently in progress). It should be noted that it is dependent on the service provider implementation which deactivationModes are supported, and that the above list is not exhaustive. The service provider returns a list of SubPlanActivationStatus data structures comprising sub-plan status and activationInfo as a String for each sub-plan in the deactivation list.
                  +        The activationInfo allows the return of deployment specific details on the deactivation, such as the deactivation mode applied or reasons for a failure to deactivate. NOTE – Where the operation is directly supported by the service provider there is little reason for the deactivation to fail, but if the operation is delegated, for example to an on-board planning function, there is the potential for the operation to fail.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                deactivateSubPlan
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                NoNo
                  +                List<Identifier> subPlanIDsString deactivationMode
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                No
                  +                List< HYPERLINK  \l "DATATYPE_SubPlanActivationStatus" SubPlanActivationStatus> activationStatus
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        subPlanIDs - 
                  +        deactivationMode - 
                  +        activationStatus - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        INVALID: One or more fields in the message contain invalid values.
                  +        DEACTIVATE_SUBPLAN_FAILED: The deactivateSubPlan operation failed.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                INVALID
                  +                1
                  +                List<Pair>
                  +                ExtraInfo comprises a list of structures, each identifying an invalid field, comprising: A MAL::String giving a dot-separated nested index for the invalid field(s).  This allows for fields that are themselves a structure or list element to be denoted.  For example, the form ‘3.2.4’ could mean the 4th element of the 2nd field of the composite structure that is the 3rd field of the message. A MAL::UShort giving a secondary error code that details the reason for invalidity.
                  +            
                  +            
                  +                DEACTIVATE_SUBPLAN_FAILED
                  +                12
                  +                String
                  +                ExtraInfo provides additional information on the reason for failure as a free format string.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: getSubPlanStatus
                  +        
                  +        
                  +            Overview
                  +        
                  +        The getSubPlanStatus operation is used to obtain the current status of one or more SubPlans.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                getSubPlanStatus
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                No
                  +                List<Identifier> subPlanIDs
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                No
                  +                List< HYPERLINK  \l "DATATYPE_SubPlanUpdate" SubPlanUpdate> subPlanStatus
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        subPlanIDs - 
                  +        subPlanStatus - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return the following error:
                  +        INVALID: One or more fields in the message contain invalid values.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                INVALID
                  +                1
                  +                List<Pair>
                  +                ExtraInfo comprises a list of structures, each identifying an invalid field, comprising: A MAL::String giving a dot-separated nested index for the invalid field(s).  This allows for fields that are themselves a structure or list element to be denoted.  For example, the form ‘3.2.4’ could mean the 4th element of the 2nd field of the composite structure that is the 3rd field of the message. A MAL::UShort giving a secondary error code that details the reason for invalidity.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: monitorSubPlanExecution
                  +        
                  +        
                  +            Overview
                  +        
                  +        The monitorSubPlanExecution operation is used to subscribe to status updates for a filtered set of SubPlans.
                  +        The operation uses the Publish-Subscribe interaction pattern, with the body of the notification message comprising a SubPlanUpdate for a subscribed sub-plan.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                monitorSubPlanExecution
                  +            
                  +            
                  +                Interaction Pattern
                  +                PUBLISH-SUBSCRIBE
                  +            
                  +            
                  +                Subscription Keys
                  +                Identifier subPlan
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                OUT
                  +                PUBLISH
                  +                No
                  +                 HYPERLINK  \l "DATATYPE_SubPlanUpdate" SubPlanUpdate subPlanUpdate
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        subPlan - 
                  +        subPlanUpdate - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation does not return any errors.
                  +        
                  +            
                  +            Operation: suspendActivity
                  +        
                  +        
                  +            Overview
                  +        
                  +        The suspendActivity operation is used to request suspension of the execution of selected activities in one or more plans, without changing the state of the plan(s). The suspensionMode argument allows selection of the suspension behavior.
                  +        For example: Orderly (suspends execution of any new activities, but allows those already initiated to complete); Rapid (suspends execution of any new activities, but allows any activities and their sub-activities already initiated to continue until their next defined breakpoint); Immediate (suspends execution of all activities, including those currently in progress). It should be noted that it is dependent on the service provider implementation which deactivationModes are supported, and that the above list is not exhaustive. The service provider responds with a list of ActivitySuspensionStatus data structures comprising activity status and suspensionInfo (as a String) for each activity subject to the suspension request. The suspensionInfo allows the return of deployment specific details on the suspension, such as the suspension mode applied or reasons for a failure to suspend.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                suspendActivity
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                YesYesYesNo
                  +                List<ObjectRef< HYPERLINK  \l "DATATYPE_Plan" Plan>> planRefsList<ObjectRef< HYPERLINK  \l "DATATYPE_ActivityInstance" ActivityInstance>> activityRefsList<String> tagsString suspensionMode
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                No
                  +                List< HYPERLINK  \l "DATATYPE_ActivitySuspensionStatus" ActivitySuspensionStatus> suspensionStatus
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        planRefs - 
                  +        activityRefs - 
                  +        tags - 
                  +        suspensionMode - 
                  +        suspensionStatus - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return the following error:
                  +        INVALID: One or more fields in the message contain invalid values.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                INVALID
                  +                1
                  +                List<Pair>
                  +                ExtraInfo comprises a list of structures, each identifying an invalid field, comprising: A MAL::String giving a dot-separated nested index for the invalid field(s).  This allows for fields that are themselves a structure or list element to be denoted.  For example, the form ‘3.2.4’ could mean the 4th element of the 2nd field of the composite structure that is the 3rd field of the message. A MAL::UShort giving a secondary error code that details the reason for invalidity.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: resumeActivity
                  +        
                  +        
                  +            Overview
                  +        
                  +        The resumeActivity operation is used to request resumption of the execution of selected activities in one or more plans, without changing the state of the plan(s). The service provider responds with a list of ActivitySuspensionStatus data structures comprising activity status and suspensionInfo (as a String) for each activity subject to the resumption request. The suspensionInfo allows the return of deployment specific details on the resumption, such as the reasons for a failure to resume.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                resumeActivity
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                YesYesYes
                  +                List<ObjectRef< HYPERLINK  \l "DATATYPE_Plan" Plan>> planRefsList<ObjectRef< HYPERLINK  \l "DATATYPE_ActivityInstance" ActivityInstance>> activityRefsList<String> tags
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                No
                  +                List< HYPERLINK  \l "DATATYPE_ActivitySuspensionStatus" ActivitySuspensionStatus> suspensionStatus
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        planRefs - 
                  +        activityRefs - 
                  +        tags - 
                  +        suspensionStatus - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return the following error:
                  +        INVALID: One or more fields in the message contain invalid values.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                INVALID
                  +                1
                  +                List<Pair>
                  +                ExtraInfo comprises a list of structures, each identifying an invalid field, comprising: A MAL::String giving a dot-separated nested index for the invalid field(s).  This allows for fields that are themselves a structure or list element to be denoted.  For example, the form ‘3.2.4’ could mean the 4th element of the 2nd field of the composite structure that is the 3rd field of the message. A MAL::UShort giving a secondary error code that details the reason for invalidity.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: getActivityStatus
                  +        
                  +        
                  +            Overview
                  +        
                  +        The getActivityStatus operation is used to request a detailed report from the service provider on the current status of ActivityInstances, selected at activity, sub-plan, or tag levels.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                getActivityStatus
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                YesYesYesYes
                  +                List<ObjectRef< HYPERLINK  \l "DATATYPE_Plan" Plan>> planRefsList<ObjectRef< HYPERLINK  \l "DATATYPE_ActivityInstance" ActivityInstance>> activityRefsList<Identifier> subPlansList<String> tags
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                No
                  +                List< HYPERLINK  \l "DATATYPE_ActivityUpdate" ActivityUpdate> activityStatus
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        planRefs - 
                  +        activityRefs - 
                  +        subPlans - 
                  +        tags - 
                  +        activityStatus - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return the following error:
                  +        INVALID: One or more fields in the message contain invalid values.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                INVALID
                  +                1
                  +                List<Pair>
                  +                ExtraInfo comprises a list of structures, each identifying an invalid field, comprising: A MAL::String giving a dot-separated nested index for the invalid field(s).  This allows for fields that are themselves a structure or list element to be denoted.  For example, the form ‘3.2.4’ could mean the 4th element of the 2nd field of the composite structure that is the 3rd field of the message. A MAL::UShort giving a secondary error code that details the reason for invalidity.
                  +            
                  +        
                  +        
                  +            
                  +            Service: PlanInformationManagement
                  +        
                  +        
                  +            Overview
                  +        
                  +        The Plan Information Management Service, introduced in 2.5.5, is provided by a planning function and enables its consumers to list and retrieve available MPS configuration data.
                  +        This includes definitions for planning requests, planning activities, planning events and planning resources, and also MPS system configuration data.
                  +        The service may also be provided by a plan execution function (excluding planning request definitions).
                  +        It comprises the operations defined below, none of which are mandatory.
                  +        
                  +            Table 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Table \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Table_TOC \s 1 1
                  +            PlanInformationManagement Service Operations
                  +            "
                  +            :  PlanInformationManagement Service Operations
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Area Identifier
                  +                Service Identifier
                  +                Area Number
                  +                Service Number
                  +                Area Version
                  +            
                  +            
                  +                MPS
                  +                PlanInformationManagement
                  +                5
                  +                4
                  +                1
                  +            
                  +            
                  +                Interaction Pattern
                  +                Operation Identifier
                  +                Operation Number
                  +                Capability Set
                  +            
                  +            
                  +                PROGRESS
                  +                 HYPERLINK  \l "OPERATION_4_listRequestDefs" listRequestDefs
                  +                1
                  +                1
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_4_getRequestDefs" getRequestDefs
                  +                2
                  +                
                  +            
                  +            
                  +                PROGRESS
                  +                 HYPERLINK  \l "OPERATION_4_listEventDefs" listEventDefs
                  +                3
                  +                2
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_4_getEventDefs" getEventDefs
                  +                4
                  +                
                  +            
                  +            
                  +                PROGRESS
                  +                 HYPERLINK  \l "OPERATION_4_listActivityDefs" listActivityDefs
                  +                5
                  +                3
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_4_getActivityDefs" getActivityDefs
                  +                6
                  +                
                  +            
                  +            
                  +                PROGRESS
                  +                 HYPERLINK  \l "OPERATION_4_listResourceDefs" listResourceDefs
                  +                7
                  +                4
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_4_getResourceDefs" getResourceDefs
                  +                8
                  +                
                  +            
                  +        
                  +        
                  +            Service-level Requirements
                  +        
                  +        3.8.4.1 The following set of mission planning configuration data shall be available to the provider in any deployment of the plan information management service:
                  +        a) Planning Request Definitions (as RequestDefinition objects [4.5.5.1.1]);
                  +        b) Planning Activity Definitions (as ActivityDefinition objects [4.5.2.1.1]);
                  +        c) Planning Event Definitions (as EventDefinition objects [4.5.3.1.1]);
                  +        d) Planning Resource Definitions (as Resource objects [4.5.4.2.1]) [Optional];
                  +        3.8.5.1 If version 0 is specified for the definition to be retrieved in a list[Item]Defs operation then the service provider shall list all available versions of the definition.
                  +        3.8.5.2 If version 0 is specified for the definition to be retrieved in a get[Item]Defs operation then the service provider shall return the latest available version of the definition.
                  +        
                  +            
                  +            Operation: listRequestDefs
                  +        
                  +        
                  +            Overview
                  +        
                  +        The listRequestDefs operation is used to obtain a list of available RequestDefinitions together with their descriptions.
                  +        The list can be filtered by domain or restricted to specified definition IDs.
                  +        All available versions are listed. The domain field is an ordered list of identifiers representing a domain hierarchy, any node of which can use ‘*’ as a wildcard (meaning any domain identifier at that level of the hierarchy).
                  +        If a set of domains is required that cannot be represented through the use of wildcards, then the operation will need to be repeated using different domain filters.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                listRequestDefs
                  +            
                  +            
                  +                Interaction Pattern
                  +                PROGRESS
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                PROGRESS
                  +                YesYes
                  +                List<Identifier> domainList<ObjectRef< HYPERLINK  \l "DATATYPE_RequestDefinition" RequestDefinition>> requestDefs
                  +            
                  +            
                  +                OUT
                  +                ACK
                  +                -
                  +                -
                  +            
                  +            
                  +                OUT
                  +                UPDATE
                  +                No
                  +                List< HYPERLINK  \l "DATATYPE_DefListEntry" DefListEntry> requestDefs
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                -
                  +                -
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        domain - 
                  +        requestDefs - 
                  +        requestDefs - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return the following error:
                  +        INVALID: One or more fields in the message contain invalid values.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                INVALID
                  +                1
                  +                List<Pair>
                  +                ExtraInfo comprises a list of structures, each identifying an invalid field, comprising: A MAL::String giving a dot-separated nested index for the invalid field(s).  This allows for fields that are themselves a structure or list element to be denoted.  For example, the form ‘3.2.4’ could mean the 4th element of the 2nd field of the composite structure that is the 3rd field of the message. A MAL::UShort giving a secondary error code that details the reason for invalidity.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: getRequestDefs
                  +        
                  +        
                  +            Overview
                  +        
                  +        The getRequestDefs operation is used to retrieve one or more available RequestDefinitions, whose identity is known to the consumer.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                getRequestDefs
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                No
                  +                List<ObjectRef< HYPERLINK  \l "DATATYPE_RequestDefinition" RequestDefinition>> requestDefs
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                No
                  +                List< HYPERLINK  \l "DATATYPE_RequestDefinition" RequestDefinition> definitions
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        requestDefs - 
                  +        definitions - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return the following error:
                  +        INVALID: One or more fields in the message contain invalid values.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                INVALID
                  +                1
                  +                List<Pair>
                  +                ExtraInfo comprises a list of structures, each identifying an invalid field, comprising: A MAL::String giving a dot-separated nested index for the invalid field(s).  This allows for fields that are themselves a structure or list element to be denoted.  For example, the form ‘3.2.4’ could mean the 4th element of the 2nd field of the composite structure that is the 3rd field of the message. A MAL::UShort giving a secondary error code that details the reason for invalidity.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: listEventDefs
                  +        
                  +        
                  +            Overview
                  +        
                  +        The listEventDefs operation is used to obtain a list of available EventDefinitions together with their descriptions.
                  +        The list can be filtered by domain or restricted to specified definition IDs.
                  +        All available versions are listed. The domain field is an ordered list of identifiers representing a domain hierarchy, any node of which can use ‘*’ as a wildcard (meaning any domain identifier at that level of the hierarchy).
                  +        If a set of domains is required that cannot be represented through the use of wildcards, then the operation will need to be repeated using different domain filters.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                listEventDefs
                  +            
                  +            
                  +                Interaction Pattern
                  +                PROGRESS
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                PROGRESS
                  +                YesYes
                  +                List<Identifier> domainList<ObjectRef< HYPERLINK  \l "DATATYPE_EventDefinition" EventDefinition>> eventDefs
                  +            
                  +            
                  +                OUT
                  +                ACK
                  +                -
                  +                -
                  +            
                  +            
                  +                OUT
                  +                UPDATE
                  +                No
                  +                List< HYPERLINK  \l "DATATYPE_DefListEntry" DefListEntry> eventDefs
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                -
                  +                -
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        domain - 
                  +        eventDefs - 
                  +        eventDefs - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return the following error:
                  +        INVALID: One or more fields in the message contain invalid values.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                INVALID
                  +                1
                  +                List<Pair>
                  +                ExtraInfo comprises a list of structures, each identifying an invalid field, comprising: A MAL::String giving a dot-separated nested index for the invalid field(s).  This allows for fields that are themselves a structure or list element to be denoted.  For example, the form ‘3.2.4’ could mean the 4th element of the 2nd field of the composite structure that is the 3rd field of the message. A MAL::UShort giving a secondary error code that details the reason for invalidity.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: getEventDefs
                  +        
                  +        
                  +            Overview
                  +        
                  +        The getEventDefs operation is used to retrieve one or more available EventDefinitions, whose identity is known to the consumer.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                getEventDefs
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                No
                  +                List<ObjectRef< HYPERLINK  \l "DATATYPE_EventDefinition" EventDefinition>> eventDefs
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                No
                  +                List< HYPERLINK  \l "DATATYPE_EventDefinition" EventDefinition> definitions
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        eventDefs - 
                  +        definitions - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return the following error:
                  +        INVALID: One or more fields in the message contain invalid values.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                INVALID
                  +                1
                  +                List<Pair>
                  +                ExtraInfo comprises a list of structures, each identifying an invalid field, comprising: A MAL::String giving a dot-separated nested index for the invalid field(s).  This allows for fields that are themselves a structure or list element to be denoted.  For example, the form ‘3.2.4’ could mean the 4th element of the 2nd field of the composite structure that is the 3rd field of the message. A MAL::UShort giving a secondary error code that details the reason for invalidity.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: listActivityDefs
                  +        
                  +        
                  +            Overview
                  +        
                  +        The listActivityDefs operation is used to obtain a list of available ActivityDefinitions together with their descriptions.
                  +        The list can be filtered by domain or restricted to specified definition IDs.
                  +        All available versions are listed. The domain field is an ordered list of identifiers representing a domain hierarchy, any node of which can use ‘*’ as a wildcard (meaning any domain identifier at that level of the hierarchy).
                  +        If a set of domains is required that cannot be represented through the use of wildcards, then the operation will need to be repeated using different domain filters.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                listActivityDefs
                  +            
                  +            
                  +                Interaction Pattern
                  +                PROGRESS
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                PROGRESS
                  +                YesYesYes
                  +                List<Identifier> domainList<ObjectRef< HYPERLINK  \l "DATATYPE_ActivityDefinition" ActivityDefinition>> activityDefsList<String> defaultTags
                  +            
                  +            
                  +                OUT
                  +                ACK
                  +                -
                  +                -
                  +            
                  +            
                  +                OUT
                  +                UPDATE
                  +                No
                  +                List< HYPERLINK  \l "DATATYPE_DefListEntry" DefListEntry> activitytDefs
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                -
                  +                -
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        domain - 
                  +        activityDefs - 
                  +        defaultTags - 
                  +        activitytDefs - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return the following error:
                  +        INVALID: One or more fields in the message contain invalid values.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                INVALID
                  +                1
                  +                List<Pair>
                  +                ExtraInfo comprises a list of structures, each identifying an invalid field, comprising: A MAL::String giving a dot-separated nested index for the invalid field(s).  This allows for fields that are themselves a structure or list element to be denoted.  For example, the form ‘3.2.4’ could mean the 4th element of the 2nd field of the composite structure that is the 3rd field of the message. A MAL::UShort giving a secondary error code that details the reason for invalidity.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: getActivityDefs
                  +        
                  +        
                  +            Overview
                  +        
                  +        The getActivityDefs operation is used to retrieve one or more available ActivityDefinitions, whose identity is known to the consumer.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                getActivityDefs
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                No
                  +                List<ObjectRef< HYPERLINK  \l "DATATYPE_ActivityDefinition" ActivityDefinition>> activityDefs
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                No
                  +                List< HYPERLINK  \l "DATATYPE_ActivityDefinition" ActivityDefinition> definitions
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        activityDefs - 
                  +        definitions - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return the following error:
                  +        INVALID: One or more fields in the message contain invalid values.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                INVALID
                  +                1
                  +                List<Pair>
                  +                ExtraInfo comprises a list of structures, each identifying an invalid field, comprising: A MAL::String giving a dot-separated nested index for the invalid field(s).  This allows for fields that are themselves a structure or list element to be denoted.  For example, the form ‘3.2.4’ could mean the 4th element of the 2nd field of the composite structure that is the 3rd field of the message. A MAL::UShort giving a secondary error code that details the reason for invalidity.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: listResourceDefs
                  +        
                  +        
                  +            Overview
                  +        
                  +        The listResourceDefs operation is used to obtain a list of available Resources together with their descriptions.
                  +        The list can be filtered by domain or restricted to data types.
                  +        All available versions are listed. The domain field is an ordered list of identifiers representing a domain hierarchy, any node of which can use ‘*’ as a wildcard (meaning any domain identifier at that level of the hierarchy).
                  +        If a set of domains is required that cannot be represented through the use of wildcards, then the operation will need to be repeated using different domain filters.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                listResourceDefs
                  +            
                  +            
                  +                Interaction Pattern
                  +                PROGRESS
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                PROGRESS
                  +                YesYes
                  +                List<Identifier> domainList<AttributeType> dataType
                  +            
                  +            
                  +                OUT
                  +                ACK
                  +                -
                  +                -
                  +            
                  +            
                  +                OUT
                  +                UPDATE
                  +                No
                  +                List< HYPERLINK  \l "DATATYPE_DefListEntry" DefListEntry> resourceDefs
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                -
                  +                -
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        domain - 
                  +        dataType - 
                  +        resourceDefs - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return the following error:
                  +        INVALID: One or more fields in the message contain invalid values.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                INVALID
                  +                1
                  +                List<Pair>
                  +                ExtraInfo comprises a list of structures, each identifying an invalid field, comprising: A MAL::String giving a dot-separated nested index for the invalid field(s).  This allows for fields that are themselves a structure or list element to be denoted.  For example, the form ‘3.2.4’ could mean the 4th element of the 2nd field of the composite structure that is the 3rd field of the message. A MAL::UShort giving a secondary error code that details the reason for invalidity.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: getResourceDefs
                  +        
                  +        
                  +            Overview
                  +        
                  +        The getResourceDefs operation is used to retrieve the definition of one or more available Resources, whose identity is known to the consumer. It should be noted that this operation is designed to retrieve the resource definition and not the current value of the resource (the value field may contain a default value for the resource).
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                getResourceDefs
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                No
                  +                List<ObjectRef< HYPERLINK  \l "DATATYPE_Resource" Resource>> resources
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                No
                  +                List< HYPERLINK  \l "DATATYPE_Resource" Resource> definitions
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        resources - 
                  +        definitions - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return the following error:
                  +        INVALID: One or more fields in the message contain invalid values.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                INVALID
                  +                1
                  +                List<Pair>
                  +                ExtraInfo comprises a list of structures, each identifying an invalid field, comprising: A MAL::String giving a dot-separated nested index for the invalid field(s).  This allows for fields that are themselves a structure or list element to be denoted.  For example, the form ‘3.2.4’ could mean the 4th element of the 2nd field of the composite structure that is the 3rd field of the message. A MAL::UShort giving a secondary error code that details the reason for invalidity.
                  +            
                  +        
                  +        
                  +            
                  +            Service: PlanEdit
                  +        
                  +        
                  +            Overview
                  +        
                  +        The Plan Edit Service, introduced in 2.5.6, is provided by a plan execution function and enables its consumers to modify Plans that have already been submitted for execution.
                  +        It allows an external user or function to update the status of the Plan; insert, modify, or delete its constituent ActivityInstances and EventInstances; update the value of Resources; and apply a time shift to a Plan.
                  +        It comprises the operations defined below, of which only those in capability set 1 are mandatory. In some deployments, the Plan Edit Service could also be provided by a planning function to enable users to make adjustments to their planned activities prior to submission of the plan for execution.
                  +        
                  +            Table 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Table \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Table_TOC \s 1 1
                  +            PlanEdit Service Operations
                  +            "
                  +            :  PlanEdit Service Operations
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Area Identifier
                  +                Service Identifier
                  +                Area Number
                  +                Service Number
                  +                Area Version
                  +            
                  +            
                  +                MPS
                  +                PlanEdit
                  +                5
                  +                5
                  +                1
                  +            
                  +            
                  +                Interaction Pattern
                  +                Operation Identifier
                  +                Operation Number
                  +                Capability Set
                  +            
                  +            
                  +                SUBMIT
                  +                 HYPERLINK  \l "OPERATION_5_updatePlanStatus" updatePlanStatus
                  +                1
                  +                1
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_5_insertActivity" insertActivity
                  +                2
                  +                2
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_5_insertEvent" insertEvent
                  +                3
                  +                
                  +            
                  +            
                  +                SUBMIT
                  +                 HYPERLINK  \l "OPERATION_5_deleteActivity" deleteActivity
                  +                4
                  +                
                  +            
                  +            
                  +                SUBMIT
                  +                 HYPERLINK  \l "OPERATION_5_deleteEvent" deleteEvent
                  +                5
                  +                
                  +            
                  +            
                  +                SUBMIT
                  +                 HYPERLINK  \l "OPERATION_5_updateActivity" updateActivity
                  +                6
                  +                3
                  +            
                  +            
                  +                SUBMIT
                  +                 HYPERLINK  \l "OPERATION_5_updateEvent" updateEvent
                  +                7
                  +                
                  +            
                  +            
                  +                SUBMIT
                  +                 HYPERLINK  \l "OPERATION_5_updateResourceValue" updateResourceValue
                  +                8
                  +                4
                  +            
                  +            
                  +                SUBMIT
                  +                 HYPERLINK  \l "OPERATION_5_updateResourceProfile" updateResourceProfile
                  +                9
                  +                5
                  +            
                  +            
                  +                SUBMIT
                  +                 HYPERLINK  \l "OPERATION_5_applyTimeShift" applyTimeShift
                  +                10
                  +                6
                  +            
                  +        
                  +        
                  +            Service-level Requirements
                  +        
                  +        3.9.4.1 The following set of mission planning configuration data shall be available to both provider and consumers in any deployment of the plan edit service:
                  +        a) Planning Activity Definitions (as ActivityDefinition objects [4.5.2.1.1]);
                  +        b) Planning Event Definitions (as EventDefinition objects [4.5.3.1.1]);
                  +        c) Planning Resource Definitions (as Resource objects [4.5.4.2.1]) [Optional];
                  +        d) Functional Requirements.
                  +        3.9.4.2 In response to an updatePlanStatus operation, the service provider shall update the isAlternate flag of the Plan accordingly and apply any change to Plan status consistently with the plan state model (see 4.5.6.2).
                  +        NOTE	–	It is implementation dependent what the service provider does in the event of a Plan status change when the Plan has executing ActivityInstances.
                  +        It is recommended that the plan execution control service is used to manage Plan deactivation in an orderly manner.
                  +        3.9.4.3 In response to an insertActivity operation, the service provider shall create a new ActivityInstance in the referenced Plan and return its identity to the consumer.
                  +        3.9.4.4 In response to an insertEvent operation, the service provider shall create a new EventInstance in the referenced Plan and return its identity to the consumer.
                  +        3.9.4.5 In response to a deleteActivity operation, the service provider shall transition the referenced ActivityInstance to the TERMINATED state.
                  +        NOTE	–	If the ActivityInstance is in the EXECUTING state, then it is implementation dependent what action is taken by the service provider.
                  +        3.9.4.6 In response to a deleteEvent operation, the service provider shall transition the referenced EventInstance to the TERMINATED state.
                  +        NOTE	–	This may also affect any ActivityInstances whose start or end trigger is linked to the deleted EventInstance as a terminated event will not result in the activity being triggered.
                  +        3.9.4.7 In response to an updateActivity operation, the service provider shall apply the changes contained in the ActivityUpdate to the referenced ActivityInstance.
                  +        3.9.4.8 In response to an updateEvent operation, the service provider shall apply the changes contained in the EventUpdate to the referenced EventInstance.
                  +        3.9.4.9 In response to an updateResourceValue operation, the service provider shall apply the changes contained in the ResourceUpdate to the referenced Resource.
                  +        3.9.4.10 In response to an updateResourceProfile operation, the service provider shall apply the supplied ResourceProfile to the referenced Resource.
                  +        3.9.4.11 In response to an applyTimeShift operation, the service provider shall apply the specified time shift to the unexpired (future) content, or the specified time period of the referenced Plan or its SubPlan(s), including temporal start and end triggers on ActivityInstances.
                  +        NOTE	–	It is implementation dependent whether any other elements of the Plan are time shifted, particularly with regard to the eventTime of EventInstances and, where supported, the start and end times on resource ProfileSegments and the times on Profile Entries.
                  +        
                  +            
                  +            Operation: updatePlanStatus
                  +        
                  +        
                  +            Overview
                  +        
                  +        The updatePlanStatus operation may be used to modify the status of a previously submitted Plan.
                  +        Directly modifying the status field of a Plan may be used by a third party function to autonomously terminate (or activate) a Plan, but the operation also allows the isAlternate flag to be set or cleared. It is implementation dependent what action the service provider takes in response to a change of Plan status.
                  +        The service provider may not permit certain state changes (for example to modify the status of a TERMINATED plan, which is inconsistent with the plan status model), in which case an UPDATE_FAILED error shall be returned. A set of Plans with a common precursor may be submitted to a plan execution function to cater for alternative or contingency scenarios.
                  +        All but one of these Plans should have the isAlternate flag set, to inform the plan execution function (and the mission operations team) which is the nominal Plan.
                  +        It is implementation dependent whether a plan execution control service provider will allow a Plan to be activated with the isAlternate flag set, but for operational safety reasons this may be blocked.
                  +        In a contingency scenario, the updatePlanStatus operation can be used to set the flag on the nominal Plan, and reset the flag on the required contingency Plan, making it operational.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                updatePlanStatus
                  +            
                  +            
                  +                Interaction Pattern
                  +                SUBMIT
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                SUBMIT
                  +                NoNoNo
                  +                ObjectRef< HYPERLINK  \l "DATATYPE_Plan" Plan> planRef HYPERLINK  \l "DATATYPE_PlanStatusEnum" PlanStatusEnum statusBoolean isAlternate
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        planRef - 
                  +        status - 
                  +        isAlternate - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        INVALID: One or more fields in the message contain invalid values.
                  +        UPDATE_FAILED: The update operation (to Request, PlanStatus, Activity, Event or Resource) failed to update the referenced object.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                INVALID
                  +                1
                  +                List<Pair>
                  +                ExtraInfo comprises a list of structures, each identifying an invalid field, comprising: A MAL::String giving a dot-separated nested index for the invalid field(s).  This allows for fields that are themselves a structure or list element to be denoted.  For example, the form ‘3.2.4’ could mean the 4th element of the 2nd field of the composite structure that is the 3rd field of the message. A MAL::UShort giving a secondary error code that details the reason for invalidity.
                  +            
                  +            
                  +                UPDATE_FAILED
                  +                3
                  +                String
                  +                ExtraInfo provides additional information on the reason for failure as a free format string.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: insertActivity
                  +        
                  +        
                  +            Overview
                  +        
                  +        The insertActivity operation sends an InsertedActivityDetails structure (an ActivityDetails structure with Plan reference and start/end triggers) to the provider, which then creates a corresponding ActivityInstance object in the referenced Plan and returns its identity to the consumer.
                  +        It is up to the planning system, how to manage concurrent access to the plan. Insertion may fail if the Plan is already in the TERMINATED state, in which case an INSERT_FAILED error shall be returned.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                insertActivity
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                No
                  +                 HYPERLINK  \l "DATATYPE_InsertedActivityDetails" InsertedActivityDetails activityDetails
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                No
                  +                ObjectRef< HYPERLINK  \l "DATATYPE_ActivityInstance" ActivityInstance> activityRef
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        activityDetails - 
                  +        activityRef - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        INVALID: One or more fields in the message contain invalid values.
                  +        INSERT_FAILED: The insertActivity or insertEvent operation failed to insert the requested object.
                  +        UNSUPPORTED: An optional data structure used in the message is not supported by the service provider.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                INVALID
                  +                1
                  +                List<Pair>
                  +                ExtraInfo comprises a list of structures, each identifying an invalid field, comprising: A MAL::String giving a dot-separated nested index for the invalid field(s).  This allows for fields that are themselves a structure or list element to be denoted.  For example, the form ‘3.2.4’ could mean the 4th element of the 2nd field of the composite structure that is the 3rd field of the message. A MAL::UShort giving a secondary error code that details the reason for invalidity.
                  +            
                  +            
                  +                INSERT_FAILED
                  +                5
                  +                String
                  +                ExtraInfo provides additional information on the reason for failure as a free format string.
                  +            
                  +            
                  +                UNSUPPORTED
                  +                10
                  +                List<String>
                  +                ExtraInfo comprises a list of MAL::Strings giving a dot-separated nested index for the unsupported field(s).  This allows for fields that are themselves a structure or list element to be denoted.  For example, the form ‘3.2.4’ could mean the 4th element of the 2nd field of the composite structure that is the 3rd field of the message.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: insertEvent
                  +        
                  +        
                  +            Overview
                  +        
                  +        The insertEvent operation sends an InsertedEventDetails structure, which includes a Plan reference, to the provider, which then creates a corresponding EventInstance object in the referenced Plan and returns its identity to the consumer.
                  +        It is up to the planning system, how to manage concurrent access to the plan. Insertion may fail if the Plan is already in the TERMINATED state, in which case an INSERT_FAILED error shall be returned.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                insertEvent
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                No
                  +                 HYPERLINK  \l "DATATYPE_InsertedEventDetails" InsertedEventDetails eventDetails
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                No
                  +                ObjectRef< HYPERLINK  \l "DATATYPE_EventInstance" EventInstance> eventRef
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        eventDetails - 
                  +        eventRef - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        INVALID: One or more fields in the message contain invalid values.
                  +        INSERT_FAILED: The insertActivity or insertEvent operation failed to insert the requested object.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                INVALID
                  +                1
                  +                List<Pair>
                  +                ExtraInfo comprises a list of structures, each identifying an invalid field, comprising: A MAL::String giving a dot-separated nested index for the invalid field(s).  This allows for fields that are themselves a structure or list element to be denoted.  For example, the form ‘3.2.4’ could mean the 4th element of the 2nd field of the composite structure that is the 3rd field of the message. A MAL::UShort giving a secondary error code that details the reason for invalidity.
                  +            
                  +            
                  +                INSERT_FAILED
                  +                5
                  +                String
                  +                ExtraInfo provides additional information on the reason for failure as a free format string.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: deleteActivity
                  +        
                  +        
                  +            Overview
                  +        
                  +        The deleteActivity operation requests that a specified ActivityInstance within a Plan is deleted by the service provider.
                  +        In practice, the activity is not removed, but transitioned to the TERMINATED state with deletion indicated in the statusInfo field.
                  +        The ActivityInstance is not subsequently executed by the service provider, but it is implementation dependent what action is taken by the service provider if the ActivityInstance is in the EXECUTING state.
                  +        It is up to the planning system, how to manage concurrent access to the plan. Deletion may fail if the referenced Plan or ActivityInstance is already in the TERMINATED state, in which case the DELETE_FAILED error shall be returned.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                deleteActivity
                  +            
                  +            
                  +                Interaction Pattern
                  +                SUBMIT
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                SUBMIT
                  +                NoNo
                  +                ObjectRef< HYPERLINK  \l "DATATYPE_Plan" Plan> planRefObjectRef< HYPERLINK  \l "DATATYPE_ActivityInstance" ActivityInstance> activityRef
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        planRef - 
                  +        activityRef - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        INVALID: One or more fields in the message contain invalid values.
                  +        DELETE_FAILED: The deleteActivity or deleteEvent operation failed to delete the requested object.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                INVALID
                  +                1
                  +                List<Pair>
                  +                ExtraInfo comprises a list of structures, each identifying an invalid field, comprising: A MAL::String giving a dot-separated nested index for the invalid field(s).  This allows for fields that are themselves a structure or list element to be denoted.  For example, the form ‘3.2.4’ could mean the 4th element of the 2nd field of the composite structure that is the 3rd field of the message. A MAL::UShort giving a secondary error code that details the reason for invalidity.
                  +            
                  +            
                  +                DELETE_FAILED
                  +                6
                  +                String
                  +                ExtraInfo provides additional information on the reason for failure as a free format string.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: deleteEvent
                  +        
                  +        
                  +            Overview
                  +        
                  +        The deleteEvent operation requests that a specified EventInstance within a Plan is deleted by the service provider.
                  +        In practice, the event is not removed, but transitioned to the TERMINATED state with deletion indicated in the statusInfo field.
                  +        The EventInstance is not subsequently triggered by the service provider.
                  +        It is up to the planning system, how to manage concurrent access to the plan. Deletion may fail if the referenced Plan or EventInstance is already in the TERMINATED state, in which case the DELETE_FAILED error shall be returned.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                deleteEvent
                  +            
                  +            
                  +                Interaction Pattern
                  +                SUBMIT
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                SUBMIT
                  +                NoNo
                  +                ObjectRef< HYPERLINK  \l "DATATYPE_Plan" Plan> planRefObjectRef< HYPERLINK  \l "DATATYPE_EventInstance" EventInstance> eventRef
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        planRef - 
                  +        eventRef - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        INVALID: One or more fields in the message contain invalid values.
                  +        DELETE_FAILED: The deleteActivity or deleteEvent operation failed to delete the requested object.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                INVALID
                  +                1
                  +                List<Pair>
                  +                ExtraInfo comprises a list of structures, each identifying an invalid field, comprising: A MAL::String giving a dot-separated nested index for the invalid field(s).  This allows for fields that are themselves a structure or list element to be denoted.  For example, the form ‘3.2.4’ could mean the 4th element of the 2nd field of the composite structure that is the 3rd field of the message. A MAL::UShort giving a secondary error code that details the reason for invalidity.
                  +            
                  +            
                  +                DELETE_FAILED
                  +                6
                  +                String
                  +                ExtraInfo provides additional information on the reason for failure as a free format string.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: updateActivity
                  +        
                  +        
                  +            Overview
                  +        
                  +        The updateActivity operation may be used to modify an ActivityInstance in a Plan that has already been submitted to the service provider.
                  +        The consumer submits an ActivityUpdate structure which is applied by the service provider to the referenced ActivityInstance.
                  +        It is up to the planning system, how to manage concurrent access to the plan. Update may fail if the referenced Plan or ActivityInstance is already in the TERMINATED state, in which case the UPDATE_FAILED error shall be returned.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                updateActivity
                  +            
                  +            
                  +                Interaction Pattern
                  +                SUBMIT
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                SUBMIT
                  +                NoNo
                  +                ObjectRef< HYPERLINK  \l "DATATYPE_Plan" Plan> planRef HYPERLINK  \l "DATATYPE_ActivityUpdate" ActivityUpdate activityUpdate
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        planRef - 
                  +        activityUpdate - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        INVALID: One or more fields in the message contain invalid values.
                  +        UPDATE_FAILED: The update operation (to Request, PlanStatus, Activity, Event or Resource) failed to update the referenced object.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                INVALID
                  +                1
                  +                List<Pair>
                  +                ExtraInfo comprises a list of structures, each identifying an invalid field, comprising: A MAL::String giving a dot-separated nested index for the invalid field(s).  This allows for fields that are themselves a structure or list element to be denoted.  For example, the form ‘3.2.4’ could mean the 4th element of the 2nd field of the composite structure that is the 3rd field of the message. A MAL::UShort giving a secondary error code that details the reason for invalidity.
                  +            
                  +            
                  +                UPDATE_FAILED
                  +                3
                  +                String
                  +                ExtraInfo provides additional information on the reason for failure as a free format string.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: updateEvent
                  +        
                  +        
                  +            Overview
                  +        
                  +        The updateEvent operation may be used to modify an EventInstance in a Plan that has already been submitted to the service provider.
                  +        The consumer submits an EventUpdate structure which is applied by the service provider to the referenced EventInstance.
                  +        It is up to the planning system, how to manage concurrent access to the plan. Update may fail if the referenced Plan or EventInstance is already in the TERMINATED state, in which case the UPDATE_FAILED error shall be returned.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                updateEvent
                  +            
                  +            
                  +                Interaction Pattern
                  +                SUBMIT
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                SUBMIT
                  +                NoNo
                  +                ObjectRef< HYPERLINK  \l "DATATYPE_Plan" Plan> planRef HYPERLINK  \l "DATATYPE_EventUpdate" EventUpdate eventUpdate
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        planRef - 
                  +        eventUpdate - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        INVALID: One or more fields in the message contain invalid values.
                  +        UPDATE_FAILED: The update operation (to Request, PlanStatus, Activity, Event or Resource) failed to update the referenced object.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                INVALID
                  +                1
                  +                List<Pair>
                  +                ExtraInfo comprises a list of structures, each identifying an invalid field, comprising: A MAL::String giving a dot-separated nested index for the invalid field(s).  This allows for fields that are themselves a structure or list element to be denoted.  For example, the form ‘3.2.4’ could mean the 4th element of the 2nd field of the composite structure that is the 3rd field of the message. A MAL::UShort giving a secondary error code that details the reason for invalidity.
                  +            
                  +            
                  +                UPDATE_FAILED
                  +                3
                  +                String
                  +                ExtraInfo provides additional information on the reason for failure as a free format string.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: updateResourceValue
                  +        
                  +        
                  +            Overview
                  +        
                  +        The updateResourceValue operation may be used to modify the value of a Resource at the specified point in time, in a Plan that has already been submitted to the service provider.
                  +        The consumer submits a ResourceUpdate structure which is applied by the service provider to the referenced Resource.
                  +        It is up to the planning system, how to manage concurrent access to the plan. Update may fail if the referenced Plan is already in the TERMINATED state, in which case the UPDATE_FAILED error shall be returned.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                updateResourceValue
                  +            
                  +            
                  +                Interaction Pattern
                  +                SUBMIT
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                SUBMIT
                  +                NoNo
                  +                ObjectRef< HYPERLINK  \l "DATATYPE_Plan" Plan> planRef HYPERLINK  \l "DATATYPE_ResourceUpdate" ResourceUpdate resourceUpdate
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        planRef - 
                  +        resourceUpdate - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        INVALID: One or more fields in the message contain invalid values.
                  +        UPDATE_FAILED: The update operation (to Request, PlanStatus, Activity, Event or Resource) failed to update the referenced object.
                  +        UNSUPPORTED: An optional data structure used in the message is not supported by the service provider.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                INVALID
                  +                1
                  +                List<Pair>
                  +                ExtraInfo comprises a list of structures, each identifying an invalid field, comprising: A MAL::String giving a dot-separated nested index for the invalid field(s).  This allows for fields that are themselves a structure or list element to be denoted.  For example, the form ‘3.2.4’ could mean the 4th element of the 2nd field of the composite structure that is the 3rd field of the message. A MAL::UShort giving a secondary error code that details the reason for invalidity.
                  +            
                  +            
                  +                UPDATE_FAILED
                  +                3
                  +                String
                  +                ExtraInfo provides additional information on the reason for failure as a free format string.
                  +            
                  +            
                  +                UNSUPPORTED
                  +                10
                  +                List<String>
                  +                ExtraInfo comprises a list of MAL::Strings giving a dot-separated nested index for the unsupported field(s).  This allows for fields that are themselves a structure or list element to be denoted.  For example, the form ‘3.2.4’ could mean the 4th element of the 2nd field of the composite structure that is the 3rd field of the message.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: updateResourceProfile
                  +        
                  +        
                  +            Overview
                  +        
                  +        The updateResourceProfile operation may be used to modify the value of a Resource over a period of time, in a Plan that has already been submitted to the service provider.
                  +        The consumer submits a ResourceProfile structure which is applied by the service provider to the referenced Resource.
                  +        It is up to the planning system, how to manage concurrent access to the plan. Update may fail if the referenced Plan is already in the TERMINATED state, in which case the UPDATE_FAILED error shall be returned.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                updateResourceProfile
                  +            
                  +            
                  +                Interaction Pattern
                  +                SUBMIT
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                SUBMIT
                  +                NoNo
                  +                ObjectRef< HYPERLINK  \l "DATATYPE_Plan" Plan> planRef HYPERLINK  \l "DATATYPE_ResourceProfile" ResourceProfile resourceProfile
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        planRef - 
                  +        resourceProfile - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        INVALID: One or more fields in the message contain invalid values.
                  +        UPDATE_FAILED: The update operation (to Request, PlanStatus, Activity, Event or Resource) failed to update the referenced object.
                  +        UNSUPPORTED: An optional data structure used in the message is not supported by the service provider.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                INVALID
                  +                1
                  +                List<Pair>
                  +                ExtraInfo comprises a list of structures, each identifying an invalid field, comprising: A MAL::String giving a dot-separated nested index for the invalid field(s).  This allows for fields that are themselves a structure or list element to be denoted.  For example, the form ‘3.2.4’ could mean the 4th element of the 2nd field of the composite structure that is the 3rd field of the message. A MAL::UShort giving a secondary error code that details the reason for invalidity.
                  +            
                  +            
                  +                UPDATE_FAILED
                  +                3
                  +                String
                  +                ExtraInfo provides additional information on the reason for failure as a free format string.
                  +            
                  +            
                  +                UNSUPPORTED
                  +                10
                  +                List<String>
                  +                ExtraInfo comprises a list of MAL::Strings giving a dot-separated nested index for the unsupported field(s).  This allows for fields that are themselves a structure or list element to be denoted.  For example, the form ‘3.2.4’ could mean the 4th element of the 2nd field of the composite structure that is the 3rd field of the message.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: applyTimeShift
                  +        
                  +        
                  +            Overview
                  +        
                  +        The applyTimeShift operation may be used to request a shift in the timing by a fixed offset of the ActivityInstances, EventInstances, and ResourceProfiles contained within a Plan that has previously been submitted to a plan execution function.
                  +        The operation may also be restricted to one or more SubPlans within the referenced Plan and/or to a specified time period within the Plan.
                  +        The service provider applies the time shift to the timing of ActivityInstances, EventInstances, and ResourceProfiles contained within the Plan or SubPlan(s). The time shift may fail if the referenced Plan is already in the TERMINATED state, in which case the UPDATE_FAILED error shall be returned. The operation is designed to support backward compatibility with simple time-based on-board schedules, and may not be appropriate for use with plans that include event or position-based triggers and resource profiles.
                  +        What is shifted within the Plan is implementation dependent, but shall include time-based start and end triggers on ActivityInstances.
                  +        EventInstances may also be shifted, but it is noted that some EventInstances correspond to predicted orbital events that cannot meaningfully be shifted.
                  +        Similarly, where supported, resource profiles may reflect the ActivityInstances contained within the Plan and if those are shifted, the corresponding changes in Resource value should also be shifted. NOTE – ActivityInstances have duration which means they may overlap the start or end of the specified TimeWindow for the applicability of the time shift.
                  +        It is implementation dependent how this is managed, but a reasonable assumption is that the start time of the ActivityInstances must be within the specified TimeWindow.
                  +        Given the potential to introduce inconsistencies into a Plan, it must be assumed that users of this service operation understand both its operational implications and its specific implementation.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                applyTimeShift
                  +            
                  +            
                  +                Interaction Pattern
                  +                SUBMIT
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                SUBMIT
                  +                NoYesNoNo
                  +                ObjectRef< HYPERLINK  \l "DATATYPE_Plan" Plan> planRefList<Identifier> subPlans HYPERLINK  \l "DATATYPE_TimeWindow" TimeWindow timePeriodDuration offset
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        planRef - 
                  +        subPlans - 
                  +        timePeriod - 
                  +        offset - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        INVALID: One or more fields in the message contain invalid values.
                  +        UPDATE_FAILED: The update operation (to Request, PlanStatus, Activity, Event or Resource) failed to update the referenced object.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                INVALID
                  +                1
                  +                List<Pair>
                  +                ExtraInfo comprises a list of structures, each identifying an invalid field, comprising: A MAL::String giving a dot-separated nested index for the invalid field(s).  This allows for fields that are themselves a structure or list element to be denoted.  For example, the form ‘3.2.4’ could mean the 4th element of the 2nd field of the composite structure that is the 3rd field of the message. A MAL::UShort giving a secondary error code that details the reason for invalidity.
                  +            
                  +            
                  +                UPDATE_FAILED
                  +                3
                  +                String
                  +                ExtraInfo provides additional information on the reason for failure as a free format string.
                  +            
                  +        
                  +        
                  +            Data types
                  +        
                  +        
                  +            Area data types: MPS
                  +        
                  +        
                  +            
                  +            MO Object: ActivityDefinition
                  +        
                  +        E1: An ActivityDefinition is an MO object that contains static configuration data relating to multiple occurrences of a planning activity.
                  +        Its identity is defined by a definitionID, which includes a constant key and an evolving version that is updated each time the definition is revised.
                  +        ActivityDefinitions form part of the planning configuration data.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ActivityDefinition
                  +            
                  +            
                  +                Extends
                  +                Object
                  +            
                  +            
                  +                Short Form Part
                  +                101
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                objectIdentity
                  +                ObjectIdentity
                  +                No
                  +                The identity of the MO Object.
                  +            
                  +            
                  +                description
                  +                String
                  +                No
                  +                Description of the Activity.
                  +            
                  +            
                  +                argDefs
                  +                List< HYPERLINK  \l "DATATYPE_ArgDef" ArgDef>
                  +                Yes
                  +                List of Argument Definitions.
                  +            
                  +            
                  +                constraints
                  +                 HYPERLINK  \l "DATATYPE_Constraint" Constraint
                  +                Yes
                  +                A single constraint or a constraint node that may contain multiple constraints, applicable to all instances of the Activity.
                  +            
                  +            
                  +                effects
                  +                List< HYPERLINK  \l "DATATYPE_Effect" Effect>
                  +                Yes
                  +                Set of Effects applicable to all instances of the Activity.
                  +            
                  +            
                  +                executionDefinition
                  +                Identifier
                  +                Yes
                  +                Reference to the definition of an executable body for the Activity (procedure, action sequence, etc.).  The manner in which this reference is interpreted is implementation specific.
                  +            
                  +            
                  +                durationSpec
                  +                Element
                  +                Yes
                  +                Supports calculation of an estimated duration of an Activity Instance.
                  +            
                  +            
                  +                children
                  +                List< HYPERLINK  \l "DATATYPE_ActivityDetails" ActivityDetails>
                  +                Yes
                  +                Set of activity details specifying child activities.
                  +            
                  +            
                  +                activityType
                  +                String
                  +                Yes
                  +                Free-text field that can be used to categorize an activity into one of several arbitrary categories.  Enables a planning system to customize behavior for activities, such as their presentation in displays, based on the specified value.
                  +            
                  +            
                  +                defaultTags
                  +                List<String>
                  +                Yes
                  +                Default set of Tags that may be used to associate the Activity with others, grouping activities by operational responsibility (controller/group/system) or other criteria.
                  +            
                  +        
                  +        
                  +            
                  +            MO Object: ActivityInstance
                  +        
                  +        E1: An ActivityInstance is an MO object that contains the identity of a specific occurrence of a planning activity, together with both static and dynamic information associated with that occurrence.
                  +        It supports relationships to its definition, source, a related planning event and any child activities. ActivityInstances may be contained within a Plan. NOTE – The start and end fields specify the trigger conditions (including time) that specify when the ActivityInstance starts and/or ends in the context of a Plan.
                  +        The duration is an estimate of the time taken to execute the ActivityInstance rather than an offset, which may for example be used in the visualization of a Plan.
                  +        Duration may be used in conjunction with a specified end trigger to determine the planned start time of an ActivityInstance.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ActivityInstance
                  +            
                  +            
                  +                Extends
                  +                Object
                  +            
                  +            
                  +                Short Form Part
                  +                102
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                objectIdentity
                  +                ObjectIdentity
                  +                No
                  +                The identity of the MO Object.
                  +            
                  +            
                  +                definition
                  +                ObjectRef< HYPERLINK  \l "DATATYPE_ActivityDefinition" ActivityDefinition>
                  +                No
                  +                Reference to the ActivityDefinition.
                  +            
                  +            
                  +                source
                  +                ObjectRef<Element>
                  +                No
                  +                Object Type: RequestInstance | ActivityInstance | PlanningUser Reference to the source of the ActivityInstance, which is either its parent ActivityInstance, a RequestInstance if it is a root Activity, or a PlanningUser if directly inserted.
                  +            
                  +            
                  +                relatedEvent
                  +                ObjectRef< HYPERLINK  \l "DATATYPE_EventInstance" EventInstance>
                  +                Yes
                  +                Optional reference to an EventInstance that is specifically associated with this instance of the Activity.  Typically, the Activity is placed in response to the Event.
                  +            
                  +            
                  +                children
                  +                List<ObjectRef< HYPERLINK  \l "DATATYPE_ActivityInstance" ActivityInstance>>
                  +                Yes
                  +                References to any child ActivityInstances.
                  +            
                  +            
                  +                comments
                  +                String
                  +                Yes
                  +                Any notes associated with this instance of the Activity.
                  +            
                  +            
                  +                constraints
                  +                 HYPERLINK  \l "DATATYPE_Constraint" Constraint
                  +                Yes
                  +                A single constraint or a constraint node that may contain multiple constraints, applicable to this instance of the Activity.
                  +            
                  +            
                  +                effects
                  +                List< HYPERLINK  \l "DATATYPE_Effect" Effect>
                  +                Yes
                  +                Set of Effects applicable to this instance of the Activity.
                  +            
                  +            
                  +                arguments
                  +                List< HYPERLINK  \l "DATATYPE_Argument" Argument>
                  +                Yes
                  +                Argument values for each Argument defined in the Activity Definition.
                  +            
                  +            
                  +                start
                  +                 HYPERLINK  \l "DATATYPE_Trigger" Trigger
                  +                Yes
                  +                Optionally specifies the trigger that initiates the Activity: may be time, position or event based.
                  +            
                  +            
                  +                end
                  +                 HYPERLINK  \l "DATATYPE_Trigger" Trigger
                  +                Yes
                  +                Optionally specifies the trigger that ends the Activity.
                  +            
                  +            
                  +                duration
                  +                Duration
                  +                Yes
                  +                Optional duration of the Activity (estimated until execution, actual post execution).
                  +            
                  +            
                  +                subPlan
                  +                Identifier
                  +                Yes
                  +                Optional association of the Activity with a defined sub-plan.
                  +            
                  +            
                  +                tags
                  +                List<String>
                  +                Yes
                  +                Set of Tags that may be used to associate the Activity with others, grouping activities by operational responsibility (controller/group/system) or other criteria.
                  +            
                  +            
                  +                status
                  +                 HYPERLINK  \l "DATATYPE_ActivityStatusEnum" ActivityStatusEnum
                  +                No
                  +                Current Status of the Activity Instance (see Activity State Model in 4.5.2.2).
                  +            
                  +            
                  +                executionInstance
                  +                Identifier
                  +                Yes
                  +                Reference to the instance of an executable body for the Activity (procedure, action sequence, etc.).  The manner in which this reference is interpreted is implementation specific.
                  +            
                  +            
                  +                returnData
                  +                List<NamedValue>
                  +                Yes
                  +                Optional return data from the planning process, provided as a list of ID-Value pairs.  This can be used to provide additional information required by the User to interpret the planned activity.
                  +            
                  +            
                  +                statusInfo
                  +                String
                  +                Yes
                  +                StatusInfo provides the reason for entering the Terminated State and is customizable, but if the following conditions exist then the specified text shall be used: - Completed (nominal); - Expired (prior to Activation or during plan Suspension); - Deleted; - Failed (see ErrorCode/ErrorInfo).
                  +            
                  +            
                  +                errorCode
                  +                Integer
                  +                Yes
                  +                Error Code optional in the case of a failure status for the planning activity (for example Terminated state with statusInfo Failed).  The codes are implementation specific.
                  +            
                  +            
                  +                errorInfo
                  +                String
                  +                Yes
                  +                Supplementary Error Information.
                  +            
                  +        
                  +        
                  +            
                  +            MO Object: EventDefinition
                  +        
                  +        E1: An EventDefinition is an MO object that contains static configuration data relating to multiple occurrences of a planning event.
                  +        Its identity is defined by a definitionID, which includes a constant key and an evolving version, which is updated each time the definition is revised.
                  +        Event definitions form part of the planning configuration data. Events may be either Predicted or Potential.
                  +        Events that are predictable either by time or position can have specific instances included in a Plan.
                  +        Potential events are those that may occur during the execution of a Plan, but the specific time or position is not predicted.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                EventDefinition
                  +            
                  +            
                  +                Extends
                  +                Object
                  +            
                  +            
                  +                Short Form Part
                  +                201
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                objectIdentity
                  +                ObjectIdentity
                  +                No
                  +                The identity of the MO Object.
                  +            
                  +            
                  +                description
                  +                String
                  +                No
                  +                Description of the event.
                  +            
                  +            
                  +                predictability
                  +                 HYPERLINK  \l "DATATYPE_PredictabilityEnum" PredictabilityEnum
                  +                No
                  +                Enumeration: one of {Predicted, Potential} indicating whether the event occurrence is known in advance or can occur at any time.  
                  +            
                  +            
                  +                eventType
                  +                String
                  +                Yes
                  +                Free-text field that can be used to categorize an event into one of several arbitrary categories.  Enables a planning system to customize behavior for events, such as their presentation in displays, based on the specified value.
                  +            
                  +            
                  +                argDefs
                  +                List< HYPERLINK  \l "DATATYPE_ArgDef" ArgDef>
                  +                Yes
                  +                List of argument definitions.
                  +            
                  +            
                  +                eventDefinitions
                  +                List<ObjectRef< HYPERLINK  \l "DATATYPE_EventDefinition" EventDefinition>>
                  +                Yes
                  +                List of child event definitions.  For a single event, this list shall be empty; for a group event, the list shall be populated.
                  +            
                  +        
                  +        
                  +            
                  +            MO Object: EventInstance
                  +        
                  +        E1: An EventInstance is an MO object that contains the identity of a specific occurrence of a planning event, together with both static and dynamic information associated with that occurrence.
                  +        It supports relationships to its definition and source. The source of an EventInstance may be an external event, corresponding to a NAV Predicted Event or a CSS Contact Event. EventInstances may be contained within a Plan. EventInstances may be referenced as a related event by an ActivityInstance, so that the ActivityInstance can reference the timing and arguments of the related EventInstance.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                EventInstance
                  +            
                  +            
                  +                Extends
                  +                Object
                  +            
                  +            
                  +                Short Form Part
                  +                202
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                objectIdentity
                  +                ObjectIdentity
                  +                No
                  +                The identity of the MO Object.
                  +            
                  +            
                  +                definition
                  +                ObjectRef< HYPERLINK  \l "DATATYPE_EventDefinition" EventDefinition>
                  +                No
                  +                Reference to the EventDefinition.
                  +            
                  +            
                  +                sourceEvent
                  +                Identifier
                  +                Yes
                  +                Reference to an external source event (e.g., NAV predicted event, or CSS contact event).
                  +            
                  +            
                  +                events
                  +                List<ObjectRef< HYPERLINK  \l "DATATYPE_EventInstance" EventInstance>>
                  +                Yes
                  +                List of references to child EventInstances.  For a single event, this list is empty; for a group event, the list will be populated.
                  +            
                  +            
                  +                eventTime
                  +                FineTime
                  +                Yes
                  +                Predicted or actual time of the event.  EventTime is nullable: it can be predicted without an eventTime (e.g., if position based).
                  +            
                  +            
                  +                arguments
                  +                List< HYPERLINK  \l "DATATYPE_Argument" Argument>
                  +                Yes
                  +                Argument values for each argument defined in the EventDefinition.
                  +            
                  +            
                  +                eventStatus
                  +                 HYPERLINK  \l "DATATYPE_EventStatusEnum" EventStatusEnum
                  +                No
                  +                Current status of the event instance (see event state model in 4.5.3.2).
                  +            
                  +            
                  +                statusInfo
                  +                String
                  +                Yes
                  +                StatusInfo provides the reason for entering the terminated state and is customizable, but if the following conditions exist then the specified text shall be used: - Occurred (Event has been triggered); - Did Not Occur (Event expired or did not occur within validity period); - Deleted (Event was deleted).
                  +            
                  +        
                  +        
                  +            
                  +            MO Object: Resource
                  +        
                  +        E4: A resource is an MO object that contains both the static fields that define a planning resource and a dynamic field that holds its current value.
                  +        Its identity is defined by a constant key and evolving version, which is updated each time the definition is revised.
                  +        Resource definitions form part of the planning configuration data and in practice the value field may be omitted in this context, although it may also be used to provide an initial or default value. Depending on the resource data type, the resource definition may require additional type-specific fields to support data validation.
                  +        Subtypes are defined for Numeric, String, and enumerated Status type resources.
                  +        The base Resource MO object type can be used where no data validation is applicable.
                  +        The following fields are applicable to the base type and all subtypes.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                Resource
                  +            
                  +            
                  +                Extends
                  +                Object
                  +            
                  +            
                  +                Short Form Part
                  +                301
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                objectIdentity
                  +                ObjectIdentity
                  +                No
                  +                The identity of the MO Object.
                  +            
                  +            
                  +                description
                  +                String
                  +                No
                  +                Description of the Resource.
                  +            
                  +            
                  +                dataType
                  +                AttributeType
                  +                No
                  +                Specifies the data type of the Resource, which must be a supported MAL Attribute type.
                  +            
                  +            
                  +                units
                  +                String
                  +                Yes
                  +                Optional.  Specifies the units of a single quantity, in which the value of the Resource is expressed in.
                  +            
                  +            
                  +                validationData
                  +                 HYPERLINK  \l "DATATYPE_ValidationDetails" ValidationDetails
                  +                Yes
                  +                Optional.  Specifies the allowed range of values for the Resource, with concrete subtypes specific to the data type of the Resource.
                  +            
                  +            
                  +                value
                  +                Attribute
                  +                Yes
                  +                Value of the resource.  MAL Attribute type must match the dataType of the Resource definition. The value is only nullable in the context of a Resource definition (planning configuration data).
                  +            
                  +        
                  +        
                  +            
                  +            MO Object: RequestDefinition
                  +        
                  +        E1: A RequestDefinition is an MO object that contains the specification of a re-usable planning request template.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                RequestDefinition
                  +            
                  +            
                  +                Extends
                  +                Object
                  +            
                  +            
                  +                Short Form Part
                  +                401
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                objectIdentity
                  +                ObjectIdentity
                  +                No
                  +                The identity of the MO Object.
                  +            
                  +            
                  +                description
                  +                String
                  +                No
                  +                Description of the re-usable RequestDefinition.
                  +            
                  +            
                  +                argDefs
                  +                List< HYPERLINK  \l "DATATYPE_ArgDef" ArgDef>
                  +                Yes
                  +                List of argument definitions.  Arguments may be referenced in ActivityDetails and constraints.
                  +            
                  +            
                  +                standingOrder
                  +                Boolean
                  +                No
                  +                A flag that indicates whether the planning request is for a repetitive standing order (unbounded other than by the validity period), or is a one-off request.  If it is a standing order, then the supplied activity details must be an ActivityNode with specification of the repetition criteria.  It should be noted that a one-off request can still include repetition.
                  +            
                  +            
                  +                activities
                  +                List< HYPERLINK  \l "DATATYPE_ActivityDetails" ActivityDetails>
                  +                No
                  +                Set of activity details specifying requested activities.
                  +            
                  +        
                  +        
                  +            
                  +            MO Object: RequestInstance
                  +        
                  +        E1: A RequestInstance is an MO object that contains the specification of a planning request.
                  +        This may change over time if the request is updated by the user, each comprising a separate version of the request with the same object key. In the context of a hierarchical or federated planning system, a RequestInstance can be used to submit a Plan
                  +        (4.5.6) to a planning function, either embedding the Plan in the RequestInstance or passing it by reference.
                  +        If passed by reference, the Plan can be retrieved using the Plan Distribution Service (3.6).
                  +        Patch plans are not permitted in this context. NOTE – RequestInstances may be created from a RequestDefinition that has defined arguments (as ArgDefs) and will in this case have the associated Arguments.
                  +        An ad-hoc RequestInstance is not anticipated to hold any Arguments.
                  +        The values that can be parameterized through the arguments of a re-usable RequestDefinition can be directly entered in a RequestInstance, and there would be no corresponding ArgDef associated with any Arguments supplied.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                RequestInstance
                  +            
                  +            
                  +                Extends
                  +                Object
                  +            
                  +            
                  +                Short Form Part
                  +                402
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                objectIdentity
                  +                ObjectIdentity
                  +                No
                  +                The identity of the MO Object.
                  +            
                  +            
                  +                requestDetails
                  +                 HYPERLINK  \l "DATATYPE_PlanningRequestDetails" PlanningRequestDetails
                  +                No
                  +                The contents of the planning request.
                  +            
                  +            
                  +                creationTime
                  +                Time
                  +                No
                  +                Creation date and time of the RequestInstance version.
                  +            
                  +            
                  +                status
                  +                 HYPERLINK  \l "DATATYPE_RequestStatusEnum" RequestStatusEnum
                  +                No
                  +                Current status of the ActivityInstance (see planning request state model in 4.5.5.2).
                  +            
                  +            
                  +                outputPlanRefs
                  +                List<ObjectRef< HYPERLINK  \l "DATATYPE_Plan" Plan>>
                  +                Yes
                  +                Reference to the output Plan(s) that contains the activities resulting from the planning request.  Where multiple alternate plans have been generated, these may be listed here.
                  +            
                  +            
                  +                returnData
                  +                List<NamedValue>
                  +                Yes
                  +                Optional return data from the planning process, provided as a list of ID-Value pairs.  This can be used to provide additional information required by the User to interpret the planned operations.
                  +            
                  +            
                  +                statusInfo
                  +                String
                  +                Yes
                  +                StatusInfo provides the reason for termination and is customizable, but if the following conditions exist then the specified text shall be used: - Completed (all constituent activities completed successfully); - Expired (constituent activities expired prior to execution); - Failed (constituent activities failed during execution); - Deleted (constituent activities were deleted); - Partially Completed. It may also be used to provide the reason for rejection.
                  +            
                  +            
                  +                errorCode
                  +                Integer
                  +                Yes
                  +                Error Code optional in the case of a failure status for the planning request (for example Terminated state with statusInfo Failed).  The codes are implementation specific.
                  +            
                  +            
                  +                errorInfo
                  +                String
                  +                Yes
                  +                Supplementary error information.
                  +            
                  +        
                  +        
                  +            
                  +            MO Object: Plan
                  +        
                  +        E1: A Plan is an MO object that contains both the static fields that define a version of a plan and dynamic fields that hold its current state.
                  +        Its identity is defined by a constant key and an evolving version, which is updated each time the Plan is revised.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                Plan
                  +            
                  +            
                  +                Extends
                  +                Object
                  +            
                  +            
                  +                Short Form Part
                  +                501
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                objectIdentity
                  +                ObjectIdentity
                  +                No
                  +                The identity of the MO Object.
                  +            
                  +            
                  +                isPatchPlan
                  +                Boolean
                  +                No
                  +                Flag indicating if the Plan is a patch plan that only contains details of the changes from the precursor Plan.  A patch plan must have a precursor.  It must also include a single PlanRevision relative to the precursor Plan.
                  +            
                  +            
                  +                precursorPlan
                  +                ObjectRef< HYPERLINK  \l "DATATYPE_Plan" Plan>
                  +                Yes
                  +                Reference to a precursor (or predecessor) Plan from which the changes are detailed in the Plan.  This may be used if there is an iterative re-planning cycle in which successive plans overlap, or where a previous Plan has been updated through re-planning.  If there is no precursor, then the Plan must be a self-standing full plan. If the Plan is a Patch Plan, then a precursor plan must be specified.
                  +            
                  +            
                  +                targetPlan
                  +                ObjectRef< HYPERLINK  \l "DATATYPE_Plan" Plan>
                  +                Yes
                  +                Applicable only for patch plans, this is a reference to the target Plan.  This target Plan is the result of applying the patch plan to the precursor Plan and is distinct from the identity of the patch plan itself.  Patch plans are not permitted in the context of a planning request.
                  +            
                  +            
                  +                information
                  +                 HYPERLINK  \l "DATATYPE_PlanInformation" PlanInformation
                  +                No
                  +                Contains header information relating to the Plan, including its originator and validity period.
                  +            
                  +            
                  +                items
                  +                 HYPERLINK  \l "DATATYPE_PlannedItems" PlannedItems
                  +                No
                  +                Contains the planned activities and events that constitute the Plan.
                  +            
                  +            
                  +                revisions
                  +                List< HYPERLINK  \l "DATATYPE_PlanRevision" PlanRevision>
                  +                Yes
                  +                Details the changes between this Plan and other Plans (or other versions of the same Plan), usually the precursor Plan.  Optional, but must contain at least one element in a patch plan. Multiple revisions may be included, documenting the differences with any other version of a Plan.  This can be used to provide a change history for successive versions of the same Plan, or to document the differences between alternate Plans.
                  +            
                  +            
                  +                resources
                  +                List< HYPERLINK  \l "DATATYPE_ResourceProfile" ResourceProfile>
                  +                Yes
                  +                If present, must contain one ResourceProfile per planning resource.  These profiles shall provide the projected evolution of the value of a planning resource, or its initial value at the start of the Plan.  Which approach is used is a deployment choice.
                  +            
                  +            
                  +                isAlternate
                  +                Boolean
                  +                No
                  +                Flag indicating if the Plan has currently been released as an Operational or Alternate plan.
                  +            
                  +            
                  +                status
                  +                 HYPERLINK  \l "DATATYPE_PlanStatusEnum" PlanStatusEnum
                  +                No
                  +                Current status of the Plan.
                  +            
                  +            
                  +                statusInfo
                  +                String
                  +                Yes
                  +                Supplementary information for a Plan in the Terminated state.  This is customizable, but if the following conditions exist then the specified text shall be used: - Completed (nominal); - Superseded (by a successor Plan); - Revoked; - Cancelled (deactivated after start of execution); - Expired.
                  +            
                  +        
                  +        
                  +            
                  +            MO Object: PlanningUser
                  +        
                  +        E1: The source of a planning request is the user that raises it, and this is identified in the user field of a RequestInstance as a reference to a PlanningUser object.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                PlanningUser
                  +            
                  +            
                  +                Extends
                  +                Object
                  +            
                  +            
                  +                Short Form Part
                  +                601
                  +            
                  +        
                  +        
                  +            
                  +            Composite: PlanDetailUpdate
                  +        
                  +        E1: Specifically in the case of reporting the detailed execution status of a plan, updates may be reported for multiple object types: planning activities, planning events, and planning resources.
                  +        To support this an abstract type of PlanDetailUpdate is defined as follows.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                PlanDetailUpdate
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Abstract
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ActivityDetails
                  +        
                  +        E1: Contains the information required to create one or more ActivityInstances, including the specification of argument values and constraints. It should be noted that the activityRef and activityOffset fields are only relevant in the case that a Repetition has been specified in a parent ActivityNode.
                  +        Temporal and sequential constraints associated with the ActivityInstance can be specified as constraints attached to a concrete SimpleActivityDetails structure.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ActivityDetails
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Abstract
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                activityRef
                  +                 HYPERLINK  \l "DATATYPE_Slider" Slider
                  +                Yes
                  +                Specifies how the ActivityInstance is placed with respect to any defined Repetition (0=Start; 1=End). Default is Start.
                  +            
                  +            
                  +                activityOffset
                  +                Element
                  +                Yes
                  +                Specifies an offset in time for the ActivityInstance from any defined Repetition. Default is no offset.
                  +            
                  +            
                  +                relatedEvent
                  +                Element
                  +                Yes
                  +                Specifies a related Event (or Event Group) for the ActivityInstance.  Argument specifications and constraints may reference arguments and fields of the RelatedEvent.
                  +            
                  +            
                  +                comments
                  +                String
                  +                Yes
                  +                Any notes associated with the ActivityDetails.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ActivityNode
                  +        
                  +        E1: A concrete sub-type of ActivityDetails, an ActivityNode is a container node for a set of ActivityDetails together with an optional Repetition specification.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ActivityNode
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_ActivityDetails" ActivityDetails
                  +            
                  +            
                  +                Short Form Part
                  +                104
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                activityRef
                  +                 HYPERLINK  \l "DATATYPE_Slider" Slider
                  +                Yes
                  +                Specifies how the ActivityInstance is placed with respect to any defined Repetition (0=Start; 1=End). Default is Start.
                  +            
                  +            
                  +                activityOffset
                  +                Element
                  +                Yes
                  +                Specifies an offset in time for the ActivityInstance from any defined Repetition. Default is no offset.
                  +            
                  +            
                  +                relatedEvent
                  +                Element
                  +                Yes
                  +                Specifies a related Event (or Event Group) for the ActivityInstance.  Argument specifications and constraints may reference arguments and fields of the RelatedEvent.
                  +            
                  +            
                  +                comments
                  +                String
                  +                Yes
                  +                Any notes associated with the ActivityDetails.
                  +            
                  +            
                  +                repetition
                  +                 HYPERLINK  \l "DATATYPE_Repetition" Repetition
                  +                Yes
                  +                Optional Repetition specification.
                  +            
                  +            
                  +                activities
                  +                List< HYPERLINK  \l "DATATYPE_ActivityDetails" ActivityDetails>
                  +                Yes
                  +                Set of ActivityDetails.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: SimpleActivityDetails
                  +        
                  +        E1: A concrete sub-type of ActivityDetails, a SimpleActivityDetails provides the information required to instantiate a single ActivityInstance.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                SimpleActivityDetails
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_ActivityDetails" ActivityDetails
                  +            
                  +            
                  +                Short Form Part
                  +                105
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                activityRef
                  +                 HYPERLINK  \l "DATATYPE_Slider" Slider
                  +                Yes
                  +                Specifies how the ActivityInstance is placed with respect to any defined Repetition (0=Start; 1=End). Default is Start.
                  +            
                  +            
                  +                activityOffset
                  +                Element
                  +                Yes
                  +                Specifies an offset in time for the ActivityInstance from any defined Repetition. Default is no offset.
                  +            
                  +            
                  +                relatedEvent
                  +                Element
                  +                Yes
                  +                Specifies a related Event (or Event Group) for the ActivityInstance.  Argument specifications and constraints may reference arguments and fields of the RelatedEvent.
                  +            
                  +            
                  +                comments
                  +                String
                  +                Yes
                  +                Any notes associated with the ActivityDetails.
                  +            
                  +            
                  +                activityDefinition
                  +                ObjectRef< HYPERLINK  \l "DATATYPE_ActivityDefinition" ActivityDefinition>
                  +                No
                  +                Reference to the ActivityDefinition.
                  +            
                  +            
                  +                argSpecs
                  +                List< HYPERLINK  \l "DATATYPE_ArgSpec" ArgSpec>
                  +                Yes
                  +                Set of argument specifications for each argument definition contained in the referenced activity definition.  These supply a value for each argument, or an expression to enable the value to be derived.
                  +            
                  +            
                  +                constraints
                  +                 HYPERLINK  \l "DATATYPE_Constraint" Constraint
                  +                Yes
                  +                A single constraint or a constraint node that may contain multiple constraints, specific to the ActivityInstance to be created.
                  +            
                  +            
                  +                effects
                  +                List< HYPERLINK  \l "DATATYPE_Effect" Effect>
                  +                Yes
                  +                Set of Effects specific to the ActivityInstance to be created.
                  +            
                  +            
                  +                subPlan
                  +                Identifier
                  +                Yes
                  +                Optional association of the ActivityInstance with a defined sub-plan.
                  +            
                  +            
                  +                tags
                  +                List<String>
                  +                Yes
                  +                A set of tags that may be used to associate the Activity with an identified subset of the Plan, grouping activities by operational responsibility (controller/group/system) or other criteria.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ActivityUpdate
                  +        
                  +        E1: ActivityUpdate is a data structure that is used to report the dynamic status of an ActivityInstance in the context of the MPS Plan Execution Control service monitorPlanExecutionDetail and getActivityStatus operations. ActivityUpdates may be distributed to subscribing applications, including status displays, to inform them of the latest status of the activity.
                  +        This may be particularly relevant in conjunction with a plan execution function.
                  +        ActivityUpdates may be stored in activity history to provide a complete record of evolving status over time.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ActivityUpdate
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_PlanDetailUpdate" PlanDetailUpdate
                  +            
                  +            
                  +                Short Form Part
                  +                106
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                activityInstance
                  +                ObjectRef< HYPERLINK  \l "DATATYPE_ActivityInstance" ActivityInstance>
                  +                No
                  +                Reference to the ActivityInstance to which the status update relates.
                  +            
                  +            
                  +                timestamp
                  +                Time
                  +                Yes
                  +                Time of status update. Only nullable in the context of an updateActivity operation: the timestamp must be provided when reporting ActivityInstance status.
                  +            
                  +            
                  +                plan
                  +                ObjectRef< HYPERLINK  \l "DATATYPE_Plan" Plan>
                  +                Yes
                  +                Optional reference to the Plan containing the ActivityInstance to which this update pertains.
                  +            
                  +            
                  +                arguments
                  +                List< HYPERLINK  \l "DATATYPE_Argument" Argument>
                  +                Yes
                  +                Argument values.
                  +            
                  +            
                  +                start
                  +                 HYPERLINK  \l "DATATYPE_Trigger" Trigger
                  +                Yes
                  +                Optionally specifies the trigger that initiates the ActivityInstance: may be time, position, or event based.
                  +            
                  +            
                  +                end
                  +                 HYPERLINK  \l "DATATYPE_Trigger" Trigger
                  +                Yes
                  +                Optionally specifies the trigger that ends the ActivityInstance.
                  +            
                  +            
                  +                duration
                  +                Duration
                  +                Yes
                  +                Optional duration of the ActivityInstance (estimated until execution, actual post execution).
                  +            
                  +            
                  +                subPlan
                  +                Identifier
                  +                Yes
                  +                Optional association of the ActivityInstance with a defined sub-plan.
                  +            
                  +            
                  +                tags
                  +                List<String>
                  +                Yes
                  +                Set of tags that may be used to associate the ActivityInstance with an identified subset of the Plan, grouping activities by operational responsibility (controller/group/system) or other criteria.
                  +            
                  +            
                  +                status
                  +                 HYPERLINK  \l "DATATYPE_ActivityStatusEnum" ActivityStatusEnum
                  +                No
                  +                Current status of the ActivityInstance.
                  +            
                  +            
                  +                executionInstance
                  +                Identifier
                  +                Yes
                  +                Reference to the instance of an executable body for the ActivityInstance (procedure, action sequence, etc.).  The manner in which this reference is interpreted is implementation specific.
                  +            
                  +            
                  +                returnData
                  +                List<NamedValue>
                  +                Yes
                  +                Optional return data from the planning process, provided as a list of ID-Value pairs.  This can be used to provide additional information required by the User to interpret the planned activity.
                  +            
                  +            
                  +                statusInfo
                  +                String
                  +                Yes
                  +                StatusInfo provides the reason for entering the Terminated State and is customizable, but if the following conditions exist then the specified text shall be used: - Completed (nominal); - Expired (prior to Activation or during plan Suspension); - Deleted; - Failed (see ErrorCode/ErrorInfo).
                  +            
                  +            
                  +                errorCode
                  +                Integer
                  +                Yes
                  +                Error Code optional in the case of a failure status for the planning activity (for example Terminated state with statusInfo Failed).  The codes are implementation specific.
                  +            
                  +            
                  +                errorInfo
                  +                String
                  +                Yes
                  +                Supplementary error information.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: InsertedActivityDetails
                  +        
                  +        E1: A concrete sub-type of ActivityDetails (4.5.2.3.1) that is a variation of SimpleActivityDetails providing additional details for a single ActivityInstance to be inserted into a Plan using the MPS Plan Edit service.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                InsertedActivityDetails
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_ActivityDetails" ActivityDetails
                  +            
                  +            
                  +                Short Form Part
                  +                107
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                activityRef
                  +                 HYPERLINK  \l "DATATYPE_Slider" Slider
                  +                Yes
                  +                Specifies how the ActivityInstance is placed with respect to any defined Repetition (0=Start; 1=End). Default is Start.
                  +            
                  +            
                  +                activityOffset
                  +                Element
                  +                Yes
                  +                Specifies an offset in time for the ActivityInstance from any defined Repetition. Default is no offset.
                  +            
                  +            
                  +                relatedEvent
                  +                Element
                  +                Yes
                  +                Specifies a related Event (or Event Group) for the ActivityInstance.  Argument specifications and constraints may reference arguments and fields of the RelatedEvent.
                  +            
                  +            
                  +                comments
                  +                String
                  +                Yes
                  +                Any notes associated with the ActivityDetails.
                  +            
                  +            
                  +                plan
                  +                ObjectRef< HYPERLINK  \l "DATATYPE_Plan" Plan>
                  +                No
                  +                Reference to the Plan into which the ActivityInstance is to be inserted.
                  +            
                  +            
                  +                start
                  +                 HYPERLINK  \l "DATATYPE_Trigger" Trigger
                  +                Yes
                  +                Optionally specifies the trigger that initiates the ActivityInstance: may be time, position, or event based.
                  +            
                  +            
                  +                end
                  +                 HYPERLINK  \l "DATATYPE_Trigger" Trigger
                  +                Yes
                  +                Optionally specifies the trigger that ends the ActivityInstance.
                  +            
                  +            
                  +                activityDefinition
                  +                ObjectRef< HYPERLINK  \l "DATATYPE_ActivityDefinition" ActivityDefinition>
                  +                No
                  +                Reference to the ActivityDefinition.
                  +            
                  +            
                  +                argSpecs
                  +                List< HYPERLINK  \l "DATATYPE_ArgSpec" ArgSpec>
                  +                Yes
                  +                Set of argument specifications for each argument definition contained in the referenced activity definition.  These supply a value for each argument, or an expression to enable the value to be derived.
                  +            
                  +            
                  +                user
                  +                ObjectRef< HYPERLINK  \l "DATATYPE_PlanningUser" PlanningUser>
                  +                No
                  +                The User ID for the person or organization inserting the activity into the Plan.
                  +            
                  +            
                  +                constraints
                  +                 HYPERLINK  \l "DATATYPE_Constraint" Constraint
                  +                Yes
                  +                A single constraint or a constraint node that may contain multiple constraints, specific to the ActivityInstance to be created.
                  +            
                  +            
                  +                effects
                  +                List< HYPERLINK  \l "DATATYPE_Effect" Effect>
                  +                Yes
                  +                Set of Effects specific to the ActivityInstance to be created.
                  +            
                  +            
                  +                subPlan
                  +                Identifier
                  +                Yes
                  +                Optional association of the ActivityInstance with a defined sub-plan.
                  +            
                  +            
                  +                tags
                  +                List<String>
                  +                Yes
                  +                Set of tags that may be used to associate the Activity with a subset of the Plan, grouping activities by operational responsibility (controller/group/system) or other criteria.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ActivitySuspensionStatus
                  +        
                  +        E1: A data structure that returns the status and supplementary suspension information for an ActivityInstance affected by an MPS Plan Execution Control service suspendActivity or resumeActivity operation.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ActivitySuspensionStatus
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                108
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                activityInstance
                  +                ObjectRef< HYPERLINK  \l "DATATYPE_ActivityInstance" ActivityInstance>
                  +                No
                  +                Reference to an ActivityInstance.
                  +            
                  +            
                  +                plan
                  +                ObjectRef< HYPERLINK  \l "DATATYPE_Plan" Plan>
                  +                Yes
                  +                Optional reference to the Plan containing the ActivityInstance.
                  +            
                  +            
                  +                status
                  +                 HYPERLINK  \l "DATATYPE_ActivityStatusEnum" ActivityStatusEnum
                  +                No
                  +                Current Status of the ActivityInstance.
                  +            
                  +            
                  +                suspensionInfo
                  +                String
                  +                Yes
                  +                Supplementary information on the suspension/resumption status of the ActivityInstance. This may detail the point of suspension, which may be specific to the suspension mode; or a reason why resumption was not possible.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: EventUpdate
                  +        
                  +        E1: EventUpdate is a data structure that is used to report the dynamic status of an EventInstance in the context of the MPS Plan Execution Control service monitorPlanExecutionDetail operation. EventUpdates may be distributed to subscribing applications, including status displays, to inform them of the latest status of the event.
                  +        This may be particularly relevant in conjunction with a plan execution function.
                  +        EventUpdates may be stored in event history to provide a complete record of evolving status over time.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                EventUpdate
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_PlanDetailUpdate" PlanDetailUpdate
                  +            
                  +            
                  +                Short Form Part
                  +                205
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                eventInstance
                  +                ObjectRef< HYPERLINK  \l "DATATYPE_EventInstance" EventInstance>
                  +                No
                  +                Reference to the EventInstance to which the status update relates.
                  +            
                  +            
                  +                timestamp
                  +                Time
                  +                No
                  +                Time of status update.
                  +            
                  +            
                  +                eventTime
                  +                FineTime
                  +                No
                  +                Predicted or actual time of the event.  EventTime is nullable: it can be predicted without an EventTime (e.g., if position based).
                  +            
                  +            
                  +                arguments
                  +                List< HYPERLINK  \l "DATATYPE_Argument" Argument>
                  +                Yes
                  +                Argument values.
                  +            
                  +            
                  +                eventStatus
                  +                 HYPERLINK  \l "DATATYPE_EventStatusEnum" EventStatusEnum
                  +                No
                  +                Current status of the EventInstance.
                  +            
                  +            
                  +                statusInfo
                  +                String
                  +                Yes
                  +                StatusInfo provides the reason for entering the Terminated state and is customizable, but if the following conditions exist then the specified text shall be used: - Occurred (Event has been triggered); - Did Not Occur (Event expired or did not occur within validity period); - Deleted (Event was deleted).
                  +            
                  +        
                  +        
                  +            
                  +            Composite: InsertedEventDetails
                  +        
                  +        E1: A data structure that provides the information required to create the EventInstance to be inserted into a Plan using the MPS Plan Edit service.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                InsertedEventDetails
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                206
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                plan
                  +                ObjectRef< HYPERLINK  \l "DATATYPE_Plan" Plan>
                  +                No
                  +                Reference to the Plan into which the Event is to be inserted.
                  +            
                  +            
                  +                eventDefinition
                  +                ObjectRef< HYPERLINK  \l "DATATYPE_EventDefinition" EventDefinition>
                  +                No
                  +                Reference to the EventDefinition.
                  +            
                  +            
                  +                eventTime
                  +                FineTime
                  +                No
                  +                Specifies the predicted or actual time of the event.  For an inserted event this must be present.
                  +            
                  +            
                  +                arguments
                  +                List< HYPERLINK  \l "DATATYPE_Argument" Argument>
                  +                Yes
                  +                Argument values.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: NumericResource
                  +        
                  +        E4: An additional concrete sub-type of ValidationDetails applicable only to Resources of any numeric type, including Duration, that provides additional fields for the specification of numeric data validation.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                NumericResource
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_ValidationDetails" ValidationDetails
                  +            
                  +            
                  +                Short Form Part
                  +                302
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                minimum
                  +                 HYPERLINK  \l "DATATYPE_ResourceProfile" ResourceProfile
                  +                No
                  +                Defines the permitted minimum value over time.
                  +            
                  +            
                  +                maximum
                  +                 HYPERLINK  \l "DATATYPE_ResourceProfile" ResourceProfile
                  +                No
                  +                Defines the permitted maximum value over time.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ResourceProfile
                  +        
                  +        E4: A ResourceProfile provides the evolution of a value for a single planning resource over time as a set of ProfileSegments.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ResourceProfile
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                303
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                resource
                  +                ObjectRef< HYPERLINK  \l "DATATYPE_Resource" Resource>
                  +                No
                  +                Reference to a Resource.
                  +            
                  +            
                  +                profileSegments
                  +                List< HYPERLINK  \l "DATATYPE_ProfileSegment" ProfileSegment>
                  +                No
                  +                Set of Profile Segments; if these segments are not contiguous, the value of the profile in those places is undefined.  The resulting behavior may be defined by the planning system.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ProfileSegment
                  +        
                  +        E4: A ProfileSegment defines the time range and interpolation method for a set of ProfileEntries.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ProfileSegment
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                304
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                interpolation
                  +                 HYPERLINK  \l "DATATYPE_InterpolationTypeEnum" InterpolationTypeEnum
                  +                Yes
                  +                Interpolation method to be applied for values lying between points defined in the profile segment. Default = Step.
                  +            
                  +            
                  +                start
                  +                Element
                  +                No
                  +                Start of time range covered by the profile segment.
                  +            
                  +            
                  +                end
                  +                Element
                  +                No
                  +                End of time range covered by the profile segment.
                  +            
                  +            
                  +                startIncluded
                  +                Boolean
                  +                Yes
                  +                Indicates whether the start time is included in the profile segment. Default = True.
                  +            
                  +            
                  +                endIncluded
                  +                Boolean
                  +                Yes
                  +                Indicates whether the end time is included in the profile segment.  This allows the same time to be used as the end of one segment and the start of another. Default = False.
                  +            
                  +            
                  +                profileEntries
                  +                List< HYPERLINK  \l "DATATYPE_ProfileEntry" ProfileEntry>
                  +                No
                  +                Set of profile entries (resource value points).
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ProfileEntry
                  +        
                  +        E4: Defines the value (or minimum/maximum value) of a resource at a particular point in time.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ProfileEntry
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                306
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                time
                  +                Element
                  +                No
                  +                Time of resource data point.
                  +            
                  +            
                  +                value
                  +                Attribute
                  +                No
                  +                Value of resource data point.  MAL Attribute type must match the dataType of the Resource definition.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: RelativeResourceProfile
                  +        
                  +        E4: A variation on ResourceProfile, the RelativeResourceProfile uses relative timestamps of type Duration (indicating an offset from a reference time, such as the start time of an Activity).
                  +        RelativeResourceProfiles are used in the context of a complex resource constraint.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                RelativeResourceProfile
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                307
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                resource
                  +                ObjectRef< HYPERLINK  \l "DATATYPE_Resource" Resource>
                  +                No
                  +                Reference to a Resource.
                  +            
                  +            
                  +                profileSegments
                  +                List< HYPERLINK  \l "DATATYPE_RelativeProfileSegment" RelativeProfileSegment>
                  +                No
                  +                Set of RelativeProfileSegments.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: RelativeProfileSegment
                  +        
                  +        E4: A RelativeResourceSegment defines the time range and interpolation method for a set of RelativeProfileEntries.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                RelativeProfileSegment
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                308
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                interpolation
                  +                 HYPERLINK  \l "DATATYPE_InterpolationTypeEnum" InterpolationTypeEnum
                  +                Yes
                  +                Interpolation method to be applied for values lying between points defined in the relative profile segment. Default = Step.
                  +            
                  +            
                  +                start
                  +                Element
                  +                No
                  +                Relative start of time range covered by the relative profile segment.
                  +            
                  +            
                  +                end
                  +                Element
                  +                No
                  +                Relative end of time range covered by the relative profile segment.
                  +            
                  +            
                  +                startIncluded
                  +                Boolean
                  +                Yes
                  +                Indicates whether the start time is included in the relative profile segment. Default = True.
                  +            
                  +            
                  +                endIncluded
                  +                Boolean
                  +                Yes
                  +                Indicates whether the end time is included in the relative profile segment.  This allows the same time to be used as the end of one segment and the start of another. Default = False.
                  +            
                  +            
                  +                profileEntries
                  +                List< HYPERLINK  \l "DATATYPE_RelativeProfileEntry" RelativeProfileEntry>
                  +                No
                  +                Set of relative profile entries (resource value points).
                  +            
                  +        
                  +        
                  +            
                  +            Composite: RelativeProfileEntry
                  +        
                  +        E4: Defines the value (or minimum/maximum value) of a resource at a relative point in time. Specific subtypes exist for each allowed data type for a Resource.
                  +        These replace the variant type value field with one of concrete data type.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                RelativeProfileEntry
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                309
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                time
                  +                Element
                  +                No
                  +                Relative time of resource data point.
                  +            
                  +            
                  +                value
                  +                Attribute
                  +                No
                  +                Value of resource data point.  MAL Attribute type must match the dataType of the Resource definition.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ResourceUpdate
                  +        
                  +        E4: ResourceUpdate is a data structure that is used to report the value of a Resource at a given point in time in the context of the MPS Plan Execution Control service monitorPlanExecutionDetail operation, or to supply an updated value for a Resource in the context of the MPS Plan Edit service. Resource updates may be distributed to subscribing applications, including status displays, to inform them of the latest value of the Resource.
                  +        This may be particularly relevant in conjunction with a plan execution function.
                  +        Resource updates may be stored in resource history to provide a complete record of evolving value over time. Resource updates are also effectively contained within a Plan to describe the predicted evolution of Resources over the duration of that Plan.
                  +        However, in this context the ResourceProfile construct is used (see 4.5.4.4 above).
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ResourceUpdate
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_PlanDetailUpdate" PlanDetailUpdate
                  +            
                  +            
                  +                Short Form Part
                  +                310
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                resource
                  +                ObjectRef< HYPERLINK  \l "DATATYPE_Resource" Resource>
                  +                No
                  +                Reference to the Resource to which the value update relates.
                  +            
                  +            
                  +                timestamp
                  +                Time
                  +                No
                  +                Time of Resource value update.
                  +            
                  +            
                  +                value
                  +                Attribute
                  +                No
                  +                Value of the resource.  MAL Attribute type must match the dataType of the resource definition.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: RequestStatusUpdate
                  +        
                  +        E1: RequestStatusUpdate is a data structure that is used to report changes in status of the RequestInstance as it proceeds through both planning and plan execution functions.
                  +        Reporting is the responsibility of the planning function. Planning request status updates may be distributed to subscribing applications, including both Users and status displays, to inform them of the latest status of the planning request.
                  +        This may be particularly relevant in conjunction with a plan execution function.
                  +        Status updates may be stored in planning request history to provide a complete record of evolving status over time.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                RequestStatusUpdate
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                404
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                requestInstance
                  +                ObjectRef< HYPERLINK  \l "DATATYPE_RequestInstance" RequestInstance>
                  +                No
                  +                Reference to the planning request instance to which the status update relates.
                  +            
                  +            
                  +                timestamp
                  +                Time
                  +                No
                  +                Time of status update.
                  +            
                  +            
                  +                status
                  +                 HYPERLINK  \l "DATATYPE_RequestStatusEnum" RequestStatusEnum
                  +                No
                  +                Current status of the planning request.
                  +            
                  +            
                  +                outputPlanRefs
                  +                List<ObjectRef< HYPERLINK  \l "DATATYPE_Plan" Plan>>
                  +                Yes
                  +                Reference to the output Plan(s) that contains the activities resulting from the planning request.  Where multiple alternate plans have been generated, these may be listed here.  It should be noted that this is only available once the planning request has been processed and successfully planned.  The outputPlanRefs may be updated following iterative planning cycles or re-planning.
                  +            
                  +            
                  +                returnData
                  +                List<NamedValue>
                  +                Yes
                  +                Optional return data from the planning process, provided as a list of ID-Value pairs.  This can be used to provide additional information required by the User to interpret the planned operations.
                  +            
                  +            
                  +                statusInfo
                  +                String
                  +                Yes
                  +                StatusInfo provides the reason for termination and is customizable, but if the following conditions exist then the specified text shall be used: - Completed (all constituent activities completed successfully); - Expired (constituent activities expired prior to execution); - Failed (constituent activities failed during execution); - Deleted (constituent activities were deleted); - PartiallyCompleted. It may also be used to provide the reason for rejection.
                  +            
                  +            
                  +                errorCode
                  +                Integer
                  +                Yes
                  +                Error Code optional in the case of a failure status for the planning request (for example Terminated state with statusInfo Failed).  The codes are implementation specific.
                  +            
                  +            
                  +                errorInfo
                  +                String
                  +                Yes
                  +                Supplementary error information.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: PlanningRequestDetails
                  +        
                  +        E1: PlanningRequestDetails is a data structure used in the context of the MPS Planning Request service submitRequest and updateRequest operations, where the RequestInstance MO object cannot be used, because the full identity of the resulting RequestInstance is not yet known at the time of submitting or updating the request.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                PlanningRequestDetails
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                405
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                userReference
                  +                Identifier
                  +                No
                  +                User supplied reference for the planning request.  This is distinct from the identity of the RequestInstance that is assigned by the planning function.  No guarantees are made by the planning system about the contents of this identifier; that is entirely up to the user who supplies the reference.
                  +            
                  +            
                  +                definition
                  +                ObjectRef< HYPERLINK  \l "DATATYPE_RequestDefinition" RequestDefinition>
                  +                Yes
                  +                Reference to the RequestDefinition from which the RequestInstance was created, if a planning request template was used.
                  +            
                  +            
                  +                planningPeriod
                  +                Identifier
                  +                No
                  +                Specifies which planning period the planning request applies to.  Planning period IDs are mission specific, but can be used to indicate mission phase; planning cycle; or ‘semester’ in observatory missions.
                  +            
                  +            
                  +                validityTimes
                  +                List< HYPERLINK  \l "DATATYPE_TimeWindow" TimeWindow>
                  +                Yes
                  +                Validity period for the planning request, expressed as one or more time windows.  The planning request must be satisfied within this period. When multiple TimeWindows are provided, the planning request may be satisfied within any individual TimeWindow. If this field is null, no restriction is placed on the times between which this request must be planned.
                  +            
                  +            
                  +                validityEvents
                  +                List< HYPERLINK  \l "DATATYPE_EventWindow" EventWindow>
                  +                Yes
                  +                Validity period for the planning request, expressed as one or more event windows.  The planning request must be satisfied within this period. When multiple EventWindows are provided, the planning request may be satisfied within any individual EventWindow. If this field is null, no restriction is placed on any events between which this request must be planned.
                  +            
                  +            
                  +                timeSystem
                  +                Identifier
                  +                Yes
                  +                Specifies the time system used for all time fields within the planning request (see 4.4.1). If null, the default time system is used.
                  +            
                  +            
                  +                user
                  +                ObjectRef< HYPERLINK  \l "DATATYPE_PlanningUser" PlanningUser>
                  +                No
                  +                The User ID for the person or organization raising the planning request.
                  +            
                  +            
                  +                description
                  +                String
                  +                No
                  +                Description of the request.
                  +            
                  +            
                  +                arguments
                  +                List< HYPERLINK  \l "DATATYPE_Argument" Argument>
                  +                Yes
                  +                List of named argument values.  If created from a template planning request, this will include the arguments defined in the RequestDefinition.
                  +            
                  +            
                  +                standingOrder
                  +                Boolean
                  +                No
                  +                A flag that indicates whether the planning request is for a repetitive standing order (unbounded other than by the validity period), or is a one-off request.  If it is a standing order, then the supplied activity details must be an ActivityNode with specification of the repetition criteria.  It should be noted that a one-off request can still include repetition.
                  +            
                  +            
                  +                activities
                  +                List< HYPERLINK  \l "DATATYPE_ActivityDetails" ActivityDetails>
                  +                Yes
                  +                Set of activity details specifying requested activities.
                  +            
                  +            
                  +                inputPlanRef
                  +                ObjectRef< HYPERLINK  \l "DATATYPE_Plan" Plan>
                  +                Yes
                  +                Reference to an existing Plan (output of one planning function) submitted as a planning request to another planning function in the context of a distributed or hierarchical planning system. Only one of inputPlanRef and inputPlan should be present within the planning request.
                  +            
                  +            
                  +                inputPlan
                  +                 HYPERLINK  \l "DATATYPE_Plan" Plan
                  +                Yes
                  +                An existing Plan  (output of one planning function) submitted as a planning request to another planning function in the context of a distributed or hierarchical planning system.  The Plan is embedded within the planning request. Only one of inputPlanRef and inputPlan should be present within the planning request.
                  +            
                  +            
                  +                comments
                  +                String
                  +                Yes
                  +                Free text for any additional user comments about the request.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: PlanningRequestResponse
                  +        
                  +        E1: PlanningRequestResponse is a data structure used in the context of the MPS Planning Request service submitRequest and updateRequest operations, in response to the submitted PlanningRequestDetails defined above.
                  +        It contains a reference to the created RequestInstance and the supplied userReference to allow the user to correlate the two.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                PlanningRequestResponse
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                406
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                instance
                  +                ObjectRef< HYPERLINK  \l "DATATYPE_RequestInstance" RequestInstance>
                  +                No
                  +                Reference to the RequestInstance created in response to a submitRequest operation, or the updated version of the RequestInstance following an updateRequest operation.
                  +            
                  +            
                  +                userReference
                  +                Identifier
                  +                No
                  +                User supplied reference for the planning request.  This is distinct from the identity of the RequestInstance that is assigned by the planning function.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: RequestSummaryStatus
                  +        
                  +        E1: RequestSummaryStatus is a data structure used in the context of the MPS Planning Request service getRequestSummaries operation, where a list of these structures is returned.
                  +        It contains header fields of the planning request and its status, but not the request content (arguments, activities and constraints).
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                RequestSummaryStatus
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                407
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                requestInstance
                  +                ObjectRef< HYPERLINK  \l "DATATYPE_RequestInstance" RequestInstance>
                  +                No
                  +                Reference to the RequestInstance.
                  +            
                  +            
                  +                userReference
                  +                Identifier
                  +                Yes
                  +                Optional user supplied reference for the planning request.  This is distinct from the identity of the RequestInstance that is assigned by the planning function.
                  +            
                  +            
                  +                creationTime
                  +                Time
                  +                No
                  +                Creation date and time of the RequestInstance version.
                  +            
                  +            
                  +                definition
                  +                ObjectRef< HYPERLINK  \l "DATATYPE_RequestDefinition" RequestDefinition>
                  +                Yes
                  +                Reference to the RequestDefinition from which the RequestInstance was created, if a planning request template was used.
                  +            
                  +            
                  +                planningPeriod
                  +                Identifier
                  +                No
                  +                Specifies which planning period the planning request applies to.  Planning period IDs are mission specific, but can be used to indicate mission phase; planning cycle; or ‘semester’ in observatory missions.
                  +            
                  +            
                  +                validityTimes
                  +                List< HYPERLINK  \l "DATATYPE_TimeWindow" TimeWindow>
                  +                Yes
                  +                Validity period for the planning request, expressed as one or more time windows.  The planning request must be satisfied within this period. Only one of validityTime or validityEvent should be present in a planning request.
                  +            
                  +            
                  +                validityEvents
                  +                List< HYPERLINK  \l "DATATYPE_EventWindow" EventWindow>
                  +                Yes
                  +                Validity period for the planning request, expressed as one or more event windows.  The planning request must be satisfied within this period. Only one of validityTime or validityEvent should be present in a planning request.
                  +            
                  +            
                  +                user
                  +                ObjectRef< HYPERLINK  \l "DATATYPE_PlanningUser" PlanningUser>
                  +                No
                  +                The User ID for the person or organization raising the planning request.
                  +            
                  +            
                  +                description
                  +                String
                  +                No
                  +                Description of the request.
                  +            
                  +            
                  +                standingOrder
                  +                Boolean
                  +                No
                  +                A flag that indicates whether the planning request is for a repetitive standing order (unbounded other than by the validity period), or is a one-off request.
                  +            
                  +            
                  +                comments
                  +                String
                  +                Yes
                  +                Free text for any additional user comments about the request.
                  +            
                  +            
                  +                status
                  +                 HYPERLINK  \l "DATATYPE_RequestStatusEnum" RequestStatusEnum
                  +                No
                  +                Current status of the RequestInstance (see planning request state model in 4.5.5.2).
                  +            
                  +            
                  +                outputPlanRefs
                  +                List<ObjectRef< HYPERLINK  \l "DATATYPE_Plan" Plan>>
                  +                Yes
                  +                References to output Plan(s) that contains the activities resulting from the planning request.
                  +            
                  +            
                  +                statusInfo
                  +                String
                  +                Yes
                  +                StatusInfo provides the reason for termination and is customizable, but includes: - Completed (all constituent activities completed successfully); - Expired (constituent activities expired prior to execution); - Failed (constituent activities failed during execution); - Deleted (constituent activities were deleted); - PartiallyCompleted. It may also be used to provide the reason for rejection.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: RequestFilter
                  +        
                  +        E1: RequestFilter is a data structure used in the context of MPS Planning Request Service operations to specify a filtered set of planning requests.
                  +         NOTE – All fields are nullable and it is valid to specify a RequestFilter with no filter criteria; this corresponds to an open filter in which all available planning requests are returned.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                RequestFilter
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                408
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                domain
                  +                List<Identifier>
                  +                Yes
                  +                Domain of the RequestInstance.  An ordered list representing a domain hierarchy, ‘*’ can be used to represent a wildcard at that level.
                  +            
                  +            
                  +                instanceID
                  +                ObjectRef< HYPERLINK  \l "DATATYPE_RequestInstance" RequestInstance>
                  +                Yes
                  +                Reference to the RequestInstance.
                  +            
                  +            
                  +                creationTime
                  +                 HYPERLINK  \l "DATATYPE_TimeWindow" TimeWindow
                  +                Yes
                  +                Query for request instances with a creation date and time in the specified range.
                  +            
                  +            
                  +                definitionID
                  +                ObjectRef< HYPERLINK  \l "DATATYPE_RequestDefinition" RequestDefinition>
                  +                Yes
                  +                Reference to the RequestDefinition from which the RequestInstance was created.
                  +            
                  +            
                  +                userID
                  +                ObjectRef< HYPERLINK  \l "DATATYPE_PlanningUser" PlanningUser>
                  +                Yes
                  +                Reference of the User who initiated the RequestInstance.
                  +            
                  +            
                  +                userReference
                  +                Identifier
                  +                Yes
                  +                Reference supplied by User when submitting the RequestInstance.
                  +            
                  +            
                  +                status
                  +                 HYPERLINK  \l "DATATYPE_RequestStatusEnum" RequestStatusEnum
                  +                Yes
                  +                Current status (enum) of the RequestInstance.
                  +            
                  +            
                  +                outputPlanRefs
                  +                List<ObjectRef< HYPERLINK  \l "DATATYPE_Plan" Plan>>
                  +                Yes
                  +                Reference to the output Plan(s) generated in response to the RequestInstance.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: PlanInformation
                  +        
                  +        E1: The PlanInformation section of a plan contains administrative and validity details associated with the plan as a whole.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                PlanInformation
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                503
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                originator
                  +                Identifier
                  +                No
                  +                Identity of the entity or system responsible for the production of the plan.  The implementing planning system is responsible for defining the value to be provided for this field.
                  +            
                  +            
                  +                productionTime
                  +                Time
                  +                No
                  +                Date and time of production of the plan.
                  +            
                  +            
                  +                description
                  +                String
                  +                No
                  +                Description of the plan.
                  +            
                  +            
                  +                comments
                  +                String
                  +                Yes
                  +                Field for additional comments or notes to the operations team regarding the plan.
                  +            
                  +            
                  +                validityStart
                  +                Time
                  +                No
                  +                Start of validity period for the plan. The validity period defines when the plan is available for operational use.  It cannot be used outside its validity period.
                  +            
                  +            
                  +                validityEnd
                  +                Time
                  +                No
                  +                End of validity period for the plan.
                  +            
                  +            
                  +                planPeriodStart
                  +                 HYPERLINK  \l "DATATYPE_Trigger" Trigger
                  +                No
                  +                Start of the plan period. The plan period defines the start and end points of the plan.  Planned items (planning activities and events) contained within the plan must at least partially overlap the plan period.  The use of the trigger structure allows this to be specified in terms of time, position, pointing, or planning events.  Examples are: - a specified period of time; - an orbital repeat cycle; - a period between two events.
                  +            
                  +            
                  +                planPeriodEnd
                  +                 HYPERLINK  \l "DATATYPE_Trigger" Trigger
                  +                No
                  +                End of the plan period.
                  +            
                  +            
                  +                timeSystem
                  +                Identifier
                  +                Yes
                  +                Specifies the time system used for all time fields within the Plan (see 4.4.1). If Null, the default time system is used.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: PlannedItems
                  +        
                  +        E1: The PlannedItems section of the Plan specifies the set of planning activities and planning events contained within the Plan.
                  +        It comprises two lists of contained MO objects:
                  +        one of EventInstances and one of ActivityInstances.
                  +        Both lists can be empty.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                PlannedItems
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                504
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                plannedEvents
                  +                List< HYPERLINK  \l "DATATYPE_EventInstance" EventInstance>
                  +                Yes
                  +                List of planned events contained within the Plan.
                  +            
                  +            
                  +                plannedActivities
                  +                List< HYPERLINK  \l "DATATYPE_ActivityInstance" ActivityInstance>
                  +                Yes
                  +                List of planned activities contained within the Plan.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: PlanRevision
                  +        
                  +        E3: Each PlanRevision comprises an ordered set of ItemRevisions that document the change to individual planned items (planning events and activities).
                  +        Each ItemRevision references an individual EventInstance or ActivityInstance and indicates whether the planned item is new, modified or deleted in the current Plan.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                PlanRevision
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                505
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                revisedPlan
                  +                ObjectRef< HYPERLINK  \l "DATATYPE_Plan" Plan>
                  +                No
                  +                Reference to the Plan with respect to which the plan revisions are detailed.  Typically, this is the precursor Plan, but any other Plan can be used.
                  +            
                  +            
                  +                revisionStart
                  +                Time
                  +                No
                  +                Start time of the earliest revision.
                  +            
                  +            
                  +                revisionEnd
                  +                Time
                  +                No
                  +                End time of the latest revision.
                  +            
                  +            
                  +                itemRevisions
                  +                List< HYPERLINK  \l "DATATYPE_ItemRevision" ItemRevision>
                  +                Yes
                  +                Ordered list (earliest to latest) of revisions to planned items (activity and event instances).
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ItemRevision
                  +        
                  +        E3: An ItemRevision represents the changes that were made to a single planned item inside a revision.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ItemRevision
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                506
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                itemRef
                  +                ObjectRef<Element>
                  +                No
                  +                Object Type: ActivityInstance | EventInstance. Reference to a planned ActivityInstance or EventInstance that is new or modified in the current Plan, or has been deleted with respect to the referenced revisedPlan.
                  +            
                  +            
                  +                revisionStatus
                  +                 HYPERLINK  \l "DATATYPE_RevisionStatusEnum" RevisionStatusEnum
                  +                No
                  +                Revision status of the referenced item.  May be one of New, Modified, Deleted, or Undefined.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: PlanUpdate
                  +        
                  +        E1: PlanUpdate is a data structure that is used to report changes in status of the Plan as it proceeds through both planning and plan execution functions.
                  +        It is returned in the context of the MPS Plan Distribution service getPlanStatus and monitorPlanStatus operations, and also the MPS Plan Execution Control service monitorPlanExecution and getPlanStatus operations. PlanUpdates may be distributed to subscribing applications, including status displays, to inform them of the latest status of a Plan.
                  +        PlanUpdates may be stored in plan history to provide a complete record of evolving status over time.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                PlanUpdate
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                508
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                plan
                  +                ObjectRef< HYPERLINK  \l "DATATYPE_Plan" Plan>
                  +                No
                  +                Reference to the Plan to which the status update relates.
                  +            
                  +            
                  +                timestamp
                  +                Time
                  +                No
                  +                Time of status update.
                  +            
                  +            
                  +                isAlternate
                  +                Boolean
                  +                No
                  +                Flag indicating if the Plan has currently been released as an Operational or Alternate plan.
                  +            
                  +            
                  +                status
                  +                 HYPERLINK  \l "DATATYPE_PlanStatusEnum" PlanStatusEnum
                  +                No
                  +                Current status of the Plan.
                  +            
                  +            
                  +                statusInfo
                  +                String
                  +                Yes
                  +                Supplementary information for a Plan in the Terminated state.  This is customizable, but if the following conditions exist then the specified text shall be used: - Completed (nominal); - Superseded by a successor Plan; - Revoked by a User; - Cancelled (deactivated after start of execution); - Expired (reached the end of its validity period without being activated).
                  +            
                  +        
                  +        
                  +            
                  +            Composite: PlanSummaryStatus
                  +        
                  +        E1: PlanSummaryStatus is a data structure that provides a summary view of a Plan that includes the PlanInformation section and current status, but not the full details of the Plan.
                  +        It is returned in the context of the MPS Plan Distribution service getPlanSummaries operation.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                PlanSummaryStatus
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                509
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                plan
                  +                ObjectRef< HYPERLINK  \l "DATATYPE_Plan" Plan>
                  +                No
                  +                Reference to the Plan to which the summary status relates.
                  +            
                  +            
                  +                isPatchPlan
                  +                Boolean
                  +                No
                  +                Flag indicating if the Plan is a patch plan that only contains details of the changes from the precursor Plan.  A patch plan must have a precursor.  It must also include a single PlanRevision relative to the precursor Plan.
                  +            
                  +            
                  +                precursorPlan
                  +                ObjectRef< HYPERLINK  \l "DATATYPE_Plan" Plan>
                  +                Yes
                  +                Reference to a precursor (or predecessor) Plan from which the changes are detailed in the Plan.  This may be used if there is an iterative re-planning cycle in which successive plans overlap, or where a previous Plan has been updated through re-planning.  If there is no precursor, then the Plan must be a self-standing full plan. If the Plan is a Patch Plan, then a precursor plan must be specified.
                  +            
                  +            
                  +                targetPlan
                  +                ObjectRef< HYPERLINK  \l "DATATYPE_Plan" Plan>
                  +                Yes
                  +                Applicable only for patch plans, this is a reference to the target Plan.  This target Plan is the result of applying the patch plan to the precursor Plan and is distinct from the identity of the patch plan itself.  Patch plans are not permitted in the context of a planning request.
                  +            
                  +            
                  +                information
                  +                 HYPERLINK  \l "DATATYPE_PlanInformation" PlanInformation
                  +                No
                  +                Contains header information relating to the Plan, including its originator and validity period.
                  +            
                  +            
                  +                isAlternate
                  +                Boolean
                  +                No
                  +                Flag indicating if the Plan has currently been released as an Operational or Alternate plan.
                  +            
                  +            
                  +                status
                  +                 HYPERLINK  \l "DATATYPE_PlanStatusEnum" PlanStatusEnum
                  +                No
                  +                Current status of the Plan.
                  +            
                  +            
                  +                statusInfo
                  +                String
                  +                Yes
                  +                Supplementary information for a Plan in the Terminated state.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: PlanActivationStatus
                  +        
                  +        E1: PlanActivationStatus is a data structure that returns the activation status of a Plan in the context of the MPS Plan Execution Control service activatePlan and deactivatePlan operations.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                PlanActivationStatus
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                510
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                plan
                  +                ObjectRef< HYPERLINK  \l "DATATYPE_Plan" Plan>
                  +                No
                  +                Reference to the Plan to which the status relates.
                  +            
                  +            
                  +                status
                  +                 HYPERLINK  \l "DATATYPE_PlanStatusEnum" PlanStatusEnum
                  +                No
                  +                Current status of the Plan.
                  +            
                  +            
                  +                activationInfo
                  +                String
                  +                No
                  +                ActivationInfo provides customizable detailed information on the result of the activation/deactivation request for the referenced Plan. 
                  +            
                  +        
                  +        
                  +            
                  +            Composite: SubPlanUpdate
                  +        
                  +        E1: SubPlanUpdate is a data structure that is used to report changes in status of a sub-plan during plan execution.
                  +        It is returned in the context of the MPS Plan Execution Control service monitorSubPlanExecution and getSubPlanStatus operations. Sub-plans are not defined as objects within the MPS model.
                  +        Individual activities within a Plan may be associated with a single sub-plan via its Identifier.
                  +        The plan execution function is responsible for managing and reporting sub-plan status associated with relevant Plan Execution Control service operations, if supported.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                SubPlanUpdate
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                511
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                subPlan
                  +                Identifier
                  +                No
                  +                Identifier of the sub-plan to which the update relates.
                  +            
                  +            
                  +                timestamp
                  +                Time
                  +                No
                  +                Time of status update.
                  +            
                  +            
                  +                status
                  +                 HYPERLINK  \l "DATATYPE_SubPlanStatusEnum" SubPlanStatusEnum
                  +                No
                  +                Current status of the sub-plan, which may be Activated or Deactivated.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: SubPlanActivationStatus
                  +        
                  +        E1: SubPlanActivationStatus is a data structure that returns the activation status of a sub-plan in the context of the MPS Plan Execution Control service activateSubPlan and deactivateSubPlan operations.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                SubPlanActivationStatus
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                513
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                plan
                  +                Identifier
                  +                No
                  +                Identifier of the sub-plan to which the status relates.
                  +            
                  +            
                  +                status
                  +                 HYPERLINK  \l "DATATYPE_SubPlanStatusEnum" SubPlanStatusEnum
                  +                No
                  +                Current status of the sub-plan, which may be Activated or Deactivated.
                  +            
                  +            
                  +                activationInfo
                  +                String
                  +                No
                  +                ActivationInfo provides customizable detailed information on the result of the activation/deactivation request for the referenced sub-plan. 
                  +            
                  +        
                  +        
                  +            
                  +            Composite: PlanQuery
                  +        
                  +        E1: PlanQuery is a data structure used in the context of queryPlan operation of the MPS Plan Distribution Service.
                  +        It is used to specify search criteria for querying the available set of Plans. 
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                PlanQuery
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                514
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                planID
                  +                ObjectRef< HYPERLINK  \l "DATATYPE_Plan" Plan>
                  +                Yes
                  +                Query for Plans with the specified PlanID.
                  +            
                  +            
                  +                hasPrecursor
                  +                Boolean
                  +                Yes
                  +                Query for Plans with or without a precursor.
                  +            
                  +            
                  +                isPatchPlan
                  +                Boolean
                  +                Yes
                  +                Query for Plans that are or are not patch plans.
                  +            
                  +            
                  +                precursorPlan
                  +                ObjectRef< HYPERLINK  \l "DATATYPE_Plan" Plan>
                  +                Yes
                  +                Query for Plans with the specified precursor Plan.
                  +            
                  +            
                  +                targetPlan
                  +                ObjectRef< HYPERLINK  \l "DATATYPE_Plan" Plan>
                  +                Yes
                  +                Applicable only for patch plans.  Query for patch plans that have the specified target Plan.
                  +            
                  +            
                  +                originator
                  +                Identifier
                  +                Yes
                  +                Query for Plans with the specified originator.
                  +            
                  +            
                  +                productionTime
                  +                 HYPERLINK  \l "DATATYPE_TimeWindow" TimeWindow
                  +                Yes
                  +                Query for Plans with a production date in the specified range.
                  +            
                  +            
                  +                validityPeriod
                  +                 HYPERLINK  \l "DATATYPE_TimeWindow" TimeWindow
                  +                Yes
                  +                Query for Plans with a validity period within (overlapping with) the specified range.
                  +            
                  +            
                  +                isAlternate
                  +                Boolean
                  +                Yes
                  +                Query for Plans that are or are not Alternate plans.
                  +            
                  +            
                  +                status
                  +                List< HYPERLINK  \l "DATATYPE_PlanStatusEnum" PlanStatusEnum>
                  +                Yes
                  +                Query for Plans that have a current status matching one of the specified Plan statuses.
                  +            
                  +            
                  +                plannedEvents
                  +                List<ObjectRef< HYPERLINK  \l "DATATYPE_EventDefinition" EventDefinition>>
                  +                Yes
                  +                Query for Plans that contain EventInstances inside plannedItems whose definition matches one of the specified EventDefinitions.
                  +            
                  +            
                  +                plannedActivities
                  +                List<ObjectRef< HYPERLINK  \l "DATATYPE_ActivityDefinition" ActivityDefinition>>
                  +                Yes
                  +                Query for Plans that contain ActivityInstances inside plannedItems whose definition matches one of the specified ActivityDefinitions.
                  +            
                  +            
                  +                revisedEvents
                  +                List<ObjectRef< HYPERLINK  \l "DATATYPE_EventDefinition" EventDefinition>>
                  +                Yes
                  +                Query for patch plans that contain EventInstances inside their revisions whose definition matches one of the specified EventDefinitions. If the revisionStatus is either New or Modified, then the EventInstances in the current plan shall be checked.  If the revisionStatus is either Deleted or Undefined, then the EventInstances in the revised plan shall be checked.  If the revised plan is not available anymore, then the result will depend on the implementation.
                  +            
                  +            
                  +                revisedActivities
                  +                List<ObjectRef< HYPERLINK  \l "DATATYPE_ActivityDefinition" ActivityDefinition>>
                  +                Yes
                  +                Query for patch plans that contain ActivityInstances inside their revisions whose definition matches one of the specified ActivityDefinitions. If the revisionStatus is either New or Modified, then the ActivityInstances in the current plan shall be checked.  If the revisionStatus is either Deleted or Undefined, then the ActivityInstances in the revised plan shall be checked.  If the revised plan is not available anymore, then the result will depend on the implementation.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: PartialPlan
                  +        
                  +        E1: A PartialPlan is a data structure returned from the getPartialPlan operation of the Plan Distribution Service that contains a reference to the source Plan, the criteria used to select the partial plan, and the partial plan itself.
                  +        The partial plan uses the same structure as a normal Plan, with header fields matching those of the source Plan, but only containing the subset of ActivityInstances that matches the selection criteria.
                  +        Whether EventInstances and Resources are included is implementation specific, but it might be assumed that any events and resources related to the selected ActivityInstances would be included in the returned partial plan.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                PartialPlan
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                515
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                sourcePlan
                  +                ObjectRef< HYPERLINK  \l "DATATYPE_Plan" Plan>
                  +                No
                  +                Reference to the Plan of which the partial plan is a selected subset.
                  +            
                  +            
                  +                domain
                  +                List<Identifier>
                  +                Yes
                  +                Selection criterion based on the domain of contained ActivityInstances. An ordered list representing a domain hierarchy, ‘*’ can be used to represent a wildcard at that level.
                  +            
                  +            
                  +                subPlan
                  +                Identifier
                  +                Yes
                  +                Selection criterion based on the subPlan of contained ActivityInstances.
                  +            
                  +            
                  +                tags
                  +                List<String>
                  +                Yes
                  +                Selection criterion based on tags associated with contained ActivityInstances.
                  +            
                  +            
                  +                partialPlanStart
                  +                 HYPERLINK  \l "DATATYPE_Trigger" Trigger
                  +                Yes
                  +                Selection criterion indicating the start of a range of time, position, or events associated with contained ActivityInstances.
                  +            
                  +            
                  +                partialPlanEnd
                  +                 HYPERLINK  \l "DATATYPE_Trigger" Trigger
                  +                Yes
                  +                Selection criterion indicating the end of a range of time, position, or events associated with contained ActivityInstances.
                  +            
                  +            
                  +                partialPlan
                  +                 HYPERLINK  \l "DATATYPE_Plan" Plan
                  +                No
                  +                The returned partial plan.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: PlanFilter
                  +        
                  +        E1: PlanFilter is a data structure used in the context of MPS Plan Distribution Service operations to specify a filtered set of Plans.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                PlanFilter
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                516
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                domain
                  +                List<Identifier>
                  +                Yes
                  +                Domain of the Plan. An ordered list representing a domain hierarchy, ‘*’ can be used to represent a wildcard at that level.
                  +            
                  +            
                  +                planID
                  +                ObjectRef< HYPERLINK  \l "DATATYPE_Plan" Plan>
                  +                Yes
                  +                Reference to the Plan.
                  +            
                  +            
                  +                precursorPlan
                  +                ObjectRef< HYPERLINK  \l "DATATYPE_Plan" Plan>
                  +                Yes
                  +                Reference to the precursor Plan of the Plan.
                  +            
                  +            
                  +                status
                  +                 HYPERLINK  \l "DATATYPE_PlanStatusEnum" PlanStatusEnum
                  +                Yes
                  +                Current status (enum) of the Plan.
                  +            
                  +            
                  +                originator
                  +                Identifier
                  +                Yes
                  +                Originator of the Plan.
                  +            
                  +            
                  +                validityPeriod
                  +                 HYPERLINK  \l "DATATYPE_TimeWindow" TimeWindow
                  +                Yes
                  +                Period of time with which the validity period of the Plan overlaps.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: PartialPlanFilter
                  +        
                  +        E1: PartialPlanFilter is a data structure input to the getPartialPlan operation of the Plan Distribution Service that contains a reference to the source Plan, and specifies the criteria used to select the partial plan.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                PartialPlanFilter
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                517
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                sourcePlan
                  +                ObjectRef< HYPERLINK  \l "DATATYPE_Plan" Plan>
                  +                No
                  +                Reference to the Plan of which the partial plan is a selected subset.
                  +            
                  +            
                  +                domain
                  +                List<Identifier>
                  +                Yes
                  +                Selection criterion based on the domain of contained ActivityInstances. An ordered list representing a domain hierarchy, ‘*’ can be used to represent a wildcard at that level.
                  +            
                  +            
                  +                subPlan
                  +                Identifier
                  +                Yes
                  +                Selection criterion based on the subPlan of contained ActivityInstances.
                  +            
                  +            
                  +                tags
                  +                List<String>
                  +                Yes
                  +                Selection criterion based on tags associated with contained ActivityInstances
                  +            
                  +            
                  +                partialPlanStart
                  +                 HYPERLINK  \l "DATATYPE_Trigger" Trigger
                  +                Yes
                  +                Selection criterion indicating the start of a range of time, position, or events associated with contained ActivityInstances.  If no actual time is known for a Trigger, its predicted time may be used instead to derive the relevant range. 
                  +            
                  +            
                  +                partialPlanEnd
                  +                 HYPERLINK  \l "DATATYPE_Trigger" Trigger
                  +                Yes
                  +                Selection criterion indicating the end of a range of time, position, or events associated with contained ActivityInstances.  If no actual time is known for a Trigger, its predicted time may be used instead to derive the relevant range.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: FunctionDefinitionDetails
                  +        
                  +        E8: FunctionDefinitionDetails is a data structure that contains static configuration data relating to custom functions: built-in Boolean functions of an MPS system, each of which has a specified Identifier and optional set of argument definitions.
                  +        This may change over time, each comprising a separate version of the definition.
                  +        FunctionDefinitions form part of the planning configuration data.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                FunctionDefinitionDetails
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                701
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                functionID
                  +                Identifier
                  +                No
                  +                ID of the custom function.
                  +            
                  +            
                  +                version
                  +                UInteger
                  +                No
                  +                Version of the FunctionDefinition.
                  +            
                  +            
                  +                description
                  +                String
                  +                No
                  +                Description of the custom function.
                  +            
                  +            
                  +                argDefs
                  +                List< HYPERLINK  \l "DATATYPE_ArgDef" ArgDef>
                  +                Yes
                  +                List of argument definitions.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: FunctionDetails
                  +        
                  +        E8: Contains the information required to invoke a defined function, including the specification of argument values.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                FunctionDetails
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                702
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                functionID
                  +                Identifier
                  +                No
                  +                ID of a specific FunctionDefinition.
                  +            
                  +            
                  +                argSpecs
                  +                List< HYPERLINK  \l "DATATYPE_ArgSpec" ArgSpec>
                  +                Yes
                  +                Set of argument specifications for each argument definition contained in the referenced function definition.  These supply a value for each argument, or an expression to enable the value to be derived.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: NamedElement
                  +        
                  +        E1: The NamedElement composite represents a pair of a MAL::Identifier and an abstract MAL::Element.
                  +        It is an extension of the MAL::NamedValue composite that adds support for non-MAL::Attribute values.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                NamedElement
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                2
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                name
                  +                Identifier
                  +                No
                  +                Name identifying the element.
                  +            
                  +            
                  +                value
                  +                Element
                  +                Yes
                  +                Expression evaluating to the corresponding MAL::Element value. When used in a pointing constraint, then the MAL Element subtype must match the argument type of the corresponding pointing template argument (see 4.6.6.4.4 and table 4-6).
                  +            
                  +        
                  +        
                  +            
                  +            Composite: Slider
                  +        
                  +        E1: Used to indicate a relative position with respect to an MPS object, such as a planning activity where 0 represents the start and 1 the end of the activity.
                  +        The slider is a real number that can represent any point between these two extremes.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                Slider
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                3
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                position
                  +                Float
                  +                No
                  +                Relative point between the start and end of an MPS object, where 0 represents the start and 1 represents the end.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: StateDef
                  +        
                  +        E1: Status values may be represented as enumerated Integers, but the enumeration is not defined by the Recommended Standard, but in the context of planning configuration data.
                  +        StateDefs hold the definitions of the text labels associated with specific status values.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                StateDef
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                4
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                value
                  +                Integer
                  +                No
                  +                Enumerated value of the Status.
                  +            
                  +            
                  +                state
                  +                String
                  +                No
                  +                Text label associated with the enumerated value.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: TimeWindow
                  +        
                  +        E1: Represents a specific period of time, specified as two Expressions of type Time defining the start and end of the TimeWindow.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                TimeWindow
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                5
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                start
                  +                Element
                  +                No
                  +                Start time of the time window.
                  +            
                  +            
                  +                end
                  +                Element
                  +                No
                  +                End time of the time window.  Shall not be earlier in time than the start of the time window.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: EventWindow
                  +        
                  +        E1: Represents a specific period relative to two events that mark the start and end of the EventWindow.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                EventWindow
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                6
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                startEvent
                  +                Element
                  +                No
                  +                The start of the event window is relative to the referenced startEvent.
                  +            
                  +            
                  +                startOffset
                  +                Element
                  +                Yes
                  +                The start of the event window is offset by the defined time period from the startEvent.  A positive offset implies a shift later in time. Default is no offset.
                  +            
                  +            
                  +                endEvent
                  +                Element
                  +                No
                  +                The end of the event window is relative to the referenced endEvent.
                  +            
                  +            
                  +                endOffset
                  +                Element
                  +                Yes
                  +                The end of the event window is offset by the defined time period from the endEvent.  A positive offset implies a shift later in time. Default is no offset.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: DefListEntry
                  +        
                  +        E1: Used in the context of the MPS Plan Information Management service, this holds a list of definitions for a specified type of MPS service object, together with their definitions.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                DefListEntry
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                7
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                definitionID
                  +                ObjectRef<Element>
                  +                No
                  +                Object Type: ActivityDefinition | EventDefinition | Resource | RequestDefinition. Reference to an Item.
                  +            
                  +            
                  +                description
                  +                String
                  +                No
                  +                Description of the item.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: Position
                  +        
                  +        E6: Abstract type that represents a unique position in three-dimensional space.
                  +        Depending on the concrete subtype used, the actual position may be derived in different manners.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                Position
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Abstract
                  +            
                  +        
                  +        
                  +            
                  +            Composite: CartesianPosition
                  +        
                  +        E6: Concrete type representing a Position in Cartesian coordinates.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                CartesianPosition
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_Position" Position
                  +            
                  +            
                  +                Short Form Part
                  +                8
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                x
                  +                Double
                  +                No
                  +                Cartesian x coordinate defined in the given frame and with value of the given unit.
                  +            
                  +            
                  +                y
                  +                Double
                  +                No
                  +                Cartesian y coordinate defined in the given frame and with value of the given unit.
                  +            
                  +            
                  +                z
                  +                Double
                  +                No
                  +                Cartesian z coordinate defined in the given frame and with value of the given unit.
                  +            
                  +            
                  +                frame
                  +                Identifier
                  +                No
                  +                Reference frame within which the position is expressed (see 4.4.2).
                  +            
                  +            
                  +                units
                  +                String
                  +                Yes
                  +                The units for the quantity of distance. Default = ‘km’.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: SurfacePosition
                  +        
                  +        E6: A SurfacePosition is typically used to specify a coordinate on the surface of a celestial body.
                  +        Optionally, an altitude above the surface may also be specified.
                  +        The reference ellipsoid used to define the surface may be mission specific.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                SurfacePosition
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_Position" Position
                  +            
                  +            
                  +                Short Form Part
                  +                9
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                longitude
                  +                Double
                  +                No
                  +                Angular coordinate.  May also represent azimuth.
                  +            
                  +            
                  +                latitude
                  +                Double
                  +                No
                  +                Angular coordinate.  May also represent elevation.
                  +            
                  +            
                  +                frame
                  +                Identifier
                  +                No
                  +                Reference frame used to determine the origin and orientation of the reference ellipsoid.  Must be a celestial body reference frame (see 4.4.2).
                  +            
                  +            
                  +                units
                  +                String
                  +                Yes
                  +                The units for the quantity of angle, in which to express the longitude and latitude. Default = ‘deg’.
                  +            
                  +            
                  +                altitude
                  +                Double
                  +                Yes
                  +                Altitude above a reference ellipsoid (negative values allowed). Default = 0.
                  +            
                  +            
                  +                altitudeUnits
                  +                String
                  +                Yes
                  +                The units for the quantity of altitude. Default = ‘m’.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: OrbitFilePosition
                  +        
                  +        E6: An OrbitFilePosition represents a Position that is defined with respect to some Orbit Data Message (ODM) file (reference [D10]).
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                OrbitFilePosition
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_Position" Position
                  +            
                  +            
                  +                Short Form Part
                  +                10
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                orbitFile
                  +                File
                  +                No
                  +                Name of or reference to a file containing an ODM.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: OrbitalPosition
                  +        
                  +        E6: An OrbitalPosition represents a Position that is defined with respect to some mission specific orbit.
                  +        The conventions used to derive the orbitNumber and orbitAngle follow from a mission specific definition.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                OrbitalPosition
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_Position" Position
                  +            
                  +            
                  +                Short Form Part
                  +                11
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                orbitNumber
                  +                Integer
                  +                No
                  +                Orbit number.  Depending on the relativeOrbit flag, the orbit number may be absolute (since start of mission) or relative (to the orbital repeat cycle).
                  +            
                  +            
                  +                relativeOrbit
                  +                Boolean
                  +                No
                  +                Flag indicating if the orbit number is absolute or relative to the orbital repeat cycle.
                  +            
                  +            
                  +                orbitAngle
                  +                 HYPERLINK  \l "DATATYPE_Angle" Angle
                  +                No
                  +                Angle within orbit.  Whether this angle is the mean or true anomaly and from which datum it is measured are mission specific.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ObjectPosition
                  +        
                  +        E6: An ObjectPosition is a Position that coincides with the position of an existing object.
                  +        The manner in which the planning system derives the value of this Position from the name of the referenced object is implementation-defined.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ObjectPosition
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_Position" Position
                  +            
                  +            
                  +                Short Form Part
                  +                12
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                object
                  +                Identifier
                  +                No
                  +                Name or identifier of a catalogued celestial object or a mission specific object.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: PositionReference
                  +        
                  +        E6: A PositionReference is a Position that is evaluated based on a given reference position.
                  +        The manner in which the Position is computed by the planning system based on this reference may be mission specific.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                PositionReference
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_Position" Position
                  +            
                  +            
                  +                Short Form Part
                  +                13
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                reference
                  +                Identifier
                  +                No
                  +                Name of a mission specific position definition.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: Direction
                  +        
                  +        E6: Abstract type that represents a unique direction in three-dimensional space.
                  +        The actual manner in which this direction is evaluated depends on the concrete subtype used.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                Direction
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Abstract
                  +            
                  +        
                  +        
                  +            
                  +            Composite: CartesianDirection
                  +        
                  +        E6: Dimensionless unit vector.
                  +        Either a direction in the base frame or in a secondary frame may be defined.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                CartesianDirection
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_Direction" Direction
                  +            
                  +            
                  +                Short Form Part
                  +                14
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                x
                  +                Double
                  +                No
                  +                Cartesian x coordinate defined in the given frame.
                  +            
                  +            
                  +                y
                  +                Double
                  +                No
                  +                Cartesian y coordinate defined in the given frame.
                  +            
                  +            
                  +                z
                  +                Double
                  +                No
                  +                Cartesian z coordinate defined in the given frame.
                  +            
                  +            
                  +                frame
                  +                Identifier
                  +                No
                  +                Reference frame within which the direction is expressed (see 4.4.2).
                  +            
                  +        
                  +        
                  +            
                  +            Composite: SphericalDirection
                  +        
                  +        E6: Typically used to define a direction in a secondary frame.
                  +        When used to specify a surface coordinate, this actually represents a {longitude, latitude} pair.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                SphericalDirection
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_Direction" Direction
                  +            
                  +            
                  +                Short Form Part
                  +                15
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                azimuth
                  +                 HYPERLINK  \l "DATATYPE_Angle" Angle
                  +                No
                  +                Angular coordinate.  May also represent longitude.
                  +            
                  +            
                  +                elevation
                  +                 HYPERLINK  \l "DATATYPE_Angle" Angle
                  +                No
                  +                Angular coordinate.  May also represent latitude.
                  +            
                  +            
                  +                frame
                  +                Identifier
                  +                No
                  +                Reference frame within which the direction is expressed.  Must be a celestial body or spacecraft reference frame (see 4.4.2).
                  +            
                  +        
                  +        
                  +            
                  +            Composite: RADecDirection
                  +        
                  +        E6: Represents a Direction based on celestial angular coordinates of right ascension and declination.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                RADecDirection
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_Direction" Direction
                  +            
                  +            
                  +                Short Form Part
                  +                16
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                ra
                  +                 HYPERLINK  \l "DATATYPE_Angle" Angle
                  +                No
                  +                Right Ascension: Celestial angular coordinate, measured eastward along the celestial equator.
                  +            
                  +            
                  +                dec
                  +                 HYPERLINK  \l "DATATYPE_Angle" Angle
                  +                No
                  +                Declination: Celestial angular coordinate, north or south of the celestial equator.
                  +            
                  +            
                  +                frame
                  +                Identifier
                  +                No
                  +                Reference frame within which the direction is expressed.  Must be a quasi-inertial celestial body or orbit-related frame (see 4.4.2).
                  +            
                  +        
                  +        
                  +            
                  +            Composite: NamedTargetDirection
                  +        
                  +        E6: A NamedTargetDirection is a Direction that points to an existing object.
                  +        The manner in which the planning system derives the value of this Direction from the name of the referenced object is implementation-defined.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                NamedTargetDirection
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_Direction" Direction
                  +            
                  +            
                  +                Short Form Part
                  +                17
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                namedTarget
                  +                Identifier
                  +                No
                  +                Name or identifier of a catalogued celestial object or a mission specific object (see 4.4.3).
                  +            
                  +        
                  +        
                  +            
                  +            Composite: DirectionReference
                  +        
                  +        E6: A DirectionReference is a Direction that may be computed following some mission specific definition.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                DirectionReference
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_Direction" Direction
                  +            
                  +            
                  +                Short Form Part
                  +                18
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                reference
                  +                Identifier
                  +                No
                  +                Name of a mission specific direction definition.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: PhysicalValue
                  +        
                  +        E6: PhysicalValue is an abstract base type for the specific value types defined below.
                  +        Only specific value types are used in the pointing constraint definitions below.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                PhysicalValue
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Abstract
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                value
                  +                Double
                  +                No
                  +                Physical value.
                  +            
                  +            
                  +                units
                  +                String
                  +                Yes
                  +                Optional units.  The units for a single quantity.  The unit type depends on the specific value type.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: Angle
                  +        
                  +        E6: Physical value with units of type Angle.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                Angle
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_PhysicalValue" PhysicalValue
                  +            
                  +            
                  +                Short Form Part
                  +                19
                  +            
                  +        
                  +        
                  +            
                  +            Composite: AngularVelocity
                  +        
                  +        E6: Physical value with units of type AngularVelocity.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                AngularVelocity
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_PhysicalValue" PhysicalValue
                  +            
                  +            
                  +                Short Form Part
                  +                20
                  +            
                  +        
                  +        
                  +            
                  +            Composite: Distance
                  +        
                  +        E6: Physical value with units of type Distance.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                Distance
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_PhysicalValue" PhysicalValue
                  +            
                  +            
                  +                Short Form Part
                  +                21
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ExternalExpression
                  +        
                  +        E1: When the MPS data types are not sufficiently expressive, it is possible to provide an external expression that evaluates into a given data type, using the ExternalExpression data type.
                  +        These external expressions are themselves text strings in some external language. The manner in which this expression is evaluated is implementation specific.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ExternalExpression
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                22
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                type
                  +                 HYPERLINK  \l "DATATYPE_ArgTypeEnum" ArgTypeEnum
                  +                No
                  +                Enumeration specifying the data type of the result of the expression.
                  +            
                  +            
                  +                expressionLanguage
                  +                String
                  +                No
                  +                Defines the expression language used to specify the expression.
                  +            
                  +            
                  +                expression
                  +                String
                  +                No
                  +                The text of the expression.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ArgDef
                  +        
                  +        E1: The definition of an argument is an ArgDef, a set of which may be contained within the definition MO object of a planning event, planning activity, or planning request.
                  +        This defines the name and data type of the argument.
                  +        Depending on the data type, the ArgDef may require additional type specific fields to support data validation.  Subtypes are identified for Numeric, String, and Status arguments.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ArgDef
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                23
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                argName
                  +                Identifier
                  +                No
                  +                Name of the argument.
                  +            
                  +            
                  +                description
                  +                String
                  +                No
                  +                Extended description of the argument.
                  +            
                  +            
                  +                argType
                  +                 HYPERLINK  \l "DATATYPE_ArgTypeEnum" ArgTypeEnum
                  +                No
                  +                Enumeration specifying the data type of the argument.
                  +            
                  +            
                  +                argUnits
                  +                String
                  +                Yes
                  +                The units of a single quantity, in which the argument value is expressed in.
                  +            
                  +            
                  +                isArray
                  +                Boolean
                  +                No
                  +                If True, indicates that the argument is an array of values of type ArgTypeEnum.
                  +            
                  +            
                  +                validationData
                  +                 HYPERLINK  \l "DATATYPE_ValidationDetails" ValidationDetails
                  +                Yes
                  +                Optional.  Specifies the allowed range of values for the Argument, with concrete subtypes specific to the data type of the Argument.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: Argument
                  +        
                  +        E1: The instance of an argument is an Argument, a set of which may be contained within the instance MO object of a planning event or planning activity or within a planning request.
                  +        This comprises the name and value of the argument, corresponding to the set of arguments defined in the ArgDef.
                  +        Argument values are represented as a MAL Element of appropriate data type.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                Argument
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                24
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                argName
                  +                Identifier
                  +                No
                  +                Name of the argument.
                  +            
                  +            
                  +                argValues
                  +                List<Element>
                  +                No
                  +                Argument value (or values if it is an array).  The MAL Element subtype(s) must match the argument type supplied in the corresponding ArgDef.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ArgSpec
                  +        
                  +        E1: In the case of the planning activity, there is also an ArgSpec, a set of which may be contained within the ActivityDetails structure embedded within a planning request or parent planning activity definition.
                  +        The ArgSpec defines how to derive the value of an Argument when instantiating it at run-time.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ArgSpec
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                25
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                argName
                  +                Identifier
                  +                No
                  +                Name of the argument.
                  +            
                  +            
                  +                argSpecValues
                  +                List<Element>
                  +                No
                  +                Expression that can be evaluated at run-time to provide argument value(s) of appropriate.  The MAL Element subtype(s) must match the argument type supplied in the corresponding ArgDef.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ValidationDetails
                  +        
                  +        E1: Abstract type that is used to represent an allowed range of values for a given Argument or Resource.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ValidationDetails
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Abstract
                  +            
                  +        
                  +        
                  +            
                  +            Composite: NumericRange
                  +        
                  +        E1: Concrete sub-type of ValidationDetails that provides additional fields to support data validation for numeric data types.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                NumericRange
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_ValidationDetails" ValidationDetails
                  +            
                  +            
                  +                Short Form Part
                  +                26
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                min
                  +                Double
                  +                Yes
                  +                Minimum value of the argument; if omitted, no minimum value is considered.
                  +            
                  +            
                  +                max
                  +                Double
                  +                Yes
                  +                Maximum value of the argument; if omitted, no maximum value is considered.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: StringPattern
                  +        
                  +        E1: Concrete sub-type of ValidationDetails that provides additional fields to support data validation for the string data type.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                StringPattern
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_ValidationDetails" ValidationDetails
                  +            
                  +            
                  +                Short Form Part
                  +                27
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                maxLength
                  +                UInteger
                  +                Yes
                  +                Maximum length of the string (characters).  If omitted, no maximum length is enforced.
                  +            
                  +            
                  +                regex
                  +                String
                  +                Yes
                  +                A ‘regular expression’ or sequence of characters defining a character pattern that the string value must match.  If omitted, all character sequences are permitted. The choice of ‘regular expression’ specification to follow is implementation-specific.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: StatusValues
                  +        
                  +        E1: Concrete sub-type of ValidationDetails that provides additional fields to support data validation and interpretation for integer type arguments that are effectively enumerated Statuses.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                StatusValues
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_ValidationDetails" ValidationDetails
                  +            
                  +            
                  +                Short Form Part
                  +                28
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                allowedValues
                  +                List< HYPERLINK  \l "DATATYPE_StateDef" StateDef>
                  +                No
                  +                Set of allowed State definitions (see 4.6.2.4.2), comprising the enumerated value and an associated text label.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: Constraint
                  +        
                  +        E1: Abstract type representing a planning constraint, a Boolean condition which restricts the planning of planning activities.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                Constraint
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Abstract
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                negate
                  +                Boolean
                  +                Yes
                  +                Specifies whether the result of combining the Constraints is to be inverted (NOT function). Default = False.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ConstraintNode
                  +        
                  +        E1: Multiple planning constraints can be combined using a ConstraintNode.
                  +        The ConstraintNode specifies the logical operation (AND or OR) to be used when combining a set of constraints together.
                  +        As the ConstraintNode is itself defined as a sub-type of Constraint, it is possible to construct a tree of ConstraintNodes using different logical operators.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ConstraintNode
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_Constraint" Constraint
                  +            
                  +            
                  +                Short Form Part
                  +                29
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                negate
                  +                Boolean
                  +                Yes
                  +                Specifies whether the result of combining the Constraints is to be inverted (NOT function). Default = False.
                  +            
                  +            
                  +                operator
                  +                 HYPERLINK  \l "DATATYPE_LogicOpEnum" LogicOpEnum
                  +                Yes
                  +                Enumeration specifying the logic for combining multiple Boolean conditions together.  One of {AND, OR}. Default = AND.
                  +            
                  +            
                  +                constraints
                  +                List< HYPERLINK  \l "DATATYPE_Constraint" Constraint>
                  +                No
                  +                The set of Constraints to be combined.  Must contain at least one element.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ConstraintExpression
                  +        
                  +        E1: All types of constraint can be considered conditions that are either met or not met when a planning activity is placed in a Plan.
                  +        They can therefore be specified as a potentially complex Boolean expression that combines references to the arguments and fields of objects in the MPS information model using operators of various types (arithmetic, comparative, logical, string, temporal, and geometric).
                  +        The expression must evaluate to True for the constraint to be met. As introduced in 1.2, this Recommended Standard does not define a full expression language capable of supporting such complex Boolean expressions.
                  +        It does, however, support the use of externally defined expression languages.
                  +        The ConstraintExpression type allows for the use of such an expression language to define any type of constraint, providing communicating entities all have the capability to evaluate that expression language.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ConstraintExpression
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_Constraint" Constraint
                  +            
                  +            
                  +                Short Form Part
                  +                31
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                negate
                  +                Boolean
                  +                Yes
                  +                Specifies whether the result of combining the Constraints is to be inverted (NOT function). Default = False.
                  +            
                  +            
                  +                constraint
                  +                Element
                  +                No
                  +                Potentially complex conditional expression that must evaluate to True for the constraint to be met.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: TimeConstraint
                  +        
                  +        E2: The time at which a planning activity must be planned.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                TimeConstraint
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_Constraint" Constraint
                  +            
                  +            
                  +                Short Form Part
                  +                32
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                negate
                  +                Boolean
                  +                Yes
                  +                Specifies whether the result of combining the Constraints is to be inverted (NOT function). Default = False.
                  +            
                  +            
                  +                time
                  +                Element
                  +                No
                  +                The time at which the planning activity must be planned.
                  +            
                  +            
                  +                timeRef
                  +                 HYPERLINK  \l "DATATYPE_Slider" Slider
                  +                No
                  +                The point in the duration of the planning activity that is time constrained. 0:  the start of the planning activity. 1:  the end of the planning activity.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: TimeWindowConstraint
                  +        
                  +        E2: A time window within which the planning activity is to be planned.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                TimeWindowConstraint
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_Constraint" Constraint
                  +            
                  +            
                  +                Short Form Part
                  +                33
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                negate
                  +                Boolean
                  +                Yes
                  +                Specifies whether the result of combining the Constraints is to be inverted (NOT function). Default = False.
                  +            
                  +            
                  +                startRef
                  +                 HYPERLINK  \l "DATATYPE_Slider" Slider
                  +                Yes
                  +                The point in the duration of the activity that is constrained to be after the start time of the time window.  Although typically the start of the activity (0), this can be any point up to the end of the activity (1). Default is the start of the planning activity.
                  +            
                  +            
                  +                endRef
                  +                 HYPERLINK  \l "DATATYPE_Slider" Slider
                  +                Yes
                  +                The point in the duration of the activity that is constrained to be before the end time of the time window.  Although typically the end of the activity (1), this can be any point up to the start of the activity (0). Default is the end of the planning activity.
                  +            
                  +            
                  +                timeWindows
                  +                List< HYPERLINK  \l "DATATYPE_TimeWindow" TimeWindow>
                  +                No
                  +                The [set of] TimeWindows within which the activity must be placed on the Plan.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: DurationConstraint
                  +        
                  +        E2: A DurationConstraint restricts the duration of a planning activity within the plan.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                DurationConstraint
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_Constraint" Constraint
                  +            
                  +            
                  +                Short Form Part
                  +                34
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                negate
                  +                Boolean
                  +                Yes
                  +                Specifies whether the result of combining the Constraints is to be inverted (NOT function). Default = False.
                  +            
                  +            
                  +                minDuration
                  +                Element
                  +                Yes
                  +                Specifies the minimum duration of the planning activity. If omitted, a value of 0 is used.
                  +            
                  +            
                  +                maxDuration
                  +                Element
                  +                Yes
                  +                Specifies the maximum duration of the planning activity. If omitted, the maximum representable MAL::Duration value is assumed.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ArgumentConstraint
                  +        
                  +        E5: An argument constraint may be associated with a planning activity to restrict when it can be planned, based on the value of an argument of the planning activity itself or a related planning activity or event.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ArgumentConstraint
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_Constraint" Constraint
                  +            
                  +            
                  +                Short Form Part
                  +                35
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                negate
                  +                Boolean
                  +                Yes
                  +                Specifies whether the result of combining the Constraints is to be inverted (NOT function). Default = False.
                  +            
                  +            
                  +                objectRef
                  +                Element
                  +                Yes
                  +                Object Type: ActivityDefinition | EventDefinition Specifies the definition (class) of the planning activity or planning event whose argument is to be referenced.  If omitted the activity containing the constraint is assumed.
                  +            
                  +            
                  +                argName
                  +                Identifier
                  +                No
                  +                Identifies the specific argument of the referenced Object whose value is to be compared
                  +            
                  +            
                  +                comparator
                  +                 HYPERLINK  \l "DATATYPE_ExpressionOperatorEnum" ExpressionOperatorEnum
                  +                No
                  +                Comparison operator, which may be one of: =, !=, >, >=, <, <=, contains, icontains The contains operator only applies to strings and may be case sensitive or insensitive.
                  +            
                  +            
                  +                value
                  +                Element
                  +                No
                  +                Value to be compared against.  The MAL Element subtype must match the argument type supplied in the corresponding ArgDef of the given Argument.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ResourceConstraint
                  +        
                  +        E5: ResourceConstraint is an abstract type that represents a constraint expressed in terms of the value of a given Resource.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ResourceConstraint
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_Constraint" Constraint
                  +            
                  +            
                  +                Abstract
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                negate
                  +                Boolean
                  +                Yes
                  +                Specifies whether the result of combining the Constraints is to be inverted (NOT function). Default = False.
                  +            
                  +            
                  +                resourceRef
                  +                ObjectRef< HYPERLINK  \l "DATATYPE_Resource" Resource>
                  +                No
                  +                Identifies the planning resource that is constrained for the duration of the planning activity.
                  +            
                  +            
                  +                comparator
                  +                 HYPERLINK  \l "DATATYPE_ExpressionOperatorEnum" ExpressionOperatorEnum
                  +                No
                  +                Comparison operator, which may be one of: =, !=, >, >=, <, <=, contains, icontains. The contains operator only applies to strings and may be case sensitive or insensitive.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: SimpleResourceConstraint
                  +        
                  +        E5: The simple resource constraint must be satisfied for the duration of the planning activity to which the constraint applies.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                SimpleResourceConstraint
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_ResourceConstraint" ResourceConstraint
                  +            
                  +            
                  +                Short Form Part
                  +                37
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                negate
                  +                Boolean
                  +                Yes
                  +                Specifies whether the result of combining the Constraints is to be inverted (NOT function). Default = False.
                  +            
                  +            
                  +                resourceRef
                  +                ObjectRef< HYPERLINK  \l "DATATYPE_Resource" Resource>
                  +                No
                  +                Identifies the planning resource that is constrained for the duration of the planning activity.
                  +            
                  +            
                  +                comparator
                  +                 HYPERLINK  \l "DATATYPE_ExpressionOperatorEnum" ExpressionOperatorEnum
                  +                No
                  +                Comparison operator, which may be one of: =, !=, >, >=, <, <=, contains, icontains. The contains operator only applies to strings and may be case sensitive or insensitive.
                  +            
                  +            
                  +                value
                  +                Attribute
                  +                No
                  +                Value (of same type as the referenced Resource) to be compared against.  MAL Attribute type must match the dataType of the Resource definition.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ComplexResourceConstraint
                  +        
                  +        E5: In the [simple] resource constraint, the value of the referenced planning resource is constrained against a single value for the entire duration of the planning activity to which the constraint applies. With the complex resource constraint, the period over which the constraint applies can be customized relative to the planning activity to which the constraint applies; and the value against which the referenced planning resource is constrained can be specified as a relative resource profile which evolves over time. The fields of the complex resource constraint extend or modify those of the [simple] resource constraint as given below.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ComplexResourceConstraint
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_ResourceConstraint" ResourceConstraint
                  +            
                  +            
                  +                Short Form Part
                  +                38
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                negate
                  +                Boolean
                  +                Yes
                  +                Specifies whether the result of combining the Constraints is to be inverted (NOT function). Default = False.
                  +            
                  +            
                  +                resourceRef
                  +                ObjectRef< HYPERLINK  \l "DATATYPE_Resource" Resource>
                  +                No
                  +                Identifies the planning resource that is constrained for the duration of the planning activity.
                  +            
                  +            
                  +                comparator
                  +                 HYPERLINK  \l "DATATYPE_ExpressionOperatorEnum" ExpressionOperatorEnum
                  +                No
                  +                Comparison operator, which may be one of: =, !=, >, >=, <, <=, contains, icontains. The contains operator only applies to strings and may be case sensitive or insensitive.
                  +            
                  +            
                  +                startRef
                  +                 HYPERLINK  \l "DATATYPE_Slider" Slider
                  +                Yes
                  +                Identifies the point in the duration of the applicable planning activity to which the start of the constraint period relates. Default is the start of the planning activity.
                  +            
                  +            
                  +                endRef
                  +                 HYPERLINK  \l "DATATYPE_Slider" Slider
                  +                Yes
                  +                Identifies the point in the duration of the applicable planning activity to which the end of the constraint period relates. Default is the end of the planning activity.
                  +            
                  +            
                  +                startOffset
                  +                Element
                  +                Yes
                  +                Offset from startRef that specifies the start of the constraint period.  A positive offset implies a shift later in time. Default is no offset.
                  +            
                  +            
                  +                endOffset
                  +                Element
                  +                Yes
                  +                Offset from endRef that specifies the end of the constraint period.  A positive offset implies a shift later in time. Default is no offset.
                  +            
                  +            
                  +                valueProfile
                  +                 HYPERLINK  \l "DATATYPE_RelativeResourceProfile" RelativeResourceProfile
                  +                No
                  +                ResourceProfile specifying an evolving value over time against which the value of the planning resource is to be compared (see 4.5.4.4).
                  +            
                  +        
                  +        
                  +            
                  +            Composite: GeometricConstraint
                  +        
                  +        E7: Geometric constraints restrict the planning of the planning activity by imposing a geometric condition that must be valid during some constraint period.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                GeometricConstraint
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_Constraint" Constraint
                  +            
                  +            
                  +                Abstract
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                negate
                  +                Boolean
                  +                Yes
                  +                Specifies whether the result of combining the Constraints is to be inverted (NOT function). Default = False.
                  +            
                  +            
                  +                startRef
                  +                 HYPERLINK  \l "DATATYPE_Slider" Slider
                  +                Yes
                  +                Identifies the point in the duration of the applicable planning activity to which the start of the constraint period relates. Default is the start of the planning activity.
                  +            
                  +            
                  +                endRef
                  +                 HYPERLINK  \l "DATATYPE_Slider" Slider
                  +                Yes
                  +                Identifies the point in the duration of the applicable planning activity to which the end of the constraint period relates. Default is the end of the planning activity.
                  +            
                  +            
                  +                startOffset
                  +                Element
                  +                Yes
                  +                Offset from startRef that specifies the start of the constraint period.  A positive offset implies a shift later in time. Default is no offset.
                  +            
                  +            
                  +                endOffset
                  +                Element
                  +                Yes
                  +                Offset from endRef that specifies the end of the constraint period.  A positive offset implies a shift later in time. Default is no offset.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: PositionConstraint
                  +        
                  +        E7: Sub-type of geometric constraint expressed in terms of a specified Position and a tolerance.
                  +        The tolerance is defined as a sphere around the specified position, expressed as a distance or angle.
                  +        It should be noted that the position itself can be expressed using any of the concrete position subtypes, including orbital and surface positions.
                  +        The use of a constraint expressed by OrbitalPosition is particularly relevant for Earth observation satellites with a repetitive ground track and on-board position-based planning function.
                  +        The position can also be specified as an expression.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                PositionConstraint
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_GeometricConstraint" GeometricConstraint
                  +            
                  +            
                  +                Short Form Part
                  +                39
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                negate
                  +                Boolean
                  +                Yes
                  +                Specifies whether the result of combining the Constraints is to be inverted (NOT function). Default = False.
                  +            
                  +            
                  +                startRef
                  +                 HYPERLINK  \l "DATATYPE_Slider" Slider
                  +                Yes
                  +                Identifies the point in the duration of the applicable planning activity to which the start of the constraint period relates. Default is the start of the planning activity.
                  +            
                  +            
                  +                endRef
                  +                 HYPERLINK  \l "DATATYPE_Slider" Slider
                  +                Yes
                  +                Identifies the point in the duration of the applicable planning activity to which the end of the constraint period relates. Default is the end of the planning activity.
                  +            
                  +            
                  +                startOffset
                  +                Element
                  +                Yes
                  +                Offset from startRef that specifies the start of the constraint period.  A positive offset implies a shift later in time. Default is no offset.
                  +            
                  +            
                  +                endOffset
                  +                Element
                  +                Yes
                  +                Offset from endRef that specifies the end of the constraint period.  A positive offset implies a shift later in time. Default is no offset.
                  +            
                  +            
                  +                position
                  +                Element
                  +                No
                  +                Specifies the required position expressed using any concrete position type.
                  +            
                  +            
                  +                tolerance
                  +                Element
                  +                No
                  +                Specifies the maximum distance or angle from the required position that satisfies the constraint, effectively defining a sphere around the required position.  The PhysicalValue shall be of type Distance or Angle (in case of an OrbitalPosition).
                  +            
                  +        
                  +        
                  +            
                  +            Composite: EllipsoidalPositionConstraint
                  +        
                  +        E7: Geometric constraint that specifies a Position with a tolerance given in terms of a frame-aligned ellipsoid.
                  +        The frame within which this tolerance ellipsoid is expressed may be different from the frame in which the required position is expressed.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                EllipsoidalPositionConstraint
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_GeometricConstraint" GeometricConstraint
                  +            
                  +            
                  +                Short Form Part
                  +                40
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                negate
                  +                Boolean
                  +                Yes
                  +                Specifies whether the result of combining the Constraints is to be inverted (NOT function). Default = False.
                  +            
                  +            
                  +                startRef
                  +                 HYPERLINK  \l "DATATYPE_Slider" Slider
                  +                Yes
                  +                Identifies the point in the duration of the applicable planning activity to which the start of the constraint period relates. Default is the start of the planning activity.
                  +            
                  +            
                  +                endRef
                  +                 HYPERLINK  \l "DATATYPE_Slider" Slider
                  +                Yes
                  +                Identifies the point in the duration of the applicable planning activity to which the end of the constraint period relates. Default is the end of the planning activity.
                  +            
                  +            
                  +                startOffset
                  +                Element
                  +                Yes
                  +                Offset from startRef that specifies the start of the constraint period.  A positive offset implies a shift later in time. Default is no offset.
                  +            
                  +            
                  +                endOffset
                  +                Element
                  +                Yes
                  +                Offset from endRef that specifies the end of the constraint period.  A positive offset implies a shift later in time. Default is no offset.
                  +            
                  +            
                  +                position
                  +                Element
                  +                No
                  +                Specifies the required position expressed using any concrete position type.
                  +            
                  +            
                  +                x
                  +                Element
                  +                No
                  +                Length of the ellipsoid axis that is aligned with the x axis of the specified frame.
                  +            
                  +            
                  +                y
                  +                Element
                  +                No
                  +                Length of the ellipsoid axis that is aligned with the y axis of the specified frame.
                  +            
                  +            
                  +                z
                  +                Element
                  +                No
                  +                Length of the ellipsoid axis that is aligned with the z axis of the specified frame.
                  +            
                  +            
                  +                frame
                  +                Identifier
                  +                No
                  +                Reference frame with which the axes of the tolerance ellipsoid are aligned (see 4.4.2).
                  +            
                  +            
                  +                units
                  +                String
                  +                Yes
                  +                Optional.  The tolerance units name, either for the quantity of distance or the quantity of angle. Default = ‘km’, but ‘deg’ is more relevant for an OrbitalPosition.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: PointingConstraint
                  +        
                  +        E7: Pointing constraints impose a restriction on a planning activity appearing in a Plan, based on the pointing direction of a physical object, such as a spacecraft or instrument. As with the Direction data types (see 4.6.3.3), pointing constraints are consistent with the pointing templates defined for use within CCSDS Navigation data format Recommended Standards, and specifically the Pointing Request Message (PRM) (reference [10]).
                  +        PointingConstraint is a concrete sub-type of GeometricConstraint that includes fields common to all pointing templates.
                  +        The pointing template itself is then identified as a field and any additional arguments applicable to the template are provided as a list of name-value pairs. NOTE – Pointing templates are common, generic templates that describe pointing modes that may be followed by spacecraft.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                PointingConstraint
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_GeometricConstraint" GeometricConstraint
                  +            
                  +            
                  +                Short Form Part
                  +                41
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                negate
                  +                Boolean
                  +                Yes
                  +                Specifies whether the result of combining the Constraints is to be inverted (NOT function). Default = False.
                  +            
                  +            
                  +                startRef
                  +                 HYPERLINK  \l "DATATYPE_Slider" Slider
                  +                Yes
                  +                Identifies the point in the duration of the applicable planning activity to which the start of the constraint period relates. Default is the start of the planning activity.
                  +            
                  +            
                  +                endRef
                  +                 HYPERLINK  \l "DATATYPE_Slider" Slider
                  +                Yes
                  +                Identifies the point in the duration of the applicable planning activity to which the end of the constraint period relates. Default is the end of the planning activity.
                  +            
                  +            
                  +                startOffset
                  +                Element
                  +                Yes
                  +                Offset from startRef that specifies the start of the constraint period.  A positive offset implies a shift later in time. Default is no offset.
                  +            
                  +            
                  +                endOffset
                  +                Element
                  +                Yes
                  +                Offset from endRef that specifies the end of the constraint period.  A positive offset implies a shift later in time. Default is no offset.
                  +            
                  +            
                  +                pointingFrame
                  +                Identifier
                  +                Yes
                  +                Optional.  Reference frame to which the pointing constraint applies (see 4.4.2). Default frame is the spacecraft frame or any other mission specific default frame.
                  +            
                  +            
                  +                boresight
                  +                Element
                  +                No
                  +                The primary axis to which the pointing constraints applies.  Direction in any spacecraft frame.
                  +            
                  +            
                  +                boresightMargin
                  +                Element
                  +                Yes
                  +                Defines an optional cone region around the boresight, allowing a margin for application of the pointing constraint. Default = 0.0.
                  +            
                  +            
                  +                phaseAngleMargin
                  +                Element
                  +                Yes
                  +                Defines an optional rotation around the boresight with respect to the default phase angle, allowing a margin for application of the pointing constraint. Default = 0.0.
                  +            
                  +            
                  +                unconstrainedPhaseAngle
                  +                Boolean
                  +                Yes
                  +                If True, no constraint will apply to the phaseAngle.  The phaseAngleMargin field will be ignored in this case. Default = False.
                  +            
                  +            
                  +                pointingTemplate
                  +                Identifier
                  +                No
                  +                One of the pointing templates defined in the PRM or a mission specific pointing template (see 4.4.4).
                  +            
                  +            
                  +                pointingArguments
                  +                List< HYPERLINK  \l "DATATYPE_NamedElement" NamedElement>
                  +                Yes
                  +                The argument list shall be consistent with the referenced template by name.  Each value type shall match the argument type according to table 4-6.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: RevolutionConstraint
                  +        
                  +        E7: Specifies a range of revolution angles for a rotating spacecraft.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                RevolutionConstraint
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_GeometricConstraint" GeometricConstraint
                  +            
                  +            
                  +                Short Form Part
                  +                42
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                negate
                  +                Boolean
                  +                Yes
                  +                Specifies whether the result of combining the Constraints is to be inverted (NOT function). Default = False.
                  +            
                  +            
                  +                startRef
                  +                 HYPERLINK  \l "DATATYPE_Slider" Slider
                  +                Yes
                  +                Identifies the point in the duration of the applicable planning activity to which the start of the constraint period relates. Default is the start of the planning activity.
                  +            
                  +            
                  +                endRef
                  +                 HYPERLINK  \l "DATATYPE_Slider" Slider
                  +                Yes
                  +                Identifies the point in the duration of the applicable planning activity to which the end of the constraint period relates. Default is the end of the planning activity.
                  +            
                  +            
                  +                startOffset
                  +                Element
                  +                Yes
                  +                Offset from startRef that specifies the start of the constraint period.  A positive offset implies a shift later in time. Default is no offset.
                  +            
                  +            
                  +                endOffset
                  +                Element
                  +                Yes
                  +                Offset from endRef that specifies the end of the constraint period.  A positive offset implies a shift later in time. Default is no offset.
                  +            
                  +            
                  +                revolutionAngle
                  +                Element
                  +                No
                  +                Angle of revolution.
                  +            
                  +            
                  +                tolerance
                  +                Element
                  +                No
                  +                Tolerance in the angle of revolution.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: DistanceConstraint
                  +        
                  +        E7: Specifies a range of distances between two physical objects (the observer and the target).
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                DistanceConstraint
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_GeometricConstraint" GeometricConstraint
                  +            
                  +            
                  +                Short Form Part
                  +                43
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                negate
                  +                Boolean
                  +                Yes
                  +                Specifies whether the result of combining the Constraints is to be inverted (NOT function). Default = False.
                  +            
                  +            
                  +                startRef
                  +                 HYPERLINK  \l "DATATYPE_Slider" Slider
                  +                Yes
                  +                Identifies the point in the duration of the applicable planning activity to which the start of the constraint period relates. Default is the start of the planning activity.
                  +            
                  +            
                  +                endRef
                  +                 HYPERLINK  \l "DATATYPE_Slider" Slider
                  +                Yes
                  +                Identifies the point in the duration of the applicable planning activity to which the end of the constraint period relates. Default is the end of the planning activity.
                  +            
                  +            
                  +                startOffset
                  +                Element
                  +                Yes
                  +                Offset from startRef that specifies the start of the constraint period.  A positive offset implies a shift later in time. Default is no offset.
                  +            
                  +            
                  +                endOffset
                  +                Element
                  +                Yes
                  +                Offset from endRef that specifies the end of the constraint period.  A positive offset implies a shift later in time. Default is no offset.
                  +            
                  +            
                  +                observer
                  +                Element
                  +                No
                  +                Position of the observer [Object1].
                  +            
                  +            
                  +                target
                  +                Element
                  +                No
                  +                Position of the target [Object2].
                  +            
                  +            
                  +                minDistance
                  +                Element
                  +                No
                  +                Minimum distance between observer and target.
                  +            
                  +            
                  +                maxDistance
                  +                Element
                  +                No
                  +                Maximum distance between observer and target.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: AngleConstraint
                  +        
                  +        E7: Specifies a range of values for the angle subtended between three physical objects.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                AngleConstraint
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_GeometricConstraint" GeometricConstraint
                  +            
                  +            
                  +                Short Form Part
                  +                44
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                negate
                  +                Boolean
                  +                Yes
                  +                Specifies whether the result of combining the Constraints is to be inverted (NOT function). Default = False.
                  +            
                  +            
                  +                startRef
                  +                 HYPERLINK  \l "DATATYPE_Slider" Slider
                  +                Yes
                  +                Identifies the point in the duration of the applicable planning activity to which the start of the constraint period relates. Default is the start of the planning activity.
                  +            
                  +            
                  +                endRef
                  +                 HYPERLINK  \l "DATATYPE_Slider" Slider
                  +                Yes
                  +                Identifies the point in the duration of the applicable planning activity to which the end of the constraint period relates. Default is the end of the planning activity.
                  +            
                  +            
                  +                startOffset
                  +                Element
                  +                Yes
                  +                Offset from startRef that specifies the start of the constraint period.  A positive offset implies a shift later in time. Default is no offset.
                  +            
                  +            
                  +                endOffset
                  +                Element
                  +                Yes
                  +                Offset from endRef that specifies the end of the constraint period.  A positive offset implies a shift later in time. Default is no offset.
                  +            
                  +            
                  +                centerObject
                  +                Element
                  +                No
                  +                Position of the center object.
                  +            
                  +            
                  +                targetObject1
                  +                Element
                  +                No
                  +                Position of target object 1.
                  +            
                  +            
                  +                targetObject2
                  +                Element
                  +                No
                  +                Position of target object 2.
                  +            
                  +            
                  +                minAngle
                  +                Element
                  +                No
                  +                Minimum angle subtended at the center object by target objects 1 and 2.
                  +            
                  +            
                  +                maxAngle
                  +                Element
                  +                No
                  +                Maximum angle subtended at the center object by target objects 1 and 2.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: SequentialConstraint
                  +        
                  +        E2: Sequential constraints impose a restriction on the order of planning activities in a Plan with respect to other planning activities and planning events. Two objects are identified: the parent activity and its opponent.
                  +        The parent activity is the activity for which the constraint is defined.
                  +        The opponent may be either a planning activity or a planning event and must be placed in the Plan relative to the parent activity.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                SequentialConstraint
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_Constraint" Constraint
                  +            
                  +            
                  +                Short Form Part
                  +                45
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                negate
                  +                Boolean
                  +                Yes
                  +                Specifies whether the result of combining the Constraints is to be inverted (NOT function). Default = False.
                  +            
                  +            
                  +                opponent
                  +                Element
                  +                No
                  +                Object Type: ActivityDefinition | EventDefinition Specifies the definition (class) of the opponent planning activity or planning event.
                  +            
                  +            
                  +                parentRef
                  +                 HYPERLINK  \l "DATATYPE_Slider" Slider
                  +                Yes
                  +                Point on the parent activity that must be followed by the opponent. Default = 1.
                  +            
                  +            
                  +                opponentRef
                  +                 HYPERLINK  \l "DATATYPE_Slider" Slider
                  +                Yes
                  +                Point on the opponent that must follow the parent activity.  This field will be ignored in case the opponent is a planning event. Default = 0.
                  +            
                  +            
                  +                minOffset
                  +                Element
                  +                Yes
                  +                Minimum offset between the specified points on the parent activity and the opponent. Default is no offset.
                  +            
                  +            
                  +                maxOffset
                  +                Element
                  +                Yes
                  +                Maximum offset between the specified points on the parent activity and the opponent. Default is no offset.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: SeparationConstraint
                  +        
                  +        E2: A separation constraint specifies that the parent planning activity (the activity for which the constraint is defined) must be separate in time from another planning activity or planning event, the opponent.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                SeparationConstraint
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_Constraint" Constraint
                  +            
                  +            
                  +                Short Form Part
                  +                46
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                negate
                  +                Boolean
                  +                Yes
                  +                Specifies whether the result of combining the Constraints is to be inverted (NOT function). Default = False.
                  +            
                  +            
                  +                opponent
                  +                Element
                  +                No
                  +                Object Type: ActivityDefinition | EventDefinition Specifies the definition (class) of the opponent planning activity or planning event.
                  +            
                  +            
                  +                startRef
                  +                 HYPERLINK  \l "DATATYPE_Slider" Slider
                  +                Yes
                  +                Identifies the point in the duration of the parent activity with respect to which to place the start of its constraint window. Default = 0.
                  +            
                  +            
                  +                startOffset
                  +                Element
                  +                Yes
                  +                Offset with respect to startRef of the start of the parent activity constraint window.  A positive offset implies a shift later in time. Default is no offset.
                  +            
                  +            
                  +                endRef
                  +                 HYPERLINK  \l "DATATYPE_Slider" Slider
                  +                Yes
                  +                Identifies the point in the duration of the parent activity with respect to which to place the end of its constraint window. Default = 1.
                  +            
                  +            
                  +                endOffset
                  +                Element
                  +                Yes
                  +                Offset with respect to endRef of the end of the parent activity constraint window.  A positive offset implies a shift later in time. Default is no offset.
                  +            
                  +            
                  +                opponentStartRef
                  +                 HYPERLINK  \l "DATATYPE_Slider" Slider
                  +                Yes
                  +                Identifies the point in the duration of the opponent with respect to which to place the start of its constraint window.  This field will be ignored in case the opponent is a planning event. Default = 0.
                  +            
                  +            
                  +                opponentStartOffset
                  +                Element
                  +                Yes
                  +                Offset with respect to opponentStartRef of the start of the opponent constraint window.  A positive offset implies a shift later in time. Default is no offset.
                  +            
                  +            
                  +                opponentEndRef
                  +                 HYPERLINK  \l "DATATYPE_Slider" Slider
                  +                Yes
                  +                Identifies the point in the duration of the opponent with respect to which to place the end of its constraint window.  This field will be ignored in case the opponent is a planning event. Default = 1.
                  +            
                  +            
                  +                opponentEndOffset
                  +                Element
                  +                Yes
                  +                Offset with respect to opponentEndRef of the end of the opponent constraint window.  A positive offset implies a shift later in time. Default is no offset.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: FunctionConstraint
                  +        
                  +        E8: Function constraints make use of an external custom function to determine whether or not a constraint is satisfied.
                  +        The function must return True for the constraint to be met. As for complex resource constraints, the period over which the function constraint applies is specified relative to the planning activity to which the constraint applies.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                FunctionConstraint
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_Constraint" Constraint
                  +            
                  +            
                  +                Short Form Part
                  +                47
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                negate
                  +                Boolean
                  +                Yes
                  +                Specifies whether the result of combining the Constraints is to be inverted (NOT function). Default = False.
                  +            
                  +            
                  +                startRef
                  +                 HYPERLINK  \l "DATATYPE_Slider" Slider
                  +                Yes
                  +                Identifies the point in the duration of the applicable planning activity to which the start of the constraint period relates. Default is the start of the planning activity.
                  +            
                  +            
                  +                endRef
                  +                 HYPERLINK  \l "DATATYPE_Slider" Slider
                  +                Yes
                  +                Identifies the point in the duration of the applicable planning activity to which the end of the constraint period relates. Default is the end of the planning activity.
                  +            
                  +            
                  +                startOffset
                  +                Element
                  +                Yes
                  +                Offset from startRef that specifies the start of the constraint period.  A positive offset implies a shift later in time. Default is no offset.
                  +            
                  +            
                  +                endOffset
                  +                Element
                  +                Yes
                  +                Offset from endRef that specifies the end of the constraint period.  A positive offset implies a shift later in time. Default is no offset.
                  +            
                  +            
                  +                function
                  +                 HYPERLINK  \l "DATATYPE_FunctionDetails" FunctionDetails
                  +                No
                  +                Specifies the Function to be applied and its set of input arguments.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: Effect
                  +        
                  +        E5: An Effect is an abstract type that may be used to represent the impact that executing a planning activity will have on a planning resource.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                Effect
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Abstract
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                resourceRef
                  +                ObjectRef< HYPERLINK  \l "DATATYPE_Resource" Resource>
                  +                No
                  +                Identifies the planning resource that is constrained for the duration of the planning activity.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: SimpleEffect
                  +        
                  +        E5: A simple effect applies the defined operation on the specified planning resource at the time relative to the planning activity defined by (timeRef + timeOffset).
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                SimpleEffect
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_Effect" Effect
                  +            
                  +            
                  +                Short Form Part
                  +                48
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                resourceRef
                  +                ObjectRef< HYPERLINK  \l "DATATYPE_Resource" Resource>
                  +                No
                  +                Identifies the planning resource that is constrained for the duration of the planning activity.
                  +            
                  +            
                  +                timeRef
                  +                 HYPERLINK  \l "DATATYPE_Slider" Slider
                  +                No
                  +                The point in the duration of the planning activity to which the time of the Effect is relative. 0:  the start of the planning activity 1:  the end of the planning activity
                  +            
                  +            
                  +                timeOffset
                  +                Element
                  +                Yes
                  +                Offset from timeRef that specifies the time at which the Effect is to be applied. Default is no offset.
                  +            
                  +            
                  +                operator
                  +                 HYPERLINK  \l "DATATYPE_EffectOperationEnum" EffectOperationEnum
                  +                No
                  +                Operation to be performed on the planning resource.  One of: SET, INCREASE, DECREASE. Increase and decrease are only applicable to numeric data types.
                  +            
                  +            
                  +                value
                  +                Attribute
                  +                No
                  +                The value that the planning resource is to be set to if the Effect operator is SET; or to be increased or decreased by if it is INCREASE or DECREASE. MAL Attribute type must match the dataType of the Resource definition.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ComplexEffect
                  +        
                  +        E5: In the simple effect, the value of the impacted planning resource is set to the specified value at a single point in time. With the complex effect, the value of the impacted planning resource can be evolved over a specified time period in accordance with a defined RelativeResourceProfile.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ComplexEffect
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_Effect" Effect
                  +            
                  +            
                  +                Short Form Part
                  +                50
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                resourceRef
                  +                ObjectRef< HYPERLINK  \l "DATATYPE_Resource" Resource>
                  +                No
                  +                Identifies the planning resource that is constrained for the duration of the planning activity.
                  +            
                  +            
                  +                startRef
                  +                 HYPERLINK  \l "DATATYPE_Slider" Slider
                  +                Yes
                  +                Identifies the point in the duration of the applicable planning activity to which the start of the effect period relates. Default is the start of the planning activity.
                  +            
                  +            
                  +                endRef
                  +                 HYPERLINK  \l "DATATYPE_Slider" Slider
                  +                Yes
                  +                Identifies the point in the duration of the applicable planning activity to which the end of the effect period relates. Default is the end of the planning activity.
                  +            
                  +            
                  +                startOffset
                  +                Element
                  +                Yes
                  +                Offset from startRef that specifies the start of the effect period.  A positive offset implies a shift later in time. Default is no offset.
                  +            
                  +            
                  +                endOffset
                  +                Element
                  +                Yes
                  +                Offset from endRef that specifies the end of the effect period.  A positive offset implies a shift later in time. Default is no offset.
                  +            
                  +            
                  +                operator
                  +                 HYPERLINK  \l "DATATYPE_EffectOperationEnum" EffectOperationEnum
                  +                No
                  +                Operation to be performed on the planning resource.  One of: SET, INCREASE, DECREASE. Increase and decrease are only applicable to numeric data types.
                  +            
                  +            
                  +                valueProfile
                  +                 HYPERLINK  \l "DATATYPE_RelativeResourceProfile" RelativeResourceProfile
                  +                No
                  +                Resource profile specifying an evolving value to which the value of the planning resource is to be set if the Effect operator is SET; or to be increased/decreased by if it is INCREASE or DECREASE (see 4.5.4.4).
                  +            
                  +        
                  +        
                  +            
                  +            Composite: Trigger
                  +        
                  +        E1: All sub-classes of Trigger include the time at which they are predicted to occur (in advance of execution); and, where applicable, the time at which they actually occurred (post execution).
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                Trigger
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Abstract
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                time
                  +                Time
                  +                No
                  +                Predicted or actual time of Trigger.  The predicted time may evolve during the planning process up to the time of execution.  The actual time is only available post execution, and hence can only be provided by a plan execution function.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: TimeTrigger
                  +        
                  +        E1: Sub-type of Trigger based on time.
                  +        The trigger time is the specified constraint, and will usually match the predicted time on the base class during the planning process, but the actual time could still be slightly different post-execution.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                TimeTrigger
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_Trigger" Trigger
                  +            
                  +            
                  +                Short Form Part
                  +                51
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                time
                  +                Time
                  +                No
                  +                Predicted or actual time of Trigger.  The predicted time may evolve during the planning process up to the time of execution.  The actual time is only available post execution, and hence can only be provided by a plan execution function.
                  +            
                  +            
                  +                triggerTime
                  +                Time
                  +                No
                  +                Planned time of Trigger.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: PositionTrigger
                  +        
                  +        E6: Sub-type of Trigger based on position.
                  +        Depending on the coordinate type of position used, a margin may be specified in terms of distance from the specified position.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                PositionTrigger
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_Trigger" Trigger
                  +            
                  +            
                  +                Short Form Part
                  +                52
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                time
                  +                Time
                  +                No
                  +                Predicted or actual time of Trigger.  The predicted time may evolve during the planning process up to the time of execution.  The actual time is only available post execution, and hence can only be provided by a plan execution function.
                  +            
                  +            
                  +                triggerPosition
                  +                 HYPERLINK  \l "DATATYPE_Position" Position
                  +                No
                  +                Planned position of Trigger.
                  +            
                  +            
                  +                distanceMargin
                  +                 HYPERLINK  \l "DATATYPE_Distance" Distance
                  +                Yes
                  +                Defines a sphere around the trigger position within which a position is considered to meet the trigger condition.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: DirectionTrigger
                  +        
                  +        E6: Sub-type of Trigger based on pointing.
                  +        Depending on the coordinate type of direction used, a margin may be specified in terms of angle from the specified direction.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                DirectionTrigger
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_Trigger" Trigger
                  +            
                  +            
                  +                Short Form Part
                  +                53
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                time
                  +                Time
                  +                No
                  +                Predicted or actual time of Trigger.  The predicted time may evolve during the planning process up to the time of execution.  The actual time is only available post execution, and hence can only be provided by a plan execution function.
                  +            
                  +            
                  +                triggerDirection
                  +                 HYPERLINK  \l "DATATYPE_Direction" Direction
                  +                No
                  +                Planned direction of Trigger.
                  +            
                  +            
                  +                angleMargin
                  +                 HYPERLINK  \l "DATATYPE_Angle" Angle
                  +                Yes
                  +                Defines a cone around the trigger direction within which a direction is considered to meet the trigger condition.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: AngleTrigger
                  +        
                  +        E6: Sub-type of Trigger based on the angle subtended between three physical objects.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                AngleTrigger
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_Trigger" Trigger
                  +            
                  +            
                  +                Short Form Part
                  +                54
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                time
                  +                Time
                  +                No
                  +                Predicted or actual time of Trigger.  The predicted time may evolve during the planning process up to the time of execution.  The actual time is only available post execution, and hence can only be provided by a plan execution function.
                  +            
                  +            
                  +                centerObject
                  +                 HYPERLINK  \l "DATATYPE_Position" Position
                  +                No
                  +                Position of the center object.  The trigger angle is that subtended at the center object by target objects 1 and 2.
                  +            
                  +            
                  +                targetObject1
                  +                 HYPERLINK  \l "DATATYPE_Position" Position
                  +                No
                  +                Position of target object 1.
                  +            
                  +            
                  +                targetObject2
                  +                 HYPERLINK  \l "DATATYPE_Position" Position
                  +                No
                  +                Position of target object 2.
                  +            
                  +            
                  +                minAngle
                  +                 HYPERLINK  \l "DATATYPE_Angle" Angle
                  +                No
                  +                Minimum angle subtended at the center object by target objects 1 and 2.
                  +            
                  +            
                  +                maxAngle
                  +                 HYPERLINK  \l "DATATYPE_Angle" Angle
                  +                No
                  +                Maximum angle subtended at the center object by target objects 1 and 2.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: EventTrigger
                  +        
                  +        E1: Sub-type of Trigger based on planning event.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                EventTrigger
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_Trigger" Trigger
                  +            
                  +            
                  +                Short Form Part
                  +                55
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                time
                  +                Time
                  +                No
                  +                Predicted or actual time of Trigger.  The predicted time may evolve during the planning process up to the time of execution.  The actual time is only available post execution, and hence can only be provided by a plan execution function.
                  +            
                  +            
                  +                triggerEvent
                  +                ObjectRef< HYPERLINK  \l "DATATYPE_EventInstance" EventInstance>
                  +                No
                  +                Reference to an EventInstance
                  +            
                  +            
                  +                timeOffset
                  +                Duration
                  +                No
                  +                Time offset from the EventInstance
                  +            
                  +        
                  +        
                  +            
                  +            Composite: Repetition
                  +        
                  +        E1: A repetition is used to specify the repeated instantiation of a [set of] planning activities.
                  +        Multiple subtypes of Repetition are defined to support the specification of repeat cycles by different criteria.
                  +        It can be used in the context of a planning request to specify a standing order for repeated execution of the [set of] planning activities. In the context of an ActivityNode embedded within a planning request (see 4.5.2.3.2), it is possible to nest one Repetition inside another, enabling the specification of complex repetitive sequences of activities.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                Repetition
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Abstract
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                count
                  +                Integer
                  +                Yes
                  +                Maximum number of repeat cycles/instances. If not specified there is no limit to the number of repetitions.
                  +            
                  +            
                  +                timeWindow
                  +                 HYPERLINK  \l "DATATYPE_TimeWindow" TimeWindow
                  +                Yes
                  +                Time period over which the repetition is applicable. If not specified repetition continues indefinitely.
                  +            
                  +            
                  +                separationType
                  +                 HYPERLINK  \l "DATATYPE_SeparationTypeEnum" SeparationTypeEnum
                  +                No
                  +                Specifies whether the repetition interval is Relative to the previous occurrence, or Absolute for all occurrences.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: PositionRepetition
                  +        
                  +        E6: A sub-type of Repetition that starts at a given Position and repeats based on separation from each subsequent occurrence.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                PositionRepetition
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_Repetition" Repetition
                  +            
                  +            
                  +                Short Form Part
                  +                57
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                count
                  +                Integer
                  +                Yes
                  +                Maximum number of repeat cycles/instances. If not specified there is no limit to the number of repetitions.
                  +            
                  +            
                  +                timeWindow
                  +                 HYPERLINK  \l "DATATYPE_TimeWindow" TimeWindow
                  +                Yes
                  +                Time period over which the repetition is applicable. If not specified repetition continues indefinitely.
                  +            
                  +            
                  +                separationType
                  +                 HYPERLINK  \l "DATATYPE_SeparationTypeEnum" SeparationTypeEnum
                  +                No
                  +                Specifies whether the repetition interval is Relative to the previous occurrence, or Absolute for all occurrences.
                  +            
                  +            
                  +                initialPosition
                  +                Element
                  +                No
                  +                Nominal position of first occurrence.
                  +            
                  +            
                  +                repetitionDirection
                  +                Element
                  +                No
                  +                Direction of repetition.
                  +            
                  +            
                  +                separation
                  +                Element
                  +                No
                  +                The required Distance between occurrences.
                  +            
                  +            
                  +                tolerance
                  +                Element
                  +                No
                  +                The allowed tolerance (+/-) in the required distance between occurrences, the interpretation of which is dependent on the separationType.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: OrbitRepetition
                  +        
                  +        E6: A sub-type of Repetition based on the orbital cycle.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                OrbitRepetition
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_Repetition" Repetition
                  +            
                  +            
                  +                Short Form Part
                  +                58
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                count
                  +                Integer
                  +                Yes
                  +                Maximum number of repeat cycles/instances. If not specified there is no limit to the number of repetitions.
                  +            
                  +            
                  +                timeWindow
                  +                 HYPERLINK  \l "DATATYPE_TimeWindow" TimeWindow
                  +                Yes
                  +                Time period over which the repetition is applicable. If not specified repetition continues indefinitely.
                  +            
                  +            
                  +                separationType
                  +                 HYPERLINK  \l "DATATYPE_SeparationTypeEnum" SeparationTypeEnum
                  +                No
                  +                Specifies whether the repetition interval is Relative to the previous occurrence, or Absolute for all occurrences.
                  +            
                  +            
                  +                orbitNumber
                  +                Element
                  +                No
                  +                Orbit number for the first occurrence.  Depending on the relativeOrbit flag, the orbit number may be absolute (since start of mission) or relative (to the orbital repeat cycle). The datum with respect to which the orbit number is counted is mission specific.
                  +            
                  +            
                  +                relativeOrbit
                  +                Boolean
                  +                No
                  +                Flag indicating if the orbit number is absolute or relative to the orbital repeat cycle.
                  +            
                  +            
                  +                orbitSeparation
                  +                Element
                  +                No
                  +                The required number of orbits separation between occurrences.  If orbitNumber is Relative and the required repetition is once per repeat cycle, this is the number of orbits in the repeat cycle, but the value 0 may also be used.
                  +            
                  +            
                  +                angularSeparation
                  +                Element
                  +                No
                  +                The required angular separation between occurrences.  This allows for multiple repetitions within an orbit.  The value 0 indicates only one occurrence within the orbit.
                  +            
                  +            
                  +                orbitAngle
                  +                Element
                  +                No
                  +                The required position of the first occurrence within the orbit expressed as an angle.
                  +            
                  +            
                  +                tolerance
                  +                Element
                  +                No
                  +                The allowed tolerance (+/-) in the required orbital angle.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: DirectionRepetition
                  +        
                  +        E6: A sub-type of Repetition based on direction, which supports the specification of astronomical surveys.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                DirectionRepetition
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_Repetition" Repetition
                  +            
                  +            
                  +                Short Form Part
                  +                59
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                count
                  +                Integer
                  +                Yes
                  +                Maximum number of repeat cycles/instances. If not specified there is no limit to the number of repetitions.
                  +            
                  +            
                  +                timeWindow
                  +                 HYPERLINK  \l "DATATYPE_TimeWindow" TimeWindow
                  +                Yes
                  +                Time period over which the repetition is applicable. If not specified repetition continues indefinitely.
                  +            
                  +            
                  +                separationType
                  +                 HYPERLINK  \l "DATATYPE_SeparationTypeEnum" SeparationTypeEnum
                  +                No
                  +                Specifies whether the repetition interval is Relative to the previous occurrence, or Absolute for all occurrences.
                  +            
                  +            
                  +                initialDirection
                  +                Element
                  +                No
                  +                Nominal direction of first occurrence.
                  +            
                  +            
                  +                targetDirection
                  +                Element
                  +                No
                  +                Specifies the direction of repetition as line connecting the initial and target directions.
                  +            
                  +            
                  +                separation
                  +                Element
                  +                No
                  +                The required angle between occurrences.
                  +            
                  +            
                  +                tolerance
                  +                Element
                  +                No
                  +                The allowed tolerance (+/-) in the required angle between occurrences, the interpretation of which is dependent on the separationType.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: RevolutionRepetition
                  +        
                  +        E6: A sub-type of Repetition based on the revolutions of a rotating spacecraft or instrument.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                RevolutionRepetition
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_Repetition" Repetition
                  +            
                  +            
                  +                Short Form Part
                  +                60
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                count
                  +                Integer
                  +                Yes
                  +                Maximum number of repeat cycles/instances. If not specified there is no limit to the number of repetitions.
                  +            
                  +            
                  +                timeWindow
                  +                 HYPERLINK  \l "DATATYPE_TimeWindow" TimeWindow
                  +                Yes
                  +                Time period over which the repetition is applicable. If not specified repetition continues indefinitely.
                  +            
                  +            
                  +                separationType
                  +                 HYPERLINK  \l "DATATYPE_SeparationTypeEnum" SeparationTypeEnum
                  +                No
                  +                Specifies whether the repetition interval is Relative to the previous occurrence, or Absolute for all occurrences.
                  +            
                  +            
                  +                revsSeparation
                  +                Element
                  +                No
                  +                The required number of revolutions between occurrences.
                  +            
                  +            
                  +                revsTolerance
                  +                Element
                  +                No
                  +                The allowed tolerance (+/-) in the required number of revolutions between occurrences, the interpretation of which is dependent on the separationType.
                  +            
                  +            
                  +                revAngle
                  +                Element
                  +                No
                  +                Specifies the angle within a revolution.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: TemporalRepetition
                  +        
                  +        E1: A sub-type of Repetition based on time.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                TemporalRepetition
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_Repetition" Repetition
                  +            
                  +            
                  +                Short Form Part
                  +                61
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                count
                  +                Integer
                  +                Yes
                  +                Maximum number of repeat cycles/instances. If not specified there is no limit to the number of repetitions.
                  +            
                  +            
                  +                timeWindow
                  +                 HYPERLINK  \l "DATATYPE_TimeWindow" TimeWindow
                  +                Yes
                  +                Time period over which the repetition is applicable. If not specified repetition continues indefinitely.
                  +            
                  +            
                  +                separationType
                  +                 HYPERLINK  \l "DATATYPE_SeparationTypeEnum" SeparationTypeEnum
                  +                No
                  +                Specifies whether the repetition interval is Relative to the previous occurrence, or Absolute for all occurrences.
                  +            
                  +            
                  +                initialTime
                  +                Element
                  +                No
                  +                Nominal time of first occurrence.
                  +            
                  +            
                  +                separation
                  +                Element
                  +                No
                  +                The required time interval between occurrences.
                  +            
                  +            
                  +                tolerance
                  +                Element
                  +                No
                  +                The allowed tolerance (+/-) in the required time between occurrences, the interpretation of which is dependent on the separationType.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: AngleRepetition
                  +        
                  +        E6: A sub-type of Repetition based on the angle subtended between three physical objects.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                AngleRepetition
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_Repetition" Repetition
                  +            
                  +            
                  +                Short Form Part
                  +                62
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                count
                  +                Integer
                  +                Yes
                  +                Maximum number of repeat cycles/instances. If not specified there is no limit to the number of repetitions.
                  +            
                  +            
                  +                timeWindow
                  +                 HYPERLINK  \l "DATATYPE_TimeWindow" TimeWindow
                  +                Yes
                  +                Time period over which the repetition is applicable. If not specified repetition continues indefinitely.
                  +            
                  +            
                  +                separationType
                  +                 HYPERLINK  \l "DATATYPE_SeparationTypeEnum" SeparationTypeEnum
                  +                No
                  +                Specifies whether the repetition interval is Relative to the previous occurrence, or Absolute for all occurrences.
                  +            
                  +            
                  +                centerObject
                  +                Element
                  +                No
                  +                Position of the center object.
                  +            
                  +            
                  +                targetObject1
                  +                Element
                  +                No
                  +                Position of target object 1.
                  +            
                  +            
                  +                targetObject2
                  +                Element
                  +                No
                  +                Position of target object 2.
                  +            
                  +            
                  +                initialAngle
                  +                Element
                  +                No
                  +                Initial angle subtended at the center object by target objects 1 and 2.
                  +            
                  +            
                  +                separation
                  +                Element
                  +                No
                  +                The required angle between occurrences. If this is zero, this implies that repetition is between multiple occurrences of the initialAngle.
                  +            
                  +            
                  +                tolerance
                  +                Element
                  +                No
                  +                The allowed tolerance (+/-) in the required angle between occurrences, the interpretation of which is dependent on the separationType.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: EventRepetition
                  +        
                  +        E1: A sub-type of Repetition based on planning events.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                EventRepetition
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_Repetition" Repetition
                  +            
                  +            
                  +                Short Form Part
                  +                63
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                count
                  +                Integer
                  +                Yes
                  +                Maximum number of repeat cycles/instances. If not specified there is no limit to the number of repetitions.
                  +            
                  +            
                  +                timeWindow
                  +                 HYPERLINK  \l "DATATYPE_TimeWindow" TimeWindow
                  +                Yes
                  +                Time period over which the repetition is applicable. If not specified repetition continues indefinitely.
                  +            
                  +            
                  +                separationType
                  +                 HYPERLINK  \l "DATATYPE_SeparationTypeEnum" SeparationTypeEnum
                  +                No
                  +                Specifies whether the repetition interval is Relative to the previous occurrence, or Absolute for all occurrences.
                  +            
                  +            
                  +                eventRef
                  +                Element
                  +                No
                  +                Reference to an EventDefinition (type of event).
                  +            
                  +            
                  +                separation
                  +                Element
                  +                No
                  +                Number of occurrences of the planning event required between occurrences of the planning activity.
                  +            
                  +            
                  +                tolerance
                  +                Element
                  +                No
                  +                The allowed tolerance (+/-) in the number of occurrences of the planning event between occurrences of the planning activity, the interpretation of which is dependent on the separationType.
                  +            
                  +        
                  +        
                  +            
                  +            Enumeration: ActivityStatusEnum
                  +        
                  +        E1: An ActivityStatusEnum represents the set of states possible for an ActivityInstance.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ActivityStatusEnum
                  +            
                  +            
                  +                Short Form Part
                  +                103
                  +            
                  +            
                  +                Enumeration Value
                  +                Numerical Value
                  +                Comment
                  +            
                  +            
                  +                PLANNED
                  +                1
                  +                The Activity Instance has been included in the Plan.
                  +            
                  +            
                  +                ACTIVATED
                  +                2
                  +                The Plan including the Activity Instance has been Activated within the plan execution function.
                  +            
                  +            
                  +                EXECUTING
                  +                3
                  +                Execution of the Activity Instance has been initiated.
                  +            
                  +            
                  +                SUSPENDED
                  +                4
                  +                Execution of the Activity Instance has been suspended.
                  +            
                  +            
                  +                TERMINATED
                  +                5
                  +                Execution of the Activity Instance has been terminated (further information is provided in statusInfo).
                  +            
                  +        
                  +        
                  +            
                  +            Enumeration: EventStatusEnum
                  +        
                  +        E1: The EventStatusEnum represents the status of a given EventInstance.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                EventStatusEnum
                  +            
                  +            
                  +                Short Form Part
                  +                203
                  +            
                  +            
                  +                Enumeration Value
                  +                Numerical Value
                  +                Comment
                  +            
                  +            
                  +                GROUP
                  +                1
                  +                The EventInstance is a group event.
                  +            
                  +            
                  +                PLANNED
                  +                2
                  +                The EventInstance has been included in the Plan .
                  +            
                  +            
                  +                ACTIVATED
                  +                3
                  +                The Plan including the EventInstance has been Activated within the plan execution function.
                  +            
                  +            
                  +                TERMINATED
                  +                4
                  +                The EventInstance has reached a terminal status (further information is provided in statusInfo).
                  +            
                  +        
                  +        
                  +            
                  +            Enumeration: PredictabilityEnum
                  +        
                  +        E1: The PredictabilityEnum enumeration is used to indicate whether a given Event is predictable or can occur at any time.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                PredictabilityEnum
                  +            
                  +            
                  +                Short Form Part
                  +                204
                  +            
                  +            
                  +                Enumeration Value
                  +                Numerical Value
                  +                Comment
                  +            
                  +            
                  +                PREDICTED
                  +                1
                  +                Events that are predictable either by time or position can have specific instances included in a Plan.
                  +            
                  +            
                  +                POTENTIAL
                  +                2
                  +                Potential events are those that may occur during the execution of a Plan, but the specific time or position is not predicted.
                  +            
                  +        
                  +        
                  +            
                  +            Enumeration: InterpolationTypeEnum
                  +        
                  +        E4: The InterpolationTypeEnum describes the set of supported interpolation types for a given operation.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                InterpolationTypeEnum
                  +            
                  +            
                  +                Short Form Part
                  +                305
                  +            
                  +            
                  +                Enumeration Value
                  +                Numerical Value
                  +                Comment
                  +            
                  +            
                  +                STEP
                  +                1
                  +                No interpolation:  resource values remain unchanged between defined points.
                  +            
                  +            
                  +                LINEAR
                  +                2
                  +                Linear interpolation: resource values follow a straight line between defined points.
                  +            
                  +            
                  +                POLYNOMIAL
                  +                3
                  +                Polynomial interpolation:  resource values follow a curve interpolating the defined points.
                  +            
                  +        
                  +        
                  +            
                  +            Enumeration: RequestStatusEnum
                  +        
                  +        E1: The RequestStatusEnum enumeration represents the different statuses in which a planning request may be found.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                RequestStatusEnum
                  +            
                  +            
                  +                Short Form Part
                  +                403
                  +            
                  +            
                  +                Enumeration Value
                  +                Numerical Value
                  +                Comment
                  +            
                  +            
                  +                REQUESTED
                  +                1
                  +                The planning request has been submitted to the planning function.
                  +            
                  +            
                  +                ACCEPTED
                  +                2
                  +                The planning request has been accepted by the planning function.
                  +            
                  +            
                  +                REJECTED
                  +                3
                  +                The planning request has been rejected by the planning function.
                  +            
                  +            
                  +                CANCELLED
                  +                4
                  +                The planning request has been cancelled by the user.
                  +            
                  +            
                  +                PLANNED
                  +                5
                  +                The planning request has been incorporated into a Plan (see outputPlanRefs).
                  +            
                  +            
                  +                PROCESSING
                  +                6
                  +                The corresponding Plan has been activated within plan execution.
                  +            
                  +            
                  +                PROCESSED
                  +                7
                  +                Execution of all constituent activities of the planning request have terminated.  Awaiting confirmation of the status of the planning request. 
                  +            
                  +            
                  +                TERMINATED
                  +                8
                  +                The planning request has completed, either successfully or with a failure condition (further information is provided in statusInfo).
                  +            
                  +        
                  +        
                  +            
                  +            Enumeration: PlanStatusEnum
                  +        
                  +        E1: PlanStatusEnum represents the status of a given Plan object. 
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                PlanStatusEnum
                  +            
                  +            
                  +                Short Form Part
                  +                502
                  +            
                  +            
                  +                Enumeration Value
                  +                Numerical Value
                  +                Comment
                  +            
                  +            
                  +                DRAFT
                  +                1
                  +                The Plan has been saved by the planning function.
                  +            
                  +            
                  +                RELEASED
                  +                2
                  +                The Plan has been released for operational use by the planning function.
                  +            
                  +            
                  +                SUBMITTED
                  +                3
                  +                The Plan has been submitted to the plan execution function and is available for use, but will not be executed until activated.
                  +            
                  +            
                  +                ACTIVATED
                  +                4
                  +                The Plan has been activated by the plan execution function.
                  +            
                  +            
                  +                TERMINATED
                  +                5
                  +                The Plan has reached a terminal state, as detailed in the statusInfo.  This includes the following cases: - Completed (nominal); - Superseded by a successor Plan; - Revoked by a User; - Cancelled (deactivated after start of execution); - Expired (reached the end of its validity period without being activated).
                  +            
                  +        
                  +        
                  +            
                  +            Enumeration: RevisionStatusEnum
                  +        
                  +        E3: The RevisionStatusEnum represents the type of changes that were made to an item in a given revision.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                RevisionStatusEnum
                  +            
                  +            
                  +                Short Form Part
                  +                507
                  +            
                  +            
                  +                Enumeration Value
                  +                Numerical Value
                  +                Comment
                  +            
                  +            
                  +                NEW
                  +                1
                  +                The item is new in this revision of the Plan.
                  +            
                  +            
                  +                MODIFIED
                  +                2
                  +                The item has been modified in this revision of the Plan.
                  +            
                  +            
                  +                DELETED
                  +                3
                  +                The item has been deleted in this revision of the Plan.
                  +            
                  +            
                  +                UNDEFINED
                  +                4
                  +                The item is unchanged in this revision of the Plan, or its revision status is undefined.
                  +            
                  +        
                  +        
                  +            
                  +            Enumeration: SubPlanStatusEnum
                  +        
                  +        E1: This enumeration may be used to indicate whether or not a given subplan is active.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                SubPlanStatusEnum
                  +            
                  +            
                  +                Short Form Part
                  +                512
                  +            
                  +            
                  +                Enumeration Value
                  +                Numerical Value
                  +                Comment
                  +            
                  +            
                  +                ACTIVATED
                  +                1
                  +                The sub-plan is active.
                  +            
                  +            
                  +                DEACTIVATED
                  +                2
                  +                The sub-plan is not active.
                  +            
                  +        
                  +        
                  +            
                  +            Enumeration: ArgTypeEnum
                  +        
                  +        E1: ArgTypeEnum is an MPS extension of the MAL::AttributeType enumeration (see reference [2] section 4.6.4) that also allows specification of the Geometric data types.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ArgTypeEnum
                  +            
                  +            
                  +                Short Form Part
                  +                1
                  +            
                  +            
                  +                Enumeration Value
                  +                Numerical Value
                  +                Comment
                  +            
                  +            
                  +                BLOB
                  +                1
                  +                Binary object.
                  +            
                  +            
                  +                BOOLEAN
                  +                2
                  +                Boolean value (True or False).
                  +            
                  +            
                  +                DURATION
                  +                3
                  +                Length of time in nanosecond resolution.
                  +            
                  +            
                  +                FLOAT
                  +                4
                  +                Floating point number (32 bits).
                  +            
                  +            
                  +                DOUBLE
                  +                5
                  +                Double precision floating point number (64 bits).
                  +            
                  +            
                  +                IDENTIFIER
                  +                6
                  +                The Identifier structure is used to store an identifier and can be used for indexing.  It is a variable-length, unbounded Unicode string.
                  +            
                  +            
                  +                OCTET
                  +                7
                  +                Signed 8 bit Integer.
                  +            
                  +            
                  +                UOCTET
                  +                8
                  +                Unsigned 8 bit Integer.
                  +            
                  +            
                  +                SHORT
                  +                9
                  +                Signed 16 bit Integer.
                  +            
                  +            
                  +                USHORT
                  +                10
                  +                Unsigned 16 bit Integer.
                  +            
                  +            
                  +                INTEGER
                  +                11
                  +                Signed 32 bit Integer.
                  +            
                  +            
                  +                UINTEGER
                  +                12
                  +                Unsigned 32 bit Integer.
                  +            
                  +            
                  +                LONG
                  +                13
                  +                Signed 64 bit Integer.
                  +            
                  +            
                  +                ULONG
                  +                14
                  +                Unsigned 64 bit Integer.
                  +            
                  +            
                  +                STRING
                  +                15
                  +                Text.  It is a variable length, unbounded Unicode string.
                  +            
                  +            
                  +                TIME
                  +                16
                  +                Absolute date-time to millisecond resolution.
                  +            
                  +            
                  +                FINETIME
                  +                17
                  +                Absolute date-time to nanosecond resolution.
                  +            
                  +            
                  +                URI
                  +                18
                  +                Uniform Resource Identifier (address).  It is a variable-length, unbounded Unicode string (see reference [4]).
                  +            
                  +            
                  +                OBJECTREF
                  +                19
                  +                Object Reference.
                  +            
                  +            
                  +                POSITION
                  +                129
                  +                MPS Position.
                  +            
                  +            
                  +                DIRECTION
                  +                130
                  +                MPS Direction.
                  +            
                  +            
                  +                ANGLE
                  +                131
                  +                MPS Angle.
                  +            
                  +            
                  +                ANGULAR_RATE
                  +                132
                  +                MPS AngularRate.
                  +            
                  +            
                  +                DISTANCE
                  +                133
                  +                MPS Distance.
                  +            
                  +            
                  +                ANY
                  +                134
                  +                The argument may be of any type.  It will map to a MAL::Element.  It can be used to specify an argument list of heterogeneous types.
                  +            
                  +        
                  +        
                  +            
                  +            Enumeration: LogicOpEnum
                  +        
                  +        E1: A LogicOpEnum represents the type of logic used to combine two Boolean conditions.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                LogicOpEnum
                  +            
                  +            
                  +                Short Form Part
                  +                30
                  +            
                  +            
                  +                Enumeration Value
                  +                Numerical Value
                  +                Comment
                  +            
                  +            
                  +                AND
                  +                1
                  +                Logical AND
                  +            
                  +            
                  +                OR
                  +                2
                  +                Logical OR
                  +            
                  +        
                  +        
                  +            
                  +            Enumeration: ExpressionOperatorEnum
                  +        
                  +        E5: Whenever a value comparison is needed in this standard, multiple Boolean operations may be chosen from.
                  +        These operations are described by each of the possible enumeration values of ExpressionOperatorEnum.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ExpressionOperatorEnum
                  +            
                  +            
                  +                Short Form Part
                  +                36
                  +            
                  +            
                  +                Enumeration Value
                  +                Numerical Value
                  +                Comment
                  +            
                  +            
                  +                EQUAL
                  +                1
                  +                =
                  +            
                  +            
                  +                DIFFER
                  +                2
                  +                !=
                  +            
                  +            
                  +                GREATER
                  +                3
                  +                >
                  +            
                  +            
                  +                GREATER_OR_EQUAL
                  +                4
                  +                >=
                  +            
                  +            
                  +                LESS
                  +                5
                  +                <
                  +            
                  +            
                  +                LESS_OR_EQUAL
                  +                6
                  +                <=
                  +            
                  +            
                  +                CONTAINS
                  +                7
                  +                Case sensitive containment (Strings only).
                  +            
                  +            
                  +                ICONTAINS
                  +                8
                  +                Case insensitive containment (Strings only).
                  +            
                  +        
                  +        
                  +            
                  +            Enumeration: EffectOperationEnum
                  +        
                  +        E5: An EffectOperationEnum is used to denote the specific type of change made to a planning resource for a given Effect.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                EffectOperationEnum
                  +            
                  +            
                  +                Short Form Part
                  +                49
                  +            
                  +            
                  +                Enumeration Value
                  +                Numerical Value
                  +                Comment
                  +            
                  +            
                  +                SET
                  +                1
                  +                Set to specified value
                  +            
                  +            
                  +                INCREASE
                  +                2
                  +                Increase by specified value
                  +            
                  +            
                  +                DECREASE
                  +                3
                  +                Decrease by specified value
                  +            
                  +        
                  +        
                  +            
                  +            Enumeration: SeparationTypeEnum
                  +        
                  +        E1: A SeparationTypeEnum is used to define whether the separation between repetitions is relative or absolute.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                SeparationTypeEnum
                  +            
                  +            
                  +                Short Form Part
                  +                56
                  +            
                  +            
                  +                Enumeration Value
                  +                Numerical Value
                  +                Comment
                  +            
                  +            
                  +                RELATIVE
                  +                1
                  +                Tolerance on separation is only considered between any two occurrences.
                  +            
                  +            
                  +                ABSOLUTE
                  +                2
                  +                Tolerance on separation applies to a multiple of the separation from the initial occurrence.
                  +            
                  +        
                  +        
                  +            
                  +            Enumeration: SecondaryErrorCodeEnum
                  +        
                  +        E1: For the INVALID error, the secondary error code is a MAL::UShort that allows for deployment specific extensibility.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                SecondaryErrorCodeEnum
                  +            
                  +            
                  +                Short Form Part
                  +                64
                  +            
                  +            
                  +                Enumeration Value
                  +                Numerical Value
                  +                Comment
                  +            
                  +            
                  +                UNKNOWN
                  +                1
                  +                Referenced MO object is not available to the service provider.
                  +            
                  +            
                  +                UNDEFINED
                  +                2
                  +                Undefined value for enumeration field.
                  +            
                  +            
                  +                OUT_OF_RANGE
                  +                3
                  +                A numeric value is outside the supported range.
                  +            
                  +            
                  +                UNRECOGNIZED
                  +                4
                  +                Value of type MAL::Identifier or MAL::String (referencing a named item) does not correspond to a known item.
                  +            
                  +            
                  +                BAD_TIME
                  +                5
                  +                A date-time value is outside the supported time period.
                  +            
                  +            
                  +                BAD_POSITION
                  +                6
                  +                A position value is outside the supported position range.
                  +            
                  +            
                  +                BAD_DIRECTION
                  +                7
                  +                A direction value is outside the supported direction range.
                  +            
                  +            
                  +                INCONSISTENT
                  +                8
                  +                A value is inconsistent with that of another field within the message.  This indicates violation of a constraint rule.
                  +            
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The following table lists the errors defined in this specification:
                  +        
                  +            Table 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Table \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Table_TOC \s 1 1
                  +            MPS MO Errors
                  +            "
                  +            :  MPS MO Errors
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                Comment
                  +            
                  +            
                  +                INVALID
                  +                1
                  +                One or more fields in the message contain invalid values.
                  +            
                  +            
                  +                CANCEL_FAILED
                  +                2
                  +                The cancelRequest operation failed to cancel the referenced RequestInstance.
                  +            
                  +            
                  +                UPDATE_FAILED
                  +                3
                  +                The update operation (to Request, PlanStatus, Activity, Event or Resource) failed to update the referenced object.
                  +            
                  +            
                  +                REVOKE_FAILED
                  +                4
                  +                The revokePlan operation failed to revoke the referenced Plan, for example because it has already started executing.
                  +            
                  +            
                  +                INSERT_FAILED
                  +                5
                  +                The insertActivity or insertEvent operation failed to insert the requested object.
                  +            
                  +            
                  +                DELETE_FAILED
                  +                6
                  +                The deleteActivity or deleteEvent operation failed to delete the requested object.
                  +            
                  +            
                  +                ACTIVATE_FAILED
                  +                7
                  +                The activatePlan operation failed as the activation was outside the validity period of the Plan, or the start of the planPeriod had already passed.  
                  +            
                  +            
                  +                DEACTIVATE_FAILED
                  +                8
                  +                The deactivatePlan operation failed.
                  +            
                  +            
                  +                SUBMIT_FAILED
                  +                9
                  +                The submitPlan operation failed as the submitted plan was already terminated.
                  +            
                  +            
                  +                UNSUPPORTED
                  +                10
                  +                An optional data structure used in the message is not supported by the service provider.
                  +            
                  +            
                  +                ACTIVATE_SUBPLAN_FAILED
                  +                11
                  +                The activateSubPlan operation failed.
                  +            
                  +            
                  +                DEACTIVATE_SUBPLAN_FAILED
                  +                12
                  +                The deactivateSubPlan operation failed.
                  +            
                  +        
                  +    
                  +
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area005-v001-MPS/word/numbering.xml b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area005-v001-MPS/word/numbering.xml
                  new file mode 100644
                  index 00000000..12089497
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area005-v001-MPS/word/numbering.xml
                  @@ -0,0 +1,95 @@
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area005-v001-MPS/word/styles.xml b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area005-v001-MPS/word/styles.xml
                  new file mode 100644
                  index 00000000..ee967ee1
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area005-v001-MPS/word/styles.xml
                  @@ -0,0 +1 @@
                  +
                  \ No newline at end of file
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area007-v001-SoftwareManagement/[Content_Types].xml b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area007-v001-SoftwareManagement/[Content_Types].xml
                  new file mode 100644
                  index 00000000..fbe325d6
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area007-v001-SoftwareManagement/[Content_Types].xml
                  @@ -0,0 +1 @@
                  +
                  \ No newline at end of file
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area007-v001-SoftwareManagement/_rels/.rels b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area007-v001-SoftwareManagement/_rels/.rels
                  new file mode 100644
                  index 00000000..d6637f3e
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area007-v001-SoftwareManagement/_rels/.rels
                  @@ -0,0 +1 @@
                  +
                  \ No newline at end of file
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area007-v001-SoftwareManagement/word/_rels/document.xml.rels b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area007-v001-SoftwareManagement/word/_rels/document.xml.rels
                  new file mode 100644
                  index 00000000..7af141e1
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area007-v001-SoftwareManagement/word/_rels/document.xml.rels
                  @@ -0,0 +1 @@
                  +
                  \ No newline at end of file
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area007-v001-SoftwareManagement/word/document.xml b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area007-v001-SoftwareManagement/word/document.xml
                  new file mode 100644
                  index 00000000..cffc87f7
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area007-v001-SoftwareManagement/word/document.xml
                  @@ -0,0 +1,2237 @@
                  +
                  +
                  +    
                  +        
                  +            Specification: SoftwareManagement
                  +        
                  +        
                  +            General
                  +        
                  +        This section contains the specifications for the SoftwareManagement services.
                  +        The Software Management set of services contains services for on-board software management of a spacecraft. The following services are contained in the Software Management set:
                  +        The Memory Management service is a low-level service intended to be used to load, dump and check memory addresses.
                  +        The Software Image service is intended to manage Software Images and Software Patches by allowing the generation of new Software Images from a patch.
                  +        The Package Management service allows the management of software packages on modern operating systems using the concept of packages.
                  +        The Apps Launcher service allows the management of runnable applications in a system.
                  +        The Heartbeat service publishes a periodic beat to the consumers that are listening.
                  +        
                  +        This section details the Software Management services. The area and structures are defined in terms of the MO Message Abstraction Layer (MAL), so it is possible to deploy them over any supported protocol and message transport.
                  +        This area contains the following services:
                  +        PackageManagement
                  +        Heartbeat
                  +        CommandExecutor
                  +        AppsLauncher
                  +        
                  +            
                  +            Service: PackageManagement
                  +        
                  +        
                  +            Overview
                  +        
                  +        The Package Management service provides the ability to install, uninstall, upgrade, list, check packages. The service shall optionally support verification of packages, verification of digital signatures, upgrade software, manage dependencies.
                  +        Packages can be organized in different categories in order to facilitate the management of software.
                  +        
                  +            Table 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Table \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Table_TOC \s 1 1
                  +            PackageManagement Service Operations
                  +            "
                  +            :  PackageManagement Service Operations
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Area Identifier
                  +                Service Identifier
                  +                Area Number
                  +                Service Number
                  +                Area Version
                  +            
                  +            
                  +                SoftwareManagement
                  +                PackageManagement
                  +                7
                  +                1
                  +                1
                  +            
                  +            
                  +                Interaction Pattern
                  +                Operation Identifier
                  +                Operation Number
                  +                Capability Set
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_1_findPackage" findPackage
                  +                1
                  +                1
                  +            
                  +            
                  +                INVOKE
                  +                 HYPERLINK  \l "OPERATION_1_install" install
                  +                2
                  +                
                  +            
                  +            
                  +                INVOKE
                  +                 HYPERLINK  \l "OPERATION_1_uninstall" uninstall
                  +                3
                  +                
                  +            
                  +            
                  +                INVOKE
                  +                 HYPERLINK  \l "OPERATION_1_upgrade" upgrade
                  +                4
                  +                2
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_1_checkPackageIntegrity" checkPackageIntegrity
                  +                5
                  +                3
                  +            
                  +        
                  +        
                  +            Service-level Requirements
                  +        
                  +        The Package Management service shall provide:
                  +        the capability for listing, installing and uninstalling packages;
                  +        the capability for upgrading packages;
                  +        the capability for checking the integrity of a package;
                  +        the capability for listing the package categories available on the provider.
                  +        
                  +            COM usage
                  +        
                  +        
                  +            Table 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Table \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Table_TOC \s 1 1
                  +            PackageManagement Service Object Types
                  +            "
                  +            :  PackageManagement Service Object Types
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Object Number
                  +                Object Name
                  +                Object Body Type
                  +                Related link
                  +                Source link
                  +            
                  +            
                  +                1
                  +                Package
                  +                 HYPERLINK  \l "DATATYPE_PackageDefinition" PackageDefinition
                  +                
                  +                
                  +            
                  +            
                  +                2
                  +                Installation
                  +                Identifier
                  +                1
                  +                
                  +            
                  +        
                  +        
                  +            COM Event Service usage
                  +        
                  +        
                  +            Table 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Table \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Table_TOC \s 1 1
                  +            PackageManagement Service Events
                  +            "
                  +            :  PackageManagement Service Events
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Object Number
                  +                Event Name
                  +                Object Body Type
                  +                Related link
                  +                Source link
                  +            
                  +        
                  +        
                  +            COM Object Relationships
                  +        
                  +        The Figure below shows the COM object and event relationships for this service:
                  +        
                  +            Figure 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Figure \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Figure_TOC \s 1 1
                  +            PackageManagement Service COM object and event relationships
                  +            "
                  +            :  PackageManagement Service COM object and event relationships
                  +        
                  +        
                  +            COM Activity Service usage
                  +        
                  +        Add the activity tracking for the progress of installation. Also for the Software Image service
                  +        
                  +            
                  +            Operation: findPackage
                  +        
                  +        
                  +            Overview
                  +        
                  +        The findPackage operation allows a consumer to find the available packages on the provider.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                findPackage
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                Yes
                  +                List<Identifier> names
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                YesYes
                  +                List<Identifier> namesList<Boolean> installed
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        names - The names field contains the names of the packages.
                  +        names - The names field contains the names of the packages.
                  +        installed - The installed field shall hold the status of the package.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return the following error:
                  +        UNKNOWN: One or more of the requested packages is unknown.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                List<Integer>
                  +                A list of the indexes of the error values shall be contained in the extra information field.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: install
                  +        
                  +        
                  +            Overview
                  +        
                  +        The install operation allows a consumer to install the content of a package on the provider. The selected packages will be installed sequencially.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                install
                  +            
                  +            
                  +                Interaction Pattern
                  +                INVOKE
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                INVOKE
                  +                Yes
                  +                List<Identifier> names
                  +            
                  +            
                  +                OUT
                  +                ACK
                  +                Yes
                  +                List<Boolean> integrity
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                -
                  +                -
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        names - The names field contains the names of the packages.
                  +        integrity - The integrity field contains the status of the package integrity.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        UNKNOWN: One or more of the requested packages is unknown.
                  +        INVALID: One or more of the requested packages is already installed.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                List<Integer>
                  +                A list of the indexes of the error values shall be contained in the extra information field.
                  +            
                  +            
                  +                INVALID
                  +                Defined in COM
                  +                List<Integer>
                  +                A list of the indexes of the error values shall be contained in the extra information field.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: uninstall
                  +        
                  +        
                  +            Overview
                  +        
                  +        The uninstall operation allows a consumer to uninstall the content of a package on the provider. The selected packages will be uninstalled sequencially.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                uninstall
                  +            
                  +            
                  +                Interaction Pattern
                  +                INVOKE
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                INVOKE
                  +                YesYes
                  +                List<Identifier> namesList<Boolean> keepConfigurations
                  +            
                  +            
                  +                OUT
                  +                ACK
                  +                -
                  +                -
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                -
                  +                -
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        names - The names field contains the names of the packages.
                  +        keepConfigurations - The keepConfigurations field selects if the configuration of the executable files shall be kept.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        UNKNOWN: One or more of the requested packages is unknown.
                  +        INVALID: One or more of the requested packages is not installed.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                List<Integer>
                  +                A list of the indexes of the error values shall be contained in the extra information field.
                  +            
                  +            
                  +                INVALID
                  +                Defined in COM
                  +                List<Integer>
                  +                A list of the indexes of the error values shall be contained in the extra information field.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: upgrade
                  +        
                  +        
                  +            Overview
                  +        
                  +        The upgrade operation allows a consumer to upgrade the content of a package on the provider. The selected packages will be upgraded sequencially.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                upgrade
                  +            
                  +            
                  +                Interaction Pattern
                  +                INVOKE
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                INVOKE
                  +                Yes
                  +                List<Identifier> names
                  +            
                  +            
                  +                OUT
                  +                ACK
                  +                -
                  +                -
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                -
                  +                -
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        names - The names field contains the names of the packages.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        UNKNOWN: One or more of the requested packages is unknown.
                  +        INVALID: One or more of the requested packages is not installed.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                List<Integer>
                  +                A list of the indexes of the error values shall be contained in the extra information field.
                  +            
                  +            
                  +                INVALID
                  +                Defined in COM
                  +                List<Integer>
                  +                A list of the indexes of the error values shall be contained in the extra information field.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: checkPackageIntegrity
                  +        
                  +        
                  +            Overview
                  +        
                  +        The checkPackageIntegrity operation allows a consumer to check the integrity of a certain package on the provider.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                checkPackageIntegrity
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                Yes
                  +                List<Identifier> names
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                YesYes
                  +                List<Boolean> validCRCsList<String> publicKeys
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        names - The names field contains the names of the packages.
                  +        validCRCs - 
                  +        publicKeys - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return the following error:
                  +        UNKNOWN: One or more of the requested packages is unknown.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                List<Integer>
                  +                A list of the indexes of the error values shall be contained in the extra information field.
                  +            
                  +        
                  +        
                  +            
                  +            Service: Heartbeat
                  +        
                  +        
                  +            Overview
                  +        
                  +        The Heartbeat service provides the ability to periodically publish a heartbeat message. Additionally it is possible to get the period of the beat.
                  +        
                  +            Table 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Table \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Table_TOC \s 1 1
                  +            Heartbeat Service Operations
                  +            "
                  +            :  Heartbeat Service Operations
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Area Identifier
                  +                Service Identifier
                  +                Area Number
                  +                Service Number
                  +                Area Version
                  +            
                  +            
                  +                SoftwareManagement
                  +                Heartbeat
                  +                7
                  +                2
                  +                1
                  +            
                  +            
                  +                Interaction Pattern
                  +                Operation Identifier
                  +                Operation Number
                  +                Capability Set
                  +            
                  +            
                  +                PUB-SUB
                  +                 HYPERLINK  \l "OPERATION_2_beat" beat
                  +                1
                  +                1
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_2_getPeriod" getPeriod
                  +                2
                  +                2
                  +            
                  +        
                  +        
                  +            Service-level Requirements
                  +        
                  +        The Heartbeat service shall provide:
                  +        the capability for periodic monitoring of the beat;
                  +        the capability for retrieving the period of the beat.
                  +        
                  +            
                  +            Operation: beat
                  +        
                  +        
                  +            Overview
                  +        
                  +        The beat operation allows a provider to periodically send a heartbeat to the consumers.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                beat
                  +            
                  +            
                  +                Interaction Pattern
                  +                PUBLISH-SUBSCRIBE
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                OUT
                  +                PUBLISH
                  +                -
                  +                -
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation does not return any errors.
                  +        
                  +            
                  +            Operation: getPeriod
                  +        
                  +        
                  +            Overview
                  +        
                  +        The getPeriod operation allows a consumer to get the period of the provider's heartbeat.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                getPeriod
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                -
                  +                -
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                Yes
                  +                Duration period
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        period - The period field shall hold period of the heartbeat message.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation does not return any errors.
                  +        
                  +            
                  +            Service: CommandExecutor
                  +        
                  +        
                  +            Overview
                  +        
                  +        The Command Executor service allows executing arbitrary system commands and monitoring their status.
                  +        
                  +            Table 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Table \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Table_TOC \s 1 1
                  +            CommandExecutor Service Operations
                  +            "
                  +            :  CommandExecutor Service Operations
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Area Identifier
                  +                Service Identifier
                  +                Area Number
                  +                Service Number
                  +                Area Version
                  +            
                  +            
                  +                SoftwareManagement
                  +                CommandExecutor
                  +                7
                  +                3
                  +                1
                  +            
                  +            
                  +                Interaction Pattern
                  +                Operation Identifier
                  +                Operation Number
                  +                Capability Set
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_3_runCommand" runCommand
                  +                1
                  +                1
                  +            
                  +        
                  +        
                  +            Service-level Requirements
                  +        
                  +        
                  +            COM usage
                  +        
                  +        A Command COM object represents an instance of direct command execution requested from the provider. The COM object body shall hold the details of the command.
                  +        
                  +            Table 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Table \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Table_TOC \s 1 1
                  +            CommandExecutor Service Object Types
                  +            "
                  +            :  CommandExecutor Service Object Types
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Object Number
                  +                Object Name
                  +                Object Body Type
                  +                Related link
                  +                Source link
                  +            
                  +            
                  +                1
                  +                Command
                  +                 HYPERLINK  \l "DATATYPE_CommandDetails" CommandDetails
                  +                
                  +                
                  +            
                  +        
                  +        
                  +            COM Event Service usage
                  +        
                  +        
                  +            Table 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Table \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Table_TOC \s 1 1
                  +            CommandExecutor Service Events
                  +            "
                  +            :  CommandExecutor Service Events
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Object Number
                  +                Event Name
                  +                Object Body Type
                  +                Related link
                  +                Source link
                  +            
                  +            
                  +                2
                  +                StandardOutput
                  +                String
                  +                
                  +                1
                  +            
                  +            
                  +                3
                  +                StandardError
                  +                String
                  +                
                  +                1
                  +            
                  +            
                  +                4
                  +                ExecutionFinished
                  +                Integer
                  +                
                  +                1
                  +            
                  +        
                  +        
                  +            COM Object Relationships
                  +        
                  +        The Figure below shows the COM object and event relationships for this service:
                  +        
                  +            Figure 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Figure \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Figure_TOC \s 1 1
                  +            CommandExecutor Service COM object and event relationships
                  +            "
                  +            :  CommandExecutor Service COM object and event relationships
                  +        
                  +        
                  +            
                  +            Operation: runCommand
                  +        
                  +        
                  +            Overview
                  +        
                  +        This operation allows a consumer to spawn a new shell instance and execute an arbitrary command on the provider host.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                runCommand
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                Yes
                  +                 HYPERLINK  \l "DATATYPE_CommandDetails" CommandDetails command
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                Yes
                  +                Long commandInstId
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        command - Details of the command to be run.
                  +        commandInstId - Contains a corresponding COM object instance identifier created in the Archive.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation does not return any errors.
                  +        
                  +            
                  +            Service: AppsLauncher
                  +        
                  +        
                  +            Overview
                  +        
                  +        The Apps Launcher service provides the ability to monitor the execution, run, stop, kill and list applications software on-board of a spacecraft. The apps can be organized in categories.
                  +        The service is independent from any particular Operating System or platform. 
                  +        
                  +            Table 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Table \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Table_TOC \s 1 1
                  +            AppsLauncher Service Operations
                  +            "
                  +            :  AppsLauncher Service Operations
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Area Identifier
                  +                Service Identifier
                  +                Area Number
                  +                Service Number
                  +                Area Version
                  +            
                  +            
                  +                SoftwareManagement
                  +                AppsLauncher
                  +                7
                  +                5
                  +                1
                  +            
                  +            
                  +                Interaction Pattern
                  +                Operation Identifier
                  +                Operation Number
                  +                Capability Set
                  +            
                  +            
                  +                PUB-SUB
                  +                 HYPERLINK  \l "OPERATION_5_monitorExecution" monitorExecution
                  +                1
                  +                1
                  +            
                  +            
                  +                SUBMIT
                  +                 HYPERLINK  \l "OPERATION_5_runApp" runApp
                  +                2
                  +                2
                  +            
                  +            
                  +                SUBMIT
                  +                 HYPERLINK  \l "OPERATION_5_killApp" killApp
                  +                3
                  +                
                  +            
                  +            
                  +                PROGRESS
                  +                 HYPERLINK  \l "OPERATION_5_stopApp" stopApp
                  +                4
                  +                3
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_5_listApp" listApp
                  +                5
                  +                4
                  +            
                  +        
                  +        
                  +            Service-level Requirements
                  +        
                  +        The Apps Launcher service shall provide:
                  +        the capability for periodic monitoring of the applications output;
                  +        the capability for running and killing applications;
                  +        the capability for stopping applications;
                  +        the capability for listing the object instance identifiers for the available apps.
                  +        
                  +            COM usage
                  +        
                  +        An App COM object represents an on-board application. The COM object body shall hold the details of the application.
                  +        The App COM object source link should point to the package from where the app was installed.
                  +        
                  +            Table 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Table \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Table_TOC \s 1 1
                  +            AppsLauncher Service Object Types
                  +            "
                  +            :  AppsLauncher Service Object Types
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Object Number
                  +                Object Name
                  +                Object Body Type
                  +                Related link
                  +                Source link
                  +            
                  +            
                  +                1
                  +                App
                  +                 HYPERLINK  \l "DATATYPE_AppDetails" AppDetails
                  +                
                  +                PackageManagement::2
                  +            
                  +        
                  +        
                  +            COM Event Service usage
                  +        
                  +        A StopApp COM event represents a request to stop a certain application. The COM event object body shall hold the name of the provider to be stopped.
                  +        The StopApp COM event related link shall point to the App COM object.
                  +        The StopApp COM event source link should point to the object that caused it to be created, most likely a COM OperationActivity object.
                  +        The StopApp COM event shall be generated by the stopApp operation.
                  +        A Stopping COM event represents an acknowledgement that the application is stopping its execution.
                  +        The Stopping COM event source link shall point to the StopApp COM event that requested the application to stop or to null if there was no request.
                  +        The Stopping COM event shall be generated by the application when it is going to stop its execution.
                  +        A Stopped COM event represents an acknowledgement that the application is going to completely stop its execution.
                  +        The Stopping COM event source link shall point to the StopApp COM event that requested the application to stop or to null if there was no request.
                  +        The Stopping COM event shall be generated by the application when it is completely stopping its execution.
                  +        
                  +            Table 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Table \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Table_TOC \s 1 1
                  +            AppsLauncher Service Events
                  +            "
                  +            :  AppsLauncher Service Events
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Object Number
                  +                Event Name
                  +                Object Body Type
                  +                Related link
                  +                Source link
                  +            
                  +            
                  +                2
                  +                StopApp
                  +                Identifier
                  +                1
                  +                COM::ActivityTracking::6
                  +            
                  +            
                  +                3
                  +                Stopping
                  +                No body
                  +                
                  +                2
                  +            
                  +            
                  +                4
                  +                Stopped
                  +                No body
                  +                
                  +                2
                  +            
                  +        
                  +        
                  +            COM Object Relationships
                  +        
                  +        The Figure below shows the COM object and event relationships for this service:
                  +        
                  +            Figure 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Figure \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Figure_TOC \s 1 1
                  +            AppsLauncher Service COM object and event relationships
                  +            "
                  +            :  AppsLauncher Service COM object and event relationships
                  +        
                  +        
                  +            
                  +            Operation: monitorExecution
                  +        
                  +        
                  +            Overview
                  +        
                  +        The monitorExecution operation allows a consumer to subscribe for the application execution output stream.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                monitorExecution
                  +            
                  +            
                  +                Interaction Pattern
                  +                PUBLISH-SUBSCRIBE
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                OUT
                  +                PUBLISH
                  +                Yes
                  +                String outputStream
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        outputStream - The outputStream field shall contain a stream of characters corresponding to the output stream of the application.
                  +The MAL EntityKey.firstSubKey shall contain the App name.
                  +The MAL EntityKey.secondSubKey shall contain the AppDetails object instance identifier.
                  +The MAL EntityKey.thirdSubKey shall be NULL.
                  +The MAL EntityKey.fourthSubKey shall be NULL.
                  +The timestamp of the update shall be the on-board time when the update was published.
                  +The publish message shall include the ObjectId of the source link of the update.
                  +If no source link is needed then the ObjectId shall be replaced with a NULL.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation does not return any errors.
                  +        
                  +            
                  +            Operation: runApp
                  +        
                  +        
                  +            Overview
                  +        
                  +        The runApp operation allows a consumer to run an application on the provider.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                runApp
                  +            
                  +            
                  +                Interaction Pattern
                  +                SUBMIT
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                SUBMIT
                  +                Yes
                  +                List<Long> appInstIds
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        appInstIds - The appInstIds field contains the list of apps to run.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        UNKNOWN: One or more of the requested apps to run is unknown.
                  +        INVALID: One or more of the requested apps is already running.
                  +        INTERNAL: The process of the app could not be started.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                List<UInteger>
                  +                A list of the indexes of the error values shall be contained in the extra information field.
                  +            
                  +            
                  +                INVALID
                  +                Defined in COM
                  +                List<UInteger>
                  +                A list of the indexes of the error values shall be contained in the extra information field.
                  +            
                  +            
                  +                INTERNAL
                  +                Defined in MAL
                  +                List<UInteger>
                  +                A list of the indexes of the error values shall be contained in the extra information field.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: killApp
                  +        
                  +        
                  +            Overview
                  +        
                  +        The killApp operation allows a consumer to kill the execution of an application on the provider in case an application becomes unresponsive.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                killApp
                  +            
                  +            
                  +                Interaction Pattern
                  +                SUBMIT
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                SUBMIT
                  +                Yes
                  +                List<Long> appInstIds
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        appInstIds - The appInstIds field contains the list of apps to be killed.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        UNKNOWN: One or more of the requested apps to be killed is unknown.
                  +        INVALID: One or more of the requested apps is not running.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                List<UInteger>
                  +                A list of the indexes of the error values shall be contained in the extra information field.
                  +            
                  +            
                  +                INVALID
                  +                Defined in COM
                  +                List<UInteger>
                  +                A list of the indexes of the error values shall be contained in the extra information field.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: stopApp
                  +        
                  +        
                  +            Overview
                  +        
                  +        The stopApp operation allows a consumer to stop the execution of an application on the provider.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                stopApp
                  +            
                  +            
                  +                Interaction Pattern
                  +                PROGRESS
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                PROGRESS
                  +                Yes
                  +                List<Long> appInstIds
                  +            
                  +            
                  +                OUT
                  +                ACK
                  +                -
                  +                -
                  +            
                  +            
                  +                OUT
                  +                UPDATE
                  +                Yes
                  +                Long appClosing
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                -
                  +                -
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        appInstIds - The appInstIds field contains the list of apps to stop.
                  +        appClosing - The appClosing field shall contain the object instance identifier of an app. This update shall be sent after the app acknowledges the reception of the command to stop.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation does not return any errors.
                  +        
                  +            
                  +            Operation: listApp
                  +        
                  +        
                  +            Overview
                  +        
                  +        The listApp operation allows a consumer to request the object instance identifiers of the Apps objects and running status for an app name or for a certain app category.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                listApp
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                YesYes
                  +                List<Identifier> appNamesIdentifier category
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                YesYes
                  +                List<Long> appInstIdsList<Boolean> running
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        appNames - The appNames field contains a list of application names.
                  +        category - The category field contains the category identifier to filter on.
                  +        appInstIds - The appInstIds field contains a list of apps.
                  +        running - The running field contains a list of boolean values with the information about thte running status of requested apps.
                  +The returned lists shall maintain the same order as the submitted list unless the wildcard value was included in the appNames field request.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return the following error:
                  +        UNKNOWN: One or more of the requested apps to run is unknown.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                List<UInteger>
                  +                A list of the indexes of the error values shall be contained in the extra information field.
                  +            
                  +        
                  +        
                  +            Data types
                  +        
                  +        
                  +            Service data types: PackageManagement
                  +        
                  +        
                  +            
                  +            Composite: PackageDefinition
                  +        
                  +        The PackageDefinition structure holds the definition information of a package.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                PackageDefinition
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                7
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                name
                  +                Identifier
                  +                No
                  +                The name of the package.
                  +            
                  +            
                  +                description
                  +                String
                  +                Yes
                  +                The description of the package.
                  +            
                  +            
                  +                category
                  +                Identifier
                  +                No
                  +                The category of the package.
                  +            
                  +            
                  +                path
                  +                File
                  +                No
                  +                The path of the file where the package is located.
                  +            
                  +            
                  +                publisher
                  +                String
                  +                Yes
                  +                The publisher of the package. It can be, for example, a company or group of people.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: InstallationDetails
                  +        
                  +        The InstallationDetails structure holds the installation details of a certain package.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                InstallationDetails
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                8
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                installed
                  +                Boolean
                  +                Yes
                  +                The status information about whether a package is/was installed or not.
                  +            
                  +            
                  +                folderLocation
                  +                String
                  +                Yes
                  +                To be done...
                  +            
                  +        
                  +        
                  +            Service data types: CommandExecutor
                  +        
                  +        
                  +            
                  +            Composite: CommandDetails
                  +        
                  +        This structure holds the execution details of a command, including its status.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                CommandDetails
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                1
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                command
                  +                String
                  +                No
                  +                The command line passed to the executing shell instance.
                  +            
                  +            
                  +                pid
                  +                UInteger
                  +                Yes
                  +                Assigned Process ID of the spawned shell instance. Shall be NULL if the execution has not started yet.
                  +            
                  +            
                  +                exitCode
                  +                Integer
                  +                Yes
                  +                Exit code of the command. Shall be NULL if the execution has not completed yet.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: StringPair
                  +        
                  +        The StringPair structure used to pass environment variables.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                StringPair
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                2
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                first
                  +                String
                  +                No
                  +                The first field (typically a key).
                  +            
                  +            
                  +                second
                  +                String
                  +                No
                  +                The second field (typically a value).
                  +            
                  +        
                  +        
                  +            Service data types: AppsLauncher
                  +        
                  +        
                  +            
                  +            Composite: AppDetails
                  +        
                  +        The AppDetails structure holds the details of an instance of an app.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                AppDetails
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                1
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                name
                  +                Identifier
                  +                No
                  +                The name of the app. Must not be empty or wildcard value.
                  +            
                  +            
                  +                description
                  +                String
                  +                No
                  +                The description of the app.
                  +            
                  +            
                  +                version
                  +                String
                  +                No
                  +                The version of the app.
                  +            
                  +            
                  +                category
                  +                Identifier
                  +                No
                  +                The category of the app.
                  +            
                  +            
                  +                runAtStartup
                  +                Boolean
                  +                No
                  +                Controls whether the app runs at startup of the Supervisor.
                  +            
                  +            
                  +                running
                  +                Boolean
                  +                No
                  +                The current running state of the app.
                  +            
                  +            
                  +                extraInfo
                  +                String
                  +                Yes
                  +                Additional information that might be implementation-specific.
                  +            
                  +            
                  +                copyright
                  +                String
                  +                Yes
                  +                The copyright of the app.
                  +            
                  +            
                  +                runAs
                  +                String
                  +                Yes
                  +                The user the app is run as.
                  +            
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        No errors are defined in this specification.
                  +    
                  +
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area007-v001-SoftwareManagement/word/numbering.xml b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area007-v001-SoftwareManagement/word/numbering.xml
                  new file mode 100644
                  index 00000000..d159498b
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area007-v001-SoftwareManagement/word/numbering.xml
                  @@ -0,0 +1,41 @@
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area007-v001-SoftwareManagement/word/styles.xml b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area007-v001-SoftwareManagement/word/styles.xml
                  new file mode 100644
                  index 00000000..ee967ee1
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area007-v001-SoftwareManagement/word/styles.xml
                  @@ -0,0 +1 @@
                  +
                  \ No newline at end of file
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area009-v001-MPD/[Content_Types].xml b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area009-v001-MPD/[Content_Types].xml
                  new file mode 100644
                  index 00000000..fbe325d6
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area009-v001-MPD/[Content_Types].xml
                  @@ -0,0 +1 @@
                  +
                  \ No newline at end of file
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area009-v001-MPD/_rels/.rels b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area009-v001-MPD/_rels/.rels
                  new file mode 100644
                  index 00000000..d6637f3e
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area009-v001-MPD/_rels/.rels
                  @@ -0,0 +1 @@
                  +
                  \ No newline at end of file
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area009-v001-MPD/word/_rels/document.xml.rels b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area009-v001-MPD/word/_rels/document.xml.rels
                  new file mode 100644
                  index 00000000..7af141e1
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area009-v001-MPD/word/_rels/document.xml.rels
                  @@ -0,0 +1 @@
                  +
                  \ No newline at end of file
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area009-v001-MPD/word/document.xml b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area009-v001-MPD/word/document.xml
                  new file mode 100644
                  index 00000000..333c8db0
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area009-v001-MPD/word/document.xml
                  @@ -0,0 +1,1958 @@
                  +
                  +
                  +    
                  +        
                  +            Specification: MPD
                  +        
                  +        
                  +            General
                  +        
                  +        This section contains the specifications for the MPD services.
                  +        Mission Operations services - Mission Product Distribution
                  +        This area contains the following services:
                  +        ProductRetrieval
                  +        OrderManagement
                  +        ProductOrderDelivery
                  +        
                  +            
                  +            Service: ProductRetrieval
                  +        
                  +        
                  +            Overview
                  +        
                  +        The Product Retrieval Service allows browsing and retrieval of existing products.
                  +        
                  +            Table 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Table \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Table_TOC \s 1 1
                  +            ProductRetrieval Service Operations
                  +            "
                  +            :  ProductRetrieval Service Operations
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Area Identifier
                  +                Service Identifier
                  +                Area Number
                  +                Service Number
                  +                Area Version
                  +            
                  +            
                  +                MPD
                  +                ProductRetrieval
                  +                9
                  +                1
                  +                1
                  +            
                  +            
                  +                Interaction Pattern
                  +                Operation Identifier
                  +                Operation Number
                  +                Capability Set
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_1_listProducts" listProducts
                  +                1
                  +                1
                  +            
                  +            
                  +                PROGRESS
                  +                 HYPERLINK  \l "OPERATION_1_getProducts" getProducts
                  +                2
                  +                2
                  +            
                  +            
                  +                PROGRESS
                  +                 HYPERLINK  \l "OPERATION_1_deliverProductFiles" deliverProductFiles
                  +                3
                  +                3
                  +            
                  +        
                  +        
                  +            Service-level Requirements
                  +        
                  +        The Product Retrieval service provider may provide the capability to list mission data products, to get mission data products, and/or to remotely deliver mission data products as files.
                  +        The operations of the Product Retrieval service shall uniquely reference the mission data products using ObjectRefs.
                  +        
                  +            
                  +            NOTE
                  +            
                  +            The product reference may be known through an out-of-band agreement or may have been determined through the listProducts operation.
                  +        
                  +        If a mission data product is remotely delivered as a file, then the filename of the file may be taken from the key field of the ObjectIdentity of the Product data structure.
                  +        
                  +            
                  +            Operation: listProducts
                  +        
                  +        
                  +            Overview
                  +        
                  +        The listProducts operation lists the available products for a selected product filter and optionally also for a selected creation date and for a selected content date time window.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                listProducts
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                NoYesYes
                  +                 HYPERLINK  \l "DATATYPE_ProductFilter" ProductFilter productFilter HYPERLINK  \l "DATATYPE_TimeWindow" TimeWindow creationDate HYPERLINK  \l "DATATYPE_TimeWindow" TimeWindow contentDate
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                No
                  +                List< HYPERLINK  \l "DATATYPE_ProductMetadata" ProductMetadata> metadatas
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        productFilter - The product filter used to refine the selection of products.
                  +        creationDate - The time window used to filter products based on their creation date.
                  +        contentDate - The time window used to filter products based on their content creation period.
                  +        metadatas - The list of metadata entries that match the selected filters.
                  +        
                  +            Requirements
                  +        
                  +        A consumer shall specify the productFilter, and optionally, the time windows for the creationDate and the contentDate of the products intended to be listed.
                  +        The service provider shall select the products based on the values defined inside the productFilter. The ProductFilter structure specifies the conditions for each of the fields.
                  +        If the creationDate is NULL, then the service provider shall not filter the products based on the creationDate.
                  +        If the contentDate is NULL, then the service provider shall not filter the products based on the contentDate.
                  +        The service provider shall return a list of metadata entries for the products that satisfy all the specified individual criteria defined by the product filter, the creation date, and the content creation date.
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        Invalid: When a field in the message contains an invalid value.
                  +        Too Many: When the list cannot be returned due to too many entries.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                Invalid
                  +                1
                  +                String
                  +                A textual description with the reason for invalidity.
                  +            
                  +            
                  +                Too Many
                  +                5
                  +                String
                  +                An optional description stating the number of entries that were found and the maximum number of entries supported by the operation.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: getProducts
                  +        
                  +        
                  +            Overview
                  +        
                  +        The getProducts operation retrieves the selected mission data products from the provider.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                getProducts
                  +            
                  +            
                  +                Interaction Pattern
                  +                PROGRESS
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                PROGRESS
                  +                No
                  +                List<ObjectRef< HYPERLINK  \l "DATATYPE_Product" Product>> productRefs
                  +            
                  +            
                  +                OUT
                  +                ACK
                  +                -
                  +                -
                  +            
                  +            
                  +                OUT
                  +                UPDATE
                  +                No
                  +                 HYPERLINK  \l "DATATYPE_Product" Product product
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                -
                  +                -
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        productRefs - The references to the products to be retrieved.
                  +        product - The selected mission data product(s).
                  +        
                  +            Requirements
                  +        
                  +        A consumer shall send the list of product references (as ObjectRefs) to the service provider of the products intended to be retrieved.
                  +        The provider shall send an Acknowledge message indicating that there are no unknown product references.
                  +        The service provider shall return each referenced product to the service consumer in a separate Update message.
                  +        The final Response message shall be empty, and it indicates to the consumer that all products have been returned.
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return the following error:
                  +        Unknown: When one or more of the productRefs was not found.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                Unknown
                  +                4
                  +                List<Integer>
                  +                The indexes of referenced products in the list that were not found. The first item has an index value of 0.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: deliverProductFiles
                  +        
                  +        
                  +            Overview
                  +        
                  +        The deliverProductFiles operation allows consumers to instruct the provider to initiate a remote file transfer delivery of the selected mission data products to a specified target.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                deliverProductFiles
                  +            
                  +            
                  +                Interaction Pattern
                  +                PROGRESS
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                PROGRESS
                  +                NoNo
                  +                List<ObjectRef< HYPERLINK  \l "DATATYPE_Product" Product>> productRefsURI deliverTo
                  +            
                  +            
                  +                OUT
                  +                ACK
                  +                -
                  +                -
                  +            
                  +            
                  +                OUT
                  +                UPDATE
                  +                NoNoNo
                  +                 HYPERLINK  \l "DATATYPE_ProductMetadata" ProductMetadata metadataString filenameBoolean success
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                -
                  +                -
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        productRefs - The references to the products to be delivered.
                  +        deliverTo - The location's URI where the mission data product must be delivered.
                  +        metadata - The metadata of the transferred mission data product(s).
                  +        filename - The filename of the transferred mission data product(s).
                  +        success - The completion status of the remote file transfer.
                  +        
                  +            Requirements
                  +        
                  +        A consumer shall send a list of product references (as ObjectRefs) to the service provider of the products intended to be transferred and the delivery address as a URI.
                  +        The provider shall send an Acknowledge message indicating that there are no unknown product references and that the selected deliverTo URI is reachable.
                  +        The provider shall initiate the file transfer of the referenced mission data products to the selected deliverTo URI.
                  +        After each referenced product has been delivered by file transfer, a separate Update message shall be returned containing the product metadata, the respective filename, and a success status reporting if the file was successfully transferred.
                  +        The final Response message shall be empty, and it indicates to the consumer that all products have been delivered.
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        Delivery Failed: When the provider is unable to reach the selected URI (e.g. unreachable target machine, wrong credentials, revoked access, etc).
                  +        Unknown: When one or more of the productRefs was not found.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                Delivery Failed
                  +                2
                  +                String
                  +                Additional information on the reason for failure as a free format string.
                  +            
                  +            
                  +                Unknown
                  +                4
                  +                List<Integer>
                  +                The indexes of referenced products in the list that were not found. The first item has an index value of 0.
                  +            
                  +        
                  +        
                  +            
                  +            Service: OrderManagement
                  +        
                  +        
                  +            Overview
                  +        
                  +        The Order Management Service is used to submit and manage standing orders. Standing orders specify a product filter to subscribe to a subset of automatically generated products and define the method and destination for product delivery.
                  +        
                  +            Table 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Table \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Table_TOC \s 1 1
                  +            OrderManagement Service Operations
                  +            "
                  +            :  OrderManagement Service Operations
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Area Identifier
                  +                Service Identifier
                  +                Area Number
                  +                Service Number
                  +                Area Version
                  +            
                  +            
                  +                MPD
                  +                OrderManagement
                  +                9
                  +                2
                  +                1
                  +            
                  +            
                  +                Interaction Pattern
                  +                Operation Identifier
                  +                Operation Number
                  +                Capability Set
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_2_listStandingOrders" listStandingOrders
                  +                1
                  +                1
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_2_submitStandingOrder" submitStandingOrder
                  +                2
                  +                2
                  +            
                  +            
                  +                SUBMIT
                  +                 HYPERLINK  \l "OPERATION_2_cancelStandingOrder" cancelStandingOrder
                  +                3
                  +                
                  +            
                  +        
                  +        
                  +            Service-level Requirements
                  +        
                  +        Each standing order shall specify how newly added mission data products are handled by the provider.
                  +        
                  +            
                  +            NOTE
                  +            
                  +            This standard deliberately does not specify how to handle network outages. This is expected to be handled either in an implementation-specific manner or by the use of a transport layer that ensures delivery (e.g. ZMQueue). Additionally, in case there are missing products, these can be retrieved using the getProducts operation.
                  +        
                  +        
                  +            
                  +            Operation: listStandingOrders
                  +        
                  +        
                  +            Overview
                  +        
                  +        The listStandingOrders operation lists the existing standing orders on the service provider for a given user and domain.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                listStandingOrders
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                YesYes
                  +                Identifier userList<Identifier> domain
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                No
                  +                List< HYPERLINK  \l "DATATYPE_StandingOrder" StandingOrder> standingOrders
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        user - The user of the standing order(s) to be listed.
                  +        domain - The domain of the standing order(s) to be listed.
                  +        standingOrders - The standing orders that match the selected criteria.
                  +        
                  +            Requirements
                  +        
                  +        A consumer shall specify the user, and the domain, of the standing order intended to returned.
                  +        If the user is NULL, then the service provider shall not filter the standing orders based on the user.
                  +        If the domain is NULL, then the service provider shall not filter the standing orders based on the domain of the product filter in the standing order.
                  +        If the domain is not NULL, then the domain shall be compared against the domain of the product filter in the standing order.
                  +        The response shall contain a list of standing orders that match the specified user and domain.
                  +        
                  +            
                  +            NOTE
                  +            
                  +            Depending on any mission-specific confidentiality policy, the list of standing orders may be restricted to those belonging to the user associated with the service consumer.
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation does not return any errors.
                  +        
                  +            
                  +            Operation: submitStandingOrder
                  +        
                  +        
                  +            Overview
                  +        
                  +        The submitStandingOrder operation creates a new standing order in the provider for delivery of mission data products.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                submitStandingOrder
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                No
                  +                 HYPERLINK  \l "DATATYPE_StandingOrder" StandingOrder orderDetails
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                No
                  +                Long orderID
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        orderDetails - The details of the order to be submitted for processing.
                  +        orderID - The unique id of the standing order.
                  +        
                  +            Requirements
                  +        
                  +        The service provider shall ignore the received value in the orderID field of the orderDetails from the Request message.
                  +        The service provider shall generate a new unique ID and assign it to the received standing order, then return it to the consumer in the Response message.
                  +        Following successful creation of a new standing order, the service provider shall initiate the delivery of products following the specified criteria in the standing order.
                  +        When the end of the specified validity window is reached, the service provider shall cease delivery of products associated with the standing order.
                  +        If the specified delivery method is by file transfer, then the delivery occurs outside the service interface. If the specified delivery method is by service, then the delivery is performed through the operations of the Product Delivery service.
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        Invalid: When a field in the message contains an invalid value.
                  +        Invalid: When the delivery method is selected as FILETRANFER and the delivery URI is set to NULL.
                  +        Invalid: When the delivery method is not selected as FILETRANFER and the delivery URI is not set to NULL.
                  +        Order Failed: When the selected URI contains an unsupported scheme/protocol.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                Invalid
                  +                1
                  +                String
                  +                A textual description with the reason for invalidity.
                  +            
                  +            
                  +                Order Failed
                  +                3
                  +                String
                  +                Any other optional information, for example, supported scheme/protocols.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: cancelStandingOrder
                  +        
                  +        
                  +            Overview
                  +        
                  +        The cancelStandingOrder operation cancels an existing standing order.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                cancelStandingOrder
                  +            
                  +            
                  +                Interaction Pattern
                  +                SUBMIT
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                SUBMIT
                  +                No
                  +                Long orderID
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        orderID - The unique id of the standing order to be cancelled.
                  +        
                  +            Requirements
                  +        
                  +        The service consumer shall send to the service provider, the orderID of the standing order intended to be cancelled.
                  +        
                  +            
                  +            NOTE
                  +            
                  +            The authorization aspects of who is allowed to cancel which standing orders is not in the scope of this service specification, as this service specifies only the interface of a product distribution system. In a full system implementation, the authorization is either handled by the implementation of respective rules in the Access Control element of MAL or as part of the service provider software implementation.
                  +        
                  +        The provider shall cancel the standing order associated with the submitted orderID.
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return the following error:
                  +        Unknown: When the referenced orderID does not exist.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                Unknown
                  +                4
                  +                Long
                  +                Contains the orderID that does not exist.
                  +            
                  +        
                  +        
                  +            
                  +            Service: ProductOrderDelivery
                  +        
                  +        
                  +            Overview
                  +        
                  +        The Product Order Delivery Service is used in conjunction with existing standing orders (for the delivery of selected products). File delivery of products, if requested in the standing order, will be delivered without the need to use these service operations. The service provides two capabilities to the consumer: (1) to receive notifications each time their ordered products have been delivered as files; (2) to receive the ordered products via message transfer rather than file delivery.
                  +        
                  +            Table 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Table \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Table_TOC \s 1 1
                  +            ProductOrderDelivery Service Operations
                  +            "
                  +            :  ProductOrderDelivery Service Operations
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Area Identifier
                  +                Service Identifier
                  +                Area Number
                  +                Service Number
                  +                Area Version
                  +            
                  +            
                  +                MPD
                  +                ProductOrderDelivery
                  +                9
                  +                3
                  +                1
                  +            
                  +            
                  +                Interaction Pattern
                  +                Operation Identifier
                  +                Operation Number
                  +                Capability Set
                  +            
                  +            
                  +                PUB-SUB
                  +                 HYPERLINK  \l "OPERATION_3_notifyProductDelivery" notifyProductDelivery
                  +                1
                  +                1
                  +            
                  +            
                  +                PUB-SUB
                  +                 HYPERLINK  \l "OPERATION_3_deliverProducts" deliverProducts
                  +                2
                  +                2
                  +            
                  +        
                  +        
                  +            Service-level Requirements
                  +        
                  +        The Product Order Delivery service may use the MAL Access Control mechanism to define access control policies.
                  +        If access control policies are implemented, then their configuration shall be specified on a case-by-case basis for each deployment.
                  +        If a mission data product is remotely delivered as a file, then the filename of the file may be taken from the key field of the ObjectIdentity of the Product data structure.
                  +        
                  +            
                  +            Operation: notifyProductDelivery
                  +        
                  +        
                  +            Overview
                  +        
                  +        The notifyProductDelivery operation publishes a notification whenever a product has been delivered by file transfer in accordance with an existing standing order.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                notifyProductDelivery
                  +            
                  +            
                  +                Interaction Pattern
                  +                PUBLISH-SUBSCRIBE
                  +            
                  +            
                  +                Subscription Keys
                  +                Identifier userLong orderID
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                OUT
                  +                PUBLISH
                  +                NoNoNoNo
                  +                 HYPERLINK  \l "DATATYPE_ProductMetadata" ProductMetadata metadataString filenameURI deliveredToBoolean success
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        user - The user associated with the standing order of the product being notified.
                  +        orderID - The orderID of the standing order for the product being notified.
                  +        metadata - The metadata of the mission data product.
                  +        filename - The filename of the mission data product.
                  +        deliveredTo - The location's URI where the mission data product was delivered.
                  +        success - The status indicating the successful delivery of the mission data product.
                  +        
                  +            Requirements
                  +        
                  +        Upon successful file transfer of a mission data product that is associated with a standing order, the service provider shall publish a delivery notification.
                  +        The service provider shall publish the delivery notification together with subscription keys corresponding to the associated user and orderID.
                  +        A service consumer may subscribe to notifications for a specific user, or for all users with the use of the wildcard in the user field.
                  +        A service consumer may subscribe to notifications for a specific standing order, or for all standing orders with the use of the wildcard in the orderID field.
                  +        If the delivery of a mission data product is not successful, then the respective success field of the Publish message shall be set to FALSE.
                  +        The published message shall contain the metadata, filename, the mission data product's delivered location, and the status indicating if the delivery was successful.
                  +        
                  +            MO Errors
                  +        
                  +        The operation does not return any errors.
                  +        
                  +            
                  +            Operation: deliverProducts
                  +        
                  +        
                  +            Overview
                  +        
                  +        The deliverProducts operation publishes mission data products directly via the service interface for an existing standing order.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                deliverProducts
                  +            
                  +            
                  +                Interaction Pattern
                  +                PUBLISH-SUBSCRIBE
                  +            
                  +            
                  +                Subscription Keys
                  +                Identifier userLong orderID
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                OUT
                  +                PUBLISH
                  +                No
                  +                 HYPERLINK  \l "DATATYPE_Product" Product product
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        user - The user associated with the standing order of the product being notified.
                  +        orderID - The orderID of the standing order for the product being notified.
                  +        product - The mission data product.
                  +        
                  +            Requirements
                  +        
                  +        Upon the creation (or availability) of a new mission data product that matches a certain standing order, the service provider shall publish this mission data product via the service interface.
                  +        
                  +            
                  +            NOTE
                  +            
                  +            The operation will only send newly added products (equivalent behaviour to listenning to a radio channel). For previous products, the consumer can use the getProducts operation.
                  +        
                  +        The service provider shall publish the mission data product together with subscription keys corresponding to the associated user and orderID.
                  +        A service consumer may subscribe to mission data products for a specific user, or for all users with the use of the wildcard in the user field.
                  +        A service consumer may subscribe to mission data products for a specific standing order, or for all standing orders with the use of the wildcard in the orderID field.
                  +        
                  +            MO Errors
                  +        
                  +        The operation does not return any errors.
                  +        
                  +            Data types
                  +        
                  +        
                  +            Area data types: MPD
                  +        
                  +        
                  +            
                  +            MO Object: Product
                  +        
                  +        A Product is an MO object that corresponds to a specific occurrence of a generated mission data product.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                Product
                  +            
                  +            
                  +                Extends
                  +                Object
                  +            
                  +            
                  +                Short Form Part
                  +                1
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                objectIdentity
                  +                ObjectIdentity
                  +                No
                  +                The identity of the MO Object.
                  +            
                  +            
                  +                productMetadata
                  +                 HYPERLINK  \l "DATATYPE_ProductMetadata" ProductMetadata
                  +                No
                  +                The product metadata of the mission data product. The productRef field inside the productMetadata may be null when used in this context.
                  +            
                  +            
                  +                productBody
                  +                Blob
                  +                No
                  +                The product body of the mission data product.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ProductType
                  +        
                  +        A ProductType contains the product type definition of a mission data product. The ProductType defines the metadata attributes associated with the product and implies (but does not specify) the structure of the product body. The ProductType is part of the Product Metadata.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ProductType
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                2
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                name
                  +                Identifier
                  +                No
                  +                The name of the Product Type.
                  +            
                  +            
                  +                description
                  +                String
                  +                Yes
                  +                The description of the Product Type.
                  +            
                  +            
                  +                attributeDefs
                  +                List< HYPERLINK  \l "DATATYPE_AttributeDef" AttributeDef>
                  +                Yes
                  +                The list of metadata Attribute Definitions.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: StandingOrder
                  +        
                  +        A StandingOrder is a data structure that holds the details of a standing order. This includes the orderID, the user who owns the product order, the product filter, how the products are to be delivered, the target URI where to deliver the files, and additional comments.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                StandingOrder
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                3
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                orderID
                  +                Long
                  +                Yes
                  +                The orderID of the standing order. It shall be NULL when the order is being submitted.
                  +            
                  +            
                  +                user
                  +                Identifier
                  +                No
                  +                The user that is the owner of the product order.
                  +            
                  +            
                  +                productFilter
                  +                 HYPERLINK  \l "DATATYPE_ProductFilter" ProductFilter
                  +                Yes
                  +                Specifies the filter criteria for the standing order, including the product type and optional filters on product source and metadata attributes.
                  +            
                  +            
                  +                validityPeriod
                  +                 HYPERLINK  \l "DATATYPE_TimeWindow" TimeWindow
                  +                Yes
                  +                Period of time over which the standing order is required to be active.
                  +            
                  +            
                  +                deliveryMethod
                  +                 HYPERLINK  \l "DATATYPE_DeliveryMethodEnum" DeliveryMethodEnum
                  +                No
                  +                Specifies how the product is to be delivered: via the service interface or by file transfer.
                  +            
                  +            
                  +                deliverTo
                  +                URI
                  +                Yes
                  +                The delivery address for file transfer. Not required if deliveryMethod is SERVICE.
                  +            
                  +            
                  +                comments
                  +                String
                  +                Yes
                  +                Any optional notes or comments.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ProductMetadata
                  +        
                  +        The ProductMetadata comprises the metadata of the product (without the product body) and is used when returning a list of available products for retrieval. A ProductMetadata is associated to a specific Product.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ProductMetadata
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                4
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                productType
                  +                 HYPERLINK  \l "DATATYPE_ProductType" ProductType
                  +                No
                  +                The product type definition.
                  +            
                  +            
                  +                productRef
                  +                ObjectRef< HYPERLINK  \l "DATATYPE_Product" Product>
                  +                No
                  +                The reference to the Product.
                  +            
                  +            
                  +                creationDate
                  +                Time
                  +                No
                  +                The time at which the product was generated.
                  +            
                  +            
                  +                source
                  +                Identifier
                  +                Yes
                  +                The source that triggered the generation of the product.
                  +            
                  +            
                  +                externalURI
                  +                URI
                  +                Yes
                  +                An external URI for the products to be retrieved. For example, this can be used for pulling a mission data product file via a HTTP URL link.
                  +            
                  +            
                  +                contentDate
                  +                 HYPERLINK  \l "DATATYPE_TimeWindow" TimeWindow
                  +                No
                  +                Period of time to which the source data used to generate the product relates.
                  +            
                  +            
                  +                attributes
                  +                List<NamedValue>
                  +                Yes
                  +                Named values for metadata attributes whose name and type correspond to those defined in the referenced ProductType.
                  +            
                  +            
                  +                description
                  +                String
                  +                Yes
                  +                The textual description of this specific occurrence of the product.
                  +            
                  +            
                  +                fileMetadata
                  +                 HYPERLINK  \l "DATATYPE_FileMetadata" FileMetadata
                  +                Yes
                  +                Additional optional metadata for files.
                  +            
                  +            
                  +                checksum
                  +                Blob
                  +                Yes
                  +                An optional checksum of the product body. If this functionality is enabled, then the checksum algorithm for the calculation shall be agreed as an out-of-band agreement.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: FileMetadata
                  +        
                  +        The FileMetadata contains specific metadata for files.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                FileMetadata
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                5
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                updateDate
                  +                Time
                  +                No
                  +                The latest update date.
                  +            
                  +            
                  +                mime
                  +                Identifier
                  +                No
                  +                The MIME type.
                  +            
                  +            
                  +                fileSize
                  +                Long
                  +                No
                  +                The size of the file in bytes.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ProductFilter
                  +        
                  +        The ProductFilter is used in the context of standing orders and service operations requesting a filtered list of available products. It specifies a filter in terms of productType, domain, sources and metadata attribute values. To pass the filter, the product must satisfy all criteria specified: the productType, the domain, one of any listed source objects and all specified metadata attribute filters. If no filter is specified for source or attribute filters, then all products of the specified type pass the filter. A ProductFilter relates to a specific ProductType. Note that the domain filter relates to the domain of the product. The domain of a generic product type (for example an orbit file) may be defined at agency level to avoid the need to define new types for each mission, but the generated product will be associated with a specific mission domain.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ProductFilter
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                6
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                productType
                  +                Identifier
                  +                Yes
                  +                The name of the product type definition.
                  +            
                  +            
                  +                domain
                  +                List<Identifier>
                  +                Yes
                  +                The domain to filter on. A wildcard may be used in order to select all possibilities within a sub-domain.
                  +            
                  +            
                  +                sources
                  +                List<Identifier>
                  +                Yes
                  +                The set of sources associated with the products to filter on. If the product source matches at least one of the listed sources, then it passes the filter. If the sources field is set to NULL, then no filtering on the product source will be performed.
                  +            
                  +            
                  +                attributeFilter
                  +                List< HYPERLINK  \l "DATATYPE_AttributeFilter" AttributeFilter>
                  +                Yes
                  +                Set of attribute filters defining the desired values of product metadata attributes. If multiple attribute filters are defined, then the product metadata must match all (ANDed) specified criteria to pass the filter.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: TimeWindow
                  +        
                  +        The TimeWindow represents a specific period, between the start and end of a time window.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                TimeWindow
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                7
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                start
                  +                Time
                  +                No
                  +                The start time of the time window.
                  +            
                  +            
                  +                end
                  +                Time
                  +                No
                  +                The end time of the time window.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: AttributeDef
                  +        
                  +        An AttributeDef specifies a metadata attribute in terms of its name, attribute type, optional units, and a free text description. Note that as AttributeDef is only used in the context of ProductType.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                AttributeDef
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                8
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                name
                  +                Identifier
                  +                No
                  +                The name to the metadata attribute.
                  +            
                  +            
                  +                attributeType
                  +                AttributeType
                  +                No
                  +                Specifies the MAL attribute type of the metadata attribute.
                  +            
                  +            
                  +                units
                  +                String
                  +                Yes
                  +                The units associated with the metadata attribute (optional).
                  +            
                  +            
                  +                description
                  +                String
                  +                Yes
                  +                The description of the metadata attribute (optional).
                  +            
                  +        
                  +        
                  +            
                  +            Composite: AttributeFilter
                  +        
                  +        An AttributeFilter is an abstract data structure that enables three types of filters: ValueRange, ValueSet, and StringPattern. It is used in the context of selecting a subset of mission data products.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                AttributeFilter
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Abstract
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                name
                  +                Identifier
                  +                No
                  +                The name of the metadata attribute to filter. If the product metadata being evaluated does not contain an attribute with this name, then the evaluation of the filter shall be false.
                  +            
                  +            
                  +                include
                  +                Boolean
                  +                No
                  +                Indicates whether the filter is to include [TRUE] or exclude [FALSE] attribute values that match the filter.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ValueRange
                  +        
                  +        A ValueRange is a concrete subtype of AttributeFilter that allows the specification of an allowed (or disallowed) value range for a metadata attribute.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ValueRange
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_AttributeFilter" AttributeFilter
                  +            
                  +            
                  +                Short Form Part
                  +                9
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                name
                  +                Identifier
                  +                No
                  +                The name of the metadata attribute to filter. If the product metadata being evaluated does not contain an attribute with this name, then the evaluation of the filter shall be false.
                  +            
                  +            
                  +                include
                  +                Boolean
                  +                No
                  +                Indicates whether the filter is to include [TRUE] or exclude [FALSE] attribute values that match the filter.
                  +            
                  +            
                  +                minimum
                  +                Attribute
                  +                Yes
                  +                The minimum value of the value range (greater than or equal to).
                  +            
                  +            
                  +                maximum
                  +                Attribute
                  +                Yes
                  +                The maximum value of the value range (less than or equal to).
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ValueSet
                  +        
                  +        A ValueSet is a concrete subtype of AttributeFilter that allows the specification of a set of allowed (or disallowed) values for a metadata attribute.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ValueSet
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_AttributeFilter" AttributeFilter
                  +            
                  +            
                  +                Short Form Part
                  +                10
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                name
                  +                Identifier
                  +                No
                  +                The name of the metadata attribute to filter. If the product metadata being evaluated does not contain an attribute with this name, then the evaluation of the filter shall be false.
                  +            
                  +            
                  +                include
                  +                Boolean
                  +                No
                  +                Indicates whether the filter is to include [TRUE] or exclude [FALSE] attribute values that match the filter.
                  +            
                  +            
                  +                values
                  +                List<Attribute>
                  +                No
                  +                The set of allowed (or disallowed) values for the metadata attribute.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: StringPattern
                  +        
                  +        A StringPattern is a concrete subtype of AttributeFilter that allows the specification of a regular expression (or match pattern) to be searched for in the value of a text type metadata attribute.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                StringPattern
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_AttributeFilter" AttributeFilter
                  +            
                  +            
                  +                Short Form Part
                  +                11
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                name
                  +                Identifier
                  +                No
                  +                The name of the metadata attribute to filter. If the product metadata being evaluated does not contain an attribute with this name, then the evaluation of the filter shall be false.
                  +            
                  +            
                  +                include
                  +                Boolean
                  +                No
                  +                Indicates whether the filter is to include [TRUE] or exclude [FALSE] attribute values that match the filter.
                  +            
                  +            
                  +                regex
                  +                String
                  +                No
                  +                The regular expression - a sequence of characters that specifies a match pattern to be searched for in a text type metadata attribute (String, Identifier or URI).
                  +            
                  +        
                  +        
                  +            
                  +            Enumeration: DeliveryMethodEnum
                  +        
                  +        The DeliveryMethodEnum enumeration defines the delivery method to be used for delivery of mission data products.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                DeliveryMethodEnum
                  +            
                  +            
                  +                Short Form Part
                  +                12
                  +            
                  +            
                  +                Enumeration Value
                  +                Numerical Value
                  +                Comment
                  +            
                  +            
                  +                SERVICE_COMPLETE
                  +                1
                  +                The mission data product is to be delivered via service messages with both the metadata and the product body.
                  +            
                  +            
                  +                SERVICE_JUST_METADATA
                  +                2
                  +                The mission data product is to be delivered via service messages with the metadata and without product body. Only the metadata of the product will be transferred. (Similar to the SERVICE_COMPLETE option but the productBody blob is set to NULL.)
                  +            
                  +            
                  +                FILETRANSFER
                  +                3
                  +                The mission data product is to be delivered by file transfer to the address contained in the deliverTo field.
                  +            
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The following table lists the errors defined in this specification:
                  +        
                  +            Table 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Table \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Table_TOC \s 1 1
                  +            MPD MO Errors
                  +            "
                  +            :  MPD MO Errors
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                Comment
                  +            
                  +            
                  +                Invalid
                  +                1
                  +                A field in the message contains an invalid value. If there are multiple errors, the first invalid field is reported.
                  +            
                  +            
                  +                Delivery Failed
                  +                2
                  +                An attempt to deliver a product file to the nominated address failed.
                  +            
                  +            
                  +                Order Failed
                  +                3
                  +                Creation of a new product order failed.
                  +            
                  +            
                  +                Unknown
                  +                4
                  +                The referenced item does not exist.
                  +            
                  +            
                  +                Too Many
                  +                5
                  +                Too many entries were found.
                  +            
                  +        
                  +    
                  +
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area009-v001-MPD/word/numbering.xml b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area009-v001-MPD/word/numbering.xml
                  new file mode 100644
                  index 00000000..14170886
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area009-v001-MPD/word/numbering.xml
                  @@ -0,0 +1,37 @@
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area009-v001-MPD/word/styles.xml b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area009-v001-MPD/word/styles.xml
                  new file mode 100644
                  index 00000000..ee967ee1
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area009-v001-MPD/word/styles.xml
                  @@ -0,0 +1 @@
                  +
                  \ No newline at end of file
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area009-v001-distribution/[Content_Types].xml b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area009-v001-distribution/[Content_Types].xml
                  new file mode 100644
                  index 00000000..fbe325d6
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area009-v001-distribution/[Content_Types].xml
                  @@ -0,0 +1 @@
                  +
                  \ No newline at end of file
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area009-v001-distribution/_rels/.rels b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area009-v001-distribution/_rels/.rels
                  new file mode 100644
                  index 00000000..d6637f3e
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area009-v001-distribution/_rels/.rels
                  @@ -0,0 +1 @@
                  +
                  \ No newline at end of file
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area009-v001-distribution/word/_rels/document.xml.rels b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area009-v001-distribution/word/_rels/document.xml.rels
                  new file mode 100644
                  index 00000000..7af141e1
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area009-v001-distribution/word/_rels/document.xml.rels
                  @@ -0,0 +1 @@
                  +
                  \ No newline at end of file
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area009-v001-distribution/word/document.xml b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area009-v001-distribution/word/document.xml
                  new file mode 100644
                  index 00000000..01bd4b77
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area009-v001-distribution/word/document.xml
                  @@ -0,0 +1,5708 @@
                  +
                  +
                  +    
                  +        
                  +            Specification: distribution
                  +        
                  +        
                  +            General
                  +        
                  +        This section contains the specifications for the distribution services.
                  +        This document contains the specification of Mission Data Product Distribution Services (MDPDS). The MDPDS provide access to space mission data. The Figure 2-1 illustrates the set of standards in support of the Mission Operations Services Concepts. The MDPDS belong to the Service Specifications.
                  +        
                  +        [INSERT IMAGE]
                  +        
                  +        Figure 1-1: Mission Operations Services Concept Document Set
                  +        
                  +        The MDPDS are in compliance with MO Service Framework layers (see reference [1]) and are defined in terms of the MAL [2] Therefore it is possible to deploy them over any supported communication protocol and message transport technology. 
                  +        This area contains the following services:
                  +        MissionDataProductDistribution
                  +        ProductsManagement
                  +        
                  +            Product concept
                  +        
                  +        The product concept has been introduced, in order to abstract from the structure, content and format in which diverse space mission data products can be persisted, requested and provisioned. This abstraction allows the specification of a generic set of services for managing, requesting and provisioning of space mission data products, without making assumptions about the implementations of the underlying mission data product distribution systems.
                  +        The MDPDS specifies three elements, which combination uniquely defines each product. That triple consists of the product type, the product source and the product format. The product type represents a category of mission data, which the product belongs to (e.g. parameter value evolution in a given time period, action history). Each product type has a list of attributes assigned to it. Attributes define fields (by providing their names, data types and usage) which the product consists of. Some attributes can be selected to filter or sort the product. The next element, the product source, contains an absolute location of an origin of the data. It indicates what exactly generated the data (e.g. particular sensor of the particular satellite of the particular mission). The product format is a standardized description detailing how to encode mission data products (e.g. a raw binary value, XML). It provides means to represent the information, which the product carries, in a standardized way. For each predefined product type, there is assigned a list of basic formats in which the product can be obtained.
                  +        In order to browse available products, the MDPDS have introduced the concept of the catalogue of products. Because the product type, product source, and product format uniquely identify every product, a single catalogue entry stores those three elements. Elements of the triple are related with each other. Every product type has assigned a list of product sources. A product format can be added only to the already defined pair of a product type and source. Due to that relation, the same order of adding product type, source and format is required to define new product. For the same reason, removal of a product source results in removal of the related product formats and, in turn, removal of a product type results in removal of the related product sources and formats.
                  +        The catalogue stores also additional information. Among them is a list of product attributes, being the subset of all the product attributes, which enumerates only the ones which can be used for filtering and sorting purposes. Furthermore, the catalogue entry contains a provisioning mode, compression methods, encryption methods and a description of the each product.
                  +        To make the product available it is required to add it to the catalogue and afterwards to optionally define its internal structure, called the product specification. The product specification represents product attributes in a portable way, by the means of the MAL service description language. The MDPDS provide a set of standardized product specifications for a limited number of product types, which are typically involved in interoperable mission operation scenarios. For other product types, it is possible to add a customized product specification.
                  +        
                  +            Mission Data Product Distribution Services composition
                  +        
                  +        The Mission Data Product Distribution Services consist of two services: Products Management and Mission Data Product Distribution. The purpose of each service is different, but they are related by a common concept. The relation is established by the catalogue of products. The Products Management service allows manipulation of the catalogue by providing means for defining available products. It can also be seen as a component responsible for the configuration of the Mission Data Product Distribution solution. The Mission Data Product Distribution service allows obtaining a list of products that the user is interested in and retrieving the selected product. From another perspective, it can be perceived as a specification of the interface for retrieval of the information about the products and the products themselves.
                  +        Figure 2‑2 The Use Case diagram for the Products Management service.
                  +        The use case diagram in the Figure Figure 2-2 presents an overview of the functionality provided by Products Management service. The main role of the service is to manage the catalogue of products. Each product, before it can be accessed, must have been created in the catalogue. As mentioned in section Error: Reference source not found, the product catalogue entry contains the triple of the product type, source and format along with additional details. Hence, the management of the catalogue relies on defining catalogue entries containing all those information for new products and removing entries for unavailable products.
                  +        As mentioned earlier, the product becomes available when it is defined in the catalogue. Providing product specification is recommended, but not required. To satisfy this recommendation, the Product Management service allows setting the specification of each product. Moreover, some of the attributes of the product specification can be configured to be used to filter or sort requested product. This action can be done only after adding a specification for the particular product.
                  +        Another aspect of the service is a possibility to define product streams. The MDPDS provides products in batch and stream provisioning modes. To allow provision of products in the latter mode, the stream must have been created in Product Management service first. The service allows creation of streams that transmit only instances of the products that have the specified type, come from the selected source, are in the chosen format and additionally match certain criteria.
                  +        Figure 2‑3 The Use Case diagram for the Mission Data Product Distribution service.
                  +        The model in the Figure Figure 2-3 illustrates the capabilities offered by the Mission Data Product Distribution service. The service allows the retrieval of the catalogue of products that has been defined in the Product Management service. It provides the functionality to query the catalogue by a given set of criteria, in order to limit the number of catalogue entries only to those, which the client may be interested in.
                  +        The main goal of the service is to deliver the mission data products to user who requested them. There are two provisioning modes – a batch mode and a stream mode. They differ in how they work and in functionality they offer. The batch mode enables to retrieve the historical data in a bunch, as well as the future data by scheduled periodic polling to check if some new is available. On the other hand, the stream mode provides the data once it is available and does it until the user is interested in receiving updates. Both provisioning modes enable limiting the products to retrieve, by specifying filter criteria.
                  +        The service also allows the client to obtain a list of attributes that can be used to compose a filter. The specification of the product can also be downloaded. An execution of each request may be cancelled at any moment. Additionally, batch requests can be suspended and resumed on demand. The service maintains the list of historical product requests and provides ability to browse them.
                  +        
                  +            MissionDataProductDistribution service
                  +        
                  +        The Mission Data Product Distribution service provides capabilities for retrieving the information about mission data products supported by a particular instance of the service and for distribution of selected products. It presents the consumer an interface that allows retrieving a list of available products, downloading their specifications and attributes, composing batch or stream product requests, managing their state and finally retrieving their execution status. The COM archive is responsible for storing the data that compose the products catalogue along withrelated product specifications and storing historical requests.
                  +        Figure 2‑7 A basic flow of actions required to request the product.
                  +        The diagram in the Figure 2-7 presents a typical flow of actions performed to obtain the product. The service allows the consumer to retrieve the information about the products, which are supported by a particular instance of the service provider, through requesting the catalogue of products of that provider instance. The returned list may contain a large number of catalogue entries. Therefore the catalogue can be filtered by product types and their descriptions, product formats, product sources, compression and encryption methods and provision modes. Once the product is decided upon, the user can also request its product specification, a list of sort attributes and a list of filter attributes.
                  +        Figure 2‑8 A batch product request.
                  +        The service allows the user to create either a batch or a stream request. Both require providing some details among which the most important ones are the product type, source, and format. There could be also optionally specified a list of filtering criteria. Moreover,
                  +        the response data may be compressed and encrypted.
                  +        The Figure 2-8 presents a batch request, which can be handled immediately or scheduled for single or repeatable execution. The repeatable request is defined in terms of an execution date of the first request specified in relation to the UTC time zone, an interval and the expiry date. When the user issues the repeatable request, the MDPDS convert it to a list of sub-requests and assigns a request identifiers for each one of them, so they can be checked and controlled separately. In order not to schedule infinite number of sub-requests, the maximum number of sub-requests or the maximum period of time to schedule sub-requests shall be defined during implementation. The request can be cancelled or suspended at any time on demand and resumed from the same point within data transmission. The current status of the request is maintained by the service and can be checked anytime.
                  +        Figure 2‑9 A stream product request.
                  +        In the Figure 2-9 there is illustrated a process of subscribing to the product stream. The stream contains instances of the requested product and is already created in Product Management service. The only action left to execute is to subscribe to it in order to receive updates. Updates are sent till stream is not closed, is expired or until a signal with an unsubscribe message is sent. The stream can be closed at any time by invoking a proper operation in Product Managements service, so then all subscriptions become invalid and all the subscribers stop receiving any updates. The same situation happens when the stream expires, where the expiry date is one of the parameters of the stream creation. Finally, updates stop being sent to the subscriber when unsubscribe action is called – then only that particular subscriber is affected, the others still receive the upcoming data.
                  +        
                  +            ProductsManagement service
                  +        
                  +        The Products Management service provides the capabilities to manage the catalogue of the products on the service provider side. It presents the consumer a convenient interface to modify catalogue entries, product specifications and product attributes. It can be also used to create a stream of product updates. Storage of any data generated in the service is delegated to the COM archive.
                  +        The process of creating a product must be conducted in the proper order, which is illustrated in the Figure 2-4.
                  +        Figure 2‑4: Actions to create a new product
                  +        The first step of this process is to create a catalogue entry. It is complex activity that can be decomposed into group of smaller steps shown on the diagram in the Figure 2-4.
                  +        Figure 2‑5 Actions to create a catalogue entry
                  +        The creation of the catalogue entry begins with providing a type of a new product. Because the name of the product type could not be sufficient to explain what category of the mission data the product belongs to, the consumer may additionally add a description. As sole type does not provide all information that describes the product, so the next step is to specify all the sources, which the product is available from. Then the only piece of information left to unambiguously distinguish different products is their data representation, which is expressed by a product format. Having defined the product type, the source and the format, availability in the batch or the stream provision mode has to be set. Optionally, in the last step, there could be specified compression and encryption methods applicable for the product. Finally, the catalogue entry is created and stored in the COM archive.
                  +        The creation of the catalogue entry is sufficient to make the product available. However it is recommended to provide a specification for every available product. This is illustrated in the step two in the Figure 2-4. Eventually, the selected attributes of the product specification may be configured to be used in product requests as filter or sort parameters. Again, also in this case, the COM archive is used to store provided information.
                  +        Figure 2‑6 The creation of the product stream.
                  +        The catalogue keeps information if the particular product can be streamed. For products applicable for streaming, the Product Management service may be used to create their streams. A stream creation may
                  +        happen at any point in time, whenever a need occurs. Flow of actions presented in the Figure 2-6 illustrates how the stream is created. At first, product type, the source and the format are selected. As the client may be interested in obtaining only products that match certain criteria, a filter with a desired combination of chosen product attributes has to be provided. If required, additional stream options may be passed: for securing the stream, an encryption algorithm has to be set, for limiting the size of data, a compression algorithm has to be pointed. There is also provided an option to automatically close the stream after the specified date has passed.
                  +        
                  +            Rationale
                  +        
                  +        The MDPDS specification defines means for distribution of mission data products. Therefore this chapter is intended to detail the description of the interface exposed by MDPDS, designated to fulfill this need. It enumerates the service requirements, specifies all the operations and data types required to manage and transfer products and describes methods of the interaction between objects.
                  +        
                  +            Functional requirements
                  +        
                  +        This Recommended Standard specifies an interface to distribute mission data products, which meets the following requirements:
                  +        Retrieval of misison data products for a given time period.
                  +        The consumer of the MDPDS shall be able to request historic mission data products for a given time period, specifying :
                  +        Product type
                  +        Product format
                  +        Encryption format (optional)
                  +        Compression format (optional)
                  +        Schedule (optional)
                  +        Filter (optional).
                  +        Sort field name (optional)
                  +        Message chunk size (optional)
                  +        Batch Request
                  +        The MDPDS provider shall generate a complete mission data product that fulfills the product request and provide itto the consumer in a finite number of chunks. The number of the chunks shall depend on the maximum size of the chunk specified by the consumer.The MDPDS provider shall allow distribution of the mission data products over a transport protocol and delivery of the data to the remote destination, where both the protocol and the destination shall be specified in the product request.
                  +        Request Identifiers
                  +        The MDPDS shall assing a unique id to each request for a mission product. It shall report the
                  +        status of the product delivery and the number of provisioned chunks after the last chunk of the mission data product
                  +        has been provisioned.
                  +        Request scheduling
                  +        The MDPDS shall allow the consumer to schedule
                  +        an execution of a request.The MDPDS shall support at least the following scheduling attributes:
                  +        Begin time in relation to the UTC time zone
                  +        Interval
                  +        Repeatability
                  +        Expiry time in relation to the UTC time zone
                  +        Stream Request
                  +        The MDPDS provider shall generate a stream of mission data product instances that fulfill the product request and provide them to the consumer in a stream of messages. Once new mission data product becomes available, the provider shall send it to all subscribed consumers. The MDPDS shall assign a unique id to each product stream. 
                  +        Query Product Requests
                  +        The MDPDS provider shall provide a list of historical requests of mission data products.
                  +        The MDPDS shall allow the consumer to filter requests of mission data products by:
                  +        Time range
                  +        Status
                  +        Account name
                  +        Control Request Execution
                  +        The MDPDS shall allow the consumer to suspend a not completed request.
                  +        The MDPDS shall allow the consumer to resume a request.
                  +        The MDPDS shall allow the consumer to terminate a not completed request.
                  +        Retrieval of Catalogue of Products
                  +        The MDPDS shall allow modification of the catalogue of products.
                  +        Modification of catalogue of products
                  +        The MDPDS shall allow to modify a catalogue of products.
                  +        Assignment and removal of the specifcation of the product
                  +        The MDPDS consumer shall be able to assign a product specification to every product. The MDPDS consumer shall be able to remove a product specification.
                  +        Retrieval of Product Attributes
                  +        The MDPDS shall be able to provide a list of product attributes.
                  +        Modification of the list of product types
                  +        The MDPDS consumer shall be able to add a product type by providing a self-descriptive name of the product and an optional description. The MDPDS consumer shall be able to remove a product type.
                  +        Modification of the list of sources
                  +        The MDPDS consumer shall be able to add a product source for the given product type by specyfing a URI address. The MDPDS consumer shall be able to remove a source.
                  +        Modification of the list of product provisioning details
                  +        The MDPDS consumer shall be able to add a product provisioning details for each combination of the product type and source:
                  +        product format
                  +        privisioning mode
                  +        compression format
                  +        encryption format
                  +        The MDPDS consumer shall be able to remove the product provisioning detail.
                  +        Modification of the list of product attributes
                  +        The MDPDS consumer shall be able to define a product attribute, which can be used by operations of filtering or sorting a product. The MDPDS consumer shall be able to remove a
                  +        product attribute,
                  +        Definition of standard products
                  +        The MDPDS shall define structures of standard product types.
                  +        Definition of standard formats
                  +        The MDPDS shall define standard formats of products.
                  +        
                  +            
                  +            Service: MissionDataProductDistribution
                  +        
                  +        
                  +            Overview
                  +        
                  +        The MissionDataProductDistribution service provides operations to retrieve a catalogue of products and request a product in the batch mode or in the stream mode from one of configured data sources. The service provides also mechanisms to check a progress of the data delivery and to control it by suspend, resume and cancel operations.
                  +        
                  +        Figure 3‑10 A typical use case scenario for retrieval of the mission data product.
                  +        A typical use case scenario of the MDPD service is following (Figure 3-10). By invoking the getProductsCatalogue() operation, the Consumer retrieves from the Provider a list of product catalogue entries, which he may be interested in. To limit a number of potential matches, criteria that the response must meet may be provided. This is annotated in the picture by filter parameter of the getProductsCatalogue() operation. As the catalogue entries are actually stored in the COM archive, the Provider passes the request to the archive and returns a filtered list of matching entries. Next, the Consumer selects one of the products and retrieves, directly from the archive, its detailed information (the type, source, format, provisioning mode and attributes). Through the Provider, the Consumer obtains the detailed specification of the product. For that purpose the getProductSpecification() operation is executed. Its parameter is the type of the selected product. Finally, the Consumer sends to the Provider a customized product request in either a batch or a stream provisioning mode. The request specifies all the conditions that the product to retrieve must meet. In case of the batch mode, product is obtained through the requestProduct() operation. All the matching product instances are received one by one in the loop. Optionally, the execution of the request can be cancelled, suspended and resumed at any time. In turn, for the stream mode, the Consumer first creates stream containing instances of the specified product. The stream is created by the enableStreaming() operation of the Product Management service. Then the monitorProduct() operation is invoked by the Consumer to subscribe for all messages from that stream and to receive upcoming updates. At the end, the stream is closed by the disableStreaming() operation of the Product Management service.
                  +        
                  +            Table 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Table \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Table_TOC \s 1 1
                  +            MissionDataProductDistribution Service Operations
                  +            "
                  +            :  MissionDataProductDistribution Service Operations
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Area Identifier
                  +                Service Identifier
                  +                Area Number
                  +                Service Number
                  +                Area Version
                  +            
                  +            
                  +                distribution
                  +                MissionDataProductDistribution
                  +                9
                  +                1
                  +                1
                  +            
                  +            
                  +                Interaction Pattern
                  +                Operation Identifier
                  +                Operation Number
                  +                Capability Set
                  +            
                  +            
                  +                PROGRESS
                  +                 HYPERLINK  \l "OPERATION_1_requestProduct" requestProduct
                  +                1
                  +                1
                  +            
                  +            
                  +                SUBMIT
                  +                 HYPERLINK  \l "OPERATION_1_suspendRequest" suspendRequest
                  +                2
                  +                
                  +            
                  +            
                  +                SUBMIT
                  +                 HYPERLINK  \l "OPERATION_1_resumeRequest" resumeRequest
                  +                3
                  +                
                  +            
                  +            
                  +                SUBMIT
                  +                 HYPERLINK  \l "OPERATION_1_cancelRequest" cancelRequest
                  +                4
                  +                
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_1_getRequestStatus" getRequestStatus
                  +                5
                  +                2
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_1_queryProductRequest" queryProductRequest
                  +                6
                  +                
                  +            
                  +            
                  +                PUB-SUB
                  +                 HYPERLINK  \l "OPERATION_1_monitorProduct" monitorProduct
                  +                7
                  +                3
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_1_getProductsCatalogue" getProductsCatalogue
                  +                8
                  +                4
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_1_getProductSpecification" getProductSpecification
                  +                9
                  +                
                  +            
                  +        
                  +        
                  +            Service-level Requirements
                  +        
                  +        a) The MissionDataProductDistribution service shall provide:
                  +        a. the capability for requesting a product in two provisioning modes;
                  +        b. the capability for retrieving a status of request execution;
                  +        c. the capability for retrieving parameters of historic requests;
                  +        d. the capability for controlling the execution of a request;
                  +        e. the capability for retrieving the catalogue of products;
                  +        f. the capability for retrieving the specification of a product;
                  +        g. the capability for retrieving the attributes of a product.
                  +        b) The list of definitions of typical product types that are supported by the MissionDataProductDistribution service shall be declared during deployment of the service.
                  +        c) Each product request in the batch mode shall include:
                  +        a. a product type;
                  +        b. a product format;
                  +        c. a product source;
                  +        d. a destination (optional);
                  +        e. a time range (optional);
                  +        f. a filter (optional);
                  +        g. a schedule (optional);
                  +        h. an encryption (optional);
                  +        i. a compression (optional);
                  +        j. a field to sort the product (optional);
                  +        k. a chunk size (optional).
                  +        d) Each product request in the stream mode shall include use identifier of the product stream for subscription;
                  +        e) Each item in the catalogue of products shall contain COM object identifiers of:
                  +        a. a product type;
                  +        b. a product source;
                  +        c. a product provisioning detail.
                  +        f) The MissionDataProductDistribution shall use the COM archive service to store BatchProductRequest objects.
                  +        a) If a product is not defined or the provisioning mode is disabled in the catalogue of products, the corresponding request is cancelled and an error is returned.
                  +        
                  +            COM usage
                  +        
                  +        A BatchProductRequest COM object represents the body of the batch product request. A BatchProductRequest COM object body shall hold the BatchProductRequestDetails structure.
                  +        The LoginInstance structure of the Login Service shall indicate a user who issued the request[move description to Source Object column]
                  +        
                  +            Table 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Table \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Table_TOC \s 1 1
                  +            MissionDataProductDistribution Service Object Types
                  +            "
                  +            :  MissionDataProductDistribution Service Object Types
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Object Number
                  +                Object Name
                  +                Object Body Type
                  +                Related link
                  +                Source link
                  +            
                  +            
                  +                1
                  +                BatchProductRequest
                  +                 HYPERLINK  \l "DATATYPE_BatchProductRequestDetails" BatchProductRequestDetails
                  +                
                  +                The LoginInstance structure of the Login Service shall indicate a user who issued the request.
                  +            
                  +        
                  +        
                  +            COM Event Service usage
                  +        
                  +        When a new mission data product for the selected type, source and format is published, the NewProductAvailable event shall be generated.
                  +        The NewProductAvailable event shall use the related link to indicate the ProductCatalogueEntryDetails of the corresponding product.
                  +        When the product becomes unavailable, the ProductUnavailable event shall be generated.
                  +        The ProductUnavailable event shall use the related link to indicate the ProductCatalogueEntryDetails of the corresponding product.
                  +        
                  +            Table 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Table \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Table_TOC \s 1 1
                  +            MissionDataProductDistribution Service Events
                  +            "
                  +            :  MissionDataProductDistribution Service Events
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Object Number
                  +                Event Name
                  +                Object Body Type
                  +                Related link
                  +                Source link
                  +            
                  +            
                  +                101
                  +                NewProductAvailable
                  +                No body
                  +                ProductsManagement::5
                  +                
                  +            
                  +            
                  +                102
                  +                ProductUnavailable
                  +                No body
                  +                ProductsManagement::5
                  +                
                  +            
                  +        
                  +        
                  +            COM Object Relationships
                  +        
                  +        The Figure below shows the COM object and event relationships for this service:
                  +        
                  +            Figure 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Figure \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Figure_TOC \s 1 1
                  +            MissionDataProductDistribution Service COM object and event relationships
                  +            "
                  +            :  MissionDataProductDistribution Service COM object and event relationships
                  +        
                  +        
                  +            COM Archive Service usage
                  +        
                  +        A BatchProductRequest objects shall be stored in the COM archive.
                  +        
                  +            
                  +            Operation: requestProduct
                  +        
                  +        
                  +            Overview
                  +        
                  +        The requestProduct operation requests the mission data product to be delivered in the batch mode.
                  +        The PROGRESS interaction pattern is used as the returned set of data may be quite large and this allows it to be split over several MAL messages. The matching product is returned in one or more update messages. The response message contains a summary of the transmitted data.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                requestProduct
                  +            
                  +            
                  +                Interaction Pattern
                  +                PROGRESS
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                PROGRESS
                  +                Yes
                  +                 HYPERLINK  \l "DATATYPE_BatchProductRequestDetails" BatchProductRequestDetails request
                  +            
                  +            
                  +                OUT
                  +                ACK
                  +                YesYesYes
                  +                Long requestIdList<Long> subRequestIdsLong productSize
                  +            
                  +            
                  +                OUT
                  +                UPDATE
                  +                NoYes
                  +                Long requestIdElement product
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                Yes
                  +                 HYPERLINK  \l "DATATYPE_TransferReport" TransferReport transferReport
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        request - The request field shall contain the ProductRequest.
                  +The productTypeId field of the supplied ProductRequest structure shall match Product Type object instance identifier in the COM archive; otherwise an INVALID_PRODUCT_TYPE error shall be raised.
                  +The productSourceId field of the supplied ProductRequest structure shall match Product Source object instance identifier in the COM archive; otherwise an INVALID_PRODUCT_SOURCE error shall be raised.
                  +The productFormatId field of the supplied ProductRequest structure shall match Product Format object instance identifier in the COM archive; otherwise an INVALID_PRODUCT_FORMAT error shall be raised.
                  +If for the selected Product Type, Product Format, and Product Source, the corresponding ProductCatalogueEntryDetails does not support the batch mode, a PRODUCT_NOT_SUPPORTED_IN_BATCH error shall be returned.
                  +If the destination address is not in the form of the URI (RFC 3986) or the destination does not exist, a DESTINATION_UNKNOWN error shall be returned. If the destination exists, but a connection cannot be established or a product cannot be delivered, a DELIVERY_FAILED error shall be returned.
                  +If endTime is earlier than startTime, an INVALID_TIME_RANGE shall be returned.
                  +If startTime is NULL, the request concerns the time range from the earliest available mission data product to the endTime value.
                  +If endTime is NULL, the request concerns the time range from the startTime value to the current time.
                  +If startTime or endTime value is higher than the current time, an INVALID_TIME_RANGE shall be returned.
                  +        requestId - The requestId field in the acknowledge message shall contain the object instance identifier of the Request.
                  +        subRequestIds - If the request is scheduled, the subRequestIds field shall contain a list of the object instance identifiers of the Requests assigned for scheduled sub-requests.
                  +        productSize - The productSize field shall contain the estimated product size specified in bytes. If the size is unknown, the value of the field shall be null.
                  +        requestId - The requestId field in the update message shall contain the object instance identifier of the Request related to the requested product.
                  +        product - The product field shall contain the matching product.
                  +The product shall match all filter criteria. This forms a logical AND operation.
                  +If there is no product matching filter criteria, then update messages shall not be sent.
                  +If the destination field of the ProductRequest is used, then update messages shall contain only the requestId and the product field shall be NULL.
                  +        transferReport - q) The response message shall contain the TransferReport.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        DESTINATION_UNKNOWN: The host specified in the destination field is unreachable.
                  +        DELIVERY_FAILED: The product could not be delivered due to a communication error.
                  +        UNKNOWN: An unknown error has occurred.
                  +        AUTHENTICATION_FAIL: The authentication details provided in the destination field are invalid.
                  +        AUTHORISATION_FAIL: The user has no credentials to execute the requested operation on the remote system.
                  +        INVALID_PRODUCT_TYPE: The specified product type does not exist.
                  +        INVALID_PRODUCT_SOURCE: The product source is not valid for the specified product type.
                  +        INVALID_PRODUCT_FORMAT: The format is not supported for the selected combination of the product type and the source.
                  +        INVALID_PRODUCT_ATTRIBUTE: One or more filter attributes are invalid. The attribute may not have been defined for the product, the selected comparison operation is not allowed or the attribute value does not match the product specification.
                  +        INVALID_PRODUCT_ATTRIBUTE: The first invalid attribute is returned.
                  +        INVALID_TIME_RANGE: The date or date format in timeRange is invalid.
                  +        INVALID_SCHEDULE: Schedule data type contains invalid date, invalid date format or wrong expiry date.
                  +        INVALID_SCHEDULE: The first invalid parameter is returned.
                  +        COMPRESSION_FORMAT_NOT_SUPPORTED: The compression format for the selected product is invalid or not supported by the implementation.
                  +        ENCRYPTION_ALGORITHM_NOT_SUPPORTED: The encryption algorithm for the selected product is invalid or not supported by the implementation.
                  +        SCHEDULING_NOT_SUPPORTED: The request execution scheduling is not supported by the implementation.
                  +        SORTING_NOT_SUPPORTED: The sorting format for the selected product is invalid or not supported by the implementation.
                  +        INVALID_CHUNK_SIZE: The chunk size is invalid or splitting the product into update messages is not supported by the implementation.
                  +        PRODUCT_NOT_SUPPORTED_IN_BATCH: The product is not supported in the batch mode for the selected combination of the Product Type, the Product Source and the Product Format.
                  +        PRODUCT_NOT_SUPPORTED_IN_BATCH: The instance identifier of the ProductCatalogueEntryDetails which provide available provision modes for the combination of the product type, the source and the format.
                  +        TRANSFER_PROTOCOL_NOT_SUPPORTED: The transfer protocol specified in the request is not supported by the provider.
                  +        INVALID_TRANSFER_PROTOCOL_ATTRIBUTES: The attributes of the transfer protocol specified in the request are invalid.
                  +        INVALID_FILE_NAME: The file name of the response is invalid. It may be caused by an invalid character, an invalid path or, when using templates, an invalid special identifier.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                DESTINATION_UNKNOWN
                  +                Defined in MAL
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                DELIVERY_FAILED
                  +                Defined in MAL
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                AUTHENTICATION_FAIL
                  +                Defined in MAL
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                AUTHORISATION_FAIL
                  +                Defined in MAL
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                INVALID_PRODUCT_TYPE
                  +                1
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                INVALID_PRODUCT_SOURCE
                  +                2
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                INVALID_PRODUCT_FORMAT
                  +                3
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                INVALID_PRODUCT_ATTRIBUTE
                  +                6
                  +                Attribute
                  +                The first invalid attribute is returned.
                  +            
                  +            
                  +                INVALID_TIME_RANGE
                  +                7
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                INVALID_SCHEDULE
                  +                8
                  +                Attribute
                  +                The first invalid parameter is returned.
                  +            
                  +            
                  +                COMPRESSION_FORMAT_NOT_SUPPORTED
                  +                11
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                ENCRYPTION_ALGORITHM_NOT_SUPPORTED
                  +                12
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                SCHEDULING_NOT_SUPPORTED
                  +                13
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                SORTING_NOT_SUPPORTED
                  +                14
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                INVALID_CHUNK_SIZE
                  +                15
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                PRODUCT_NOT_SUPPORTED_IN_BATCH
                  +                16
                  +                Long
                  +                The instance identifier of the ProductCatalogueEntryDetails  which provide available provision modes for the combination of the product type, the source and the format.
                  +            
                  +            
                  +                TRANSFER_PROTOCOL_NOT_SUPPORTED
                  +                18
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                INVALID_TRANSFER_PROTOCOL_ATTRIBUTES
                  +                19
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                INVALID_FILE_NAME
                  +                20
                  +                Not Used
                  +                -
                  +            
                  +        
                  +        
                  +            
                  +            Operation: suspendRequest
                  +        
                  +        
                  +            Overview
                  +        
                  +        The suspend operation suspends the execution of the current or scheduled product request until resumeRequest or cancelRequest operation is invoked.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                suspendRequest
                  +            
                  +            
                  +                Interaction Pattern
                  +                SUBMIT
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                SUBMIT
                  +                Yes
                  +                Long requestId
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        requestId - The requestId field shall contain the object instance identifier of the Request.
                  +If the requestId field equals 0, all not completed requests of the current user are suspended.
                  +If requestId does not exist, an INVALID_REQUEST_ID error shall be returned.
                  +In case of the scheduled request, the main requestId may be used to suspend all sub-requests.
                  +In case of the scheduled request, suspending one sub-request does not affect other sub-requests.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        UNKNOWN: An unknown error has occurred.
                  +        INVALID_REQUEST_ID: The request object instance identifier does not exist.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                INVALID_REQUEST_ID
                  +                9
                  +                Not Used
                  +                -
                  +            
                  +        
                  +        
                  +            
                  +            Operation: resumeRequest
                  +        
                  +        
                  +            Overview
                  +        
                  +        The resume operation resumes the execution of the product request. The resume operation continues from the last delivered chunk of data.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                resumeRequest
                  +            
                  +            
                  +                Interaction Pattern
                  +                SUBMIT
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                SUBMIT
                  +                Yes
                  +                Long requestId
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        requestId - The requestId field shall contain the object instance identifier of the Request.
                  +If requestId does not exist, an INVALID_REQUEST_ID error shall be returned.
                  +If the requestId field equals 0, all suspended requests of the current user are resumed.
                  +In case of the scheduled request, the main requestId may be used to resume all sub-requests.
                  +In case of the scheduled request, resuming one sub-request does not influence other sub-requests.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        UNKNOWN: An unknown error has occurred.
                  +        INVALID_REQUEST_ID: The request object instance identifier does not exist.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                INVALID_REQUEST_ID
                  +                9
                  +                Not Used
                  +                -
                  +            
                  +        
                  +        
                  +            
                  +            Operation: cancelRequest
                  +        
                  +        
                  +            Overview
                  +        
                  +        The cancel operation cancels the execution of the current or the scheduled request. Not delivered data is lost.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                cancelRequest
                  +            
                  +            
                  +                Interaction Pattern
                  +                SUBMIT
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                SUBMIT
                  +                Yes
                  +                Long requestId
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        requestId - The requestId field shall contain the object instance identifier of the Request.
                  +If requestId does not exist, an INVALID_REQUEST_ID error shall be returned.
                  +If the requestId field equals 0, all not completed requests of the current user are canceled.
                  +In case of the scheduled request, the main requestId may be used to cancel all sub-requests.
                  +In case of the scheduled request, cancelling one sub-request does not influence other sub-requests.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        UNKNOWN: An unknown error has occurred.
                  +        INVALID_REQUEST_ID: The request object identifier does not exist.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                INVALID_REQUEST_ID
                  +                9
                  +                Not Used
                  +                -
                  +            
                  +        
                  +        
                  +            
                  +            Operation: getRequestStatus
                  +        
                  +        
                  +            Overview
                  +        
                  +        The getRequestStatus operation returns the current status of processing of a historical, an ongoing or a scheduled request. The operation allows the user to filter request statuses.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                getRequestStatus
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                Yes
                  +                COM::Archive::CompositeFilterSet filter
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                Yes
                  +                List< HYPERLINK  \l "DATATYPE_RequestStatus" RequestStatus> statuses
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        filter - The filter field shall contain parameters to filter the current status of requests by a request identifier, a user identifier, a state or a time range.
                  +The filter may contain multiple criteria combined by a logical AND operator.
                  +The filter filed may contain comparison operators, ranges of values and multiple wildcard characters.
                  +If more than one filter parameter is used, the results shall be combined using logical conjunction.
                  +        statuses - The response shall contain a list of statuses of the requests, which match selected filter criteria.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        UNKNOWN: An unknown error has occurred.
                  +        INVALID_PRODUCT_ATTRIBUTE: One or more filter attributes are invalid. The attribute is invalid when its name or type is different than any field of the BatchProductRequestDetails structure, when the comparison operator is not valid for the type of filter field or when the range is invalid.
                  +        INVALID_PRODUCT_ATTRIBUTE: The first invalid attribute is returned.
                  +        INVALID_REQUEST_ID: The filter contains an invalid object instance identifier of the BatchProductRequestDetails.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                INVALID_PRODUCT_ATTRIBUTE
                  +                6
                  +                Composite
                  +                The first invalid attribute is returned.
                  +            
                  +            
                  +                INVALID_REQUEST_ID
                  +                9
                  +                Not Used
                  +                -
                  +            
                  +        
                  +        
                  +            
                  +            Operation: queryProductRequest
                  +        
                  +        
                  +            Overview
                  +        
                  +        The queryProductRequest operation returns the content of requests which match filter criteria.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                queryProductRequest
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                Yes
                  +                COM::Archive::CompositeFilterSet filter
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                Yes
                  +                List< HYPERLINK  \l "DATATYPE_BatchProductRequestDetails" BatchProductRequestDetails> requests
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        filter - The filter indicates conditions that the response with the request must meet. The response can be filtered by the request object instance identifier or any combination of the fields: the product type, the format, the source, the destination, the time range, the user and the state.
                  +The filter may contain comparison operators, ranges and multiple wildcard characters.
                  +If more than one filter parameter is used, the results shall be combined using logical operators.
                  +        requests - The response shall contain the list of requests that match all filter criteria. This forms a logical AND operations.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        UNKNOWN: An unknown error has occurred.
                  +        INVALID_PRODUCT_ATTRIBUTE: One or more filter attributes are invalid. The attribute is invalid when its name or type is different than any field of the BatchProductRequestDetails structure, when the comparison operator is not valid for the type of filter field or when the range is invalid.
                  +        INVALID_PRODUCT_ATTRIBUTE: The first invalid attribute is returned.
                  +        INVALID_REQUEST_ID: The filter contains an invalid object instance identifier of the BatchProductRequestDetails.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                INVALID_PRODUCT_ATTRIBUTE
                  +                6
                  +                Composite
                  +                The first invalid attribute is returned.
                  +            
                  +            
                  +                INVALID_REQUEST_ID
                  +                9
                  +                Not Used
                  +                -
                  +            
                  +        
                  +        
                  +            
                  +            Operation: monitorProduct
                  +        
                  +        
                  +            Overview
                  +        
                  +        The monitorProduct operation requests a continuous stream of data rather than a finite stored data set.
                  +        The PUB-SUB interaction pattern is used in order to allow a consumer to subscribe for products. When new data is available, all subscribers receive a message with a product update. The operation allows the consumer to subscribe for a product by choosing an object instance identifier assigned to the product stream. This identifier is provided by the EntityKey structure:
                  +        a) the value of the firstSubKey is NULL;
                  +        b) the value of the secondSubKey is identifier of the stream;
                  +        c) the value of the thirdSubKey is NULL;
                  +        d) the value of the fourthSubKey is NULL.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                monitorProduct
                  +            
                  +            
                  +                Interaction Pattern
                  +                PUBLISH-SUBSCRIBE
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                OUT
                  +                PUBLISH
                  +                Yes
                  +                Element product
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        product - The product field shall contain the matching product.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        DELIVERY_FAILED: The product could not be delivered due to a communication error.
                  +        UNKNOWN: An unknown error has occurred.
                  +        INVALID_STREAM_ID: The subscription identifier is invalid.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                DELIVERY_FAILED
                  +                Defined in MAL
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                INVALID_STREAM_ID
                  +                10
                  +                Not Used
                  +                -
                  +            
                  +        
                  +        
                  +            
                  +            Operation: getProductsCatalogue
                  +        
                  +        
                  +            Overview
                  +        
                  +        The getProductsCatalogue operation provides a list of products available in the catalogue and detailed information about each of them.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                getProductsCatalogue
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                Yes
                  +                COM::Archive::CompositeFilterSet filter
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                Yes
                  +                List< HYPERLINK  \l "DATATYPE_ProductCatalogueEntryDetails" ProductCatalogueEntryDetails> productsCatalogue
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        filter - The filter field may contain parameters to filter a catalogue of products by any field of ProductTypeDetails, ProductProvisioningDetails or ProductSource structures.
                  +The filter may contain multiple criteria.
                  +The filter may contain comparison operators, ranges of values and wildcard characters.
                  +If more than one filter parameter is used, the results shall be combined using logical operators.
                  +If the filter field is NULL, the response shall contain the list of all available products.
                  +        productsCatalogue - The productsCatalogue field shall contain a list of ProductCatalogueEntryDetails objects.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        UNKNOWN: An unknown error has occurred.
                  +        INVALID_PRODUCT_ATTRIBUTE: One or more filter attributes are invalid. The attribute is invalid when its name or type is different than any field of the ProductTypeDetails,
                  +        INVALID_PRODUCT_ATTRIBUTE: ProductProvisioningDetails or ProductSource structures, the selected comparison operation is not allowed or the attribute value does not match the attribute type.
                  +        INVALID_PRODUCT_ATTRIBUTE: The first invalid attribute is returned.
                  +        INVALID_PRODUCT_ATTRIBUTE: The first invalid attribute is returned.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                INVALID_PRODUCT_ATTRIBUTE
                  +                6
                  +                Attribute
                  +                The first invalid attribute is returned.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: getProductSpecification
                  +        
                  +        
                  +            Overview
                  +        
                  +        The getProductSpecification operation returns a specification of the product. The retrieved XML file is the MAL data type specification for the Product Type.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                getProductSpecification
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                Yes
                  +                Long productTypeId
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                Yes
                  +                File productSpecification
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        productTypeId - The productTypeId field shall contain the object instance identifier of the ProductTypeDetails.
                  +If productTypeId does not exist, an INVALID_PRODUCT_TYPE error shall be returned.
                  +        productSpecification - The response shall contain a specification of the product in the form of a MAL::File structure.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        UNKNOWN: An unknown error has occurred.
                  +        INVALID_PRODUCT_TYPE: The specified product type does not exist.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                INVALID_PRODUCT_TYPE
                  +                1
                  +                Not Used
                  +                -
                  +            
                  +        
                  +        
                  +            
                  +            Service: ProductsManagement
                  +        
                  +        
                  +            Overview
                  +        
                  +        The Products Management service allows the consumer to set up the Mission Data Product Distribution service. All products which the system supports must be defined prior they can be obtained. Each product is characterized by its 
                  +        type, 
                  +        format
                  +        sources
                  +        internal structure
                  +        attributes
                  +        provision modes
                  +        compression
                  +        encryption formats
                  +        The Product Type, the Product Source and the Product Details constitute ProductCatalogueEntry, are kept in the COM archive and can be browsed by the user.
                  +        
                  +        A typical use case scenario of the Product Management service is as follows. For each available product, the Consumer sends to the Provider a series of messages that result in creation of a product catalogue entry in the COM Archive. First message, passed by addProductType() operation, contains a request to add a new product type, along with its short description. Next, there are issued addProductSource() messages defining all the sources, from where particular type of product can be obtained. For each combination of the product type and the source, the Consumer calls addProductDetail() operation to specify formats, provisioning modes and optionally other details describing the product. When a unique triple of the product type, source and details has been provided, the Provider automatically creates catalogue entry. Next step is concerned with setting the product specification by executing setProductSpecification() operation for each particular product. The product becomes fully described and from now on can be requested. At the end, it is optional to define which attributes of the product specification can be used for product filtering or sorting (addProductAttributes() operation). In case no attributes for the product has been defined, usage of filter or sort fields in a request for this product will cause an error.
                  +        
                  +            Table 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Table \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Table_TOC \s 1 1
                  +            ProductsManagement Service Operations
                  +            "
                  +            :  ProductsManagement Service Operations
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Area Identifier
                  +                Service Identifier
                  +                Area Number
                  +                Service Number
                  +                Area Version
                  +            
                  +            
                  +                distribution
                  +                ProductsManagement
                  +                9
                  +                2
                  +                1
                  +            
                  +            
                  +                Interaction Pattern
                  +                Operation Identifier
                  +                Operation Number
                  +                Capability Set
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_2_addProductType" addProductType
                  +                1
                  +                1
                  +            
                  +            
                  +                SUBMIT
                  +                 HYPERLINK  \l "OPERATION_2_removeProductType" removeProductType
                  +                2
                  +                
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_2_addProductSource" addProductSource
                  +                3
                  +                2
                  +            
                  +            
                  +                SUBMIT
                  +                 HYPERLINK  \l "OPERATION_2_removeProductSource" removeProductSource
                  +                4
                  +                
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_2_addProductFormat" addProductFormat
                  +                5
                  +                3
                  +            
                  +            
                  +                SUBMIT
                  +                 HYPERLINK  \l "OPERATION_2_removeProductFormat" removeProductFormat
                  +                6
                  +                
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_2_addProductDetail" addProductDetail
                  +                7
                  +                4
                  +            
                  +            
                  +                SUBMIT
                  +                 HYPERLINK  \l "OPERATION_2_removeProductDetail" removeProductDetail
                  +                8
                  +                
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_2_setProductSpecification" setProductSpecification
                  +                9
                  +                5
                  +            
                  +            
                  +                SUBMIT
                  +                 HYPERLINK  \l "OPERATION_2_removeProductSpecification" removeProductSpecification
                  +                10
                  +                
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_2_addProductAttribute" addProductAttribute
                  +                11
                  +                6
                  +            
                  +            
                  +                SUBMIT
                  +                 HYPERLINK  \l "OPERATION_2_removeProductAttribute" removeProductAttribute
                  +                12
                  +                
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_2_enableStreaming" enableStreaming
                  +                13
                  +                7
                  +            
                  +            
                  +                SUBMIT
                  +                 HYPERLINK  \l "OPERATION_2_disableStreaming" disableStreaming
                  +                14
                  +                
                  +            
                  +        
                  +        
                  +            Service-level Requirements
                  +        
                  +        a) The ProductsManagement service shall provide:
                  +        a. the capability for maintaining the catalogue of products;
                  +        b. the capability for maintaining the list of product specification;
                  +        c. the capability for maintaining the list of product attributes.
                  +        b) It shall be possible to add and delete:
                  +        a. product types;
                  +        b. product sources;
                  +        c. product provisioning details;
                  +        d. product attributes.
                  +        c) It shall be possible to set and delete product specification.
                  +        d) The ProductsManagement shall use the COM archive service to store:
                  +        a. a product type;
                  +        b. product provisioning details;
                  +        c. a product source;
                  +        d. a product catalogue entry;
                  +        e. a product specification;
                  +        f. a product attribute.
                  +        a) A product source can be added only to existing product type.
                  +        b) When a product source is removed, corresponding definitions of product provisioning details shall be also removed.
                  +        c) A product provisioning detail can be added only to existing product type and product source.
                  +        d) When a product type is removed, corresponding definitions of product sources and product provisioning details shall be also removed.
                  +        e) Only one product specification can be assigned to a product type.
                  +        f) A product attribute can be added only if it is defined in a product specification.
                  +        g) An URI field of a product source shall an address in the form of the URI (RFC 3986).
                  +        
                  +            COM usage
                  +        
                  +        A ProductType COM object represents a type of mission data product. A ProductType COM object body shall hold a name, a description and a list of product attributes.
                  +        A ProductSource COM object represents a source of mission data product. A ProductSource COM object body shall hold an URI address of a source.
                  +        The ProductSource COM object related link shall indicate which ProductType object it uses.
                  +        A ProductFormat COM object represents a format of mission data product. The ProductFormat COM object shall hold a name and a description of the format. Following formats shall have preassigned given object instance identifiers:
                  +        a) Fixed value binary with identifier 1
                  +        b) Variable length binary with identifier 2
                  +        c) Split binary with identifier 3
                  +        d) XML with identifier 4
                  +        e) JSON with identifier 5
                  +        f) ASCII with identifier 6
                  +        g) PDF with identifier 7
                  +        h) CSV with identifier 8
                  +        i) TIFF with identifier 9
                  +        j) JPEG with identifier 10
                  +        k) MPEG with identifier 11
                  +        l) AVI with identifier 12
                  +        A ProductProvisioningDetailsInstance COM object represents detailed parameters of mission data product. The ProductProvisioningDetailsInstance COM object body shall contain the ProductProvisioningDetails structure, which holds the format, provision mode, compression and encryption algorithms applicable to mission data product.
                  +        The ProductProvisioningDetailsInstance COM object related link shall indicate which ProductTypeDetails object it uses. The ProductCatalogueEntryDetails COM object represents a description of the Product. 
                  +        A ProductCatalogueEntry COM object body shall contain the ProductCatalogueDetailsEntry structure, which holds a product type, attributes, available sources, formats and provisioning modes.
                  +        A ProductSpecification COM object represents a specification of mission data product. A ProductSpecification COM object body shall hold a File object.
                  +        The ProductSpecification COM object related link shall indicate which ProductType object it uses.
                  +        A ProductAttribute COM object represents a product attribute, A ProductAttribute COM object body shall hold a ProductAttributeDetails structure, which contains a name, a type and two Boolean values, which specify whether a product can be sorted or filtered.
                  +        The ProductAttribute COM object related link shall indicate which ProductType object it uses.
                  +        A StreamingProductRequest COM object represents the body of the stream product request. A StreamingProductRequest COM object body shall hold StreamingProductRequestDetails structure.
                  +        
                  +            Table 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Table \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Table_TOC \s 1 1
                  +            ProductsManagement Service Object Types
                  +            "
                  +            :  ProductsManagement Service Object Types
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Object Number
                  +                Object Name
                  +                Object Body Type
                  +                Related link
                  +                Source link
                  +            
                  +            
                  +                1
                  +                ProductType
                  +                 HYPERLINK  \l "DATATYPE_ProductTypeDetails" ProductTypeDetails
                  +                
                  +                
                  +            
                  +            
                  +                2
                  +                ProductSource
                  +                URI
                  +                1
                  +                
                  +            
                  +            
                  +                3
                  +                ProductFormat
                  +                 HYPERLINK  \l "DATATYPE_ProductFormatDetails" ProductFormatDetails
                  +                
                  +                
                  +            
                  +            
                  +                4
                  +                ProductProvisioningDetailsInstance
                  +                 HYPERLINK  \l "DATATYPE_ProductProvisioningDetails" ProductProvisioningDetails
                  +                1
                  +                2
                  +            
                  +            
                  +                5
                  +                ProductCatalogueEntry
                  +                 HYPERLINK  \l "DATATYPE_ProductCatalogueEntryDetails" ProductCatalogueEntryDetails
                  +                
                  +                
                  +            
                  +            
                  +                6
                  +                ProductSpecification
                  +                File
                  +                1
                  +                
                  +            
                  +            
                  +                7
                  +                ProductAttribute
                  +                 HYPERLINK  \l "DATATYPE_ProductAttributeDetails" ProductAttributeDetails
                  +                1
                  +                
                  +            
                  +            
                  +                8
                  +                StreamProductRequest
                  +                 HYPERLINK  \l "DATATYPE_StreamProductRequestDetails" StreamProductRequestDetails
                  +                
                  +                
                  +            
                  +        
                  +        
                  +            COM Event Service usage
                  +        
                  +        When a new ProductTypeDetails is added, an event shall be generated.
                  +        The event body shall contain an identifier of the created type.
                  +        When the ProductTypeDetails is removed, an event shall be generated.
                  +        The event body shall indicate an identifier of the removed type.
                  +        The related link shall indicate a list of identifiers of ProductCatalogueEntryDetails objects, which were also removed.
                  +        When the ProductSource is added, an event shall be generated.
                  +        The event body shall indicate an identifier of the created source.
                  +        The related link shall indicate the type of the product for which the source has been created.
                  +        When the ProductSource is removed, an event shall be generated.
                  +        The event body shall indicate an identifier of the removed source.
                  +        The related link shall indicate a list of identifiers of ProductCatalogueEntryDetails objects, which were also removed.
                  +        When the ProductFormatDetails is added, an event shall be generated.
                  +        The source link shall indicate an identifier of the created format.
                  +        When the ProductFormatDetails is removed, an event shall be generated.
                  +        The source link shall indicate an identifier of the removed source.
                  +        The related link shall indicate a list of identifiers of ProductCatalogueEnty objects, which were also removed.
                  +        When the ProductProvisioningDetails is added, an event shall be generated.
                  +        The event body shall indicate an identifier of the created detail.
                  +        The related link shall indicate the type of the product for which the detail has been created.
                  +        The source link shall indicate an identifier of the newly created ProductCatalogueEntryDetails.
                  +        When the ProductProvisioningDetails is removed, an event shall be generated.
                  +        The event body shall indicate an identifier of the removed detail.
                  +        The related link shall indicate a list of identifiers of ProductCatalogueEntryDetails objects, which were also removed.
                  +        When the ProductSpecification is added, an event shall be generated.
                  +        The event body shall indicate an identifier of the created specification.
                  +        The related link shall indicate the identifier of the ProductTypeDetails for which the specification has been added.
                  +        When the ProductSpecification is removed, an event shall be generated.
                  +        The event body shall indicate an identifier of the removed specification.
                  +        The related link shall indicate the identifier of the ProductTypeDetails for which the specification is removed.
                  +        When the ProductAttributeDetails is added, an event shall be generated.
                  +        The event body shall indicate the identifier of the ProductTypeDetails for which the attribute has been added.
                  +        When the ProductAttributeDetails is removed, an event shall be generated.
                  +        The event body shall indicate the identifier of the ProductTypeDetails for which the attribute is removed.
                  +        
                  +            Table 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Table \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Table_TOC \s 1 1
                  +            ProductsManagement Service Events
                  +            "
                  +            :  ProductsManagement Service Events
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Object Number
                  +                Event Name
                  +                Object Body Type
                  +                Related link
                  +                Source link
                  +            
                  +            
                  +                101
                  +                ProductTypeCreated
                  +                Long
                  +                
                  +                
                  +            
                  +            
                  +                102
                  +                ProductTypeRemoved
                  +                Long
                  +                5
                  +                
                  +            
                  +            
                  +                103
                  +                ProductSourceCreated
                  +                Long
                  +                1
                  +                
                  +            
                  +            
                  +                104
                  +                ProductSourceRemoved
                  +                Long
                  +                5
                  +                
                  +            
                  +            
                  +                105
                  +                ProductFormatCreated
                  +                Long
                  +                
                  +                
                  +            
                  +            
                  +                106
                  +                ProductFormatRemoved
                  +                Long
                  +                
                  +                
                  +            
                  +            
                  +                107
                  +                ProductDetailCreated
                  +                Long
                  +                1
                  +                5
                  +            
                  +            
                  +                108
                  +                ProductDetailRemoved
                  +                Long
                  +                5
                  +                
                  +            
                  +            
                  +                109
                  +                ProductSpecificationCreated
                  +                Long
                  +                1
                  +                
                  +            
                  +            
                  +                110
                  +                ProductSpecificationRemoved
                  +                Long
                  +                1
                  +                
                  +            
                  +            
                  +                111
                  +                ProductAttributeCreated
                  +                Long
                  +                1
                  +                
                  +            
                  +            
                  +                112
                  +                ProductAttributeRemoved
                  +                Long
                  +                1
                  +                
                  +            
                  +            
                  +                113
                  +                ProductStreamCreated
                  +                Long
                  +                
                  +                
                  +            
                  +            
                  +                114
                  +                ProductStreamClosed
                  +                Long
                  +                
                  +                
                  +            
                  +        
                  +        
                  +            COM Object Relationships
                  +        
                  +        The Figure below shows the COM object and event relationships for this service:
                  +        
                  +            Figure 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Figure \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Figure_TOC \s 1 1
                  +            ProductsManagement Service COM object and event relationships
                  +            "
                  +            :  ProductsManagement Service COM object and event relationships
                  +        
                  +        
                  +            COM Archive Service usage
                  +        
                  +        When a new ProductTypeDetails is created with the addProductType operation, the ProductType object shall be stored in the COM archive.
                  +        When the ProductTypeDetails is removed with the removeProductType operation, the corresponding COM object shall be removed from the COM archive.
                  +        When a new ProductSource is created with the addProductSource operation, the ProductSource COM object shall be stored in the COM archive.
                  +        When the ProductSource is removed with the removeProductSource operation, the corresponding COM object shall be removed from the COM archive.
                  +        When a new ProductFormatDetails is created with the addProductFormat operation, the ProductFormat object shall be stored in the COM archive.
                  +        When the ProductFormatDetails is removed with the removeProductFormat operation, the corresponding COM object shall be removed from the COM archive.
                  +        When a new ProductProvisioningDetails is created with the addProductDetail operation, the ProductProvisioningDetailsInstance object shall be stored in the COM archive.
                  +        For each unique combination of the ProductTypeDetails, the ProductSource and the ProductProvisioningDetails, a new ProductCatalogueEntry shall be stored in the COM Archive. To get objects referenced by identifier fields of the ProductCatalogueEntry, COM Archive shall be used.
                  +        When a new ProductSpecification is created with the setProductSpecification operation, the ProductFormat object shall be stored in the COM archive.
                  +        When the ProductFormatDetails is removed with the removeProductType operation, the corresponding COM object shall be removed from the COM archive.
                  +        When the ProductType is removed, the corresponding ProductCatalogueEntry, ProductSource and ProductProvisioningDetailsInstance are removed as well.
                  +        When the ProductSource is removed, the corresponding ProductCatalogueEntry and ProductProvisioningDetailsInstance are removed as well.
                  +        When the ProductProvisioningDetailsInstance is removed, the corresponding ProductCatalogueEntry is removed.
                  +        When a new ProductAttributeDetails is created with the addProductAttribute operation, the ProductAttribute object shall be stored in the COM archive.
                  +        When the ProductAttributeDetails is removed with the removeProductAttribute operation, the corresponding COM object shall be removed from the COM archive.
                  +        When a new stream is created with the enableStreaming operation, the StreamProductRequest object shall be stored in the COM archive.
                  +        
                  +            
                  +            Operation: addProductType
                  +        
                  +        
                  +            Overview
                  +        
                  +        The addProductType operation adds a new type of the product. The type of the product is used to inform to which category of space mission data the product belongs, e.g. telemetry, telecommand or event.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                addProductType
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                YesYes
                  +                Identifier productTypeString description
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                Yes
                  +                Long productTypeId
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        productType - The productType field shall contain a self-descriptive name of the product type.
                  +        description - The description field may contain additional information about the product type.
                  +        productTypeId - The productTypeId field shall contain an instance identifier of the product type.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        UNKNOWN: An unknown error has occurred.
                  +        DUPLICATE: The product type has already been defined.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                DUPLICATE
                  +                Defined in COM
                  +                Long
                  +                An ExtraInfoType field contains an instance identifier of the already existing product type.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: removeProductType
                  +        
                  +        
                  +            Overview
                  +        
                  +        The removeProduct operation removes a selected Product Type. Also, all corresponding ProductCatalogueEntry objects are removed.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                removeProductType
                  +            
                  +            
                  +                Interaction Pattern
                  +                SUBMIT
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                SUBMIT
                  +                Yes
                  +                Long productTypeId
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        productTypeId - The productTypeId field shall contain the object instance identifier of the Product Type.
                  +If productTypeId does not exist, an INVALID_PRODUCT_TYPE error shall be returned.
                  +The ProductCatalogueEntry objects which contain the identifier of the product type shall be removed from the COM.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        UNKNOWN: An unknown error has occurred.
                  +        INVALID_PRODUCT_TYPE: The specified product type does not exist.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                INVALID_PRODUCT_TYPE
                  +                1
                  +                Not Used
                  +                -
                  +            
                  +        
                  +        
                  +            
                  +            Operation: addProductSource
                  +        
                  +        
                  +            Overview
                  +        
                  +        The addProductSource operation adds a new source of the product.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                addProductSource
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                YesYes
                  +                Long productTypeIdURI productSource
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                Yes
                  +                Long productSourceId
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        productTypeId - The productTypeId field shall contain the object instance identifier of the Product Type.
                  +If productTypeId does not exist, an INVALID_PRODUCT_TYPE error shall be returned.
                  +        productSource - The productSource field shall contain an address in the form of the URI (RFC 3986).
                  +        productSourceId - The productSourceId field shall contain the object instance identifier of the Product Source.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        UNKNOWN: An unknown error has occurred.
                  +        DUPLICATE: The product source at the specified URI address is already defined.
                  +        INVALID_PRODUCT_TYPE: The specified product type does not exist.
                  +        INVALID_PRODUCT_SOURCE: The specified product source is not valid URI address.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                DUPLICATE
                  +                Defined in COM
                  +                Long
                  +                An ExtraInfoType field contains an instance identifier of the already existing product source.
                  +            
                  +            
                  +                INVALID_PRODUCT_TYPE
                  +                1
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                INVALID_PRODUCT_SOURCE
                  +                2
                  +                Not Used
                  +                -
                  +            
                  +        
                  +        
                  +            
                  +            Operation: removeProductSource
                  +        
                  +        
                  +            Overview
                  +        
                  +        The removeProductSource operation removes the selected Product Source. Also, the corresponding ProductCatalogueEntry is removed.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                removeProductSource
                  +            
                  +            
                  +                Interaction Pattern
                  +                SUBMIT
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                SUBMIT
                  +                Yes
                  +                Long productSourceId
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        productSourceId - The productSourceId field shall contain an instance identifier of the product source.
                  +The ProductCatalogueEntry objects which contain the identifier of the product source shall be removed from the COM.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        UNKNOWN: An unknown error has occurred.
                  +        INVALID_PRODUCT_SOURCE: The specified product source does not exist.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                INVALID_PRODUCT_SOURCE
                  +                2
                  +                Not Used
                  +                -
                  +            
                  +        
                  +        
                  +            
                  +            Operation: addProductFormat
                  +        
                  +        
                  +            Overview
                  +        
                  +        The addProductFormat operation adds the format of data that can be used for obtaining products.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                addProductFormat
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                YesYes
                  +                Identifier productFormatString description
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                Yes
                  +                Long productFormatId
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        productFormat - The productFormat field shall contain a unique name of the format of the mission data product.
                  +If a product format which contains the same value of the productFormat field already exists, a DUPLICATE error shall be raised.
                  +        description - The description field may contain a short description of the product format.
                  +        productFormatId - The productFormatId field shall contain an object instance identifier of the product format.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        DUPLICATE: The given set of product details has already been defined.
                  +        UNKNOWN: An unknown error has occurred.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                DUPLICATE
                  +                Defined in COM
                  +                Long
                  +                An ExtraInfoType field contains an instance identifier of the already existing product type.
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                Not Used
                  +                -
                  +            
                  +        
                  +        
                  +            
                  +            Operation: removeProductFormat
                  +        
                  +        
                  +            Overview
                  +        
                  +        The removeProductFormat operation removes the selected product format.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                removeProductFormat
                  +            
                  +            
                  +                Interaction Pattern
                  +                SUBMIT
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                SUBMIT
                  +                Yes
                  +                Long productFormatId
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        productFormatId - The productFormatId field shall contain the object instance identifier of the ProductFormat.
                  +If the last ProductFormat is removed from the related ProductDetail, the ProductCatalogueEntry objects which contain the object instance identifier of the ProductDetail shall be removed from the COM.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        UNKNOWN: An unknown error has occurred.
                  +        INVALID_PRODUCT_FORMAT: The specified product format does not exist.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                INVALID_PRODUCT_FORMAT
                  +                3
                  +                Not Used
                  +                -
                  +            
                  +        
                  +        
                  +            
                  +            Operation: addProductDetail
                  +        
                  +        
                  +            Overview
                  +        
                  +        The addProductDetail operation assigns the format of the product, the support for provision modes and a list of compression and encryption algorithms to the combination of the product type and the product source. The triple of the product type, the product source and the product detail uniquely describes the available product and is kept in a new ProductCatalogueEntry object.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                addProductDetail
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                YesYesYes
                  +                Long productTypeIdLong productSourceId HYPERLINK  \l "DATATYPE_ProductProvisioningDetails" ProductProvisioningDetails productDetail
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                Yes
                  +                Long productDetailId
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        productTypeId - The productTypeId field shall contain the object instance identifier of the product type.
                  +If productTypeId does not exist, an INVALID_PRODUCT_TYPE error shall be returned.
                  +        productSourceId - The productSourceId field shall contain the object instance identifier of the Product Source.
                  +If productSourceId does not exist, an INVALID_PRODUCT_SOURCE error shall be returned.
                  +        productDetail - The productDetail shall contain the details about particular format of the product, its provision modes, compression and encryption methods.
                  +If Product Detail, which contains the same value of productFormat field, already exists for the selected product type and product source, a DUPLICATE error shall be raised.
                  +        productDetailId - The productDetailId field shall contain an object instance identifier of the ProductProvisioningDetailInstance.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        DUPLICATE: The given set of product details has already been defined.
                  +        UNKNOWN: An unknown error has occurred.
                  +        INVALID_PRODUCT_TYPE: The specified product type does not exist.
                  +        INVALID_PRODUCT_SOURCE: The specified product source does not exist.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                DUPLICATE
                  +                Defined in COM
                  +                Long
                  +                An ExtraInfoType field contains an instance identifier of the already existing product type.
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                INVALID_PRODUCT_TYPE
                  +                1
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                INVALID_PRODUCT_SOURCE
                  +                2
                  +                Not Used
                  +                -
                  +            
                  +        
                  +        
                  +            
                  +            Operation: removeProductDetail
                  +        
                  +        
                  +            Overview
                  +        
                  +        The removeProductDetail operation removes the selected product detail. Also, the corresponding ProductCatalogueEntry is removed.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                removeProductDetail
                  +            
                  +            
                  +                Interaction Pattern
                  +                SUBMIT
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                SUBMIT
                  +                Yes
                  +                Long productDetailId
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        productDetailId - The productDetailId field shall contain the object instance identifier of the ProductDetail.
                  +The ProductCatalogueEntry objects which contain the object instance identifier of the ProductDetail shall be removed from the COM.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        UNKNOWN: An unknown error has occurred.
                  +        INVALID_PRODUCT_DETAIL: The specified product detail does not exist.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                INVALID_PRODUCT_DETAIL
                  +                4
                  +                Not Used
                  +                -
                  +            
                  +        
                  +        
                  +            
                  +            Operation: setProductSpecification
                  +        
                  +        
                  +            Overview
                  +        
                  +        The setProductSpecification operation sets a specification of what the selected product consists. If a specification has been already set up, the new specification overrides the previous one.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                setProductSpecification
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                YesYes
                  +                Long productTypeIdFile productSpecification
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                Yes
                  +                Long productSpecificationId
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        productTypeId - The productTypeId field shall contain the object instance identifier of the Product Type.
                  +If productTypeId does not exist, an INVALID_PRODUCT_TYPE error shall be returned.
                  +        productSpecification - The productSpecification field shall contain a file with the specification of the product in terms of the MAL language.
                  +        productSpecificationId - The productSpecificationId field shall contain an object instance identifier of the ProductSpecification.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        UNKNOWN: An unknown error has occurred.
                  +        INVALID_PRODUCT_TYPE: The specified product type does not exist.
                  +        INVALID_PRODUCT_SPECIFICATION: The structure describing the product type is invalid.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                INVALID_PRODUCT_TYPE
                  +                1
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                INVALID_PRODUCT_SPECIFICATION
                  +                5
                  +                Not Used
                  +                -
                  +            
                  +        
                  +        
                  +            
                  +            Operation: removeProductSpecification
                  +        
                  +        
                  +            Overview
                  +        
                  +        The removeProductSpecification operation removes a specification of what the selected product consists.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                removeProductSpecification
                  +            
                  +            
                  +                Interaction Pattern
                  +                SUBMIT
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                SUBMIT
                  +                Yes
                  +                Long productSpecificationId
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        productSpecificationId - The productSpecificationId field shall contain the object instance identifier of the product specification.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        UNKNOWN: An unknown error has occurred.
                  +        INVALID_PRODUCT_SPECIFICATION: The selected product specification does not exist.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                INVALID_PRODUCT_SPECIFICATION
                  +                5
                  +                Not Used
                  +                -
                  +            
                  +        
                  +        
                  +            
                  +            Operation: addProductAttribute
                  +        
                  +        
                  +            Overview
                  +        
                  +        The addProductAttribute operation defines an attribute that can be used to filter or sort a product request.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                addProductAttribute
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                YesYes
                  +                Long productTypeId HYPERLINK  \l "DATATYPE_ProductAttributeDetails" ProductAttributeDetails productAttribute
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                Yes
                  +                Long productAttributeId
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        productTypeId - The productTypeId field shall contain the object instance identifier of the Product Type.
                  +If productTypeId does not exist, an INVALID_PRODUCT_TYPE error shall be returned.
                  +        productAttribute - The productAttribute field shall contain a new attribute of the product.
                  +        productAttributeId - The productAttributeId field shall contain an object instance identifier of the ProductAttribute.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        DUPLICATE: The product attribute with given name has been already added.
                  +        UNKNOWN: An unknown error has occurred.
                  +        INVALID_PRODUCT_TYPE: The specified product type does not exist.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                DUPLICATE
                  +                Defined in COM
                  +                Long
                  +                An ExtraInfoType field contains an object instance identifier of the duplicated attribute.
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                INVALID_PRODUCT_TYPE
                  +                1
                  +                Not Used
                  +                -
                  +            
                  +        
                  +        
                  +            
                  +            Operation: removeProductAttribute
                  +        
                  +        
                  +            Overview
                  +        
                  +        The removeProductAttribute operation removes an attribute that can be used to filter or sort a product request.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                removeProductAttribute
                  +            
                  +            
                  +                Interaction Pattern
                  +                SUBMIT
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                SUBMIT
                  +                Yes
                  +                Long productAttributeId
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        productAttributeId - The productAttributeId field shall contain the object instance identifier of the product attribute.
                  +If productAttributeId does not exist, an INVALID_PRODUCT_ATTRIBUTE error shall be returned.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        UNKNOWN: An unknown error has occurred.
                  +        INVALID_PRODUCT_ATTRIBUTE: The name of the specified product attribute is invalid.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                INVALID_PRODUCT_ATTRIBUTE
                  +                6
                  +                Attribute
                  +                An ExtraInfoType field contains the first invalid attribute.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: enableStreaming
                  +        
                  +        
                  +            Overview
                  +        
                  +        The enableStreaming operation creates a new stream of the product. The stream contains the space mission data only of the selected type, source and format and matching filter criteria. Additionally, an encryption or a compression of the stream data may be enabled.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                enableStreaming
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                Yes
                  +                 HYPERLINK  \l "DATATYPE_StreamProductRequestDetails" StreamProductRequestDetails request
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                Yes
                  +                Long streamId
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        request - The request field shall contain the StreamProductRequestDetails.
                  +The productTypeId field of the supplied StreamProductRequestDetails structure shall match Product Type object instance identifier in the COM Archive; otherwise an INVALID_PRODUCT_TYPE error shall be raised.
                  +The productSourceId field of the supplied StreamProductRequestDetails structure shall match Product Source object instance identifier in the COM Archive; otherwise an INVALID_PRODUCT_SOURCE error shall be raised.
                  +The productFormatId field of the supplied StreamProductRequestDetails structure shall match Product Format object instance identifier in the COM Archive; otherwise an INVALID_PRODUCT_FORMAT error shall be raised.
                  +If for the selected Product Type, Product Source and Product Format the corresponding ProductCatalogueEntryDetails does not support the stream mode, a PRODUCT_NOT_SUPPORTED_IN_STREAM error shall be returned.
                  +        streamId - The streamId field in the acknowledge message shall contain the object instance identifier of the created product stream.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        UNKNOWN: An unknown error has occurred.
                  +        INVALID_PRODUCT_TYPE: The selected product type does not exist.
                  +        INVALID_PRODUCT_SOURCE: The product source is not valid for the specified product type.
                  +        INVALID_PRODUCT_FORMAT: The format is not supported for the specified combination of the product type and source.
                  +        INVALID_PRODUCT_ATTRIBUTE: a) One or more filter attributes are invalid. The attribute may not have been defined for the product, the specified comparison operation is not allowed or the attribute value does not match the product type or format.
                  +        COMPRESSION_FORMAT_NOT_SUPPORTED: The compression format for a selected product is invalid or not supported by the implementation.
                  +        ENCRYPTION_ALGORITHM_NOT_SUPPORTED: The encryption algorithm for a selected product is invalid or not supported by the implementation.
                  +        PRODUCT_NOT_SUPPORTED_IN_STREAM: The product is not supported in the stream mode for the specified combination of a product type, a format and a source.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                INVALID_PRODUCT_TYPE
                  +                1
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                INVALID_PRODUCT_SOURCE
                  +                2
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                INVALID_PRODUCT_FORMAT
                  +                3
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                INVALID_PRODUCT_ATTRIBUTE
                  +                6
                  +                Attribute
                  +                The ExtraInfo fiels contains the first invalid attribute.
                  +            
                  +            
                  +                COMPRESSION_FORMAT_NOT_SUPPORTED
                  +                11
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                ENCRYPTION_ALGORITHM_NOT_SUPPORTED
                  +                12
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                PRODUCT_NOT_SUPPORTED_IN_STREAM
                  +                17
                  +                Long
                  +                The ExtraInfo fiels contains the instance identifier of the ProductCatalogueEntryDetails which provide available provision modes for the combination of the product type, source and format.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: disableStreaming
                  +        
                  +        
                  +            Overview
                  +        
                  +        The disableStreaming operation closes the product stream.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                disableStreaming
                  +            
                  +            
                  +                Interaction Pattern
                  +                SUBMIT
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                SUBMIT
                  +                Yes
                  +                Long streamId
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        streamId - The streamId field shall contain the object instance identifier of the stream.
                  +If requestId does not exist, an INVALID_STREAM_ID error shall be returned.
                  +If the requestId field equals 0, all streams of the current user are canceled.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        UNKNOWN: An unknown error has occurred.
                  +        INVALID_STREAM_ID: The stream object instance identifier does not exist.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                INVALID_STREAM_ID
                  +                10
                  +                Not Used
                  +                -
                  +            
                  +        
                  +        
                  +            Data types
                  +        
                  +        
                  +            Area data types: distribution
                  +        
                  +        
                  +            
                  +            Enumeration: ProvisionMode
                  +        
                  +        The ProvisionMode enumeration holds the set of methods of the data retrieval.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ProvisionMode
                  +            
                  +            
                  +                Short Form Part
                  +                101
                  +            
                  +            
                  +                Enumeration Value
                  +                Numerical Value
                  +                Comment
                  +            
                  +            
                  +                BATCH
                  +                1
                  +                The batch mode.
                  +            
                  +            
                  +                STREAM
                  +                2
                  +                The stream mode.
                  +            
                  +        
                  +        
                  +            
                  +            Enumeration: StateEnum
                  +        
                  +        The StateEnum is an enumeration holding the states of the request processing.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                StateEnum
                  +            
                  +            
                  +                Short Form Part
                  +                102
                  +            
                  +            
                  +                Enumeration Value
                  +                Numerical Value
                  +                Comment
                  +            
                  +            
                  +                QUEUED
                  +                1
                  +                The request has been approved and is waiting to be processed.
                  +            
                  +            
                  +                SCHEDULED
                  +                2
                  +                The request has been scheduled for the execution within the specified time.
                  +            
                  +            
                  +                IN_PROGRESS
                  +                3
                  +                The request is being processed.
                  +            
                  +            
                  +                SUSPENDED
                  +                4
                  +                The request processing is suspended.
                  +            
                  +            
                  +                CANCELED
                  +                5
                  +                The request has been cancelled.
                  +            
                  +            
                  +                COMPLETED
                  +                6
                  +                The request has been successfully completed.
                  +            
                  +            
                  +                ERROR
                  +                7
                  +                The request has failed with an error.
                  +            
                  +        
                  +        
                  +            
                  +            Enumeration: CompressionAlgorithmEnum
                  +        
                  +        The CompressionAlgorithmEnum enumeration holds the supported compression algorithms which may be applied to the requested product. Numerical values assigned to algorithms shall be used in product requests. For support of additional algorithms, their names and assigned numerical values shall be communicated through an out-of-band agreement.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                CompressionAlgorithmEnum
                  +            
                  +            
                  +                Short Form Part
                  +                103
                  +            
                  +            
                  +                Enumeration Value
                  +                Numerical Value
                  +                Comment
                  +            
                  +            
                  +                NONE
                  +                1
                  +                The compression is disabled.
                  +            
                  +            
                  +                TAR
                  +                2
                  +                The TAR compression format.
                  +            
                  +            
                  +                ZIP
                  +                3
                  +                The ZIP compression format.
                  +            
                  +            
                  +                TAR_GZIP
                  +                4
                  +                The GZIP compression format.
                  +            
                  +        
                  +        
                  +            
                  +            Enumeration: EncryptionFormatEnum
                  +        
                  +        The EncryptionFormatEnum enumeration holds the data encryption algorithms which may be applied to the requested Product. Numerical values assigned to formats shall be used in product requests. For support of additional formats, their names and assigned numerical values shall be communicated through an out-of-band agreement.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                EncryptionFormatEnum
                  +            
                  +            
                  +                Short Form Part
                  +                104
                  +            
                  +            
                  +                Enumeration Value
                  +                Numerical Value
                  +                Comment
                  +            
                  +            
                  +                NONE
                  +                1
                  +                The encryption is disabled.
                  +            
                  +            
                  +                AES
                  +                2
                  +                The AES encryption algorithm.
                  +            
                  +            
                  +                TWOFISH
                  +                3
                  +                The TwoFish encryption algorithm.
                  +            
                  +            
                  +                DES
                  +                4
                  +                The DES encryption algorithm.
                  +            
                  +        
                  +        
                  +            
                  +            Enumeration: MalTypesEnum
                  +        
                  +        The MalTypesEnum enumerates basic MAL types.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                MalTypesEnum
                  +            
                  +            
                  +                Short Form Part
                  +                105
                  +            
                  +            
                  +                Enumeration Value
                  +                Numerical Value
                  +                Comment
                  +            
                  +            
                  +                BLOB
                  +                1
                  +                MAL::Blob
                  +            
                  +            
                  +                BOOLEAN
                  +                2
                  +                MAL::Boolean
                  +            
                  +            
                  +                DURATION
                  +                3
                  +                MAL::Duration
                  +            
                  +            
                  +                FLOAT
                  +                4
                  +                MAL::Float
                  +            
                  +            
                  +                DOUBLE
                  +                5
                  +                MAL::Double
                  +            
                  +            
                  +                IDENTIFIER
                  +                6
                  +                MAL::Identifier
                  +            
                  +            
                  +                OCTET
                  +                7
                  +                MAL::Octet
                  +            
                  +            
                  +                UOCTET
                  +                8
                  +                MAL::UOctet
                  +            
                  +            
                  +                SHORT
                  +                9
                  +                MAL::Short
                  +            
                  +            
                  +                USHORT
                  +                10
                  +                MAL::UShort
                  +            
                  +            
                  +                INTEGER
                  +                11
                  +                MAL::Integer
                  +            
                  +            
                  +                UINTEGER
                  +                12
                  +                MAL::UInteger
                  +            
                  +            
                  +                LONG
                  +                13
                  +                MAL::Long
                  +            
                  +            
                  +                ULONG
                  +                14
                  +                MAL::ULong
                  +            
                  +            
                  +                STRING
                  +                15
                  +                MAL::String
                  +            
                  +            
                  +                TIME
                  +                16
                  +                MAL::Time
                  +            
                  +            
                  +                FINETIME
                  +                17
                  +                MAL::FineTime
                  +            
                  +            
                  +                URI
                  +                18
                  +                MAL::URI
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ProductTypeDetails
                  +        
                  +        The ProductTypeDetails structure contains the Product Type and a short description. It can additionally hold a list of product attributes used to filter or sort a product.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ProductTypeDetails
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                1
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                name
                  +                Identifier
                  +                No
                  +                The unique name of the type of the mission data product.
                  +            
                  +            
                  +                description
                  +                String
                  +                Yes
                  +                The short description of the mission data product.
                  +            
                  +            
                  +                productAttributesIds
                  +                List<Long>
                  +                Yes
                  +                The list of object instance identifiers of product attributes.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ProductFormatDetails
                  +        
                  +        The ProductFormatDetails structure keeps the format in which any product can occur. It contains a name of the format and its description.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ProductFormatDetails
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                2
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                name
                  +                Identifier
                  +                No
                  +                The unique name of the format of the mission data product.
                  +            
                  +            
                  +                description
                  +                String
                  +                Yes
                  +                The short description of the mission data product format.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ProductProvisioningDetails
                  +        
                  +        The ProductProvisioningDetails structure keeps a group of parameters of the related product. It contains a list of formats, a provision mode, a list of compression methods, and a list of encryption methods applicable for the product request.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ProductProvisioningDetails
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                3
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                productFormats
                  +                List<Long>
                  +                Yes
                  +                The list of formats in which the product can be obtained.
                  +            
                  +            
                  +                provisionMode
                  +                 HYPERLINK  \l "DATATYPE_ProvisionMode" ProvisionMode
                  +                No
                  +                The availability of the product data in the batch mode and in the stream mode.
                  +            
                  +            
                  +                compression
                  +                List<UInteger>
                  +                Yes
                  +                The list containing all supported compression formats applicable to the product.
                  +            
                  +            
                  +                encryption
                  +                List<UInteger>
                  +                Yes
                  +                The list containing all supported encryption formats applicable to the product.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ProductAttributeDetails
                  +        
                  +        The ProductAttributeDetails structure contains a single product attribute. It stores a name of the attribute, a type of data, and possibility to filter or sort by the attribute. The product attribute is one of the product specification fields and is used to indicate that this particular field can be used in product requests for filtering or sorting purposes.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ProductAttributeDetails
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                4
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                name
                  +                Identifier
                  +                No
                  +                The name of an attribute.
                  +            
                  +            
                  +                type
                  +                 HYPERLINK  \l "DATATYPE_MalTypesEnum" MalTypesEnum
                  +                No
                  +                The type of an attribute.
                  +            
                  +            
                  +                filterApplicable
                  +                Boolean
                  +                No
                  +                The availability to filter by the attribute.
                  +            
                  +            
                  +                sortApplicable
                  +                Boolean
                  +                No
                  +                The availability to sort by the attribute.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ProductCatalogueEntryDetails
                  +        
                  +        The ProductCatalogueEntryDetails defines an available product in terms of a type, a source, a format and additional details. The structure is used to store object instance identifiers of the ProductTypeDetails, the ProductSource and the ProductProvisioningDetails. To retrieve referenced objects, the COM Archive shall be used.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ProductCatalogueEntryDetails
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                5
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                productTypeId
                  +                Long
                  +                No
                  +                The object instance identifier of the ProductType.
                  +            
                  +            
                  +                productSourceId
                  +                Long
                  +                No
                  +                The object instance identifier of the ProductSource.
                  +            
                  +            
                  +                productProvisioningDetailId
                  +                Long
                  +                No
                  +                The object instance identifier of the ProductProvisioningDetailsInstance.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: TimeRange
                  +        
                  +        The TimeRange structure represents a period from the start time to the end time, inclusive.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                TimeRange
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                6
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                startTime
                  +                FineTime
                  +                Yes
                  +                The timestamp in picoseconds which represents a point in the time in the UTC time zone from which the data matching the condition will be sent.
                  +            
                  +            
                  +                endTime
                  +                FineTime
                  +                Yes
                  +                The timestamp in picoseconds which represents a point in the time in the UTC time zone until which the data matching the condition will be sent.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: Schedule
                  +        
                  +        The Schedule structure is used to set up parameters to schedule an execution of a request.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                Schedule
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                7
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                startTime
                  +                Time
                  +                No
                  +                The point in the time in the UTC time zone when a transmission shall be started.
                  +            
                  +            
                  +                repeatable
                  +                Boolean
                  +                Yes
                  +                The flag, which determines whether data shall be retransmitted periodically, with given interval.
                  +            
                  +            
                  +                interval
                  +                Duration
                  +                Yes
                  +                The interval between sub-requests.
                  +            
                  +            
                  +                expiryDate
                  +                Time
                  +                Yes
                  +                The point in time in the UTC time zone when the request becomes expired.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: BatchProductRequestDetails
                  +        
                  +        The BatchProductRequestDetails contains details of a product request. It specifies criteria, which product to retrieve must meet. The structure is used both in batch and stream requests.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                BatchProductRequestDetails
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                8
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                productTypeId
                  +                Long
                  +                No
                  +                The object instance identifier of the ProductType.
                  +            
                  +            
                  +                productSourceId
                  +                Long
                  +                No
                  +                The object instance identifier of the ProductSource.
                  +            
                  +            
                  +                productFormatId
                  +                Long
                  +                No
                  +                The object instance identifier of the ProductFormat.
                  +            
                  +            
                  +                destination
                  +                 HYPERLINK  \l "DATATYPE_DestinationDeliveryDetails" DestinationDeliveryDetails
                  +                Yes
                  +                The structure indicating a local or remote destination of the product delivery. The structure contains an address of the product delivery, an optional security token and attributes of the transport protocol.
                  +            
                  +            
                  +                timeRange
                  +                 HYPERLINK  \l "DATATYPE_TimeRange" TimeRange
                  +                Yes
                  +                The period of the time, from which the mission data product is requested.
                  +            
                  +            
                  +                filter
                  +                COM::Archive::CompositeFilterSet
                  +                Yes
                  +                The filter conditions that the product to retrieve must meet. The response data may be filtered only on attributes defined in the list of ProductAttributes. If NULL, all the data available in the selected time range are returned.
                  +            
                  +            
                  +                schedule
                  +                 HYPERLINK  \l "DATATYPE_Schedule" Schedule
                  +                Yes
                  +                The structure, which defines the schedule of the request.
                  +            
                  +            
                  +                encryption
                  +                UInteger
                  +                Yes
                  +                The encryption algorithm to be applied to response data.
                  +            
                  +            
                  +                compression
                  +                UInteger
                  +                Yes
                  +                The compression algorithm to be applied to response data.
                  +            
                  +            
                  +                sortField
                  +                String
                  +                Yes
                  +                The name of the field to use to sort the response. Must comply with the name defined in a list of ProductAttributes. If true, the response is sorted in the ascending order, otherwise - in descending one.
                  +            
                  +            
                  +                chunkSize
                  +                Long
                  +                Yes
                  +                The maximum size of the response message. If the response message exceeds the specified value, data is split into chunks.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: DestinationDeliveryDetails
                  +        
                  +        The DestinationDeliveryDetails strucure is used to provide details needed for the local or remote product delivery. The structure contains an address of the product delivery, an optional security token and attributes of the transport protocol.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                DestinationDeliveryDetails
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                9
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                uri
                  +                URI
                  +                No
                  +                The fully-qualified address in the form of the URI (RFC 3986). It specifies where to deliver requested mission data product. The address shall indicate the protocol used for sending the data and the identifier of the host where the data shall be delivered. If the host identifier contains reserved word 'localhost', then the response shall be stored locally by the MDPDS. The name used for storing the response is optional. If provided, it may be a literal or templated string. The template contains special identifiers, enclosed in brackets, that are automatically replaced by the provider according to the following pattern (the case size does not matter): [P] -  the product type; [S] - the product source; [F] - the product format; [D] - the UTC date of the response delivery ; [nP] - the part number of n digits width, padded with leading zeros, [C] - the compression format, [E] - the encrytpion format. If the name is not provided, then the provider generates it automatically using the following pattern:  [T]_[S]_[D].[F].[C].[E].[P] which will be expanded to: type_source_date.format.compression.encryption.partN. 
                  +            
                  +            
                  +                securityToken
                  +                Blob
                  +                Yes
                  +                The securityToken isused to provide details needed for authentication to the remote destination.
                  +            
                  +            
                  +                protocolAttributes
                  +                 HYPERLINK  \l "DATATYPE_ProtocolAttributeDetails" ProtocolAttributeDetails
                  +                Yes
                  +                The protocolAttributes is an abstract structure, which may contain any additional attributes required by the protocol or remote destination to handle the data transfer.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ProtocolAttributeDetails
                  +        
                  +        The ProtocolAttributeDetails is an abstract structure, which may contain any additional attributes required by the protocol or remote destination to handle the data transfer.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ProtocolAttributeDetails
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                10
                  +            
                  +        
                  +        
                  +            
                  +            Composite: RemoteResponse
                  +        
                  +        The RemoteResponse structure is used to provide a location, a size and a delivery date of the product response. Only when the destination field of the product request is specified, then the structure is sent in an update message of the requestProduct operation.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                RemoteResponse
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                11
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                responseLink
                  +                URI
                  +                No
                  +                The responseLink field shall contain the fully-qualified address of the file saved in the destination specified in the request. The address is a direct link used for downloading the response file. The format of the address is in the form of the URI (RFC 3986).
                  +            
                  +            
                  +                responseSize
                  +                Long
                  +                No
                  +                The responseSize field shall contain the size in bytes of the product response.
                  +            
                  +            
                  +                deliveryDate
                  +                Time
                  +                No
                  +                The deliveryDate field shall contain the date of the delivery of the response. The date is specified in CCSDS format relevant to the UTC time zone.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: StreamProductRequestDetails
                  +        
                  +        The StreamProductRequestDetails contains details of a stream product request. It specifies criteria, which product to retrieve must meet. The structure is used both in batch and stream requests.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                StreamProductRequestDetails
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                12
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                productTypeId
                  +                Long
                  +                No
                  +                The object instance identifier of the ProductType.
                  +            
                  +            
                  +                productSourceId
                  +                Long
                  +                No
                  +                The object instance identifier of the ProductSource.
                  +            
                  +            
                  +                productFormatId
                  +                Long
                  +                Yes
                  +                The object instance identifier of the ProductFormat.
                  +            
                  +            
                  +                filter
                  +                COM::Archive::CompositeFilterSet
                  +                Yes
                  +                The filter conditions that the product to retrieve must meet. The response data may be filtered only on attributes defined in the list of ProductAttributes.
                  +            
                  +            
                  +                encryption
                  +                UInteger
                  +                Yes
                  +                The encryption algorithm to be applied to response data.
                  +            
                  +            
                  +                compression
                  +                UInteger
                  +                Yes
                  +                The compression algorithm to be applied to response data.
                  +            
                  +            
                  +                expiryDate
                  +                FineTime
                  +                Yes
                  +                The point in the time in the UTC time zone when the stream shall be automatically closed.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: TransferReport
                  +        
                  +        The TransferReport structure contains a summary of the transmitted data.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                TransferReport
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                13
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                requestsIds
                  +                List<Long>
                  +                No
                  +                Object instance identifiers assigned by the system for every accepted request.
                  +            
                  +            
                  +                messages
                  +                Long
                  +                No
                  +                The total number of update messages matching the request.
                  +            
                  +            
                  +                responseSize
                  +                Long
                  +                No
                  +                The total size in bytes of all the update messages matching the request.
                  +            
                  +            
                  +                startTime
                  +                Time
                  +                Yes
                  +                The point in time in the UTC time zone when the request has started being processed.
                  +            
                  +            
                  +                endTime
                  +                Time
                  +                Yes
                  +                The point in time in the UTC time zone when the request has ended being processed.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: RequestStatus
                  +        
                  +        The RequestStatus structure is used to store the current progress of the request.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                RequestStatus
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                14
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                requestId
                  +                Long
                  +                No
                  +                The object instance identifier of the request.
                  +            
                  +            
                  +                userId
                  +                Long
                  +                No
                  +                The object instance identifier of the user who issued the request. The identifier shall correspond to the Profile structure defined in the Login Service.
                  +            
                  +            
                  +                state
                  +                 HYPERLINK  \l "DATATYPE_StateEnum" StateEnum
                  +                No
                  +                The current state of the request processing.
                  +            
                  +            
                  +                percentage
                  +                Float
                  +                No
                  +                The progress of the request processing.
                  +            
                  +            
                  +                updatesDelivered
                  +                Long
                  +                No
                  +                The number of update messages delivered so far.
                  +            
                  +            
                  +                dataDelivered
                  +                Long
                  +                No
                  +                The size (in bytes) of all data delivered so far.
                  +            
                  +            
                  +                creationTime
                  +                Time
                  +                No
                  +                The time when request was received by system.
                  +            
                  +            
                  +                startTime
                  +                Time
                  +                Yes
                  +                The point in time in the UTC time zone when the request has started being processed. If it is NULL, the endTime must be NULL.
                  +            
                  +            
                  +                endTime
                  +                Time
                  +                Yes
                  +                The point in time in the UTC time zone when the request has ended being processed. If it is not NULL, the startTime must not be NULL.
                  +            
                  +            
                  +                schedule
                  +                 HYPERLINK  \l "DATATYPE_Schedule" Schedule
                  +                Yes
                  +                Parameters of the schedule of the request.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ParameterValueTimePair
                  +        
                  +        The ParameterValueTimePair structure is used to store an instance of the parameter value and the time of its generation.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ParameterValueTimePair
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                201
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                parameterValue
                  +                MC::Parameter::ParameterValue
                  +                No
                  +                A value of the parameter.
                  +            
                  +            
                  +                time
                  +                FineTime
                  +                No
                  +                An accurate on-board time in the UTC time zone of the generation of the parameter.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ParameterTimeline
                  +        
                  +        The ParameterTimeline structure holds values of the specific parameter along with their timestamps.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ParameterTimeline
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                202
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                timestampedParameterValues
                  +                List< HYPERLINK  \l "DATATYPE_ParameterValueTimePair" ParameterValueTimePair>
                  +                No
                  +                A list containing values of the specific parameter along with accurate on-board times in the UTC time zone of their generation.
                  +            
                  +            
                  +                provider
                  +                URI
                  +                No
                  +                A source of the parameter. It uniquely points a mission, a domain, a spacecraft and any further details describing where the parameter comes from.
                  +            
                  +            
                  +                parameterDefinitionId
                  +                Long
                  +                No
                  +                The object instance identifier of the parameter definition.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: AggregationValueTimePair
                  +        
                  +        The AggregationValueTimePair structure is used to store an instance of the aggregation value and the time of its generation.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                AggregationValueTimePair
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                203
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                aggregationValue
                  +                MC::Aggregation::AggregationValue
                  +                No
                  +                A value of the aggregation.
                  +            
                  +            
                  +                time
                  +                FineTime
                  +                No
                  +                An accurate on-board time in the UTC time zone of the generation of the aggregation.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: AggregationTimeline
                  +        
                  +        The AggregationTimeline structure holds values of the specific aggregation along with their timestamps.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                AggregationTimeline
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                204
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                timestampedAggregationValues
                  +                List< HYPERLINK  \l "DATATYPE_AggregationValueTimePair" AggregationValueTimePair>
                  +                No
                  +                A list containing values of the specific aggregation along with accurate on-board times in the UTC time zone of their generation.
                  +            
                  +            
                  +                provider
                  +                URI
                  +                No
                  +                A provider of the parameter. It uniquely points a mission, a domain, a spacecraft and any further details describing where the aggregation comes from.
                  +            
                  +            
                  +                aggregationDefinitionId
                  +                Long
                  +                No
                  +                The object instance identifier of the AggregationDefinitionDetails.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ActionStageTimePair
                  +        
                  +        The ActionStageTimePair is used to store the execution stage of the action and its time.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ActionStageTimePair
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                205
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                stageTime
                  +                FineTime
                  +                No
                  +                An accurate on-board time in the UTC time zone of the action execution stage.
                  +            
                  +            
                  +                stageSuccess
                  +                UInteger
                  +                No
                  +                An execution status of the stage. A zero value means a success, while a non-zero value means an error.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ActionInstanceReport
                  +        
                  +        The ActionElement structure is used to report on the status of the each verification of the action instance. Therefore it contains time-stamped statuses for the particular action instance.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ActionInstanceReport
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                206
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                actionInstanceDetails
                  +                MC::Action::ActionInstanceDetails
                  +                No
                  +                Details of the specific action.
                  +            
                  +            
                  +                executionStages
                  +                List< HYPERLINK  \l "DATATYPE_ActionStageTimePair" ActionStageTimePair>
                  +                No
                  +                An ordered list of action execution stages containing the UTC times and execution statuses assigned to each stage.
                  +            
                  +            
                  +                invoker
                  +                URI
                  +                No
                  +                A source where action was genereated.
                  +            
                  +            
                  +                destination
                  +                URI
                  +                No
                  +                A destination system to execute the action. It uniquely points a mission, a domain, a spacecraft and a system where the action is to be executed.
                  +            
                  +            
                  +                actionDefinitionId
                  +                Long
                  +                No
                  +                The id of the action definition.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ActionsHistory
                  +        
                  +        The ActionsHistory structure holds a list of ActionInstanceReports.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ActionsHistory
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                207
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                actions
                  +                List< HYPERLINK  \l "DATATYPE_ActionInstanceReport" ActionInstanceReport>
                  +                No
                  +                A time-tagged history of actions.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: AlertReport
                  +        
                  +        The AlertReport structure holds the alert report.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                AlertReport
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                208
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                name
                  +                Identifier
                  +                No
                  +                An Alert name.
                  +            
                  +            
                  +                category
                  +                String
                  +                No
                  +                An alert category.
                  +            
                  +            
                  +                time
                  +                FineTime
                  +                No
                  +                An alert timestamp in the UTC time zone.
                  +            
                  +            
                  +                source
                  +                URI
                  +                No
                  +                A source where the alert was genereated.
                  +            
                  +            
                  +                alertDefinitionDetailsId
                  +                Long
                  +                No
                  +                The AlertDefinitionDetailsId provides the reference to the definition of an alert, including any argument definitions.
                  +            
                  +            
                  +                alertEventDetailsId
                  +                Long
                  +                No
                  +                The AlertEventDetailsId provides the reference to the structure holding the details of the instance of an alert.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: AlertsHistory
                  +        
                  +        The AlertsHistory structure holds a list of AlertReport objects.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                AlertsHistory
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                209
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                alerts
                  +                List< HYPERLINK  \l "DATATYPE_AlertReport" AlertReport>
                  +                No
                  +                A time-tagged history of alerts.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: CheckReport
                  +        
                  +        The CheckReport structure holds the parameter check report.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                CheckReport
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                210
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                checkDefinitionDetailsId
                  +                Long
                  +                No
                  +                The checkDefinitionDetailsId provides the reference to the structure holding the definition of the check.
                  +            
                  +            
                  +                checkSummary
                  +                MC::Check::CheckSummary
                  +                No
                  +                The checkSummary provides details about a specific check link and its evaluated result.
                  +            
                  +            
                  +                constantCheckDefinitionId
                  +                Long
                  +                Yes
                  +                The constantCheckDefinitionId provides the reference to the consistency check.
                  +            
                  +            
                  +                referenceCheckDefinitionId
                  +                Long
                  +                Yes
                  +                The referenceCheckDefinitionId provides the reference to the reference check.
                  +            
                  +            
                  +                deltaCheckDefinitionId
                  +                Long
                  +                Yes
                  +                The deltaCheckDefinitionId provides the reference to the delta transition check.
                  +            
                  +            
                  +                limitCheckDefinitionId
                  +                Long
                  +                Yes
                  +                The limitCheckDefinitionId provides the reference to the low and high limit check.
                  +            
                  +            
                  +                compountCheckDefinitionId
                  +                Long
                  +                Yes
                  +                The compoundCheckDefinitionId provides the reference to the compound check.
                  +            
                  +            
                  +                timestamp
                  +                FineTime
                  +                No
                  +                The timestamp in the UTC time zone of the check report.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ChecksHistory
                  +        
                  +        The ChecksHistory structure holds a list of CheckReport objects.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ChecksHistory
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                211
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                checks
                  +                List< HYPERLINK  \l "DATATYPE_CheckReport" CheckReport>
                  +                No
                  +                A time-tagged history of check reports.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: MultipleParameterTimeline
                  +        
                  +        The MultipleParameterTimeline is used to store a group of ParameterTimeline objects.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                MultipleParameterTimeline
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                212
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                parameterTimelineList
                  +                List< HYPERLINK  \l "DATATYPE_ParameterTimeline" ParameterTimeline>
                  +                No
                  +                A list of multiple parameter timelines.
                  +            
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The following table lists the errors defined in this specification:
                  +        
                  +            Table 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Table \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Table_TOC \s 1 1
                  +            distribution MO Errors
                  +            "
                  +            :  distribution MO Errors
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                Comment
                  +            
                  +            
                  +                INVALID_PRODUCT_TYPE
                  +                1
                  +                The product type does not exist.
                  +            
                  +            
                  +                INVALID_PRODUCT_SOURCE
                  +                2
                  +                The source does not exist or is not valid for the selected product type.
                  +            
                  +            
                  +                INVALID_PRODUCT_FORMAT
                  +                3
                  +                The product format does not exist or is not supported for the combination of the selected product type and the source.
                  +            
                  +            
                  +                INVALID_PRODUCT_DETAIL
                  +                4
                  +                The product detail does not exist.
                  +            
                  +            
                  +                INVALID_PRODUCT_SPECIFICATION
                  +                5
                  +                The product specifciation does not exist or is not correct.
                  +            
                  +            
                  +                INVALID_PRODUCT_ATTRIBUTE
                  +                6
                  +                One or more filter attributes are invalid. The attribute may not have been defined for the product, the selected comparison operation is not allowed or the attribute value does not match the product type or the format.
                  +            
                  +            
                  +                INVALID_TIME_RANGE
                  +                7
                  +                The date or the date format in the TimeRange structure is invalid.
                  +            
                  +            
                  +                INVALID_SCHEDULE
                  +                8
                  +                The schedule structure contains invalid date, the invalid date format or the invalid expiry date.
                  +            
                  +            
                  +                INVALID_REQUEST_ID
                  +                9
                  +                The object instance identifier of the BatchProductRequestDetails does not exist.
                  +            
                  +            
                  +                INVALID_STREAM_ID
                  +                10
                  +                The object instance identifier of the StreamProductRequestDetails does not exist.
                  +            
                  +            
                  +                COMPRESSION_FORMAT_NOT_SUPPORTED
                  +                11
                  +                The compression format for the selected product is invalid or not supported by the implementation.
                  +            
                  +            
                  +                ENCRYPTION_ALGORITHM_NOT_SUPPORTED
                  +                12
                  +                The encryption format for the selected product is invalid or not supported by the implementation.
                  +            
                  +            
                  +                SCHEDULING_NOT_SUPPORTED
                  +                13
                  +                The request execution scheduling is not supported by the implementation.
                  +            
                  +            
                  +                SORTING_NOT_SUPPORTED
                  +                14
                  +                The sorting attribute for the selected product is invalid or not supported by the implementation.
                  +            
                  +            
                  +                INVALID_CHUNK_SIZE
                  +                15
                  +                The chunk size is invalid or splitting a product into multiple update messages is not supported by the implementation.
                  +            
                  +            
                  +                PRODUCT_NOT_SUPPORTED_IN_BATCH
                  +                16
                  +                The product is not supported in the batch mode for the selected combination of a product type, a format and a source.
                  +            
                  +            
                  +                PRODUCT_NOT_SUPPORTED_IN_STREAM
                  +                17
                  +                The product is not supported in the stream mode.
                  +            
                  +            
                  +                TRANSFER_PROTOCOL_NOT_SUPPORTED
                  +                18
                  +                The transfer protocol specified in the request is not supported by the provider.
                  +            
                  +            
                  +                INVALID_TRANSFER_PROTOCOL_ATTRIBUTES
                  +                19
                  +                The attributes of the transfer protocol specified in the request are invalid.
                  +            
                  +            
                  +                INVALID_FILE_NAME
                  +                20
                  +                The file name of the response is invalid. It may be caused by an invalid character, an invalid path or, when using templates, an invalid special identifier.
                  +            
                  +        
                  +    
                  +
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area009-v001-distribution/word/numbering.xml b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area009-v001-distribution/word/numbering.xml
                  new file mode 100644
                  index 00000000..5245d934
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area009-v001-distribution/word/numbering.xml
                  @@ -0,0 +1,79 @@
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area009-v001-distribution/word/styles.xml b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area009-v001-distribution/word/styles.xml
                  new file mode 100644
                  index 00000000..ee967ee1
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area009-v001-distribution/word/styles.xml
                  @@ -0,0 +1 @@
                  +
                  \ No newline at end of file
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area020-v001-FM/[Content_Types].xml b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area020-v001-FM/[Content_Types].xml
                  new file mode 100644
                  index 00000000..fbe325d6
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area020-v001-FM/[Content_Types].xml
                  @@ -0,0 +1 @@
                  +
                  \ No newline at end of file
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area020-v001-FM/_rels/.rels b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area020-v001-FM/_rels/.rels
                  new file mode 100644
                  index 00000000..d6637f3e
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area020-v001-FM/_rels/.rels
                  @@ -0,0 +1 @@
                  +
                  \ No newline at end of file
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area020-v001-FM/word/_rels/document.xml.rels b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area020-v001-FM/word/_rels/document.xml.rels
                  new file mode 100644
                  index 00000000..7af141e1
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area020-v001-FM/word/_rels/document.xml.rels
                  @@ -0,0 +1 @@
                  +
                  \ No newline at end of file
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area020-v001-FM/word/document.xml b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area020-v001-FM/word/document.xml
                  new file mode 100644
                  index 00000000..a1bc8d1f
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area020-v001-FM/word/document.xml
                  @@ -0,0 +1,3572 @@
                  +
                  +
                  +    
                  +        
                  +            Specification: FM
                  +        
                  +        
                  +            General
                  +        
                  +        This section contains the specifications for the FM services.
                  +        File Management Services: File System and Transfer Management
                  +        This area contains the following services:
                  +        FileSystem
                  +        FileTransfer
                  +        
                  +            
                  +            Service: FileSystem
                  +        
                  +        
                  +            Overview
                  +        
                  +        The File System service provides the capability to manage files on a remote file system.
                  +        It is not content aware, and manipulates files as black boxes. It allows controlling flat (i.e. without support for directories) or structured (i.e. with directory support) file systems byproviding functionalities to manage files and directories.
                  +        File usage is not within the scope of this service. MO services that can use files have dedicated subtypes supporting the utilization of files within their context. File transfers that require the file to leave the file system (e.g. transfer over a space link) are out of the scope of this service and are handled by the File Transfer Management Service (service 30).
                  +        
                  +            Table 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Table \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Table_TOC \s 1 1
                  +            FileSystem Service Operations
                  +            "
                  +            :  FileSystem Service Operations
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Area Identifier
                  +                Service Identifier
                  +                Area Number
                  +                Service Number
                  +                Area Version
                  +            
                  +            
                  +                FM
                  +                FileSystem
                  +                20
                  +                29
                  +                1
                  +            
                  +            
                  +                Interaction Pattern
                  +                Operation Identifier
                  +                Operation Number
                  +                Capability Set
                  +            
                  +            
                  +                SUBMIT
                  +                 HYPERLINK  \l "OPERATION_29_create" create
                  +                1
                  +                1
                  +            
                  +            
                  +                SUBMIT
                  +                 HYPERLINK  \l "OPERATION_29_move" move
                  +                2
                  +                
                  +            
                  +            
                  +                SUBMIT
                  +                 HYPERLINK  \l "OPERATION_29_delete" delete
                  +                3
                  +                
                  +            
                  +            
                  +                SUBMIT
                  +                 HYPERLINK  \l "OPERATION_29_copy" copy
                  +                4
                  +                
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_29_getAttributes" getAttributes
                  +                5
                  +                2
                  +            
                  +            
                  +                SUBMIT
                  +                 HYPERLINK  \l "OPERATION_29_setAttributes" setAttributes
                  +                6
                  +                
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_29_list" list
                  +                7
                  +                3
                  +            
                  +            
                  +                PROGRESS
                  +                 HYPERLINK  \l "OPERATION_29_find" find
                  +                8
                  +                
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_29_append" append
                  +                9
                  +                4
                  +            
                  +            
                  +                SUBMIT
                  +                 HYPERLINK  \l "OPERATION_29_truncate" truncate
                  +                10
                  +                
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_29_read" read
                  +                11
                  +                
                  +            
                  +        
                  +        
                  +            Service-level Requirements
                  +        
                  +        
                  +            
                  +            Operation: create
                  +        
                  +        
                  +            Overview
                  +        
                  +        The create operation allows a consumer to create a new empty file or directory on the remote file store. This operation will create the file or directory with the default attrivbutes of the remote file system. To change the attributes of files or directories refer to operation setAttributes.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                create
                  +            
                  +            
                  +                Interaction Pattern
                  +                SUBMIT
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                SUBMIT
                  +                NoNoNo
                  +                 HYPERLINK  \l "DATATYPE_NodeType" NodeType typeURI pathBoolean overwrite
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        type - The type of node to create: File or Directory
                  +        path - The path field contains the logical path to where the file or directory is to be created.
                  +        overwrite - Force overwrite if the file or directory already exists.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        PERMISSION_DENIED: Not described
                  +        INVALID_PATH: Not described
                  +        OTHER: Not described
                  +        NODE_EXISTS: Not described
                  +        UNKNOWN_NODE_TYPE: Not described
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                PERMISSION_DENIED
                  +                80001
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                INVALID_PATH
                  +                80003
                  +                URI
                  +                
                  +            
                  +            
                  +                OTHER
                  +                80005
                  +                Identifier
                  +                The error reported by the remote file system
                  +            
                  +            
                  +                NODE_EXISTS
                  +                80010
                  +                URI
                  +                
                  +            
                  +            
                  +                UNKNOWN_NODE_TYPE
                  +                80014
                  +                 HYPERLINK  \l "DATATYPE_NodeType" NodeType
                  +                
                  +            
                  +        
                  +        
                  +            
                  +            Operation: move
                  +        
                  +        
                  +            Overview
                  +        
                  +        The move operation allows a consumer to move (i.e. rename) a file or directory from the source to the target path within a remote file store (even if across different file systems). Operations to move a file across different file stores over the space link are covered by the File Transfer Management Service.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                move
                  +            
                  +            
                  +                Interaction Pattern
                  +                SUBMIT
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                SUBMIT
                  +                NoNoYes
                  +                URI sourceURI targetBoolean overwrite
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        source - Path to the node being moved.
                  +        target - Target name
                  +        overwrite - Force overwrite if the file or folder already exist.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        PERMISSION_DENIED: Not described
                  +        FILESYSTEM_FULL: Not described
                  +        INVALID_PATH: Not described
                  +        NODE_NOT_FOUND: Not described
                  +        OTHER: Not described
                  +        NODE_EXISTS: Not described
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                PERMISSION_DENIED
                  +                80001
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                FILESYSTEM_FULL
                  +                80002
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                INVALID_PATH
                  +                80003
                  +                URI
                  +                
                  +            
                  +            
                  +                NODE_NOT_FOUND
                  +                80004
                  +                URI
                  +                
                  +            
                  +            
                  +                OTHER
                  +                80005
                  +                Identifier
                  +                The error reported by the remote file system
                  +            
                  +            
                  +                NODE_EXISTS
                  +                80010
                  +                URI
                  +                
                  +            
                  +        
                  +        
                  +            
                  +            Operation: delete
                  +        
                  +        
                  +            Overview
                  +        
                  +        The delete operation allows a consumer to delete a file or directory from a remote file store.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                delete
                  +            
                  +            
                  +                Interaction Pattern
                  +                SUBMIT
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                SUBMIT
                  +                NoNo
                  +                URI pathBoolean force
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        path - The path field contains the path to the node to be deleted
                  +        force - Force delete: true/false
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        PERMISSION_DENIED: Not described
                  +        INVALID_PATH: Not described
                  +        NODE_NOT_FOUND: Not described
                  +        OTHER: Not described
                  +        UNKNOWN_NODE_TYPE: Not described
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                PERMISSION_DENIED
                  +                80001
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                INVALID_PATH
                  +                80003
                  +                URI
                  +                
                  +            
                  +            
                  +                NODE_NOT_FOUND
                  +                80004
                  +                URI
                  +                
                  +            
                  +            
                  +                OTHER
                  +                80005
                  +                Identifier
                  +                The error reported by the remote file system
                  +            
                  +            
                  +                UNKNOWN_NODE_TYPE
                  +                80014
                  +                 HYPERLINK  \l "DATATYPE_NodeType" NodeType
                  +                
                  +            
                  +        
                  +        
                  +            
                  +            Operation: copy
                  +        
                  +        
                  +            Overview
                  +        
                  +        The copy operation allows a consumer to copy a file or directory from the source to the target path within a remote file store (even if across different file systems). Operations to copy a file across different file stores over the space link are covered by the File Transfer Management Service.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                copy
                  +            
                  +            
                  +                Interaction Pattern
                  +                SUBMIT
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                SUBMIT
                  +                NoNoNo
                  +                URI sourceURI targetBoolean overwrite
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        source - Path to the node being copied.
                  +        target - Target path of the copied node.
                  +        overwrite - Force overwrite if the file or folder already exist.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        PERMISSION_DENIED: Not described
                  +        FILESYSTEM_FULL: Not described
                  +        INVALID_PATH: Not described
                  +        NODE_NOT_FOUND: Not described
                  +        OTHER: Not described
                  +        NODE_EXISTS: Not described
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                PERMISSION_DENIED
                  +                80001
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                FILESYSTEM_FULL
                  +                80002
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                INVALID_PATH
                  +                80003
                  +                URI
                  +                
                  +            
                  +            
                  +                NODE_NOT_FOUND
                  +                80004
                  +                URI
                  +                
                  +            
                  +            
                  +                OTHER
                  +                80005
                  +                Identifier
                  +                The error reported by the remote file system
                  +            
                  +            
                  +                NODE_EXISTS
                  +                80010
                  +                URI
                  +                
                  +            
                  +        
                  +        
                  +            
                  +            Operation: getAttributes
                  +        
                  +        
                  +            Overview
                  +        
                  +        The getAttributes operation allows a consumer to retrieve the attributes for a file or directory on a remote file system.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                getAttributes
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                No
                  +                URI path
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                No
                  +                 HYPERLINK  \l "DATATYPE_NodeAttributes" NodeAttributes attributes
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        path - The path of the node to be queried
                  +        attributes - List of node attributes
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        PERMISSION_DENIED: Not described
                  +        INVALID_PATH: Not described
                  +        NODE_NOT_FOUND: Not described
                  +        OTHER: Not described
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                PERMISSION_DENIED
                  +                80001
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                INVALID_PATH
                  +                80003
                  +                URI
                  +                
                  +            
                  +            
                  +                NODE_NOT_FOUND
                  +                80004
                  +                URI
                  +                
                  +            
                  +            
                  +                OTHER
                  +                80005
                  +                Identifier
                  +                The error reported by the remote file system
                  +            
                  +        
                  +        
                  +            
                  +            Operation: setAttributes
                  +        
                  +        
                  +            Overview
                  +        
                  +        The setAttributes operation allows a consumer to change the attributes of a file or directory on a remote file system.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                setAttributes
                  +            
                  +            
                  +                Interaction Pattern
                  +                SUBMIT
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                SUBMIT
                  +                NoNo
                  +                URI path HYPERLINK  \l "DATATYPE_NodeAttributes" NodeAttributes attributes
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        path - Path to the node whose attributes will be set.
                  +        attributes - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        PERMISSION_DENIED: Not described
                  +        INVALID_PATH: Not described
                  +        NODE_NOT_FOUND: Not described
                  +        OTHER: Not described
                  +        INVALID_ATTRIBUTE: Not described
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                PERMISSION_DENIED
                  +                80001
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                INVALID_PATH
                  +                80003
                  +                URI
                  +                
                  +            
                  +            
                  +                NODE_NOT_FOUND
                  +                80004
                  +                URI
                  +                
                  +            
                  +            
                  +                OTHER
                  +                80005
                  +                Identifier
                  +                The error reported by the remote file system
                  +            
                  +            
                  +                INVALID_ATTRIBUTE
                  +                80020
                  +                 HYPERLINK  \l "DATATYPE_NodeAttributes" NodeAttributes
                  +                List of the invalid attributes which were not set due to error.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: list
                  +        
                  +        
                  +            Overview
                  +        
                  +        The list operation allows a consumer to list the files and directories in a given directory on the remote file system. This listing allows for filtering based on name and time and it is not recursive.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                list
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                NoNoYesYesYes
                  +                URI pathBoolean toFileString nameRegexFilterTime lastModifiedTimeFilterBoolean recursive
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                No
                  +                List< HYPERLINK  \l "DATATYPE_Node" Node> nodes
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        path - 
                  +        toFile - Set to true if the list should be written to a file. If toFile is true then the Response contails the path to the file with the list.
                  +        nameRegexFilter - Name filter to be applied. All files and folders that pass the filter will be added to the list.
                  +        lastModifiedTimeFilter - Time filters to be applied. All files and folders with last modified time larger than or equal to the filter will be added to the list.
                  +        recursive - Set to true to do a recursive list
                  +        nodes - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        PERMISSION_DENIED: Not described
                  +        INVALID_PATH: Not described
                  +        NODE_NOT_FOUND: Not described
                  +        OTHER: Not described
                  +        NOT_A_DIRECTORY: Not described
                  +        IO_ERROR: Not described
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                PERMISSION_DENIED
                  +                80001
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                INVALID_PATH
                  +                80003
                  +                URI
                  +                
                  +            
                  +            
                  +                NODE_NOT_FOUND
                  +                80004
                  +                URI
                  +                
                  +            
                  +            
                  +                OTHER
                  +                80005
                  +                Identifier
                  +                The error reported by the remote file system
                  +            
                  +            
                  +                NOT_A_DIRECTORY
                  +                80012
                  +                URI
                  +                
                  +            
                  +            
                  +                IO_ERROR
                  +                80030
                  +                Identifier
                  +                
                  +            
                  +        
                  +        
                  +            
                  +            Operation: find
                  +        
                  +        
                  +            Overview
                  +        
                  +        The find operation allows a consumer to find files or folders in a search path on a remote file system that match a given regular expression.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                find
                  +            
                  +            
                  +                Interaction Pattern
                  +                PROGRESS
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                PROGRESS
                  +                NoNoNo
                  +                URI pathBoolean toFileString searchPattern
                  +            
                  +            
                  +                OUT
                  +                ACK
                  +                -
                  +                -
                  +            
                  +            
                  +                OUT
                  +                UPDATE
                  +                No
                  +                List< HYPERLINK  \l "DATATYPE_Node" Node> nodes
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                No
                  +                UInteger count
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        path - The location from where the search will be done.
                  +        toFile - Set to true if the list should be written to a file. If toFile is true then the Update contails the path to the file with the list.
                  +        searchPattern - Regular expression to be matched against files in the Directory. Only files that match will be returned. If null all files nodes will match.
                  +        nodes - 
                  +        count - Number of matches
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        PERMISSION_DENIED: Not described
                  +        INVALID_PATH: Not described
                  +        NODE_NOT_FOUND: Not described
                  +        OTHER: Not described
                  +        NOT_A_DIRECTORY: Not described
                  +        IO_ERROR: Not described
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                PERMISSION_DENIED
                  +                80001
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                INVALID_PATH
                  +                80003
                  +                URI
                  +                
                  +            
                  +            
                  +                NODE_NOT_FOUND
                  +                80004
                  +                URI
                  +                
                  +            
                  +            
                  +                OTHER
                  +                80005
                  +                Identifier
                  +                The error reported by the remote file system
                  +            
                  +            
                  +                NOT_A_DIRECTORY
                  +                80012
                  +                URI
                  +                
                  +            
                  +            
                  +                IO_ERROR
                  +                80030
                  +                Identifier
                  +                
                  +            
                  +        
                  +        
                  +            
                  +            Operation: append
                  +        
                  +        
                  +            Overview
                  +        
                  +        The append operation allows a consumer to append a blob of data to the end of an existing file on the remote file system.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                append
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                NoNo
                  +                URI pathBlob data
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                No
                  +                UInteger size
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        path - File to which the data shall be appended to
                  +        data - Data to be appended to file
                  +        size - New total file size
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        PERMISSION_DENIED: Not described
                  +        INVALID_PATH: Not described
                  +        NODE_NOT_FOUND: Not described
                  +        OTHER: Not described
                  +        NOT_A_FILE: Not described
                  +        IO_ERROR: Not described
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                PERMISSION_DENIED
                  +                80001
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                INVALID_PATH
                  +                80003
                  +                URI
                  +                
                  +            
                  +            
                  +                NODE_NOT_FOUND
                  +                80004
                  +                URI
                  +                
                  +            
                  +            
                  +                OTHER
                  +                80005
                  +                Identifier
                  +                The error reported by the remote file system
                  +            
                  +            
                  +                NOT_A_FILE
                  +                80013
                  +                URI
                  +                
                  +            
                  +            
                  +                IO_ERROR
                  +                80030
                  +                Identifier
                  +                
                  +            
                  +        
                  +        
                  +            
                  +            Operation: truncate
                  +        
                  +        
                  +            Overview
                  +        
                  +        Truncates file to zero byte in size
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                truncate
                  +            
                  +            
                  +                Interaction Pattern
                  +                SUBMIT
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                SUBMIT
                  +                No
                  +                URI path
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        path - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        PERMISSION_DENIED: Not described
                  +        INVALID_PATH: Not described
                  +        NODE_NOT_FOUND: Not described
                  +        OTHER: Not described
                  +        NOT_A_FILE: Not described
                  +        IO_ERROR: Not described
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                PERMISSION_DENIED
                  +                80001
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                INVALID_PATH
                  +                80003
                  +                URI
                  +                
                  +            
                  +            
                  +                NODE_NOT_FOUND
                  +                80004
                  +                URI
                  +                
                  +            
                  +            
                  +                OTHER
                  +                80005
                  +                Identifier
                  +                The error reported by the remote file system
                  +            
                  +            
                  +                NOT_A_FILE
                  +                80013
                  +                URI
                  +                
                  +            
                  +            
                  +                IO_ERROR
                  +                80030
                  +                Identifier
                  +                
                  +            
                  +        
                  +        
                  +            
                  +            Operation: read
                  +        
                  +        
                  +            Overview
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                read
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                NoYesYes
                  +                URI pathUInteger offsetUInteger size
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                Yes
                  +                Blob data
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        path - 
                  +        offset - Offset from the start of the file in byte. If Null then zero is assumed
                  +        size - Number of byte to read. If Null then read the whole file
                  +        data - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        PERMISSION_DENIED: Not described
                  +        INVALID_PATH: Not described
                  +        NODE_NOT_FOUND: Not described
                  +        OTHER: Not described
                  +        NOT_A_FILE: Not described
                  +        IO_ERROR: Not described
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                PERMISSION_DENIED
                  +                80001
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                INVALID_PATH
                  +                80003
                  +                URI
                  +                
                  +            
                  +            
                  +                NODE_NOT_FOUND
                  +                80004
                  +                URI
                  +                
                  +            
                  +            
                  +                OTHER
                  +                80005
                  +                Identifier
                  +                The error reported by the remote file system
                  +            
                  +            
                  +                NOT_A_FILE
                  +                80013
                  +                URI
                  +                
                  +            
                  +            
                  +                IO_ERROR
                  +                80030
                  +                Identifier
                  +                
                  +            
                  +        
                  +        
                  +            
                  +            Service: FileTransfer
                  +        
                  +        
                  +            Overview
                  +        
                  +        The File Transfer Management Service gives consumers the capabilities to control and monitor file transfers across the space link. This service assumes the use of the CCSDS File Delivery Protocol (CFDP) [D2] as the underlying file delivery mechanism.
                  +        
                  +            Table 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Table \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Table_TOC \s 1 1
                  +            FileTransfer Service Operations
                  +            "
                  +            :  FileTransfer Service Operations
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Area Identifier
                  +                Service Identifier
                  +                Area Number
                  +                Service Number
                  +                Area Version
                  +            
                  +            
                  +                FM
                  +                FileTransfer
                  +                20
                  +                30
                  +                1
                  +            
                  +            
                  +                Interaction Pattern
                  +                Operation Identifier
                  +                Operation Number
                  +                Capability Set
                  +            
                  +            
                  +                INVOKE
                  +                 HYPERLINK  \l "OPERATION_30_transfer" transfer
                  +                1
                  +                1
                  +            
                  +            
                  +                SUBMIT
                  +                 HYPERLINK  \l "OPERATION_30_cancel" cancel
                  +                2
                  +                
                  +            
                  +            
                  +                SUBMIT
                  +                 HYPERLINK  \l "OPERATION_30_suspend" suspend
                  +                3
                  +                
                  +            
                  +            
                  +                SUBMIT
                  +                 HYPERLINK  \l "OPERATION_30_resume" resume
                  +                4
                  +                
                  +            
                  +            
                  +                SUBMIT
                  +                 HYPERLINK  \l "OPERATION_30_cancelAll" cancelAll
                  +                5
                  +                2
                  +            
                  +            
                  +                SUBMIT
                  +                 HYPERLINK  \l "OPERATION_30_suspendAll" suspendAll
                  +                6
                  +                
                  +            
                  +            
                  +                SUBMIT
                  +                 HYPERLINK  \l "OPERATION_30_resumeAll" resumeAll
                  +                7
                  +                
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_30_getTransactionReport" getTransactionReport
                  +                8
                  +                3
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_30_listTransactions" listTransactions
                  +                9
                  +                
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_30_getWindowStatus" getWindowStatus
                  +                10
                  +                
                  +            
                  +        
                  +        
                  +            Service-level Requirements
                  +        
                  +        
                  +            
                  +            Operation: transfer
                  +        
                  +        
                  +            Overview
                  +        
                  +        The transfer operation allows a consumer to transfer a file from the service provider to the consumer. This operation wraps the CFDP Put Request Primitive. 
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                transfer
                  +            
                  +            
                  +                Interaction Pattern
                  +                INVOKE
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                INVOKE
                  +                NoNoNoNoYes
                  +                URI sourcePathBlob targetEntityIdURI targetPathUOctet priority HYPERLINK  \l "DATATYPE_FileTransmissionMode" FileTransmissionMode transmissionWindowMode
                  +            
                  +            
                  +                OUT
                  +                ACK
                  +                NoNo
                  +                 HYPERLINK  \l "DATATYPE_FileTransactionId" FileTransactionId transactionIdUInteger fileSize
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                No
                  +                 HYPERLINK  \l "DATATYPE_FileTransactionReport" FileTransactionReport transactionReport
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        sourcePath - The 'Source Repository Path Value' field, this is the logical path to the directory where the source file to be transferred to the remote entity resides.
                  +        targetEntityId - 
                  +        targetPath - This is the logical path to the directory where the transferred file will be placed at the destination entity.
                  +        priority - The request priority in the range [1,10]. The lower the number the higher the priority.
                  +        transmissionWindowMode - 
                  +        transactionId - The transaction ID of the just initiated transfer. Null if the transfer could not be started
                  +        fileSize - The size of the file being transferred in Kibibyte (1024 byte)
                  +        transactionReport - Generated once the transfer is complete. Contains the status of the transaction.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        PERMISSION_DENIED: Not described
                  +        INVALID_PATH: Not described
                  +        NODE_NOT_FOUND: Not described
                  +        NOT_A_FILE: Not described
                  +        UNKNOWN_ENTITY: Not described
                  +        OTHER_ERROR: Not described
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                PERMISSION_DENIED
                  +                80001
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                INVALID_PATH
                  +                80003
                  +                URI
                  +                
                  +            
                  +            
                  +                NODE_NOT_FOUND
                  +                80004
                  +                URI
                  +                
                  +            
                  +            
                  +                NOT_A_FILE
                  +                80013
                  +                URI
                  +                
                  +            
                  +            
                  +                UNKNOWN_ENTITY
                  +                80045
                  +                Blob
                  +                Reports the Entity ID
                  +            
                  +            
                  +                OTHER_ERROR
                  +                UNKNOWN ERROR NUMBER!
                  +                String
                  +                Extra information about this error. Usually the exception message.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: cancel
                  +        
                  +        
                  +            Overview
                  +        
                  +        The cancel operation allows a consumer to cancel an ongoing transaction. This operation wraps the CFDP Cancel Request Primitive. 
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                cancel
                  +            
                  +            
                  +                Interaction Pattern
                  +                SUBMIT
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                SUBMIT
                  +                No
                  +                 HYPERLINK  \l "DATATYPE_FileTransactionId" FileTransactionId transactionId
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        transactionId - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        UNKNOWN_TRANSACTION: Not described
                  +        OTHER_ERROR: Not described
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                UNKNOWN_TRANSACTION
                  +                80044
                  +                 HYPERLINK  \l "DATATYPE_FileTransactionId" FileTransactionId
                  +                The transaction is not known to the provider
                  +            
                  +            
                  +                OTHER_ERROR
                  +                UNKNOWN ERROR NUMBER!
                  +                String
                  +                Extra information about this error. Usually the exception message.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: suspend
                  +        
                  +        
                  +            Overview
                  +        
                  +        The suspend operation allows a consumer to suspend an ongoing transfer. This operation wraps the CFDP Suspend Request Primitive.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                suspend
                  +            
                  +            
                  +                Interaction Pattern
                  +                SUBMIT
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                SUBMIT
                  +                No
                  +                 HYPERLINK  \l "DATATYPE_FileTransactionId" FileTransactionId transactionId
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        transactionId - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        UNKNOWN_TRANSACTION: Not described
                  +        OTHER_ERROR: Not described
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                UNKNOWN_TRANSACTION
                  +                80044
                  +                 HYPERLINK  \l "DATATYPE_FileTransactionId" FileTransactionId
                  +                The transaction is not known to the provider
                  +            
                  +            
                  +                OTHER_ERROR
                  +                UNKNOWN ERROR NUMBER!
                  +                String
                  +                Extra information about this error. Usually the exception message.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: resume
                  +        
                  +        
                  +            Overview
                  +        
                  +        The resume operation allows a consumer to resumes a previously suspended transaction. This operation wraps the CFDP Resume Request Primitive.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                resume
                  +            
                  +            
                  +                Interaction Pattern
                  +                SUBMIT
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                SUBMIT
                  +                No
                  +                 HYPERLINK  \l "DATATYPE_FileTransactionId" FileTransactionId transactionId
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        transactionId - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        UNKNOWN_TRANSACTION: Not described
                  +        OTHER_ERROR: Not described
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                UNKNOWN_TRANSACTION
                  +                80044
                  +                 HYPERLINK  \l "DATATYPE_FileTransactionId" FileTransactionId
                  +                The transaction is not known to the provider
                  +            
                  +            
                  +                OTHER_ERROR
                  +                UNKNOWN ERROR NUMBER!
                  +                String
                  +                Extra information about this error. Usually the exception message.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: cancelAll
                  +        
                  +        
                  +            Overview
                  +        
                  +        The cancelAll operation allows a consumer to cancel all ongoing transactions. This operation applies the
                  +        CFDP Cancel Request Primitive on all ongoing transactions for a given entity.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                cancelAll
                  +            
                  +            
                  +                Interaction Pattern
                  +                SUBMIT
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                SUBMIT
                  +                -
                  +                -
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return the following error:
                  +        OTHER_ERROR: Not described
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                OTHER_ERROR
                  +                UNKNOWN ERROR NUMBER!
                  +                String
                  +                Extra information about this error. Usually the exception message.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: suspendAll
                  +        
                  +        
                  +            Overview
                  +        
                  +        The suspendAll operation allows a consumer to suspends all ongoing transactions from and/or to a given entity. This operation applies the
                  +        CFDP Suspend Request Primitive on all ongoing transactions to/from a user-defined entity.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                suspendAll
                  +            
                  +            
                  +                Interaction Pattern
                  +                SUBMIT
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                SUBMIT
                  +                NoNo
                  +                Blob entityId HYPERLINK  \l "DATATYPE_FileTransferWindow" FileTransferWindow window
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        entityId - 
                  +        window - The Transmit (Tx) and/or Receive (Rx) windows to be closed.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        UNKNOWN_ENTITY: Not described
                  +        CANNOT_SET_MIB_VALUE: Not described
                  +        OTHER_ERROR: Not described
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                UNKNOWN_ENTITY
                  +                80045
                  +                Blob
                  +                Reports the Entity ID
                  +            
                  +            
                  +                CANNOT_SET_MIB_VALUE
                  +                80050
                  +                String
                  +                Extra information about this error
                  +            
                  +            
                  +                OTHER_ERROR
                  +                UNKNOWN ERROR NUMBER!
                  +                String
                  +                Extra information about this error. Usually the exception message.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: resumeAll
                  +        
                  +        
                  +            Overview
                  +        
                  +        The resumeAll operation allows a consumer to resume previously suspended transactions from and/or to a given entity. This operation applies the
                  +        CFDP Resume Request Primitive on all suspended transactions to/from a user-defined entity.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                resumeAll
                  +            
                  +            
                  +                Interaction Pattern
                  +                SUBMIT
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                SUBMIT
                  +                NoNo
                  +                Blob entityId HYPERLINK  \l "DATATYPE_FileTransferWindow" FileTransferWindow window
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        entityId - 
                  +        window - The Transmit (Tx) and/or Receive (Rx) windows to be closed.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        UNKNOWN_ENTITY: Not described
                  +        CANNOT_SET_MIB_VALUE: Not described
                  +        OTHER_ERROR: Not described
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                UNKNOWN_ENTITY
                  +                80045
                  +                Blob
                  +                Reports the Entity ID
                  +            
                  +            
                  +                CANNOT_SET_MIB_VALUE
                  +                80050
                  +                String
                  +                Extra information about this error
                  +            
                  +            
                  +                OTHER_ERROR
                  +                UNKNOWN ERROR NUMBER!
                  +                String
                  +                Extra information about this error. Usually the exception message.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: getTransactionReport
                  +        
                  +        
                  +            Overview
                  +        
                  +        The getTransactionReport operation allows a consumer to request a report on the status of a transaction. This operation wraps the CFDP Report Request Primitive. 
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                getTransactionReport
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                No
                  +                 HYPERLINK  \l "DATATYPE_FileTransactionId" FileTransactionId transactionId
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                No
                  +                 HYPERLINK  \l "DATATYPE_FileTransactionReport" FileTransactionReport report
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        transactionId - 
                  +        report - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        UNKNOWN_TRANSACTION: Not described
                  +        OTHER_ERROR: Not described
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                UNKNOWN_TRANSACTION
                  +                80044
                  +                 HYPERLINK  \l "DATATYPE_FileTransactionId" FileTransactionId
                  +                The transaction is not known to the provider
                  +            
                  +            
                  +                OTHER_ERROR
                  +                UNKNOWN ERROR NUMBER!
                  +                String
                  +                Extra information about this error. Usually the exception message.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: listTransactions
                  +        
                  +        
                  +            Overview
                  +        
                  +        The listTransactions operation allows a consumer to list with all ongoing or pending transactions to/from a given entity. 
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                listTransactions
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                No
                  +                Blob entityId
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                No
                  +                List< HYPERLINK  \l "DATATYPE_FileTransactionReport" FileTransactionReport> transactionList
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        entityId - 
                  +        transactionList - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        UNKNOWN_TRANSACTION: Not described
                  +        UNKNOWN_ENTITY: Not described
                  +        OTHER_ERROR: Not described
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                UNKNOWN_TRANSACTION
                  +                80044
                  +                 HYPERLINK  \l "DATATYPE_FileTransactionId" FileTransactionId
                  +                The transaction is not known to the provider
                  +            
                  +            
                  +                UNKNOWN_ENTITY
                  +                80045
                  +                Blob
                  +                Reports the Entity ID
                  +            
                  +            
                  +                OTHER_ERROR
                  +                UNKNOWN ERROR NUMBER!
                  +                String
                  +                Extra information about this error. Usually the exception message.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: getWindowStatus
                  +        
                  +        
                  +            Overview
                  +        
                  +        The getWindowStatus operation allows a consumer to get the current status of the receive and transmit windows for a given entity.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                getWindowStatus
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                No
                  +                Blob entityId
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                No
                  +                 HYPERLINK  \l "DATATYPE_WindowStatusReport" WindowStatusReport statusReporty
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        entityId - 
                  +        statusReporty - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        UNKNOWN_ENTITY: Not described
                  +        CANNOT_GET_MIB_VALUE: Not described
                  +        OTHER_ERROR: Not described
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                UNKNOWN_ENTITY
                  +                80045
                  +                Blob
                  +                Reports the Entity ID
                  +            
                  +            
                  +                CANNOT_GET_MIB_VALUE
                  +                80051
                  +                String
                  +                Extra information about this error
                  +            
                  +            
                  +                OTHER_ERROR
                  +                UNKNOWN ERROR NUMBER!
                  +                String
                  +                Extra information about this error. Usually the exception message.
                  +            
                  +        
                  +        
                  +            Data types
                  +        
                  +        
                  +            Service data types: FileSystem
                  +        
                  +        
                  +            
                  +            Composite: NodeAttributes
                  +        
                  +        The NodeAttributes composite holds the attributes for the remote file or directory
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                NodeAttributes
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                1
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                type
                  +                 HYPERLINK  \l "DATATYPE_NodeType" NodeType
                  +                Yes
                  +                Returns the type of this node: File or Directory. Settable: no
                  +            
                  +            
                  +                size
                  +                UInteger
                  +                Yes
                  +                Size of the node in Kibibyte (1024 byte). Settable: no
                  +            
                  +            
                  +                creationTime
                  +                List<String>
                  +                Yes
                  +                Settable: no
                  +            
                  +            
                  +                lastAccessTime
                  +                List<String>
                  +                Yes
                  +                Settable: no
                  +            
                  +            
                  +                lastChangeTime
                  +                List<String>
                  +                Yes
                  +                Settable: no
                  +            
                  +            
                  +                lastModificationTime
                  +                List<String>
                  +                Yes
                  +                Settable: no
                  +            
                  +            
                  +                accessPermissions
                  +                List<String>
                  +                Yes
                  +                Settable: yes
                  +            
                  +            
                  +                owner
                  +                List<String>
                  +                Yes
                  +                Settable: yes
                  +            
                  +        
                  +        
                  +            
                  +            Enumeration: NodeType
                  +        
                  +        List of possible node types
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                NodeType
                  +            
                  +            
                  +                Short Form Part
                  +                2
                  +            
                  +            
                  +                Enumeration Value
                  +                Numerical Value
                  +                Comment
                  +            
                  +            
                  +                FILE
                  +                1
                  +                The node is a file
                  +            
                  +            
                  +                DIRECTORY
                  +                2
                  +                The node is a directory
                  +            
                  +        
                  +        
                  +            
                  +            Composite: Node
                  +        
                  +        Node representation composite.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                Node
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                3
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                type
                  +                 HYPERLINK  \l "DATATYPE_NodeType" NodeType
                  +                No
                  +                
                  +            
                  +            
                  +                path
                  +                URI
                  +                No
                  +                
                  +            
                  +            
                  +                size
                  +                UInteger
                  +                No
                  +                Size of the node in byte. Settable: no
                  +            
                  +            
                  +                permissions
                  +                String
                  +                No
                  +                The node permissions. Settable: no
                  +            
                  +            
                  +                lmTime
                  +                Long
                  +                No
                  +                Last modified time in seconds. Settable: no
                  +            
                  +            
                  +                owner
                  +                String
                  +                No
                  +                The owner of the file
                  +            
                  +        
                  +        
                  +            Service data types: FileTransfer
                  +        
                  +        
                  +            
                  +            Composite: TransactionAttributes
                  +        
                  +        Composite with possible transfer attributes.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                TransactionAttributes
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                1
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                transmissionWindowMode
                  +                 HYPERLINK  \l "DATATYPE_FileTransmissionMode" FileTransmissionMode
                  +                Yes
                  +                
                  +            
                  +            
                  +                receptionWindowMode
                  +                 HYPERLINK  \l "DATATYPE_FileTransmissionMode" FileTransmissionMode
                  +                Yes
                  +                
                  +            
                  +            
                  +                transactionStatus
                  +                 HYPERLINK  \l "DATATYPE_FileTransactionStatus" FileTransactionStatus
                  +                Yes
                  +                
                  +            
                  +            
                  +                transactionResponseCode
                  +                 HYPERLINK  \l "DATATYPE_FileTransactionResponseCode" FileTransactionResponseCode
                  +                Yes
                  +                
                  +            
                  +            
                  +                transactionId
                  +                 HYPERLINK  \l "DATATYPE_FileTransactionId" FileTransactionId
                  +                Yes
                  +                
                  +            
                  +            
                  +                maxTransmissionSpeed
                  +                Float
                  +                Yes
                  +                
                  +            
                  +            
                  +                maxReceptionSpeed
                  +                Float
                  +                Yes
                  +                
                  +            
                  +            
                  +                priority
                  +                UOctet
                  +                Yes
                  +                The request priority in the range [1,10]. The lower the number the higher the priority.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: FileTransactionId
                  +        
                  +        The ID of the FDU transaction between two CFDP entities. A single transaction usually entails the transmission and reception of multiple PDUs
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                FileTransactionId
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                2
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                entity
                  +                Blob
                  +                No
                  +                
                  +            
                  +            
                  +                id
                  +                Blob
                  +                No
                  +                The ID as a byte array
                  +            
                  +        
                  +        
                  +            
                  +            Enumeration: FileTransmissionMode
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                FileTransmissionMode
                  +            
                  +            
                  +                Short Form Part
                  +                3
                  +            
                  +            
                  +                Enumeration Value
                  +                Numerical Value
                  +                Comment
                  +            
                  +            
                  +                UNRELIABLE
                  +                1
                  +                Unacknowledged mode
                  +            
                  +            
                  +                RELIABLE
                  +                2
                  +                Acknowledged mode
                  +            
                  +        
                  +        
                  +            
                  +            Enumeration: FileTransactionStatus
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                FileTransactionStatus
                  +            
                  +            
                  +                Short Form Part
                  +                4
                  +            
                  +            
                  +                Enumeration Value
                  +                Numerical Value
                  +                Comment
                  +            
                  +            
                  +                UNDEFINED
                  +                1
                  +                
                  +            
                  +            
                  +                ACTIVE
                  +                2
                  +                
                  +            
                  +            
                  +                TERMINATED
                  +                3
                  +                
                  +            
                  +            
                  +                UNRECOGNISED
                  +                4
                  +                
                  +            
                  +            
                  +                UNKNOWN
                  +                5
                  +                
                  +            
                  +        
                  +        
                  +            
                  +            Enumeration: FileTransactionResponseCode
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                FileTransactionResponseCode
                  +            
                  +            
                  +                Short Form Part
                  +                5
                  +            
                  +            
                  +                Enumeration Value
                  +                Numerical Value
                  +                Comment
                  +            
                  +            
                  +                UNSUCCESSFUL
                  +                1
                  +                
                  +            
                  +            
                  +                SUCCESSFUL
                  +                2
                  +                
                  +            
                  +            
                  +                UNKNOWN
                  +                3
                  +                
                  +            
                  +        
                  +        
                  +            
                  +            Enumeration: FileTransferWindow
                  +        
                  +        This enumeration represents the communication windows of a file transfer entity. It should be noted that the reception/transmission is from the point of view of the entity being addressed.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                FileTransferWindow
                  +            
                  +            
                  +                Short Form Part
                  +                6
                  +            
                  +            
                  +                Enumeration Value
                  +                Numerical Value
                  +                Comment
                  +            
                  +            
                  +                TX_WINDOW
                  +                1
                  +                Transmission window
                  +            
                  +            
                  +                RX_WINDOW
                  +                2
                  +                Reception window
                  +            
                  +            
                  +                BOTH_WINDOW
                  +                3
                  +                Both TX and RX windows
                  +            
                  +        
                  +        
                  +            
                  +            Composite: FileTransactionReport
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                FileTransactionReport
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                7
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                transactionId
                  +                 HYPERLINK  \l "DATATYPE_FileTransactionId" FileTransactionId
                  +                No
                  +                The transaction ID of the file transfer initiated on the spacecraft.
                  +            
                  +            
                  +                transactionStatus
                  +                 HYPERLINK  \l "DATATYPE_FileTransactionStatus" FileTransactionStatus
                  +                No
                  +                
                  +            
                  +            
                  +                transactionResponseCode
                  +                 HYPERLINK  \l "DATATYPE_FileTransactionResponseCode" FileTransactionResponseCode
                  +                No
                  +                
                  +            
                  +            
                  +                sourcePath
                  +                URI
                  +                No
                  +                
                  +            
                  +            
                  +                targetPath
                  +                URI
                  +                No
                  +                
                  +            
                  +        
                  +        
                  +            
                  +            Composite: WindowStatusReport
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                WindowStatusReport
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                8
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                txWindowOpen
                  +                Boolean
                  +                No
                  +                Returns true if the transmit window is open otherwise false.
                  +            
                  +            
                  +                rxWindowOpen
                  +                Boolean
                  +                No
                  +                Returns true if the receive window is open otherwise false.
                  +            
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The following table lists the errors defined in this specification:
                  +        
                  +            Table 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Table \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Table_TOC \s 1 1
                  +            FM MO Errors
                  +            "
                  +            :  FM MO Errors
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                Comment
                  +            
                  +            
                  +                PERMISSION_DENIED
                  +                80001
                  +                The consumer does not have the right permissions to perform the operation on the remote file or directory
                  +            
                  +            
                  +                FILESYSTEM_FULL
                  +                80002
                  +                The operation could not be performed because the remote file system is full
                  +            
                  +            
                  +                INVALID_PATH
                  +                80003
                  +                The path to the remote file or directory provided by the consumer is invalid
                  +            
                  +            
                  +                NODE_NOT_FOUND
                  +                80004
                  +                The path to the remote file or directory provided by the consumer does not exist
                  +            
                  +            
                  +                OTHER
                  +                80005
                  +                Other system-specific error reported by the remote file system that is not covered in these specifications. See extra information for details
                  +            
                  +            
                  +                NODE_EXISTS
                  +                80010
                  +                The path to the remote file or directory provided by the consumer already exists
                  +            
                  +            
                  +                NODE_LOOP
                  +                80011
                  +                Recursive symbolic links (only applicable if the file system supports symbolic links)
                  +            
                  +            
                  +                NOT_A_DIRECTORY
                  +                80012
                  +                Node invoked as a directory it is not a directory.
                  +            
                  +            
                  +                NOT_A_FILE
                  +                80013
                  +                Node invoked as a file it is not a file.
                  +            
                  +            
                  +                UNKNOWN_NODE_TYPE
                  +                80014
                  +                The node is neither a file nor a directory.
                  +            
                  +            
                  +                DIRECTORY_NOT_EMPTY
                  +                80015
                  +                The consumer tried to delete a directory but the directory is not empty
                  +            
                  +            
                  +                INVALID_ATTRIBUTE
                  +                80020
                  +                One or more attributes set by the consumer are invalid. See extra information for details
                  +            
                  +            
                  +                IO_ERROR
                  +                80030
                  +                Could not read or write to file. See extra information for details
                  +            
                  +            
                  +                TRANSACTION_ABORTED
                  +                80040
                  +                The file transfer has been aborted. See extra information for details
                  +            
                  +            
                  +                TRANSACTION_ALREADY_STARTED
                  +                80041
                  +                A start or resume request was received by the provider but the transaction was already started
                  +            
                  +            
                  +                TRANSACTION_ALREADY_CANCELED
                  +                80042
                  +                A cancel request was received by the provider but the transaction was already canceled
                  +            
                  +            
                  +                TRANSACTION_ALREADY_SUSPENDED
                  +                80043
                  +                A suspend request was received by the provider but the transaction was already suspended
                  +            
                  +            
                  +                UNKNOWN_TRANSACTION
                  +                80044
                  +                The transaction referenced by the consumer is not known to the provider
                  +            
                  +            
                  +                UNKNOWN_ENTITY
                  +                80045
                  +                The entity referenced by the consumer is not known to the provider
                  +            
                  +            
                  +                CANNOT_SET_MIB_VALUE
                  +                80050
                  +                Could not set the value in the CFDP Management Information Base (MIB). See extra information for details
                  +            
                  +            
                  +                CANNOT_GET_MIB_VALUE
                  +                80051
                  +                Could not get the value in the CFDP Management Information Base (MIB). See extra information for details
                  +            
                  +        
                  +    
                  +
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area020-v001-FM/word/numbering.xml b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area020-v001-FM/word/numbering.xml
                  new file mode 100644
                  index 00000000..3206a066
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area020-v001-FM/word/numbering.xml
                  @@ -0,0 +1,47 @@
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area020-v001-FM/word/styles.xml b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area020-v001-FM/word/styles.xml
                  new file mode 100644
                  index 00000000..ee967ee1
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area020-v001-FM/word/styles.xml
                  @@ -0,0 +1 @@
                  +
                  \ No newline at end of file
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area051-v001-MDP/[Content_Types].xml b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area051-v001-MDP/[Content_Types].xml
                  new file mode 100644
                  index 00000000..fbe325d6
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area051-v001-MDP/[Content_Types].xml
                  @@ -0,0 +1 @@
                  +
                  \ No newline at end of file
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area051-v001-MDP/_rels/.rels b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area051-v001-MDP/_rels/.rels
                  new file mode 100644
                  index 00000000..d6637f3e
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area051-v001-MDP/_rels/.rels
                  @@ -0,0 +1 @@
                  +
                  \ No newline at end of file
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area051-v001-MDP/word/_rels/document.xml.rels b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area051-v001-MDP/word/_rels/document.xml.rels
                  new file mode 100644
                  index 00000000..7af141e1
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area051-v001-MDP/word/_rels/document.xml.rels
                  @@ -0,0 +1 @@
                  +
                  \ No newline at end of file
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area051-v001-MDP/word/document.xml b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area051-v001-MDP/word/document.xml
                  new file mode 100644
                  index 00000000..45802939
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area051-v001-MDP/word/document.xml
                  @@ -0,0 +1,1893 @@
                  +
                  +
                  +    
                  +        
                  +            Specification: MDP
                  +        
                  +        
                  +            General
                  +        
                  +        This section contains the specifications for the MDP services.
                  +        CCSDS Mission Data Product services
                  +        This area contains the following services:
                  +        Delivery
                  +        Management
                  +        
                  +            
                  +            Service: Delivery
                  +        
                  +        
                  +            Overview
                  +        
                  +        Data Delivery Service
                  +        
                  +            Table 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Table \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Table_TOC \s 1 1
                  +            Delivery Service Operations
                  +            "
                  +            :  Delivery Service Operations
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Area Identifier
                  +                Service Identifier
                  +                Area Number
                  +                Service Number
                  +                Area Version
                  +            
                  +            
                  +                MDP
                  +                Delivery
                  +                51
                  +                1
                  +                1
                  +            
                  +            
                  +                Interaction Pattern
                  +                Operation Identifier
                  +                Operation Number
                  +                Capability Set
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_1_search" search
                  +                1
                  +                1
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_1_subscribe" subscribe
                  +                2
                  +                
                  +            
                  +            
                  +                SUBMIT
                  +                 HYPERLINK  \l "OPERATION_1_unsubscribe" unsubscribe
                  +                3
                  +                
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_1_listSubscriptions" listSubscriptions
                  +                6
                  +                
                  +            
                  +            
                  +                INVOKE
                  +                 HYPERLINK  \l "OPERATION_1_fetch" fetch
                  +                4
                  +                2
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_1_list" list
                  +                5
                  +                3
                  +            
                  +        
                  +        
                  +            Service-level Requirements
                  +        
                  +        
                  +            
                  +            Operation: search
                  +        
                  +        
                  +            Overview
                  +        
                  +        Searches for products in the data distributor's archive
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                search
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                NoYesYesYesYes
                  +                URI root HYPERLINK  \l "DATATYPE_AttributeFilter" AttributeFilter filterList< HYPERLINK  \l "DATATYPE_SortCriteria" SortCriteria> orderByUInteger limitBoolean metadata
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                Yes
                  +                List<String> token
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        root - Identifies the root for the search.          E.g. /mission-x/attitude/ identifies the collection of attitude files for mission-x, and / indentifies the whole archive
                  +        filter - Optional filter to be applied on the product metadata
                  +        orderBy - Order the returned results by values in the metadata.
                  +        limit - Limit the number of records returned by the get operation.           If NULL, than the limit is automatically set by the provider.           Any sensible implementation of an MDP provider should, anyway, provide a default limit.
                  +        metadata - If True than return also the product metadata in addition to the product ID.
                  +        token - Decided to return single token during Fall meeting 2019
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return the following error:
                  +        UNKNOWN: unknown.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                String
                  +                Extra information by the provider
                  +            
                  +        
                  +        
                  +            
                  +            Operation: subscribe
                  +        
                  +        
                  +            Overview
                  +        
                  +        Subscribes to a product or collection of products given their product type.
                  +        
                  +         Like for the search, subscription-based product delivery, delivers only the product ID and, optionally, its metadata.
                  +        
                  +         It is up to the consumer to retrieve the actual data using the fetch operation
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                subscribe
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                YesYesNo
                  +                List< HYPERLINK  \l "DATATYPE_ProductSearch" ProductSearch> typeBoolean compressed HYPERLINK  \l "DATATYPE_Frequency" Frequency frequency
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                Yes
                  +                Identifier subscriptionId
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        type - Identifies the product searcch
                  +        compressed - If true the returned item will forcibly be compressed
                  +        frequency - How oftern will this subscription be executed
                  +        subscriptionId - Decided to return single token during Fall meeting 2019
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        DUPLICATE: Already exists
                  +        TOO_MANY: Too many
                  +        UNKNOWN: unknown.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                DUPLICATE
                  +                Defined in COM
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                TOO_MANY
                  +                Defined in MAL
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                String
                  +                Extra information by the provider
                  +            
                  +        
                  +        
                  +            
                  +            Operation: unsubscribe
                  +        
                  +        
                  +            Overview
                  +        
                  +        Unsubscribes from a previously subscribed product type or list of product types.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                unsubscribe
                  +            
                  +            
                  +                Interaction Pattern
                  +                SUBMIT
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                SUBMIT
                  +                Yes
                  +                List<Identifier> ids
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        ids - Identifies the product type
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return the following error:
                  +        UNKNOWN: unknown.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                String
                  +                Extra information by the provider
                  +            
                  +        
                  +        
                  +            
                  +            Operation: listSubscriptions
                  +        
                  +        
                  +            Overview
                  +        
                  +        Lists active subscriptions for the active user
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                listSubscriptions
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                -
                  +                -
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                Yes
                  +                List< HYPERLINK  \l "DATATYPE_Subscription" Subscription> subscriptions
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        subscriptions - list of subscriptions
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation does not return any errors.
                  +        
                  +            
                  +            Operation: fetch
                  +        
                  +        
                  +            Overview
                  +        
                  +        Downloads the product data for a given product ID
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                fetch
                  +            
                  +            
                  +                Interaction Pattern
                  +                INVOKE
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                INVOKE
                  +                NoYes
                  +                List<String> tokenBoolean preFetch
                  +            
                  +            
                  +                OUT
                  +                ACK
                  +                -
                  +                -
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                No
                  +                 HYPERLINK  \l "DATATYPE_ProductData" ProductData productData
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        token - Identifier that univocally identifies one product item for a given provider
                  +        preFetch - If true, only the attributes are returned not any data.
                  +        productData - Path and details for the product being added
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        UNKNOWN: unknown.
                  +        NOT_FOUND: Not found..
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                String
                  +                Extra information by the provider
                  +            
                  +            
                  +                NOT_FOUND
                  +                280020
                  +                Not Used
                  +                -
                  +            
                  +        
                  +        
                  +            
                  +            Operation: list
                  +        
                  +        
                  +            Overview
                  +        
                  +        Lists products offered by the provider. The consumer can provide an optional filter.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                list
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                NoYesYes
                  +                URI pathUInteger limitPathsUInteger limitTokens
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                NoNo
                  +                List<URI> pathsList<String> tokens
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        path - Identifies the root for the search.                 E.g. /mission-x/attitude/ identifies the collection of attitude files for mission-x, and / indentifies the whole archive
                  +        limitPaths - Limit the number of records returned by the get operation.                 If NULL, than the limit is automatically set by the provider.                 Any sensible implementation of an MDP provider should, anyway, provide a default limit.
                  +        limitTokens - Limit the number of records returned by the get operation.                 If NULL, than the limit is automatically set by the provider.                 Any sensible implementation of an MDP provider should, anyway, provide a default limit.
                  +        paths - List of sub-folders for the current path
                  +        tokens - Tokens to request products on the current path
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation does not return any errors.
                  +        
                  +            
                  +            Service: Management
                  +        
                  +        
                  +            Overview
                  +        
                  +        Operations to manage the Products and the Product Types
                  +        
                  +            Table 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Table \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Table_TOC \s 1 1
                  +            Management Service Operations
                  +            "
                  +            :  Management Service Operations
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Area Identifier
                  +                Service Identifier
                  +                Area Number
                  +                Service Number
                  +                Area Version
                  +            
                  +            
                  +                MDP
                  +                Management
                  +                51
                  +                2
                  +                1
                  +            
                  +            
                  +                Interaction Pattern
                  +                Operation Identifier
                  +                Operation Number
                  +                Capability Set
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_2_add" add
                  +                1
                  +                1
                  +            
                  +            
                  +                SUBMIT
                  +                 HYPERLINK  \l "OPERATION_2_update" update
                  +                2
                  +                
                  +            
                  +            
                  +                SUBMIT
                  +                 HYPERLINK  \l "OPERATION_2_delete" delete
                  +                3
                  +                
                  +            
                  +            
                  +                SUBMIT
                  +                 HYPERLINK  \l "OPERATION_2_addType" addType
                  +                4
                  +                2
                  +            
                  +            
                  +                SUBMIT
                  +                 HYPERLINK  \l "OPERATION_2_updateType" updateType
                  +                5
                  +                
                  +            
                  +            
                  +                SUBMIT
                  +                 HYPERLINK  \l "OPERATION_2_deleteType" deleteType
                  +                6
                  +                
                  +            
                  +        
                  +        
                  +            Service-level Requirements
                  +        
                  +        
                  +            
                  +            Operation: add
                  +        
                  +        
                  +            Overview
                  +        
                  +        Adds a new Product to the product provider
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                add
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                No
                  +                 HYPERLINK  \l "DATATYPE_ProductData" ProductData productData
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                Yes
                  +                String token
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        productData - Path and details for the product being added
                  +        token - Asafvvz
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        DUPLICATE: Already exists
                  +        UNKNOWN: unknown.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                DUPLICATE
                  +                Defined in COM
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                String
                  +                Extra information by the provider
                  +            
                  +        
                  +        
                  +            
                  +            Operation: update
                  +        
                  +        
                  +            Overview
                  +        
                  +        Updates an existing Product on the product provider. The Product is identified by its unique identifier
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                update
                  +            
                  +            
                  +                Interaction Pattern
                  +                SUBMIT
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                SUBMIT
                  +                YesNo
                  +                String token HYPERLINK  \l "DATATYPE_ProductData" ProductData productData
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        token - Token of the product to be updated
                  +        productData - New data for the product
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        READONLY: Already exists
                  +        UNKNOWN: unknown.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                READONLY
                  +                Defined in MC
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                String
                  +                Extra information by the provider
                  +            
                  +        
                  +        
                  +            
                  +            Operation: delete
                  +        
                  +        
                  +            Overview
                  +        
                  +        Deletes an existing Product from the product provider. The Product is identified by its unique identifier
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                delete
                  +            
                  +            
                  +                Interaction Pattern
                  +                SUBMIT
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                SUBMIT
                  +                No
                  +                List<String> tokens
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        tokens - Tokens for the products beeing deleted
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        READONLY: Already exists
                  +        UNKNOWN: unknown.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                READONLY
                  +                Defined in MC
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                String
                  +                Extra information by the provider
                  +            
                  +        
                  +        
                  +            
                  +            Operation: addType
                  +        
                  +        
                  +            Overview
                  +        
                  +        Adds a new Product Type to the product provider
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                addType
                  +            
                  +            
                  +                Interaction Pattern
                  +                SUBMIT
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                SUBMIT
                  +                No
                  +                 HYPERLINK  \l "DATATYPE_ProductType" ProductType productType
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        productType - Path and details for the product being added
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        DUPLICATE: Already exists
                  +        UNKNOWN: unknown.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                DUPLICATE
                  +                Defined in COM
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                String
                  +                Extra information by the provider
                  +            
                  +        
                  +        
                  +            
                  +            Operation: updateType
                  +        
                  +        
                  +            Overview
                  +        
                  +        Updates an existing Product Type on the product provider. The Product Type is identified by its unique identifier
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                updateType
                  +            
                  +            
                  +                Interaction Pattern
                  +                SUBMIT
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                SUBMIT
                  +                No
                  +                 HYPERLINK  \l "DATATYPE_ProductType" ProductType productType
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        productType - Path and details for the product being added
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        READONLY: Already exists
                  +        UNKNOWN: unknown.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                READONLY
                  +                Defined in MC
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                String
                  +                Extra information by the provider
                  +            
                  +        
                  +        
                  +            
                  +            Operation: deleteType
                  +        
                  +        
                  +            Overview
                  +        
                  +        Deletes an existing Product Type from the product provider. The Product Type is identified by its unique identifier
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                deleteType
                  +            
                  +            
                  +                Interaction Pattern
                  +                SUBMIT
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                SUBMIT
                  +                No
                  +                URI productPath
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        productPath - Path and details for the product being added
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        READONLY: Already exists
                  +        UNKNOWN: unknown.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                READONLY
                  +                Defined in MC
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                String
                  +                Extra information by the provider
                  +            
                  +        
                  +        
                  +            Data types
                  +        
                  +        
                  +            Area data types: MDP
                  +        
                  +        
                  +            
                  +            Composite: ProductType
                  +        
                  +        Identifies a product or product type, with an optional metadata
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ProductType
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                30
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                path
                  +                URI
                  +                No
                  +                
                  +            
                  +            
                  +                metadata
                  +                List<NamedValue>
                  +                Yes
                  +                Metadata common to all products in this path
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ProductData
                  +        
                  +        Identifies a product or product type, with an optional metadata
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ProductData
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                35
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                path
                  +                URI
                  +                No
                  +                e.g. /mission-x/orbit/orbit_file_12345
                  +            
                  +            
                  +                attributes
                  +                List< HYPERLINK  \l "DATATYPE_ProductAttributes" ProductAttributes>
                  +                Yes
                  +                Searchable attributes specific to this product
                  +            
                  +            
                  +                dataFile
                  +                File
                  +                Yes
                  +                optional data field of the product. Data be null, if added through other means in the back-end
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ProductAttributes
                  +        
                  +        Identifies a product or product type, with an optional metadata
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ProductAttributes
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                37
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                attributes
                  +                List<NamedValue>
                  +                Yes
                  +                Attributes specific to a product
                  +            
                  +        
                  +        
                  +            
                  +            Composite: AttributeFilter
                  +        
                  +        The search criteria
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                AttributeFilter
                  +            
                  +            
                  +                Extends
                  +                COM::Archive::CompositeFilterSet
                  +            
                  +            
                  +                Short Form Part
                  +                40
                  +            
                  +        
                  +        
                  +            
                  +            Enumeration: SortDirection
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                SortDirection
                  +            
                  +            
                  +                Short Form Part
                  +                50
                  +            
                  +            
                  +                Enumeration Value
                  +                Numerical Value
                  +                Comment
                  +            
                  +            
                  +                ASC
                  +                1
                  +                Sort in ascending order, from the lowest to the highest value
                  +            
                  +            
                  +                DESC
                  +                2
                  +                Sort in descending order, from the highest to the lowest value
                  +            
                  +        
                  +        
                  +            
                  +            Composite: SortCriteria
                  +        
                  +        The sort criteria
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                SortCriteria
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                60
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                fieldName
                  +                String
                  +                Yes
                  +                The name of the field to use for sorting
                  +            
                  +            
                  +                direction
                  +                 HYPERLINK  \l "DATATYPE_SortDirection" SortDirection
                  +                Yes
                  +                The direction in which the sort the values for the fieldName
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ProductSearch
                  +        
                  +        The Product Search fields
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ProductSearch
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                70
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                root
                  +                URI
                  +                No
                  +                Identifies the root for the search.       E.g. /mission-x/attitude/ identifies the collection of attitude files for mission-x, and / indentifies the whole archive
                  +            
                  +            
                  +                filter
                  +                 HYPERLINK  \l "DATATYPE_AttributeFilter" AttributeFilter
                  +                Yes
                  +                Optional filter to be applied on the product metadata
                  +            
                  +            
                  +                orderBy
                  +                 HYPERLINK  \l "DATATYPE_SortCriteria" SortCriteria
                  +                Yes
                  +                Order the returned results by values in the metadata.
                  +            
                  +            
                  +                limit
                  +                UInteger
                  +                Yes
                  +                Limit the number of records returned by the get operation.        If NULL, than the limit is automatically set by the provider.        Any sensible implementation of an MDP provider should, anyway, provide a default limit.
                  +            
                  +            
                  +                metadata
                  +                Boolean
                  +                Yes
                  +                If True than return also the product metadata in addition to the product ID.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: Frequency
                  +        
                  +        The Product Search fields
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                Frequency
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                80
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                start
                  +                Time
                  +                Yes
                  +                When will this frequency start. Default is 'now'
                  +            
                  +            
                  +                duration
                  +                Duration
                  +                No
                  +                How often? e.g. every X seconds
                  +            
                  +        
                  +        
                  +            
                  +            Composite: Subscription
                  +        
                  +        The subscription id, plus all the information provided when 'subscribe' was invoked
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                Subscription
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                81
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                subscriptionId
                  +                Identifier
                  +                No
                  +                Decided to return single token during Fall meeting 2019
                  +            
                  +            
                  +                type
                  +                List< HYPERLINK  \l "DATATYPE_ProductSearch" ProductSearch>
                  +                No
                  +                Identifies the product searcch
                  +            
                  +            
                  +                compressed
                  +                Boolean
                  +                Yes
                  +                If true the returned item will forcibly be compressed
                  +            
                  +            
                  +                frequency
                  +                 HYPERLINK  \l "DATATYPE_Frequency" Frequency
                  +                No
                  +                How oftern will this subscription be executed
                  +            
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The following table lists the errors defined in this specification:
                  +        
                  +            Table 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Table \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Table_TOC \s 1 1
                  +            MDP MO Errors
                  +            "
                  +            :  MDP MO Errors
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                Comment
                  +            
                  +            
                  +                NOT_FOUND
                  +                280020
                  +                Operation specific
                  +            
                  +            
                  +                TBD2
                  +                280021
                  +                Operation specific
                  +            
                  +        
                  +    
                  +
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area051-v001-MDP/word/numbering.xml b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area051-v001-MDP/word/numbering.xml
                  new file mode 100644
                  index 00000000..c95e6ead
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area051-v001-MDP/word/numbering.xml
                  @@ -0,0 +1,25 @@
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area051-v001-MDP/word/styles.xml b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area051-v001-MDP/word/styles.xml
                  new file mode 100644
                  index 00000000..ee967ee1
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area051-v001-MDP/word/styles.xml
                  @@ -0,0 +1 @@
                  +
                  \ No newline at end of file
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area001-v001-MAL/[Content_Types].xml b/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area001-v001-MAL/[Content_Types].xml
                  new file mode 100644
                  index 00000000..fbe325d6
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area001-v001-MAL/[Content_Types].xml
                  @@ -0,0 +1 @@
                  +
                  \ No newline at end of file
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area001-v001-MAL/_rels/.rels b/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area001-v001-MAL/_rels/.rels
                  new file mode 100644
                  index 00000000..d6637f3e
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area001-v001-MAL/_rels/.rels
                  @@ -0,0 +1 @@
                  +
                  \ No newline at end of file
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area001-v001-MAL/word/_rels/document.xml.rels b/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area001-v001-MAL/word/_rels/document.xml.rels
                  new file mode 100644
                  index 00000000..7af141e1
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area001-v001-MAL/word/_rels/document.xml.rels
                  @@ -0,0 +1 @@
                  +
                  \ No newline at end of file
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area001-v001-MAL/word/document.xml b/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area001-v001-MAL/word/document.xml
                  new file mode 100644
                  index 00000000..da0d04d6
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area001-v001-MAL/word/document.xml
                  @@ -0,0 +1,1514 @@
                  +
                  +
                  +    
                  +        
                  +            Specification: MAL
                  +        
                  +        
                  +            General
                  +        
                  +        This section contains the specifications for the MAL services.
                  +        This area contains the following services:
                  +        
                  +            Data types
                  +        
                  +        
                  +            Area data types: MAL
                  +        
                  +        
                  +            
                  +            Fundamental: Attribute
                  +        
                  +        Attribute is the base type of all attributes of the MAL data model. Attributes are contained within Composites and are used to build complex structures that make the data model.
                  +        
                  +            
                  +            Fundamental: Composite
                  +        
                  +        Composite is the base structure for composite structures that contain a set of elements.
                  +        
                  +            
                  +            Fundamental: Element
                  +        
                  +        Element is the base type of all data constructs. All types that make up the MAL data model are derived from it.
                  +        
                  +            
                  +            Attribute: Blob
                  +        
                  +        The Blob structure is used to store binary object attributes. It is a variable-length, unbounded, octet array. The distinction between this type and a list of Octet attributes is that this type may allow language mappings and encodings to use more efficient or appropriate representations.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                Blob
                  +            
                  +            
                  +                Extends
                  +                Attribute
                  +            
                  +            
                  +                Short Form Part
                  +                1
                  +            
                  +        
                  +        
                  +            
                  +            Attribute: Boolean
                  +        
                  +        The Boolean structure is used to store Boolean attributes. Possible values are 'True' or 'False'.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                Boolean
                  +            
                  +            
                  +                Extends
                  +                Attribute
                  +            
                  +            
                  +                Short Form Part
                  +                2
                  +            
                  +        
                  +        
                  +            
                  +            Attribute: Duration
                  +        
                  +        The Duration structure is used to store Duration attributes. It represents a length of time in seconds. It may contain a fractional component.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                Duration
                  +            
                  +            
                  +                Extends
                  +                Attribute
                  +            
                  +            
                  +                Short Form Part
                  +                3
                  +            
                  +        
                  +        
                  +            
                  +            Attribute: Float
                  +        
                  +        The Float structure is used to store floating point attributes using the IEEE 754 32-bit range.
                  +        Three special values exist for this type: POSITIVE_INFINITY, NEGATIVE_INFINITY, and NaN (Not A Number).
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                Float
                  +            
                  +            
                  +                Extends
                  +                Attribute
                  +            
                  +            
                  +                Short Form Part
                  +                4
                  +            
                  +        
                  +        
                  +            
                  +            Attribute: Double
                  +        
                  +        The Double structure is used to store floating point attributes using the IEEE 754 64-bit range.
                  +        Three special values exist for this type: POSITIVE_INFINITY, NEGATIVE_INFINITY, and NaN (Not A Number).
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                Double
                  +            
                  +            
                  +                Extends
                  +                Attribute
                  +            
                  +            
                  +                Short Form Part
                  +                5
                  +            
                  +        
                  +        
                  +            
                  +            Attribute: Identifier
                  +        
                  +        The Identifier structure is used to store an identifier and can be used for indexing. It is a variable-length, unbounded, Unicode string.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                Identifier
                  +            
                  +            
                  +                Extends
                  +                Attribute
                  +            
                  +            
                  +                Short Form Part
                  +                6
                  +            
                  +        
                  +        
                  +            
                  +            Attribute: Octet
                  +        
                  +        The Octet structure is used to store 8-bit signed attributes. The permitted range is -128 to 127.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                Octet
                  +            
                  +            
                  +                Extends
                  +                Attribute
                  +            
                  +            
                  +                Short Form Part
                  +                7
                  +            
                  +        
                  +        
                  +            
                  +            Attribute: UOctet
                  +        
                  +        The UOctet structure is used to store 8-bit unsigned attributes. The permitted range is 0 to 255.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                UOctet
                  +            
                  +            
                  +                Extends
                  +                Attribute
                  +            
                  +            
                  +                Short Form Part
                  +                8
                  +            
                  +        
                  +        
                  +            
                  +            Attribute: Short
                  +        
                  +        The Short structure is used to store 16-bit signed attributes. The permitted range is -32768 to 32767.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                Short
                  +            
                  +            
                  +                Extends
                  +                Attribute
                  +            
                  +            
                  +                Short Form Part
                  +                9
                  +            
                  +        
                  +        
                  +            
                  +            Attribute: UShort
                  +        
                  +        The UShort structure is used to store 16-bit unsigned attributes. The permitted range is 0 to 65535.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                UShort
                  +            
                  +            
                  +                Extends
                  +                Attribute
                  +            
                  +            
                  +                Short Form Part
                  +                10
                  +            
                  +        
                  +        
                  +            
                  +            Attribute: Integer
                  +        
                  +        The Integer structure is used to store 32-bit signed attributes. The permitted range is -2147483648 to 2147483647.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                Integer
                  +            
                  +            
                  +                Extends
                  +                Attribute
                  +            
                  +            
                  +                Short Form Part
                  +                11
                  +            
                  +        
                  +        
                  +            
                  +            Attribute: UInteger
                  +        
                  +        The UInteger structure is used to store 32-bit unsigned attributes. The permitted range is 0 to 4294967295.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                UInteger
                  +            
                  +            
                  +                Extends
                  +                Attribute
                  +            
                  +            
                  +                Short Form Part
                  +                12
                  +            
                  +        
                  +        
                  +            
                  +            Attribute: Long
                  +        
                  +        The Long structure is used to store 64-bit signed attributes. The permitted range is -9223372036854775808 to 9223372036854775807.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                Long
                  +            
                  +            
                  +                Extends
                  +                Attribute
                  +            
                  +            
                  +                Short Form Part
                  +                13
                  +            
                  +        
                  +        
                  +            
                  +            Attribute: ULong
                  +        
                  +        The ULong structure is used to store 64-bit unsigned attributes. The permitted range is 0 to 18446744073709551615.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ULong
                  +            
                  +            
                  +                Extends
                  +                Attribute
                  +            
                  +            
                  +                Short Form Part
                  +                14
                  +            
                  +        
                  +        
                  +            
                  +            Attribute: String
                  +        
                  +        The String structure is used to store String attributes. It is a variable-length, unbounded, Unicode string.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                String
                  +            
                  +            
                  +                Extends
                  +                Attribute
                  +            
                  +            
                  +                Short Form Part
                  +                15
                  +            
                  +        
                  +        
                  +            
                  +            Attribute: Time
                  +        
                  +        The Time structure is used to store absolute time attributes. It represents an absolute date and time to millisecond resolution.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                Time
                  +            
                  +            
                  +                Extends
                  +                Attribute
                  +            
                  +            
                  +                Short Form Part
                  +                16
                  +            
                  +        
                  +        
                  +            
                  +            Attribute: FineTime
                  +        
                  +        The FineTime structure is used to store high-resolution absolute time attributes. It represents an absolute date and time to picosecond resolution.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                FineTime
                  +            
                  +            
                  +                Extends
                  +                Attribute
                  +            
                  +            
                  +                Short Form Part
                  +                17
                  +            
                  +        
                  +        
                  +            
                  +            Attribute: URI
                  +        
                  +        The URI structure is used to store URI addresses. It is a variable-length, unbounded, Unicode string.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                URI
                  +            
                  +            
                  +                Extends
                  +                Attribute
                  +            
                  +            
                  +                Short Form Part
                  +                18
                  +            
                  +        
                  +        
                  +            
                  +            Enumeration: InteractionType
                  +        
                  +        InteractionType is an enumeration holding the possible interaction pattern types.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                InteractionType
                  +            
                  +            
                  +                Short Form Part
                  +                19
                  +            
                  +            
                  +                Enumeration Value
                  +                Numerical Value
                  +                Comment
                  +            
                  +            
                  +                SEND
                  +                1
                  +                Used for Send interactions.
                  +            
                  +            
                  +                SUBMIT
                  +                2
                  +                Used for Submit interactions.
                  +            
                  +            
                  +                REQUEST
                  +                3
                  +                Used for Request interactions.
                  +            
                  +            
                  +                INVOKE
                  +                4
                  +                Used for Invoke interactions.
                  +            
                  +            
                  +                PROGRESS
                  +                5
                  +                Used for Progress interactions.
                  +            
                  +            
                  +                PUBSUB
                  +                6
                  +                Used for Publish/Subscribe interactions.
                  +            
                  +        
                  +        
                  +            
                  +            Enumeration: SessionType
                  +        
                  +        SessionType is an enumeration holding the session types.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                SessionType
                  +            
                  +            
                  +                Short Form Part
                  +                20
                  +            
                  +            
                  +                Enumeration Value
                  +                Numerical Value
                  +                Comment
                  +            
                  +            
                  +                LIVE
                  +                1
                  +                Used for Live sessions.
                  +            
                  +            
                  +                SIMULATION
                  +                2
                  +                Used for Simulation sessions.
                  +            
                  +            
                  +                REPLAY
                  +                3
                  +                Used for Replay sessions.
                  +            
                  +        
                  +        
                  +            
                  +            Enumeration: QoSLevel
                  +        
                  +        QoSLevel is an enumeration holding the possible QoS levels.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                QoSLevel
                  +            
                  +            
                  +                Short Form Part
                  +                21
                  +            
                  +            
                  +                Enumeration Value
                  +                Numerical Value
                  +                Comment
                  +            
                  +            
                  +                BESTEFFORT
                  +                1
                  +                Used for Best Effort QoS Level.
                  +            
                  +            
                  +                ASSURED
                  +                2
                  +                Used for Assured QoS Level.
                  +            
                  +            
                  +                QUEUED
                  +                3
                  +                Used for Queued QoS Level.
                  +            
                  +            
                  +                TIMELY
                  +                4
                  +                Used for Timely QoS Level.
                  +            
                  +        
                  +        
                  +            
                  +            Enumeration: UpdateType
                  +        
                  +        UpdateType is an enumeration holding the possible Update types.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                UpdateType
                  +            
                  +            
                  +                Short Form Part
                  +                22
                  +            
                  +            
                  +                Enumeration Value
                  +                Numerical Value
                  +                Comment
                  +            
                  +            
                  +                CREATION
                  +                1
                  +                Update is notification of the creation of the item.
                  +            
                  +            
                  +                UPDATE
                  +                2
                  +                Update is just a periodic update of the item and has not changed its value.
                  +            
                  +            
                  +                MODIFICATION
                  +                3
                  +                Update is for a changed value or modification of the item.
                  +            
                  +            
                  +                DELETION
                  +                4
                  +                Update is notification of the removal of the item.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: Subscription
                  +        
                  +        The Subscription structure is used when subscribing for updates using the PUBSUB interaction pattern. It contains a single identifier that identifies the subscription being defined and a set of entities being requested.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                Subscription
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_Composite" Composite
                  +            
                  +            
                  +                Short Form Part
                  +                23
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                subscriptionId
                  +                 HYPERLINK  \l "DATATYPE_Identifier" Identifier
                  +                No
                  +                The identifier of this subscription.
                  +            
                  +            
                  +                entities
                  +                List< HYPERLINK  \l "DATATYPE_EntityRequest" EntityRequest>
                  +                No
                  +                The list of entities that are being subscribed for by this identified subscription.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: EntityRequest
                  +        
                  +        The EntityRequest structure is used when subscribing for updates using the PUBSUB interaction pattern.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                EntityRequest
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_Composite" Composite
                  +            
                  +            
                  +                Short Form Part
                  +                24
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                subDomain
                  +                List< HYPERLINK  \l "DATATYPE_Identifier" Identifier>
                  +                Yes
                  +                Optional subdomain identifier that is appended to the Message Header domain identifier when requesting entities in a subdomain of this domain.
                  +            
                  +            
                  +                allAreas
                  +                 HYPERLINK  \l "DATATYPE_Boolean" Boolean
                  +                No
                  +                If set to True, then all updates regardless of Area shall be sent.
                  +            
                  +            
                  +                allServices
                  +                 HYPERLINK  \l "DATATYPE_Boolean" Boolean
                  +                No
                  +                If set to True, then all updates regardless of Service shall be sent.
                  +            
                  +            
                  +                allOperations
                  +                 HYPERLINK  \l "DATATYPE_Boolean" Boolean
                  +                No
                  +                If set to True, then all updates regardless of Operation shall be sent.
                  +            
                  +            
                  +                onlyOnChange
                  +                 HYPERLINK  \l "DATATYPE_Boolean" Boolean
                  +                No
                  +                The Boolean denotes that only change updates are to be sent rather than all updates.
                  +            
                  +            
                  +                entityKeys
                  +                List< HYPERLINK  \l "DATATYPE_EntityKey" EntityKey>
                  +                No
                  +                The list of entities to be monitored.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: EntityKey
                  +        
                  +        The EntityKey structure is used to identify an entity in the PUBSUB interaction pattern.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                EntityKey
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_Composite" Composite
                  +            
                  +            
                  +                Short Form Part
                  +                25
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                firstSubKey
                  +                 HYPERLINK  \l "DATATYPE_Identifier" Identifier
                  +                Yes
                  +                The first sub-key of the key.
                  +            
                  +            
                  +                secondSubKey
                  +                 HYPERLINK  \l "DATATYPE_Long" Long
                  +                Yes
                  +                The second sub-key of the key.
                  +            
                  +            
                  +                thirdSubKey
                  +                 HYPERLINK  \l "DATATYPE_Long" Long
                  +                Yes
                  +                The third sub-key of the key.
                  +            
                  +            
                  +                fourthSubKey
                  +                 HYPERLINK  \l "DATATYPE_Long" Long
                  +                Yes
                  +                The fourth sub-key of the key.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: UpdateHeader
                  +        
                  +        The UpdateHeader structure is used by updates using the PUBSUB interaction pattern. It holds information that identifies a single update.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                UpdateHeader
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_Composite" Composite
                  +            
                  +            
                  +                Short Form Part
                  +                26
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                timestamp
                  +                 HYPERLINK  \l "DATATYPE_Time" Time
                  +                No
                  +                Creation timestamp of the update.
                  +            
                  +            
                  +                sourceURI
                  +                 HYPERLINK  \l "DATATYPE_URI" URI
                  +                No
                  +                URI of the source of the update, usually a PUBSUB provider.
                  +            
                  +            
                  +                updateType
                  +                 HYPERLINK  \l "DATATYPE_UpdateType" UpdateType
                  +                No
                  +                Type of update being reported.
                  +            
                  +            
                  +                key
                  +                 HYPERLINK  \l "DATATYPE_EntityKey" EntityKey
                  +                No
                  +                The key of the entity; shall not contain the wildcard value.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: IdBooleanPair
                  +        
                  +        IdBooleanPair is a simple pair type of an identifier and Boolean value.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                IdBooleanPair
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_Composite" Composite
                  +            
                  +            
                  +                Short Form Part
                  +                27
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                id
                  +                 HYPERLINK  \l "DATATYPE_Identifier" Identifier
                  +                Yes
                  +                The Identifier value.
                  +            
                  +            
                  +                value
                  +                 HYPERLINK  \l "DATATYPE_Boolean" Boolean
                  +                Yes
                  +                The Boolean value.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: Pair
                  +        
                  +        Pair is a simple composite structure for holding pairs. The pairs can be user-defined attributes.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                Pair
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_Composite" Composite
                  +            
                  +            
                  +                Short Form Part
                  +                28
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                first
                  +                 HYPERLINK  \l "DATATYPE_Attribute" Attribute
                  +                Yes
                  +                The attribute value for the first element of this pair.
                  +            
                  +            
                  +                second
                  +                 HYPERLINK  \l "DATATYPE_Attribute" Attribute
                  +                Yes
                  +                The attribute value for the second element of this pair.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: NamedValue
                  +        
                  +        The NamedValue structure represents a simple pair type of an identifier and abstract attribute value.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                NamedValue
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_Composite" Composite
                  +            
                  +            
                  +                Short Form Part
                  +                29
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                name
                  +                 HYPERLINK  \l "DATATYPE_Identifier" Identifier
                  +                Yes
                  +                The Identifier value.
                  +            
                  +            
                  +                value
                  +                 HYPERLINK  \l "DATATYPE_Attribute" Attribute
                  +                Yes
                  +                The Attribute value.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: File
                  +        
                  +        The File structure represents a File and holds details about a File. It can also, optionally, hold a BLOB of the file data. The file type is denoted using the internet MIME media types, the list of official MIME types is held at http://www.iana.org/assignments/media-types/index.html.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                File
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_Composite" Composite
                  +            
                  +            
                  +                Short Form Part
                  +                30
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                name
                  +                 HYPERLINK  \l "DATATYPE_Identifier" Identifier
                  +                No
                  +                The file name.
                  +            
                  +            
                  +                mimeType
                  +                 HYPERLINK  \l "DATATYPE_String" String
                  +                Yes
                  +                The MIME type of the file, NULL if not known.
                  +            
                  +            
                  +                creationDate
                  +                 HYPERLINK  \l "DATATYPE_Time" Time
                  +                Yes
                  +                The creation timestamp of the file, NULL if not known.
                  +            
                  +            
                  +                modificationDate
                  +                 HYPERLINK  \l "DATATYPE_Time" Time
                  +                Yes
                  +                The last modification timestamp of the file, NULL if not known.
                  +            
                  +            
                  +                size
                  +                 HYPERLINK  \l "DATATYPE_ULong" ULong
                  +                Yes
                  +                The size of the file in Octets, NULL if not known.
                  +            
                  +            
                  +                content
                  +                 HYPERLINK  \l "DATATYPE_Blob" Blob
                  +                Yes
                  +                The contents of the file, NULL if not supplied.
                  +            
                  +            
                  +                metaData
                  +                List< HYPERLINK  \l "DATATYPE_NamedValue" NamedValue>
                  +                Yes
                  +                A list of extra metadata for the file.
                  +            
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The following table lists the errors defined in this specification:
                  +        
                  +            Table 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Table \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Table_TOC \s 1 1
                  +            MAL MO Errors
                  +            "
                  +            :  MAL MO Errors
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                Comment
                  +            
                  +            
                  +                DELIVERY_FAILED
                  +                65536
                  +                Confirmed communication error.
                  +            
                  +            
                  +                DELIVERY_TIMEDOUT
                  +                65537
                  +                Unconfirmed communication error.
                  +            
                  +            
                  +                DELIVERY_DELAYED
                  +                65538
                  +                Message queued somewhere awaiting contact.
                  +            
                  +            
                  +                DESTINATION_UNKNOWN
                  +                65539
                  +                Destination cannot be contacted.
                  +            
                  +            
                  +                DESTINATION_TRANSIENT
                  +                65540
                  +                Destination middleware reports destination application does not exist.
                  +            
                  +            
                  +                DESTINATION_LOST
                  +                65541
                  +                Destination lost halfway through conversation.
                  +            
                  +            
                  +                AUTHENTICATION_FAIL
                  +                65542
                  +                A failure to authenticate the message correctly.
                  +            
                  +            
                  +                AUTHORISATION_FAIL
                  +                65543
                  +                A failure in the MAL to authorise the message.
                  +            
                  +            
                  +                ENCRYPTION_FAIL
                  +                65544
                  +                A failure in the MAL to encrypt/decrypt the message.
                  +            
                  +            
                  +                UNSUPPORTED_AREA
                  +                65545
                  +                The destination does not support the service area.
                  +            
                  +            
                  +                UNSUPPORTED_OPERATION
                  +                65546
                  +                The destination does not support the operation.
                  +            
                  +            
                  +                UNSUPPORTED_VERSION
                  +                65547
                  +                The destination does not support the service version.
                  +            
                  +            
                  +                BAD_ENCODING
                  +                65548
                  +                The destination was unable to decode the message.
                  +            
                  +            
                  +                INTERNAL
                  +                65549
                  +                An internal error has occurred.
                  +            
                  +            
                  +                UNKNOWN
                  +                65550
                  +                Operation specific.
                  +            
                  +            
                  +                INCORRECT_STATE
                  +                65551
                  +                The destination was not in the correct state for the received message.
                  +            
                  +            
                  +                TOO_MANY
                  +                65552
                  +                Maximum number of subscriptions or providers of a broker has been exceeded.
                  +            
                  +            
                  +                SHUTDOWN
                  +                65553
                  +                The component is being shutdown.
                  +            
                  +        
                  +    
                  +
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area001-v001-MAL/word/numbering.xml b/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area001-v001-MAL/word/numbering.xml
                  new file mode 100644
                  index 00000000..1d905cd4
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area001-v001-MAL/word/numbering.xml
                  @@ -0,0 +1,3 @@
                  +
                  +        
                  +
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area001-v001-MAL/word/styles.xml b/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area001-v001-MAL/word/styles.xml
                  new file mode 100644
                  index 00000000..ee967ee1
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area001-v001-MAL/word/styles.xml
                  @@ -0,0 +1 @@
                  +
                  \ No newline at end of file
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area001-v003-MAL/[Content_Types].xml b/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area001-v003-MAL/[Content_Types].xml
                  new file mode 100644
                  index 00000000..fbe325d6
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area001-v003-MAL/[Content_Types].xml
                  @@ -0,0 +1 @@
                  +
                  \ No newline at end of file
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area001-v003-MAL/_rels/.rels b/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area001-v003-MAL/_rels/.rels
                  new file mode 100644
                  index 00000000..d6637f3e
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area001-v003-MAL/_rels/.rels
                  @@ -0,0 +1 @@
                  +
                  \ No newline at end of file
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area001-v003-MAL/word/_rels/document.xml.rels b/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area001-v003-MAL/word/_rels/document.xml.rels
                  new file mode 100644
                  index 00000000..7af141e1
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area001-v003-MAL/word/_rels/document.xml.rels
                  @@ -0,0 +1 @@
                  +
                  \ No newline at end of file
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area001-v003-MAL/word/document.xml b/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area001-v003-MAL/word/document.xml
                  new file mode 100644
                  index 00000000..28a1bfcc
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area001-v003-MAL/word/document.xml
                  @@ -0,0 +1,1791 @@
                  +
                  +
                  +    
                  +        
                  +            Specification: MAL
                  +        
                  +        
                  +            General
                  +        
                  +        This section contains the specifications for the MAL services.
                  +        This area contains the following services:
                  +        
                  +            Data types
                  +        
                  +        
                  +            Area data types: MAL
                  +        
                  +        
                  +            
                  +            Fundamental: Attribute
                  +        
                  +        Attribute is the base type of all Attributes of the MAL data model. Attributes are contained within Composites and are used to build complex structures that make the data model.
                  +        
                  +            
                  +            Fundamental: Composite
                  +        
                  +        Composite is the base structure for Composite structures that contain a set of Elements.
                  +        
                  +            
                  +            Fundamental: Object
                  +        
                  +        Object is the base structure for MO Objects in the MAL data model. Objects are representations of complex data types with two specific characteristics: Objects have a unique and an immutable identity and can be referenced unambiguously.
                  +        
                  +            
                  +            Fundamental: Element
                  +        
                  +        Element is the base type of all data constructs. All types that make up the MAL data model are derived from it.
                  +        
                  +            
                  +            Attribute: Blob
                  +        
                  +        The Blob structure shall be used to hold binary data. It shall be a variable-length Octet array and the maximum length shall depend on the selected encoding.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                Blob
                  +            
                  +            
                  +                Extends
                  +                Attribute
                  +            
                  +            
                  +                Short Form Part
                  +                1
                  +            
                  +        
                  +        
                  +            
                  +            Attribute: Boolean
                  +        
                  +        The Boolean structure shall be used to hold Boolean Attributes. Possible values are ‘True’ or ‘False’.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                Boolean
                  +            
                  +            
                  +                Extends
                  +                Attribute
                  +            
                  +            
                  +                Short Form Part
                  +                2
                  +            
                  +        
                  +        
                  +            
                  +            Attribute: Duration
                  +        
                  +        The Duration structure shall be used to hold duration Attributes at nanoseconds resolution. It can be negative because it may be used to represent offsets. The duration shall support a range between -2^63 nanoseconds, and (2^63)-1 nanoseconds (to allow representation as a 64-bit signed integer).
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                Duration
                  +            
                  +            
                  +                Extends
                  +                Attribute
                  +            
                  +            
                  +                Short Form Part
                  +                3
                  +            
                  +        
                  +        
                  +            
                  +            Attribute: Float
                  +        
                  +        The Float structure shall be used to hold floating point Attributes using the IEEE 754 32-bit range.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                Float
                  +            
                  +            
                  +                Extends
                  +                Attribute
                  +            
                  +            
                  +                Short Form Part
                  +                4
                  +            
                  +        
                  +        
                  +            
                  +            Attribute: Double
                  +        
                  +        The Double structure shall be used to hold floating point Attributes using the IEEE 754 64-bit range.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                Double
                  +            
                  +            
                  +                Extends
                  +                Attribute
                  +            
                  +            
                  +                Short Form Part
                  +                5
                  +            
                  +        
                  +        
                  +            
                  +            Attribute: Identifier
                  +        
                  +        The Identifier structure shall be used to hold an identifier and can be used for indexing. It is a variable-length Unicode string and the maximum length shall depend on the selected encoding. For some encoding/decoding bindings, the use of a numeric value might be appropriate for this Attribute, for example, via a dictionary.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                Identifier
                  +            
                  +            
                  +                Extends
                  +                Attribute
                  +            
                  +            
                  +                Short Form Part
                  +                6
                  +            
                  +        
                  +        
                  +            
                  +            Attribute: Octet
                  +        
                  +        The Octet structure shall be used to hold 8-bit signed Attributes. The permitted range is −128 to 127.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                Octet
                  +            
                  +            
                  +                Extends
                  +                Attribute
                  +            
                  +            
                  +                Short Form Part
                  +                7
                  +            
                  +        
                  +        
                  +            
                  +            Attribute: UOctet
                  +        
                  +        The UOctet structure shall be used to hold 8-bit unsigned Attributes. The permitted range is 0 to 255.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                UOctet
                  +            
                  +            
                  +                Extends
                  +                Attribute
                  +            
                  +            
                  +                Short Form Part
                  +                8
                  +            
                  +        
                  +        
                  +            
                  +            Attribute: Short
                  +        
                  +        The Short structure shall be used to hold 16-bit signed Attributes. The permitted range is −32768 to 32767.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                Short
                  +            
                  +            
                  +                Extends
                  +                Attribute
                  +            
                  +            
                  +                Short Form Part
                  +                9
                  +            
                  +        
                  +        
                  +            
                  +            Attribute: UShort
                  +        
                  +        The UShort structure shall be used to hold 16-bit unsigned Attributes. The permitted range is 0 to 65535.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                UShort
                  +            
                  +            
                  +                Extends
                  +                Attribute
                  +            
                  +            
                  +                Short Form Part
                  +                10
                  +            
                  +        
                  +        
                  +            
                  +            Attribute: Integer
                  +        
                  +        The Integer structure shall be used to hold 32-bit signed Attributes. The permitted range is −2147483648 to 2147483647.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                Integer
                  +            
                  +            
                  +                Extends
                  +                Attribute
                  +            
                  +            
                  +                Short Form Part
                  +                11
                  +            
                  +        
                  +        
                  +            
                  +            Attribute: UInteger
                  +        
                  +        The UInteger structure shall be used to hold 32-bit unsigned Attributes. The permitted range is 0 to 4294967295.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                UInteger
                  +            
                  +            
                  +                Extends
                  +                Attribute
                  +            
                  +            
                  +                Short Form Part
                  +                12
                  +            
                  +        
                  +        
                  +            
                  +            Attribute: Long
                  +        
                  +        The Long structure shall be used to hold 64-bit signed Attributes. The permitted range is −9223372036854775808 to 9223372036854775807.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                Long
                  +            
                  +            
                  +                Extends
                  +                Attribute
                  +            
                  +            
                  +                Short Form Part
                  +                13
                  +            
                  +        
                  +        
                  +            
                  +            Attribute: ULong
                  +        
                  +        The ULong structure shall be used to hold 64-bit unsigned Attributes. The permitted range is 0 to 18446744073709551615.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ULong
                  +            
                  +            
                  +                Extends
                  +                Attribute
                  +            
                  +            
                  +                Short Form Part
                  +                14
                  +            
                  +        
                  +        
                  +            
                  +            Attribute: String
                  +        
                  +        The String structure shall be used to hold string Attributes. It is a variable-length Unicode string and the maximum length shall depend on the selected encoding.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                String
                  +            
                  +            
                  +                Extends
                  +                Attribute
                  +            
                  +            
                  +                Short Form Part
                  +                15
                  +            
                  +        
                  +        
                  +            
                  +            Attribute: Time
                  +        
                  +        The Time structure shall be used to hold absolute time Attributes. It shall represent an absolute date and time to millisecond resolution. The range shall depend on the selected encoding.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                Time
                  +            
                  +            
                  +                Extends
                  +                Attribute
                  +            
                  +            
                  +                Short Form Part
                  +                16
                  +            
                  +        
                  +        
                  +            
                  +            Attribute: FineTime
                  +        
                  +        The FineTime structure shall be used to hold high-resolution absolute time Attributes. It shall represent an absolute date and time to nanosecond resolution. The range shall depend on the selected encoding.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                FineTime
                  +            
                  +            
                  +                Extends
                  +                Attribute
                  +            
                  +            
                  +                Short Form Part
                  +                17
                  +            
                  +        
                  +        
                  +            
                  +            Attribute: URI
                  +        
                  +        The URI structure shall be used to hold URI addresses. It shall be a variable-length Unicode string and the maximum length shall depend on the selected encoding.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                URI
                  +            
                  +            
                  +                Extends
                  +                Attribute
                  +            
                  +            
                  +                Short Form Part
                  +                18
                  +            
                  +        
                  +        
                  +            
                  +            Attribute: ObjectRef
                  +        
                  +        The ObjectRef structure shall be used to hold references to MO Objects.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ObjectRef
                  +            
                  +            
                  +                Extends
                  +                Attribute
                  +            
                  +            
                  +                Short Form Part
                  +                19
                  +            
                  +        
                  +        
                  +            
                  +            Enumeration: InteractionType
                  +        
                  +        InteractionType is an enumeration that shall be used to hold the possible Interaction Pattern types.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                InteractionType
                  +            
                  +            
                  +                Short Form Part
                  +                101
                  +            
                  +            
                  +                Enumeration Value
                  +                Numerical Value
                  +                Comment
                  +            
                  +            
                  +                SEND
                  +                1
                  +                Used for SEND interactions.
                  +            
                  +            
                  +                SUBMIT
                  +                2
                  +                Used for SUBMIT interactions.
                  +            
                  +            
                  +                REQUEST
                  +                3
                  +                Used for REQUEST interactions.
                  +            
                  +            
                  +                INVOKE
                  +                4
                  +                Used for INVOKE interactions.
                  +            
                  +            
                  +                PROGRESS
                  +                5
                  +                Used for PROGRESS interactions.
                  +            
                  +            
                  +                PUBSUB
                  +                6
                  +                Used for Publish-Subscribe interactions.
                  +            
                  +        
                  +        
                  +            
                  +            Enumeration: SessionType
                  +        
                  +        SessionType is an enumeration that shall be used to hold the session types. This facilitates the use of different Sessions in out-of-band agreements.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                SessionType
                  +            
                  +            
                  +                Short Form Part
                  +                102
                  +            
                  +            
                  +                Enumeration Value
                  +                Numerical Value
                  +                Comment
                  +            
                  +            
                  +                LIVE
                  +                1
                  +                Used for Live sessions.
                  +            
                  +            
                  +                SIMULATION
                  +                2
                  +                Used for Simulation sessions.
                  +            
                  +            
                  +                REPLAY
                  +                3
                  +                Used for Replay sessions.
                  +            
                  +        
                  +        
                  +            
                  +            Enumeration: QoSLevel
                  +        
                  +        QoSLevel is an enumeration that shall be used to hold the possible QoS levels. This facilitates the use of different QoS in out-of-band agreements.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                QoSLevel
                  +            
                  +            
                  +                Short Form Part
                  +                103
                  +            
                  +            
                  +                Enumeration Value
                  +                Numerical Value
                  +                Comment
                  +            
                  +            
                  +                BESTEFFORT
                  +                1
                  +                Used for Best Effort QoS Level.
                  +            
                  +            
                  +                ASSURED
                  +                2
                  +                Used for Assured QoS Level.
                  +            
                  +            
                  +                QUEUED
                  +                3
                  +                Used for Queued QoS Level.
                  +            
                  +            
                  +                TIMELY
                  +                4
                  +                Used for Timely QoS Level.
                  +            
                  +        
                  +        
                  +            
                  +            Enumeration: AttributeType
                  +        
                  +        AttributeType is an enumeration that shall be used to hold the defined MAL Attribute types.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                AttributeType
                  +            
                  +            
                  +                Short Form Part
                  +                104
                  +            
                  +            
                  +                Enumeration Value
                  +                Numerical Value
                  +                Comment
                  +            
                  +            
                  +                BLOB
                  +                1
                  +                Blob type.
                  +            
                  +            
                  +                BOOLEAN
                  +                2
                  +                Boolean type.
                  +            
                  +            
                  +                DURATION
                  +                3
                  +                Duration type.
                  +            
                  +            
                  +                FLOAT
                  +                4
                  +                Float type.
                  +            
                  +            
                  +                DOUBLE
                  +                5
                  +                Double type.
                  +            
                  +            
                  +                IDENTIFIER
                  +                6
                  +                Identifier type.
                  +            
                  +            
                  +                OCTET
                  +                7
                  +                Octet type.
                  +            
                  +            
                  +                UOCTET
                  +                8
                  +                UOctet type.
                  +            
                  +            
                  +                SHORT
                  +                9
                  +                Short type.
                  +            
                  +            
                  +                USHORT
                  +                10
                  +                UShort type.
                  +            
                  +            
                  +                INTEGER
                  +                11
                  +                Integer type.
                  +            
                  +            
                  +                UINTEGER
                  +                12
                  +                UInteger type.
                  +            
                  +            
                  +                LONG
                  +                13
                  +                Long type.
                  +            
                  +            
                  +                ULONG
                  +                14
                  +                ULong type.
                  +            
                  +            
                  +                STRING
                  +                15
                  +                String type.
                  +            
                  +            
                  +                TIME
                  +                16
                  +                Time type.
                  +            
                  +            
                  +                FINETIME
                  +                17
                  +                FineTime type.
                  +            
                  +            
                  +                URI
                  +                18
                  +                URI type.
                  +            
                  +            
                  +                OBJECTREF
                  +                19
                  +                ObjectRef type.
                  +            
                  +        
                  +        
                  +            
                  +            Enumeration: MOArea
                  +        
                  +        MOArea is an enumeration that shall be used to hold the known existing area numbers in use.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                MOArea
                  +            
                  +            
                  +                Short Form Part
                  +                105
                  +            
                  +            
                  +                Enumeration Value
                  +                Numerical Value
                  +                Comment
                  +            
                  +            
                  +                MAL
                  +                1
                  +                The MAL area number.
                  +            
                  +            
                  +                COM
                  +                2
                  +                The COM area number. The COM is deprecated; therefore this area number is reserved for backward compatibility.
                  +            
                  +            
                  +                COMMON
                  +                3
                  +                The Common area number.
                  +            
                  +            
                  +                MC
                  +                4
                  +                The Monitor and Control area number.
                  +            
                  +            
                  +                MPS
                  +                5
                  +                The Mission Planning and Scheduling area number.
                  +            
                  +            
                  +                SM
                  +                7
                  +                The Software Management area number.
                  +            
                  +            
                  +                MDPD
                  +                9
                  +                The Mission Data Product Distribution area number.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: Subscription
                  +        
                  +        The Subscription structure shall be used when subscribing for updates using the PUBSUB Interaction Pattern. It shall contain a single identifier that identifies the subscription being defined and a set of entities being requested.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                Subscription
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_Composite" Composite
                  +            
                  +            
                  +                Short Form Part
                  +                1001
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                subscriptionId
                  +                 HYPERLINK  \l "DATATYPE_Identifier" Identifier
                  +                No
                  +                The identifier of this subscription.
                  +            
                  +            
                  +                domain
                  +                List< HYPERLINK  \l "DATATYPE_Identifier" Identifier>
                  +                Yes
                  +                Optional domain identifier. If NULL, the subscription shall match with any domain.
                  +            
                  +            
                  +                selectedKeys
                  +                List< HYPERLINK  \l "DATATYPE_Identifier" Identifier>
                  +                Yes
                  +                The list of names of the selected Subscription Keys to be transmitted to the consumer. The Subscription Keys that are not in this list will be removed. If NULL, then all Subscription Keys will be transmitted.
                  +            
                  +            
                  +                filters
                  +                List< HYPERLINK  \l "DATATYPE_SubscriptionFilter" SubscriptionFilter>
                  +                Yes
                  +                The list of filters for this subscription. The list of filters must be ANDed together. If NULL, the subscription will not filter specific keys.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: SubscriptionFilter
                  +        
                  +        The SubscriptionFilter structure shall be used when subscribing for updates using the PUBSUB Interaction Pattern. It shall contain a single identifier that identifies the Subscription Key name and the set of values to be registered for the defined key name.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                SubscriptionFilter
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_Composite" Composite
                  +            
                  +            
                  +                Short Form Part
                  +                1002
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                name
                  +                 HYPERLINK  \l "DATATYPE_Identifier" Identifier
                  +                No
                  +                The identifier name of the key.
                  +            
                  +            
                  +                values
                  +                List< HYPERLINK  \l "DATATYPE_Attribute" Attribute>
                  +                No
                  +                The list of values that are being subscribed for this key. These shall be ORed together.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: UpdateHeader
                  +        
                  +        The UpdateHeader structure shall be used by updates using the PUBSUB Interaction Pattern. It shall hold information that identifies a single update.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                UpdateHeader
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_Composite" Composite
                  +            
                  +            
                  +                Short Form Part
                  +                1003
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                source
                  +                 HYPERLINK  \l "DATATYPE_Identifier" Identifier
                  +                Yes
                  +                The source of the update, usually a PUBSUB provider.
                  +            
                  +            
                  +                domain
                  +                List< HYPERLINK  \l "DATATYPE_Identifier" Identifier>
                  +                Yes
                  +                The domain of this update. The individual domain identifier parts shall not be set as the wildcard character ‘*’.
                  +            
                  +            
                  +                keyValues
                  +                List< HYPERLINK  \l "DATATYPE_NullableAttribute" NullableAttribute>
                  +                Yes
                  +                The values for the PUBSUB keys. The values shall be ordered according to the defined keys if the consumer subscription did not enable trimming.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: IdBooleanPair
                  +        
                  +        IdBooleanPair shall be a simple pair type of an identifier and Boolean value.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                IdBooleanPair
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_Composite" Composite
                  +            
                  +            
                  +                Short Form Part
                  +                1004
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                id
                  +                 HYPERLINK  \l "DATATYPE_Identifier" Identifier
                  +                No
                  +                The Identifier value.
                  +            
                  +            
                  +                value
                  +                 HYPERLINK  \l "DATATYPE_Boolean" Boolean
                  +                Yes
                  +                The Boolean value.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: Pair
                  +        
                  +        Pair shall be a simple Composite structure for holding pairs.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                Pair
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_Composite" Composite
                  +            
                  +            
                  +                Short Form Part
                  +                1005
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                first
                  +                 HYPERLINK  \l "DATATYPE_Attribute" Attribute
                  +                Yes
                  +                The attribute value for the first Element of this pair.
                  +            
                  +            
                  +                second
                  +                 HYPERLINK  \l "DATATYPE_Attribute" Attribute
                  +                Yes
                  +                The attribute value for the second Element of this pair.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: NamedValue
                  +        
                  +        The NamedValue structure shall represent a simple pair type of an identifier and abstract Attribute value.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                NamedValue
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_Composite" Composite
                  +            
                  +            
                  +                Short Form Part
                  +                1006
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                name
                  +                 HYPERLINK  \l "DATATYPE_Identifier" Identifier
                  +                No
                  +                The Identifier value.
                  +            
                  +            
                  +                value
                  +                 HYPERLINK  \l "DATATYPE_Attribute" Attribute
                  +                Yes
                  +                The Attribute value.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: File
                  +        
                  +        The File structure represents a file and shall be used to hold details about a file. It may also, optionally, hold a BLOB of the file data. The file type shall be denoted using the internet MIME media types.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                File
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_Composite" Composite
                  +            
                  +            
                  +                Short Form Part
                  +                1007
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                name
                  +                 HYPERLINK  \l "DATATYPE_String" String
                  +                No
                  +                The file name.
                  +            
                  +            
                  +                mimeType
                  +                 HYPERLINK  \l "DATATYPE_String" String
                  +                Yes
                  +                The MIME type of the file, NULL if not known.
                  +            
                  +            
                  +                creationDate
                  +                 HYPERLINK  \l "DATATYPE_Time" Time
                  +                Yes
                  +                The creation timestamp of the file, NULL if not known.
                  +            
                  +            
                  +                modificationDate
                  +                 HYPERLINK  \l "DATATYPE_Time" Time
                  +                Yes
                  +                The last modification timestamp of the file, NULL if not known.
                  +            
                  +            
                  +                size
                  +                 HYPERLINK  \l "DATATYPE_ULong" ULong
                  +                Yes
                  +                The size of the file in Octets, NULL if not known.
                  +            
                  +            
                  +                content
                  +                 HYPERLINK  \l "DATATYPE_Blob" Blob
                  +                Yes
                  +                The contents of the file, NULL if not supplied.
                  +            
                  +            
                  +                metaData
                  +                List< HYPERLINK  \l "DATATYPE_NamedValue" NamedValue>
                  +                Yes
                  +                A list of extra metadata for the file.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ObjectIdentity
                  +        
                  +        The ObjectIdentity structure shall represent the Object Identity of an MO Object.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ObjectIdentity
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_Composite" Composite
                  +            
                  +            
                  +                Short Form Part
                  +                1008
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                domain
                  +                List< HYPERLINK  \l "DATATYPE_Identifier" Identifier>
                  +                No
                  +                The domain of the MO Object being referenced.
                  +            
                  +            
                  +                key
                  +                 HYPERLINK  \l "DATATYPE_Identifier" Identifier
                  +                No
                  +                The key of the MO Object being referenced.
                  +            
                  +            
                  +                version
                  +                 HYPERLINK  \l "DATATYPE_UInteger" UInteger
                  +                No
                  +                The version of the MO Object being referenced.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ServiceId
                  +        
                  +        The ServiceId structure shall represent a specific service in MO.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ServiceId
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_Composite" Composite
                  +            
                  +            
                  +                Short Form Part
                  +                1009
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                keyArea
                  +                 HYPERLINK  \l "DATATYPE_UShort" UShort
                  +                No
                  +                The area of this service taken from the numeric Area identifier of the service specification.
                  +            
                  +            
                  +                keyService
                  +                 HYPERLINK  \l "DATATYPE_UShort" UShort
                  +                No
                  +                The service taken from the numeric Service identifier of the service specification.
                  +            
                  +            
                  +                keyAreaVersion
                  +                 HYPERLINK  \l "DATATYPE_UOctet" UOctet
                  +                No
                  +                The Area Version of the service.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: NullableAttribute
                  +        
                  +        NullableAttribute structure shall represent an Attribute that can be nullable.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                NullableAttribute
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_Composite" Composite
                  +            
                  +            
                  +                Short Form Part
                  +                1010
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                value
                  +                 HYPERLINK  \l "DATATYPE_Attribute" Attribute
                  +                Yes
                  +                The value of the nullable attribute.
                  +            
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The following table lists the errors defined in this specification:
                  +        
                  +            Table 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Table \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Table_TOC \s 1 1
                  +            MAL MO Errors
                  +            "
                  +            :  MAL MO Errors
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                Comment
                  +            
                  +            
                  +                Delivery Failed
                  +                65536
                  +                Confirmed communication error.
                  +            
                  +            
                  +                Delivery Timedout
                  +                65537
                  +                Unconfirmed communication error.
                  +            
                  +            
                  +                Delivery Delayed
                  +                65538
                  +                Message queued somewhere awaiting contact.
                  +            
                  +            
                  +                Destination Unknown
                  +                65539
                  +                Destination cannot be contacted.
                  +            
                  +            
                  +                Destination Transient
                  +                65540
                  +                Destination middleware reports destination application does not exist.
                  +            
                  +            
                  +                Destination Lost
                  +                65541
                  +                Destination lost halfway through conversation.
                  +            
                  +            
                  +                Authentication Failed
                  +                65542
                  +                A failure to authenticate the message correctly.
                  +            
                  +            
                  +                Authorisation Fail
                  +                65543
                  +                A failure in the MAL to authorise the message.
                  +            
                  +            
                  +                Encryption Fail
                  +                65544
                  +                A failure in the MAL to encrypt/decrypt the message.
                  +            
                  +            
                  +                Unsupported Area
                  +                65545
                  +                The destination does not support the selected area.
                  +            
                  +            
                  +                Unsupported Area Version
                  +                65546
                  +                The destination does not support the selected area version.
                  +            
                  +            
                  +                Unsupported Service
                  +                65547
                  +                The destination does not support the selected service.
                  +            
                  +            
                  +                Unsupported Operation
                  +                65548
                  +                The destination does not support the selected operation.
                  +            
                  +            
                  +                Bad Encoding
                  +                65549
                  +                The destination was unable to decode the message.
                  +            
                  +            
                  +                Internal
                  +                65550
                  +                An internal error has occurred.
                  +            
                  +            
                  +                Unknown
                  +                65551
                  +                Operation specific.
                  +            
                  +            
                  +                Incorrect State
                  +                65552
                  +                The destination was not in the correct state for the received message.
                  +            
                  +            
                  +                Too Many
                  +                65553
                  +                Maximum number of subscriptions or providers of a broker has been exceeded.
                  +            
                  +            
                  +                Shutdown
                  +                65554
                  +                The component is being shutdown.
                  +            
                  +            
                  +                Transaction Timeout
                  +                65555
                  +                The interaction exceeded a certain timeout duration.
                  +            
                  +        
                  +    
                  +
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area001-v003-MAL/word/numbering.xml b/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area001-v003-MAL/word/numbering.xml
                  new file mode 100644
                  index 00000000..1d905cd4
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area001-v003-MAL/word/numbering.xml
                  @@ -0,0 +1,3 @@
                  +
                  +        
                  +
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area001-v003-MAL/word/styles.xml b/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area001-v003-MAL/word/styles.xml
                  new file mode 100644
                  index 00000000..ee967ee1
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area001-v003-MAL/word/styles.xml
                  @@ -0,0 +1 @@
                  +
                  \ No newline at end of file
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area002-v001-COM/[Content_Types].xml b/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area002-v001-COM/[Content_Types].xml
                  new file mode 100644
                  index 00000000..fbe325d6
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area002-v001-COM/[Content_Types].xml
                  @@ -0,0 +1 @@
                  +
                  \ No newline at end of file
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area002-v001-COM/_rels/.rels b/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area002-v001-COM/_rels/.rels
                  new file mode 100644
                  index 00000000..d6637f3e
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area002-v001-COM/_rels/.rels
                  @@ -0,0 +1 @@
                  +
                  \ No newline at end of file
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area002-v001-COM/word/_rels/document.xml.rels b/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area002-v001-COM/word/_rels/document.xml.rels
                  new file mode 100644
                  index 00000000..7af141e1
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area002-v001-COM/word/_rels/document.xml.rels
                  @@ -0,0 +1 @@
                  +
                  \ No newline at end of file
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area002-v001-COM/word/document.xml b/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area002-v001-COM/word/document.xml
                  new file mode 100644
                  index 00000000..3ab0848a
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area002-v001-COM/word/document.xml
                  @@ -0,0 +1,2252 @@
                  +
                  +
                  +    
                  +        
                  +            Specification: COM
                  +        
                  +        
                  +            General
                  +        
                  +        This section contains the specifications for the COM services.
                  +        This section details the Common Object Model area; the structures used by the service are detailed in section 4. The area and structures are defined in terms of the MO Message Abstraction Layer (MAL), so it is possible to deploy them over any supported protocol and message transport.
                  +        This area contains the following services:
                  +        Event
                  +        Archive
                  +        ActivityTracking
                  +        
                  +            Requirements
                  +        
                  +        The instance identifier of an object must not use the value of '0' for actual object instances as this is the wildcard value.
                  +        The related field of an object must not use the value of '0' as this is the wildcard value.
                  +        The instance identifier of the source field of an object must not use the value of '0' as this is the wildcard value.
                  +        If the MAL data type specification is being used the body of an object shall be a concrete type.
                  +        If the MAL data type specification is being used the body of an object shall not be an abstract Attribute.
                  +        If the MAL data type specification is being used the body of an object shall not be a list.
                  +        
                  +            
                  +            Service: Event
                  +        
                  +        
                  +            Overview
                  +        
                  +        An event is a specific object representing 'something that happens in the system at a given point in time'. The event service provides a generic mechanism for the distribution of events.
                  +        An event is a special type of COM object and is identified by the normal object fields (domain, object type, and object instance identifier). 
                  +        It may also contain:
                  +        a link to a source object (that caused the event to be generated)
                  +        a link to a service specific related object
                  +        a body that is specific to the event type and whose data structure is defined by the service that declares the event.
                  +        The event service only defines a single operation that supports the publishing of events and subscription of events generated by other components.
                  +        Events are published with a MAL update type of DELETION. Events are something that happens at a given point in time, therefore they in themselves have no lifetime, they are created and deleted at the time instant in time. For efficiency purposes only the deletion update is used.
                  +        
                  +            Table 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Table \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Table_TOC \s 1 1
                  +            Event Service Operations
                  +            "
                  +            :  Event Service Operations
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Area Identifier
                  +                Service Identifier
                  +                Area Number
                  +                Service Number
                  +                Area Version
                  +            
                  +            
                  +                COM
                  +                Event
                  +                2
                  +                1
                  +                1
                  +            
                  +            
                  +                Interaction Pattern
                  +                Operation Identifier
                  +                Operation Number
                  +                Capability Set
                  +            
                  +            
                  +                PUB-SUB
                  +                 HYPERLINK  \l "OPERATION_1_monitorEvent" monitorEvent
                  +                1
                  +                1
                  +            
                  +        
                  +        
                  +            Service-level Requirements
                  +        
                  +        
                  +            COM usage
                  +        
                  +        The event service may be used for the publishing and monitoring of COM events.
                  +        The identification of the event shall follow the COM object rules.
                  +        The COM object source link shall point to the object that caused the event to be generated unless stated otherwise by the defining service specification.
                  +        The COM object related link shall be service and event type specific.
                  +        When an event is published using the PUBLISH-SUBSCRIBE monitorEvent operation defined in the event service it shall be published with a MAL update type of DELETED.
                  +        When an event is published, the COM object instance identifier shall be populated by the publisher.
                  +        The object instance identifier should be unique for a domain and object type.
                  +        An event may have an associated body that is published with it.
                  +        The type and contents of the body of an event shall be specified in the defining service specification but must be a concrete type or an Attribute.
                  +        
                  +            COM Archive Service usage
                  +        
                  +        Each type of event is a separate COM object type and therefore may be stored in a COM archive.
                  +        When a service implementation requires that the events it generates be persisted, upon event emission, the event shall be stored as normal.
                  +        The related link is service specific and shall always be null if not explicitly used by a service.
                  +        The source link shall point to the source object of the event.
                  +        
                  +            
                  +            Operation: monitorEvent
                  +        
                  +        
                  +            Overview
                  +        
                  +        The monitorEvent operation allows a consumer to subscribe for events.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                monitorEvent
                  +            
                  +            
                  +                Interaction Pattern
                  +                PUBLISH-SUBSCRIBE
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                OUT
                  +                PUBLISH
                  +                YesYes
                  +                 HYPERLINK  \l "DATATYPE_ObjectDetails" ObjectDetails eventLinksElement eventBody
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        eventLinks - The MAL::EntityKey.firstSubKey shall contain the event object number as a base 10 string. For example, for an object number of '14' the key value would be '14' with no padding.
                  +The MAL::EntityKey.secondSubKey shall contain the area, service, and version ObjectType fields as a MAL::Long populated as (in hex) 0xAAAASSSSVVXXXXXX where AAAA is the area (16 bits), SSSS is the service (16 bits), VV is the version (8 bits), and XXXXXX is unused and set to zero (24 bits). For example, for an area of '1', and a service of '2', and a version of '3' the field would contain (in hex) 0x0001000203000000.
                  +The MAL::EntityKey.thirdSubKey shall contain the event object instance identifier.
                  +The MAL::EntityKey.fourthSubKey shall contain the area, service, version and number fields of the event source ObjectType using same methodology as given for the second sub key but replacing the XXXXXX part with the number field.
                  +The related and source links of the event shall populate the ObjectDetails part of the publish/notify message.
                  +The body of the event shall populate the final part of the publish/notify message.
                  +The timestamp of the Event shall be taken from the publish message.
                  +An event in one domain may be generated by something in another domain therefore the domain of the event shall not be required to be the same domain as the source of the event.
                  +        eventBody - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation does not return any errors.
                  +        
                  +            
                  +            Service: Archive
                  +        
                  +        
                  +            Overview
                  +        
                  +        The Archive service provides a basic interface to a standard archiving function. It follows the basic CRUD principles and allows simple querying of the archive. It provides operations to add new objects to an archive, delete objects from an archive, update existing objects in an archive, and also query the content of the archive.
                  +        The query operation provides a basic querying ability, allowing a consumer to filter on fields from the object headers (such as domain etc) and also filter on the body of the object if it uses the MAL data type specification.
                  +        The query operation is extensible but the extensions would be outside this standard.
                  +        Finally, a consumer of the archive can monitor it for changes by subscribing for archive events from the event service. Any change to the archive is published using the event service if it is supported by an implementation.
                  +        
                  +            Table 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Table \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Table_TOC \s 1 1
                  +            Archive Service Operations
                  +            "
                  +            :  Archive Service Operations
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Area Identifier
                  +                Service Identifier
                  +                Area Number
                  +                Service Number
                  +                Area Version
                  +            
                  +            
                  +                COM
                  +                Archive
                  +                2
                  +                2
                  +                1
                  +            
                  +            
                  +                Interaction Pattern
                  +                Operation Identifier
                  +                Operation Number
                  +                Capability Set
                  +            
                  +            
                  +                INVOKE
                  +                 HYPERLINK  \l "OPERATION_2_retrieve" retrieve
                  +                1
                  +                1
                  +            
                  +            
                  +                PROGRESS
                  +                 HYPERLINK  \l "OPERATION_2_query" query
                  +                2
                  +                
                  +            
                  +            
                  +                INVOKE
                  +                 HYPERLINK  \l "OPERATION_2_count" count
                  +                3
                  +                
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_2_store" store
                  +                4
                  +                2
                  +            
                  +            
                  +                SUBMIT
                  +                 HYPERLINK  \l "OPERATION_2_update" update
                  +                5
                  +                3
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_2_delete" delete
                  +                6
                  +                4
                  +            
                  +        
                  +        
                  +            Service-level Requirements
                  +        
                  +        
                  +            COM Event Service usage
                  +        
                  +        For each stored object, an 'ObjectStored' event may be published to the event service.
                  +        For each updated object, an 'ObjectUpdated' event may be published to the event service.
                  +        For each deleted object, an 'ObjectDeleted' event may be published to the event service.
                  +        The source link of the generated events shall link to the object being stored/updated/deleted.
                  +        Archive service events shall be persisted silently in order not to trigger an infinite event loop.
                  +        
                  +            Table 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Table \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Table_TOC \s 1 1
                  +            Archive Service Events
                  +            "
                  +            :  Archive Service Events
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Object Number
                  +                Event Name
                  +                Object Body Type
                  +                Related link
                  +                Source link
                  +            
                  +            
                  +                1
                  +                ObjectStored
                  +                No body
                  +                Set to NULL
                  +                The Object source is the newly stored object.
                  +            
                  +            
                  +                2
                  +                ObjectUpdated
                  +                No body
                  +                Set to NULL
                  +                The Object source is the updated object.
                  +            
                  +            
                  +                3
                  +                ObjectDeleted
                  +                No body
                  +                Set to NULL
                  +                The Object source is the deleted object.
                  +            
                  +        
                  +        
                  +            COM Object Relationships
                  +        
                  +        The Figure below shows the COM event relationships for this service:
                  +        
                  +            Figure 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Figure \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Figure_TOC \s 1 1
                  +            Archive Service COM event relationships
                  +            "
                  +            :  Archive Service COM event relationships
                  +        
                  +        
                  +            
                  +            Operation: retrieve
                  +        
                  +        
                  +            Overview
                  +        
                  +        Retrieves a set of objects identified by their object instance identifier.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                retrieve
                  +            
                  +            
                  +                Interaction Pattern
                  +                INVOKE
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                INVOKE
                  +                YesYesYes
                  +                 HYPERLINK  \l "DATATYPE_ObjectType" ObjectType objTypeList<Identifier> domainList<Long> objInstIds
                  +            
                  +            
                  +                OUT
                  +                ACK
                  +                -
                  +                -
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                YesYes
                  +                List< HYPERLINK  \l "DATATYPE_ArchiveDetails" ArchiveDetails> objDetailsList<Element> objBodies
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        objType - The first part of the request shall contain the type of the object required.
                  +If any of the fields of the object type contains the wildcard value of '0' then an INVALID error shall be returned.
                  +The second part of the request shall contain the domain to match.
                  +If the domain contains the wildcard value of '*' then an INVALID error shall be returned.
                  +The third part of the request shall contain the list of object instance identifiers to match.
                  +If the object instance identifier list contains the wildcard value '0' then all object instances shall be matched.
                  +If any explicitly requested object cannot be matched then an UNKNOWN error shall be returned.
                  +        domain - 
                  +        objInstIds - 
                  +        objDetails - The response shall contain the set of matched objects.
                  +The first returned list shall contain the matched object instance identifiers and object details of the matched objects.
                  +The second returned list shall contain the object bodies ordered identically to the first list unless no body for the object is declared in the service specification, in which case a NULL replaces the complete list.
                  +There shall be an entry in each returned list for each matched object.
                  +When no objects have been matched only a response with NULL for each part of the response shall be returned.
                  +The ordering of the returned objects is not specified and implementation specific.
                  +If ordering of the returned objects is required then the query operation should be used instead.
                  +        objBodies - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        UNKNOWN: One or more of the requested objects specified in the operation do not exist and therefore cannot be found.
                  +        INVALID: The request contains a wildcard value in either the object type field or the domain.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                List<UInteger>
                  +                A list of the indexes of the error values shall be contained in the extra information field.
                  +            
                  +            
                  +                INVALID
                  +                70000
                  +                Not Used
                  +                -
                  +            
                  +        
                  +        
                  +            
                  +            Operation: query
                  +        
                  +        
                  +            Overview
                  +        
                  +        Retrieves a set of object instance identifiers, and optionally the object bodies, from a list of supplied queries. The PROGRESS interaction pattern is used as the returned set of data may be quite large and this allows it to be split over several MAL messages.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                query
                  +            
                  +            
                  +                Interaction Pattern
                  +                PROGRESS
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                PROGRESS
                  +                YesYesYesYes
                  +                Boolean returnBody HYPERLINK  \l "DATATYPE_ObjectType" ObjectType objTypeList< HYPERLINK  \l "DATATYPE_ArchiveQuery" ArchiveQuery> archiveQueryList< HYPERLINK  \l "DATATYPE_QueryFilter" QueryFilter> queryFilter
                  +            
                  +            
                  +                OUT
                  +                ACK
                  +                -
                  +                -
                  +            
                  +            
                  +                OUT
                  +                UPDATE
                  +                YesYesYesYes
                  +                 HYPERLINK  \l "DATATYPE_ObjectType" ObjectType objTypeList<Identifier> domainList< HYPERLINK  \l "DATATYPE_ArchiveDetails" ArchiveDetails> objDetailsList<Element> objBodies
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                YesYesYesYes
                  +                 HYPERLINK  \l "DATATYPE_ObjectType" ObjectType objTypeList<Identifier> domainList< HYPERLINK  \l "DATATYPE_ArchiveDetails" ArchiveDetails> objDetailsList<Element> objBodies
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        returnBody - The first part of the request shall contain a Boolean that if set to TRUE requests that the body of the objects is returned otherwise only the ObjectType and ArchiveDetails shall be returned and the returned list of the bodies of the objects shall be replaced with a NULL.
                  +The second part of the request shall contain the type of the object required.
                  +Each part of the object type may contain the wildcard value of '0'.
                  +The third and fourth parts of the request shall contain the queries to evaluate.
                  +A single query shall be formed by the combination of an ArchiveQuery from the first list and a QueryFilter from the second list.
                  +The two lists shall be ordered identically so that the query and the filter parts can be matched together.
                  +If a query does not contain a QueryFilter part then that entry in the QueryFilter list shall be replaced with a NULL value.
                  +If the request does not contain any QueryFilters then the complete list may be replaced with a NULL.
                  +The size of the two lists must be the same unless the complete second list is replaced with a NULL otherwise an INVALID error shall be raised.
                  +For each query, the ArchiveQuery and the QueryFilter shall contain the COM object fields to filter on.
                  +The ArchiveQuery may contain the wildcard value of NULL on each of the fields.
                  +If an ArchiveQuery contains an end time but no start time then it shall match the single object that has a timestamp closest to, but not greater than, the end time field.
                  +The end time field may specify a time in the future.
                  +If the sortFieldName of the ArchiveQuery does not reference a defined field then an INVALID error shall be returned.
                  +Each query shall be evaluated separately from each other, the filter of one query will not affect the filter of another. This forms a logical OR operation.
                  +If the QueryFilter contains an error then an INVALID error shall be returned. The definition of erroneous values are filter specific and defined in the relevant filter structure specification.
                  +        objType - 
                  +        archiveQuery - 
                  +        queryFilter - 
                  +        objType - 
                  +        domain - 
                  +        objDetails - 
                  +        objBodies - 
                  +        objType - The updates and the responses shall contain the set of matched objects.
                  +If a wildcard was used in the ObjectType part of the request then the updates and response shall contain the ObjectType of each matched object.
                  +If there was not any wildcards in the ObjectType part of the request the ObjectType in the updates and response shall be replaced by a NULL.
                  +The first returned list shall contain the domain of the objects being returned.
                  +If multiple ObjectTypes or domains have been matched then multiple Update message may be returned.
                  +There shall be an entry in the second and third lists for each matched object.
                  +The second returned list shall contain the archive details stored for the matched objects.
                  +If the initial Boolean of the request was True the third returned list shall contain the bodies of the objects.
                  +If the initial Boolean of the request was NULL or False the third returned list shall be replaced by a NULL.
                  +The returned lists shall be sorted based on the sorting options specified in ArchiveQuery.
                  +Each domain/object type pair shall be sorted separately from other domain/object type pairs, there is no requirement for sorting to be applied across domain/object type pairs.
                  +When the field being sorted on contains a NULL value, or does not exist in the matched object (due to a containing composite being NULL), these entries shall be added to the end of the returned list in the order that they are matched.
                  +When no objects have been matched only a response with NULL for each part of the response shall be returned.
                  +        domain - 
                  +        objDetails - 
                  +        objBodies - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return the following error:
                  +        INVALID: One or more of the query filters supplied contains an invalid value.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                INVALID
                  +                70000
                  +                List<UInteger>
                  +                The extra information field contains a list of the indexes of the erroneous values from the originating list supplied.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: count
                  +        
                  +        
                  +            Overview
                  +        
                  +        Counts the set of objects based on a supplied query.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                count
                  +            
                  +            
                  +                Interaction Pattern
                  +                INVOKE
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                INVOKE
                  +                YesYesYes
                  +                 HYPERLINK  \l "DATATYPE_ObjectType" ObjectType objTypeList< HYPERLINK  \l "DATATYPE_ArchiveQuery" ArchiveQuery> archiveQueryList< HYPERLINK  \l "DATATYPE_QueryFilter" QueryFilter> queryFilter
                  +            
                  +            
                  +                OUT
                  +                ACK
                  +                -
                  +                -
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                Yes
                  +                List<Long> counts
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        objType - The ObjectType, ArchiveQuery and QueryFilter parts of the request shall be populated exactly the same as for the query operation.
                  +        archiveQuery - 
                  +        queryFilter - 
                  +        counts - The response shall contain the count of matched objects.
                  +There shall be an entry in each returned list for each entry in the request list.
                  +The returned lists shall be ordered the same as the request query lists so that the response can be matched to the corresponding request.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return the following error:
                  +        INVALID: One or more of the query filters supplied contains an invalid value.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                INVALID
                  +                70000
                  +                List<UInteger>
                  +                The extra information field contains a list of the indexes of the erroneous values from the originating list supplied.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: store
                  +        
                  +        
                  +            Overview
                  +        
                  +        Stores new objects in the archive and causes an ObjectStored event to be published by the archive.
                  +        When new objects are being stored in an archive by a service provider the archive service provider is capable of allocating an unused object instance identifier for the objects being stored. The returned object instance identifier should be used by the service provider for identifying the object instances to its consumer to ensure that only a single object instance identifier is used for each object instance.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                store
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                YesYesYesYesYes
                  +                Boolean returnObjInstIds HYPERLINK  \l "DATATYPE_ObjectType" ObjectType objTypeList<Identifier> domainList< HYPERLINK  \l "DATATYPE_ArchiveDetails" ArchiveDetails> objDetailsList<Element> objBodies
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                Yes
                  +                List<Long> objInstIds
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        returnObjInstIds - The first part of the request indicates whether the operation should return the object instance identifiers used, if TRUE it shall return them, otherwise it returns NULL.
                  +The second part of the request shall contain the type of object being stored.
                  +The third part of the request shall contain the domain of the objects being stored.
                  +The fourth part of the request shall contain the list of archive details to use, one for each object being stored.
                  +If the object instance identifier supplied in the archive details is set to 0 then the store operation shall allocate a new and unused object instance identifier.
                  +If the object instance identifier supplied in the archive details is not set to 0 and is currently used in the archive then a DUPLICATE error is returned and no objects from the request shall be stored.
                  +The fifth part of the request shall contain the list of objects to store.
                  +The fourth and fifth list must be the same size as there is only one entry in each for each object to be stored. If they differ in size an INVALID error is returned with the extra error information integer giving the index of the list entry without a matching entry in the other list.
                  +An INVALID error shall be returned if a wildcard value of '0' is used in the object type.
                  +An INVALID error shall be returned if a wildcard value of '*' is used in the domain identifier list.
                  +An INVALID error shall be returned if the values of '0', '*', or NULL are used in the network, timestamp or provider fields of the archive details except for the object instance identifier.
                  +The type of the body of the object should be checked against the declared type in the relevant service specification, if different an INVALID error is raised.
                  +If any error is returned then the store operation shall be rolled back and nothing is stored as a result of the operation.
                  +        objType - 
                  +        domain - 
                  +        objDetails - 
                  +        objBodies - 
                  +        objInstIds - The response shall contain the set of new object instance identifiers if the request supplied an initial TRUE Boolean value, otherwise it returns NULL.
                  +The returned list shall be ordered identically to the submitted list so that the returned object instance identifiers can be mapped to the correct objects.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        INVALID: One or more of the objects being stored contains an invalid value.
                  +        DUPLICATE: One or more of the objects being stored has supplied an object instance identifier that is already in use in the archive.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                INVALID
                  +                70000
                  +                List<UInteger>
                  +                The extra information field contains a list of the indexes of the erroneous values from the originating list supplied.
                  +            
                  +            
                  +                DUPLICATE
                  +                70001
                  +                List<UInteger>
                  +                The extra information field contains a list of the indexes of the erroneous values from the originating request list.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: update
                  +        
                  +        
                  +            Overview
                  +        
                  +        Updates an object (or set of objects), causes an ObjectUpdated event to be published by the archive.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                update
                  +            
                  +            
                  +                Interaction Pattern
                  +                SUBMIT
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                SUBMIT
                  +                YesYesYesYes
                  +                 HYPERLINK  \l "DATATYPE_ObjectType" ObjectType objTypeList<Identifier> domainList< HYPERLINK  \l "DATATYPE_ArchiveDetails" ArchiveDetails> objDetailsList<Element> objBodies
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        objType - The first part of the request shall contain the type of object being updated.
                  +The second part of the request shall contain the domain of the objects being updated.
                  +The third part of the request shall contain the list of ArchiveDetails.
                  +The object instance identifier contained in the ArchiveDetails, combined with the object type and domain from the request, shall be used to match objects.
                  +If requested object cannot be matched then an UNKNOWN error shall be returned and nothing will be updated.
                  +The remainder of the ArchiveDetails shall be used to update the matched objects.
                  +The fourth part of the request shall contain the list of objects to replace the matched objects with.
                  +No wildcard values shall be accepted in the object type, the domain, and the object instance identifier, an INVALID error is returned in this case and no objects are updated.
                  +        domain - 
                  +        objDetails - 
                  +        objBodies - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        UNKNOWN: One or more of the requested objects specified in the operation do not exist and therefore cannot be found.
                  +        INVALID: One or more of the objects being updated contains a wildcard value in the object identifier fields.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                List<UInteger>
                  +                A list of the indexes of the error values shall be contained in the extra information field.
                  +            
                  +            
                  +                INVALID
                  +                70000
                  +                List<UInteger>
                  +                The extra information field contains a list of the indexes of the erroneous values from the originating list supplied.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: delete
                  +        
                  +        
                  +            Overview
                  +        
                  +        Deletes an object (or set of objects) and causes an ObjectDeleted event to be published by the archive.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                delete
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                YesYesYes
                  +                 HYPERLINK  \l "DATATYPE_ObjectType" ObjectType objTypeList<Identifier> domainList<Long> objInstIds
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                Yes
                  +                List<Long> deletedObjInstIds
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        objType - The first part of the request shall contain the type of object to match and is not permitted to contain the wildcard value.
                  +The second part of the request shall contain the domain of the objects to match and is not permitted to contain the wildcard value.
                  +If either the first or second part contain a wildcard value then an INVALID error shall be returned and no object deleted.
                  +The third part of the request shall contain the list of object instance identifiers to match.
                  +If the object instance identifier list contains the wildcard value '0' then all object instances shall be matched.
                  +If any explicitly requested object cannot be matched then an UNKNOWN error shall be returned and nothing will be deleted.
                  +The matched objects shall be deleted from the archive.
                  +        domain - 
                  +        objInstIds - 
                  +        deletedObjInstIds - The response shall contain the set of object instance identifiers of the deleted objects.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        UNKNOWN: One or more of the requested objects specified in the operation do not exist and therefore cannot be found.
                  +        INVALID: The supplied object type or domain contains a wildcard value.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                List<UInteger>
                  +                A list of the indexes of the error values shall be contained in the extra information field.
                  +            
                  +            
                  +                INVALID
                  +                70000
                  +                Not Used
                  +                -
                  +            
                  +        
                  +        
                  +            
                  +            Service: ActivityTracking
                  +        
                  +        
                  +            Overview
                  +        
                  +        The activity tracking service provides the ability to monitor the progress of activities; an activity is anything that has a measurable period of time (a command, a remote procedure, a schedule etc). It defines an event pattern that supports the monitoring of activities from the initial consumer request, tracking its progress across a transport link, to reception by the provider and execution in that provider.
                  +        
                  +            Table 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Table \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Table_TOC \s 1 1
                  +            ActivityTracking Service Operations
                  +            "
                  +            :  ActivityTracking Service Operations
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Area Identifier
                  +                Service Identifier
                  +                Area Number
                  +                Service Number
                  +                Area Version
                  +            
                  +            
                  +                COM
                  +                ActivityTracking
                  +                2
                  +                3
                  +                1
                  +            
                  +            
                  +                Interaction Pattern
                  +                Operation Identifier
                  +                Operation Number
                  +                Capability Set
                  +            
                  +        
                  +        
                  +            Service-level Requirements
                  +        
                  +        
                  +            COM usage
                  +        
                  +        The activity tracking service may be used for the monitoring of MAL operations.
                  +        A MAL implementation must populate the transaction identifier for SEND interactions if the activity tracking service is to be used.
                  +        If a MAL operation is using the activity tracking service, when the interaction is started, the consumer shall populate and archive an OperationActivity object.
                  +        The OperationActivity object shall use the transaction identifier of the MAL operation for its object instance identifier.
                  +        The OperationActivity object shall use the domain of the MAL operation for its domain.
                  +        All Activity events for the interaction shall link to the OperationActivity object using their source link where the object instance identifier to use is the MAL interaction transaction identifier.
                  +        If a relay node is unable to relay the operation then that relay shall fail the MAL interaction that the consumer initiated as well as generate the correct activity event.
                  +        The executionStage field of the Execution event structure shall hold the current execution stage of the activity.
                  +        For SUBMIT, INVOKE, and PROGRESS interactions the ACKNOWLEDGE stage shall have an execution stage value of '1'.
                  +        For REQUEST interactions the RESPONSE stage shall have an execution stage value of '1'.
                  +        For PROGRESS interactions the execution stage value for the PROGRESS updates shall start at '2' and increate for each update sent.
                  +        For PROGRESS interactions the execution stage value for the RESPONSE shall be the total number of PROGRESS updates plus '2'.
                  +        The stageCount field of the Execution event structure shall be populated from the stage count row of Table 2-1.
                  +        
                  +            Table 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Table \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Table_TOC \s 1 1
                  +            ActivityTracking Service Object Types
                  +            "
                  +            :  ActivityTracking Service Object Types
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Object Number
                  +                Object Name
                  +                Object Body Type
                  +                Related link
                  +                Source link
                  +            
                  +            
                  +                6
                  +                OperationActivity
                  +                 HYPERLINK  \l "DATATYPE_OperationActivity" OperationActivity
                  +                Set to NULL
                  +                Set to NULL
                  +            
                  +        
                  +        
                  +            COM Event Service usage
                  +        
                  +        The activity tracking service shall use the event service for the monitoring of activities being transferred from a consumer to a provider and also for execution in the provider.
                  +        A Release event shall be generated when an activity is released from a consumer.
                  +        A Reception event shall be generated when an activity is received by an intermediate relay.
                  +        A Forward event shall be generated when an activity is released from an intermediate relay.
                  +        An Acceptance event shall be generated when an activity is received by the destination provider.
                  +        Reception and Forward events shall only be used in a multi-hop activity transfer.
                  +        For Reception and Forward events, the source URI in the UpdateHeader of the published event shall contain the URI of the relay. It is protocol specific how this value is derived.
                  +        Execution progress of an activity shall be reported using Execution events.
                  +        The Execution event may be reported many times as it is used to report each stage in the execution of the activity.
                  +        
                  +            Table 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Table \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Table_TOC \s 1 1
                  +            ActivityTracking Service Events
                  +            "
                  +            :  ActivityTracking Service Events
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Object Number
                  +                Event Name
                  +                Object Body Type
                  +                Related link
                  +                Source link
                  +            
                  +            
                  +                1
                  +                Release
                  +                 HYPERLINK  \l "DATATYPE_ActivityTransfer" ActivityTransfer
                  +                Set to NULL
                  +                The activity being monitored is the source of the event.
                  +            
                  +            
                  +                2
                  +                Reception
                  +                 HYPERLINK  \l "DATATYPE_ActivityTransfer" ActivityTransfer
                  +                Set to NULL
                  +                The activity being monitored is the source of the event.
                  +            
                  +            
                  +                3
                  +                Forward
                  +                 HYPERLINK  \l "DATATYPE_ActivityTransfer" ActivityTransfer
                  +                Set to NULL
                  +                The activity being monitored is the source of the event.
                  +            
                  +            
                  +                4
                  +                Acceptance
                  +                 HYPERLINK  \l "DATATYPE_ActivityAcceptance" ActivityAcceptance
                  +                Set to NULL
                  +                The activity being monitored is the source of the event.
                  +            
                  +            
                  +                5
                  +                Execution
                  +                 HYPERLINK  \l "DATATYPE_ActivityExecution" ActivityExecution
                  +                Set to NULL
                  +                The activity being monitored is the source of the event.
                  +            
                  +        
                  +        
                  +            COM Object Relationships
                  +        
                  +        The Figure below shows the COM object and event relationships for this service:
                  +        
                  +            Figure 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Figure \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Figure_TOC \s 1 1
                  +            ActivityTracking Service COM object and event relationships
                  +            "
                  +            :  ActivityTracking Service COM object and event relationships
                  +        
                  +        
                  +            COM Archive Service usage
                  +        
                  +        The events generated as part of the activity monitoring pattern may be persisted in a COM archive.
                  +        If the activity events are being persisted then the objects that represent the activities (such as an OperationActivity object) should also be persisted.
                  +        
                  +            Data types
                  +        
                  +        
                  +            Area data types: COM
                  +        
                  +        
                  +            
                  +            Composite: ObjectType
                  +        
                  +        The ObjectType structure uniquely identifies the type of an object. It is the combination of the area number, service number, area version, and service object type number. The combined parts are able to fit inside a MAL::Long (for implementations that prefer to index on a single numeric field rather than a structure).
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ObjectType
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                1
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                area
                  +                UShort
                  +                No
                  +                Area Number where the object type is defined. Must not be '0' for values as this is the wildcard.
                  +            
                  +            
                  +                service
                  +                UShort
                  +                No
                  +                Service Number of the service where the object type is defined. Must not be '0' for values as this is the wildcard.
                  +            
                  +            
                  +                version
                  +                UOctet
                  +                No
                  +                Area Version of the service where the object type is defined. Must not be '0' for values as this is the wildcard.
                  +            
                  +            
                  +                number
                  +                UShort
                  +                No
                  +                The service specific object number. Must not be '0' for values as this is the wildcard.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ObjectKey
                  +        
                  +        The ObjectKey structure combines a domain and an object instance identifier such that it identifies the instance of an object for a specific domain.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ObjectKey
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                2
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                domain
                  +                List<Identifier>
                  +                No
                  +                The domain of the object instance.
                  +            
                  +            
                  +                instId
                  +                Long
                  +                No
                  +                The unique identifier of the object instance. Must not be '0' for values as this is the wildcard.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ObjectId
                  +        
                  +        The ObjectId structure combines an object type and an object key such that it identifies the instance and type of an object for a specific domain.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ObjectId
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                3
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                type
                  +                 HYPERLINK  \l "DATATYPE_ObjectType" ObjectType
                  +                No
                  +                The fully qualified unique identifier of the type.
                  +            
                  +            
                  +                key
                  +                 HYPERLINK  \l "DATATYPE_ObjectKey" ObjectKey
                  +                No
                  +                The combination of the object domain and object instance identifier.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ObjectDetails
                  +        
                  +        The ObjectDetails type is used to hold the extra information associated with an object instance, namely the related and source links.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ObjectDetails
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                4
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                related
                  +                Long
                  +                Yes
                  +                Contains the object instance identifier of a related object (e.g. the ActionDefinition that an Action uses). This is service specific. The ObjectType of the related object is specified in the service specification. The related object must exist in the same domain as this object.
                  +            
                  +            
                  +                source
                  +                 HYPERLINK  \l "DATATYPE_ObjectId" ObjectId
                  +                Yes
                  +                An object which is at the origin of the object creation (e.g. the procedure from which an action was triggered).
                  +            
                  +        
                  +        
                  +            
                  +            Composite: InstanceBooleanPair
                  +        
                  +        Simple pair of an object instance identifier and a Boolean value.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                InstanceBooleanPair
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                5
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                id
                  +                Long
                  +                No
                  +                The object instance identifier.
                  +            
                  +            
                  +                value
                  +                Boolean
                  +                No
                  +                An associated Boolean value.
                  +            
                  +        
                  +        
                  +            Service data types: Archive
                  +        
                  +        
                  +            
                  +            Enumeration: ExpressionOperator
                  +        
                  +        The ExpressionOperator enumeration holds a set of possible expression operators.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ExpressionOperator
                  +            
                  +            
                  +                Short Form Part
                  +                5
                  +            
                  +            
                  +                Enumeration Value
                  +                Numerical Value
                  +                Comment
                  +            
                  +            
                  +                EQUAL
                  +                1
                  +                Checks for equality.
                  +            
                  +            
                  +                DIFFER
                  +                2
                  +                Checks for difference (not equal).
                  +            
                  +            
                  +                GREATER
                  +                3
                  +                Checks for greater than.
                  +            
                  +            
                  +                GREATER_OR_EQUAL
                  +                4
                  +                Checks for greater than or equal to.
                  +            
                  +            
                  +                LESS
                  +                5
                  +                Checks for less than.
                  +            
                  +            
                  +                LESS_OR_EQUAL
                  +                6
                  +                Checks for less than or equal to.
                  +            
                  +            
                  +                CONTAINS
                  +                7
                  +                Case sensitive containment test (String types only)
                  +            
                  +            
                  +                ICONTAINS
                  +                8
                  +                Case insensitive containment test (String types only).
                  +            
                  +        
                  +        
                  +            
                  +            Composite: QueryFilter
                  +        
                  +        The base structure for archive filters.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                QueryFilter
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Abstract
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ArchiveDetails
                  +        
                  +        The ArchiveDetails structure is used to hold information about a single entry in an Archive.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ArchiveDetails
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                1
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                instId
                  +                Long
                  +                No
                  +                The object instance identifier of the archived object.
                  +            
                  +            
                  +                details
                  +                 HYPERLINK  \l "DATATYPE_ObjectDetails" ObjectDetails
                  +                No
                  +                The details of the Object.
                  +            
                  +            
                  +                network
                  +                Identifier
                  +                Yes
                  +                The network zone of the object.
                  +            
                  +            
                  +                timestamp
                  +                FineTime
                  +                Yes
                  +                The time the object was created.
                  +            
                  +            
                  +                provider
                  +                URI
                  +                Yes
                  +                The component that created the object (a component may be anything from an onboard equipment to a software process on the ground).
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ArchiveQuery
                  +        
                  +        The ArchiveQuery structure is used to specify filters on the common parts of an object in an archive.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ArchiveQuery
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                2
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                domain
                  +                List<Identifier>
                  +                Yes
                  +                Only the objects whose domain matches the provided domain will be returned. The domain field supports the wildcard value of '*' only in the last part of the domain. If NULL then all domains shall be matched.
                  +            
                  +            
                  +                network
                  +                Identifier
                  +                Yes
                  +                Optional network zone. Only the objects whose network zone matches the provided value will be returned. If NULL then all values will be matched.
                  +            
                  +            
                  +                provider
                  +                URI
                  +                Yes
                  +                Optional provider. Only the objects whose provider URI matches the provided provider URI will be returned. If NULL then all values will be matched.
                  +            
                  +            
                  +                related
                  +                Long
                  +                No
                  +                Object instance identifier of the related Object. Only the objects whose related Object matches the provided related Object will be returned unless the '0' wildcard value is supplied.
                  +            
                  +            
                  +                source
                  +                 HYPERLINK  \l "DATATYPE_ObjectId" ObjectId
                  +                Yes
                  +                Optional source. Only the objects whose source matches the provided source will be returned. The fields of the ObjectId may contain the wildcard values ('0' for numeric fields, '*' for Identifier fields). If NULL then all values will be matched. 
                  +            
                  +            
                  +                startTime
                  +                FineTime
                  +                Yes
                  +                Optional start time. Only the objects whose timestamp is equal or greater than the provided start time will be returned. If NULL then no start time shall be applied.
                  +            
                  +            
                  +                endTime
                  +                FineTime
                  +                Yes
                  +                Optional end time. Only the objects whose timestamp is equal or less than the provided end time will be returned. If NULL then no end time will be applied.
                  +            
                  +            
                  +                sortOrder
                  +                Boolean
                  +                Yes
                  +                If set to TRUE then returned values shall be sorted in ascending order, if FALSE then in descending order. If NULL then no sorting shall be applied.
                  +            
                  +            
                  +                sortFieldName
                  +                String
                  +                Yes
                  +                If the returned values are to be sorted because the sortOrder field is not NULL then this field may contain the name of the field in the object body (MAL::Composite) to sort against. If the object body is not a composite but an Attribute or Enumeration then to sort on the values an empty string of "" should be used. Enumerations are sorted on their ordinal. If this field is NULL then the objects shall be sorted on the COM object timestamp. The field follows the naming convention of CompositeFilter::fieldName. If the field points to a composite, list, abstract type (including Attribute) or Blob then no sorting shall be applied.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: CompositeFilter
                  +        
                  +        The CompositeFilter allows an archive query to specify a filter based on the content of the body of an object if that body is specified using the MAL data type specification.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                CompositeFilter
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                3
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                fieldName
                  +                String
                  +                No
                  +                The name of the field in the object body (MAL::Composite) to match against. It is specified by referring to the name of the field. If the field does not exist in the Composite then the filter shall evaluate to false. If the field is nested inside another Composite, it can be referenced by separating the field names by a '.' character; for example the field 'instId' or the source of an ArchiveDetails composite would be referenced using "details.source.key.instId". If the body is not a Composite but an Attribute or Enumeration then it can be referred to by using a blank ("") string value here. Accessing values from lists is not supported by this method.
                  +            
                  +            
                  +                type
                  +                 HYPERLINK  \l "DATATYPE_ExpressionOperator" ExpressionOperator
                  +                No
                  +                The type of the filter to apply.
                  +            
                  +            
                  +                fieldValue
                  +                Attribute
                  +                Yes
                  +                The value to compare with. The type of the suppied value and the matched field mst be the same. Must not contain NULL for expression operators CONTAINS, ICONTAINS, GREATER, GREATER_OR_EQUAL, LESS, or LESS_OR_EQUAL otherwise an INVALID error should be returned. Must contain a UInteger ordinal value if the field being matched is an Enumeration. Blob fields can only be used with EQUAL/DIFFER. Must contain a String value if operator is CONTAINS or ICONTAINS otherwise an INVALID error should be returned.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: CompositeFilterSet
                  +        
                  +        Contains a list of CompositeFilters that are AND'd together to form a more complex filter.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                CompositeFilterSet
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_QueryFilter" QueryFilter
                  +            
                  +            
                  +                Short Form Part
                  +                4
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                filters
                  +                List< HYPERLINK  \l "DATATYPE_CompositeFilter" CompositeFilter>
                  +                No
                  +                The list of filters to apply.
                  +            
                  +        
                  +        
                  +            Service data types: ActivityTracking
                  +        
                  +        
                  +            
                  +            Composite: ActivityTransfer
                  +        
                  +        The structure holds details for a Release, Reception, or Forward event of an activity.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ActivityTransfer
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                1
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                success
                  +                Boolean
                  +                No
                  +                The success result of this stage, TRUE if successful, FALSE otherwise. If this is TRUE then the next two fields should be populated.
                  +            
                  +            
                  +                estimateDuration
                  +                Duration
                  +                Yes
                  +                The estimated amount of time it will take to be received by the next destination if Release or Forward. Contains the estimated amount of time it will take to be forwarded by this relay if Reception event. May be NULL if unknown or cannot be calculated.
                  +            
                  +            
                  +                nextDestination
                  +                URI
                  +                Yes
                  +                This contains the URI of the next destination, either another relay or the provider. It is protocol specific how this value is derived.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ActivityAcceptance
                  +        
                  +        The structure is used to hold details of an Acceptance event.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ActivityAcceptance
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                2
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                success
                  +                Boolean
                  +                No
                  +                The success result of this stage, TRUE if successful, FALSE otherwise.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ActivityExecution
                  +        
                  +        The structure is used to report the execution status of an activity in the final destination.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ActivityExecution
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                3
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                success
                  +                Boolean
                  +                No
                  +                The success result of this stage, TRUE if successful, FALSE otherwise.
                  +            
                  +            
                  +                executionStage
                  +                UInteger
                  +                No
                  +                The execution stage of the operation.
                  +            
                  +            
                  +                stageCount
                  +                UInteger
                  +                No
                  +                The total number of execution stages that will be reported.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: OperationActivity
                  +        
                  +        The OperationActivity structure contains the details of a MAL operation activity.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                OperationActivity
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                4
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                interactionType
                  +                InteractionType
                  +                No
                  +                The interaction type of the original operation message header.
                  +            
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The following table lists the errors defined in this specification:
                  +        
                  +            Table 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Table \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Table_TOC \s 1 1
                  +            COM MO Errors
                  +            "
                  +            :  COM MO Errors
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                Comment
                  +            
                  +            
                  +                INVALID
                  +                70000
                  +                Operation specific
                  +            
                  +            
                  +                DUPLICATE
                  +                70001
                  +                Operation specific
                  +            
                  +        
                  +    
                  +
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area002-v001-COM/word/numbering.xml b/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area002-v001-COM/word/numbering.xml
                  new file mode 100644
                  index 00000000..091a10ef
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area002-v001-COM/word/numbering.xml
                  @@ -0,0 +1,31 @@
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area002-v001-COM/word/styles.xml b/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area002-v001-COM/word/styles.xml
                  new file mode 100644
                  index 00000000..ee967ee1
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area002-v001-COM/word/styles.xml
                  @@ -0,0 +1 @@
                  +
                  \ No newline at end of file
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area003-v001-Common/[Content_Types].xml b/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area003-v001-Common/[Content_Types].xml
                  new file mode 100644
                  index 00000000..fbe325d6
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area003-v001-Common/[Content_Types].xml
                  @@ -0,0 +1 @@
                  +
                  \ No newline at end of file
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area003-v001-Common/_rels/.rels b/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area003-v001-Common/_rels/.rels
                  new file mode 100644
                  index 00000000..d6637f3e
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area003-v001-Common/_rels/.rels
                  @@ -0,0 +1 @@
                  +
                  \ No newline at end of file
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area003-v001-Common/word/_rels/document.xml.rels b/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area003-v001-Common/word/_rels/document.xml.rels
                  new file mode 100644
                  index 00000000..7af141e1
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area003-v001-Common/word/_rels/document.xml.rels
                  @@ -0,0 +1 @@
                  +
                  \ No newline at end of file
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area003-v001-Common/word/document.xml b/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area003-v001-Common/word/document.xml
                  new file mode 100644
                  index 00000000..5eed8046
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area003-v001-Common/word/document.xml
                  @@ -0,0 +1,3323 @@
                  +
                  +
                  +    
                  +        
                  +            Specification: Common
                  +        
                  +        
                  +            General
                  +        
                  +        This section contains the specifications for the Common services.
                  +        This section details the Common Services; the structures used by the services and operations are detailed in section 4. The services and structures are defined in terms of the MO Message Abstraction Layer (MAL) which is defined in reference [2], so it is possible to deploy them over any supported protocol and message transport.
                  +        The services defined here are also specified in terms of the COM which is defined in reference [3]. 
                  +        To aid comprehension several tables are included for each service and operation definition. The table formats are the same as those used for the specification of the MO COM Services in reference [3]. The formats are fully described in reference [2] in section 2 and in reference [3] section 2, for COM usage.
                  +        All service specifications in this document are part of the Common Area.
                  +        This area contains the following services:
                  +        Directory
                  +        Login
                  +        Configuration
                  +        
                  +            
                  +            Service: Directory
                  +        
                  +        
                  +            Overview
                  +        
                  +        The Directory service allows service providers to publish information about which services they provide and consumers to discover service provider address and capability information.
                  +        Service provider information is made available using the Directory service publishProvider operation and removed using the withdrawProvider operation.
                  +        The lookupProvider operation provides the ability for consumers to query the directory service based on a filter such as required service capability.
                  +        Finally, a provider may supply its set of service specification XML files when publishing its capabilities. This allows consumers that are able to process MO service XML files obtain the files for further processing. It is expected that this would be used to either ensure that no modifications have been made by a provider to a standard service or, in the case of a consumer that is able to dynamically interact with new service specifications, obtain the service specification to allow interaction with that new service.
                  +        
                  +            Table 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Table \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Table_TOC \s 1 1
                  +            Directory Service Operations
                  +            "
                  +            :  Directory Service Operations
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Area Identifier
                  +                Service Identifier
                  +                Area Number
                  +                Service Number
                  +                Area Version
                  +            
                  +            
                  +                Common
                  +                Directory
                  +                3
                  +                1
                  +                1
                  +            
                  +            
                  +                Interaction Pattern
                  +                Operation Identifier
                  +                Operation Number
                  +                Capability Set
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_1_lookupProvider" lookupProvider
                  +                1
                  +                1
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_1_publishProvider" publishProvider
                  +                2
                  +                2
                  +            
                  +            
                  +                SUBMIT
                  +                 HYPERLINK  \l "OPERATION_1_withdrawProvider" withdrawProvider
                  +                3
                  +                
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_1_getServiceXML" getServiceXML
                  +                4
                  +                3
                  +            
                  +        
                  +        
                  +            Service-level Requirements
                  +        
                  +        The directory service shall provide the capability:
                  +         request service provider details based on a filter;
                  +         publish new service provider details;
                  +         withdraw service provider details;
                  +         request any supplied service XML for a service provider.
                  +        A service provider shall use the publishProvider operation to make available the set of services and the capabilities of those services that it offers.
                  +        The publish operation shall take a PublishDetails structure which defines the capabilities and addressing information of that service provider.
                  +        It shall be possible for a provider to offer multiple service addresses and bindings to allows the provider to support multiple message transports and encodings.
                  +        Each service address entry shall include the service interface binding signature description, interface address, MAL protocol mapping, message encoding, the supported QoS levels and associated QoS properties available for that connection.
                  +        A service consumer indicates its required QoS level and priority by using these values in the lookupProvider operation.
                  +        For services that have operations based on the publish and subscribe interaction pattern there may be required a separate URI for the broker component. To support this the directory service shall hold two URIs for each service, the URI of the primary interface and also a secondary one which, if present, is used for publish and subscribe-based operations.
                  +        If a broker component is shared between more than one provider, known as a shared broker, the broker shall be published as a directory service entry without a primary interface URI.
                  +        Providers that wish to use the shared broker shall reference it by using its object instance identifier in the 'brokerProviderObjInstId' field in their directory service entry.
                  +        
                  +            COM usage
                  +        
                  +        A ServiceProvider object represents a service provider. The COM object body shall hold the service provider id taken from the providerId field of the PublishDetails composite.
                  +        The ServiceProvider COM object related link shall not be used and therefore set to NULL.
                  +        The ServiceProvider COM object source link shall not be used and therefore shall be set to NULL.
                  +        A ProviderCapabilities object represents the supported capabilities of a service provider. The COM object body shall hold the provider details of the service provider.
                  +        The ProviderCapabilities COM object related link shall indicate which ServiceProvider COM object it links to.
                  +        The ProviderCapabilities COM object source link shall not be used and therefore set to NULL.
                  +        ServiceProvider and ProviderCapabilities objects shall be created by the publishService operation.
                  +        The object instance identifier for the ServiceProvider and ProviderCapabilities objects shall be populated by the provider of the directory service.
                  +        For the AddressDetails of a particular ProviderCapabilities object, if the brokerProviderObjInstId field contains a value and the brokerURI field is NULL, then the brokerURI value of the referenced provider shall be used.
                  +        
                  +            Table 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Table \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Table_TOC \s 1 1
                  +            Directory Service Object Types
                  +            "
                  +            :  Directory Service Object Types
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Object Number
                  +                Object Name
                  +                Object Body Type
                  +                Related link
                  +                Source link
                  +            
                  +            
                  +                1
                  +                ServiceProvider
                  +                Identifier
                  +                Set to NULL
                  +                Set to NULL
                  +            
                  +            
                  +                2
                  +                ProviderCapabilities
                  +                 HYPERLINK  \l "DATATYPE_ProviderDetails" ProviderDetails
                  +                1
                  +                Set to NULL
                  +            
                  +        
                  +        
                  +            COM Object Relationships
                  +        
                  +        The Figure below shows the COM object relationships for this service:
                  +        
                  +            Figure 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Figure \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Figure_TOC \s 1 1
                  +            Directory Service COM object relationships
                  +            "
                  +            :  Directory Service COM object relationships
                  +        
                  +        
                  +            COM Archive Service usage
                  +        
                  +        All directory objects must be stored in the COM archive by the provider of the Directory service if the implementation of the Directory service uses a COM archive.
                  +        
                  +            
                  +            Operation: lookupProvider
                  +        
                  +        
                  +            Overview
                  +        
                  +        The lookup operation allows a service consumer to query the directory service to return a list of service providers that match the requested criteria. If no match is found, then an empty list is returned.
                  +        
                  +        NOTE: The various filters that may be specified as part of this operation are combined using AND logic.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                lookupProvider
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                Yes
                  +                 HYPERLINK  \l "DATATYPE_ServiceFilter" ServiceFilter filter
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                Yes
                  +                List< HYPERLINK  \l "DATATYPE_ProviderSummary" ProviderSummary> matchingProviders
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        filter - The filter field shall define the lookup query and be used to match details previously published using the publishProvider operation, the specifics of the ServiceFilter fields are defined in the following requirements.
                  +If the serviceProviderId field is NULL then all service provider identifiers shall be matched.
                  +If the final identifier of the domain field of the filter is the wildcard '*', then all sub-domains shall be searched for matches. See R[2] section 3.5.6.5.g.
                  +If the wildcard is used in any other part of the domain other than the final one then an INVALID error shall be returned.
                  +If the domain field is NULL then all domains shall be matched.
                  +If the network field is NULL then all networks shall be matched.
                  +If the sessionType field is NULL then all session types shall be matched.
                  +If the sessionName field is NULL then all session names shall be matched.
                  +The serviceKey field shall be used to match against ServiceKey fields held in the PublishDetails used to publish a specific provider.
                  +If the serviceKey field is NULL then all areas, services and versions shall be matched.
                  +If the area field is the wildcard '0' then all areas names shall be matched.
                  +If the service field is the wildcard '0' then all services shall be matched.
                  +If the version field is the wildcard '0' then all area versions shall be matched.
                  +If the requiredCapabilitySets field is NULL or an empty list then all service capability sets shall be matched.
                  +        matchingProviders - The operation shall return a list of service providers that match the filter.
                  +If no service providers match the supplied filter then an empty list shall be returned.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return the following error:
                  +        INVALID: Invalid domain filter value.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                INVALID
                  +                Defined in COM
                  +                Not Used
                  +                -
                  +            
                  +        
                  +        
                  +            
                  +            Operation: publishProvider
                  +        
                  +        
                  +            Overview
                  +        
                  +        The publishProvider operation adds a new or updates an existing entry in the list of service providers held in the directory service.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                publishProvider
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                Yes
                  +                 HYPERLINK  \l "DATATYPE_PublishDetails" PublishDetails newProviderDetails
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                YesYes
                  +                Long providerObjIdLong capabilitiesObjId
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        newProviderDetails - The newProviderDetails field shall hold the provider details of the service to be added or updated in the directory service.
                  +If any of the fields of the newProviderDetails domain/sessionName/network fields are either empty or contain the wildcard '*' an INVALID error shall be returned.
                  +If the providerId field of the PublishDetails structure is empty or contains the wildcard '*' an INVALID error shall be returned.
                  +For each contained ServiceKey structure if the area/service/version fields contain '0' then an INVALID error shall be returned.
                  +For each contained supportedCapabilitySets list if the list is empty or contains '0' then an INVALID error shall be returned.
                  +If the supportedLevels list is empty or the priorityLevels field is '0' for each contained AddressDetails structure found either within the ProviderDetails or the inner ServiceCapability structures then an INVALID error shall be returned.
                  +If an error is being returned then no changes shall be made.
                  +        providerObjId - If the providerId field of the PublishDetails structure matches an existing ServiceProvider COM object, the operation shall update the existing details of that provider.
                  +If the providerId field of the PublishDetails structure does not match an existing ServiceProvider COM object, then the operation shall create a new ServiceProvider COM object to represent the new service provider.
                  +A new ProviderCapabilities COM object shall be created to store the capabilities of the provider.
                  +The created objects should be stored in the COM archive by the directory service provider.
                  +The operation shall return the COM object instance identifiers of the ServiceProvider and ProviderCapabilities COM objects representing the provider.
                  +        capabilitiesObjId - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return the following error:
                  +        INVALID: Submitted values are invalid.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                INVALID
                  +                Defined in COM
                  +                Not Used
                  +                -
                  +            
                  +        
                  +        
                  +            
                  +            Operation: withdrawProvider
                  +        
                  +        
                  +            Overview
                  +        
                  +        The withdrawProvider operation removes an existing entry from the list of service providers held in the directory service. If no match is found for the withdraw request, then nothing is changed.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                withdrawProvider
                  +            
                  +            
                  +                Interaction Pattern
                  +                SUBMIT
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                SUBMIT
                  +                Yes
                  +                Long providerObjId
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        providerObjId - The providerObjId field shall hold the object instance identifier for the ServiceProvider COM object to remove from the directory service.
                  +If the supplied identifier is '0' an INVALID error shall be returned.
                  +If the supplied identifier does not match an existing ServiceProvider COM object then an UNKNOWN error shall be returned.
                  +If an error is being returned then no changes shall be made.
                  +The matched provider shall be removed from the directory service.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        UNKNOWN: Provider to withdraw was not found.
                  +        INVALID: Submitted values are invalid.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                INVALID
                  +                Defined in COM
                  +                Not Used
                  +                -
                  +            
                  +        
                  +        
                  +            
                  +            Operation: getServiceXML
                  +        
                  +        
                  +            Overview
                  +        
                  +        The getServiceXML operation returns the list of XML files that were submitted by the service provider by the publishProvider operation.
                  +        If no files were supplied then this operation returns an empty list.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                getServiceXML
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                Yes
                  +                Long providerObjId
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                Yes
                  +                List<File> xmlFiles
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        providerObjId - The providerObjId field shall hold the COM object instance identifier for the ServiceProvider to obtain the service XML for.
                  +If the supplied instance identifier is '0' an INVALID error shall be returned.
                  +If the supplied identifier does not match an existing ServiceProvider COM object then an UNKNOWN error shall be returned.
                  +        xmlFiles - The list of XML files supplied during the publishProvider operation for the matched provider shall be returned.
                  +If no XML files were supplied by the provider then an empty list shall be returned.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        INVALID: Submitted values are invalid.
                  +        UNKNOWN: Provider was not found.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                INVALID
                  +                Defined in COM
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                Not Used
                  +                -
                  +            
                  +        
                  +        
                  +            
                  +            Service: Login
                  +        
                  +        
                  +            Overview
                  +        
                  +        The Login service defines the primary mechanism for the submission of authentication credentials to a deployment specific security system. It supports operations to allow a user to login, logout, report available roles, and also handover the login to another user.
                  +        The service is closely tied to the Access Control aspect of the MAL where the returned authentication identifiers are used in the MAL message header to authenticate and authorise message via Access Control.
                  +        The login service supports the concept of roles, where users may log in with a specific role; the meaning of each role is mission-specific, however it is expected that a specific role allocates the user privileges to invoke operations on mission operation services.
                  +        The use of login roles is optional but if they are used then the role details are held in the COM archive and the COM archive operations are used to manage the role definitions. The responsibility for maintenance of the login roles is outside the scope of this specification as it is a deployment issue to define the possible roles and associate users to those roles.
                  +        The form in which the password is sent to the Login service provider must be agreed upon beforehand and is dependent on the security system deployed. For example, most security implementations do not recommend the use of plain text passwords but rather some encrypted version of the password. For this reason the contents of the messages sent between the login service consumer and provider during authentication handshaking are implementation-specific.
                  +        The authentication and authorisation concept of the MO services is covered in section 3.6 of the Reference Model (R2).
                  +        The Reference Model (R2) also provides sequence diagrams for security and login in sections 5.2 and 5.3.
                  +        
                  +            Table 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Table \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Table_TOC \s 1 1
                  +            Login Service Operations
                  +            "
                  +            :  Login Service Operations
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Area Identifier
                  +                Service Identifier
                  +                Area Number
                  +                Service Number
                  +                Area Version
                  +            
                  +            
                  +                Common
                  +                Login
                  +                3
                  +                2
                  +                1
                  +            
                  +            
                  +                Interaction Pattern
                  +                Operation Identifier
                  +                Operation Number
                  +                Capability Set
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_2_login" login
                  +                1
                  +                1
                  +            
                  +            
                  +                SUBMIT
                  +                 HYPERLINK  \l "OPERATION_2_logout" logout
                  +                2
                  +                
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_2_listRoles" listRoles
                  +                3
                  +                2
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_2_handover" handover
                  +                4
                  +                3
                  +            
                  +        
                  +        
                  +            Service-level Requirements
                  +        
                  +        The login service shall provide the capability:
                  +         log in;
                  +         log out;
                  +         report the list of possible roles for a login profile;
                  +         hand over an existing login from one user to another.
                  +        
                  +            COM usage
                  +        
                  +        Instances of a user login shall be represented as LoginInstance COM object.
                  +        Instances of a user role shall be represented as LoginRole COM object.
                  +        LoginInstance objects shall be created by the login and handover operations.
                  +        The object instance identifier for a LoginInstance object shall be populated by the provider of the Login service.
                  +        The LoginInstance object shall use the related link to indicate which LoginRole (if any) the login uses.
                  +        If a LoginInstance object was created during a login operation then the source link shall be set to NULL.
                  +        If a LoginInstance object was created during a handover operation it shall use the source link to indicate which LoginInstance the login was handed over from.
                  +        
                  +            Table 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Table \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Table_TOC \s 1 1
                  +            Login Service Object Types
                  +            "
                  +            :  Login Service Object Types
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Object Number
                  +                Object Name
                  +                Object Body Type
                  +                Related link
                  +                Source link
                  +            
                  +            
                  +                1
                  +                LoginRole
                  +                Identifier
                  +                Set to NULL
                  +                Set to NULL
                  +            
                  +            
                  +                2
                  +                LoginInstance
                  +                 HYPERLINK  \l "DATATYPE_Profile" Profile
                  +                1
                  +                2
                  +            
                  +        
                  +        
                  +            COM Event Service usage
                  +        
                  +        When a user logs in a LoginEvent COM event shall be generated.
                  +        When a user logs out a LogoutEvent COM event shall be generated.
                  +        When the handover operation is successful a LogoutEvent COM event shall be generated for the previous login and a LoginEvent COM event shall be generated for the new login.
                  +        The LoginEvent event shall use the related link to indicate which LoginInstance object is being logged in.
                  +        The LogoutEvent event shall use the related link to indicate which LoginInstance object is being logged out.
                  +        The LoginEvent event shall not use the COM object source link and shall set it to NULL.
                  +        The LogoutEvent event shall use the source link to indicate which LoginEvent event it is logging out.
                  +        The events shall be published using the COM event service.
                  +        
                  +            Table 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Table \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Table_TOC \s 1 1
                  +            Login Service Events
                  +            "
                  +            :  Login Service Events
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Object Number
                  +                Event Name
                  +                Object Body Type
                  +                Related link
                  +                Source link
                  +            
                  +            
                  +                3
                  +                LoginEvent
                  +                No body
                  +                2
                  +                Set to NULL
                  +            
                  +            
                  +                4
                  +                LogoutEvent
                  +                No body
                  +                2
                  +                3
                  +            
                  +        
                  +        
                  +            COM Object Relationships
                  +        
                  +        The Figure below shows the COM object and event relationships for this service:
                  +        
                  +            Figure 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Figure \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Figure_TOC \s 1 1
                  +            Login Service COM object and event relationships
                  +            "
                  +            :  Login Service COM object and event relationships
                  +        
                  +        
                  +            COM Archive Service usage
                  +        
                  +        LoginInstance objects should be stored in the COM archive.
                  +        When a login service event is published, the event object should be stored in the COM archive by the Login service provider.
                  +        LoginRole objects should be stored in the COM archive.
                  +        The COM archive service should be used for maintaining the LoginRole objects.
                  +        
                  +            
                  +            Operation: login
                  +        
                  +        
                  +            Overview
                  +        
                  +        The login operation allows a user to log in to the system. A user can log in more than once by using a different role; however, a specific deployment may place limits on the number of users that may use a specific role, and in that case will fail the login operation with the TOO_MANY error.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                login
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                YesYes
                  +                 HYPERLINK  \l "DATATYPE_Profile" Profile userDetailsString password
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                YesYes
                  +                Blob authIdLong objInstId
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        userDetails - The authenticationId field of the REQUEST message must be NULL otherwise an INVALID error shall be returned.
                  +The authenticationId field shall be checked before applying all other tests here.
                  +The userDetails field shall contain the details of the new user and role combination.
                  +If the username field of the supplied Profile structure is either the wildcard '*' or empty an INVALID error shall be returned.
                  +If roles are required by the system and the role field of the supplied Profile structure is NULL then an INVALID error shall be returned.
                  +If roles are not used by the system the role field of the supplied Profile structure shall be ignored and may be set to NULL.
                  +An UNKNOWN error shall be returned if the username, password and role combination are not correct for the system i.e. unknown user/role or incorrect password.
                  +A DUPLICATE error shall be returned if the username and role combination is currently in use.
                  +A TOO_MANY error shall be returned if the username or role are already used and exceed (deployment dependent) maximum number of concurrent logins/roles.
                  +If the login is successful the provider shall create a new LoginInstance COM object and store it in the COM archive.
                  +The related link of the new LoginInstance COM object shall be set to the requested LoginRole COM object.
                  +A LoginEvent COM event shall be generated at this point.
                  +        password - 
                  +        authId - The returned authId field shall be used as the authenticationId field in future MAL messages by the consumer MAL for authentication. The token is specific to the user and role in use.
                  +        objInstId - The returned objInstId field shall contain the LoginInstance COM object instance identifier that was created by the login operation.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        DUPLICATE: Username/role combination currently in use.
                  +        INVALID: Submitted profile contains invalid values. No further information is provided as it may compromise security.
                  +        TOO_MANY: Role concurrent session limit count exceeded.
                  +        UNKNOWN: Unknown username/role/password combination.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                DUPLICATE
                  +                Defined in COM
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                INVALID
                  +                Defined in COM
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                TOO_MANY
                  +                Defined in MAL
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                Not Used
                  +                -
                  +            
                  +        
                  +        
                  +            
                  +            Operation: logout
                  +        
                  +        
                  +            Overview
                  +        
                  +        The logout operation allows a user to log out from the system. No information is passed in the message as the MAL authentication Id is enough to identify the login.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                logout
                  +            
                  +            
                  +                Interaction Pattern
                  +                SUBMIT
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                SUBMIT
                  +                -
                  +                -
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation does not return any errors.
                  +        
                  +            
                  +            Operation: listRoles
                  +        
                  +        
                  +            Overview
                  +        
                  +        The listRoles operation returns the list of available roles for a specific user. This operation is expected to be called before a user logs in so that the software can provide a list of possible roles.
                  +        It should be noted that this operation requires both a username and password field before returning any information, this is to ensure that it does not provide a security attack vector by allowing the discovery of valid usernames without first knowing the correct password.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                listRoles
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                YesYes
                  +                Identifier usernameString password
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                Yes
                  +                List<Long> permittedRoles
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        username - The username field shall hold the details of the user.
                  +If the username field is either the wildcard '*', NULL or empty an INVALID error shall be returned.
                  +        password - An UNKNOWN error shall be returned if the username and password combination are not correct for the system i.e. unknown user or incorrect password.
                  +        permittedRoles - The operation shall return a list of LoginRole object instance identifiers that are permitted for the user or NULL if roles are not used by the system.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        UNKNOWN: Unknown username/password combination.
                  +        INVALID: Submitted profile contains invalid values.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                INVALID
                  +                Defined in COM
                  +                Not Used
                  +                -
                  +            
                  +        
                  +        
                  +            
                  +            Operation: handover
                  +        
                  +        
                  +            Overview
                  +        
                  +        The handover operation allows an existing login to be transferred to a new user. Two cases are expected here, the first is where the operation is used to change the user's current role, and the second is where an operations context is handed over to another user.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                handover
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                YesYes
                  +                 HYPERLINK  \l "DATATYPE_Profile" Profile newUserDetailsString newUserPassword
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                YesYes
                  +                Blob newAuthIdLong newLoginInstId
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        newUserDetails - The newUserDetails field shall contain the details of the new user and role combination.
                  +If the username field of the supplied Profile structure is either NULL, the wildcard '*', or empty an INVALID error shall be returned.
                  +If roles are required by the system and the role field of the supplied Profile structure is NULL then an INVALID error shall be returned.
                  +The role field of the supplied Profile structure may be NULL if roles are not used by the system.
                  +An UNKNOWN error shall be returned if the username, password and role combination are not correct for the system i.e. unknown user/role or incorrect password.
                  +A DUPLICATE error shall be returned if the username and role combination is currently in use.
                  +A TOO_MANY error shall be returned if the username or role are already used and exceed the permitted maximum usage value (deployment dependent).
                  +The DUPLICATE and TOO_MANY checks shall take into account the fact that current operator/role combination will be logged out after the handover operation completes.
                  +If the handover is successful the provider shall create a new LoginInstance COM object and store it in the COM archive.
                  +The related link of the new LoginInstance COM object shall be set to the requested LoginRole COM object.
                  +If an error is raised then the handover operation shall fail and the original login remain active.
                  +The source link of the new LoginInstance COM object shall be set to the LoginInstance COM object that represents the previous login.
                  +If the handover operation is successful a LogoutEvent COM event shall be generated for the previous login and a LoginEvent COM event shall be generated for the new login.
                  +        newUserPassword - 
                  +        newAuthId - The returned newAuthId field shall be used as the authenticationId field in future MAL messages by the consumer MAL for authentication. The token is specific to the new user and role in use.
                  +        newLoginInstId - The returned newLoginInstId field shall contain the new LoginInstance COM object instance identifier that was created by the operation.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        UNKNOWN: Unknown username/role/password combination.
                  +        INVALID: Submitted profile contains invalid values.
                  +        TOO_MANY: Role concurrent session limit count exceeded.
                  +        DUPLICATE: Username/role combination currently in use.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                INVALID
                  +                Defined in COM
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                TOO_MANY
                  +                Defined in MAL
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                DUPLICATE
                  +                Defined in COM
                  +                Not Used
                  +                -
                  +            
                  +        
                  +        
                  +            
                  +            Service: Configuration
                  +        
                  +        
                  +            Overview
                  +        
                  +        The Configuration service allows a service consumer to activate pre-defined configurations of a service provider. 
                  +        The service uses a COM object to represent the different configurations allowed by a service provider; a service consumer selects one configuration to activate using the Configuration service activate operation.
                  +        The contents of a configuration for a service provider is deployment specific however the management of these configurations, and the selection of a configuration for current use, is the purpose of this service.
                  +        Implementations of this service may also use bespoke methods for configuration representation (such as hard-coded configuration) which is outside the scope of this specification, however, the status and management of these configurations can still be managed with this service.
                  +        NOTE: This service uses the COM Event service to distribute changes in state, therefore participating service providers should ensure they are all using the same shared COM Event service if they wish to receive Configuration service events.
                  +        
                  +            Table 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Table \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Table_TOC \s 1 1
                  +            Configuration Service Operations
                  +            "
                  +            :  Configuration Service Operations
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Area Identifier
                  +                Service Identifier
                  +                Area Number
                  +                Service Number
                  +                Area Version
                  +            
                  +            
                  +                Common
                  +                Configuration
                  +                3
                  +                5
                  +                1
                  +            
                  +            
                  +                Interaction Pattern
                  +                Operation Identifier
                  +                Operation Number
                  +                Capability Set
                  +            
                  +            
                  +                INVOKE
                  +                 HYPERLINK  \l "OPERATION_5_activate" activate
                  +                1
                  +                1
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_5_list" list
                  +                2
                  +                2
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_5_getCurrent" getCurrent
                  +                3
                  +                
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_5_exportXML" exportXML
                  +                4
                  +                3
                  +            
                  +            
                  +                SUBMIT
                  +                 HYPERLINK  \l "OPERATION_5_add" add
                  +                5
                  +                4
                  +            
                  +            
                  +                SUBMIT
                  +                 HYPERLINK  \l "OPERATION_5_remove" remove
                  +                6
                  +                
                  +            
                  +            
                  +                INVOKE
                  +                 HYPERLINK  \l "OPERATION_5_storeCurrent" storeCurrent
                  +                7
                  +                5
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_5_importXML" importXML
                  +                8
                  +                6
                  +            
                  +        
                  +        
                  +            Service-level Requirements
                  +        
                  +        The configuration service shall provide the capability:
                  +         activate a configuration;
                  +         list available configurations;
                  +         manage the available configurations;
                  +         get and store the current configuration;
                  +         import/export configurations from/to XML.
                  +        
                  +            COM usage
                  +        
                  +        A ProviderConfiguration COM object represents a single set of configuration details that may be used by multiple service providers. The object body shall hold an indentifier to identify the provider configuration.
                  +        The ProviderConfiguration COM object related link shall link to the ConfigurationObjects COM object that contains the objects that form the provider configuration.
                  +        If the ProviderConfiguration represents a Hard-coded configuration for a provider then the related link shall be set to NULL.
                  +        The ProviderConfiguration COM object source link should be the object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used.
                  +        A ServiceConfiguration COM object represents a single configuration of a service in a provider, multiple ProviderConfiguration COM objects may reference the same service configuration via its linked ConfigurationObjects COM object. The object body shall hold the service key that identifies the service it is a configuration of.
                  +        The ServiceConfiguration COM object related link shall link to the ConfigurationObjects COM object that contains the objects that form the service configuration.
                  +        If the ServiceConfiguration represents a Hard-coded configuration for a single service then the related link shall be set to NULL.
                  +        The ServiceConfiguration COM object source link should be the object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used.
                  +        A ConfigurationObjects COM object represents a set of links to a set of COM objects that form an actual configuration. The object body shall hold a configuration object details structure that links to the objects that form the configuration.
                  +        The ConfigurationObjects COM object related link shall be set to NULL.
                  +        The ConfigurationObjects COM object source link should be the object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used.
                  +        A ConfigurationFile COM object provides a mechanism for holding files that contain non-COM configuration information so that it can still be managed and referenced by the configuration service. The object body shall hold the configuration file.
                  +        The ConfigurationFile COM object related link shall be set to NULL.
                  +        The ConfigurationFile COM object source link should be the object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used.
                  +        A non-COM configuration shall be represented by linking from a ConfigurationObjects COM object to one or more ConfigurationFile COM objects.
                  +        A ProviderConfigurationLink COM object represents the use of a provider configuration by a specific service provider. The object body is not used and shall be NULL.
                  +        The ProviderConfigurationLink COM object related link shall link to the ServiceProvider COM object that represents the service provider in the Directory Service.
                  +        The ProviderConfigurationLink COM object source link shall link to the ProviderConfiguration COM object in use by the provider.
                  +        
                  +            Table 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Table \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Table_TOC \s 1 1
                  +            Configuration Service Object Types
                  +            "
                  +            :  Configuration Service Object Types
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Object Number
                  +                Object Name
                  +                Object Body Type
                  +                Related link
                  +                Source link
                  +            
                  +            
                  +                1
                  +                ServiceConfiguration
                  +                 HYPERLINK  \l "DATATYPE_ServiceConfigurationIdentifier" ServiceConfigurationIdentifier
                  +                3
                  +                The object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used.
                  +            
                  +            
                  +                2
                  +                ProviderConfiguration
                  +                Identifier
                  +                3
                  +                The object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used.
                  +            
                  +            
                  +                3
                  +                ConfigurationObjects
                  +                 HYPERLINK  \l "DATATYPE_ConfigurationObjectDetails" ConfigurationObjectDetails
                  +                Set to NULL
                  +                The object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used.
                  +            
                  +            
                  +                4
                  +                ConfigurationFile
                  +                File
                  +                Set to NULL
                  +                The object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used.
                  +            
                  +            
                  +                5
                  +                ProviderConfigurationLink
                  +                No body
                  +                Directory::1
                  +                2
                  +            
                  +        
                  +        
                  +            COM Event Service usage
                  +        
                  +        A ConfigurationSwitch COM event shall represent a request change in active configuration.
                  +        The ConfigurationSwitch COM event body shall hold the configuration to be activated.
                  +        The ConfigurationSwitch COM event related link shall point to the COM ServiceProvider object that is required to attempt the configuration switch.
                  +        The ConfigurationSwitch COM event source link shall indicate the activate COM OperationActivity object that caused it to be created.
                  +        A ConfigurationSwitched COM event shall be raised when a configuration is made active.
                  +        The ConfigurationSwitched COM event body shall hold the result of the activation attempt.
                  +        If the activation was successful then the body of the ConfigurationSwitched event shall be set to TRUE, otherwise FALSE for failure.
                  +        The ConfigurationSwitched COM event related link shall point to the ConfigurationSwitch event that triggered the switch attempt.
                  +        The ConfigurationSwitched COM event source link shall point to the previous active configuration or be NULL if no configuration was previously active.
                  +        A ConfigurationStore COM event shall represent a request to store the current configuration.
                  +        The ConfigurationStore COM event body is may contain the ServiceKey of the service to store, it shall be NULL if the provider configuration is to be stored.
                  +        The ConfigurationStore COM event related link shall link to the ServiceProvider object that represents the provider that must store its configuration.
                  +        The ConfigurationStore COM event source link shall indicate the storeCurrent COM OperationActivity object that caused it to be created.
                  +        A ConfigurationStored COM event shall be raised when a configuration has been stored.
                  +        The ConfigurationStored COM event body shall hold the ObjectId of the new Configuration object if the store was successful, otherwise NULL for failure.
                  +        The ConfigurationStored COM event related link shall point to the ConfigurationStore event that triggered the store attempt.
                  +        The ConfigurationStored COM event source link shall be NULL.
                  +        
                  +            Table 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Table \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Table_TOC \s 1 1
                  +            Configuration Service Events
                  +            "
                  +            :  Configuration Service Events
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Object Number
                  +                Event Name
                  +                Object Body Type
                  +                Related link
                  +                Source link
                  +            
                  +            
                  +                6
                  +                ConfigurationSwitch
                  +                COM::ObjectId
                  +                Directory::1
                  +                The source link of the event is the object that triggered the activation, most likely the activate operation.
                  +            
                  +            
                  +                7
                  +                ConfigurationSwitched
                  +                Boolean
                  +                6
                  +                The previous active configuration or be NULL if no configuration was previously active.
                  +            
                  +            
                  +                8
                  +                ConfigurationStore
                  +                 HYPERLINK  \l "DATATYPE_ServiceKey" ServiceKey
                  +                Directory::1
                  +                The source link of the event is the object that triggered the activation, most likely the storeCurrent operation.
                  +            
                  +            
                  +                9
                  +                ConfigurationStored
                  +                COM::ObjectId
                  +                8
                  +                Set to NULL
                  +            
                  +        
                  +        
                  +            COM Object Relationships
                  +        
                  +        The Figure below shows the COM object and event relationships for this service:
                  +        
                  +            Figure 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Figure \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Figure_TOC \s 1 1
                  +            Configuration Service COM object and event relationships
                  +            "
                  +            :  Configuration Service COM object and event relationships
                  +        
                  +        
                  +            COM Archive Service usage
                  +        
                  +        Configuration definition objects (ServiceConfiguration, ProviderConfiguration, ProviderConfigurationLink, ConfigurationObjects, ConfigurationFile) must be stored in the COM archive by the provider of the Configuration service if the implementation of the Configuration service uses a COM archive.
                  +        The COM objects that hold the actual configuration definition details must be stored in the COM archive by the provider of the relevant service if the implementation of the Configuration service uses a COM archive.
                  +        When a configuration event (ConfigurationSwitch, ConfigurationSwitched, ConfigurationStore, ConfigurationStored) is published, the event objects should be stored in the COM archive.
                  +        
                  +            
                  +            Operation: activate
                  +        
                  +        
                  +            Overview
                  +        
                  +        The activate operation instructs a service provider to make a specific configuration active. The operation returns once the new configuration is active or when the activation attempt has failed for some reason.
                  +        The requested configuration must have either already been added to the configuration service provider using the add operation or alternatively known to the configuration service by another implementation specific mechanism.
                  +        NOTE - The service is reconfigured for all service consumers not just the calling consumer.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                activate
                  +            
                  +            
                  +                Interaction Pattern
                  +                INVOKE
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                INVOKE
                  +                YesYes
                  +                COM::ObjectKey serviceProviderCOM::ObjectId configObjId
                  +            
                  +            
                  +                OUT
                  +                ACK
                  +                -
                  +                -
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                YesYes
                  +                Boolean activationResultList<COM::ObjectId> previousConfig
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        serviceProvider - The serviceProvider field shall contain the domain and object instance identifier of the ServiceProvider COM object being (re)configured.
                  +If the service provider referenced by the serviceProvider field is not known an UNKNOWN error shall be returned.
                  +        configObjId - The configObjId field shall hold the COM object identifier that identifies the configuration to activate.
                  +The configObjId field shall reference either a ProviderConfiguration or ServiceConfiguration object.
                  +An UNKNOWN error shall be returned if the object instance identifier held in the configObjId field does not match an existing configuration.
                  +An INVALID error shall be returned if the object instance identifier held in the configObjId field does not reference either a ProviderConfiguration or ServiceConfiguration object.
                  +If the object instance identifier held in the configObjId field does not reference a valid configuration for the service provider an INVALID error shall be returned. A valid configuration is one that is returned from the list operation for the matched service provider.
                  +        activationResult - The service provider that implements the selected service shall, after the reception of the ConfigurationSwitch event, reconfigure itself and publish a ConfigurationSwitched COM event.
                  +If the operation fails the previous configuration shall remain active.
                  +In the case of a provider configuration, where multiple service configurations are being switched, the provider must switch all configurations successfully or roll back to the previous configuration. No partial reconfiguration is supported.
                  +If a provider level configuration is successful, and a COM archive is being used, then the service provider that implements the selected service shall store in the COM archive a new ProviderConfigurationLink COM object that links its ServiceProvider object to the new activated ProviderConfiguration COM object.
                  +The response message shall be sent when the configuration is either made active or fails.
                  +If the activation was successful then the activationResult field shall be set to TRUE, otherwise FALSE for failure.
                  +        previousConfig - The previousConfig field shall point to the previously active configuration or NULL if no configuration was previously active or the activationResult was FALSE for failure.
                  +If a service configuration was requested, configObjId field shall referenced a ServiceConfiguration, the response shall contain a list of a single item of the previous ServiceConfiguration COM object.
                  +If a provider configuration was requested, configObjId field shall referenced a ProviderConfiguration, the response shall contain a list of the previous ProviderConfiguration COM object followed by the list of previous ServiceConfiguration objects active for that provider.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        UNKNOWN: Requested configuration is unknown.
                  +        INVALID: Requested configuration is invalid.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                INVALID
                  +                Defined in COM
                  +                Not Used
                  +                -
                  +            
                  +        
                  +        
                  +            
                  +            Operation: list
                  +        
                  +        
                  +            Overview
                  +        
                  +        The list operation returns list of configurations known to the configuration service provider for a certain configuration type in a specific domain.
                  +        To appear in the response from the list operation a configuration must have either been added to the configuration service provider using the add operation or alternatively known to the configuration service by another implementation specific mechanism.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                list
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                YesYesYes
                  +                 HYPERLINK  \l "DATATYPE_ConfigurationType" ConfigurationType configurationTypeList<Identifier> domain HYPERLINK  \l "DATATYPE_ServiceKey" ServiceKey serviceKey
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                Yes
                  +                List<COM::ObjectId> objInstIds
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        configurationType - The configurationType argument shall hold the type of configuration to be listed.
                  +        domain - The domain request argument shall contain the domain of the configuration objects to return.
                  +The domain field supports the wildcard value of '*' only in the last part of the domain, otherwise an INVALID error shall be returned. See section 3.5.6.5.g in R[2].
                  +        serviceKey - If the request configuration type is SERVICE, then an optional filter may be supplied in the serviceKey field where the ServiceKey composite holds the service area, service, and version values to match on.
                  +The filter shall be applied with a logical AND for each field of the service key.
                  +Wildcard values of '0' are not accepted in the serviceKey fields, an INVALID error shall be returned in this case.
                  +For other types of configuration the serviceKey field shall be ignored and may be set to NULL in the request.
                  +        objInstIds - The operation shall return the list of matched configuration objects known to the configuration service provider.
                  +If no configurations matched then an empty list shall be returned.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return the following error:
                  +        INVALID: Requested configuration is not a valid configuration object type or wildcard values were specified in the service key filter.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                INVALID
                  +                Defined in COM
                  +                Not Used
                  +                -
                  +            
                  +        
                  +        
                  +            
                  +            Operation: getCurrent
                  +        
                  +        
                  +            Overview
                  +        
                  +        The getCurrent operation returns the currently selected configuration of a service provider, either of the complete provider (ProviderConfiguration) or a specific service (ServiceConfiguration) of that provider, as far as the Configuration Service provider is concerned.
                  +        This means that if the provider of a specific service has modified their configuration by some other means, and this has not been stored using the storeCurrent operation, then this operation will return the unmodified configuration.
                  +        If a provider level configuration is required by this operation, and service configurations different to the ones in the provider configuration have been activated by the activate operation, then this operation will return the ProviderConfiguration followed by the list of modified ServiceConfigurations.
                  +        The current configuration of a service provider is most likely the configuration that was last activated using the activate operation, however implementations of the configuration service may have other means (outside the scope of this service) of selecting the current configuration of a service provider.
                  +        The operation can also be used to determine the initial configuration of a service provider before it has been activated, it is therefore a useful operation to call by a service provider during start-up to determine its initial configuration. If this is the case a ConfigurationSwitched event should be published.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                getCurrent
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                YesYes
                  +                COM::ObjectKey serviceProvider HYPERLINK  \l "DATATYPE_ServiceKey" ServiceKey serviceKey
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                Yes
                  +                List<COM::ObjectId> objInstId
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        serviceProvider - The serviceProvider field shall contain the domain and object instance identifier of the ServiceProvider COM object being queried.
                  +        serviceKey - If the serviceKey field is not NULL, then the operation shall return the configuration of the selected service, as specified in the field.
                  +For retrieval of the provider level configuration the serviceKey field shall be set to NULL in the request.
                  +An UNKNOWN error shall be returned if the combination of service provider and service filter fields don't match an existing service provider, service key or configuration.
                  +No wildcards are supported, an INVALID error must be returned in this case.
                  +        objInstId - If a service configuration was requested, serviceKey was not NULL, the response shall contain a list of a single item of the matched ServiceConfiguration COM object.
                  +If a provider configuration was requested, serviceKey was NULL, the response shall contain a list of the matched ProviderConfiguration COM object followed by the list of active ServiceConfiguration objects active for that provider.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        INVALID: The request contained one or more wildcards.
                  +        UNKNOWN: Requested service provider and service key combination is unknown.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                INVALID
                  +                Defined in COM
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                Not Used
                  +                -
                  +            
                  +        
                  +        
                  +            
                  +            Operation: exportXML
                  +        
                  +        
                  +            Overview
                  +        
                  +        The exportXML operation returns the actual Configuration information in the XML format from the configuration object stored in the Archive.
                  +        The returned XML is in the standardised format and one of two levels of detail, compact or complete, can be selected. Compact contains just the COM object instance identifiers with the respective domains and object types whereas complete augments the compact with the additional set of values inside the respective service objects. 
                  +        The XML standardised format is the XML representation of the referenced COM objects as defined by the XML encoding given in R[4]. Example XML documents can be found in an annex at the end of this specification.
                  +        If the implementation of the configuration service is not using a COM archive then an error is returned.
                  +        It should be noted that this operation only supports COM configurations.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                exportXML
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                YesYes
                  +                COM::ObjectId confObjIdBoolean returnComplete
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                Yes
                  +                File xmlConfiguration
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        confObjId - If the implementation of the configuration service is not using a COM archive then an UNSUPPORTED_OPERATION error shall be returned.
                  +The confObjId argument shall contain the type, domain and COM object instance identifier of the configuration object to return the XML representation of.
                  +An UNKNOWN error shall be returned if the confObjId field does not match an existing COM object.
                  +An INVALID error shall be returned if the confObjId does not refer to either a ProviderConfiguration or a ServiceConfiguration object.
                  +An INVALID error shall be returned if the confObjId refers to either a hard-coded or a non-COM configuration.
                  +        returnComplete - The returnComplete Boolean shall be set to True if the returned XML is to be in the complete standardised format, otherwise it will be in the compact standardised format.
                  +        xmlConfiguration - The returned File object shall contain the configuration XML.
                  +The Configuration object shall not be deleted from the COM Archive.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        INVALID: Requested configuration is not a valid configuration object type.
                  +        UNKNOWN: Requested object is unknown.
                  +        UNSUPPORTED_OPERATION: The operation requires the use of a COM archive
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                INVALID
                  +                Defined in COM
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                UNSUPPORTED_OPERATION
                  +                Defined in MAL
                  +                Not Used
                  +                -
                  +            
                  +        
                  +        
                  +            
                  +            Operation: add
                  +        
                  +        
                  +            Overview
                  +        
                  +        The add operation makes a new Configuration available on the Configuration Service. The Configuration must already exist in the COM archive to be added to the Configuration Service.
                  +        If the implementation of the configuration service is not using a COM archive then an error is returned.
                  +        This operation can be used to add COM, non-COM and hard-coded configurations.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                add
                  +            
                  +            
                  +                Interaction Pattern
                  +                SUBMIT
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                SUBMIT
                  +                YesYes
                  +                COM::ObjectKey serviceProviderList<COM::ObjectId> configObjIds
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        serviceProvider - If the implementation of the configuration service is not using a COM archive then an UNSUPPORTED_OPERATION error shall be returned.
                  +The first argument shall contain the domain and object identifier of the ServiceProvider COM object which the configurations are being added to.
                  +        configObjIds - The second argument shall contain a list of service and/or provider configurations to add to the list of configurations available for the specific service provider.
                  +If either the service provider or the configuration objects are unknown then an UNKNOWN error shall be returned.
                  +If any of the supplied configuration objects are not provider or service configuration objects then an INVALID error shall be returned.
                  +If an error is raised then no new configurations shall be added as a result of this operation call.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        INVALID: One of the supplied configuration object instance identifiers is either not a Service or a Provider configuration object.
                  +        UNSUPPORTED_OPERATION: The operation requires the use of a COM archive
                  +        UNKNOWN: One of the supplied service or configuration object instance identifiers is unknown.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                INVALID
                  +                Defined in COM
                  +                List<UInteger>
                  +                The extra information field contains a list of the indexes of the erroneous values from the originating list supplied.
                  +            
                  +            
                  +                UNSUPPORTED_OPERATION
                  +                Defined in MAL
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                List<UInteger>
                  +                A list of the indexes of the error values shall be contained in the extra information field.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: remove
                  +        
                  +        
                  +            Overview
                  +        
                  +        The remove operation, removes a provider configuration from the list of configurations available for that provider in the configuration service. The operation does not remove the configuration objects from the COM archive, merely removes the objects from the configuration service provider.
                  +        If the implementation of the configuration service is not using a COM archive then an error is returned.
                  +        This operation can be used to remove COM, non-COM, and hard-coded configurations from a provider.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                remove
                  +            
                  +            
                  +                Interaction Pattern
                  +                SUBMIT
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                SUBMIT
                  +                YesYes
                  +                COM::ObjectKey serviceProviderList<COM::ObjectId> configObjIds
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        serviceProvider - If the implementation of the configuration service is not using a COM archive then an UNSUPPORTED_OPERATION error shall be returned.
                  +The first argument shall contain the domain and object identifier of the ServiceProvider COM object which the configurations are being removed from.
                  +        configObjIds - The second argument shall contain a list of service and/or provider configurations to remove from the list of configurations available for the specific service provider.
                  +If either the service provider or a provided object identifier does not match an existing configuration object then this operation shall fail with an UNKNOWN error.
                  +If any of the supplied configuration objects are not provider or service configuration objects then an INVALID error shall be returned.
                  +If an error is raised then no configurations shall be removed as a result of this operation call.
                  +Matched configuration objects shall not be removed from the COM archive only the list of configuration objects in the provider.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        UNKNOWN: Either the service provider or one of the supplied configuration object instance identifiers is unknown.
                  +        INVALID: One of the supplied configuration object instance identifiers is either not a Service or a Provider configuration object.
                  +        UNSUPPORTED_OPERATION: The operation requires the use of a COM archive
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                List<UInteger>
                  +                A list of the indexes of the error values shall be contained in the extra information field.
                  +            
                  +            
                  +                INVALID
                  +                Defined in COM
                  +                List<UInteger>
                  +                The extra information field contains a list of the indexes of the erroneous values from the originating list supplied.
                  +            
                  +            
                  +                UNSUPPORTED_OPERATION
                  +                Defined in MAL
                  +                Not Used
                  +                -
                  +            
                  +        
                  +        
                  +            
                  +            Operation: storeCurrent
                  +        
                  +        
                  +            Overview
                  +        
                  +        The storeCurrent operation requests the creation of a new Configuration object containing the current Configuration of a specific Service or Provider configuration and stores the new Configuration object in the COM archive. Optionally the configuration can be added to the list of available configurations.
                  +        The actual service provider is responsible for the creation of the new Configuration objects in the COM archive as it is the provider that contains the configuration being stored.
                  +        This operation's expected use is for storing a configuration that has been modified "on line" in the service provider. For instance, a need to modify the thresholds of the parameter checks on ground can arise during operations. Before being "officialised", the new thresholds are usually implemented locally and tested. If the modifications are deemed correct then the configuration may be stored in the archive and becomes a new official configuration of the relevant service. This configuration can then be used by other providers of the same service via the add and activate operations.
                  +        If the implementation of the configuration service is not using a COM archive then an error is returned.
                  +        This operation can be used to request the store of both COM and non-COM configurations. It does not make sense to support hard-coded configurations as by definition they are fixed in nature.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                storeCurrent
                  +            
                  +            
                  +                Interaction Pattern
                  +                INVOKE
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                INVOKE
                  +                YesYesYes
                  +                COM::ObjectKey serviceProvider HYPERLINK  \l "DATATYPE_ServiceKey" ServiceKey serviceKeyBoolean autoAdd
                  +            
                  +            
                  +                OUT
                  +                ACK
                  +                -
                  +                -
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                Yes
                  +                COM::ObjectId objInstId
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        serviceProvider - If the implementation of the configuration service is not using a COM archive then an UNSUPPORTED_OPERATION error shall be returned.
                  +The serviceProvider field shall contain the domain and object instance identifier of the ServiceProvider COM object that must store its current configuration.
                  +If the service provider is not known an UNKNOWN error shall be returned.
                  +        serviceKey - If the serviceKey field is not NULL then only the specified service of the provider shall be stored.
                  +Wildcard values of '0' are not accepted in the serviceKey fields, an INVALID error shall be returned in this case.
                  +If the serviceKey field is not NULL and the referenced service is not supported by the service provider an UNKNOWN error shall be returned.
                  +The operation shall publish a ConfigurationStore event containing the selected configuration to be stored.
                  +The service provider that implements the selected service shall, after the reception of the event, store its current Configuration in the COM Archive.
                  +Once the relevant service provider has finished storing its configuration it shall publish a ConfigurationStored event with the stored configuration's ObjectId as its body.
                  +If the request is for a hard-coded configuration then the relevant service provider must fail the store request by returning a NULL as a response.
                  +        autoAdd - If the autoAdd field is set to TRUE then, once the stored event has been published, and if it indicates success, the configuration service provider shall add the new configuration to the list of available configurations for the selected service provider. In effect call the add operation.
                  +        objInstId - The response shall contain the object identifier of the new configuration object if successful or NULL if not.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        INVALID: Not a valid Service or Provider object
                  +        UNSUPPORTED_OPERATION: The operation requires the use of a COM archive
                  +        UNKNOWN: The service provider referenced is not known or the referenced service is not known by the provider.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                INVALID
                  +                Defined in COM
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                UNSUPPORTED_OPERATION
                  +                Defined in MAL
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                Not Used
                  +                -
                  +            
                  +        
                  +        
                  +            
                  +            Operation: importXML
                  +        
                  +        
                  +            Overview
                  +        
                  +        The importXML generates a new Configuration object from a XML File and stores the Configuration in the COM archive. Afterwards, the configuration can be added to the list of available configurations using the add operation.
                  +        The operation is only for importing XML configurations that use the standardised format defined by the Configuration service.
                  +        If the implementation of the configuration service is not using a COM archive then an error is returned.
                  +        The importXML can only be used to import COM based configurations.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                importXML
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                Yes
                  +                File xmlFile
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                Yes
                  +                COM::ObjectId objInstId
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        xmlFile - If the implementation of the configuration service is not using a COM archive then an UNSUPPORTED_OPERATION error shall be returned.
                  +The supplied file contained in the xmlFile argument shall be read and converted to COM objects.
                  +If there is a problem converting the XML then an INVALID error shall be returned.
                  +For every object present within the XML file that does not exist in the COM Archive, the Configuration service shall create a new object with the same content and store the object in the COM Archive.
                  +If the object already exists in the COM Archive, nothing shall be created.
                  +If the object already exists in the COM Archive but contains a different content a DUPLICATE error shall be raised.
                  +The newly generated Configuration object shall always reference existing objects in the Archive.
                  +The newly generated Configuration object should be checked for consistency. An INVALID error shall be raised if the configuration is not valid.
                  +If an error is raised then no objects shall be stored in the COM archive and operation shall end.
                  +        objInstId - The return response shall contain in the objInstId field the object identifier of the new configuration object.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        UNSUPPORTED_OPERATION: The operation requires the use of a COM archive
                  +        DUPLICATE: The supplied XML contains a duplicate object definition that is different to the one held in the COM Archive.
                  +        INVALID: The supplied XML was not valid.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                UNSUPPORTED_OPERATION
                  +                Defined in MAL
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                DUPLICATE
                  +                Defined in COM
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                INVALID
                  +                Defined in COM
                  +                Not Used
                  +                -
                  +            
                  +        
                  +        
                  +            Data types
                  +        
                  +        
                  +            Area data types: Common
                  +        
                  +        
                  +            
                  +            Composite: ServiceKey
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ServiceKey
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                1
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                keyArea
                  +                UShort
                  +                No
                  +                The area of this service taken from the numeric Area identifier of the service specification.
                  +            
                  +            
                  +                keyService
                  +                UShort
                  +                No
                  +                The service taken from the numeric Service identifier of the service specification.
                  +            
                  +            
                  +                keyAreaVersion
                  +                UOctet
                  +                No
                  +                The version of this service taken from the Area Version of the area specification.
                  +            
                  +        
                  +        
                  +            Service data types: Directory
                  +        
                  +        
                  +            
                  +            Composite: ProviderDetails
                  +        
                  +        The ProviderDetails structure holds information about a provider of a service and its capabilities. The structure contains a list of AddressDetails structures which should be used when the individual services listed by the provider do not supply address information. A provider may support more than one transport technology and therefore can be reached using more than one address.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ProviderDetails
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                1
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                serviceCapabilities
                  +                List< HYPERLINK  \l "DATATYPE_ServiceCapability" ServiceCapability>
                  +                No
                  +                The service capabilities supported by this service provider
                  +            
                  +            
                  +                providerAddresses
                  +                List< HYPERLINK  \l "DATATYPE_AddressDetails" AddressDetails>
                  +                No
                  +                List of addresses for all services of this service provider unless service specific addresses are supplied in the serviceCapabilities field. If all address information is supplied in the serviceCapabilities field this list should be zero length.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ServiceCapability
                  +        
                  +        The ServiceCapability structure holds information about a service and the capabilities offered by a provider.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ServiceCapability
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                2
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                serviceKey
                  +                 HYPERLINK  \l "DATATYPE_ServiceKey" ServiceKey
                  +                No
                  +                The area, service, and version fields.
                  +            
                  +            
                  +                supportedCapabilitySets
                  +                List<UShort>
                  +                Yes
                  +                The supported capability set numbers for this service provider. If NULL then all capability sets supported.
                  +            
                  +            
                  +                serviceProperties
                  +                List<NamedValue>
                  +                Yes
                  +                Allows the passing of deployment specific service properties.
                  +            
                  +            
                  +                serviceAddresses
                  +                List< HYPERLINK  \l "DATATYPE_AddressDetails" AddressDetails>
                  +                Yes
                  +                Optional set of address details for this specific service which shall be used instead of the provider ones when accessing this service. If all address information is supplied in the containing ProviderDetails structure field this list should be replaced with a NULL.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: AddressDetails
                  +        
                  +        The AddressDetails structure holds all information required by the Directory service about a service providers URI and attributes relating to QoS.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                AddressDetails
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                4
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                supportedLevels
                  +                List<QoSLevel>
                  +                No
                  +                The set of possible QoS levels this service can provide.
                  +            
                  +            
                  +                QoSproperties
                  +                List<NamedValue>
                  +                No
                  +                Any QoS properties relevant to this address URIs and the specified transport.
                  +            
                  +            
                  +                priorityLevels
                  +                UInteger
                  +                No
                  +                The number of QoS priority levels that this provider supports.
                  +            
                  +            
                  +                serviceURI
                  +                URI
                  +                Yes
                  +                The Service URI that identifies the physical location of this service. NULL if represents a shared data provider (Broker).
                  +            
                  +            
                  +                brokerURI
                  +                URI
                  +                Yes
                  +                The broker URI that identifies the physical location of the publish and subscribe interface. NULL if service does not use publish and subscribe operations or if a shared broker is to be used.
                  +            
                  +            
                  +                brokerProviderObjInstId
                  +                Long
                  +                Yes
                  +                The object instance identifier of a ServiceProvider COM object that is the shared broker used by this provider.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ProviderSummary
                  +        
                  +        The ProviderSummary structure holds information about a provider of a service and its capabilities.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ProviderSummary
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                5
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                providerKey
                  +                COM::ObjectKey
                  +                No
                  +                The COM object key of this service provider
                  +            
                  +            
                  +                providerId
                  +                Identifier
                  +                No
                  +                The id of this service provider.
                  +            
                  +            
                  +                providerDetails
                  +                 HYPERLINK  \l "DATATYPE_ProviderDetails" ProviderDetails
                  +                No
                  +                The service capabilities supported by this provider
                  +            
                  +        
                  +        
                  +            
                  +            Composite: PublishDetails
                  +        
                  +        The PublishDetails structure holds all the required information to publish new service provider details.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                PublishDetails
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                6
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                providerId
                  +                Identifier
                  +                No
                  +                The unique service provider id; allows multiple service providers of the same service type to coexist in the directory service.
                  +            
                  +            
                  +                domain
                  +                List<Identifier>
                  +                No
                  +                The domain of the provider.
                  +            
                  +            
                  +                sessionType
                  +                SessionType
                  +                No
                  +                The type of session of the provider.
                  +            
                  +            
                  +                sourceSessionName
                  +                Identifier
                  +                Yes
                  +                If this is part of a replay session, this field holds the session name of the source session. NULL otherwise
                  +            
                  +            
                  +                network
                  +                Identifier
                  +                No
                  +                The network of the provider.
                  +            
                  +            
                  +                providerDetails
                  +                 HYPERLINK  \l "DATATYPE_ProviderDetails" ProviderDetails
                  +                No
                  +                The new service provider details.
                  +            
                  +            
                  +                serviceXML
                  +                List<File>
                  +                Yes
                  +                The optional XML files to associate with this provider.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ServiceFilter
                  +        
                  +        The ServiceFilter structure holds all information required by the Directory service for service lookup operation. The field filters are AND'd together.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ServiceFilter
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                7
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                serviceProviderId
                  +                Identifier
                  +                Yes
                  +                The required service provider. Can be NULL in which case matches all values.
                  +            
                  +            
                  +                domain
                  +                List<Identifier>
                  +                Yes
                  +                The domain to query. Can be NULL in which case matches all values.
                  +            
                  +            
                  +                network
                  +                Identifier
                  +                Yes
                  +                The network to match. Can be NULL in which case matches all values.
                  +            
                  +            
                  +                sessionType
                  +                SessionType
                  +                Yes
                  +                The session type to match. Can be NULL in which case matches all values.
                  +            
                  +            
                  +                sessionName
                  +                Identifier
                  +                Yes
                  +                The session name to match. Can be NULL in which case matches all values.
                  +            
                  +            
                  +                serviceKey
                  +                 HYPERLINK  \l "DATATYPE_ServiceKey" ServiceKey
                  +                Yes
                  +                The service to filter on, values can be NULL which matches all values.
                  +            
                  +            
                  +                requiredCapabilitySets
                  +                List<UShort>
                  +                Yes
                  +                List of required capability sets. If NULL then matches any.
                  +            
                  +        
                  +        
                  +            Service data types: Login
                  +        
                  +        
                  +            
                  +            Composite: Profile
                  +        
                  +        The Profile structure contains details of the user who is logging on to take a specified role.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                Profile
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                1
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                username
                  +                Identifier
                  +                No
                  +                The name of the user.
                  +            
                  +            
                  +                role
                  +                Long
                  +                Yes
                  +                The optional object instance identifier of the role required by the user.
                  +            
                  +        
                  +        
                  +            Service data types: Configuration
                  +        
                  +        
                  +            
                  +            Enumeration: ConfigurationType
                  +        
                  +        The configuration type enumeration holds the possible types of a configuration.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ConfigurationType
                  +            
                  +            
                  +                Short Form Part
                  +                4
                  +            
                  +            
                  +                Enumeration Value
                  +                Numerical Value
                  +                Comment
                  +            
                  +            
                  +                PROVIDER
                  +                1
                  +                The configuration is a Provider configuration.
                  +            
                  +            
                  +                SERVICE
                  +                2
                  +                The configuration is a Service configuration.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ConfigurationObjectSet
                  +        
                  +        The configuration object set holds a set of object identifiers for a single COM object type in a single domain.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ConfigurationObjectSet
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                1
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                objType
                  +                COM::ObjectType
                  +                No
                  +                The COM object type of the configuration objects.
                  +            
                  +            
                  +                domain
                  +                List<Identifier>
                  +                No
                  +                The domain of the configuration objects.
                  +            
                  +            
                  +                objInstIds
                  +                List<Long>
                  +                No
                  +                The set of COM object identifiers that form this configuration set.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ConfigurationObjectDetails
                  +        
                  +        The ConfigurationObjectDetails composite holds a zero to many ConfigurationObjectSet structures. It allows a configuration to reference COM objects from more than one domain or of more than one COM object type.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ConfigurationObjectDetails
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                2
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                configObjects
                  +                List< HYPERLINK  \l "DATATYPE_ConfigurationObjectSet" ConfigurationObjectSet>
                  +                No
                  +                The list of configuration objects.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ServiceConfigurationIdentifier
                  +        
                  +        The ServiceConfigurationIdentifier structure holds the name and service key of a service configuration object.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ServiceConfigurationIdentifier
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                3
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                configName
                  +                Identifier
                  +                No
                  +                
                  +            
                  +            
                  +                serviceKey
                  +                 HYPERLINK  \l "DATATYPE_ServiceKey" ServiceKey
                  +                No
                  +                
                  +            
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        No errors are defined in this specification.
                  +    
                  +
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area003-v001-Common/word/numbering.xml b/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area003-v001-Common/word/numbering.xml
                  new file mode 100644
                  index 00000000..531dbb77
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area003-v001-Common/word/numbering.xml
                  @@ -0,0 +1,57 @@
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area003-v001-Common/word/styles.xml b/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area003-v001-Common/word/styles.xml
                  new file mode 100644
                  index 00000000..ee967ee1
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area003-v001-Common/word/styles.xml
                  @@ -0,0 +1 @@
                  +
                  \ No newline at end of file
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area004-v001-MC/[Content_Types].xml b/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area004-v001-MC/[Content_Types].xml
                  new file mode 100644
                  index 00000000..fbe325d6
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area004-v001-MC/[Content_Types].xml
                  @@ -0,0 +1 @@
                  +
                  \ No newline at end of file
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area004-v001-MC/_rels/.rels b/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area004-v001-MC/_rels/.rels
                  new file mode 100644
                  index 00000000..d6637f3e
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area004-v001-MC/_rels/.rels
                  @@ -0,0 +1 @@
                  +
                  \ No newline at end of file
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area004-v001-MC/word/_rels/document.xml.rels b/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area004-v001-MC/word/_rels/document.xml.rels
                  new file mode 100644
                  index 00000000..d613a6f7
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area004-v001-MC/word/_rels/document.xml.rels
                  @@ -0,0 +1 @@
                  +
                  \ No newline at end of file
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area004-v001-MC/word/document.xml b/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area004-v001-MC/word/document.xml
                  new file mode 100644
                  index 00000000..b1632298
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area004-v001-MC/word/document.xml
                  @@ -0,0 +1,10925 @@
                  +
                  +
                  +    
                  +        
                  +            Specification: MC
                  +        
                  +        
                  +            General
                  +        
                  +        This section contains the specifications for the MC services.
                  +        This section details the MC services, the structures used by the services are detailed in section 4. Both the services and structures are defined in terms of the MO MAL, which is defined in [2], so it is possible to deploy them over any supported protocol and message transport.
                  +        The services defined here are also specified in terms of the COM, which is defined in [3].
                  +        To aid comprehension, several tables are included for each service and operation definition. The table formats are briefly described in section 1.6.3.2 and are the same as those used for the specification of the MO COM services in [3]. 
                  +        All service specifications in this document are part of the MC area, which has a short form number of '4'.
                  +        This area contains the following services:
                  +        Action
                  +        Parameter
                  +        Alert
                  +        Check
                  +        Statistic
                  +        Aggregation
                  +        Conversion
                  +        Group
                  +        
                  +            
                  +            Service: Action
                  +        
                  +        
                  +            Overview
                  +        
                  +        The action service allows consumers to submit an action for execution and to subsequently monitor the execution progress of these actions via the COM activity tracking pattern. The progress of the action is split into two parts, firstly transfer from the consumer to the provider, and secondly execution in the provider.
                  +        An action is submitted to the provider using the submitAction operation, the progress of which can be monitored using the COM activity tracking pattern, which completes when the action has been delivered to the provider. The action is then executed in the provider which can also be monitored using the activity tracking pattern. The submitAction operation takes the object instance identifier of the submitted action and uses that to populate the source fields of the activity tracking events. Coordination may be required between action service consumers to ensure the action object instance identifiers are unique. How this is done is outside the scope of this specification however a good approach is the use of a central COM archive as that can provide the unique instance identifiers.
                  +        The nominal sequence of action submission and execution monitoring are shown in Figure 3-1:
                  +         insert sequence diag here 
                  +        The consumer is responsible for creating and archiving the action instance object and then using the submitAction operation to submit it to the action provider for execution. The action provider reports, using the COM ActivityTracking service, both the execution progress of the submitAction operation and also the execution of the action itself. Once the supplied action instance details have been checked and execution of the action started by the submitAction operation, that operation finishes, whilst the execution of the action possibly continues (depends on the actual action). The final interaction in the sequence shows the execution events of the executing action instance, the '*' at the start of that line indicates zero to many events being published.
                  +        If the execution of an action fails with an error, the action service provider can publish an ActionFailure COM event to hold the error code being reported by the failure. If no error code is required to be reported then there is no need to publish the event as the normal COM ActivityTracking event contains a success indication.
                  +        The service also includes an operation, preCheckAction, which checks that an action would be accepted for execution without actually submitting it for execution. It is expected to be provided by local action proxies, rather than the remote system, to allow for localised checking of things such as link state, argument values, action safety, before sending the action over long and slow space links.
                  +        The action service defines three types of objects, the first type is the ActionIdentity object that holds the name of an action. The second type is the ActionDefinition object that holds the description of an action with the list of required/optional arguments. The third type is the ActionInstance object that holds details of a specific action instance namely a value for each of the arguments of the action.
                  +        
                  +            Table 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Table \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Table_TOC \s 1 1
                  +            Action Service Operations
                  +            "
                  +            :  Action Service Operations
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Area Identifier
                  +                Service Identifier
                  +                Area Number
                  +                Service Number
                  +                Area Version
                  +            
                  +            
                  +                MC
                  +                Action
                  +                4
                  +                1
                  +                1
                  +            
                  +            
                  +                Interaction Pattern
                  +                Operation Identifier
                  +                Operation Number
                  +                Capability Set
                  +            
                  +            
                  +                SUBMIT
                  +                 HYPERLINK  \l "OPERATION_1_submitAction" submitAction
                  +                1
                  +                1
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_1_preCheckAction" preCheckAction
                  +                2
                  +                
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_1_listDefinition" listDefinition
                  +                3
                  +                2
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_1_addAction" addAction
                  +                4
                  +                3
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_1_updateDefinition" updateDefinition
                  +                5
                  +                
                  +            
                  +            
                  +                SUBMIT
                  +                 HYPERLINK  \l "OPERATION_1_removeAction" removeAction
                  +                6
                  +                
                  +            
                  +        
                  +        
                  +            Service-level Requirements
                  +        
                  +        The action service shall provide:
                  +         the capability for submitting actions for execution;
                  +         the capability for submitting actions for check without execution;
                  +         the capability for listing the numeric identifiers for the action definitions;
                  +         the capability for defining a new definition;
                  +         the capability for updating an existing definition;
                  +         the capability for removing an existing definition.
                  +        The list of actions that are supported by the action service shall be declared when deploying that service.
                  +        Each action submission shall include:
                  +         the action definition numeric identifier;
                  +         the action instance numeric identifier;
                  +         the ordered list of action arguments.
                  +        The submitAction operation shall be used to submit a new action instance for execution.
                  +        
                  +            COM usage
                  +        
                  +        Each action of a provider shall be represented by an ActionIdentity COM object.
                  +        The body of the ActionIdentity COM object shall hold the name of the action.
                  +        The definitions of the actions shall be represented as ActionDefinition COM objects.
                  +        The ActionDefinition object shall use the related link to indicate which ActionIdentity object it uses.
                  +        The source link of the ActionIdentity object should be the object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used.
                  +        The source link of the ActionDefinition object should be the object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used.
                  +        Instances of an action that are submitted to a provider using the submitAction operation shall be represented as ActionInstance COM object.
                  +        The object instance identifier for an ActionInstance object shall be populated by the consumer.
                  +        The ActionInstance object shall use the related link to indicate which ActionDefinition object it uses.
                  +        Instances of an action that are submitted to a provider using the submitAction operation shall link to the submitAction OperationActivity object using the source link.
                  +        The source link of the submitAction OperationActivity object should be the object that caused it to be created, most likely an operator login or automated procedure object.
                  +        
                  +            Table 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Table \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Table_TOC \s 1 1
                  +            Action Service Object Types
                  +            "
                  +            :  Action Service Object Types
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Object Number
                  +                Object Name
                  +                Object Body Type
                  +                Related link
                  +                Source link
                  +            
                  +            
                  +                1
                  +                ActionIdentity
                  +                Identifier
                  +                Set to NULL
                  +                The object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used
                  +            
                  +            
                  +                2
                  +                ActionDefinition
                  +                 HYPERLINK  \l "DATATYPE_ActionDefinitionDetails" ActionDefinitionDetails
                  +                1
                  +                The object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used
                  +            
                  +            
                  +                3
                  +                ActionInstance
                  +                 HYPERLINK  \l "DATATYPE_ActionInstanceDetails" ActionInstanceDetails
                  +                2
                  +                The object that caused it to be created, most likely a COM OperationActivity object if created by the submitAction operation
                  +            
                  +        
                  +        
                  +            COM Event Service usage
                  +        
                  +        Execution progress of an action shall be reported using COM ActivityTracking Execution events.
                  +        The Execution event may be reported many times as it is used to report each stage in the execution of the action. It is implementation specific when a progress step is reached and the Execution event will be reported.
                  +        If the execution of an action fails then that failure shall be reported using the normal COM ActivityTracking event pattern, specifically an ActivityTracking Execution event with the success field set to FALSE.
                  +        If the execution of an action fails with an error code then that error code shall be reported using an ActionFailure COM event in addition to the ActivityTracking event used to report the action failure.
                  +        The source of the ActionFailure event shall be the ActivityTracking Execution event that represents the failure stage of the action execution.
                  +        The related field of the ActionFailure event shall link to the ActionInstance object that failed.
                  +        The body of the event shall hold a numeric failure code that is either a MAL error number or a deployment specific code.
                  +        The specification of the deployment specific failure code is outside the scope of this specification and is expected to be agreed out of band.
                  +        
                  +            Table 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Table \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Table_TOC \s 1 1
                  +            Action Service Events
                  +            "
                  +            :  Action Service Events
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Object Number
                  +                Event Name
                  +                Object Body Type
                  +                Related link
                  +                Source link
                  +            
                  +            
                  +                6
                  +                ActionFailure
                  +                UInteger
                  +                3
                  +                COM::ActivityTracking::5
                  +            
                  +        
                  +        
                  +            COM Object Relationships
                  +        
                  +        The Figure below shows the COM object and event relationships for this service:
                  +        
                  +            Figure 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Figure \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Figure_TOC \s 1 1
                  +            Action Service COM object and event relationships
                  +            "
                  +            :  Action Service COM object and event relationships
                  +        
                  +        
                  +            COM Archive Service usage
                  +        
                  +        ActionIdentity objects should be stored in the COM archive.
                  +        ActionDefinition objects should be stored in the COM archive.
                  +        Before an action is sent with the submitAction operation, the ActionInstance object should be stored in the COM archive by the consumer.
                  +        The COM activity tracking events associated with the submission and execution of the action should be stored in the COM archive.
                  +        Any ActionFailure COM event objects should be stored in the COM archive.
                  +        
                  +            COM Activity Service usage
                  +        
                  +        The COM Activity service should be used to monitor the transfer and execution of the submitAction operation.
                  +        The COM Activity service should be used to monitor the transfer and execution of ActionInstance objects.
                  +        The COM activity events for the submitAction operation shall be generated as defined in the COM activity tracking service.
                  +        A Release activity event for the action instance shall be generated when an ActionInstance object is released from a consumer using the submitAction operation.
                  +        The Acceptance activity event for the ActionInstance object, separate from the Acceptance activity event generated for the submitAction operation, shall be generated when an action is received by the destination provider and after any pre-execution checks have been performed.
                  +        The body of the ActionInstance ActivityAcceptance event object shall be populated with the pre-execution checks result.
                  +        The source link of the activity events for the ActionInstance shall be the ActionInstance object.
                  +        The related link of the activity events for the ActionInstance shall be set to NULL.
                  +        In all activity execution events for the action instance the ActivityExecution.stageCount field shall be set to 2 plus the total number of progress stages.
                  +        In the activity execution event, when notification of an action starting is requested, the ActivityExecution.executionStage field shall be set to 1.
                  +        In the activity execution event, when notification of an action progress is requested, the ActivityExecution.executionStage field shall be set to 1 plus the current progress stage. 
                  +        In the activity execution event, when notification of an action completion is requested, the ActivityExecution.executionStage field shall be set to 2 plus the total number of progress stages.
                  +        
                  +            
                  +            Operation: submitAction
                  +        
                  +        
                  +            Overview
                  +        
                  +        The submitAction operation allows a consumer to submit an action to a provider for remote execution.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                submitAction
                  +            
                  +            
                  +                Interaction Pattern
                  +                SUBMIT
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                SUBMIT
                  +                YesYes
                  +                Long actionInstId HYPERLINK  \l "DATATYPE_ActionInstanceDetails" ActionInstanceDetails actionDetails
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        actionInstId - The actionInstId field of the submission shall contain the object instance identifier of the ActionInstance to be used for activity tracking events.
                  +        actionDetails - The actionDetails part of the submission shall contain the argument values and related information of the action instance to be executed.
                  +If the defInstId of the supplied actionDetails field does not match a known ActionDefinition object then an UNKNOWN error shall be returned.
                  +The size of the argumentValues list of the ActionInstanceDetails structure shall be compared to the size of the argument list in the matched ActionDefinition object and an INVALID error shall be returned if they are not the same.
                  +If the ActionInstanceDetails structure contains an argumentIds field value then this shall be compared to the same field in the matched ActionDefinition object and must be the same size and contain the same values, an INVALID error shall be returned if this is not the case.
                  +If the ActionInstanceDetails structure contains an isRawValue field value then the size of this list shall be compared to the size of the argument list in the matched ActionDefinition object and an INVALID error shall be returned if they are not the same.
                  +If the supplied argument values do not match the attribute type specified in the action definition then an INVALID error shall be returned.
                  +A service provider may apply some deployment specific checks to the action instance and can return an INVALID error if they fail.
                  +If an error is raised then no action shall be executed.
                  +The SUBMIT acknowledgement shall be returned once the action has been accepted for execution but before execution starts.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        INVALID: The list sizes held in the ActionInstanceDetails do not match the argument definitions or it contains one or more invalid argument values.
                  +        INVALID: If the two lists are not the same length then the extra information field shall contain the first index of the element in the largest list which does not have corresponding element in the other list.
                  +        UNKNOWN: Submitted action definition is unknown.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                INVALID
                  +                Defined in COM
                  +                List<UInteger>
                  +                The extra information field contains a list of the indexes of the erroneous values from the originating list supplied.
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                Not Used
                  +                -
                  +            
                  +        
                  +        
                  +            
                  +            Operation: preCheckAction
                  +        
                  +        
                  +            Overview
                  +        
                  +        The preCheckAction operation allows a consumer to check that an action would be successfully accepted for execution without actually submitting the action. The operation is expected to be provided by local action proxies rather than the remote system to allow for quick local checks before sending the action over long and slow space links.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                preCheckAction
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                Yes
                  +                 HYPERLINK  \l "DATATYPE_ActionInstanceDetails" ActionInstanceDetails actionDetails
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                Yes
                  +                Boolean accepted
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        actionDetails - The actionDetails part of the submission shall contain the argument values and related information of the action instance to be executed.
                  +If the ActionInstanceDetails structure contains an argumentIds field value then this shall be compared to the same field in the matched ActionDefinition object and must be the same size and contain the same values, an INVALID error shall be returned if this is not the case.
                  +If the supplied argument values do not match the attribute type specified in the action definition then an INVALID error shall be returned.
                  +A service provider may apply some deployment specific checks to the action instance and can return an INVALID error if they fail.
                  +        accepted - The returned Boolean shall be set to TRUE if the action would be accepted successfully; otherwise the operation shall return FALSE.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        INVALID: The argument list contains one or more invalid arguments.
                  +        UNKNOWN: Submitted action definition is unknown.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                INVALID
                  +                Defined in COM
                  +                List<UInteger>
                  +                The extra information field contains a list of the indexes of the erroneous values from the originating list supplied.
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                Not Used
                  +                -
                  +            
                  +        
                  +        
                  +            
                  +            Operation: listDefinition
                  +        
                  +        
                  +            Overview
                  +        
                  +        The listDefinition operation allows a consumer to request the object instance identifiers of the latest ActionIdentity and ActionDefinition objects for the supported actions of the provider.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                listDefinition
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                Yes
                  +                List<Identifier> actionNames
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                Yes
                  +                List< HYPERLINK  \l "DATATYPE_ObjectInstancePair" ObjectInstancePair> actionInstIds
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        actionNames - The actionNames field shall contain a list of action names to retrieve the ActionIdentity and ActionDefinition object instance identifiers for.
                  +The request may contain the wildcard value of '*' to return all supported ActionIdentity and ActionDefinition objects.
                  +The wildcard value should be checked for first, if found no other checks of supplied identifiers shall be made.
                  +If a provided identifier does not include a wildcard and does not match an existing ActionIdentity object then this operation shall fail with an UNKNOWN error.
                  +        actionInstIds - The response shall contain a list of matching ActionIdentity and ActionDefinition object instance identifiers.
                  +The returned list shall maintain the same order as the submitted list unless the wildcard value was included in the request.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return the following error:
                  +        UNKNOWN: One of the supplied identifiers is unknown.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                List<UInteger>
                  +                A list of the indexes of the error values shall be contained in the extra information field.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: addAction
                  +        
                  +        
                  +            Overview
                  +        
                  +        The addAction operation allows a consumer to define one or more actions that do not currently exist. The new ActionIdentity and ActionDefinition objects are expected to be stored in the COM archive by the provider of the action service.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                addAction
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                Yes
                  +                List< HYPERLINK  \l "DATATYPE_ActionCreationRequest" ActionCreationRequest> actionDefDetails
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                Yes
                  +                List< HYPERLINK  \l "DATATYPE_ObjectInstancePair" ObjectInstancePair> newObjInstIds
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        actionDefDetails - The actionDefDetails field shall hold the name and definitions to be added.
                  +The name field must not be the wildcard '*', or empty (an INVALID error shall be returned in this case).
                  +The supplied name must be unique among all ActionIdentity objects for the domain of the provider otherwise a DUPLICATE error shall be raised.
                  +If an error is raised then no new identities and definitions shall be added as a result of this operation call.
                  +If the supplied name matches an existing, but removed, ActionIdentity then that ActionIdentity shall be reused otherwise a new ActionIdentity shall be created.
                  +The provider shall create a new ActionDefinition object and store it, and any new ActionIdentity objects, in the COM archive.
                  +        newObjInstIds - The response shall contain the list of object instance identifiers for the ActionIdentity and new ActionDefinition objects.
                  +The returned list shall maintain the same order as the submitted definitions.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        INVALID: One of the supplied ActionIdentity objects contains an invalid action name.
                  +        DUPLICATE: One or more of the ActionIdentity objects being added has supplied an action name that is already in use in the domain.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                INVALID
                  +                Defined in COM
                  +                List<UInteger>
                  +                The extra information field contains a list of the indexes of the erroneous values from the originating list supplied.
                  +            
                  +            
                  +                DUPLICATE
                  +                Defined in COM
                  +                List<UInteger>
                  +                The extra information field contains a list of the indexes of the erroneous values from the originating request list.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: updateDefinition
                  +        
                  +        
                  +            Overview
                  +        
                  +        The updateDefinition operation allows a consumer to update a definition for one or more actions.
                  +        This differs from deleting an existing action and adding a new definition with the same name in the fact that the ActionIdentity object is not changed between the two definitions.
                  +        The replacement definition should be stored in the COM archive by the service provider. The operation does not remove the previous ActionDefinition object from the COM archive, merely removes the object from the provider. This permits existing, and completed, ActionInstance objects to continue to reference the correct ActionIdentity and ActionDefinition objects in the COM archive.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                updateDefinition
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                YesYes
                  +                List<Long> actionObjInstIdsList< HYPERLINK  \l "DATATYPE_ActionDefinitionDetails" ActionDefinitionDetails> actionDefDetails
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                Yes
                  +                List<Long> newDefInstIds
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        actionObjInstIds - The actionObjInstIds field shall contain the list of object instance identifiers of the ActionIdentity objects to be updated.
                  +The supplied object instance identifiers shall match existing identity objects, an UNKNOWN error shall be raised if this is not the case.
                  +If the actionObjInstIds list contains either NULL or '0' an INVALID error shall be raised.
                  +        actionDefDetails - The actionDefDetails field shall contain the replacement ActionDefinitionDetails.
                  +The two lists shall be ordered the same.
                  +The number of entries in the two lists shall be the same size otherwise an INVALID error shall be returned.
                  +If an error is raised then no definitions shall be modified as a result of this operation call.
                  +The provider shall create a new ActionDefinition object and store it in the COM archive.
                  +The new ActionDefinition object shall be the current ActionDefinition used for the specific ActionIdentity.
                  +        newDefInstIds - The response shall contain the list of object instance identifiers for the new ActionDefinition objects.
                  +The returned list shall maintain the same order as the submitted definitions.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        INVALID: The supplied object instance identifiers list contains either a NULL or '0' or the two supplied lists are not the same length.
                  +        INVALID: If the two lists are not the same length then the extra information field shall contain the first index of the element in the largest list which does not have corresponding element in the other list.
                  +        UNKNOWN: One of the supplied ActionIdentity object instance identifiers is unknown.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                INVALID
                  +                Defined in COM
                  +                List<UInteger>
                  +                The extra information field contains a list of the indexes of the erroneous values from the originating list supplied.
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                List<UInteger>
                  +                A list of the indexes of the error values shall be contained in the extra information field.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: removeAction
                  +        
                  +        
                  +            Overview
                  +        
                  +        The removeAction operation allows a consumer to remove one or more actions from the list of actions supported by the action provider.
                  +        The operation does not remove the ActionIdentity or ActionDefinition object from the COM archive, merely removes the objects from the provider. This permits existing, and completed, ActionInstance objects to continue to reference the correct ActionIdentity and ActionDefinition objects in the COM archive.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                removeAction
                  +            
                  +            
                  +                Interaction Pattern
                  +                SUBMIT
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                SUBMIT
                  +                Yes
                  +                List<Long> actionInstIds
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        actionInstIds - The actionInstIds field shall hold the object instance identifiers of the ActionIdentity objects to be removed from the provider.
                  +The wildcard value of '0' in the list of object instance identifiers shall be supported and matches all actions of the provider.
                  +The wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made.
                  +If a provided ActionIdentity object instance identifier does not include a wildcard and does not match an existing ActionIdentity object then this operation shall fail with an UNKNOWN error.
                  +If a matched definition is still being used by an executing action instance then this operation shall not fail because of this reason.
                  +Matched ActionIdentity objects shall not be removed from the COM archive only the list of ActionIdentity objects in the provider.
                  +Removed ActionIdentity object shall not be allowed to be referenced by new action instances.
                  +If an error is raised then no actions shall be removed as a result of this operation call.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return the following error:
                  +        UNKNOWN: One of the supplied ActionIdentity object instance identifiers is unknown.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                List<UInteger>
                  +                A list of the indexes of the error values shall be contained in the extra information field.
                  +            
                  +        
                  +        
                  +            
                  +            Service: Parameter
                  +        
                  +        
                  +            Overview
                  +        
                  +        The parameter service allows the user to subscribe to parameter value report and optionally be able to set new values. A single PUBSUB operation is provided for monitoring and publishing of parameter values.
                  +        A parameter value also contains a calculation of the validity of the parameter, the flow chart for this calculation is provided in Figure 3-3:
                  +         validity calculation flow chart 
                  +        
                  +        This standard supports the concept of non-standard invalidity states but the meaning and calculation of these is outside the scope of this standard.
                  +        The generation of value reports can be controlled using the enableGeneration operation, which supports the use of groups. Groups must reference parameter identities or groups of parameter identities only.
                  +        The parameter service does not include any value checking, this is delegated to the check service.
                  +        Parameter definitions are maintained using the operations defined in this service but storage of definitions is delegated to the COM archive.
                  +        
                  +            Table 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Table \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Table_TOC \s 1 1
                  +            Parameter Service Operations
                  +            "
                  +            :  Parameter Service Operations
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Area Identifier
                  +                Service Identifier
                  +                Area Number
                  +                Service Number
                  +                Area Version
                  +            
                  +            
                  +                MC
                  +                Parameter
                  +                4
                  +                2
                  +                1
                  +            
                  +            
                  +                Interaction Pattern
                  +                Operation Identifier
                  +                Operation Number
                  +                Capability Set
                  +            
                  +            
                  +                PUB-SUB
                  +                 HYPERLINK  \l "OPERATION_2_monitorValue" monitorValue
                  +                1
                  +                1
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_2_getValue" getValue
                  +                2
                  +                2
                  +            
                  +            
                  +                SUBMIT
                  +                 HYPERLINK  \l "OPERATION_2_setValue" setValue
                  +                3
                  +                3
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_2_enableGeneration" enableGeneration
                  +                4
                  +                4
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_2_listDefinition" listDefinition
                  +                5
                  +                5
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_2_addParameter" addParameter
                  +                6
                  +                6
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_2_updateDefinition" updateDefinition
                  +                7
                  +                
                  +            
                  +            
                  +                SUBMIT
                  +                 HYPERLINK  \l "OPERATION_2_removeParameter" removeParameter
                  +                8
                  +                
                  +            
                  +        
                  +        
                  +            Service-level Requirements
                  +        
                  +        The parameter service shall provide:
                  +         the capability for periodic reporting of predefined parameter values;
                  +         the capability for setting the raw parameter value of a set of parameters;
                  +         the capability for requesting the current value of a set of parameters;
                  +         the capability for controlling reporting of the parameter values;
                  +         the capability for maintaining the list of parameter definitions.
                  +        Each parameter value report shall contain:
                  +         The validity of the parameter value;
                  +         The raw value of the parameter;
                  +         The converted value of the parameter, if applicable.
                  +        The validity of parameter shall be calculated against validity criteria in the parameter definition.
                  +        It shall be possible to update, delete, and add parameter definitions.
                  +        The list of the parameters definitions may be requested.
                  +        The generation of reports of the parameter shall be controlled by the generationEnabled Boolean value in the ParameterDefinitionDetails.
                  +        Setting the generationEnabled field to TRUE shall enable generation of reports for a specific parameter.
                  +        If a parameter is required to send periodic reports then the time between these reports shall be controlled using the reportInterval Duration value in the ParameterDefinitionDetails.
                  +        A reportInterval value of '0' shall mean no periodic reports shall be sent; reports must be triggered by another implementation-specific mechanism in this case.
                  +        The generationEnabled values can be set by using the enableGeneration operation.
                  +        The generationEnabled and reportInterval values can be set by using the updateDefinition operation.
                  +        For onboard parameters, the interval should be a multiple of the minimum sampling interval of those parameters.
                  +        If an interval that is not supported by the provider is requested, then an INVALID error shall be returned, and the change rejected.
                  +        If the parameter is periodic and reported via a periodic aggregation, and a new report has not been received in the aggregation period, then the validity shall be set to EXPIRED by setting the ParameterValue validityState field to '1'.
                  +        If the parameter raw value cannot be obtained, or calculated for synthetic parameters, then the validity state shall be INVALID_RAW by setting the ParameterValue validityState field to '2' and the rawValue set to NULL.
                  +        If the validityExpression field is NULL, or the validity expression evaluates to TRUE, and the ParameterDefinitionDetails either does not contain a conversion or the conversion is successful, then the validity state shall be set to VALID by setting the ParameterValue validityState field to '0'.
                  +        If the validityExpression field is NULL, or the validity expression evaluates to TRUE, and the conversion of the parameter value fails (for example an unexpected value for a discrete conversion), then the validity state shall be INVALID_CONVERSION by setting the ParameterValue validityState field to '3'.
                  +        If the validityExpression field is not NULL and the parameters used to determine the expression are not VALID, then the validity state shall be set to UNVERIFIED by setting the ParameterValue validityState field to '4'.
                  +        If the validityExpression field is not NULL and the validity expression evaluates to FALSE, then the validity state shall be set to INVALID by setting the ParameterValue validityState field to '5'.
                  +        If the validity of the parameter is INVALID_CONVERSION then the convertedValue of the ParameterValue shall be set to NULL.
                  +        If the validity of the parameter is either UNVERIFIED or INVALID and the ParameterDefinitionDetails contains a conversion, then the convertedValue of the ParameterValue shall contain the converted value.
                  +        It is supported that other, implementation specific, mechanisms may be used to determine parameter validity.
                  +        It is supported that other, deployment specific, validityState values be used however the meaning of those values is deployment specific and outside the scope of this standard. They must use values greater than 127.
                  +        
                  +            COM usage
                  +        
                  +        Each parameter of a provider shall be represented by a ParameterIdentity COM object.
                  +        The body of the ParameterIdentity COM object shall hold the name of the parameter.
                  +        The definitions of the parameters shall be represented as ParameterDefinition COM objects.
                  +        Parameter value report shall be represented as ParameterValueInstance COM objects.
                  +        The ParameterDefinition object shall use the related link to indicate which ParameterIdentity object it uses.
                  +        The ParameterValueInstance object shall use the related link to indicate which ParameterDefinition object it uses.
                  +        The source link of the ParameterIdentity object should be the object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used.
                  +        The source link of the ParameterDefinition object should be the object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used.
                  +        The source link of the ParameterValueInstance object should be the object that caused the report to be generated.
                  +        The source link of the ParameterValueInstance object shall be NULL for periodic reports.
                  +        
                  +            Table 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Table \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Table_TOC \s 1 1
                  +            Parameter Service Object Types
                  +            "
                  +            :  Parameter Service Object Types
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Object Number
                  +                Object Name
                  +                Object Body Type
                  +                Related link
                  +                Source link
                  +            
                  +            
                  +                1
                  +                ParameterIdentity
                  +                Identifier
                  +                Set to NULL
                  +                The object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used
                  +            
                  +            
                  +                2
                  +                ParameterDefinition
                  +                 HYPERLINK  \l "DATATYPE_ParameterDefinitionDetails" ParameterDefinitionDetails
                  +                1
                  +                The object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used
                  +            
                  +            
                  +                3
                  +                ParameterValueInstance
                  +                 HYPERLINK  \l "DATATYPE_ParameterValue" ParameterValue
                  +                2
                  +                The object that caused the value to be generated or NULL for periodic reports
                  +            
                  +        
                  +        
                  +            COM Object Relationships
                  +        
                  +        The Figure below shows the COM object relationships for this service:
                  +        
                  +            Figure 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Figure \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Figure_TOC \s 1 1
                  +            Parameter Service COM object relationships
                  +            "
                  +            :  Parameter Service COM object relationships
                  +        
                  +        
                  +            COM Archive Service usage
                  +        
                  +        ParameterIdentity and ParameterDefinition objects should be stored in the COM archive.
                  +        When a parameter value report is published, the ParameterValueInstance object should be stored in the COM archive.
                  +        
                  +            
                  +            Operation: monitorValue
                  +        
                  +        
                  +            Overview
                  +        
                  +        The monitorValue operation allows a consumer to subscribe for parameter value reports.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                monitorValue
                  +            
                  +            
                  +                Interaction Pattern
                  +                PUBLISH-SUBSCRIBE
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                OUT
                  +                PUBLISH
                  +                YesYes
                  +                COM::ObjectId objId HYPERLINK  \l "DATATYPE_ParameterValue" ParameterValue newValue
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        objId - The MAL EntityKey.firstSubKey shall contain the parameter name.
                  +The MAL EntityKey.secondSubKey shall contain the ParameterIdentity object instance identifier.
                  +The MAL EntityKey.thirdSubKey shall contain the ParameterDefinition object instance identifier.
                  +The MAL EntityKey.fourthSubKey shall contain the new ParameterValueInstance object instance identifier.
                  +The timestamp of the ParameterValueInstance report shall be taken from the publish message and shall be the time of the parameter value update.
                  +The publish message shall include the ObjectId of the source link of the report.
                  +If no source link is needed then the ObjectId shall be replaced with a NULL.
                  +        newValue - The second part of the publish message shall be the ParameterValueInstance object value.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation does not return any errors.
                  +        
                  +            
                  +            Operation: getValue
                  +        
                  +        
                  +            Overview
                  +        
                  +        The getValue operation returns the latest received value for a requested parameter.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                getValue
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                Yes
                  +                List<Long> paramInstIds
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                Yes
                  +                List< HYPERLINK  \l "DATATYPE_ParameterValueDetails" ParameterValueDetails> paramValDetails
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        paramInstIds - The paramInstIds field shall provide the list of ParameterIdentity object instance identifiers.
                  +The wildcard value of '0' shall be supported and matches all parameters of the provider.
                  +The wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made.
                  +If a requested parameter is unknown then an UNKNOWN error shall be returned.
                  +If a parameter is being reported periodically, using the operation shall not reset the reportInterval timer.
                  +        paramValDetails - The response shall contain a list of returned ParameterIdentity and ParameterDefinition object instance identifier pairs and a matching list of parameter values.
                  +The new value shall not be published via the monitorValue operation.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return the following error:
                  +        UNKNOWN: One or more of the requested parameters is unknown.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                List<UInteger>
                  +                A list of the indexes of the error values shall be contained in the extra information field.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: setValue
                  +        
                  +        
                  +            Overview
                  +        
                  +        The setValue operation allows a consumer to set the raw value for one or more parameters.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                setValue
                  +            
                  +            
                  +                Interaction Pattern
                  +                SUBMIT
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                SUBMIT
                  +                Yes
                  +                List< HYPERLINK  \l "DATATYPE_ParameterRawValue" ParameterRawValue> newRawValues
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        newRawValues - The submitted newRawValues shall hold a list of ParameterRawValues that contain the ParameterIdentity object instance identifier and the respective raw value to be set.
                  +If the paramInstId field contains the wildcard value of '0' then an INVALID error shall be returned.
                  +If a requested ParameterIdentity is unknown then an UNKNOWN error shall be returned.
                  +If a request ParameterIdentity is not settable due to it being read only then a READONLY error shall be returned.
                  +The rawValue shall contain the new parameter raw value to be set.
                  +If the supplied new parameter raw value does not match the defined type for the ParameterIdentity then an INVALID error shall be returned.
                  +If an error is raised then no modifications shall be made as a result of this operation call.
                  +The parameter values shall be set concurrently, by this it is meant that all values are set at the same time without interleaving of other values being (ATOMIC behaviour). How this is implemented is an implementation detail.
                  +The service provider shall create new ParameterValueInstance objects for the updated parameter values, store these in the COM Archive, and publish these new values.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        UNKNOWN: One or more of the referenced parameters is unknown.
                  +        INVALID: One of the supplied parameter values contains an invalid value.
                  +        READONLY: One or more of the parameters being set is read only.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                List<UInteger>
                  +                A list of the indexes of the error values shall be contained in the extra information field.
                  +            
                  +            
                  +                INVALID
                  +                Defined in COM
                  +                List<UInteger>
                  +                The extra information field contains a list of the indexes of the erroneous values from the originating list supplied.
                  +            
                  +            
                  +                READONLY
                  +                70020
                  +                List<UInteger>
                  +                A list of the indexes of the error values shall be contained in the extra information field.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: enableGeneration
                  +        
                  +        
                  +            Overview
                  +        
                  +        The enableGeneration operation allows a consumer to control whether reports for specific parameters are generated or not. The operation allows the consumer to select the parameters directly or indirectly using groups.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                enableGeneration
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                YesYes
                  +                Boolean isGroupIdsList<COM::InstanceBooleanPair> enableInstances
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                Yes
                  +                List<Long> newObjInstIds
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        isGroupIds - If the isGroupIds field is TRUE then the enableInstances field shall contain GroupIdentity object instance identifiers, otherwise the field contains ParameterIdentity object instance identifiers.
                  +The ParameterIdentity objects referenced, either directly or indirectly via groups, by the enableInstances field shall be the ParameterIdentity objects to match.
                  +The id of the enableInstances field shall support the wildcard value of '0' and matches all ParameterIdentity objects of the provider.
                  +The service provider shall check for the wildcard value in the list of object instance identifiers in the enableInstances field first and if found no other checks of supplied object instance identifiers shall be made.
                  +If the enableInstances field contains a value of TRUE then reports for matching ParameterIdentity objects shall be generated, a value of FALSE requests that reports will not be generated.
                  +No error shall be raised if the enableInstances Boolean value supplied is the same as the current generationEnabled field of the definition for a matched ParameterIdentity object i.e. enabling an already enabled parameter will not result in an error.
                  +If a requested ParameterIdentity or GroupIdentity object is unknown then an UNKNOWN error shall be returned.
                  +If a requested Group, or the Group objects referenced by that Group, does not contain ParameterIdentity objects then an INVALID error shall be returned.
                  +If an error is raised then no modifications shall be made as a result of this operation call.
                  +The provider shall create and store a new ParameterDefinition object in the COM archive if the generationEnabled field is changed.
                  +If a new ParameterDefinition object is created then that new object shall be the current ParameterDefinition used for the specific ParameterIdentity.
                  +        enableInstances - If the generation of reports is being enabled, and the parameter is defined as being periodic, then the provider shall generate a report immediately and start the report interval from that report.
                  +        newObjInstIds - The response shall contain the list of object instance identifiers for the new ParameterDefinition objects.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        UNKNOWN: One or more of the requested parameters or groups is unknown.
                  +        INVALID: One of the supplied groups is either not a group of groups or a group of ParameterIdentity objects.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                List<UInteger>
                  +                A list of the indexes of the error values shall be contained in the extra information field.
                  +            
                  +            
                  +                INVALID
                  +                Defined in COM
                  +                List<UInteger>
                  +                The extra information field contains a list of the indexes of the erroneous values from the originating list supplied.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: listDefinition
                  +        
                  +        
                  +            Overview
                  +        
                  +        The listDefinition operation allows a consumer to request the latest object instance identifiers of the ParameterIdentity and ParameterDefinition objects for the supported parameters of the provider.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                listDefinition
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                Yes
                  +                List<Identifier> paramNames
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                Yes
                  +                List< HYPERLINK  \l "DATATYPE_ObjectInstancePair" ObjectInstancePair> objInstIds
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        paramNames - The paramNames field shall contain a list of parameter names to retrieve the ParameterIdentity and ParameterDefinition object instance identifiers for.
                  +The paramNames field may contain the wildcard value of '*' to return all supported ParameterIdentity and ParameterDefinition objects.
                  +The wildcard value should be checked for first, if found no other checks of supplied identifiers shall be made.
                  +If a provided identifier does not include a wildcard and does not match an existing ParameterIdentity object then this operation shall fail with an UNKNOWN error.
                  +        objInstIds - The response shall contain a list of matching ParameterIdentity and ParameterDefinition object instance identifier pairs.
                  +The returned list shall maintain the same order as the submitted list unless the wildcard value was included in the request.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return the following error:
                  +        UNKNOWN: One of the supplied identifiers is unknown.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                List<UInteger>
                  +                A list of the indexes of the error values shall be contained in the extra information field.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: addParameter
                  +        
                  +        
                  +            Overview
                  +        
                  +        The addParameter operation allows a consumer to define one or more parameters that do not currently exist.
                  +        The new ParameterIdentity and ParameterDefinition objects are expected to be stored in the COM archive by the provider of the parameter service.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                addParameter
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                Yes
                  +                List< HYPERLINK  \l "DATATYPE_ParameterCreationRequest" ParameterCreationRequest> paramDefDetails
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                Yes
                  +                List< HYPERLINK  \l "DATATYPE_ObjectInstancePair" ObjectInstancePair> newObjInstIds
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        paramDefDetails - The paramDefDetails field shall hold the name and the ParameterDefinitionDetails to be added.
                  +The name field must not be the wildcard '*', or empty (an INVALID error shall be returned in this case).
                  +If the supplied reportInterval value is not supported by the provider then an INVALID error shall be returned.
                  +The supplied name must be unique among all ParameterIdentity objects for the domain of the provider otherwise a DUPLICATE error shall be raised.
                  +If an error is raised then no new identities and definitions shall be added as a result of this operation call.
                  +If the supplied name matches an existing, but removed, ParameterIdentity then that ParameterIdentity shall be reused otherwise a new ParameterIdentity shall be created.
                  +The provider shall create a new ParameterDefinition object and store it, and any new ParameterIdentity objects, in the COM archive.
                  +        newObjInstIds - The response shall contain the list of object instance identifiers for the ParameterIdentity and new ParameterDefinition objects.
                  +The returned list shall maintain the same order as the submitted definitions.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        INVALID: One of the supplied ParameterIdentity objects contains an invalid name or a supplied interval is not supported by the provider.
                  +        DUPLICATE: One or more of the ParameterIdentity objects being added has supplied a parameter name that is already in use in the domain.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                INVALID
                  +                Defined in COM
                  +                List<UInteger>
                  +                The extra information field contains a list of the indexes of the erroneous values from the originating list supplied.
                  +            
                  +            
                  +                DUPLICATE
                  +                Defined in COM
                  +                List<UInteger>
                  +                The extra information field contains a list of the indexes of the erroneous values from the originating request list.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: updateDefinition
                  +        
                  +        
                  +            Overview
                  +        
                  +        The updateDefinition operation allows a consumer to update a definition for one or more parameters.
                  +        This differs from deleting an existing parameter and adding a new definition with the same parameter name in the fact that the ParameterIdentity object is not changed between the two definitions.
                  +        The replacement definition should be stored in the COM archive by the service provider. The operation does not remove the previous object from the COM archive, merely removes the object from the provider.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                updateDefinition
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                YesYes
                  +                List<Long> paramInstIdsList< HYPERLINK  \l "DATATYPE_ParameterDefinitionDetails" ParameterDefinitionDetails> paramDefDetails
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                Yes
                  +                List<Long> newObjInstIds
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        paramInstIds - The paramInstIds field shall contain the object instance identifiers of the ParameterIdentity objects to be updated.
                  +The supplied object instance identifiers shall match existing identity objects, an UNKNOWN error shall be raised if this is not the case.
                  +If the paramInstIds list contains either NULL or '0' an INVALID error shall be raised.
                  +        paramDefDetails - The paramDefDetails field shall contain the replacement ParameterDefinitionDetails.
                  +The two lists shall be ordered the same.
                  +The number of entries in the two lists shall be the same size otherwise an INVALID error shall be returned.
                  +If the supplied reportInterval value is not supported by the provider then an INVALID error shall be returned.
                  +If an error is raised then no definitions shall be updated as a result of this operation call.
                  +The provider shall create a new ParameterDefinition object and store it in the COM archive.
                  +The new ParameterDefinition object shall be the current ParameterDefinition used for the specific ParameterIdentity.
                  +        newObjInstIds - The response shall contain the list of object instance identifiers for the new ParameterDefinition objects.
                  +The returned list shall maintain the same order as the submitted definitions.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        INVALID: The supplied object instance identifiers list contains either a NULL or '0' or the two supplied lists are not the same length or a supplied interval is not supported by the provider.
                  +        INVALID: If the two lists are not the same length then the extra information field shall contain the first index of the element in the largest list which does not have corresponding element in the other list.
                  +        UNKNOWN: One of the supplied ParameterIdentity object instance identifiers is unknown.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                INVALID
                  +                Defined in COM
                  +                List<UInteger>
                  +                The extra information field contains a list of the indexes of the erroneous values from the originating list supplied.
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                List<UInteger>
                  +                A list of the indexes of the error values shall be contained in the extra information field.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: removeParameter
                  +        
                  +        
                  +            Overview
                  +        
                  +        The removeParameter operation allows a consumer to remove one or more parameters from the list of parameters supported by the parameter provider.
                  +        The operation does not remove the ParameterIdentity or ParameterDefinition objects from the COM archive, merely removes the objects from the provider. This permits existing parameter values to continue to reference the correct ParameterIdentity and ParameterDefinition objects in the COM archive.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                removeParameter
                  +            
                  +            
                  +                Interaction Pattern
                  +                SUBMIT
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                SUBMIT
                  +                Yes
                  +                List<Long> paramInstIds
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        paramInstIds - The paramInstIds field shall hold the object instance identifiers of the ParameterIdentity objects to be removed from the provider.
                  +The list may contain the wildcard value of '0'.
                  +The wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made.
                  +If a provided ParameterIdentity object instance identifier does not include a wildcard and does not match an existing parameter identity object then this operation shall fail with an UNKNOWN error.
                  +Matched ParameterIdentity and ParameterDefinition objects shall not be removed from the COM archive only the list of ParameterIdentity and ParameterDefinition objects from the provider.
                  +If an error is raised then no parameters shall be removed as a result of this operation call.
                  +If the operation succeeds then the provider shall not publish parameter values for the deleted ParameterIdentity objects anymore.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return the following error:
                  +        UNKNOWN: One of the supplied ParameterIdentity object instance identifiers is unknown.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                List<UInteger>
                  +                A list of the indexes of the error values shall be contained in the extra information field.
                  +            
                  +        
                  +        
                  +            
                  +            Service: Alert
                  +        
                  +        
                  +            Overview
                  +        
                  +        The alert service defines the structures and patterns for the publishing and monitoring of alerts. The alert service uses COM event service to monitor and publish alert events.
                  +        The generation of alerts can be controlled using the enableGeneration operation, which supports the use of groups. Groups must reference either other groups or alerts only.
                  +        Alert definitions are maintained using the operations defined in this service but storage of definitions is delegated to the COM archive.
                  +        
                  +            Table 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Table \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Table_TOC \s 1 1
                  +            Alert Service Operations
                  +            "
                  +            :  Alert Service Operations
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Area Identifier
                  +                Service Identifier
                  +                Area Number
                  +                Service Number
                  +                Area Version
                  +            
                  +            
                  +                MC
                  +                Alert
                  +                4
                  +                3
                  +                1
                  +            
                  +            
                  +                Interaction Pattern
                  +                Operation Identifier
                  +                Operation Number
                  +                Capability Set
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_3_enableGeneration" enableGeneration
                  +                1
                  +                1
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_3_listDefinition" listDefinition
                  +                2
                  +                2
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_3_addAlert" addAlert
                  +                3
                  +                3
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_3_updateDefinition" updateDefinition
                  +                4
                  +                
                  +            
                  +            
                  +                SUBMIT
                  +                 HYPERLINK  \l "OPERATION_3_removeAlert" removeAlert
                  +                5
                  +                
                  +            
                  +        
                  +        
                  +            Service-level Requirements
                  +        
                  +        The alert service shall provide:
                  +         the capability for reporting of alerts;
                  +         the capability for controlling reporting of alerts;
                  +         the capability for maintaining the list of alert definitions.
                  +        The alert reporting service shall provide the capability to enable and disable the generation of alert reports.
                  +        It shall be possible to update, delete, and add alert definitions.
                  +        The list of the alert definitions may be requested.
                  +        The generation of alerts shall be controlled by the generationEnabled Boolean value in the AlertDefinitionDetails.
                  +        Setting the generationEnabled field to TRUE shall enable generation of instances of that alert.
                  +        The generationEnabled value can be set by using either the enableGeneration or updateDefinition operations.
                  +        The alert instances shall be published as events using the COM event operations.
                  +        
                  +            COM usage
                  +        
                  +        Each alert of a provider shall be represented by an AlertIdentity COM object.
                  +        The body of the AlertIdentity COM object shall hold the name of the alert.
                  +        The definitions of the alerts shall be represented as AlertDefinition COM objects.
                  +        Instances of an alert shall be represented as an AlertEvent COM event.
                  +        The AlertDefinition object shall use the related link to indicate which AlertIdentity object it uses.
                  +        The AlertEvent object shall use the related link to indicate which AlertDefinition object it uses.
                  +        The source link of the AlertIdentity object should be the object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used.
                  +        The source link of the AlertDefinition object should be the object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used.
                  +        
                  +            Table 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Table \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Table_TOC \s 1 1
                  +            Alert Service Object Types
                  +            "
                  +            :  Alert Service Object Types
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Object Number
                  +                Object Name
                  +                Object Body Type
                  +                Related link
                  +                Source link
                  +            
                  +            
                  +                1
                  +                AlertIdentity
                  +                Identifier
                  +                Set to NULL
                  +                The object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used
                  +            
                  +            
                  +                2
                  +                AlertDefinition
                  +                 HYPERLINK  \l "DATATYPE_AlertDefinitionDetails" AlertDefinitionDetails
                  +                1
                  +                The object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used
                  +            
                  +        
                  +        
                  +            COM Event Service usage
                  +        
                  +        When an alert is generated it shall be represented as a COM event.
                  +        The event shall be published using the COM event service.
                  +        The source link of the AlertEvent object shall be the object that caused the event to be generated.
                  +        
                  +            Table 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Table \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Table_TOC \s 1 1
                  +            Alert Service Events
                  +            "
                  +            :  Alert Service Events
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Object Number
                  +                Event Name
                  +                Object Body Type
                  +                Related link
                  +                Source link
                  +            
                  +            
                  +                3
                  +                AlertEvent
                  +                 HYPERLINK  \l "DATATYPE_AlertEventDetails" AlertEventDetails
                  +                2
                  +                The object that caused the event to be generated
                  +            
                  +        
                  +        
                  +            COM Object Relationships
                  +        
                  +        The Figure below shows the COM object and event relationships for this service:
                  +        
                  +            Figure 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Figure \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Figure_TOC \s 1 1
                  +            Alert Service COM object and event relationships
                  +            "
                  +            :  Alert Service COM object and event relationships
                  +        
                  +        
                  +            COM Archive Service usage
                  +        
                  +        AlertIdentity and AlertDefinition objects should be stored in the COM archive.
                  +        When an alert event is published, the AlertEvent object should be stored in the COM archive by the publisher.
                  +        
                  +            
                  +            Operation: enableGeneration
                  +        
                  +        
                  +            Overview
                  +        
                  +        The enableGeneration operation allows a consumer to control whether updates for specific alerts are generated or not. The operation allows the consumer to select the alerts directly or indirectly using groups.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                enableGeneration
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                YesYes
                  +                Boolean isGroupIdsList<COM::InstanceBooleanPair> enableInstances
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                Yes
                  +                List<Long> newObjInstIds
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        isGroupIds - If the isGroupIds field is TRUE then the enableInstances field shall contain GroupIdentity object instance identifiers, otherwise the field contains AlertIdentity object instance identifiers.
                  +The AlertIdentity objects referenced, either directly or indirectly via groups, by the enableInstances field shall be the AlertIdentity objects to match.
                  +The id of the enableInstances field shall support the wildcard value of '0' and matches all AlertIdentity objects of the provider.
                  +The service provider shall check for the wildcard value in the list of object instance identifiers in the enableInstances field first and if found no other checks of supplied object instance identifiers shall be made.
                  +If the enableInstances field contains a value of TRUE then instances of matching AlertIdentity objects shall be generated, a value of FALSE requests that instances will not be generated.
                  +No error shall be raised if the enableInstances Boolean value supplied is the same as the current generationEnabled field for an alert object i.e. enabling an already enabled alert will not result in an error.
                  +If a requested AlertIdentity or GroupIdentity object is unknown then an UNKNOWN error shall be returned.
                  +If a requested Group, or the Group objects referenced by that Group, does not contain AlertIdentity objects then an INVALID error shall be returned.
                  +If an error is raised then no modifications shall be made as a result of this operation call.
                  +The provider shall create and store a new AlertDefinition object in the COM archive if the generationEnabled field is changed.
                  +If a new AlertDefinition object is created then that new object shall be the current AlertDefinition used for the specific AlertIdentity.
                  +        enableInstances - 
                  +        newObjInstIds - The response shall contain the list of object instance identifiers for the new AlertDefinition objects.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        INVALID: One of the supplied groups is either not a group of groups or a group of AlertIdentity objects.
                  +        UNKNOWN: One or more of the requested alerts or group objects is unknown.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                INVALID
                  +                Defined in COM
                  +                List<UInteger>
                  +                The extra information field contains a list of the indexes of the erroneous values from the originating list supplied.
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                List<UInteger>
                  +                A list of the indexes of the error values shall be contained in the extra information field.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: listDefinition
                  +        
                  +        
                  +            Overview
                  +        
                  +        The listDefinition operation allows a consumer to request the latest object instance identifiers of the AlertIdentity and AlertDefinition objects for the supported alerts of the provider.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                listDefinition
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                Yes
                  +                List<Identifier> alertNames
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                Yes
                  +                List< HYPERLINK  \l "DATATYPE_ObjectInstancePair" ObjectInstancePair> alertObjInstIds
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        alertNames - The alertNames field shall contain a list of alert names to retrieve the AlertIdentity and AlertDefinition object instance identifiers for.
                  +The alertNames field may contain the wildcard value of '*' to return all supported AlertIdentity and AlertDefinition objects.
                  +The wildcard value should be checked for first, if found no other checks of supplied identifiers shall be made.
                  +If a provided identifier does not include a wildcard and does not match an existing AlertIdentity object then this operation shall fail with an UNKNOWN error.
                  +        alertObjInstIds - The response shall contain a list of matching AlertIdentity and AlertDefinition object instance identifiers.
                  +The returned list shall maintain the same order as the submitted list unless the wildcard value was included in the request.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return the following error:
                  +        UNKNOWN: One of the supplied identifiers is unknown.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                List<UInteger>
                  +                A list of the indexes of the error values shall be contained in the extra information field.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: addAlert
                  +        
                  +        
                  +            Overview
                  +        
                  +        The addAlert operation allows a consumer to define one or more alerts that do not currently exist.
                  +        The new AlertIdentity and AlertDefinition objects are expected to be stored in the COM archive by the provider of the alert service.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                addAlert
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                Yes
                  +                List< HYPERLINK  \l "DATATYPE_AlertCreationRequest" AlertCreationRequest> alertDefDetails
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                Yes
                  +                List< HYPERLINK  \l "DATATYPE_ObjectInstancePair" ObjectInstancePair> newObjInstIds
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        alertDefDetails - The alertDefDetails field shall hold the name and the AlertDefinitionDetails to be added.
                  +The name field must not be the wildcard '*', or empty (an INVALID error shall be returned in this case).
                  +The supplied name must be unique among all AlertIdentity objects for the domain of the provider otherwise a DUPLICATE error shall be raised.
                  +If an error is raised then no new identities and definitions shall be added as a result of this operation call.
                  +If the supplied name matches an existing, but removed, AlertIdentity then that AlertIdentity shall be reused otherwise a new AlertIdentity shall be created.
                  +The provider shall create a new AlertDefinition object and store it, and any new AlertIdentity objects, in the COM archive.
                  +        newObjInstIds - The response shall contain the list of object instance identifiers for the AlertIdentity and new AlertDefinition objects.
                  +The returned list shall maintain the same order as the submitted definitions.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        DUPLICATE: One or more of the AlertIdentity objects being added has supplied an alert name that is already in use in the domain.
                  +        INVALID: One of the supplied AlertIdentity objects contains an invalid name.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                DUPLICATE
                  +                Defined in COM
                  +                List<UInteger>
                  +                The extra information field contains a list of the indexes of the erroneous values from the originating request list.
                  +            
                  +            
                  +                INVALID
                  +                Defined in COM
                  +                List<UInteger>
                  +                The extra information field contains a list of the indexes of the erroneous values from the originating list supplied.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: updateDefinition
                  +        
                  +        
                  +            Overview
                  +        
                  +        The updateDefinition operation allows a consumer to update a definition for one or more alerts.
                  +        This differs from deleting an existing alert and adding a new definition with the same alert name in the fact that the AlertIdentity object is not changed between the two definitions.
                  +        The replacement definition should be stored in the COM archive by the service provider. The operation does not remove the previous object from the COM archive, merely removes the object from the provider.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                updateDefinition
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                YesYes
                  +                List<Long> alertObjInstIdsList< HYPERLINK  \l "DATATYPE_AlertDefinitionDetails" AlertDefinitionDetails> alertDefDetails
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                Yes
                  +                List<Long> newObjInstIds
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        alertObjInstIds - The alertObjInstIds field shall contain the object instance identifiers of the AlertIdentity objects to be updated.
                  +The supplied object instance identifiers shall match existing identity objects, an UNKNOWN error shall be raised if this is not the case.
                  +If the alertObjInstIds list contains either NULL or '0' an INVALID error shall be raised.
                  +        alertDefDetails - The alertDefDetails field shall contain the replacement AlertDefinitionDetails.
                  +The two lists shall be ordered the same.
                  +The number of entries in the two lists shall be the same size otherwise an INVALID error shall be returned.
                  +If an error is raised then no definitions shall be updated as a result of this operation call.
                  +The provider shall create a new AlertDefinition object and store it in the COM archive.
                  +The new AlertDefinition object shall be the current AlertDefinition used for the specific AlertIdentity.
                  +        newObjInstIds - The response shall contain the list of object instance identifiers for the new AlertDefinition objects.
                  +The returned list shall maintain the same order as the submitted definitions.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        INVALID: One of the supplied AlertDefinition objects contains an invalid value or the two supplied lists are not the same length.
                  +        INVALID: If the two lists are not the same length then the extra information field shall contain the first index of the element in the largest list which does not have corresponding element in the other list.
                  +        UNKNOWN: One of the supplied AlertIdentity object instance identifiers is unknown.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                INVALID
                  +                Defined in COM
                  +                List<UInteger>
                  +                The extra information field contains a list of the indexes of the erroneous values from the originating list supplied.
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                List<UInteger>
                  +                A list of the indexes of the error values shall be contained in the extra information field.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: removeAlert
                  +        
                  +        
                  +            Overview
                  +        
                  +        The removeAlert operation allows a consumer to remove one or more definitions from the list of alerts supported by the alert provider.
                  +        The operation does not remove the AlertIdentity or AlertDefinition objects from the COM archive, merely removes the objects from the provider. This permits existing AlertEvent objects to continue to reference the correct AlertDefinition object in the COM archive.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                removeAlert
                  +            
                  +            
                  +                Interaction Pattern
                  +                SUBMIT
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                SUBMIT
                  +                Yes
                  +                List<Long> alertInstIds
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        alertInstIds - The alertInstIds field shall hold the object instance identifiers of the AlertIdentity objects to be removed from the provider.
                  +The list may contain the wildcard value of '0'.
                  +The wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made.
                  +If a provided AlertIdentity object instance identifier does not include a wildcard and does not match an existing AlertIdentity object then this operation shall fail with an UNKNOWN error.
                  +Matched AlertIdentity objects shall not be removed from the COM archive only the list of AlertIdentity objects in the provider.
                  +If an error is raised then no alerts shall be removed as a result of this operation call.
                  +If the operation succeeds then the provider shall not publish AlertEvent events for the deleted AlertIdentity objects anymore.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return the following error:
                  +        UNKNOWN: One of the supplied AlertIdentity object instance identifiers is unknown.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                List<UInteger>
                  +                A list of the indexes of the error values shall be contained in the extra information field.
                  +            
                  +        
                  +        
                  +            
                  +            Service: Check
                  +        
                  +        
                  +            Overview
                  +        
                  +        The check service allows the user to monitor and control the checking of parameters values against check definitions including limit sets. Violations of these defined checks are published using the COM event service.
                  +        The check service allows the consumer to define checks and then link the check definition to a parameter to be monitored. Figure 3-6 shows the nominal sequence of operations for the check service:
                  +        ---- check sequence diag ----
                  +        Check service nominal sequence
                  +        A consumer first subscribes for check events before linking some already existing checks to some parameters. The figure shows how check evaluation is normally triggered by either a periodic interval or a change in a monitored value, however, the service also supports the optional ability for consumers to trigger the evaluation of checks using the triggerCheck operation. Finally, if a check event has not been generated for a configurable period of time, known as the maximum reporting interval, an event is generated regardless of whether the check is in violation or not. This maximum reporting interval supports the situation where regular confirmation of the non-violating state of a check is required.
                  +        The list of currently violating checks can be obtained using the getCurrentTransitionList operation; to get a full report including non-violating checks the getSummaryReport operation should be used.
                  +        The following figure (3-7) shows the flow chart for determining the status of a check:
                  +        --- check state diag --- 
                  +        Flow Chart for Determining the Status of a Check
                  +        Each time a check is evaluated, the procedure indicated in the flow chart depicted in figure 3-7 is performed to calculate the check result. Each check link can have a condition included which determines whether the check should be applied or not; this allows several checks to be associated to a single parameter and applied in different conditions.
                  +        The service defines five basic check types, constant, reference, delta, limit, and compound. A constant check is used to ensure that a parameter value either does not change or does not change from a set of specific values.
                  +        In the Reference and Delta checks, a value is compared against another value which serves as a reference value. The reference value can be taken from either another parameter or the parameter being checked, and can be the previous value or a value in the past, specified by using a delta time in the ReferenceValue composite. This does not affect the logic of the flow chart above.
                  +        Limit checks monitor parameters to see if the parameter value is either inside or outside a range of values.
                  +        The final check type, compound, monitors a set of previously defined checks and only violates when a specified number of those monitored checks violate themselves.
                  +        The service only publishes check results (as check transition events) when either the result changes from the previous value (for example a check starts to violate), or the maximum reporting interval expires. This reduces the amount of 'no change' reporting data being distributed. For situations where regular reporting of the check result is required, even when no change is detected, a low maximum reporting interval value should be specified.
                  +        
                  +            Table 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Table \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Table_TOC \s 1 1
                  +            Check Service Operations
                  +            "
                  +            :  Check Service Operations
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Area Identifier
                  +                Service Identifier
                  +                Area Number
                  +                Service Number
                  +                Area Version
                  +            
                  +            
                  +                MC
                  +                Check
                  +                4
                  +                4
                  +                1
                  +            
                  +            
                  +                Interaction Pattern
                  +                Operation Identifier
                  +                Operation Number
                  +                Capability Set
                  +            
                  +            
                  +                PROGRESS
                  +                 HYPERLINK  \l "OPERATION_4_getCurrentTransitionList" getCurrentTransitionList
                  +                1
                  +                1
                  +            
                  +            
                  +                PROGRESS
                  +                 HYPERLINK  \l "OPERATION_4_getSummaryReport" getSummaryReport
                  +                2
                  +                
                  +            
                  +            
                  +                SUBMIT
                  +                 HYPERLINK  \l "OPERATION_4_enableService" enableService
                  +                3
                  +                2
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_4_getServiceStatus" getServiceStatus
                  +                4
                  +                
                  +            
                  +            
                  +                SUBMIT
                  +                 HYPERLINK  \l "OPERATION_4_enableCheck" enableCheck
                  +                5
                  +                3
                  +            
                  +            
                  +                SUBMIT
                  +                 HYPERLINK  \l "OPERATION_4_triggerCheck" triggerCheck
                  +                6
                  +                4
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_4_listDefinition" listDefinition
                  +                7
                  +                5
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_4_listCheckLinks" listCheckLinks
                  +                8
                  +                
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_4_addCheck" addCheck
                  +                9
                  +                6
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_4_updateDefinition" updateDefinition
                  +                10
                  +                
                  +            
                  +            
                  +                SUBMIT
                  +                 HYPERLINK  \l "OPERATION_4_removeCheck" removeCheck
                  +                11
                  +                
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_4_addParameterCheck" addParameterCheck
                  +                12
                  +                7
                  +            
                  +            
                  +                SUBMIT
                  +                 HYPERLINK  \l "OPERATION_4_removeParameterCheck" removeParameterCheck
                  +                13
                  +                
                  +            
                  +        
                  +        
                  +            Service-level Requirements
                  +        
                  +        The check service shall provide:
                  +         the capability for reporting the check transitions;
                  +         the capability for requesting the latest check transitions;
                  +         the capability for controlling the global check evaluation;
                  +         the capability for controlling the individual check reporting;
                  +         the capability for triggering the evaluation of checks;
                  +         the capability for adding check definitions;
                  +         the capability for modifying check definitions;
                  +         the capability for removing check definitions;
                  +         the capability for listing check definitions;
                  +         the capability for modifying the association of checks to parameters.
                  +        The check service shall use the event service for issuing the corresponding event generated by the check service.
                  +        The check may support the evaluation of the following check types:
                  +         Constant check;
                  +         Reference check;
                  +         Delta check;
                  +         Limit check;
                  +         Compound check.
                  +        When performing a limit check, the check service shall:
                  +         check that the value of a parameter lies within or on a pair of limit values if set to violate outside the range, or outside a pair of limits if set to violate in range;
                  +         declare the check successful when the expression evaluates to true for the correct number of successive valid samples.
                  +        When performing a constant check, the check service shall:
                  +         check that the parameter value evaluates to one of the expected values;
                  +         declare the check successful when the expression evaluates to true for the correct number of successive valid samples.
                  +        When performing a referenced check, the check service shall:
                  +         check that the parameter value evaluates to the referenced value;
                  +         declare the check successful when the expression evaluates to true for the correct number of successive valid samples.
                  +        When performing a delta check, the check service shall:
                  +         calculate the difference, i.e., the delta value, as either an absolute or percentage depending on the check definition between two parameter values;
                  +         check that the difference lies within or on a pair of threshold values if set to violate in range, or outside a pair of thresholds if set to violate outside the range;
                  +         declare the check successful when the expression evaluates to true for the correct number of successive valid samples.
                  +        When performing a compound check, the check service shall:
                  +         monitor the check links referenced by the compound check definition and count the number of referenced checks in violation;
                  +         declare the compound check violated when the number of referenced checks in violation equals or exceeds the defined count value.
                  +        The check service shall provide the capability to process several check definitions for the same parameter.
                  +        Each check definition shall contain:
                  +         the identifier of the check definition;
                  +         the description of the check definition;
                  +         the details specific to that check type.
                  +        A check definition shall be applied to a specific parameter using a check link.
                  +        Each check link shall contain:
                  +         the identifier of the check definition to use;
                  +         the identifier of the parameter to monitor;
                  +         a Boolean that controls whether the check is evaluated;
                  +         a Boolean that indicates whether the check should be evaluated when the parameter value changes;
                  +         a Boolean indicating whether the check should apply to the raw or converted value;
                  +         the checking interval;
                  +         an optional check validity condition that yielding false prevents the check being performed.
                  +        Each check validity condition shall contain:
                  +         the identifier of a parameter to use as a validity parameter;
                  +         an expression operator;
                  +         a Boolean indicating whether the expression should apply to the raw or converted value;
                  +         a value to evaluate against.
                  +        Global check evaluation shall be controlled by the enableService operation.
                  +        Disabling the check service globally shall pause all check evaluations.
                  +        Enabling the check service globally shall resume all check evaluations as they were when they were paused.
                  +        The addParameterCheck operation shall be used to create a link between a check definition and the parameter to be checked.
                  +        Individual check evaluation shall be controlled by the checkEnabled Boolean value in the CheckLinkDefinition object.
                  +        Setting the checkEnabled field to TRUE shall enable check evaluation for a specific CheckLink object.
                  +        The checkEnabled value may be set by using the enableCheck operation.
                  +        If the checkOnChange value is TRUE, any change in the state (such as validity becoming VALID) or value of a parameter shall cause an evaluation of the parameter value against the check.
                  +        If the checkOnChange value is TRUE, any change in the state (such as validity becoming VALID) or the value of the parameter referenced by a check condition shall cause an evaluation of the parameter value against the check.
                  +        If a check is required to be evaluated periodically, then the time between these evaluations shall be controlled using the checkInterval Duration value in the CheckLinkDefinition object.
                  +        For periodic check evaluations to occur the checkOnChange value must be FALSE, it is not possible to request periodic and change based checking concurrently.
                  +        A checkInterval value of '0' shall mean that no periodic check evaluation shall be performed, and checks will be triggered by another mechanism in this case.
                  +        The checkInterval value shall only be set when the CheckLinkDefinition object is created.
                  +        If a checkInterval or maxReportingInterval that is not supported by the provider is requested (both on creation and update of the check), then an INVALID error shall be returned, and the change shall be rejected.
                  +        The check shall be evaluated if the CheckLink object is enabled, the check condition as defined in the check link evaluates to TRUE, and the checked parameter is in a valid state.
                  +        The triggerCheck operation shall trigger a check evaluation and immediately publish the result in a CheckTransition event if the check violates.
                  +        If the latest CheckResult cannot be determined, for example a getSummaryReport operation call for a CheckLink object that has not been evaluated yet, the associated CheckResult shall contain UNCHECKED for the check states and a checked value of NULL.
                  +        In a CheckDefinitionDetails only one of nominalTime and nominalCount is permitted to be zero, an INVALID error shall be returned from the addCheck or updateDefinition operation if this is not the case.
                  +        In a CheckDefinitionDetails only one of violationTime and violationCount is permitted to be zero, an INVALID error shall be returned from the addCheck or updateDefinition operation if this is not the case.
                  +        If nominalTime is not zero, only when the nominalCount number of valid samples including the current one over a nominalTime time period of the checked parameter have passed the check evaluation shall a new check state and check result be calculated.
                  +        If nominalTime is zero, only when the nominalCount number of successive valid samples including the current one of the checked parameter have passed the check evaluation shall a new check state and check result be calculated.
                  +        If nominalTime is not zero, but nominalCount is zero, a new check result is always calculated (which then has a new timestamp).
                  +        If violationTime is not zero, only when the violationCount number of valid samples including the current one over a violationTime time period of the checked parameter have failed the check evaluation shall a new check state and check result be calculated.
                  +        If violationTime is zero, only when the violationCount number of successive valid samples including the current one of the checked parameter have failed the check evaluation shall a new check state and check result be calculated.
                  +        If violationTime is not zero, but violationCount is zero, a new check result is always calculated (which then has a new timestamp).
                  +        For reference and delta checks it shall be possible to define the check to compare against a reference value.
                  +        The reference value checked against shall be updated once validCount samples of that referenced parameter exist at deltaTime in the past from time now.
                  +        For a delta check, the delta value shall be calculated as the difference between the reference value and the check parameter and supports both positive and negative deltas.
                  +        For percentage based delta thresholds, the percentage is calculated as the arithmetic difference between the parameter value and the reference value, as a percentage of the first valid sample where the result of the calculation equal to 1.0 is interpreted as 100 per cent. For example, if the parameter value is 14 and the reference value is 8 then the calculation is (14 - 8) / 8 or 0.75 or 75%.
                  +        For percentage based delta thresholds, if reference value is zero then a divide by zero condition will occur, implementations shall detect this and the calculated delta will be +/- the maximum Float value.
                  +        For a constant check, the result of the constant check shall be declared successful only if the parameter value passes evaluation against one of constant values in the definition.
                  +        For a compound check, if the minimumChecksInViolation field is greater than '0', the result of the compound check shall be declared successful only if the count of referenced CheckLink objects currently in violation is less than the minimumChecksInViolation field.
                  +        For a compound check, if the minimumChecksInViolation field is set to '0', the result of the compound check shall be declared successful if any of the referenced CheckLink objects is nominal i.e. not currently in violation.
                  +        If the maxReportingInterval is not zero and if a CheckResult has not been generated in that time a CheckResult with the current check states shall be generated.
                  +        The maxReportingInterval value shall be set by using the updateDefinition operation.
                  +        Each transition in the state or the result of a check shall cause the generation of a CheckResult and a CheckTransition event.
                  +        
                  +            COM usage
                  +        
                  +        Each check of a provider shall be represented by a CheckIdentity COM object.
                  +        The body of the CheckIdentity COM object shall hold the name of the check.
                  +        The check definition details shall be represented as one of the specific check definition COM objects (ConstantCheck, ReferenceCheck, DeltaCheck, LimitCheck, CompoundCheck).
                  +        The check definition object (ConstantCheck, ReferenceCheck, DeltaCheck, LimitCheck, CompoundCheck) shall use the related link to indicate which CheckIdentity object it uses.
                  +        The link between which parameters are being evaluated for each check shall be represented as CheckLink COM objects.
                  +        The CheckLink object shall use the related link to indicate which CheckIdentity object it uses.
                  +        If the CheckLink belongs to a compound check then the source link shall be set to NULL.
                  +        If the CheckLink object does not belong to a compound check then the source link shall be used to indicate which ParameterIdentity object it is checking.
                  +        The definitions of the check links shall be represented as CheckLinkDefinition COM objects.
                  +        The CheckLinkDefinition object shall use the related link to indicate which CheckLink object it defines.
                  +        Changes in the state or result of a check shall be represented as CheckTransition COM events.
                  +        The CheckTransition event objects shall use the related link to indicate which CheckLinkDefinition object it uses.
                  +        The CheckTransition event objects shall use the source link to indicate what object (if any) caused it to be evaluated, most likely the relevant ParameterValueInstance object or the COM OperationActivity object of a triggerCheck operation.
                  +        In the case of the maximum reporting interval expiring, the source link of the CheckTransition event object shall be set to NULL.
                  +        
                  +            Table 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Table \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Table_TOC \s 1 1
                  +            Check Service Object Types
                  +            "
                  +            :  Check Service Object Types
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Object Number
                  +                Object Name
                  +                Object Body Type
                  +                Related link
                  +                Source link
                  +            
                  +            
                  +                1
                  +                CheckIdentity
                  +                Identifier
                  +                Set to NULL
                  +                Set to NULL
                  +            
                  +            
                  +                2
                  +                CheckLink
                  +                No body
                  +                1
                  +                Parameter::1
                  +            
                  +            
                  +                3
                  +                CheckLinkDefinition
                  +                 HYPERLINK  \l "DATATYPE_CheckLinkDetails" CheckLinkDetails
                  +                2
                  +                Set to NULL
                  +            
                  +            
                  +                5
                  +                ConstantCheck
                  +                 HYPERLINK  \l "DATATYPE_ConstantCheckDefinition" ConstantCheckDefinition
                  +                1
                  +                Set to NULL
                  +            
                  +            
                  +                6
                  +                ReferenceCheck
                  +                 HYPERLINK  \l "DATATYPE_ReferenceCheckDefinition" ReferenceCheckDefinition
                  +                1
                  +                Set to NULL
                  +            
                  +            
                  +                7
                  +                DeltaCheck
                  +                 HYPERLINK  \l "DATATYPE_DeltaCheckDefinition" DeltaCheckDefinition
                  +                1
                  +                Set to NULL
                  +            
                  +            
                  +                8
                  +                LimitCheck
                  +                 HYPERLINK  \l "DATATYPE_LimitCheckDefinition" LimitCheckDefinition
                  +                1
                  +                Set to NULL
                  +            
                  +            
                  +                9
                  +                CompoundCheck
                  +                 HYPERLINK  \l "DATATYPE_CompoundCheckDefinition" CompoundCheckDefinition
                  +                1
                  +                Set to NULL
                  +            
                  +        
                  +        
                  +            COM Event Service usage
                  +        
                  +        When a check is evaluated and its state changes, the change in state shall be represented as CheckTransition COM events.
                  +        When the maximum reporting interval expires the generated check result shall be represented as CheckTransition COM event.
                  +        
                  +            Table 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Table \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Table_TOC \s 1 1
                  +            Check Service Events
                  +            "
                  +            :  Check Service Events
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Object Number
                  +                Event Name
                  +                Object Body Type
                  +                Related link
                  +                Source link
                  +            
                  +            
                  +                4
                  +                CheckTransition
                  +                 HYPERLINK  \l "DATATYPE_CheckResult" CheckResult
                  +                3
                  +                The object that caused the check evaluation to occur, most likely the relevant ParameterValueInstance object, but also be the COM OperationActivity object of a triggerCheck operation or NULL in the case of the maximum reporting interval expiring.
                  +            
                  +        
                  +        
                  +            COM Object Relationships
                  +        
                  +        The Figure below shows the COM object and event relationships for this service:
                  +        
                  +            Figure 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Figure \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Figure_TOC \s 1 1
                  +            Check Service COM object and event relationships
                  +            "
                  +            :  Check Service COM object and event relationships
                  +        
                  +        
                  +            COM Archive Service usage
                  +        
                  +        CheckIdentity objects should be stored in the COM archive.
                  +        The COM objects that hold the check definition details (such as ConstantCheck, ReferenceCheck, DeltaCheck, LimitCheck, CompoundCheck) should be stored in the COM archive.
                  +        CheckLink objects should be stored in the COM archive.
                  +        CheckLinkDefinition objects should be stored in the COM archive.
                  +        When a check transition event is published, the event should be stored in the COM archive.
                  +        
                  +            
                  +            Operation: getCurrentTransitionList
                  +        
                  +        
                  +            Overview
                  +        
                  +        The getCurrentTransitionList operation allows a consumer to obtain the latest result of a number of checks filtering on check state.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                getCurrentTransitionList
                  +            
                  +            
                  +                Interaction Pattern
                  +                PROGRESS
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                PROGRESS
                  +                Yes
                  +                 HYPERLINK  \l "DATATYPE_CheckResultFilter" CheckResultFilter filter
                  +            
                  +            
                  +                OUT
                  +                ACK
                  +                -
                  +                -
                  +            
                  +            
                  +                OUT
                  +                UPDATE
                  +                Yes
                  +                List< HYPERLINK  \l "DATATYPE_CheckResultSummary" CheckResultSummary> updateSummaries
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                Yes
                  +                List< HYPERLINK  \l "DATATYPE_CheckResultSummary" CheckResultSummary> responseSummaries
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        filter - The filter field shall contain a set of object instance identifiers for which the check result is required.
                  +If the checkFilterViaGroups field is TRUE then the checkFilter field shall contain GroupIdentity object instance identifiers, otherwise the field contains CheckIdentity object instance identifiers.
                  +The CheckIdentity objects referenced, either directly or indirectly via groups, by the checkFilter field shall be the CheckIdentity objects to match.
                  +The checkFilter field shall support the wildcard value of '0' and shall match all CheckIdentity objects of the provider.
                  +The service provider shall check for the wildcard value in the list of object instance identifiers in the checkFilter field first and if found no other checks of supplied CheckIdentity object instance identifiers shall be made.
                  +If the parameterFilterViaGroups field is TRUE then the parameterFilter field shall contain GroupIdentity object instance identifiers, otherwise the field contains ParameterIdentity object instance identifiers.
                  +The ParameterIdentity objects referenced, either directly or indirectly via groups, by the parameterFilter field shall be the ParameterIdentity objects to match.
                  +The parameterFilter field shall support the wildcard value of '0' and shall match all ParameterIdentity objects of the provider.
                  +The service provider shall check for the wildcard value in the list of object instance identifiers in the parameterFilter field first and if found no other checks of supplied ParameterIdentity object instance identifiers shall be made.
                  +If a referenced GroupIdentity object is unknown then an UNKNOWN error shall be returned.
                  +If a requested Group, or the Group objects referenced by that Group, does not contain CheckIdentity objects for the checkFilter or ParameterIdentity for the parameterFilter then an INVALID error shall be returned.
                  +If a referenced CheckIdentity object, either directly or indirectly via groups, is unknown then an UNKNOWN error shall be returned.
                  +If a referenced ParameterIdentity object, either directly or indirectly via groups, is unknown then an UNKNOWN error shall be returned.
                  +The filter field shall also contain a list of CheckState enumerations of which states to filter on.
                  +The supplied lists shall be AND'd together to form the complete filter.
                  +If a CheckLink object matches the CheckIdentity filter, and the ParameterIdentity filter, and its state matches any of the supplied CheckState enumerations, then its latest CheckResult value shall be returned.
                  +To report all checks, the wildcard values may be used in the CheckResultFilter.
                  +        updateSummaries - The returned list shall contain an entry for each matched check returning the object instance identifier and the latest CheckResult for that CheckLink object.
                  +        responseSummaries - The PROGRESS pattern is used to allow the possibly large list of filtered check results to be split into several updates.
                  +The size of the lists returned in each update and final response is implementation specific.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        INVALID: One of the referenced groups does not contain the correct type of object.
                  +        UNKNOWN: One or more of the checks, parameters, or groups specified in the list do not exist.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                INVALID
                  +                Defined in COM
                  +                List<UInteger>
                  +                The extra information field contains a list of the indexes of the erroneous values from the originating list supplied.
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                List<UInteger>
                  +                A list of the indexes of the error values shall be contained in the extra information field.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: getSummaryReport
                  +        
                  +        
                  +            Overview
                  +        
                  +        The getSummaryReport operation allows a consumer to obtain the status of a number of checks and the result of any check evaluations linked to them.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                getSummaryReport
                  +            
                  +            
                  +                Interaction Pattern
                  +                PROGRESS
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                PROGRESS
                  +                Yes
                  +                List<Long> objInstIds
                  +            
                  +            
                  +                OUT
                  +                ACK
                  +                -
                  +                -
                  +            
                  +            
                  +                OUT
                  +                UPDATE
                  +                YesYes
                  +                Long updateObjInstIdsList< HYPERLINK  \l "DATATYPE_CheckResultSummary" CheckResultSummary> updateSummaries
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                YesYes
                  +                Long responseObjInstIdsList< HYPERLINK  \l "DATATYPE_CheckResultSummary" CheckResultSummary> responseSummaries
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        objInstIds - The objInstIds field shall hold one or more CheckIdentity object instance identifiers of which a check report is required.
                  +A wildcard value of '0' shall report on all checks.
                  +The wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made.
                  +If a requested check is unknown then an UNKNOWN error shall be returned in the ACKNOWLEDGE message and the operation shall end.
                  +        updateObjInstIds - The returned updates and final response shall contain an entry for each requested CheckIdentity.
                  +The first part of the update shall be the CheckIdentity object instance identifier.
                  +The second part shall be the list of all CheckLink object instance identifiers and CheckResults associated with that CheckIdentity.
                  +        updateSummaries - 
                  +        responseObjInstIds - 
                  +        responseSummaries - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return the following error:
                  +        UNKNOWN: One or more of the checks specified in the list do not exist.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                List<UInteger>
                  +                A list of the indexes of the error values shall be contained in the extra information field.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: enableService
                  +        
                  +        
                  +            Overview
                  +        
                  +        The enableService operation allows a consumer to globally control whether evaluation of all checks is performed or not.
                  +        It should be noted that no check reports will be generated if the service provider has been disabled via the enableService operation.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                enableService
                  +            
                  +            
                  +                Interaction Pattern
                  +                SUBMIT
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                SUBMIT
                  +                Yes
                  +                Boolean enableService
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        enableService - If enableService is set to TRUE the service shall be enabled and evaluation and reporting of check will commence.
                  +If enableService is set to FALSE then all evaluation of checks shall be suspended and no check transitions will be reported.
                  +If the enableService value matches the current enabled state of the service then no change shall be made and no error reported. Enabling an already enabled service has no effect.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation does not return any errors.
                  +        
                  +            
                  +            Operation: getServiceStatus
                  +        
                  +        
                  +            Overview
                  +        
                  +        The getServiceStatus operation allows a consumer to determine the global check service enabled status.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                getServiceStatus
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                -
                  +                -
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                Yes
                  +                Boolean serviceEnabled
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        serviceEnabled - The operation shall return TRUE if the service is currently enabled or FALSE if the service is currently disabled.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation does not return any errors.
                  +        
                  +            
                  +            Operation: enableCheck
                  +        
                  +        
                  +            Overview
                  +        
                  +        The enableCheck operation allows a consumer to control whether evaluation of a set of checks is performed or not. The operation allows the consumer to select the checks directly or indirectly using groups.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                enableCheck
                  +            
                  +            
                  +                Interaction Pattern
                  +                SUBMIT
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                SUBMIT
                  +                YesYes
                  +                Boolean isGroupIdsList<COM::InstanceBooleanPair> enableInstances
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        isGroupIds - If the isGroupIds field is TRUE then the enableInstances field shall contain GroupIdentity object instance identifiers, otherwise the field contains CheckLink object instance identifiers.
                  +The CheckLink objects referenced, either directly or indirectly via groups, by the enableInstances field shall be the CheckLink objects to match.
                  +The id of the enableInstances field shall support the wildcard value of '0' and matches all CheckLink objects of the provider.
                  +The service provider shall check for the wildcard value in the list of object instance identifiers in the enableInstances field first and if found no other checks of supplied object instance identifiers shall be made.
                  +If the enableInstances field contains a value of TRUE then evaluations of matching CheckLink objects shall be performed, a value of FALSE requests that evaluations will not be performed.
                  +No error shall be raised if the enableInstances Boolean value supplied is the same as the current checkEnabled field for a CheckLink object i.e. enabling an already enabled check will not result in an error.
                  +If a requested CheckLink or GroupIdentity object is unknown then an UNKNOWN error shall be returned.
                  +If a requested Group, or the Group objects referenced by that Group, does not contain CheckLink objects then an INVALID error shall be returned.
                  +If an error is raised then no modifications shall be made as a result of this operation call.
                  +The provider shall create and store a new CheckLinkDefinition object in the COM archive if the checkEnabled field is changed.
                  +        enableInstances - If the check is being enabled, and the check is defined as being periodic in the check link definition, then the provider shall generate a check result immediately and start the checking interval from that check.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        UNKNOWN: One or more of the requested groups or CheckLink objects is unknown.
                  +        INVALID: One of the supplied groups is not a group of either other group objects or CheckLink objects.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                List<UInteger>
                  +                A list of the indexes of the error values shall be contained in the extra information field.
                  +            
                  +            
                  +                INVALID
                  +                Defined in COM
                  +                List<UInteger>
                  +                The extra information field contains a list of the indexes of the erroneous values from the originating list supplied.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: triggerCheck
                  +        
                  +        
                  +            Overview
                  +        
                  +        The triggerCheck operation allows a consumer to request the immediate evaluation of a number of checks. Any violations will cause appropriate events to be generated.
                  +        It should be noted that no check reports will be generated if the service provider has been disabled via the enableService operation.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                triggerCheck
                  +            
                  +            
                  +                Interaction Pattern
                  +                SUBMIT
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                SUBMIT
                  +                YesYes
                  +                List<Long> checkObjInstIdsList<Long> linkObjInstIds
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        checkObjInstIds - The checkObjInstIds field shall hold a list of CheckIdentity object instance identifiers to trigger the evaluation of all linked checks.
                  +        linkObjInstIds - The linkObjInstIds field shall hold a list of CheckLink object instance identifiers to trigger the evaluation of.
                  +The wildcard value of '0' shall be permitted in either list.
                  +The wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made.
                  +If a requested CheckIdentity or CheckLink object is unknown then an UNKNOWN error shall be returned.
                  +If an error is raised then no evaluations shall be made as a result of this operation call.
                  +Either list may be empty in which case filtering on that aspect, check identity or specific check link, shall be ignored.
                  +The two lists shall be combined using 'OR' logic, where a CheckLink is evaluated if the identity of a check is in the first list or if the link is directly listed in the second list.
                  +Triggering a check shall ignore the nominalTime, nominalCount, violationTime and violationCount fields and requests an immediate evaluation of the checks.
                  +Triggering a check during a periodic check shall not influence the periodic check (e.g. it does not reset the checkInterval timer, the successive valid samples that passed/violated the check or the maxReportingInterval timer).
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return the following error:
                  +        UNKNOWN: One or more of the requested CheckIdentity or CheckLink objects is unknown.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                List<UInteger>
                  +                A list of the indexes of the error values shall be contained in the extra information field.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: listDefinition
                  +        
                  +        
                  +            Overview
                  +        
                  +        The listDefinition operation allows a consumer to request the latest object instance identifiers of the CheckIdentity and actual check definition objects for the supported checks of the provider.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                listDefinition
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                Yes
                  +                List<Identifier> names
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                Yes
                  +                List< HYPERLINK  \l "DATATYPE_CheckTypedInstance" CheckTypedInstance> objInstIds
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        names - The names field shall hold a list of CheckIdentity names to retrieve the CheckIdentity and actual check definition object instance identifiers for.
                  +The request may contain the wildcard value of '*' to return all supported check definitions.
                  +The wildcard value should be checked for first, if found no other checks of supplied identifiers shall be made.
                  +If a provided identifier does not include a wildcard and does not match an existing CheckIdentity object then this operation shall fail with an UNKNOWN error.
                  +        objInstIds - The response shall contain a list of matching CheckIdentity and actual check definition object instance identifiers and the actual check definition object type.
                  +The returned list shall maintain the same order as the submitted list unless the wildcard value was included in the request.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return the following error:
                  +        UNKNOWN: One of the supplied identifiers is unknown.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                List<UInteger>
                  +                A list of the indexes of the error values shall be contained in the extra information field.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: listCheckLinks
                  +        
                  +        
                  +            Overview
                  +        
                  +        The listCheckLinks operation allows a consumer to request the object instance identifiers of the CheckLink objects for the checks of the provider.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                listCheckLinks
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                Yes
                  +                List<Long> checkObjInstIds
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                Yes
                  +                List< HYPERLINK  \l "DATATYPE_CheckLinkSummary" CheckLinkSummary> chkLinkObjInstIds
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        checkObjInstIds - The checkObjInstIds field shall hold a list of CheckIdentity object instance identifiers to retrieve the CheckLink object instance identifiers for.
                  +The request may contain the wildcard value of '0' to return all supported check links.
                  +The wildcard value should be checked for first, if found no other checks of supplied identifiers shall be made.
                  +If a provided identifier does not include a wildcard and does not match an existing CheckIdentity object then this operation shall fail with an UNKNOWN error.
                  +        chkLinkObjInstIds - The response shall contain a list of CheckLinkSummary that contain the object instance identifiers of the CheckLink, CheckIdentity, and ParameterIdentity for the matched CheckIdentity objects.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return the following error:
                  +        UNKNOWN: One of the supplied identifiers is unknown.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                List<UInteger>
                  +                A list of the indexes of the error values shall be contained in the extra information field.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: addCheck
                  +        
                  +        
                  +            Overview
                  +        
                  +        The addCheck operation allows a consumer to define one or more checks that do not currently exist.
                  +        The new CheckIdentity and actual check definition objects are expected to be stored in the COM archive by the provider of the check service.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                addCheck
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                YesYes
                  +                List<String> checkNamesList< HYPERLINK  \l "DATATYPE_CheckDefinitionDetails" CheckDefinitionDetails> checkDefDetails
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                Yes
                  +                List< HYPERLINK  \l "DATATYPE_ObjectInstancePair" ObjectInstancePair> newObjInstIds
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        checkNames - The checkNames field shall hold the names of the checks to be added.
                  +The checkNames field must not contain NULL, the wildcard '*', or empty value (an INVALID error shall be returned in this case).
                  +The supplied names must be unique among all CheckIdentity objects for the domain of the provider otherwise a DUPLICATE error shall be raised.
                  +        checkDefDetails - The checkDefDetails field shall hold the CheckDefinitionDetails to be added.
                  +The two lists shall be ordered the same.
                  +The number of entries in the two lists shall be the same size otherwise an INVALID error shall be raised.
                  +Only one of nominalTime and nominalCount is permitted to be zero, an INVALID error shall be returned if this is not the case.
                  +Only one of violationTime and violationCount is permitted to be zero, an INVALID error shall be returned if this is not the case.
                  +If an error is raised then no new identities and definitions shall be added as a result of this operation call.
                  +If the supplied name matches an existing, but removed, CheckIdentity then that CheckIdentity shall be reused otherwise a new CheckIdentity shall be created.
                  +The provider shall create a new actual check definition object and store it, and any new CheckIdentity objects, in the COM archive.
                  +        newObjInstIds - The response shall contain the list of object instance identifiers for the CheckIdentity and new actual definition objects.
                  +The returned list shall maintain the same order as the submitted definitions.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        INVALID: One of the supplied CheckIdentity objects contains an invalid name or the two lists are not the same size or there is an inconsistency in the time and count fields.
                  +        INVALID: If the two lists are not the same length then the extra information field shall contain the first index of the element in the largest list which does not have corresponding element in the other list.
                  +        DUPLICATE: One or more of the CheckIdentity objects being added has supplied a check name that is already in use in the domain.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                INVALID
                  +                Defined in COM
                  +                List<UInteger>
                  +                The extra information field contains a list of the indexes of the erroneous values from the originating list supplied.
                  +            
                  +            
                  +                DUPLICATE
                  +                Defined in COM
                  +                List<UInteger>
                  +                The extra information field contains a list of the indexes of the erroneous values from the originating request list.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: updateDefinition
                  +        
                  +        
                  +            Overview
                  +        
                  +        The updateDefinition operation allows a consumer to update a definition for one or more checks.
                  +        This differs from deleting an existing check and adding a new definition with the same check name in the fact that the CheckIdentity object is not changed between the two definitions.
                  +        The replacement definition should be stored in the COM archive by the service provider. The operation does not remove the previous object from the COM archive, merely removes the object from the provider.
                  +        The operation also cannot be used to update a check definition for a check that is currently being used i.e. has CheckLink objects linked to it. The CheckLink objects should first be removed using removeParameterCheck before calling this operation.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                updateDefinition
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                YesYes
                  +                List<Long> checkInstIdsList< HYPERLINK  \l "DATATYPE_CheckDefinitionDetails" CheckDefinitionDetails> checkDefDetails
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                Yes
                  +                List<Long> newObjInstIds
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        checkInstIds - The checkInstIds field shall hold the object instance identifiers of the CheckIdentity objects to be updated.
                  +If the checkInstIds list contains either NULL or '0' an INVALID error shall be raised.
                  +The supplied object instance identifiers shall match existing identity objects, an UNKNOWN error shall be raised if this is not the case.
                  +If the check to be updated is currently being used by a CheckLink object, a REFERENCED error shall be raised.
                  +        checkDefDetails - The checkDefDetails field shall contain the replacement CheckDefinitionDetails.
                  +The two lists shall be ordered the same.
                  +The number of entries in the two lists shall be the same size otherwise an INVALID error shall be raised.
                  +Only one of nominalTime and nominalCount is permitted to be zero, an INVALID error shall be returned if this is not the case.
                  +Only one of violationTime and violationCount is permitted to be zero, an INVALID error shall be returned if this is not the case.
                  +If an error is raised then no definitions shall be updated as a result of this operation call.
                  +The provider shall create new actual check definition objects and store them in the COM archive.
                  +The new definition object shall be the current definition used for the specific CheckIdentity.
                  +        newObjInstIds - The response shall contain the list of object instance identifiers for the new check definition objects.
                  +The returned list shall maintain the same order as the submitted definitions.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        UNKNOWN: One of the supplied CheckIdentity object instance identifiers is unknown.
                  +        INVALID: The supplied object instance identifiers list contains either a NULL or '0', or the two lists do not contain the same number of entries or there is an inconsistency in the time and count fields.
                  +        INVALID: If the two lists are not the same length then the extra information field shall contain the first index of the element in the largest list which does not have corresponding element in the other list.
                  +        REFERENCED: One of the check objects is currently being used by a CheckLink object.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                List<UInteger>
                  +                A list of the indexes of the error values shall be contained in the extra information field.
                  +            
                  +            
                  +                INVALID
                  +                Defined in COM
                  +                List<UInteger>
                  +                The extra information field contains a list of the indexes of the erroneous values from the originating list supplied.
                  +            
                  +            
                  +                REFERENCED
                  +                70021
                  +                List<UInteger>
                  +                A list of the indexes of the error values shall be contained in the extra information field.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: removeCheck
                  +        
                  +        
                  +            Overview
                  +        
                  +        The removeCheck operation allows a consumer to remove one or more definitions from the list of checks supported by the check provider.
                  +        The operation does not remove the CheckIdentity and actual check definition objects from the COM archive, merely removes the objects from the provider. This permits existing CheckLink objects to continue to reference the correct check object in the COM archive.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                removeCheck
                  +            
                  +            
                  +                Interaction Pattern
                  +                SUBMIT
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                SUBMIT
                  +                Yes
                  +                List<Long> objInstIds
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        objInstIds - The objInstIds field holds the object instance identifiers of the CheckIdentity objects to be removed from the provider.
                  +The list may contain the wildcard value of '0'.
                  +The wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made.
                  +If a provided CheckIdentity instance identifier does not include a wildcard and does not match an existing check then this operation shall fail with an UNKNOWN error.
                  +If any of the matched CheckIdentity objects are being referenced by a CheckLink object then a REFERENCED error shall be returned.
                  +Matched CheckIdentity objects shall not be removed from the COM archive only the list of available CheckIdentity objects in the provider.
                  +If an error is raised then no CheckIdentity objects shall be removed as a result of this operation call.
                  +If the operation succeeds then the provider shall not allow new CheckLink objects to be created for the matched CheckIdentity anymore, existing CheckLink objects are not affected.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        UNKNOWN: One of the supplied CheckIdentity object instance identifiers is unknown.
                  +        REFERENCED: One of the check objects is currently being used by a CheckLink object.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                List<UInteger>
                  +                A list of the indexes of the error values shall be contained in the extra information field.
                  +            
                  +            
                  +                REFERENCED
                  +                70021
                  +                List<UInteger>
                  +                A list of the indexes of the error values shall be contained in the extra information field.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: addParameterCheck
                  +        
                  +        
                  +            Overview
                  +        
                  +        The addParameterCheck operation allows a consumer to request that one or more parameters/check combinations are added to the list of checks that are being evaluated.
                  +        The new CheckLink and CheckLinkDefinition objects are expected to be stored in the COM archive by the provider of the check service.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                addParameterCheck
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                YesYes
                  +                List< HYPERLINK  \l "DATATYPE_CheckLinkDetails" CheckLinkDetails> linkDetailsList<COM::ObjectDetails> linkRefs
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                Yes
                  +                List< HYPERLINK  \l "DATATYPE_ObjectInstancePair" ObjectInstancePair> newObjInstIds
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        linkDetails - The linkDetails field shall contain the new CheckLink details.
                  +The linkRefs field shall contain the related and source links of the new CheckLink.
                  +The related field of the ObjectDetails shall reference the object instance identifier of the CheckIdentity being used by the new CheckLink.
                  +The source field of the ObjectDetails shall reference the ParameterIdentity that the check is being applied to.
                  +The two lists must be ordered the same so that the correct ObjectDetails for a specific CheckLink can be determined.
                  +        linkRefs - If the requested CheckIdentity and ParameterIdentity do not exist then an UNKNOWN error shall be returned.
                  +The number of entries in the two lists shall be the same size otherwise an INVALID error shall be raised.
                  +If an interval that is not supported by the provider is requested then an INVALID error shall be returned.
                  +If the checkInterval is not '0' and the checkOnChange Value is TRUE, then an INVALID error shall be returned.
                  +The provider shall create new CheckLink and CheckLinkDefinition objects for each pair and store them in the COM archive.
                  +        newObjInstIds - The response shall contain the list of object instance identifiers for the new CheckLink and CheckLinkDefinition objects.
                  +The returned list shall maintain the same order as the submitted links.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        INVALID: The supplied lists do not contain the same number of entries, the supplied interval is not supported by the provider, or a period check with changed based checking has been requested.
                  +        INVALID: If the two lists are not the same length then the extra information field shall contain the first index of the element in the largest list which does not have corresponding element in the other list.
                  +        UNKNOWN: One of the supplied object instance identifiers is unknown.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                INVALID
                  +                Defined in COM
                  +                List<UInteger>
                  +                The extra information field contains a list of the indexes of the erroneous values from the originating list supplied.
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                List<UInteger>
                  +                A list of the indexes of the error values shall be contained in the extra information field.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: removeParameterCheck
                  +        
                  +        
                  +            Overview
                  +        
                  +        The removeParameterCheck operation allows a consumer to remove one or more parameters from the list of parameters being checked by the check provider.
                  +        The operation does not remove the CheckLink or CheckLinkDefinition objects from the COM archive, merely removes them from the provider. This permits existing CheckTransition events to continue to reference the correct check link/definition objects in the COM archive.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                removeParameterCheck
                  +            
                  +            
                  +                Interaction Pattern
                  +                SUBMIT
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                SUBMIT
                  +                Yes
                  +                List<Long> objInstIds
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        objInstIds - The objInstIds field holds the object instance identifiers of the CheckLink objects to be removed from the provider.
                  +The list may contain the wildcard value of '0'.
                  +The wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made.
                  +If a provided CheckLink instance identifier does not include a wildcard and does not match an existing link then this operation shall fail with an UNKNOWN error.
                  +Matched CheckLink objects shall not be removed from the COM archive only the list of available CheckLink objects in the provider.
                  +If an error is raised then no CheckLink objects shall be removed as a result of this operation call.
                  +If the operation succeeds then the provider shall not evaluate those parameter/check definition combinations for the deleted CheckLink objects anymore.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return the following error:
                  +        UNKNOWN: One of the supplied CheckLink object instance identifiers is unknown.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                List<UInteger>
                  +                A list of the indexes of the error values shall be contained in the extra information field.
                  +            
                  +        
                  +        
                  +            
                  +            Service: Statistic
                  +        
                  +        
                  +            Overview
                  +        
                  +        The statistic service allows the consumer to monitor and control the statistical evaluation (e.g., average) of parameters.
                  +        The statistic service allows the consumer to link the statistic function to a parameter to be evaluated. Figure 3-9 shows the nominal sequence of operations for the statistic service:
                  +        ---- nominal sequence diag ----
                  +        Statistic service nominal sequence
                  +        For each statistics link the service allows a consumer to specify a sampling interval, a reporting interval, and a collection interval. 
                  +        The sampling interval defines the interval between samples of the linked parameter, the reporting interval defines the interval between reports of the current statistic evaluation value, and the collection interval defines the period of time which parameter values are collected for the statistic function.
                  +        A consumer can create several links to the same parameter with different intervals, for example for the function 'Mean', a consumer might define two links with different collection intervals, one for an hour (D0) and one for four hours (D1). The consumer might also specify the reporting interval of half an hour for the first link and two hours for the second link. This would mean that the service provider would produce reports as shown in Figure 3-10.
                  +        --- timeline chart ---
                  +        Example Statistic interval reporting
                  +        If a statistic is defined to reset on collection interval expiration the currently calculated value, and any input collection of values, for the parameter being sampled is reset every collection interval, so if an hourly collection interval is defined for the function 'Mean' then every hour the current mean average value is reset (this does not affect the value reported by the Parameter service itself or any other links for the same function and parameter), the set of values used to calculate that mean average is cleared, and a report is generated containing the final value of the function just before the reset.
                  +        If a statistic is defined not to reset every collection interval, then the statistic maintains a moving evaluation for the collection interval. For example, if a collection interval of an hour is defined with a reset Boolean of FALSE for the function 'Maximum' then the evaluation will hold the maximum value obtained in the last hour.
                  +        The consumer is also able to define the sampling interval of the parameter for a link. This is independent of both the collection interval and the reporting interval. It makes sense for the sampling interval to be smaller than both the collection and reporting interval however it is perfectly possible to specify other values, as this is a deployment decision.
                  +        For the statistic service, the list of possible statistics functions is deployment-dependent, as any function would have to be implemented in the service provider. There are no operations for the creation, modification, or deletion of the statistic functions. The statistic service defines the evaluation of minimum, maximum, mean, and standard deviation functions, however the service supports the addition of other statistical functions by implementations.
                  +        NOTE: To ensure deterministic behaviour, implementations should endeavour to respect Nyquist�s theorem.
                  +        
                  +            Table 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Table \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Table_TOC \s 1 1
                  +            Statistic Service Operations
                  +            "
                  +            :  Statistic Service Operations
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Area Identifier
                  +                Service Identifier
                  +                Area Number
                  +                Service Number
                  +                Area Version
                  +            
                  +            
                  +                MC
                  +                Statistic
                  +                4
                  +                5
                  +                1
                  +            
                  +            
                  +                Interaction Pattern
                  +                Operation Identifier
                  +                Operation Number
                  +                Capability Set
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_5_getStatistics" getStatistics
                  +                1
                  +                1
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_5_resetEvaluation" resetEvaluation
                  +                2
                  +                
                  +            
                  +            
                  +                PUB-SUB
                  +                 HYPERLINK  \l "OPERATION_5_monitorStatistics" monitorStatistics
                  +                3
                  +                2
                  +            
                  +            
                  +                SUBMIT
                  +                 HYPERLINK  \l "OPERATION_5_enableService" enableService
                  +                4
                  +                3
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_5_getServiceStatus" getServiceStatus
                  +                5
                  +                
                  +            
                  +            
                  +                SUBMIT
                  +                 HYPERLINK  \l "OPERATION_5_enableReporting" enableReporting
                  +                6
                  +                4
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_5_listParameterEvaluations" listParameterEvaluations
                  +                7
                  +                5
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_5_addParameterEvaluation" addParameterEvaluation
                  +                8
                  +                6
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_5_updateParameterEvaluation" updateParameterEvaluation
                  +                9
                  +                
                  +            
                  +            
                  +                SUBMIT
                  +                 HYPERLINK  \l "OPERATION_5_removeParameterEvaluation" removeParameterEvaluation
                  +                10
                  +                
                  +            
                  +        
                  +        
                  +            Service-level Requirements
                  +        
                  +        The statistics service may provide the following capabilities:
                  +         the capability for requesting the current statistics evaluation;
                  +         the capability for resetting the statistic evaluations;
                  +         the capability for periodic statistics reporting;
                  +         the capability to control generation of periodic statistics reporting;
                  +         the capability for maintaining the list of evaluated parameters.
                  +        The statistics service may support the evaluation of the following set of statistic functions:
                  +         the maximum value;
                  +         the minimum value;
                  +         the mean value;
                  +         the standard deviation.
                  +        Whether the statistics reporting service supports a specific statistic function shall be declared when implementing that service.
                  +        The statistic service shall maintain a set of links between the statistic function and the parameter that shall be evaluated.
                  +        Each statistics link shall contain:
                  +         the identification of the parameter for which statistics are evaluated;
                  +         the related collection interval;
                  +         whether the collection resets every collection interval;
                  +         the related reporting interval;
                  +         the related sampling interval.
                  +        The evaluation of a specific statistic shall be reset every collection interval if the reset on collection interval Boolean is TRUE.
                  +        The parameter referenced by a statistic link shall be sampled every sampling interval.
                  +        The statistics evaluation value shall be reported every reporting and collection interval if generation is enabled.
                  +        Each statistics value report shall contain:
                  +         the start time of the evaluation;
                  +         the end time of the evaluation;
                  +         the time of the collected value if applicable;
                  +         the evaluated value;
                  +         the number of samples that contributed to the evaluation.
                  +        When resetting the statistics, the statistics service shall, in sequence:
                  +         stop the evaluation of the statistics;
                  +         clear any results accumulated;
                  +         restart the evaluation process.
                  +        The statistics service shall provide the capability to enable periodic statistics reporting.
                  +        The statistics service shall provide the capability to disable the periodic statistics reporting.
                  +        For each valid instruction to disable periodic statistics reporting, the statistics service shall:
                  +         set the statistics link status to disabled;
                  +         continue evaluating the parameter statistics.
                  +        The statistic value for a parameter shall be evaluated after each sampling of the parameter and after the collection interval is elapsed.
                  +        A consumer may request the latest status of the statistical evaluations using the getStatistics operation.
                  +        If a StatisticLink is required to send periodic reports, then the time between these reports shall be controlled using the reportingInterval duration value.
                  +        A reportingInterval value of '0' shall mean no periodic reports shall be sent; reports are required to be triggered by another mechanism in this case.
                  +        The reportingInterval value shall be modified using the updateParameterEvaluation operation.
                  +        If the reporting interval and the collection intervals align, for example report every minute with a five minute collection interval the fifth minute will align, then only a single report shall be generated in this case.
                  +        For onboard parameters the link sampling interval should be a multiple of the minimum sampling interval of those parameters.
                  +        If an interval that is not supported by the provider is requested, then an INVALID error shall be returned, and the change rejected.
                  +        For the 'Maximum' statistics function, the highest value shall be reported, in the case of multiple samples matching that, the first occurrence shall be report.
                  +        For the 'Minimum' statistics function, the smallest value shall be reported, in the case of multiple samples matching that, the first occurrence shall be report.
                  +        For the 'Mean average' statistics function, when used with integer parameters the result shall be reported using a Double type.
                  +        For the 'Standard deviation' statistics function, when used with integer parameters the result shall be reported using a Double type.
                  +        
                  +            COM usage
                  +        
                  +        The statistic functions shall be represented as StatisticFunction COM objects.
                  +        For a 'Maximum' statistics function, the object instance identifier of '1' and name of 'MAX' shall be used.
                  +        For a 'Minimum' statistics function, the object instance identifier of '2' and name of 'MIN' shall be used.
                  +        For a 'Mean average' statistics function, the object instance identifier of '3' and name of 'MEAN' shall be used.
                  +        For a 'Standard deviation' statistics function, the object instance identifier of '4' and name of 'SD' shall be used.
                  +        For non-standard statistics functions, i.e. ones not listed here, the name and object instance identifier shall be communicated through an out-of-band agreement.
                  +        The link between which parameters are being evaluated for each function shall be represented as StatisticLink COM objects.
                  +        The details of a statistic link, such as reportingInterval, shall be represented as a StatisticLinkDefinition COM object.
                  +        Statistic evaluations for a specific parameter and statistic function shall be represented as StatisticValueInstance COM objects.
                  +        The StatisticLink object shall use the related link to indicate which StatisticFunction object it uses.
                  +        The StatisticLink object shall use the source link to indicate which ParameterIdentity object it uses.
                  +        The StatisticLinkDefinition object shall use the related link to indicate which StatisticLink object it uses.
                  +        The StatisticValueInstance object shall use the related link to indicate which StatisticLinkDefinition object it uses.
                  +        The StatisticValueInstance object shall use the source link to indicate what object (if any) caused it to be evaluated.
                  +        If the StatisticValueInstance object was a result of a getStatistics operation call then the source link shall be the COM OperationActivity object of the operation.
                  +        
                  +            Table 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Table \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Table_TOC \s 1 1
                  +            Statistic Service Object Types
                  +            "
                  +            :  Statistic Service Object Types
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Object Number
                  +                Object Name
                  +                Object Body Type
                  +                Related link
                  +                Source link
                  +            
                  +            
                  +                1
                  +                StatisticFunction
                  +                 HYPERLINK  \l "DATATYPE_StatisticFunctionDetails" StatisticFunctionDetails
                  +                Set to NULL
                  +                Set to NULL
                  +            
                  +            
                  +                2
                  +                StatisticLink
                  +                No body
                  +                1
                  +                Parameter::1
                  +            
                  +            
                  +                3
                  +                StatisticLinkDefinition
                  +                 HYPERLINK  \l "DATATYPE_StatisticLinkDetails" StatisticLinkDetails
                  +                2
                  +                Set to NULL
                  +            
                  +            
                  +                4
                  +                StatisticValueInstance
                  +                 HYPERLINK  \l "DATATYPE_StatisticValue" StatisticValue
                  +                3
                  +                The object that caused the statistical evaluation to occur, may be NULL if occurred due to evaluation period timeout.
                  +            
                  +        
                  +        
                  +            COM Object Relationships
                  +        
                  +        The Figure below shows the COM object relationships for this service:
                  +        
                  +            Figure 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Figure \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Figure_TOC \s 1 1
                  +            Statistic Service COM object relationships
                  +            "
                  +            :  Statistic Service COM object relationships
                  +        
                  +        
                  +            COM Archive Service usage
                  +        
                  +        StatisticFunction objects should be stored in the COM archive only if they are not one of the standard functions.
                  +        StatisticLink objects should be stored in the COM archive.
                  +        StatisticLinkDefinition objects should be stored in the COM archive.
                  +        When a StatisticValueInstance report is published, the object should be stored in the COM archive.
                  +        
                  +            
                  +            Operation: getStatistics
                  +        
                  +        
                  +            Overview
                  +        
                  +        The getStatistics operation returns the latest value for a set of existing statistic evaluations.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                getStatistics
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                YesYesYes
                  +                List<Long> funcObjInstIdsBoolean isGroupList<COM::ObjectKey> paramObjInstIds
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                Yes
                  +                List< HYPERLINK  \l "DATATYPE_StatisticEvaluationReport" StatisticEvaluationReport> evaluations
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        funcObjInstIds - The funcObjInstIds field shall include a list of StatisticFunction object instance identifiers to match.
                  +The funcObjInstIds field shall support the wildcard value of '0' and will match all functions of the provider.
                  +The wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made.
                  +        isGroup - 
                  +        paramObjInstIds - If the isGroup field is TRUE then the paramObjInstIds field shall contain GroupIdentity object instance identifiers, otherwise the field shall contain ParameterIdentity object instance identifiers.
                  +If the isGroup field is TRUE, the requested Group, or the Group objects referenced by that Group, must contain ParameterIdentity objects otherwise an INVALID error shall be returned.
                  +The ParameterIdentity objects referenced, either directly or indirectly via groups, by the paramObjInstIds field shall be the parameters to match.
                  +The paramObjInstIds field shall support the wildcard value of '0' and matches all parameters of the provider matched to the functions given in the funcObjInstIds field.
                  +The wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made.
                  +If a requested function, group or parameters is unknown then an UNKNOWN error shall be returned.
                  +The sets of matched StatisticFunction objects and ParameterIdentity objects shall be matched to the set of existing StatisticLink objects to determine which StatisticLink objects to report on.
                  +        evaluations - The response shall contain a list of matching statistics evaluation values.
                  +The operation shall trigger an evaluation of the statistical functions matched and return the new evaluation values.
                  +If it is not possible to return an evaluation value for a matched evaluation (for example not enough samples available) then no entry for that evaluation shall be included.
                  +The evaluation shall not trigger a report via the monitorStatistics operation.
                  +Requesting an evaluation shall ignore the samplingInterval, reportingInterval, and collectionInterval fields and requests an immediate evaluation of the statistic.
                  +Requesting an evaluation during a periodic evaluation shall not influence the periodic evaluation (e.g. it does not reset the samplingInterval, reportingInterval, and collectionInterval timers or the current periodic collection value).
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        UNKNOWN: One or more of the requested groups or parameters do not exist in the provider or statistic functions is not supported by the provider.
                  +        INVALID: One of the supplied groups is not a group of groups or ParameterIdentity objects.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                List<UInteger>
                  +                A list of the indexes of the error values shall be contained in the extra information field.
                  +            
                  +            
                  +                INVALID
                  +                Defined in COM
                  +                List<UInteger>
                  +                The extra information field contains a list of the indexes of the erroneous values from the originating list supplied.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: resetEvaluation
                  +        
                  +        
                  +            Overview
                  +        
                  +        The operation allows a consumer to reset the statistical evaluations so the evaluations restart from the current time (without changing the collection interval), optionally returning the evaluation up to that point. Resetting the evaluation will affect all consumers.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                resetEvaluation
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                YesYesYes
                  +                Boolean isStatLinkGroupList<Long> objInstIdsBoolean returnLatestEval
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                Yes
                  +                List< HYPERLINK  \l "DATATYPE_StatisticEvaluationReport" StatisticEvaluationReport> evaluations
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        isStatLinkGroup - If the isStatLinkGroup field is TRUE then the objInstIds field shall contain GroupIdentity object instance identifiers, otherwise the field shall contain StatisticFunction object instance identifiers.
                  +If the isStatLinkGroup field is TRUE, the requested Group, or the Group objects referenced by that Group, must contain StatisticLink objects otherwise an INVALID error shall be returned.
                  +The StatisticLink objects referenced, either indirectly via statistic functions or indirectly via groups, by the objInstIds field shall be the StatisticLink objects to match.
                  +        objInstIds - The objInstIds field shall support the wildcard value of '0' and matches all StatisticLink objects of the provider.
                  +The wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made.
                  +If a requested function or group is unknown then an UNKNOWN error shall be returned.
                  +        returnLatestEval - If the returnLatestEval Boolean field is TRUE then the latest evaluation result for each of the matched links shall be returned before resetting, otherwise a NULL is returned.
                  +If an error is raised then no resetting of evaluations shall be made as a result of this operation call.
                  +        evaluations - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        INVALID: One of the supplied groups is not a group of groups or StatisticLink objects.
                  +        UNKNOWN: One or more of the requested groups or functions is unknown.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                INVALID
                  +                Defined in COM
                  +                List<UInteger>
                  +                The extra information field contains a list of the indexes of the erroneous values from the originating list supplied.
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                List<UInteger>
                  +                A list of the indexes of the error values shall be contained in the extra information field.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: monitorStatistics
                  +        
                  +        
                  +            Overview
                  +        
                  +        The monitorStatistics operation allows a consumer to subscribe for statistical evaluation value reports.
                  +        It should be noted that no evaluation reports will be generated if the service provider has been disabled via the enableService operation.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                monitorStatistics
                  +            
                  +            
                  +                Interaction Pattern
                  +                PUBLISH-SUBSCRIBE
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                OUT
                  +                PUBLISH
                  +                YesYesYes
                  +                Long relatedIdCOM::ObjectId sourceId HYPERLINK  \l "DATATYPE_StatisticValue" StatisticValue statisticValue
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        relatedId - The MAL EntityKey.firstSubKey shall contain the statistic function name.
                  +The MAL EntityKey.secondSubKey shall contain the StatisticLink object instance identifier.
                  +The MAL EntityKey.thirdSubKey shall contain the ParameterIdentity object instance identifier.
                  +The MAL EntityKey.fourthSubKey shall contain the new StatisticValueInstance object instance identifier.
                  +The timestamp of the StatisticValueInstance report shall be taken from the publish message.
                  +The related link of the update shall be held in the relatedId field.
                  +        sourceId - The source link of the StatisticValueInstance shall be held in the sourceId field.
                  +If no source link is needed then the sourceId shall be set to NULL.
                  +        statisticValue - The second part of the publish message shall be the StatisticValueInstance object value.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation does not return any errors.
                  +        
                  +            
                  +            Operation: enableService
                  +        
                  +        
                  +            Overview
                  +        
                  +        The enableService operation allows a consumer to globally control whether evaluation of all statistics is performed or not.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                enableService
                  +            
                  +            
                  +                Interaction Pattern
                  +                SUBMIT
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                SUBMIT
                  +                Yes
                  +                Boolean enableService
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        enableService - If enableService is set to TRUE the service shall be enabled and evaluation and reporting of statistics will be reset and commence.
                  +If enableService is set to FALSE then all evaluation of statistics shall be suspended and no statistics will be reported.
                  +If the enableService value matches the current enabled state of the service then no change shall be made and no error reported. Enabling an already enabled service has no effect.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation does not return any errors.
                  +        
                  +            
                  +            Operation: getServiceStatus
                  +        
                  +        
                  +            Overview
                  +        
                  +        The getServiceStatus operation allows a consumer to determine the global statistic service enabled status.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                getServiceStatus
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                -
                  +                -
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                Yes
                  +                Boolean serviceEnabled
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        serviceEnabled - The operation shall return TRUE if the service is currently enabled or FALSE if the service is currently disabled.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation does not return any errors.
                  +        
                  +            
                  +            Operation: enableReporting
                  +        
                  +        
                  +            Overview
                  +        
                  +        The enableReporting operation allows a consumer to control whether reports for specific statistical functions are generated or not. The operation allows the consumer to select the functions directly or indirectly using groups.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                enableReporting
                  +            
                  +            
                  +                Interaction Pattern
                  +                SUBMIT
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                SUBMIT
                  +                YesYes
                  +                Boolean isGroupIdsList<COM::InstanceBooleanPair> enableInstances
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        isGroupIds - If the isGroupIds field is TRUE then the enableInstances field shall contain GroupIdentity object instance identifiers, otherwise the field contains StatisticFunction object instance identifiers.
                  +If the isGroupIds field is TRUE, the requested Group, or the Group objects referenced by that Group, must contain StatisticLink objects otherwise an INVALID error shall be returned.
                  +The StatisticLink objects referenced, either indirectly via StatisticFunction objects or indirectly via groups, by the enableInstances field shall be the StatisticLink objects to match.
                  +The id of the enableInstances field shall support the wildcard value of '0' and matches all StatisticLink objects of the provider.
                  +The service provider shall check for the wildcard value in the list of object instance identifiers in the enableInstances field first and if found no other checks of supplied object instance identifiers shall be made.
                  +If the enableInstances field contains a value of TRUE then reports after the reporting and collection intervals for matching StatisticLink objects shall be generated, a value of FALSE requests that reports will not be generated.
                  +No error shall be raised if the enableInstances Boolean value supplied is the same as the current reportingEnabled field for a StatisticLink object i.e. enabling an already enabled link will not result in an error.
                  +If a requested StatisticFunction or GroupIdentity object is unknown then an UNKNOWN error shall be returned.
                  +If an error is raised then no modifications shall be made as a result of this operation call.
                  +The provider should create and store a new StatisticLinkDefinition object in the COM archive if the reportingEnabled field is changed.
                  +        enableInstances - If the generation of reports is being enabled, then the provider shall generate a report immediately and start the report interval from that report.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        UNKNOWN: One or more of the requested StatisticFunction or Group objects is unknown.
                  +        INVALID: One of the supplied groups is not a group of groups or StatisticLink objects.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                List<UInteger>
                  +                A list of the indexes of the error values shall be contained in the extra information field.
                  +            
                  +            
                  +                INVALID
                  +                Defined in COM
                  +                List<UInteger>
                  +                The extra information field contains a list of the indexes of the erroneous values from the originating list supplied.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: listParameterEvaluations
                  +        
                  +        
                  +            Overview
                  +        
                  +        The listParameterEvaluations operation allows a consumer to request the object instance identifiers of the StatisticLink objects for the evaluations of the provider.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                listParameterEvaluations
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                Yes
                  +                List<Long> statObjInstIds
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                Yes
                  +                List< HYPERLINK  \l "DATATYPE_StatisticLinkSummary" StatisticLinkSummary> statLinkObjInstIds
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        statObjInstIds - The statObjInstIds field shall hold a list of StatisticFunction object instance identifiers to retrieve the StatisticLink object instance identifiers for.
                  +The request may contain the wildcard value of '0' to return all supported statistic links.
                  +The wildcard value should be checked for first, if found no other checks of supplied identifiers shall be made.
                  +If a provided identifier does not include a wildcard and does not match an existing StatisticFunction object then this operation shall fail with an UNKNOWN error.
                  +        statLinkObjInstIds - The response shall contain a list of StatisticLinkSummary that contain the object instance identifiers of the StatisticLink, StatisticFunction, and ParameterIdentity for the matched StatisticFunction objects.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return the following error:
                  +        UNKNOWN: One of the supplied identifiers is unknown.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                List<UInteger>
                  +                A list of the indexes of the error values shall be contained in the extra information field.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: addParameterEvaluation
                  +        
                  +        
                  +            Overview
                  +        
                  +        The addParameterEvaluation operation allows a consumer to request that one or more parameters/function combinations are added to the list of parameters that are being evaluated.
                  +        The new StatisticLink and StatisticLinkDefinition objects are expected to be stored in the COM archive by the provider of the statistic service.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                addParameterEvaluation
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                Yes
                  +                List< HYPERLINK  \l "DATATYPE_StatisticCreationRequest" StatisticCreationRequest> newDetails
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                Yes
                  +                List< HYPERLINK  \l "DATATYPE_ObjectInstancePair" ObjectInstancePair> newObjInstIds
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        newDetails - The newDetails field shall hold a StatisticCreationRequest for each new parameter to be sampled.
                  +The statFuncInstId field of the StatisticCreationRequest shall reference the object instance identifier of the StatisticFunction to be used.
                  +If the statFuncInstId field does not match an existing StatisticFunction then an UNKNOWN error shall be raised.
                  +The parameterId shall reference the ParameterIdentity that the function is being applied to.
                  +If the parameterId field does not match an existing ParameterIdentity then an UNKNOWN error shall be raised.
                  +If the type of the matched parameter is not supported by the matched statistical function, for example Mean average of a String parameter, then an INVALID error shall be returned.
                  +The samplingInterval field shall contain the sampling duration interval for the parameter.
                  +If the supplied samplingInterval is not supported for the requested parameter then an INVALID error shall be returned.
                  +If an error is raised then no new StatisticLink object shall be created and stored as a result of this operation call.
                  +If no error is to be raised then StatisticLink and StatisticLinkDefinition objects shall be created for each function/parameter link and stored in the COM archive.
                  +The referenced parameter shall be sampled immediately and the sampling, reporting and collection intervals started.
                  +        newObjInstIds - The response shall contain the list of object instance identifiers for the new StatisticLink and StatisticLinkDefinition objects.
                  +The object instance identifiers of the StatisticLink and StatisticLinkDefinition objects shall be held in the first and second fields of the ObjectInstancePair structure respectively.
                  +The returned list shall maintain the same order as the submitted links.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        INVALID: One or more of the supplied StatisticLink is either requesting an invalid sampling interval or invalid function for the request parameter.
                  +        UNKNOWN: One of the requested StatisticLink objects references either an unknown StatisticFunction object or an unknown ParameterIdentity object.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                INVALID
                  +                Defined in COM
                  +                List<UInteger>
                  +                The extra information field contains a list of the indexes of the erroneous values from the originating list supplied.
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                List<UInteger>
                  +                A list of the indexes of the error values shall be contained in the extra information field.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: updateParameterEvaluation
                  +        
                  +        
                  +            Overview
                  +        
                  +        The updateParameterEvaluation operation allows a consumer to modify the intervals, reporting and reset Booleans for one or more statistical evaluation links.
                  +        The replacement StatisticLinkDefinition objects should be stored in the COM archive by the service provider. The operation does not remove the previous object from the COM archive, merely removes the object from the provider.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                updateParameterEvaluation
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                YesYes
                  +                List<Long> linkIdsList< HYPERLINK  \l "DATATYPE_StatisticLinkDetails" StatisticLinkDetails> newDetails
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                Yes
                  +                List<Long> newLinkDefIds
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        linkIds - The linkIds field shall contain the object instance identifiers of the StatisticLink objects to be updated.
                  +If the linkIds list contains either NULL or '0' an INVALID error shall be raised.
                  +The supplied object instance identifiers shall match existing link objects, an UNKNOWN error shall be raised if this is not the case.
                  +If the supplied samplingInterval is not supported for the requested parameter then an INVALID error shall be returned.
                  +        newDetails - The newDetails field shall contain the replacement StatisticLinkDetails.
                  +The two lists shall be ordered the same.
                  +The number of entries in the two lists shall be the same size otherwise an INVALID error shall be returned.
                  +If an error is raised then no links shall be updated as a result of this operation call.
                  +The provider shall create a new StatisticLinkDefinition object and store it in the COM archive.
                  +If any of the intervals are updated then the service shall reset the relevant timer and use the new intervals immediately.
                  +        newLinkDefIds - The response shall contain the list of object instance identifiers for the new StatisticLinkDefinition objects.
                  +The returned list shall maintain the same order as the submitted links.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        UNKNOWN: One or more of the supplied StatisticLink object instance identifiers is unknown.
                  +        INVALID: One or more of the supplied object instance identifiers list contains either a NULL or '0' or is requesting an invalid sampling interval for the request parameter or the two supplied lists are not the same length.
                  +        INVALID: If the two lists are not the same length then the extra information field shall contain the first index of the element in the largest list which does not have corresponding element in the other list.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                List<UInteger>
                  +                A list of the indexes of the error values shall be contained in the extra information field.
                  +            
                  +            
                  +                INVALID
                  +                Defined in COM
                  +                List<UInteger>
                  +                The extra information field contains a list of the indexes of the erroneous values from the originating list supplied.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: removeParameterEvaluation
                  +        
                  +        
                  +            Overview
                  +        
                  +        The removeParameterEvaluation operation allows a consumer to remove one or more parameters from the list of parameters being sampled by the statistic provider.
                  +        The operation does not remove the StatisticLink or StatisticLinkDefinition objects from the COM archive, merely removes them from the provider. This permits existing evaluation results to continue to reference the correct StatisticLink and StatisticLinkDefinition objects in the COM archive.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                removeParameterEvaluation
                  +            
                  +            
                  +                Interaction Pattern
                  +                SUBMIT
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                SUBMIT
                  +                Yes
                  +                List<Long> objInstIds
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        objInstIds - The objInstIds field holds the object instance identifiers of the StatisticLink objects to be removed from the provider.
                  +The list may contain the wildcard value of '0'.
                  +The wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made.
                  +If a provided StatisticLink object instance identifier does not include a wildcard and does not match an existing StatisticLink object then this operation shall fail with an UNKNOWN error.
                  +Matched StatisticLink objects shall not be removed from the COM archive only the list of evaluated StatisticLink objects in the provider.
                  +If an error is raised then no StatisticLink objects shall be removed as a result of this operation call.
                  +If the operation succeeds then the provider shall not evaluate those parameter/function definition combinations for the deleted StatisticLink objects anymore.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return the following error:
                  +        UNKNOWN: One or more of the supplied StatisticLink object instance identifiers is unknown.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                List<UInteger>
                  +                A list of the indexes of the error values shall be contained in the extra information field.
                  +            
                  +        
                  +        
                  +            
                  +            Service: Aggregation
                  +        
                  +        
                  +            Overview
                  +        
                  +        The aggregation service allows the user to acquire several parameter values in a single request.
                  +        Aggregations are generated either periodically, on an ad-hoc basis, or after a configurable timeout when being filtered. Periodic is where they are generated at a specific generation interval; in this case the periodicity is an aspect of the aggregation rather than the contained parameters. Ad-hoc is when the aggregation generation is triggered by some other deployment-specific mechanism.
                  +        Filtering is where an aggregation is only generated when the change in the value of the filtered parameters exceeds a specified threshold or a timeout is passed. Filtering can be applied to both periodic and ad-hoc aggregations.
                  +        As there may be a large amount of time between reports of an aggregation when filtering is applied, the filtering concept also has a maximum reporting interval. If a report of the aggregation has not passed the filter in the maximum reporting interval a report is generated regardless. This allows there to be regular reports of an aggregation sent regardless of filtering.
                  +        It should be noted that applying a filter with a maximum reporting interval to an ad-hoc aggregation will cause the aggregation to generate reports in a periodic way if the maximum reporting interval is left to expire. This is expected behaviour.
                  +        There are a number of intervals defined in the structures of the service, the diagram in Figure 3-12 illustrates the use of these:
                  +         insert timing diagram 
                  +        The diagram shows a single report of an aggregation being generated which contains two parameter sets. Each set of parameter values in the aggregation report contains two optional durations, delta time and interval time. 
                  +        The timestamp of the first value of the first set (T1) is defined as the timestamp of the aggregation report plus the delta time of the first set.
                  +        The timestamp of the second value of the first set (T2) is defined as the timestamp of the first parameter (T1) plus the interval time of the set.
                  +        The timestamp of the first value of the second set (T3) is defined as the timestamp of the last value of the previous set (T2) plus the delta time of the second set.
                  +        The timestamp of the second value of the second set (T4) is defined as the timestamp of the first parameter (T3) plus the interval time of the set.
                  +        The COM archive is used to hold the definitions of the aggregations.
                  +        
                  +            Table 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Table \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Table_TOC \s 1 1
                  +            Aggregation Service Operations
                  +            "
                  +            :  Aggregation Service Operations
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Area Identifier
                  +                Service Identifier
                  +                Area Number
                  +                Service Number
                  +                Area Version
                  +            
                  +            
                  +                MC
                  +                Aggregation
                  +                4
                  +                6
                  +                1
                  +            
                  +            
                  +                Interaction Pattern
                  +                Operation Identifier
                  +                Operation Number
                  +                Capability Set
                  +            
                  +            
                  +                PUB-SUB
                  +                 HYPERLINK  \l "OPERATION_6_monitorValue" monitorValue
                  +                1
                  +                1
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_6_getValue" getValue
                  +                2
                  +                2
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_6_enableGeneration" enableGeneration
                  +                3
                  +                3
                  +            
                  +            
                  +                SUBMIT
                  +                 HYPERLINK  \l "OPERATION_6_enableFilter" enableFilter
                  +                4
                  +                
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_6_listDefinition" listDefinition
                  +                5
                  +                4
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_6_addAggregation" addAggregation
                  +                6
                  +                5
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_6_updateDefinition" updateDefinition
                  +                7
                  +                
                  +            
                  +            
                  +                SUBMIT
                  +                 HYPERLINK  \l "OPERATION_6_removeAggregation" removeAggregation
                  +                8
                  +                
                  +            
                  +        
                  +        
                  +            Service-level Requirements
                  +        
                  +        The aggregation service shall provide:
                  +         the capability for periodic reporting of predefined aggregation values;
                  +         the capability for requesting the current value of a set of aggregations;
                  +         the capability for controlling reporting of the aggregation values;
                  +         the capability for maintaining the list of aggregation definitions.
                  +        Three modes of generating an aggregation value shall exist: periodic, ad-hoc, and filtered:
                  +         Periodic reports for aggregations shall be generated once for each cycle of a specified interval.
                  +         Ad-hoc reports for aggregations shall be triggered by some other deployment-specific means.
                  +         Filtered reports for aggregations shall be generated only when the value of one or more parameters in the aggregation has changed by more than a given threshold since the previous generation or when a timeout expires.
                  +        The generation of reports for an aggregation shall be controlled by the generationEnabled Boolean value in the AggregationDefinitionDetails structure.
                  +        Setting the generationEnabled field to TRUE shall enable generation of reports for a specific aggregation.
                  +        The generationEnabled values can be set by using the enableGeneration operation.
                  +        The filtering of reports for an aggregation shall be controlled by the filterEnabled Boolean value in the AggregationDefinitionDetails structure.
                  +        Setting the filterEnabled field to TRUE shall enable filtering of reports for a specific aggregation.
                  +        The filterEnabled values can be set by using the enableFilter operation.
                  +        If an aggregation is required to send periodic reports, then the time between these reports shall be controlled using the reportInterval Duration value in the AggregationDefinitionDetails structure.
                  +        Periodic reports for aggregations shall set the generationMode field of the AggregationValueInstance to PERIODIC.
                  +        No periodic reports shall be generated when the reportInterval field is set to '0' and reports will be triggered by another ad-hoc implementation-specific mechanism in this case.
                  +        Ad-hoc reports for aggregations shall set the generationMode field of the AggregationValueInstance to ADHOC.
                  +        If an aggregation is filtered, reports shall be generated only when the value of one or more parameters in the aggregation have changed by more than a given threshold since the previous generated aggregation report.
                  +        The threshold for the filter shall be defined, on a per-parameter basis, either as a percentage or an (absolute) delta change in value.
                  +        Parameters in an aggregation that do not have a filter specified in the aggregation definition shall be ignored by the filter comparison process.
                  +        If filtering is enabled and a filtered timeout has been set for that aggregation, if no change has been detected in that time-out period, an aggregation value shall be generated with a generation mode of FILTERED_TIMEOUT. This measure ensures that extensive periods of time do not elapse without reports of an enabled aggregation.
                  +        The generationEnabled, filterEnabled, filteredTimeout, sendUnchanged and reportInterval values of an AggregationDefinition object can be set by using the updateDefinition operation.
                  +        If the filteredTimeout interval, reportInterval or one or more of the sampleIntervals requested are not supported by the provider then an INVALID error shall be returned and the creation or change rejected.
                  +        If the sendUnchanged field in the AggregationDefinition object is FALSE then parameter values that have not changed since the previous report shall be replaced by a NULL in the values list of the AggregationSetValue composite.
                  +        The ordering of the values in the AggregationValueInstance object shall match the ordering of parameters in the AggregationDefinitionDetails structure.
                  +        
                  +            COM usage
                  +        
                  +        Each aggregation of a provider shall be represented by an AggregationIdentity COM object.
                  +        The body of the AggregationIdentity COM object shall hold the name of the aggregation.
                  +        The definitions of the aggregations shall be represented as AggregationDefinition COM objects.
                  +        Aggregation value reports shall be represented as AggregationValueInstance COM objects.
                  +        The AggregationDefinition object shall use the related link to indicate which AggregationIdentity object it uses.
                  +        The AggregationValueInstance object shall use the related link to indicate which AggregationDefinition object it uses.
                  +        The source link of the AggregationIdentity object should be the object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used.
                  +        The source link of the AggregationDefinition object should be the object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used.
                  +        The source link of the AggregationValueInstance object should be the object that caused the report to be generated.
                  +        The source link of the AggregationValueInstance object shall be NULL for periodic reports.
                  +        
                  +            Table 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Table \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Table_TOC \s 1 1
                  +            Aggregation Service Object Types
                  +            "
                  +            :  Aggregation Service Object Types
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Object Number
                  +                Object Name
                  +                Object Body Type
                  +                Related link
                  +                Source link
                  +            
                  +            
                  +                1
                  +                AggregationIdentity
                  +                Identifier
                  +                Set to NULL
                  +                The object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used
                  +            
                  +            
                  +                2
                  +                AggregationDefinition
                  +                 HYPERLINK  \l "DATATYPE_AggregationDefinitionDetails" AggregationDefinitionDetails
                  +                1
                  +                The object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used
                  +            
                  +            
                  +                3
                  +                AggregationValueInstance
                  +                 HYPERLINK  \l "DATATYPE_AggregationValue" AggregationValue
                  +                2
                  +                The object that caused the value to be generated or NULL for periodic reports
                  +            
                  +        
                  +        
                  +            COM Object Relationships
                  +        
                  +        The Figure below shows the COM object relationships for this service:
                  +        
                  +            Figure 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Figure \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Figure_TOC \s 1 1
                  +            Aggregation Service COM object relationships
                  +            "
                  +            :  Aggregation Service COM object relationships
                  +        
                  +        
                  +            COM Archive Service usage
                  +        
                  +        AggregationIdentity and AggregationDefinition objects should be stored in the COM archive.
                  +        When an aggregation value report is published, the AggregationValueInstance object should be stored in the COM archive.
                  +        
                  +            
                  +            Operation: monitorValue
                  +        
                  +        
                  +            Overview
                  +        
                  +        The monitorValue operation allows a consumer to subscribe for aggregation value reports.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                monitorValue
                  +            
                  +            
                  +                Interaction Pattern
                  +                PUBLISH-SUBSCRIBE
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                OUT
                  +                PUBLISH
                  +                YesYes
                  +                COM::ObjectId objId HYPERLINK  \l "DATATYPE_AggregationValue" AggregationValue newValue
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        objId - The MAL EntityKey.firstSubKey shall contain the aggregation name.
                  +The MAL EntityKey.secondSubKey shall contain the AggregationIdentity object instance identifier.
                  +The MAL EntityKey.thirdSubKey shall contain the AggregationDefinition object instance identifier.
                  +The MAL EntityKey.fourthSubKey shall contain the new AggregationValueInstance object instance identifier.
                  +The timestamp of the AggregationValueInstance report shall be taken from the publish message.
                  +The publish message shall include the ObjectId of the source link of the report.
                  +If no source link is needed then the ObjectId shall be replaced with a NULL.
                  +        newValue - The second part of the publish message shall be the AggregationValue.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation does not return any errors.
                  +        
                  +            
                  +            Operation: getValue
                  +        
                  +        
                  +            Overview
                  +        
                  +        The getValue operation returns the latest received value for a requested aggregation.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                getValue
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                Yes
                  +                List<Long> aggInstIds
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                Yes
                  +                List< HYPERLINK  \l "DATATYPE_AggregationValueDetails" AggregationValueDetails> aggValDetails
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        aggInstIds - The aggInstIds field shall provide the list of AggregationIdentity object instance identifiers.
                  +The wildcard value of '0' shall be supported and matches all aggregations of the provider.
                  +The wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made.
                  +If a requested aggregation is unknown then an UNKNOWN error shall be returned.
                  +The filter shall not be applied for the getValue operation.
                  +If an aggregation is being reported periodically, using the operation shall not reset the reportInterval or filteredTimeout timer.
                  +        aggValDetails - The response shall contain a list of returned AggregationIdentity and AggregationDefinition object instance identifier pairs and a matching list of AggregationValues.
                  +The new value shall not be published via the monitorValue operation.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return the following error:
                  +        UNKNOWN: One or more of the requested aggregations is unknown.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                List<UInteger>
                  +                A list of the indexes of the error values shall be contained in the extra information field.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: enableGeneration
                  +        
                  +        
                  +            Overview
                  +        
                  +        The enableGeneration operation allows a consumer to control whether reports for specific aggregations are generated or not. The operation allows the consumer to select the aggregations directly or indirectly using groups. This affects all types of aggregations, periodic, filtered and ad-hoc.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                enableGeneration
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                YesYes
                  +                Boolean isGroupIdsList<COM::InstanceBooleanPair> enableInstances
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                Yes
                  +                List<Long> newObjInstIds
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        isGroupIds - If the isGroupIds field is TRUE then the enableInstances field shall contain GroupIdentity object instance identifiers, otherwise the field contains AggregationIdentity object instance identifiers.
                  +The AggregationIdentity objects referenced, either directly or indirectly via groups, by the enableInstances field shall be the AggregationIdentity objects to match.
                  +The id of the enableInstances field shall support the wildcard value of '0' and matches all AggregationIdentity objects of the provider.
                  +The service provider shall check for the wildcard value in the list of object instance identifiers in the enableInstances field first and if found no other checks of supplied object instance identifiers shall be made.
                  +If the enableInstances field contains a value of TRUE then reports of matching AggregationIdentity objects shall be generated, a value of FALSE requests that reports will not be generated.
                  +No error shall be raised if the enableInstances Boolean value supplied is the same as the current generationEnabled field of the definition for a matched AggregationIdentity object i.e. enabling an already enabled aggregation will not result in an error.
                  +If a requested AggregationIdentity or GroupIdentity object is unknown then an UNKNOWN error shall be returned.
                  +If a requested Group, or the Group objects referenced by that Group, does not contain AggregationIdentity objects then an INVALID error shall be returned.
                  +If an error is raised then no modifications shall be made as a result of this operation call.
                  +The provider shall create and store a new AggregationDefinition object in the COM archive if the generationEnabled field is changed.
                  +If a new AggregationDefinition object is created then that new object shall be the current AggregationDefinition used for the specific AggregationIdentity.
                  +        enableInstances - If the generation of reports is being enabled, and the aggregation is defined as being periodic, then the provider shall generate a report immediately and start the report interval from that report.
                  +        newObjInstIds - The response shall contain the list of object instance identifiers for the new AggregationDefinition objects.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        UNKNOWN: One or more of the requested aggregations or groups is unknown.
                  +        INVALID: One of the supplied groups is either not a group of groups or a group of AggregationIdentity objects.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                List<UInteger>
                  +                A list of the indexes of the error values shall be contained in the extra information field.
                  +            
                  +            
                  +                INVALID
                  +                Defined in COM
                  +                List<UInteger>
                  +                The extra information field contains a list of the indexes of the erroneous values from the originating list supplied.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: enableFilter
                  +        
                  +        
                  +            Overview
                  +        
                  +        The enableFilter operation allows a consumer to control whether reports for specific aggregations are filtered or not. The operation allows the consumer to select the aggregations directly or indirectly using groups. This affects both periodic and ad-hoc aggregations.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                enableFilter
                  +            
                  +            
                  +                Interaction Pattern
                  +                SUBMIT
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                SUBMIT
                  +                YesYes
                  +                Boolean isGroupIdsList<COM::InstanceBooleanPair> enableInstances
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        isGroupIds - If the isGroupIds field is TRUE then the enableInstances field shall contain GroupIdentity object instance identifiers, otherwise the field contains AggregationIdentity object instance identifiers.
                  +The AggregationIdentity objects referenced, either directly or indirectly via groups, by the enableInstances field shall be the AggregationIdentity objects to match.
                  +The id of the enableInstances field shall support the wildcard value of '0' and matches all AggregationIdentity objects of the provider.
                  +The service provider shall check for the wildcard value in the list of object instance identifiers in the enableInstances field first and if found no other checks of supplied object instance identifiers shall be made.
                  +If the enableInstances field contains a value of TRUE then reports of matching AggregationIdentity objects shall be filtered, a value of FALSE requests that reports will not be filtered.
                  +No error shall be raised if the enableInstances Boolean value supplied is the same as the current filterEnabled field of the definition for a matched AggregationIdentity object i.e. filtering an already filtered aggregation will not result in an error.
                  +If a requested AggregationIdentity or GroupIdentity object is unknown then an UNKNOWN error shall be returned.
                  +If a requested Group, or the Group objects referenced by that Group, does not contain AggregationIdentity objects then an INVALID error shall be returned.
                  +If an error is raised then no modifications shall be made as a result of this operation call.
                  +The provider shall create and store a new AggregationDefinition object in the COM archive if the filterEnabled field is changed.
                  +If a new AggregationDefinition object is created then that new object shall be the current AggregationDefinition used for the specific AggregationIdentity.
                  +        enableInstances - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        INVALID: One of the supplied groups is either not a group of groups or a group of AggregationIdentity objects.
                  +        UNKNOWN: One or more of the requested aggregations or groups is unknown.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                INVALID
                  +                Defined in COM
                  +                List<UInteger>
                  +                The extra information field contains a list of the indexes of the erroneous values from the originating list supplied.
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                List<UInteger>
                  +                A list of the indexes of the error values shall be contained in the extra information field.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: listDefinition
                  +        
                  +        
                  +            Overview
                  +        
                  +        The listDefinition operation allows a consumer to request the latest object instance identifiers of the AggregationIdentity and AggregationDefinition objects for the supported aggregations of the provider.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                listDefinition
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                Yes
                  +                List<Identifier> aggNames
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                Yes
                  +                List< HYPERLINK  \l "DATATYPE_ObjectInstancePair" ObjectInstancePair> objInstIds
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        aggNames - The aggNames field shall contain a list of aggregation names to retrieve the AggregationIdentity and AggregationDefinition object instance identifiers for.
                  +The aggNames field may contain the wildcard value of '*' to return all supported AggregationIdentity and AggregationDefinition objects.
                  +The wildcard value should be checked for first, if found no other checks of supplied identifiers shall be made.
                  +If a provided identifier does not include a wildcard and does not match an existing AggregationIdentity object then this operation shall fail with an UNKNOWN error.
                  +        objInstIds - The response shall contain a list of matching AggregationIdentity and AggregationDefinition object instance identifiers.
                  +The returned list shall maintain the same order as the submitted list unless the wildcard value was included in the request.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return the following error:
                  +        UNKNOWN: One of the supplied identifiers is unknown.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                List<UInteger>
                  +                A list of the indexes of the error values shall be contained in the extra information field.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: addAggregation
                  +        
                  +        
                  +            Overview
                  +        
                  +        The addAggregation operation allows a consumer to define one or more aggregations that do not currently exist.
                  +        The new AggregationIdentity and AggregationDefinition objects are expected to be stored in the COM archive by the provider of the aggregation service.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                addAggregation
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                Yes
                  +                List< HYPERLINK  \l "DATATYPE_AggregationCreationRequest" AggregationCreationRequest> aggDefDetails
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                Yes
                  +                List< HYPERLINK  \l "DATATYPE_ObjectInstancePair" ObjectInstancePair> newObjInstIds
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        aggDefDetails - The aggDefDetails field shall hold the name and the AggregationDefinitionDetails to be added.
                  +The name field must not be the wildcard '*', or empty (an INVALID error shall be returned in this case).
                  +If the supplied reportInterval or sampleInterval values are not supported by the provider then an INVALID error shall be returned.
                  +The supplied name must be unique among all AggregationIdentity objects for the domain of the provider otherwise a DUPLICATE error shall be raised.
                  +If an error is raised then no new identities and definitions shall be added as a result of this operation call.
                  +If the supplied name matches an existing, but removed, AggregationIdentity then that AggregationIdentity shall be reused otherwise a new AggregationIdentity shall be created.
                  +The provider shall create a new AggregationDefinition object and store it, and any new AggregationIdentity objects, in the COM archive.
                  +        newObjInstIds - The response shall contain the list of object instance identifiers for the AggregationIdentity and new AggregationDefinition objects.
                  +The returned list shall maintain the same order as the submitted definitions.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        DUPLICATE: One or more of the aggregation objects being added has supplied an aggregation name that is already in use in the domain.
                  +        INVALID: One of the supplied aggregation objects contains an invalid name or a supplied interval is not supported by the provider.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                DUPLICATE
                  +                Defined in COM
                  +                List<UInteger>
                  +                The extra information field contains a list of the indexes of the erroneous values from the originating request list.
                  +            
                  +            
                  +                INVALID
                  +                Defined in COM
                  +                List<UInteger>
                  +                The extra information field contains a list of the indexes of the erroneous values from the originating list supplied.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: updateDefinition
                  +        
                  +        
                  +            Overview
                  +        
                  +        The updateDefinition operation allows a consumer to update a definition for one or more aggregations.
                  +        This differs from deleting an existing aggregation and adding a new definition with the same aggregation name in the fact that the AggregationIdentity object is not changed between the two definitions.
                  +        The replacement definition should be stored in the COM archive by the service provider. The operation does not remove the previous object from the COM archive, merely removes the object from the provider.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                updateDefinition
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                YesYes
                  +                List<Long> aggInstIdsList< HYPERLINK  \l "DATATYPE_AggregationDefinitionDetails" AggregationDefinitionDetails> aggDefDetails
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                Yes
                  +                List<Long> newObjInstIds
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        aggInstIds - The aggInstIds field shall contain the object instance identifiers of the AggregationIdentity objects to be updated.
                  +The supplied object instance identifiers shall match existing identity objects, an UNKNOWN error shall be raised if this is not the case.
                  +If the aggInstIds list contains either NULL or '0' an INVALID error shall be raised.
                  +        aggDefDetails - The aggDefDetails field shall contain the replacement AggregationDefinitionDetails.
                  +The two lists shall be ordered the same.
                  +The number of entries in the two lists shall be the same size otherwise an INVALID error shall be returned.
                  +If the supplied reportInterval or sampleInterval values are not supported by the provider then an INVALID error shall be returned.
                  +If an error is raised then no definitions shall be updated as a result of this operation call.
                  +The provider shall create a new AggregationDefinition object and store it in the COM archive.
                  +The new AggregationDefinition object shall be the current AggregationDefinition used for the specific AggregationIdentity.
                  +        newObjInstIds - The response shall contain the list of object instance identifiers for the new AggregationDefinition objects.
                  +The returned list shall maintain the same order as the submitted definitions.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        UNKNOWN: One of the supplied AggregationIdentity object instance identifiers is unknown.
                  +        INVALID: The supplied object instance identifiers list contains either a NULL or '0' or the two supplied lists are not the same length or a supplied interval is not supported by the provider.
                  +        INVALID: If the two lists are not the same length then the extra information field shall contain the first index of the element in the largest list which does not have corresponding element in the other list.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                List<UInteger>
                  +                A list of the indexes of the error values shall be contained in the extra information field.
                  +            
                  +            
                  +                INVALID
                  +                Defined in COM
                  +                List<UInteger>
                  +                The extra information field contains a list of the indexes of the erroneous values from the originating list supplied.
                  +            
                  +        
                  +        
                  +            
                  +            Operation: removeAggregation
                  +        
                  +        
                  +            Overview
                  +        
                  +        The removeAggregation operation allows a consumer to remove one or more aggregations from the list of aggregations supported by the aggregation provider.
                  +        The operation does not remove the AggregationIdentity or AggregationDefinition objects from the COM archive, merely removes the objects from the provider. This permits existing AggregationValueInstance objects to continue to reference the correct AggregationDefinition object in the COM archive.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                removeAggregation
                  +            
                  +            
                  +                Interaction Pattern
                  +                SUBMIT
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                SUBMIT
                  +                Yes
                  +                List<Long> aggInstIds
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        aggInstIds - The aggInstIds field shall hold the object instance identifiers of the AggregationIdentity objects to be removed from the provider.
                  +The list may contain the wildcard value of '0'.
                  +The wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made.
                  +If a provided AggregationIdentity object instance identifier does not include a wildcard and does not match an existing aggregation then this operation shall fail with an UNKNOWN error.
                  +Matched AggregationIdentity and AggregationDefinition objects shall not be removed from the COM archive only the list of AggregationIdentity and AggregationDefinition objects in the provider.
                  +If an error is raised then no aggregations shall be removed as a result of this operation call.
                  +If the operation succeeds then the provider shall not publish aggregation values for the deleted AggregationIdentity objects anymore.
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return the following error:
                  +        UNKNOWN: One of the supplied AggregationIdentity object instance identifiers is unknown.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                UNKNOWN
                  +                Defined in MAL
                  +                List<UInteger>
                  +                A list of the indexes of the error values shall be contained in the extra information field.
                  +            
                  +        
                  +        
                  +            
                  +            Service: Conversion
                  +        
                  +        
                  +            Overview
                  +        
                  +        The conversion service provides a set of basic conversion definition types that allows the specification of a conversion between two representations. These conversions are used by the other MC services (such as Action, Alert, and Parameter) to define conversions from raw field representations to some engineering representation.
                  +        Conversions are associated with other entities such as parameters or action/alert arguments through the configuration of the relevant service (action/alert/parameter).
                  +        The conversion service does not provide any operations directly, but allows consumers to add, remove, and modify conversion definitions via the COM archive.
                  +        
                  +            Table 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Table \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Table_TOC \s 1 1
                  +            Conversion Service Operations
                  +            "
                  +            :  Conversion Service Operations
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Area Identifier
                  +                Service Identifier
                  +                Area Number
                  +                Service Number
                  +                Area Version
                  +            
                  +            
                  +                MC
                  +                Conversion
                  +                4
                  +                7
                  +                1
                  +            
                  +            
                  +                Interaction Pattern
                  +                Operation Identifier
                  +                Operation Number
                  +                Capability Set
                  +            
                  +        
                  +        
                  +            Service-level Requirements
                  +        
                  +        The conversion service shall provide the capability for maintaining the list of conversion definitions.
                  +        The conversion service shall use the COM archive operations for maintaining the conversion definitions.
                  +        Updating a conversion definition shall be performed by adding a new conversion definition and referencing it in the service specific COM objects (such as ParameterDefinition).
                  +        A Discrete conversion must contain at least one pair of values in the mapping.
                  +        A Line conversion must contain at least two line points.
                  +        A Polynomial conversion must contain at least one pair of values in the points list.
                  +        A Range conversion must contain at least one pair of values in the points list.
                  +        The service that references a conversion should ensure that the conversion referenced is correct.
                  +        
                  +            COM usage
                  +        
                  +        Each conversion shall be represented by a ConversionIdentity COM object.
                  +        The body of the ConversionIdentity COM object shall hold the name of the conversion.
                  +        The definitions of the conversions shall be represented as either DiscreteConversion, LineConversion, PolyConversion, or RangeConversion COM objects.
                  +        The conversion definition object shall use the related link to indicate which ConversionIdentity object it uses.
                  +        The source link of the ConversionIdentity object should be the object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used.
                  +        The source link of the conversion definition object should be the object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used.
                  +        Other service objects shall reference instances of a conversion using the object instance identifier of the conversion definition.
                  +        
                  +            Table 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Table \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Table_TOC \s 1 1
                  +            Conversion Service Object Types
                  +            "
                  +            :  Conversion Service Object Types
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Object Number
                  +                Object Name
                  +                Object Body Type
                  +                Related link
                  +                Source link
                  +            
                  +            
                  +                1
                  +                ConversionIdentity
                  +                Identifier
                  +                Set to NULL
                  +                The object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used.
                  +            
                  +            
                  +                2
                  +                DiscreteConversion
                  +                 HYPERLINK  \l "DATATYPE_DiscreteConversionDetails" DiscreteConversionDetails
                  +                1
                  +                The object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used.
                  +            
                  +            
                  +                3
                  +                LineConversion
                  +                 HYPERLINK  \l "DATATYPE_LineConversionDetails" LineConversionDetails
                  +                1
                  +                The object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used.
                  +            
                  +            
                  +                4
                  +                PolyConversion
                  +                 HYPERLINK  \l "DATATYPE_PolyConversionDetails" PolyConversionDetails
                  +                1
                  +                The object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used.
                  +            
                  +            
                  +                5
                  +                RangeConversion
                  +                 HYPERLINK  \l "DATATYPE_RangeConversionDetails" RangeConversionDetails
                  +                1
                  +                The object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used.
                  +            
                  +        
                  +        
                  +            COM Object Relationships
                  +        
                  +        The Figure below shows the COM object relationships for this service:
                  +        
                  +            Figure 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Figure \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Figure_TOC \s 1 1
                  +            Conversion Service COM object relationships
                  +            "
                  +            :  Conversion Service COM object relationships
                  +        
                  +        
                  +            COM Archive Service usage
                  +        
                  +        ConversionIdentity and conversion definition objects should be stored in the COM archive.
                  +        Each instance of a conversion definition shall be represented by an object instance held in the COM archive.
                  +        The COM archive service operations shall be used to add, update and remove conversions.
                  +        Other services should monitor the archive service for changes to conversions they reference.
                  +        
                  +            
                  +            Service: Group
                  +        
                  +        
                  +            Overview
                  +        
                  +        The group service provides a mechanism for other services to reference sets of their own objects using a single group reference. These groups are used by the other MC services (such as Action, Alert, Check, Aggregation and Parameter) to reduce the complexity of operations by allowing consumers to reference groups of objects (such as parameters) in operations rather than having to supply large lists of object references.
                  +        Where operations of other service mention the use of groups in their operations, any reference to a group object instance identifier implicitly means a GroupIdentity object.
                  +        Groups of other groups is supported, however all objects within the group of groups should have the same object type as most operations expect a single type.
                  +        The creation of cyclic group of groups should also be avoided.
                  +        The group service does not provide any operations directly, but allows consumers to add, remove, and modify groups via the COM archive.
                  +        
                  +            Table 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Table \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Table_TOC \s 1 1
                  +            Group Service Operations
                  +            "
                  +            :  Group Service Operations
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Area Identifier
                  +                Service Identifier
                  +                Area Number
                  +                Service Number
                  +                Area Version
                  +            
                  +            
                  +                MC
                  +                Group
                  +                4
                  +                8
                  +                1
                  +            
                  +            
                  +                Interaction Pattern
                  +                Operation Identifier
                  +                Operation Number
                  +                Capability Set
                  +            
                  +        
                  +        
                  +            Service-level Requirements
                  +        
                  +        The group service shall provide the capability for maintaining the list of groups.
                  +        The group service shall use the COM archive operations for maintaining the group definitions.
                  +        Updating a group definition shall be performed by adding a new group definition and referencing it in the service specific COM objects.
                  +        
                  +            COM usage
                  +        
                  +        Each group shall be represented by a GroupIdentity COM object.
                  +        The body of the GroupIdentity COM object shall hold the name of the group.
                  +        The definitions of the groups shall be represented as GroupDefinition COM objects.
                  +        The GroupDefinition object shall use the related link to indicate which GroupIdentity object it uses.
                  +        The source link of the GroupIdentity object should be the object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used.
                  +        The source link of the GroupDefinition object should be the object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used.
                  +        Groups of groups shall reference instances of a group using the object instance identifier of the GroupIdentity.
                  +        Other service objects shall reference instances of a group using the object instance identifier of the GroupIdentity.
                  +        
                  +            Table 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Table \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Table_TOC \s 1 1
                  +            Group Service Object Types
                  +            "
                  +            :  Group Service Object Types
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Object Number
                  +                Object Name
                  +                Object Body Type
                  +                Related link
                  +                Source link
                  +            
                  +            
                  +                1
                  +                GroupIdentity
                  +                Identifier
                  +                Set to NULL
                  +                The object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used.
                  +            
                  +            
                  +                2
                  +                GroupDefinition
                  +                 HYPERLINK  \l "DATATYPE_GroupDetails" GroupDetails
                  +                1
                  +                The object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used.
                  +            
                  +        
                  +        
                  +            COM Object Relationships
                  +        
                  +        The Figure below shows the COM object relationships for this service:
                  +        
                  +            Figure 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Figure \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Figure_TOC \s 1 1
                  +            Group Service COM object relationships
                  +            "
                  +            :  Group Service COM object relationships
                  +        
                  +        
                  +            COM Archive Service usage
                  +        
                  +        GroupIdentity and GroupDefinition objects should be stored in the COM archive.
                  +        The COM archive service operations shall be used to add, update and remove groups.
                  +        Other services should monitor the archive service for changes to groups they reference.
                  +        
                  +            Data types
                  +        
                  +        
                  +            Area data types: MC
                  +        
                  +        
                  +            
                  +            Enumeration: Severity
                  +        
                  +        The severity enumeration holds the possible values for a severity. The numerical value represents the increasing severity, therefore CRITICAL is more severe than ALARM. Normally, for checks, only the Warning and Critical ranges are used: the colour yellow is associated with Warning, and the colour red is associated with Critical.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                Severity
                  +            
                  +            
                  +                Short Form Part
                  +                6
                  +            
                  +            
                  +                Enumeration Value
                  +                Numerical Value
                  +                Comment
                  +            
                  +            
                  +                INFORMATIONAL
                  +                1
                  +                Indicates a nominal situation with no consequences.
                  +            
                  +            
                  +                WARNING
                  +                2
                  +                Indicates unexpected behaviour without directly threatening consequences.
                  +            
                  +            
                  +                ALARM
                  +                3
                  +                Indicates behaviour of serious concern requiring the attention of an operator, but not necessarily a malfunction.
                  +            
                  +            
                  +                SEVERE
                  +                4
                  +                Indicates that the monitored item has malfunctioned. Requires operator attention.
                  +            
                  +            
                  +                CRITICAL
                  +                5
                  +                Indicates behaviour with mission threatening consequences. Requires operator attention.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ArgumentDefinitionDetails
                  +        
                  +        The ArgumentDefinitionDetails structure holds the details of an argument definition with a set of associated attributes, such as conversion used. The conditionalConversions define the conditions where a referenced conversion is applied. Only the first TRUE conversion should be applied.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ArgumentDefinitionDetails
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                1
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                argId
                  +                Identifier
                  +                No
                  +                Holds the argument definition identifier.
                  +            
                  +            
                  +                description
                  +                String
                  +                Yes
                  +                Optional argument description.
                  +            
                  +            
                  +                rawType
                  +                Octet
                  +                No
                  +                Holds the attribute short form part of the raw type of the argument, e.g., for a MAL::String argument it shall hold 15.
                  +            
                  +            
                  +                rawUnit
                  +                String
                  +                Yes
                  +                The unit for the raw value.
                  +            
                  +            
                  +                conditionalConversions
                  +                List< HYPERLINK  \l "DATATYPE_ConditionalConversion" ConditionalConversion>
                  +                Yes
                  +                The conditional conversions to apply to the argument. Only the first TRUE conversion should be applied.
                  +            
                  +            
                  +                convertedType
                  +                Octet
                  +                Yes
                  +                Holds the attribute short form part of the converted type of the argument, e.g., for a MAL::String argument it shall hold 15. Must not be NULL if a conversion condition is supplied.
                  +            
                  +            
                  +                convertedUnit
                  +                String
                  +                Yes
                  +                The converted argument units.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: AttributeValue
                  +        
                  +        The AttributeValue structure holds an Attribute value. It allows a list of different Attribute types to be created whereas List of Attribute would require the values to be all of the same type.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                AttributeValue
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                2
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                value
                  +                Attribute
                  +                No
                  +                The argument value. Must not be NULL. NULL may be represented by having a NULL in place of the complete AttributeValue composite.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ConditionalConversion
                  +        
                  +        The ConditionalConversion structure holds a condition expression to be evaluated to determine if a specific Conversion should be used. In the case that no test is required, i.e., the conversion should always be used, then the condition field should be set to NULL.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ConditionalConversion
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                3
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                condition
                  +                 HYPERLINK  \l "DATATYPE_ParameterExpression" ParameterExpression
                  +                Yes
                  +                The expression indicates which entities are applicable for this check. If NULL, then the condition shall evaluate to TRUE.
                  +            
                  +            
                  +                conversionId
                  +                COM::ObjectKey
                  +                No
                  +                The object instance identifier of the ConversionIdentity object to be used if the condition evaluates to TRUE or is NULL.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ParameterExpression
                  +        
                  +        The ParameterExpression structure represents a simple expression between a parameter and a value for that parameter.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ParameterExpression
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                4
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                parameterId
                  +                COM::ObjectKey
                  +                No
                  +                Holds the object instance identifier of the ParameterIdentity object to be used in the expression.
                  +            
                  +            
                  +                operator
                  +                COM::Archive::ExpressionOperator
                  +                No
                  +                The expression operator.
                  +            
                  +            
                  +                useConverted
                  +                Boolean
                  +                No
                  +                If set to TRUE the converted value field of the parameter value should be used, otherwise the raw value field should be used.
                  +            
                  +            
                  +                value
                  +                Attribute
                  +                Yes
                  +                The value to be used in the expression.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ObjectInstancePair
                  +        
                  +        The ObjectInstancePair structure is used to hold the object instance identifier of an Identity object with its associated Definition object.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ObjectInstancePair
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                7
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                objIdentityInstanceId
                  +                Long
                  +                No
                  +                The object instance identifier of the Identity object.
                  +            
                  +            
                  +                objDefInstanceId
                  +                Long
                  +                No
                  +                The object instance identifier of the Definition object.
                  +            
                  +        
                  +        
                  +            Service data types: Action
                  +        
                  +        
                  +            
                  +            Enumeration: ActionCategory
                  +        
                  +        Contains the default Action category values. It is implementation specific what the meaning of the values are in a particular context.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ActionCategory
                  +            
                  +            
                  +                Short Form Part
                  +                4
                  +            
                  +            
                  +                Enumeration Value
                  +                Numerical Value
                  +                Comment
                  +            
                  +            
                  +                DEFAULT
                  +                1
                  +                Default category
                  +            
                  +            
                  +                HIPRIORITY
                  +                2
                  +                Category for high priority actions
                  +            
                  +            
                  +                CRITICAL
                  +                3
                  +                Category for critical actions
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ActionDefinitionDetails
                  +        
                  +        The ActionDefinitionDetails structure holds the definition information of an action.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ActionDefinitionDetails
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                1
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                description
                  +                String
                  +                No
                  +                The description of the action.
                  +            
                  +            
                  +                category
                  +                UOctet
                  +                No
                  +                Category of the action. Value taken from ActionCategory enumeration, although the use of a UOctet allows deployment specific extension. Extensions must use values greater than 127.
                  +            
                  +            
                  +                progressStepCount
                  +                UShort
                  +                No
                  +                Total number of steps that will be reported if PROGRESS reporting is selected in the sent Action. 0 if PROGRESS reporting is not used.
                  +            
                  +            
                  +                arguments
                  +                List< HYPERLINK  \l "DATATYPE_ArgumentDefinitionDetails" ArgumentDefinitionDetails>
                  +                Yes
                  +                The list of argument definitions. If no arguments are defined, then the complete list is replaced with a NULL.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ActionInstanceDetails
                  +        
                  +        The ActionInstanceDetails structure holds the information required for an instance of an Action such as the argument values to use.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ActionInstanceDetails
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                2
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                defInstId
                  +                Long
                  +                No
                  +                The object instance identifier of the ActionDefinition to be used.
                  +            
                  +            
                  +                stageStartedRequired
                  +                Boolean
                  +                No
                  +                If TRUE, then an activity event of type Execution is required for the STARTED stage.
                  +            
                  +            
                  +                stageProgressRequired
                  +                Boolean
                  +                No
                  +                If TRUE, then activity events of type Execution are required for the PROGRESS stages.
                  +            
                  +            
                  +                stageCompletedRequired
                  +                Boolean
                  +                No
                  +                If TRUE, then an activity event of type Execution is required for the COMPLETION stage.
                  +            
                  +            
                  +                argumentValues
                  +                List< HYPERLINK  \l "DATATYPE_AttributeValue" AttributeValue>
                  +                Yes
                  +                List containing the values of the arguments. The ordering of the list matches that of the definition. If a value for a particular entry is not being supplied, then its position is filled with a NULL value. If no arguments are defined, then the complete list is replaced with a NULL.
                  +            
                  +            
                  +                argumentIds
                  +                List<Identifier>
                  +                Yes
                  +                Optional list of argument definition identifiers. Allows the provider to verify that the correct arguments are being supplied. The ordering of the list matches that of the argument list of the action definition.
                  +            
                  +            
                  +                isRawValue
                  +                List<Boolean>
                  +                Yes
                  +                Optional list of Booleans that determine whether the supplied argument values are raw or converted. If the Boolean for a particular value is TRUE or NULL then that value is assumed to be raw. If the complete isRawValue list is NULL then all arguments are assumed to be raw values.
                  +The ordering of the list matches that of the argument list of the action definition.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ActionCreationRequest
                  +        
                  +        The ActionCreationRequest contains all the fields required when creating a new action in a provider.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ActionCreationRequest
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                3
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                name
                  +                Identifier
                  +                No
                  +                The name of the action. Must not be empty or the wildcard value.
                  +            
                  +            
                  +                actionDefDetails
                  +                 HYPERLINK  \l "DATATYPE_ActionDefinitionDetails" ActionDefinitionDetails
                  +                No
                  +                The action definition details.
                  +            
                  +        
                  +        
                  +            Service data types: Parameter
                  +        
                  +        
                  +            
                  +            Enumeration: ValidityState
                  +        
                  +        Convenience enumeration that holds the validity states and their numeric values.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ValidityState
                  +            
                  +            
                  +                Short Form Part
                  +                4
                  +            
                  +            
                  +                Enumeration Value
                  +                Numerical Value
                  +                Comment
                  +            
                  +            
                  +                VALID
                  +                0
                  +                Valid.
                  +            
                  +            
                  +                EXPIRED
                  +                1
                  +                The parameter has a timeout associated which has expired
                  +            
                  +            
                  +                INVALID_RAW
                  +                2
                  +                The parameter raw value cannot be obtained, or calculated for synthetic parameters
                  +            
                  +            
                  +                INVALID_CONVERSION
                  +                3
                  +                The validity expression either has evaluated to TRUE or there is no validity defined, but the conversion of the parameter value has failed (for example an unexpected value for a discrete conversion)
                  +            
                  +            
                  +                UNVERIFIED
                  +                4
                  +                The validity of the validity expression has been evaluated to FALSE and therefore cannot be used to verify the current value
                  +            
                  +            
                  +                INVALID
                  +                5
                  +                The validity expression has been evaluated to FALSE
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ParameterDefinitionDetails
                  +        
                  +        The ParameterDefinitionDetails structure holds a parameter definition. The conversion field defines the conditions where the relevant conversion is applied. For onboard parameters, the report interval should be a multiple of the minimum sampling interval of that parameter.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ParameterDefinitionDetails
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                1
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                description
                  +                String
                  +                No
                  +                The description of the parameter. May be empty.
                  +            
                  +            
                  +                rawType
                  +                Octet
                  +                No
                  +                Holds the attribute short form part of the raw type of the parameter, e.g., for a MAL::String parameter it shall hold 15.
                  +            
                  +            
                  +                rawUnit
                  +                String
                  +                Yes
                  +                The unit for the raw value. If NULL then raw type has no unit.
                  +            
                  +            
                  +                generationEnabled
                  +                Boolean
                  +                No
                  +                Controls whether reports for this parameter are to be generated.
                  +            
                  +            
                  +                reportInterval
                  +                Duration
                  +                No
                  +                Periodic report interval. No periodic reports to be generated if this is set to '0'.
                  +            
                  +            
                  +                validityExpression
                  +                 HYPERLINK  \l "DATATYPE_ParameterExpression" ParameterExpression
                  +                Yes
                  +                Expression that determines this parameter's validity state. Can be NULL if no validity check is required or validity is calculated by implementation-specific mechanisms.
                  +            
                  +            
                  +                conversion
                  +                 HYPERLINK  \l "DATATYPE_ParameterConversion" ParameterConversion
                  +                Yes
                  +                If present then parameter has a converted type.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ParameterValue
                  +        
                  +        This structure holds a specific value of the parameter. The type of the value shall match that specified in the parameter definition.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ParameterValue
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                2
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                validityState
                  +                UOctet
                  +                No
                  +                Holds the validity state for a parameter value. If the parameter is valid then this should be set to '0'.
                  +            
                  +            
                  +                rawValue
                  +                Attribute
                  +                Yes
                  +                The parameter raw value. The value of NULL is a valid value and carries no special significance in the parameter service.
                  +            
                  +            
                  +                convertedValue
                  +                Attribute
                  +                Yes
                  +                The parameter converted value.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ParameterConversion
                  +        
                  +        The ParameterConversion structure holds information about the conversions to be applied to a parameter.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ParameterConversion
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                3
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                convertedType
                  +                Octet
                  +                No
                  +                Holds the attribute short form part of the converted type of the parameter, e.g., for a MAL::String parameter it shall hold 15.
                  +            
                  +            
                  +                convertedUnit
                  +                String
                  +                Yes
                  +                The converted parameter unit. If NULL then converted type has no unit.
                  +            
                  +            
                  +                conditionalConversions
                  +                List< HYPERLINK  \l "DATATYPE_ConditionalConversion" ConditionalConversion>
                  +                No
                  +                The conversions to be applied. Only the first TRUE conversion should be applied.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ParameterCreationRequest
                  +        
                  +        The ParameterCreationRequest contains all the fields required when creating a new parameter in a provider.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ParameterCreationRequest
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                5
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                name
                  +                Identifier
                  +                No
                  +                The name of the parameter. Must not be empty or the wildcard value.
                  +            
                  +            
                  +                paramDefDetails
                  +                 HYPERLINK  \l "DATATYPE_ParameterDefinitionDetails" ParameterDefinitionDetails
                  +                No
                  +                The parameter definition details.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ParameterRawValue
                  +        
                  +        The ParameterRawValue structure holds a new raw value for a specific parameter.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ParameterRawValue
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                6
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                paramInstId
                  +                Long
                  +                No
                  +                The object instance identifier of the parameter identity.
                  +            
                  +            
                  +                rawValue
                  +                Attribute
                  +                Yes
                  +                The parameter raw value. The value of NULL is a valid value and carries no special significance in the parameter service.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ParameterValueDetails
                  +        
                  +        This structure holds a specific time stamped value of the parameter. The type of the value shall match that specified in the parameter definition.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ParameterValueDetails
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                7
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                paramId
                  +                Long
                  +                No
                  +                The ParameterIdentity object instance identifier.
                  +            
                  +            
                  +                defId
                  +                Long
                  +                No
                  +                The ParameterDefinition object instance identifier.
                  +            
                  +            
                  +                timestamp
                  +                Time
                  +                No
                  +                The timestamp of the value.
                  +            
                  +            
                  +                value
                  +                 HYPERLINK  \l "DATATYPE_ParameterValue" ParameterValue
                  +                No
                  +                The parameter value.
                  +            
                  +        
                  +        
                  +            Service data types: Alert
                  +        
                  +        
                  +            
                  +            Composite: AlertDefinitionDetails
                  +        
                  +        The AlertDefinitionDetails provides the definition of an alert including any argument definitions.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                AlertDefinitionDetails
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                1
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                description
                  +                String
                  +                No
                  +                The description of the alert.
                  +            
                  +            
                  +                severity
                  +                 HYPERLINK  \l "DATATYPE_Severity" Severity
                  +                No
                  +                Severity of the alert.
                  +            
                  +            
                  +                generationEnabled
                  +                Boolean
                  +                No
                  +                Controls whether instances of this alert are to be generated.
                  +            
                  +            
                  +                arguments
                  +                List< HYPERLINK  \l "DATATYPE_ArgumentDefinitionDetails" ArgumentDefinitionDetails>
                  +                No
                  +                The list of argument definitions.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: AlertEventDetails
                  +        
                  +        The AlertEventDetails structure holds the details of an instance of an alert.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                AlertEventDetails
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                2
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                argumentValues
                  +                List< HYPERLINK  \l "DATATYPE_AttributeValue" AttributeValue>
                  +                Yes
                  +                List containing the values of the arguments. The ordering of the list matches that of the definition. If a value for a particular entry is not being supplied, then its position is filled with a NULL value. If no arguments are defined, then the complete list is replaced with a NULL.
                  +            
                  +            
                  +                argumentIds
                  +                List<Identifier>
                  +                Yes
                  +                Optional list of argument definition identifiers. Allows the consumer to verify that the correct arguments are being supplied. The ordering of the list matches that of the argument list of the alert definition.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: AlertCreationRequest
                  +        
                  +        The AlertCreationRequest contains all the fields required when creating a new alert in a provider.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                AlertCreationRequest
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                3
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                name
                  +                Identifier
                  +                No
                  +                Alert name. Must not be empty or wildcard value.
                  +            
                  +            
                  +                alertDefDetails
                  +                 HYPERLINK  \l "DATATYPE_AlertDefinitionDetails" AlertDefinitionDetails
                  +                No
                  +                The alert definition details.
                  +            
                  +        
                  +        
                  +            Service data types: Check
                  +        
                  +        
                  +            
                  +            Enumeration: CheckState
                  +        
                  +        The CheckState enumeration holds the possible basic states of a check. The meaning of the NOT_OK value is check specific and detailed in the relevant check type definition.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                CheckState
                  +            
                  +            
                  +                Short Form Part
                  +                6
                  +            
                  +            
                  +                Enumeration Value
                  +                Numerical Value
                  +                Comment
                  +            
                  +            
                  +                DISABLED
                  +                1
                  +                The check is disabled.
                  +            
                  +            
                  +                UNCHECKED
                  +                2
                  +                The check is enabled but has not passed the selection condition expression.
                  +            
                  +            
                  +                INVALID
                  +                3
                  +                Check is enabled, has passed the selection condition, but the entity being checked is not in a valid state and therefore has not been checked.
                  +            
                  +            
                  +                OK
                  +                4
                  +                The check is OK.
                  +            
                  +            
                  +                NOT_OK
                  +                5
                  +                The check is not OK.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: CheckDefinitionDetails
                  +        
                  +        The CheckDefinitionDetails structure holds the definition of a check.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                CheckDefinitionDetails
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Abstract
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                description
                  +                String
                  +                No
                  +                The description of the check. May be empty.
                  +            
                  +            
                  +                checkSeverity
                  +                 HYPERLINK  \l "DATATYPE_Severity" Severity
                  +                No
                  +                Indicates the seriousness of the violation based on its possible negative consequences.
                  +            
                  +            
                  +                maxReportingInterval
                  +                Duration
                  +                No
                  +                Maximum interval that can elapse between generations of CheckResult reports. If this value expires, then a CheckResult is generated with the same state for the previous and current state. If set to '0', then no maximum reporting interval shall be applied.
                  +            
                  +            
                  +                nominalCount
                  +                UInteger
                  +                No
                  +                Number of consecutive valid samples passing the check for the check to be OK.
                  +            
                  +            
                  +                nominalTime
                  +                Duration
                  +                No
                  +                If nominalCount is zero then this is duration that a parameter is continuously passing the check for the check to be OK. If nominalCount is not zero then this is the period over which samples will be used in the nominalCount calculation, i.e. samples further in the past than nominalTime are not considered.
                  +            
                  +            
                  +                violationCount
                  +                UInteger
                  +                No
                  +                Number of consecutive valid samples violating the check for the check to be in violation.
                  +            
                  +            
                  +                violationTime
                  +                Duration
                  +                No
                  +                If violationCount is zero then this is duration that a parameter is continuously violating the check for the check to be in violation. If violationCount not zero then this is the period over which samples will be used in the violationCount calculation, i.e. samples further in the past than violationTime are not considered.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: CheckLinkDetails
                  +        
                  +        The CheckLinkDetails structure represents the link from a check definition to a check result for a specific parameter.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                CheckLinkDetails
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                1
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                checkEnabled
                  +                Boolean
                  +                No
                  +                TRUE if the check instance is enabled.
                  +            
                  +            
                  +                checkOnChange
                  +                Boolean
                  +                No
                  +                If TRUE then any change to state or value of the parameter, or the check condition will trigger a check evaluation. Ignored for Compound checks.
                  +            
                  +            
                  +                useConverted
                  +                Boolean
                  +                No
                  +                If set to TRUE the converted value field of the parameter value should be used, otherwise the raw value field should be used. Ignored for Compound checks.
                  +            
                  +            
                  +                checkInterval
                  +                Duration
                  +                No
                  +                The interval that a check should be applied. Only applicable if checkOnChange is FALSE. If '0', then no periodic checking shall be performed, and a check will be triggered by another mechanism. Ignored for Compound checks.
                  +            
                  +            
                  +                condition
                  +                 HYPERLINK  \l "DATATYPE_ParameterExpression" ParameterExpression
                  +                Yes
                  +                Should this check be applied, if NULL then always applied.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: CheckResult
                  +        
                  +        The CheckResult structure holds basic information about the check state and the value of the parameter at the time of the check. The timestamp of the event is the transition time of the check.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                CheckResult
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                2
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                previousCheckState
                  +                 HYPERLINK  \l "DATATYPE_CheckState" CheckState
                  +                No
                  +                The previous evaluation state of the check. Initially UNCHECKED for the first transition of a check. For check evaluations that do not detect a check transition, this value will be the same as the currentCheckState.
                  +            
                  +            
                  +                currentCheckState
                  +                 HYPERLINK  \l "DATATYPE_CheckState" CheckState
                  +                No
                  +                The current evaluation state of the check
                  +            
                  +            
                  +                paramDefInstId
                  +                Long
                  +                Yes
                  +                The object instance identifier of the ParameterDefinition used for the check evaluation. NULL if compound check.
                  +            
                  +            
                  +                checkedValue
                  +                Attribute
                  +                Yes
                  +                This is the value of the parameter or for a compound check the number of checks in violation at the time of a check state transition, or if it is a report due to the CheckDefinitionDetails maxReportingInterval expiring, then it is the value or the number when the interval expired.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: CheckLinkSummary
                  +        
                  +        The CheckLinkSummary structure holds the ids of a specific check link and the check and parameter it links to.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                CheckLinkSummary
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                3
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                checkId
                  +                Long
                  +                No
                  +                The object instance identifier of the CheckIdentity object.
                  +            
                  +            
                  +                linkId
                  +                Long
                  +                No
                  +                The object instance identifier of the CheckLink object.
                  +            
                  +            
                  +                linkDefinitionId
                  +                Long
                  +                No
                  +                Contains the object instance identifier of the CheckLinkDefinition object.
                  +            
                  +            
                  +                checkEnabled
                  +                Boolean
                  +                No
                  +                TRUE if the check instance is enabled.
                  +            
                  +            
                  +                parameterId
                  +                COM::ObjectKey
                  +                Yes
                  +                The object instance identifier of the ParameterIdentity object for the check link. NULL for Compound checks.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: CheckResultSummary
                  +        
                  +        The CheckResultSummary structure holds details about a specific check link and its evaluated result.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                CheckResultSummary
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                4
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                linkId
                  +                Long
                  +                No
                  +                The object instance identifier of the check link.
                  +            
                  +            
                  +                checkEnabled
                  +                Boolean
                  +                No
                  +                The current enabled state of the check link.
                  +            
                  +            
                  +                parameterId
                  +                COM::ObjectKey
                  +                Yes
                  +                The object instance key of the ParameterIdentity being checked. NULL only for Compound checks.
                  +            
                  +            
                  +                evaluationTime
                  +                Time
                  +                No
                  +                The timestamp of the check result. If as a result of max reporting interval expiring then it shall contain the expiration timestamp.
                  +            
                  +            
                  +                result
                  +                 HYPERLINK  \l "DATATYPE_CheckResult" CheckResult
                  +                No
                  +                The check result value.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: CheckResultFilter
                  +        
                  +        The CheckResultFilter structure holds a filter for the current check result transition information.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                CheckResultFilter
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                5
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                checkFilterViaGroups
                  +                Boolean
                  +                No
                  +                If TRUE then the checkFilter field contains GroupIdentity object instance identifiers that link to CheckIdentity objects otherwise it contains CheckIdentity object instance identifiers directly.
                  +            
                  +            
                  +                checkFilter
                  +                List<Long>
                  +                No
                  +                The list of GroupIdentity object instance identifiers if checkFilterViaGroups is TRUE otherwise the CheckIdentity object instance identifiers to filter on. A value of '0' means match all.
                  +            
                  +            
                  +                parameterFilterViaGroups
                  +                Boolean
                  +                No
                  +                If TRUE then the parameterFilter field contains GroupIdentity object instance identifiers that link to ParameterIdentity objects otherwise it contains ParameterIdentity object instance identifiers directly.
                  +            
                  +            
                  +                parameterFilter
                  +                List<Long>
                  +                No
                  +                The list of GroupIdentity object instance identifiers if parameterFilterViaGroups is TRUE otherwise the ParameterIdentity object instance identifiers to filter on. A value of '0' means match all.
                  +            
                  +            
                  +                stateFilter
                  +                List< HYPERLINK  \l "DATATYPE_CheckState" CheckState>
                  +                No
                  +                The list of required check states to filter on. Empty list means match all.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ReferenceValue
                  +        
                  +        The ReferenceValue structure defines a value to compare against. A validCount of '1' and deltaTime of '0' would compare against the previous sample value.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ReferenceValue
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                7
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                validCount
                  +                UShort
                  +                No
                  +                Number of valid samples that should be collected to update the reference value.
                  +            
                  +            
                  +                deltaTime
                  +                Duration
                  +                No
                  +                Delta time from now into the past from which the reference value should be sampled.
                  +            
                  +            
                  +                parameterId
                  +                COM::ObjectKey
                  +                Yes
                  +                The ParameterIdentity object to compare against. If NULL, then checked parameter should be compared against itself.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ConstantCheckDefinition
                  +        
                  +        The ConstantCheckDefinition structure holds the constant values to compare against for a consistency check.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ConstantCheckDefinition
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_CheckDefinitionDetails" CheckDefinitionDetails
                  +            
                  +            
                  +                Short Form Part
                  +                8
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                description
                  +                String
                  +                No
                  +                The description of the check. May be empty.
                  +            
                  +            
                  +                checkSeverity
                  +                 HYPERLINK  \l "DATATYPE_Severity" Severity
                  +                No
                  +                Indicates the seriousness of the violation based on its possible negative consequences.
                  +            
                  +            
                  +                maxReportingInterval
                  +                Duration
                  +                No
                  +                Maximum interval that can elapse between generations of CheckResult reports. If this value expires, then a CheckResult is generated with the same state for the previous and current state. If set to '0', then no maximum reporting interval shall be applied.
                  +            
                  +            
                  +                nominalCount
                  +                UInteger
                  +                No
                  +                Number of consecutive valid samples passing the check for the check to be OK.
                  +            
                  +            
                  +                nominalTime
                  +                Duration
                  +                No
                  +                If nominalCount is zero then this is duration that a parameter is continuously passing the check for the check to be OK. If nominalCount is not zero then this is the period over which samples will be used in the nominalCount calculation, i.e. samples further in the past than nominalTime are not considered.
                  +            
                  +            
                  +                violationCount
                  +                UInteger
                  +                No
                  +                Number of consecutive valid samples violating the check for the check to be in violation.
                  +            
                  +            
                  +                violationTime
                  +                Duration
                  +                No
                  +                If violationCount is zero then this is duration that a parameter is continuously violating the check for the check to be in violation. If violationCount not zero then this is the period over which samples will be used in the violationCount calculation, i.e. samples further in the past than violationTime are not considered.
                  +            
                  +            
                  +                operator
                  +                COM::Archive::ExpressionOperator
                  +                No
                  +                The operator to be used to perform the check.
                  +            
                  +            
                  +                values
                  +                List< HYPERLINK  \l "DATATYPE_AttributeValue" AttributeValue>
                  +                No
                  +                The set of constant values to be checked against. An empty list means that any value change triggers the check.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ReferenceCheckDefinition
                  +        
                  +        The ReferenceCheckDefinition structure holds the key to another entity to compare against for a consistency check.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ReferenceCheckDefinition
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_CheckDefinitionDetails" CheckDefinitionDetails
                  +            
                  +            
                  +                Short Form Part
                  +                9
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                description
                  +                String
                  +                No
                  +                The description of the check. May be empty.
                  +            
                  +            
                  +                checkSeverity
                  +                 HYPERLINK  \l "DATATYPE_Severity" Severity
                  +                No
                  +                Indicates the seriousness of the violation based on its possible negative consequences.
                  +            
                  +            
                  +                maxReportingInterval
                  +                Duration
                  +                No
                  +                Maximum interval that can elapse between generations of CheckResult reports. If this value expires, then a CheckResult is generated with the same state for the previous and current state. If set to '0', then no maximum reporting interval shall be applied.
                  +            
                  +            
                  +                nominalCount
                  +                UInteger
                  +                No
                  +                Number of consecutive valid samples passing the check for the check to be OK.
                  +            
                  +            
                  +                nominalTime
                  +                Duration
                  +                No
                  +                If nominalCount is zero then this is duration that a parameter is continuously passing the check for the check to be OK. If nominalCount is not zero then this is the period over which samples will be used in the nominalCount calculation, i.e. samples further in the past than nominalTime are not considered.
                  +            
                  +            
                  +                violationCount
                  +                UInteger
                  +                No
                  +                Number of consecutive valid samples violating the check for the check to be in violation.
                  +            
                  +            
                  +                violationTime
                  +                Duration
                  +                No
                  +                If violationCount is zero then this is duration that a parameter is continuously violating the check for the check to be in violation. If violationCount not zero then this is the period over which samples will be used in the violationCount calculation, i.e. samples further in the past than violationTime are not considered.
                  +            
                  +            
                  +                operator
                  +                COM::Archive::ExpressionOperator
                  +                No
                  +                The operator to be used to perform the check.
                  +            
                  +            
                  +                checkReference
                  +                 HYPERLINK  \l "DATATYPE_ReferenceValue" ReferenceValue
                  +                No
                  +                The value to check against.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: DeltaCheckDefinition
                  +        
                  +        The DeltaCheckDefinition defines a delta transition check.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                DeltaCheckDefinition
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_CheckDefinitionDetails" CheckDefinitionDetails
                  +            
                  +            
                  +                Short Form Part
                  +                10
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                description
                  +                String
                  +                No
                  +                The description of the check. May be empty.
                  +            
                  +            
                  +                checkSeverity
                  +                 HYPERLINK  \l "DATATYPE_Severity" Severity
                  +                No
                  +                Indicates the seriousness of the violation based on its possible negative consequences.
                  +            
                  +            
                  +                maxReportingInterval
                  +                Duration
                  +                No
                  +                Maximum interval that can elapse between generations of CheckResult reports. If this value expires, then a CheckResult is generated with the same state for the previous and current state. If set to '0', then no maximum reporting interval shall be applied.
                  +            
                  +            
                  +                nominalCount
                  +                UInteger
                  +                No
                  +                Number of consecutive valid samples passing the check for the check to be OK.
                  +            
                  +            
                  +                nominalTime
                  +                Duration
                  +                No
                  +                If nominalCount is zero then this is duration that a parameter is continuously passing the check for the check to be OK. If nominalCount is not zero then this is the period over which samples will be used in the nominalCount calculation, i.e. samples further in the past than nominalTime are not considered.
                  +            
                  +            
                  +                violationCount
                  +                UInteger
                  +                No
                  +                Number of consecutive valid samples violating the check for the check to be in violation.
                  +            
                  +            
                  +                violationTime
                  +                Duration
                  +                No
                  +                If violationCount is zero then this is duration that a parameter is continuously violating the check for the check to be in violation. If violationCount not zero then this is the period over which samples will be used in the violationCount calculation, i.e. samples further in the past than violationTime are not considered.
                  +            
                  +            
                  +                checkReference
                  +                 HYPERLINK  \l "DATATYPE_ReferenceValue" ReferenceValue
                  +                No
                  +                The value to compare the current value against.
                  +            
                  +            
                  +                violateInRange
                  +                Boolean
                  +                No
                  +                If TRUE, then the safe (non violating) values lie outside the specified threshold range.
                  +            
                  +            
                  +                valueDelta
                  +                Boolean
                  +                No
                  +                If TRUE, then the thresholds contain value deltas. If FALSE, they contain percentage deltas.
                  +            
                  +            
                  +                lowerThreshold
                  +                Attribute
                  +                Yes
                  +                The lower threshold of the delta value. Must be of the correct type for the entity being checked. Must be a Float if percentage threshold in the range (-1.0 to 1.0 representing +-100%).
                  +            
                  +            
                  +                upperThreshold
                  +                Attribute
                  +                Yes
                  +                The upper threshold of the delta value. Must be of the correct type for the entity being checked. Must be a Float if percentage threshold in the range (-1.0 to 1.0 representing +-100%).
                  +            
                  +        
                  +        
                  +            
                  +            Composite: LimitCheckDefinition
                  +        
                  +        The LimitCheckDefinition defines a high and low limit check. It is valid to supply only one limit; the other limit is assumed to be the relevant maximum supported by the type being checked in this case.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                LimitCheckDefinition
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_CheckDefinitionDetails" CheckDefinitionDetails
                  +            
                  +            
                  +                Short Form Part
                  +                11
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                description
                  +                String
                  +                No
                  +                The description of the check. May be empty.
                  +            
                  +            
                  +                checkSeverity
                  +                 HYPERLINK  \l "DATATYPE_Severity" Severity
                  +                No
                  +                Indicates the seriousness of the violation based on its possible negative consequences.
                  +            
                  +            
                  +                maxReportingInterval
                  +                Duration
                  +                No
                  +                Maximum interval that can elapse between generations of CheckResult reports. If this value expires, then a CheckResult is generated with the same state for the previous and current state. If set to '0', then no maximum reporting interval shall be applied.
                  +            
                  +            
                  +                nominalCount
                  +                UInteger
                  +                No
                  +                Number of consecutive valid samples passing the check for the check to be OK.
                  +            
                  +            
                  +                nominalTime
                  +                Duration
                  +                No
                  +                If nominalCount is zero then this is duration that a parameter is continuously passing the check for the check to be OK. If nominalCount is not zero then this is the period over which samples will be used in the nominalCount calculation, i.e. samples further in the past than nominalTime are not considered.
                  +            
                  +            
                  +                violationCount
                  +                UInteger
                  +                No
                  +                Number of consecutive valid samples violating the check for the check to be in violation.
                  +            
                  +            
                  +                violationTime
                  +                Duration
                  +                No
                  +                If violationCount is zero then this is duration that a parameter is continuously violating the check for the check to be in violation. If violationCount not zero then this is the period over which samples will be used in the violationCount calculation, i.e. samples further in the past than violationTime are not considered.
                  +            
                  +            
                  +                violateInRange
                  +                Boolean
                  +                No
                  +                If TRUE, then the safe (non violating) values lie outside the specified limits range.
                  +            
                  +            
                  +                lowerLimit
                  +                Attribute
                  +                Yes
                  +                The lower limit of the value. Must be of the correct type for the entity being checked.
                  +            
                  +            
                  +                upperLimit
                  +                Attribute
                  +                Yes
                  +                The upper limit of the value. Must be of the correct type for the entity being checked.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: CompoundCheckDefinition
                  +        
                  +        The CompoundCheckDefinition structure holds the object instance identifiers of one or more check link objects to monitor for a compound check.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                CompoundCheckDefinition
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_CheckDefinitionDetails" CheckDefinitionDetails
                  +            
                  +            
                  +                Short Form Part
                  +                12
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                description
                  +                String
                  +                No
                  +                The description of the check. May be empty.
                  +            
                  +            
                  +                checkSeverity
                  +                 HYPERLINK  \l "DATATYPE_Severity" Severity
                  +                No
                  +                Indicates the seriousness of the violation based on its possible negative consequences.
                  +            
                  +            
                  +                maxReportingInterval
                  +                Duration
                  +                No
                  +                Maximum interval that can elapse between generations of CheckResult reports. If this value expires, then a CheckResult is generated with the same state for the previous and current state. If set to '0', then no maximum reporting interval shall be applied.
                  +            
                  +            
                  +                nominalCount
                  +                UInteger
                  +                No
                  +                Number of consecutive valid samples passing the check for the check to be OK.
                  +            
                  +            
                  +                nominalTime
                  +                Duration
                  +                No
                  +                If nominalCount is zero then this is duration that a parameter is continuously passing the check for the check to be OK. If nominalCount is not zero then this is the period over which samples will be used in the nominalCount calculation, i.e. samples further in the past than nominalTime are not considered.
                  +            
                  +            
                  +                violationCount
                  +                UInteger
                  +                No
                  +                Number of consecutive valid samples violating the check for the check to be in violation.
                  +            
                  +            
                  +                violationTime
                  +                Duration
                  +                No
                  +                If violationCount is zero then this is duration that a parameter is continuously violating the check for the check to be in violation. If violationCount not zero then this is the period over which samples will be used in the violationCount calculation, i.e. samples further in the past than violationTime are not considered.
                  +            
                  +            
                  +                minimumChecksInViolation
                  +                UInteger
                  +                No
                  +                The number of referenced checks that must be in violation for this check to be considered in violation. If set to '0' then all referenced checks must be in violation.
                  +            
                  +            
                  +                checkLinkIds
                  +                List<Long>
                  +                No
                  +                The set of CheckLink objects that form the compound check.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: CheckTypedInstance
                  +        
                  +        The CheckTypedInstance structure is used to hold the two COM object instance identifiers that form the identity and the body of the check definition in combination with the COM object type of the check body definition.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                CheckTypedInstance
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                13
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                objDefCheckType
                  +                COM::ObjectType
                  +                No
                  +                The COM object type of the check body.
                  +            
                  +            
                  +                objInstIds
                  +                 HYPERLINK  \l "DATATYPE_ObjectInstancePair" ObjectInstancePair
                  +                Yes
                  +                The object instance identifiers.
                  +            
                  +        
                  +        
                  +            Service data types: Statistic
                  +        
                  +        
                  +            
                  +            Composite: StatisticFunctionDetails
                  +        
                  +        The StatisticFunctionDetails structure holds the details of the function.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                StatisticFunctionDetails
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                1
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                name
                  +                Identifier
                  +                No
                  +                The name of the statistical function.
                  +            
                  +            
                  +                description
                  +                String
                  +                No
                  +                The description of the statistical function.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: StatisticLinkDetails
                  +        
                  +        The StatisticLinkDetails structure holds the sampling, reporting, and collection intervals for one parameter statistic function link.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                StatisticLinkDetails
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                2
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                samplingInterval
                  +                Duration
                  +                No
                  +                The interval between samples of the parameter.
                  +            
                  +            
                  +                reportingInterval
                  +                Duration
                  +                No
                  +                The interval between periodic reports being generated. If set to '0', then no periodic reports shall be sent.
                  +            
                  +            
                  +                collectionInterval
                  +                Duration
                  +                No
                  +                The collection and reset interval of the statistical evaluation for the linked parameter. If set to '0', then no periodic reset of the evaluation shall be performed.
                  +            
                  +            
                  +                resetEveryCollection
                  +                Boolean
                  +                No
                  +                If TRUE the evaluation will reset its value every collection interval. If FALSE it will maintain a moving evaluation of the function for the collection interval.
                  +            
                  +            
                  +                reportingEnabled
                  +                Boolean
                  +                No
                  +                TRUE if reporting of the evaluation instance is enabled.
                  +            
                  +            
                  +                useConverted
                  +                Boolean
                  +                No
                  +                If TRUE then use the converted value of the Parameter, else use the raw value
                  +            
                  +        
                  +        
                  +            
                  +            Composite: StatisticValue
                  +        
                  +        The StatisticValue structure holds the statistical result for a parameter.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                StatisticValue
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                3
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                paramDefInstId
                  +                Long
                  +                No
                  +                The object instance identifier of the ParameterDefinition object used for the parameter.
                  +            
                  +            
                  +                startTime
                  +                Time
                  +                Yes
                  +                Time the statistic calculations started. This value can be NULL if the start time can be derived by other means, e.g., other start times in a set of StatisticValue structures.
                  +            
                  +            
                  +                endTime
                  +                Time
                  +                Yes
                  +                Time the statistic calculations ended. This value can be NULL if the time can be derived by other means, e.g., other times in a set of StatisticValue structures.
                  +            
                  +            
                  +                valueTime
                  +                Time
                  +                Yes
                  +                Time the statistic value was reached. The time is only applicable for particular statistic values such as min or max. Shall be NULL if not applicable for cases such as 'mean average'.
                  +            
                  +            
                  +                value
                  +                Attribute
                  +                Yes
                  +                Value of the statistic.
                  +            
                  +            
                  +                sampleCount
                  +                UInteger
                  +                No
                  +                Holds the number of samples that contributed to the statistic value. For calculated values such as 'mean average' this holds the number of samples that were used to calculate the value, for non-calculated values such as 'min' then it is the number of samples that were in the set evaluated.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: StatisticCreationRequest
                  +        
                  +        The StatisticCreationRequest structure holds the link details for a specific parameter and function association.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                StatisticCreationRequest
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                4
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                statFuncInstId
                  +                Long
                  +                No
                  +                The object instance identifier of the statistical function to be used.
                  +            
                  +            
                  +                parameterId
                  +                COM::ObjectKey
                  +                No
                  +                The object key of the ParameterIdentity object being referenced.
                  +            
                  +            
                  +                linkDetails
                  +                 HYPERLINK  \l "DATATYPE_StatisticLinkDetails" StatisticLinkDetails
                  +                No
                  +                The collection, reporting, and sampling intervals.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: StatisticLinkSummary
                  +        
                  +        The StatisticLinkSummary structure holds the ids of a specific statistic link and the function and parameter it links to.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                StatisticLinkSummary
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                5
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                funcId
                  +                Long
                  +                No
                  +                The object instance identifier of the StatisticFunction object.
                  +            
                  +            
                  +                linkId
                  +                Long
                  +                No
                  +                The object instance identifier of the StatisticLink object.
                  +            
                  +            
                  +                linkDefId
                  +                Long
                  +                No
                  +                The object instance identifier of the StatisticLinkDefinition object.
                  +            
                  +            
                  +                reportingEnabled
                  +                Boolean
                  +                No
                  +                TRUE if reporting of the evaluation instance is enabled.
                  +            
                  +            
                  +                parameterId
                  +                COM::ObjectKey
                  +                No
                  +                The object instance identifier of the ParameterIdentity object for the statistic link.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: StatisticEvaluationReport
                  +        
                  +        The StatisticEvaluationReport structure holds the set of statistical results.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                StatisticEvaluationReport
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                6
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                linkId
                  +                Long
                  +                No
                  +                The statistic link object instance identifier.
                  +            
                  +            
                  +                value
                  +                 HYPERLINK  \l "DATATYPE_StatisticValue" StatisticValue
                  +                No
                  +                The statistical evaluation value.
                  +            
                  +        
                  +        
                  +            Service data types: Aggregation
                  +        
                  +        
                  +            
                  +            Enumeration: AggregationCategory
                  +        
                  +        AggregationCategory is an enumeration definition holding the categories of aggregations.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                AggregationCategory
                  +            
                  +            
                  +                Short Form Part
                  +                7
                  +            
                  +            
                  +                Enumeration Value
                  +                Numerical Value
                  +                Comment
                  +            
                  +            
                  +                GENERAL
                  +                1
                  +                General aggregation.
                  +            
                  +            
                  +                DIAGNOSTIC
                  +                2
                  +                Diagnostic aggregation.
                  +            
                  +        
                  +        
                  +            
                  +            Enumeration: ThresholdType
                  +        
                  +        ThresholdType is an enumeration definition holding the types of filtering thresholds.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ThresholdType
                  +            
                  +            
                  +                Short Form Part
                  +                8
                  +            
                  +            
                  +                Enumeration Value
                  +                Numerical Value
                  +                Comment
                  +            
                  +            
                  +                PERCENTAGE
                  +                1
                  +                Threshold value is a percentage.
                  +            
                  +            
                  +                DELTA
                  +                2
                  +                Threshold value is a delta.
                  +            
                  +        
                  +        
                  +            
                  +            Enumeration: GenerationMode
                  +        
                  +        GenerationMode is an enumeration definition holding the reasons for the aggregation to be generated.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                GenerationMode
                  +            
                  +            
                  +                Short Form Part
                  +                9
                  +            
                  +            
                  +                Enumeration Value
                  +                Numerical Value
                  +                Comment
                  +            
                  +            
                  +                ADHOC
                  +                1
                  +                The aggregation value was generated because of an ad-hoc implementation dependent reason.
                  +            
                  +            
                  +                PERIODIC
                  +                2
                  +                The aggregation value was generated because of a periodic report.
                  +            
                  +            
                  +                FILTERED_TIMEOUT
                  +                3
                  +                The item is filtered but it exceeded its timeout value.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: AggregationDefinitionDetails
                  +        
                  +        The AggregationDefinitionDetails structure holds definition details of an aggregation.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                AggregationDefinitionDetails
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                1
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                description
                  +                String
                  +                No
                  +                The description of the parameter. May be empty.
                  +            
                  +            
                  +                category
                  +                UOctet
                  +                No
                  +                Category of the aggregation. Value taken from AggregationCategory enumeration, although the use of a UOctet allows deployment specific extension. Extensions must use values greater than 127.
                  +            
                  +            
                  +                reportInterval
                  +                Duration
                  +                No
                  +                The interval between periodic reports on this aggregation. If this aggregation is not periodic, this field must be '0'.
                  +            
                  +            
                  +                sendUnchanged
                  +                Boolean
                  +                No
                  +                If TRUE reports will include all values regardless of whether changed, if FALSE values unchanged from previous report are replaced with a NULL.
                  +            
                  +            
                  +                sendDefinitions
                  +                Boolean
                  +                No
                  +                If TRUE reports will include the ParameterDefinition object instance identifier in the AggregationParameterValue, if FALSE it will be set to NULL.
                  +            
                  +            
                  +                filterEnabled
                  +                Boolean
                  +                No
                  +                Controls whether reports for this aggregation are to be filtered.
                  +            
                  +            
                  +                filteredTimeout
                  +                Duration
                  +                No
                  +                The maximum duration between filtered reports. If this value is exceeded, then a report is sent regardless of filtered thresholds. Ignored if not filtered.
                  +            
                  +            
                  +                generationEnabled
                  +                Boolean
                  +                No
                  +                Controls whether reports for this aggregation are to be generated.
                  +            
                  +            
                  +                parameterSets
                  +                List< HYPERLINK  \l "DATATYPE_AggregationParameterSet" AggregationParameterSet>
                  +                No
                  +                List containing the parameter sets which define the aggregation.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: AggregationParameterSet
                  +        
                  +        The AggregationParameterSet structure holds the identifier and optional filter for a parameter, or set of parameters, in an aggregation.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                AggregationParameterSet
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                2
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                domain
                  +                List<Identifier>
                  +                Yes
                  +                The domain of the parameters being referenced in this set of parameters, NULL if the same domain as the aggregation.
                  +            
                  +            
                  +                parameters
                  +                List<Long>
                  +                No
                  +                The list of object instance identifiers of the ParameterIdentity objects being included in the aggregation.
                  +            
                  +            
                  +                sampleInterval
                  +                Duration
                  +                No
                  +                The interval between samples of the parameters in the set. If '0' then just a single sample of the parameters is required per aggregation report.
                  +            
                  +            
                  +                reportFilter
                  +                 HYPERLINK  \l "DATATYPE_ThresholdFilter" ThresholdFilter
                  +                Yes
                  +                If the AggregationParameterSet contains a single parameter then this field contains the filter to apply for filtered reports when filters are applied. NULL if no filter required or this set contains more than one parameter.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: AggregationValue
                  +        
                  +        The AggregationValue structure holds the values for one or more sets of parameter values. The value sets must be held in the same order as that defined in the matching AggregationDefinitionDetails.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                AggregationValue
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                3
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                generationMode
                  +                 HYPERLINK  \l "DATATYPE_GenerationMode" GenerationMode
                  +                No
                  +                Reason for the aggregation being generated.
                  +            
                  +            
                  +                filtered
                  +                Boolean
                  +                No
                  +                If a filter is enabled when the aggregation value is generated then this value shall be set to TRUE, else FALSE.
                  +            
                  +            
                  +                parameterSetValues
                  +                List< HYPERLINK  \l "DATATYPE_AggregationSetValue" AggregationSetValue>
                  +                No
                  +                The parameterSetValues list holds the sets of values of the aggregation. The sets must be held in the same order as that defined in the aggregation definition.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: AggregationSetValue
                  +        
                  +        The AggregationSetValue structure holds the values for one set of parameter values. If the definition sendUnchanged field is set to FALSE parameter values that are unchanged since the previous report are replaced by a NULL in this list. The parameter values must be held in the same order as that defined in the matching AggregationDefinitionDetails.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                AggregationSetValue
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                4
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                deltaTime
                  +                Duration
                  +                Yes
                  +                Optional delta time, from the timestamp of the aggregation for the first parameter set of the aggregation or the last value of the previous parameter set otherwise, for the first parameter sample of this set. If NULL, then the first sample time is the same as the aggregation timestamp for the first parameter set of the aggregation or the last value of the previous parameter set otherwise.
                  +            
                  +            
                  +                intervalTime
                  +                Duration
                  +                Yes
                  +                Optional delta time between samples in this set. If NULL, then all samples in this set are given the same time. This is usually driven by the sampleInterval in the aggregation set definition.
                  +            
                  +            
                  +                values
                  +                List< HYPERLINK  \l "DATATYPE_AggregationParameterValue" AggregationParameterValue>
                  +                No
                  +                List containing values of the parameters which are part of the aggregation. The ordering of the list entries shall match that of the definition of the aggregation. If there are more values than contained in the definition then it is assumed that the parameters cycle as a complete parameter set.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: AggregationParameterValue
                  +        
                  +        The structure holds a single parameter value with its definition instance identifier.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                AggregationParameterValue
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                5
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                value
                  +                 HYPERLINK  \l "DATATYPE_Parameter::ParameterValue" Parameter::ParameterValue
                  +                No
                  +                The parameter value.
                  +            
                  +            
                  +                paramDefInstId
                  +                Long
                  +                Yes
                  +                The object instance identifier of the ParameterDefinition. NULL if sendDefinitions in the AggregationDefinitionDetails is FALSE.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ThresholdFilter
                  +        
                  +        The ThresholdFilter structure holds the filter for a parameter.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ThresholdFilter
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                6
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                thresholdType
                  +                 HYPERLINK  \l "DATATYPE_ThresholdType" ThresholdType
                  +                No
                  +                The type of filter to apply for filtered periodic reports when filters are applied.
                  +            
                  +            
                  +                thresholdValue
                  +                Attribute
                  +                No
                  +                Threshold value to apply.
                  +            
                  +            
                  +                useConverted
                  +                Boolean
                  +                No
                  +                If true, and the relevant Parameter has a conversion, then use the converted value for the threshold comparison, otherwise use the raw value.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: AggregationCreationRequest
                  +        
                  +        The AggregationCreationRequest contains all the fields required when creating a new aggregation in a provider.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                AggregationCreationRequest
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                10
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                name
                  +                Identifier
                  +                No
                  +                The name of the aggregation. Must not be empty or the wildcard value.
                  +            
                  +            
                  +                aggDefDetails
                  +                 HYPERLINK  \l "DATATYPE_AggregationDefinitionDetails" AggregationDefinitionDetails
                  +                No
                  +                The aggregation definition details.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: AggregationValueDetails
                  +        
                  +        This structure holds a specific time stamped value of the aggregation. 
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                AggregationValueDetails
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                11
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                aggId
                  +                Long
                  +                No
                  +                The AggregationIdentity object instance identifier.
                  +            
                  +            
                  +                defId
                  +                Long
                  +                No
                  +                The AggregationDefinition object instance identifier.
                  +            
                  +            
                  +                timestamp
                  +                Time
                  +                No
                  +                The timestamp of the value. Use for the calculation of the individual parameter value timestamps.
                  +            
                  +            
                  +                value
                  +                 HYPERLINK  \l "DATATYPE_AggregationValue" AggregationValue
                  +                No
                  +                The aggregation value.
                  +            
                  +        
                  +        
                  +            Service data types: Conversion
                  +        
                  +        
                  +            
                  +            Composite: DiscreteConversionDetails
                  +        
                  +        The DiscreteConversionDetails structure holds a bidirectional conversion between raw and converted values. The first element of the pair is the raw value and the second is the converted value. Both sets of values must be unique.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                DiscreteConversionDetails
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                1
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                mapping
                  +                List<Pair>
                  +                No
                  +                Defines a mapping between raw and converted values as a discrete set of points. The first entry in the pair is the raw value, and the second entry is the converted value.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: LineConversionDetails
                  +        
                  +        The LineConversionDetails structure is a bi-directional conversion between raw and converted values. It is defined by a series of points between which values are to be interpolated. The extrapolate attribute indicates if values can also be linearly extrapolated beyond the initial and final points.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                LineConversionDetails
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                2
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                extrapolate
                  +                Boolean
                  +                No
                  +                Indicates whether or not values can be extrapolated beyond the start and the end of the points.
                  +            
                  +            
                  +                points
                  +                List<Pair>
                  +                No
                  +                Defines the bi-directional conversion. The first attribute of the point is a raw value, and the second attribute is the converted value.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: PolyConversionDetails
                  +        
                  +        The PolyConversionDetails structure holds only forward (raw to converted) polynomial conversions. They are defined by a series of points for the polynomial coefficients.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                PolyConversionDetails
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                3
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                points
                  +                List<Pair>
                  +                No
                  +                The first attribute of a point is a MAL::Integer, being the degree of the polynomial; the second attribute is either a MAL::Float or a MAL::Double, being the coefficient of the term.
                  +            
                  +        
                  +        
                  +            
                  +            Composite: RangeConversionDetails
                  +        
                  +        The RangeConversionDetails structure holds a range for a one-way conversion to convert between a continuous range to a discrete value. A range is defined as from this point up to, but not including, the next point.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                RangeConversionDetails
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                4
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                points
                  +                List<Pair>
                  +                No
                  +                The first attribute in each pair is the raw range, and the second attribute is the converted value.
                  +            
                  +        
                  +        
                  +            Service data types: Group
                  +        
                  +        
                  +            
                  +            Composite: GroupDetails
                  +        
                  +        The GroupDetails structure holds the object type, domain, and set of object instance identifiers for a set of objects from another service.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                GroupDetails
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                1
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                description
                  +                String
                  +                No
                  +                Description of the group.
                  +            
                  +            
                  +                objectType
                  +                COM::ObjectType
                  +                No
                  +                The object type of the objects referenced by this group.
                  +            
                  +            
                  +                domain
                  +                List<Identifier>
                  +                No
                  +                The domain of the objects being referenced by this group.
                  +            
                  +            
                  +                instanceIds
                  +                List<Long>
                  +                No
                  +                The list of object instance identifiers of the objects being referenced by this group.
                  +            
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The following table lists the errors defined in this specification:
                  +        
                  +            Table 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Table \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Table_TOC \s 1 1
                  +            MC MO Errors
                  +            "
                  +            :  MC MO Errors
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                Comment
                  +            
                  +            
                  +                READONLY
                  +                70020
                  +                Operation specific
                  +            
                  +            
                  +                REFERENCED
                  +                70021
                  +                Operation specific
                  +            
                  +        
                  +    
                  +
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area004-v001-MC/word/media/image1.png b/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area004-v001-MC/word/media/image1.png
                  new file mode 100644
                  index 0000000000000000000000000000000000000000..99affc6fa9c9a948a7d0814887d6f96da3b1af86
                  GIT binary patch
                  literal 35930
                  zcmce-2Q=IN|HrF?wv>KbRV_sqs*2X$TE1xQt#;KGi5Z)8P^}iNy;ao=L6IOvYn0kM
                  zh}aSmJ0b{iKYsuFzxRL6J$IaY?zwuJR6b4e8Sl?)JfDx(M*}@gR%R|{1_lP!=gQ0e)e6rLFld!|}{s^nN17-nD1`kqoH|Dz||r}`lG1_Q&Pxmwk5gB!b4
                  z^Un(|oD)6i=qJ8-k@IQnkZ
                  zVDNh6Qn~`HIX>QKq}K2`V(yH!ZPoP304J;@qz}FwypdChjw8s%ceS>tb&sZue+j1TEnn{6=62h}4Z7Ia7Mn*o-
                  zSUhlgOmg3zlJ}9cZOySmh*;(A&@+0im1Jzq%~EVE|7|?z!_YslLoD0gyiotQjTrMd
                  z#bv^I^uhjA|7KdqNM%SZlafV$QevVBXElx0x>QJ|+ITIUamvR|f4m?Geu-3fn{`+<
                  zB-r2_1H&)aJxLYmmtX4x%8I_WicxgnFO=INU%*uOVraotEZNO^b!MkdO+&)v*b~9E
                  z>%*{IP!ff#O)A@-4I7o(UgCh*h>5M_o13lV(%__+fU%|eqswAt1_^)ECH+VKzElW&
                  zqQoP2rLge5=xE{wHmE>GI=9y3?=5QJaPs{lao;!>TPgMk@P!Lo-9|94inw$ck!&zp
                  zx`RqYKY4d<%zQ@E-Km&>w0a;6Q&ur8`G;5_ViW!hO>J9zaS6C&KGgE%;m|wM&#Un3
                  z=5biKbA}80$=*S*TkswP=cgv8|FUmj>(4d<`{yS|l;W_Zv{*3%dx4-nwiwDC>(+sA
                  zt?{(NSJNIHrQnFu`9{bU9NJ8rhSa}sK`7hpQ_4**kvYuwnUz`
                  z=KRp(0h|AtXI5gF^oX)y+)*Q&qu2KPMbiCj8LXc|FB3km<4U58r{zmN@&Om71&lUa
                  zo#M#*YaEdN&GwEqAJKSif_tIf$I-bJ$x7XAdHou=C7-w|mwnDyUS$nMmU}_E|5fK-
                  zlU$atl9XG<{?Bg&Q?khjv72?iuTi^99QhD%TkP(7yYrJcZ)gJj%uJc{H{mIyg&?wQQ9
                  zlw!Gm-?I-RxcjG#Ym~*6oZR_vI3dBfpEwR0z5lJ@jdHqt7-#uO#8D-$u&&yfw`N-v
                  zxJmej6s%2zs8SVOqoO~JHU^ju7W94%#_um>KXKP=s6GA~RDZngF6ZxAp*CnU)6`=D
                  zp7Bo#B(ze}W%nJu>~^rHlt4%qbnxQ6$B#!Dk1Tw5OH4n-BihI1{bc(hm&Nnn_Sf2A
                  z>!(mue&W&IX%QR$pLV-{biWe)F*>$$C)f6Ov-8epETs6y-ku|F27~~D6vy@1vR2J`
                  zoNRCI?eKM`Un}h8gN>K^hsR|w_aBbvpS#pv+`(gN1KO^04_1F1whdw7wB-x-%MK0Q
                  zzCRW*>%t^6Ad>aK(E@2r*~;#y5fl1Gopvn{PQPlJ!CgSS#O@!*8-pps2a3n}*q^D?
                  zUp{9+tZW^@L9LvWoJ6lTG?JIo*^D`^FE3dB1qZ}n(WdhpY(OCA4a_1OyiXT*+Nul8SrnLvYleTnGzrlqd4j5xX-YpL{V
                  zvM?Fbx?YC>Zpqh~kEc!pXY7e96Y%(dl}-LhKXr1QC4h(jdVJ#A^z2807B)abn4do>
                  z0oeM)m43W6t;sz?oD{M|&Tm?Xz#fV}U1-LoJ5AE~JV$=r*6s_kvkeI;!*W_dNRK5t
                  zoL()&n-q_kN6Tji_F-v$Qv&UO1VX|u<)x_c&bi%_0%NdhJ
                  z6@KV9?Wt+%79k89U#~a9wJb><*75J-tk;w4sECs2PuhJ$+h`}OcjLhycktxR{BAA|
                  z!yHXfL)Q=G8PqOr&`3$pg|PkJYe!A<6_d6$T4BMX@hK@Lx0;)`Gp+zjGM;}sn24?B
                  z*Ai>4*8&o3iEWnZM9YR|&Qb2)VgGvh^@f^ggs0t~-VE8GLhSk^tELqA0AhNd^Ly?)
                  zuKPfg4Y=vX$qK)EbG48SlVtkRmXAGt0k_lN;psmYw#p6S;3B#Z9|BpCiashcEK7Jla+4~u0|t~-6uCN{v=akrWJK-+!xJLVmWFY
                  z2;RChD9E8vNqo(N}UPytI4D+>^NFSS^)nS^|2-02^
                  z3rbWn_82%NzysLDXl^T6E=mK8KWjJb6k9Ms?id;uYb|fV{E46SjnWD
                  z5kDO#Hn6j)w2~WyhOA4gp#wUK$h}K79!vJ924ER~qgj-gOnRSXq`7yG-ESn%G08N#
                  zetp8(qMdxvhYYTmwvS!Pe+*Z|+5%NXOt4eF*46HAG_ZhfadJYneN|PXS>VHhwhJxx
                  zC{YgG57R%m5xSuKu=RWnu7Pqy@U$`R2vUem#!$FpSN08s{WPgva$_K?0?7!Y5fTyn%*X}uvdWzrf-hrp5bXJEs
                  zO(y5WUpYP~;x-kIN@IC@=U|Vli~pV*53;eNg$Pbx0QTZ|Y{0`R2{hKZQE%^f-%_@m
                  zMD&8ixieqb^*wc9f}~LVRMifz-bjNsb{3sAw(BeG?k4Trmi{$k)e$EMo%xMQCGQ$B-M&FP-cQZSc^o9%7t4KGFCx?o{bi5!(I1LFXpQ8UIv?ejVMr1mzfm+@(X#znNGHfPM#PS6h|WK~>^k!26G{O#a@
                  z_5DZPhngXyMg*%?++ksMQ6X=Di8oFcLNYTnF5EB#>ct>V;QD610lFH`A|W-VOUv-z
                  zXATY>*oI;qLJtGKYo#!Ei7U-N$qWr^wEouj+|lGaOGSJ1*$20N(K4wH)a>i#`j9y+
                  z@)1z3IAZ%HDjiI)$qSzcCH0)FmKGKgs(L)9{o^kTnBv-h9~aKu)yxnVSf~;IjJn0Z
                  zPx!OQM_qmspyRri~tomIE1^=40pY~Bi
                  zV2S)nd)zk;+tT`r)wT+bLLIQu4W!KxNp
                  zg=!zIVqRf$H&$h6(AuVlf@e>9tIx(#?glS_R>YMuc{lT<(^8f2dDZOK{?pFm%Qbw{B}w3G-sWOsze_*4DmixMM{Ie_~;wpINMp+omL2e7!NcgLc
                  zQOYCSCHrj}ls4@jx(9`XIHfg(=zkW_cg=9xpSzplw%c%YaQF^x((vM&%R%9Sv>Pqf
                  zm6g|ELu{ive&!PK?{96zX4sCNM3N9kCb$l}o>m;PURnal63!m3jOw4t6L(TIse4sK
                  zQ<4`jl<`l?1*!K0K&_*bsEGbDPrvB|w{?=We
                  zpBrL|^fRrx($EDYiM~Pgpu4kbRC5ejtlUckWotX6U0&)lY%7&3Ud1Q4W>A*S=m&%_
                  zuA@nJO4yGv3r~l|A`bV7h6pY@%Qgw{SZ0`I`rEjkJGp8
                  zMy*9}ZNuR<+J2N0dwH)%AoGumpYH7Z7UZ@;#o%>6!S&0v7fGaipxLQoc@31gJ9I(V
                  zeSUt^GraJ;dMLB|-2C~IK%7&s>Lo&yf)k88*p_VeP$KKyW;f0DR+S#uh`(sn6vaR>
                  ziH05?KVvm>R*pqYCX#8d4xOPJM$dT=VsH`XG$~MA
                  zc9?6pTmH2)hKz~Qx)7UgN}AuQv|6*6%8zp!a0K&GtKaI2w=UCS5>#Srh)bP;!t7Q(
                  zBB_4nSG7WjjE7=D6s-r7u~BA@9?LhW{n89smACo(w|G79%;_+bir39uNvzW3q55=1
                  z@}ZBqI{$syam}YeVL(+w!eeI$qT?=ogZ`+g-)i3O)6Vf)DQsf{Zz#A!e;GX}v_tS7
                  z8uG9gt2cBQNrNtXl^Pj01_l5J_yc`Qq}SiNt=hY-zxl(5mtpiJ)B|J7;KfR%2bTBL
                  zlY|9GM{&&ts;|CWfaT$Q1|Qop=Wu-2c1K{AD}^4|i5gs@>>HWeaS-tRX@v4KQ4Kb5
                  z550BLSIu*5J&(wRAqD*R0*i-rZL`5IG-JoTQ{GWlS<3In)t#L{_iK_l8B6rb7cA>N
                  zYOMbBi#?k;mQ~M?79=K!y&WmCe`{8rHH$YbnJv4d+zUU=c+LGt!;by^kqIH*bh6Sn
                  z=|U&6=@BJ_Xu8CrZD{TBg^h0_Z%rXN{Z)UJTz9d3@KOx*Dp&mX)YKFQ|tuI@%CP2X4E#wBsr{F+kBNQvkGySSjrD$01ir;OXn)w6E8GYR1+-QriKv
                  zr!N6KuO$vvyLAsj53hkIt`vV)CliMbB1g#6TRU(Hs|s0wwbOi%Dyr63+j8*Id;v&A-h?}6IL-T
                  z^~_>d456P!J|K&sDf6kO6Ungeo;)>frbd^j7T;K5KcGR?{ZC`u_eXGl}pufkfK_Lel0#5Ls
                  z*B%D*D-FoV(5B->RP27{X&~&AWJd&#^SI6)`*#
                  z*xKmM=I57_BZ;RiD~Xz9vU9*;x0z#8>c^oFzA(@5$?%~wI|mB8ihsxmhD}s(^^B@+
                  zR+F|^Os&pI&wJ+FE1M6zO8!actqG=DQB)*pB9~R_AhP>vn4;lbjWUC(F%`GLRW@c8
                  z%IMd;Elanz^Rsi>qs4%>6Ci=5Kt_qJcwbq3>8{h-fy4H0-+|`Dc=}u4f3XBQ+f(|cDiw99d
                  zuc{!I6Vl08wr)ady4tW&)%Hahn*EU18*QD+oCh0@mUz7?r3^n^_dc=;`7$+O2RpV3
                  z<&e&CzAe4xqSZTnruU!#(JCMng>xr9?kFiOws?xyy502yf0{@4{0yidzYu>1&n{j1
                  zI_Ra5Z)eRA;;h@$=T$80RzR^u_+4F~iP!3_3Z$KqO=7Lz2(7gRCHtGTZ{LPk)`|ai
                  zAE~HdDHvN2U|{2YF~it%aY4CWE2U=7u)Mi(tmd;NN6$f|&XXFMSghF+h5K#|AU+3(
                  z{oQxo&<)yNnX%UP#D~~F#47bor~I^6chT>LD+zGBCd3;lb|*dLU7SG4*RT|swQg9~
                  zLXXLeG(2$UDi>kk5|Qp6x#=M=qGP2jsHSV6
                  zd(_vXJfWi23K9Q3es<74Oka;=XrU#Y8#Ex{oON%d$aw~nOy144YgxS}lp=up+
                  zV~_WaWNy$hq&TAP{{6}k$Hg7`-IUZ{S(ZX&P0V=5{B-hePgnthveMz3B$r)-&yz5V
                  zmdXwKa-mlrXxUE9Ziu^0iU!PRX}s*~LAFhDCxQ2R&qv(YUfdcI$r7%k$%?C1IlcSA
                  zn&iKqVrNqv9yjJsZO!zQcHNc1a>@D?w+N#8#rvl}y^2x{^WM?I5UuzdBgc;fGrL(a
                  zj~_o@7w}Y3*{Gh$W4HO_+om)Ywcplj)0r~O(AUq{hTBA
                  z9CpaVYQWbAj20Jtrk`4C(-=H9+s>*=Rv7^c=+M7NJt~yaNZqd5G5WH9{%3Q*<8D7W
                  zryDQ{k=u=I+@cbZ_{3mmOBeDjCCN*kkke$siiB=a7~Y*-5taH#zD>u@gIF2%z&}0S
                  zZSV8IQ=<_q{DXRb)z`to}2T-V?|UJj9)U-$=LDortTjAyR<$nhA(0y6%sB6zn5ukp02
                  z!o}`0OaA3^^OCPdd~jhQ94L=T?+&*;vIR{FtK18SdfhWB`pMT8tDLNUNnj>+iAII2
                  zz5ZtljH$Qt^nD=@OfQc1WmUJo9ypY_k=~8^deQ1Zh^FnNxIX^p`rGP?)a1ZnZ3yL>pHWma*P0q5wDq9WBveVJocVb$hQM>KS
                  zMvux&)=$2)CK0D1)-EI&DWuj@NHtFZO+
                  z%vwXw>C+9Aodk-c>-d#Mn&lY1gO$WNbht^vvA#jFbd^_8iMv3(n7l~B7UFtbJZ-CU
                  zM|PEvGN-0P%uV|bI37eef_@{-%H`(Yv)0ULf05bjKT5GhdU(Y`@dd#(hcNdb(&n73
                  zjZqbYm
                  zV*R+M2Jyasiu9hn_hIOmt(2R!ELL7RagyE-^wmrH8~VRb10r&5&+3MM8;gR^pW;*zIs(c`&lY&PMG5V
                  zjdZ-kJ@TZy5xU)t94k{PI2YXS+dANs?QE5tAt~ykN9bmvhKIS62I(v~-48cbshoa|
                  z3z+65xzC@qM%w-=i~?QT`lk-}vCe)L?qlX^z;2{J_PC#YXrn+OD%d%}!-`+2pSDS1
                  zQb24~6mr!%c?7Uv`RBIb0wo4dVN{V)Bqa!N4}VTM1}IN?fp4%w;Kh1*8&i9&{&s+K
                  zSYEE&d*uHQR(~S)HkjsO70JAhwjU=-()-p5bIMVG>)|?(KpANQuT)LOnZn~b1$W*(
                  z9G(tcVy4ERc0&Wxgx_(?>!;+{@nXRDL`5gUKnSQ+Tw1y!I0YT};j>n!v>&cm-Y;wJ
                  zJ(@Nl6G!tARVdAIQrj=4Z4N5*`h}pn*0*e^{r>I#VwF$#iv@{w$pN!7Z^KI&UibV@
                  zeZKzg;Ny>g5iuR{DCePCj?;%Y{Xu1RoiLpNQB(2dx9gu+@w5j_QLneJ-CHd5e3QtHn+LgCrnDy|wdkg4k{$B|A
                  zo93HRlMJti0ja*?PXp3YJ6xscSA%ki8GjCB&C(EKWBjLg2E7rX(NJyO+&5Vm5#cxr
                  zw|WNL(qs9o%ppYAkOfIo_{{=yO{py%?Pt#nJJy?vbXHzAKE`jW)aYx*{(+Oha|c_b
                  zF=n=HiVlp7qeOqwHv>FEw{GM@eKW=ysKX0Twv8=SJ>3rGaG)bR0kyh&
                  znN7gIboz9Op;B{wKygt9!8^IwlG@W8EGK%xI3c-qP)XghEv`y3%~EMzWC!~I3`
                  z7v2z`O0!bs%=|v)CDjqaSM8ln2NuO)+mL;q(V}GiOFP+xx>nzRKFpCB&{PS-YLH|!
                  zO3Y{WA?YYo3Y@Ur9bE$Ih{nGl9~P69=G!?A_ET)4V|2}GO7=%K1}C%0FQJVK<~;H@
                  z3A{Agl3^HGK5&`NwQg-?7hct##nPQk3)v`1cRChF=NmKP0s^F{foM6;JX?!mz|t0$
                  zk}?I_raFRvWShBX16q{em9QdrV%WT9flPkJ)wf6F-qs(*%)X%{WoEv5I}D+~h%%h%
                  z;AizeNA*P&!^lCx`{x2l9nTd;N{+7T9w5qq7Qbgy!e!c4#46k%V8&J*O1kPd+_dLj
                  zbxkyO^K6;QU1eqUD#E(4k&%1yiWN#-2>)+<$W8XFqES$+>oERVWdFlLGxH?B;p6eE
                  zZe!ZsaWJc3157|Vf-}3(B+sr^r_vechTr=W*4WM{kuW&ruN;o5(@Hu&^tSz+pBiC>
                  zi@If6kF>b~XcOa+v!Kbu-PL!jtvA-|VMw#|u)wVejS_cJ>D~31!KfU_h?T%<%=NL(
                  z$bBwK^Ju9Xrnuk&DVep0;?6k&Xh?y?3v9bmZ*Vk5dUktF7x3(J-K`o=sD@~HFjLP(v+jKw*yVvH@sofL^okKUes6O_wcjE)!hovl0gUTetG^eHJPSuoZB~b1D}7BB)K&nP5^Q
                  z^kAp)+C=u56L6#Un}@JlxiXouI`AG)kKeo0gWa0)LO7^_fcs^F^r%n{E=+TwJ2Z+J
                  z>gaqwxMW$XUIp3Ffo(PsgQw3HY~@t@*^eM?RlGc*k^Pe-i$8iWzmDGY@ezqwY_C1~Q~h~RR(yVe-po>qb$^K7m=)YPT)(LArPb>-
                  zZmp?CM2V4{UGg=|MG2RUQ6MkW0EIkH7_E4l9xg=A#B!X?pd|dAI>B@TD>bR11Sk8+d
                  z`qQBBKfZhGQQV78s>=Xcu@kX%ZoLd|83v#cKe)?GyE;{6CvBM6hGLK+;nrls^yxF9K4s@*`Id(-GIS2s
                  zQ#z_a`kz5d3a0eX@O47}99ju?Q=BxGA0H0*=tmYRtyw5jXjuf3;x)g>Q(`O9Tw->i
                  z``SoUoOQvHaGYZr#7cT5*mKQJJ{Azihaa;WHRseSVHL6UAS*N=^k>}3yP`BK(PFRn
                  zJugA$iNX!9<8i;98V#4LSX}E#T0*#4O|qx@%ERg=s^uPNXLaPU>!T0f$5>G9=`A0u
                  zQ))V-E9`i}Xsu@L?ff}ghq}j3DES$a+gQ1kvHb5O`K=E8vwlfz2?XVN%w><(yBPd^
                  z`UVLlGMh%lB?GnsdR;*x90$&BE&-SaoIYKLdSy2BTmB7(FL{kL{rh&QIjV2Nd~F2o
                  z%tsXVyF2@*gQa3+|0z7ZKU~jnb}xi9mn}t^Up5tWjp2dTjUoEEV!`kQyp)Y;(aSN&
                  z8GR)~^RN)R?UdM7|1P^O<$>NMlpOt&-ieKCwfqGBCZjIH1=jcVqiScVYs<6=}E3k4eiJjx96Vv#)
                  zaX@_scW?V3pgR_6cQ7N4y&?0uvb^-e?T5o2InLO4&v(AX@lP9WJO!NZL*K}=v|5!A
                  zEP}bNrs4frnvnQ|+t{6=9WyH{P3KF~=4wgqG3KoYk*3X%-yXRWT|#YjvsuTB8#ltt
                  zjH~?J{F@0QIipM{PCJWy{SK!!u9s*I#Un>0^VMEIVKd$#1wM!Y93%i*=n{1fx3uwW
                  zsL~4}AJigF`4-p}0xfSaF>n=DGrAD_KrWNp4q&eKvu-;0kQi`_ByB^q%y`MLU1oi+4^H`B~H
                  zQ_5IBY(0cJNKd*|$RaU&%nidbFf4X5sbM|+{*;IK*c2GHwlL?^$zXRjEkaD{O$?A`
                  zEfofKjhh}0fGGc4ZY=}6RQ;4bn>+q+_%2&!=a^R3<=7nVA%p(U*4dzxh%OGb(S1B~
                  z@Nuv6B=YWLO}tA*7!q6&LZuW~oF=cFRMn(U;MOIT-r90$G`+bHbZYlzN4}g&2LJ&X
                  zf2sRYWT*s-B~4tTGvQm7N4_eps;6QsrV3qJYs+Yb#R`EEZ-Jn=NB9W~hE<#ED(x(X
                  zir5AHr2VdE?eGJ|rLBAC*w*Y&BFZ55K3{~J@eRKI-CR7A2lXk%AiJD-V?`yfg%fP8
                  z$%A6Dt$Us*_koK1>=`i3jQc>N@n;w1WAAu5uvm(9;YM;}I0RHENtm;gFMM)6O?oQA
                  zHN;`^<9PLD84sHr;4ZDX&na@nOOH?v0v42Zv{LqG`jGUaaECt3CkL}5k^W-V3jIsR
                  zHl9srz4E5<#nQ2$O?rAd>SeQS2+c8PyVojjgjUIjrx*1*w
                  zx;z;4z*e%H^!}x0>mD60jmYRI#;N$c>UfLfe+RaYQJQLvdH*~pMe(bmZ0_J1Z{#h$3E!xYn@~kV!@MXdvBkA0K*_nX?lh`5
                  z#j8YMe}P?We`oD=c>KzWcY!_LwA$-svOSi55!->;&1IG5WQt^F%A|%>{~lm+=63Ec
                  z;M-D3I=Yh)(RMZ9)Ia}h68b3XN{{jTTXOKqTwf~{Avx20twp7^Wr4K+W_L*T4UOLa
                  z=?XHxf}u*o_gP$Mf>d%ZGCNzCdy(1pSF$#Da(}_`<}r!~{e5)dja*${^IEbNB44((
                  zZt6<_BJbs+Xr>dCXV%jY>E{)D*PNjam%avd#D9>a*Q?Ia0?voDp82aM
                  zhw%UF58c_8P}g*Ag;6#kt)K@ld1CLr>1RCOt0r3}%km!&Py*7UTkMFF4e^}>%c)qkNhfYl<^aVCR+21`pz%Wy$MU2?XvzQk0bIfIWo
                  zqm(3nv}&O&+i9L6^`O-D(um2kit>!zmgS^$-lh(v@c-5J0BVXnf}L#|IOK@8tjxbm
                  zyRJjnoM#N^;6Q&j&T;&+oL7?6I#TAVzBa{E21L@Y3v@F8R|4$cE;MlHv&~o1F$jec
                  zJXmn02@PL?_al;8m*@2A3)thM&ZWKp8pksWB{kf2)I|5I|l<p-tN$F&1wcq1btn}Ky1ugZeM0lgZ~
                  zHLvb4CHo9BgmNk2y`&Dy+R9TN;GmDc4jhiZRwqu^eAi%W9+4<}wf_(2tD~b($#qh%
                  zXdqpF$&&GGAbNjE#{fB3uYVkgFdgd`D?@d?qnctmQ_O3jjSW9iY%TJm*2@tx(-tYD
                  zUCoASRb4L5!Er;ucWbk!D1M92GPAkrO^lm732D>g5%Wg;@1_=jhIOaAM=3jKROcTg
                  z|GhRb?W5nnmEEVS1CeW!H)r4*r&)Pl*oE;GC*@}YykzO&{-H^+YEcH#Z~yk%G<$-B
                  z60rB3xaRNrWB`!sO-I`)LCVv?*=wig0HbGI5nMP1mMu65Qcd8r;q}%XJAZgciq=Fyz=q}DRje}qy&r)EBDOxiYGjXP-J%2z
                  zYkQ$pvI)z}_fUHHpEK5H4=d%2GEf>T>sYv>RR_}vXqt(JscToQfjnscq&(nAB#BGE
                  z94oiFkM-j&V&P==vbiN*b@Wj)*0R{$v}L4Op9eD^Du4N$gX#CcX^-JGN$ymjKQWkY
                  zaC;NhLjqZ|pw=`hea!*t0q6EM_~XN{BK;Z{&(EZ;uW77U=_xGBnbYFHm*(zQi$lIw
                  z$!tzEwbY5Qb0mFPP*hM_Or$p=J-5EuYumu^C&WR1H(RzppNCgWPcFTv=wHrSFqN4*
                  zz6|KdcKrH3$Y&QZrRW>vX@4pTNr|o-vm1?|ZvI`X(mf8_zl|B<<;!{XR`y*k@O9Sb
                  zkE0V!0rR`Wgn9T!v4ZbOk#>hUr{;t_p8VIt`X@1Kh6vWC^yY}z0GvsO5Cw&ILQR(dkbYM
                  zU^c8FkhFr{@wGIh%fcMO@fyFC6ugiwD0^yi&zJS0rkrE
                  z*5AAr>~C{!Og%yQm3(oU@EPq0;l(ulcs(7Gmj-~2CSXWviHgp+Qm~{gDt+OvVpk+<
                  z8&GjL7I&~22VlTSl*GE1o4b8^AbA~tzlsC#qi|A?4YQBtvH(jIGz-lpal3bY0iY-M
                  z&DY8>?9+*Bi;IaSNuoCr9Wcxx#xFB3jH@%Bt3|L9GI+qPY>X+`U0(-GCFxq{#zsB(
                  z(BcLOJ7A6U+f>kNJWW#Wz0YM<`TY&29}Ol|FX=HVeOcmmJybrN1-
                  z=V-jy@J5>6a!0upfZO$?!Egr-CsPgPwzfdT0$`yLpgaaJ{W{;t6#WkHkf5E1Pu#nA
                  zp{BXkA0V~J&j@$h`BKt#Nsr>`V9%_sWY)oNbjr>jG->BxS=gk}ecTO$t)fP(*Lo&5
                  z(Myw4Wn#DTYwkyuJJImmS_nOo`0DM
                  zpuvcSps=02W6{Auhb=8F#R-mAK%=#@MS$Ixmi~K|`15260dnx>T_u9Qj$+C$wOdvr
                  zA9~OB616lJ5buM>M2ut&dNZyC#I4a41MPIB+;QtDPGSD4SHC
                  z4myEz0Vq!r)Tg{Q$&u#?8^NVT>cQg5cNlpKYy7LFt&oR2mw0%*Sxi;dM>Gl
                  ztN7lmX1k6%?A9Mp*lJFGe+4HkMlu@^Lk84G3gx6s4*)WV^IvqDxEqm8U4uUuucCAq
                  za5D1)$Yy;JOIHs3rud>2lfRv2JmhdZeL@fe{#vI9ZKbx?vT?mAH(?-?$I_yQx0$*c*OM?@tyxnlpW1gQ!q<9L_
                  zUt6}-Jllwq&0P;TBI2E@MO~&*1kEzPxv5C}25P0i%K5&yxUG$X=|E`^O>$?#31SPt
                  z+;#uFaBlG`0jdt6TfeL#Sr}{UJpy9(A{>DQP|dqu^~5-QI$x8wbVc+&Vq>QY5QpxI
                  zNQ!;%vXS!$MB13ermf*{zHA!+%>UYtQ&*eZ(tcThp`g~x273i$Wz$Tv&j8?;cBtF+
                  zqsa$H%Etnx@c4ca7*-_7`WD!ryaJTem>05ilf(l6WdL4hm*t6=4M&M|fIU-7PQ_uo
                  zo3YpCfHa}h4Wlm!lv#)UTV|Eq1GN)2J3oq<0sF>vq#gy=y6E=rf;ao@w%K{4-Zb@&
                  z=J!@U?1IjeJ{54KN=#j0};doYC3vGVaDY5aQ=_*EY|(=h=riHom^5h7>)%HZW;7#m;lES0-7ze8yajY0S7kq{QV?mBRPqk)Tca
                  zR;efMqUX3gVh53b0ERlarIK|m7vBJ^_SqiMXysmDNfghwZxcUVDjz!MDdoG=ipr=%
                  zaM^vHnb-JSWXazHt?7K}xn5;+%L6u}YjwvawfCL@hTb<$toJ{A
                  z_G}P<}x1aAM6u__mT!)i&a=nY_H_eeKd5u&*$T@P4S%{3QPAo*777cn7xV6VIC
                  zS07&gW-*NLZEc=#>N2AZG0suC6n=+JANIucyT0*i-E
                  zCNwEo;bTiNpGs!(YUFMMAI>SH(O>&yH6`EL_#C!~Lxef=izF^3t}1M4>u3f4zbF_@x_yET3Q%Hd+IEF`49
                  z&@}xWfPepDWWco_0sVFeh)$y&8`3I;VIKhlxfkag7%pZd|00I#njsazf#ZzJi~*=?
                  zxJ{JX16##%pwu-61XjSj`Yw1dCbv+pfAK(fv;;qlLzxdEc?Kt|<&1!#(VZSXpuXrz
                  z4Xba~tnroaD;^GT8-c@d3k)z%)BAj{kj7eoZ;3C}*nFm=Gnz8vVMZ0@SX%JKgGypD
                  z?obBu$Wl(K3i~vIA)33;b+xD)n9{h?aMG9N?t3(B^~v+dah0Q{tzc%k0L`MV#G9H2
                  zm=1-HW~y&lO+*Z{VNw(bVb7mE8(XcT?HuimiQX%pxn8_A0~sqaH*=qC0|DLB@(t2;
                  z+L)zMpdAzl=rczU&pqwua_BXb^zRyjQ!r}aR{WXZjXYKhRbOp(aq<#bg|IM%QZb8S
                  z>u_7u*1Zah<;|q<4doqOBj)u>6G{D+S&z@>e9-mje+uxv{SPELA6)+iOaXW#JLv%J
                  z88CIFJqP~%{k+H?g~?`e^_&dE8>kwy_fLi%6*fE#+TO4uq;?QkIFWDzjcef4EKdX)
                  zZa_`21%5;WT`F*Q0Q*-9pdbx#+RV#?wkbt{mDRy2KzwmG>n{YtuVesSS*oe}LpIS)
                  z9~g{kwFCHn>jBVobuCaGr1J)OyjfqD)AV(*PPsOFo4r^q|i96o7fE`#i!nJ&%GrM
                  zdqU!w$5Bj<>(@UStUh*m0Zax0^D|7Gugf78Mwe#n)Bt@0uvo_cLfa@Mc1dctw`Q_V
                  zcoOF~USrJIUk{)b>wBeuLb3Ao9EjLu#x8XL)JbPAfubxnq^juAqfw^KdQT~9HdrN<
                  zoLE|GFD!gSYySZ6jlFPTcX+uHUL$trj}qT*gR*1aC)QEGFm|J6vqNU|pn$vrQ0S93
                  z-xm7`1k01WAgaMxs!s+MoS_x_IKW7h1B&Y~pf?BN!Fvm->9$7+(N`}RP!UOqU%q_z
                  zwgYcP5Qp;Lnj$-Q1-4e{${?B7@Gq0Ea=PzVES3t1`uwE{*733swdGWM8Bat
                  z42_g{Gs}R1Y<%!%q|*`LUJMZyWP(IpEvvH}Ma@*DR*RVgHt~i)gcKTGJbtAJUT
                  z|D9t0?@EU)W>$(RCYED#zknI9cx)f*3#6^0G@1GQB{>L+#M4~=iJ!XyY@Q6rNqq`H
                  zrDdHc`b?V)j6+m!#ob~*nAiPfRs7|aO5-6>RNdePy7a$U0Cn8}vY;-jNjr0KbR4ip
                  zPU63H1kP)Bn~jfk8LUkznbPUSlTB)t&4cD>>Rwu~252qVPF-VP_?}~-bALwplZ1`=
                  z`FBu4m?zx7?CjbUP`L(wkB@KB!!juN2Tq9vd|B(NxWCc|BD_YijfxC=u
                  zOX&@hXq5?_V|DiMiza1ULX(wbLE|3>(Cy_U8C4yxW0AW|aA_Pac2dVJvNc#Lk2l+2U%PtT*+^rbq4e0dwIp;i?@5Gav*f7SfB
                  z&&GI(lmTRSZL1k3njCq1+0~KPmma#)ZZ19BFPSSBCpU9DdktvEOZA%%&3rlUxy{Z0
                  z!_mp-k`1puLYNFTNnhJW0GW?7i;TMr1tx}cK1-+sr;ATqRft!8EwrW+G@N**UXg5r%IRyqEG#spuVD?&H
                  zgpPEA1{2u}t!2i+O(3ny#*jz+2Z=}Ge{Fqr>P8cxD>O)rnWe)~e?g*5exs15qh)!y
                  zkX_o(jzql`6|ieVTOw0IXr|jlhR33$Q??K_LtJIp`-Oh$EB4jFosRzW_(bJ$v=CB?
                  zPTg@pfV!dzZ>q5xPo{213)u`&W$1}cO^=rD$V^!Z^_g&aD+j_EeS;h0l+bhL#Gfo1(Ci>6|dI;kN_yq)d
                  z*vR?A^ImlwciW6?=})O=ZzN}@pBXmx{r0?9P&^-RM$rlMfV9lQjh0G`R!s$7G$oPe
                  zBGZmUsj1c0zkcA`c1En*e&7d;|MOzwka5*<
                  zmeI;6UN$*jMc0{|j&C^I1l|=B5RsxOf;zaL&y+(7`c#IDs+90wZW{SkS?SzDu0Tt!
                  zdLSf`8NxB;;k|R$&j6ce&I8uiWVIej`?7*=QFhiYZL}ue9Xf2}3miodu)_^_@7oFK
                  zsI-xWHYS)|mB)qRg6C`0k*^vt;{9c~4U2}OlOA14GQ)sUb0Lhho&ciX%o4iJDv?`3
                  zeBrh%;iFrku2bv&D*1+&371jZ+46J&PppCSTfBqHvv-_@WteSeavV>vL#j!0y2YP}
                  zc^4hm@Zf~vZl+~rqYLbr%`&$oV8ZNd%~BIbq-to!ltVK0xfROOp8d40Yxp96)%5Lz
                  zEv<}yuoGuZ+2f6S`x93Lo)9FuAyS__rD;3rmOTF4#gRRdRk%Abx@oTBKEb!jZYGAa
                  z=^kN_lHF29$z#UHA^90IDP|c^?bI+aw{W`bpVb8^=ZW`2FMPcR6dLPL)f0L**gFLq
                  zZgEKdu6=T@IPBo?X+gFLyQ&OTdX%8g(yOoRvMX}b^1bN7th!*D;vr=6ap6@RY+SB@
                  z2jTH4r6upGrsjzp&{BGQcj`cn`{_LiYC)DJ^)Qv?wF%aQCu#TQPR`5hcQeCy4sk-!
                  ztYn?@K}yg6!rnWDN7jTp@NVC`bUI1$MG!w
                  z^9)&IZbq7oZr`K}7yDSM=0sPf^|2Ubh0iKH0eVq{pcz67?N1yD^*pTV^{5U>_~yWj!%-pUbt3blN4*4=*R)soxy{ZZdzjy!s$m;t
                  z#>&1vv94b1ZCmSL%M|gay}n@9c^!0{Jj(to+dnt%f{cKyY^idlBZg)c}g39bM!pQ|3l^b-`|mVZ2xI2
                  z+T;cLpWtVSz+-T8n@{wz@jolaT0fQ~RG+I|l`^ltIB2D8}I24V+q-0gt_G?e!=Q0Wy1WXVL4DNH6qs4WeB+MH|#`m?y
                  zSoeH)cW&nQ#MBiFHUd;gpOJ41^J_BUk%1FnBEtnyAqNgTOcc~0&wZvPjmq^jktjA6
                  zfP#?=(L2!tweA5aW+%sb@Xr!?02(Vu@=<_&`GoBRyDMHg6tU_ou%SWJ(dVVf^Tks2
                  z6XBW&9}O|3+%SBfDqq;ynO2SZ8g5_mS7?z0{?J!j8^CJKJ^#oP&sMcUYYVc6KncRm
                  zUT&!6w5hKDORUhuZz2*+saJuK+ld=cHrbJN$nS*)Pe{nA)cpeq
                  zdu18g*{l^XVz=c^g!%1{PRJh#hNr7)wa&^Ei?4$~&k#5C6{mYOkc`1)9NkE-Mt%Id
                  z{V9C%+31ugh}l{cr$U9sC(B333m017n?R^5_DFMaJw3T7_!j}v
                  zU#1i~VNXwbxh!{{$=3lWjIbkl=Yfi!mb|zRg4+gcmoaS#?mHr
                  zk;D5&j!1}E*PwiM)pVH4AeNT!FVCLXu0z9|KHd~3Tcv?*Q?IhqySMw;D|a5u&5rvN
                  zExEk+YAA|nKhkzTi3FpAesHv!g5L($oSz3pMS(3jc0ezlT?P*L;EGkEO(o_e(_Xb3
                  ztJ^zGS%5MbQbZ1WKO2yL^i*`TDa4d{6_CPBw2~N_y~gnYda$rl!xNV5EADEvVy)^}aOg-`%0ve1kE4EJ}#
                  zOLh6Q;3D_w!3Fvok|2^k-(du<`X)K_`oDNQn2271={k}
                  zU(^3I617~|(6u^Qq*0~^I1Ms7C49RN(qwS=u*YJns9p2w^I?KWL9>nKYudD7
                  zF$zUU6|$TfMD)F^HTd7_x8c0NIq2C{oxYNYsWx@sb$RE)Bq_`6yw6j(j@!aZ>2(Jj
                  z|AJDg7?fOT;1lQW4jo414^?h=euPY=Pm<@}Jfoh>R{EoYB>y0TwfOrW(5+%*IF7b*
                  zwFNWI`S?ji5w~xAja>D$>|_>s{GJp=sl5moPjf{}EZ^R`o9Xu%)o&Sf7ltsAmh*5j
                  z;=~gMfOU6Z{Afy0A(oTJsQ;cJvs&Cx70Xz(n(vn_vDfRk(`%}6kJB>>GV@;ELV{MWmM4#8@5vep6
                  z=PYW(xFPGa<-|9EKpkwj7}V^)hg-|Bi=Zb`n(Yu*^*OM!(=B`irH@{Jj%U)Hbb)aS
                  zlN3@EYXO+!>`48F(F%DxKvPsahizcq@@L}wB<-a8nq+7uzXBayRQduFEre1381Dr(7R>Ga)4coHw6=Bl4rmsm_fSb3(RqQ7q}a1emPVbXFPI_s(ApW0m_nsj3EX{?elK7JD-L0JYM>>|@EH3tpe^^c;bSY2EcP6u8k$iFY|v
                  z2Fqx1F6(0t2Vn`XnyWFADcIcHg*77h_0sq_FA*Vu#&AiUycaLnB0DlhF-QeU*(&KD
                  ze`y!CewH?bmX9A6w=4POBQhakSdm1|-!)pl?@-)kMPn)$;HIzETqrCvND053zvFWd
                  zPZt5BYcYME$ZGWY1n!qUFgS6~3=ynf%
                  zN~;bHiR2SP?jmun<(KI%p{Qit7Hub@&(xKBbetlxW9T;xw>P;4{75S}HThaCrMR-3
                  z3LBXA6#DTfjVvQWEAo&~w6jo|DJvce%dV0p?dtH%whPqWY!ams@>H~XtMMvPkSHNv%Ot$OI}y5mtql(0`#ui~
                  zW0CAgvw#HBlLhlo-3BzBY4=*YI4$mEt!k5w!swOFt-^Al@ZS=mfBhdrTrWdx|KnLP
                  zLp7YZz&QW~`a*(eF%}e
                  zduYgu#;)OU3p<>xnGGg?m)X@$Hv7KDE|{MvbH8IIv{V}E8#XdS
                  zWpCO2J4MO-(wVZ8Wy#Ujp#?)AqMyZ9F3oE)_F=>P@jh>|z(??X<`#THv)0+I+yNf6
                  z1=+Itz3?tSZ_H>&FE1nG9abdH9=3Rf@n5O-P_~)xdD^GebxEBE~X3t%nSxe*j_y^UqkGeaKu?MEMJL8
                  zgv-7T<<@QH`W-8LJkzcae?)4(Z(k^wFMS`tp&T%`u-Z1E+=?Nj(H{F9y)^@gxKYXi
                  z7msvglG;g9WSYG58UwLFG+ZG?|BBeS^*?6mTZ|LL6sCqEe%4Hhkb*DK>5=|UG!4?u
                  z4)nx;vwIwbaEKqv<93p`xG%EsK$uy-_2T_^o`Ly)f=*^^xh&wY1(pK~C@25-JE#ZB^|9;18ZSlV=%U}n>hX1$9V7fdrLF&lR+DWky!i8;q
                  z!v%{KwUcgvQ|7zu@&N$=kVvh!cGFj)-tzr8tePgFk%2t?*J0J-cIAcb?YEEUW_##c
                  z*VugF1X5I#GU&Y=|5|9-8hq_r10EqpQkPC}aNl@{Id0?&rq}%hCK<~If2ngA2I|+<
                  zsla0k8ujIYDBbxV;`;u8&c;ZZ=23x5ct%-Uh|Le0D9j8rR^rSZWFDnf+hezr%P^MR=S15G_?m}G*
                  z3*GtJ2Jv0Ct}D!mdXL$AT52P#>LnQ8nG^0C?Yez|MlL4V
                  zIij;t+ZNM}9>eNe9D;*-q{}&NKW5|)kx^ypn_@s5yau9QvCTD}zOh;U`TPGC$8QoU
                  z){WkiWm=_*z)xr|-D$%?v9BUL;xBVWW|rB6%pM?6uO
                  zt#6Lc_-^jh!GNw5#JA_Csbq9Pn-6W*m2)fUrm89o*K3uXkkkm*>}%xGLMvmbNzRV1
                  z?3q8R{!aglhnP}tVQ<)2|CPA31(UB#P8viF
                  zFJT~q?RjuWcjn5k`OEpyCg3zTWB7FECxr0IU>R(DwjXW}<57)QMTCJzG
                  zC!(d2^R4Mz{Jz-W&mqM-*96En0qg*}J!|cVgG>kC^+#+)SJcIqU
                  zjuwtU4_12niXB@AyP*3Ah-p_E+CkZ^ySd`fzu5T+F+beF4_VL;CZ@9tNyptf}AFkJ+o
                  zK!gbB=yMds5dhcy?b*WK2ZHgNb~~S`fPRFOMjEjE?jX$)rvMv(nSaG*(D{W{yXi^e
                  z-M2t2@Uod$WE2w`=xTLKs(|vvZ@?c=Ws#=@a6>+=;lK+frlf?-Vt)wq@9t{vV_ryR
                  z(vYPhb1=pT6zVZ?mtQdKzl8C;u{_mr9e8S>J*F
                  z^m#)~@{d!gm+wA&g(sW+C51#sY4#(|{u@Fpb8f0=G9`|keDWPh5N$+>xCU)p`+dpF
                  zc)sQRhMHYRFG1Knb+mQuS2BUaHYJniQOm4eM9Zvz8g|Vn2T6)@{;~)ujNA75#Pj-0ZH+Z
                  z0DUKY@z?tuJ{*>2Y`}zL9naH+SBDgyo?X_SKBLL{T9kb`9k10_o4>?T=urJ-+VCaa
                  zPahAx^0@tm8j9UFs6c>?TGmO}?6J+ksLREMVDF7WMRqE!bX;Mvg0X2k4UFSqG>_44
                  zGDySb))c;-{bXp+_#vg65d9|^O7NAWv^c)u(P%^Ye}u-#PmE9?Vv}t2QYD>S$&gGC
                  zB5PT!&QoPCJGy*=y~{y$zw&~y=OqFRx9Hn4wZ%)?9;~pLY^PN*iF?cBX7PlfYET25
                  z?jBTU6DJy!RUV?pWz00Fp#Z~co)-oF65`_3GTGfaeY%9y9WFIW#!BG&LE$-}VK?0L
                  zn6!&)jG;Zc$6zPo8Ihl6zS*to$iO(lXrm%osVW?g-KHH{l<;Q{`u;f>j-n>Jo%!tF
                  z;Ei`m?t2y{Mwa8e8ON{{Iec8_!lFpnc4+N
                  zwRv9sZeG@S>@Q8b!i-`!L?c&cstZ;OI7LYW_E3FqcU
                  zz%Y0ZG&DjDNacrjLlZ{rOUCmda)BGd_Tv-fgK^+p4SJNInDtQee*U@5BqJ?#pDDWs
                  zZNrlDeWv|`HvWyx(E7)r?c|`n6vg_A@!OO18#xJ|Kbn&+dbFExp`}JnP?PL<&xC}Z
                  zla<`8-u)ULHST+Co|^>a*}=6RiVju5EuBWfeypkl5dFaHa>bGHr0ON_4T(D8ACh3}
                  zoXPLJ`uEBnkz*tU6}Ah5B-UOMo3kx4l2JC;43unGx@46oEFrH@rg+0B?Adxw>73+9
                  zT%<~ehcDUMo+ltvPsCFlVDGRssOn0UvQy#W@1L!yK3^)1df0S4U~IJA-|q!XCKEC0
                  zLe5@s&RBFZq719#KmVbfHsl_iaXsQ)YUQTU(SRMx1X;Dbz37UVOtw|@>7T*YjRxf9
                  zV0ntEC#$V72EX3ioMB%{B;*xr_Mr%sYGY$48;eOQr9ElF=-De`+7xPVd3Nv8ux|Kx
                  zPgDF;&60|`&_~iR&jB=FUlA_ehj06J>-{S>4_i+c!4=cl+S;R6HS4IJ-y8iEzAz8h
                  zs@Of>wQWaSJdf*3i}T{c6&tAm+;&RJ4(x^kshBDc@{i0ZA(0>97WK%jRnFLU+2QLN
                  zd%@w;RwQ2vObP7-LzAvt2lqdMh`*7t*lGHUXRx_lIQ3#Z8e7>gp4=|OiQ_I%`^d6a
                  z>+?Fr>vgiu82wN
                  zeO4ojjcWieC;_5VL{U4vXs2XbwMFNU2jq9hwMF%`2#Quq40n%O%J|cGbGK>zLnSb)X|g6Qg^3uL}59l#k>W
                  zFyVR*8asSF&EW%fjRbZS|F;)lWanm9DT&qv$Su24n;4HHzy(9(LQ_A_XWMH3QMAXL
                  zX-_Fe_D^$tYW<>@VZ-6EajjbVk%X?OsC$bRb+Ofh9%PW87S0UcE1LA@dlW8z7UA{PTdmw;XK^G?7n!Sumtv{}vxVjq>W78q%iW-5~
                  zCG{Nuw4^%CN|@N2)56C-VVjy>`dwU1+zP6IcSV)tP0cc;fPsM-4t%~Vn;YYIFKKRg(-$=7c0W?^_S93v&|qL
                  z;cgZT^Rr8bpW*;suhz~ZXMjniWg4?`lHWwmL^Ul{(%Id5RoL~GZ@fHLoQjQ=nz=#8
                  zAd++<g)5nJ&ja8Pbl+lVtY9zg2vz#?TvuxawK9auQjPfKMZM=ypuN&97I
                  zm1TP5j1ljkdST5WU&&PLGomvv+9^$rF6Iw5bL!U&{uy`jA{ScuByrYEnm+;=E|`IdX={)h=zGM^So%=42f{SblthPNN$fM|vFg)EeY6YrXUZk*K7;SxvI|lVrQjS_iWmGn~2!$7$b5br)o3FE9RF
                  z#EY9M8LN(CxIVRnFfBjRiIt=^08Fq6Y7;2+%!x7InFy2rG
                  zNLbh8i)>V4L_dT#f6;M^wzV|{t23l3;R!#B;@{bKBxyz%PKO%LB>My^oy{oGST1wi
                  zyCvuq5maJ2i9v!5e>gC_rLj`sk`^meB$dizHape~PPoQv%DVQeiD|Uc4&SvhvSIXH
                  zoIFfN&&R-%ajdHmI4LRIvQ<`?LMn-3r;0*j2lithU}NUc#q*kGGhG$30+*kX=lD{u
                  z@%u>LPY$iicVR-8QDKWB{y0m}eE&Mo;d0cXo6r0QE0JBvm0dIkq;ygCLmPh+K|L~n
                  z5%lm-!!YygpRpi0!bdaD$KtIoEn_5^_y0Afa=YlM^xTS_Y1AgvY9<#J-)Q3Pj2Dg2
                  zT3OF7>WO_LXNdFM>>DUl8XQ3-h|exs&NVVMg+e@QkI7UCT*Z{)ncki*c?yUz&iN&XbMH8TZmH&xw+$
                  zG_tU$j(WLR!AL%QS9)gf+Du)ir->J5Db?T9xgw1KIvt_2OdWRxXqL13UUYqh;hmcE2%c+(iw(Z&wXIoVUy!q|S
                  z0oKO^0l03@%gsu2(zCNeaek>wDb`wdA&>Euaxd2HgEk%OWA$->9fEAb$D>u|ksudK
                  z^w>$BtTlk-a6ba3dnxat*n*2^kl%bm<`}Ipa~g#5&`;5?_3o($fg9w!L+)IC8l>G9
                  z(J?EY(T|mi1DG6FK0U-{*K6Ddx1n4=^?iu`6Z3+lJZY)&kNGYg%j(7JQChN(@amZ_*HnC%cvOgA`lfHwhZ1=Sil>uCvG%k5{eZ76B_`QJT7C2E
                  zQLeH+elvRO9XSinFH(^Mg(Fd>v{-Dn5IcRUO3VpJ3mmjSTyHSXzkN~D$iP(wqRW5&gP297^Dah=lg&@$A8YDbF+}N2IIT`sd
                  z^?x>v3`V{f1vo#cpY!hs-9)Ul!@3EK_ka1A=z+wIGHSYIOZrmvgb(rs^`y-7nu|&HQ;ry_qnD_PCaaMtverxDN5}hKuQAEP;>YUamO%ReEo=
                  zMt?1el(=k}OT1~X)6fogrGy9r~E2_-7d5aZWhvWaA6zMvUW_a_>Pfnyf
                  z%9Y4Y=T5Q-n^rW`W3>Qa*Sg8%Cr*5FgsLa}i085oO-+(aXHa#Fj8rSA-U_Nr8Mn3w
                  zE;JzBT%hhlP2@_{FJ%FZIo3esd2hd~!!V7ej_k1XA!GR(8Q6sC@?C=O#6Q>;)Mu4*
                  z_Pr3#z}`m#a%KHe6ef@$nW#&w^DzWm)~ERC#|225h_1
                  z50u3`*ZT+&Od_IkMBc;yd_>X27e33TY3n
                  zMIb|JC`BcRSUn3=Qs04sHNY_I>4v(tclc5aA&2uDnLt$i{~&BTrB%0*|NN=6I_Sug
                  zh4I#3ps=M@vk4W9$3P@$a!5x8byN_f*6k6H4|s}}VW`0L!on8`qpjG~vSSl#?Jo_kq5mI7|j1--uwewNx)XlW}mf|lL6&ixg
                  zPQv^*3amr{`fPzt4+u8;qv0$bV5dk88my0%mf
                  zG7`6L-t{D`4U9Xi&?iNKFy;hRMB*ANZ`k-Xd5BwJPWFdTx45gmnK@hra?r%MNd|L%
                  znzLniEZPm*Zz`yeLP(yK(=p_vrHM#7)Qjh&^#|cf^lR@)50*UfCn3PDrElepPtNPt
                  z?X<9X_P6fn30)A;IOW_5h0a0&Xus4KVhBd>;tTO|IgVHk+iP=w_QU*p!OyDhM5@*r
                  zr@!A@sIdyd4d3v_lxDTa5^%YoESQFQ2vdVZK6$f*=$P*RlZB2=fX}-3oX_g;CVG0&
                  z6CqNEgYl*C-lcvFx%<-##ccfrQy>D7dJ^!a$KB!@3|;4K!bL0YG8($c`X&Yen|y8{cvYSK
                  zoE;VP77X+=?J4@
                  zx6Z)p&l`@e3-^OHL^5T@CPLnVB!JlV#K(jOqNK!uMU@gO<_z`#cc4hum-g3)c?<5q
                  z=>7xvPxtMCs&q8nE_&cVe(dvbO8HL|ypfQ!{~^wJ8j4F&L}|BTe+&3FO5bNnwwxE&kONzO!+Hson!H&#I)Pu*y5S_)%0(BQfX3nWKh~uiIt)P~guD|1V
                  zlk&kGK^>1gaCjPvP{($dGqvX=x4AxNIu^`dRoL7YG}o8zl9f%3>YmoW+l>4E6ycB6Fi+t!jn5|NfM6B@NYbM>E#`EhATeYedF>OV
                  z)Az#SwQebTOKv8ZV{7DHVCP$W7-q{UzGlQ!)BDLF6mtoPt(8a&Juh0rHLdmxLW|eTqW2CPxawM
                  zRQiG84A0R}=@?4-s=1bs52dWQ1!m?$s{*mp&_J^QIua$%jg4O013ssHH}r_2z%1Xd
                  zBi>K9KDWZAlXKq=PZTt8E{C4&ha?&rT9!QlV1C-2wOJ=%G}y4!6-Cu-_X|2s0-t`o
                  zD5%I%yYAi>0SXPm1aW<4<66u_2Wz==Kj3b-Z1nx!B!)kNjtL|-8#IHx|ItWq3QUfc
                  zlpy8D*rRwC^zQA|nk^mFe!fZ@!0-7^qO~6gIc%SyGjarMj}yUnij5Tk_@vq5A~{@z
                  zI_6vzdVT8E&|BV+=pR#-r}2+xZSZ)qvj3?C7-$W>^icj
                  zy<|hrrz++9MR-I$s`x#B15WNYZrU8HuG13V+FrlvGxu%T5WqFa7E9-;KwnY-0wd&eLzA1lrtTeN1qU?_*SMFvu95CHn*
                  zURETh&wFzcFdP65{{Hrtsi`iSQ>Kw^f7zC~trvMB%R~RVExgMq6E758_rsA<$LKo%SJ0ZMfHc*?^e>LM*SJdxPF5#(4+C}1MoH*JHKM)nKH0~f{R&RhOZqq)#~mB)2}#(|O?}K*A!qK}uapY+
                  zgc?g+^Y=K-AX+NAB;;!>IbvJbo!$$bNU|?SPK_EDE9U{p)!k(Jv>->9)!Yca#~K*w
                  z8uQ|}+tqEJeC@L1I95h}+xkS7Sgq1@3#lczFZGJCoQ@b6W81X~@gwG;Q6C67sS0R1
                  zGKhGx@0uBV9^s9|m;!&qt@^p+L@hY49~mhZsKen5*SXp2Vcd`qY*PY$>Ph4XE$}JT
                  zQMSwl`8X~j@BmEf96lgL6yuG{^}ED^Na8&}*B^b#So`u~B2?jS)Esfyp-bE!1HM6P
                  zsq1Cqp)c*m@^;i35bT+fqUcs7=_K9!!VLdtFweu@rd(4_N{artwTMfPd}@(Z8Y?{S
                  z%BY7Hc&#|MY*9wL`VBuUgq2{Ee^4&E62E5Zl7q<1E9sE`qKg`H=~4c$j=XM8%j3F&
                  zqGo&Ze58nJT{d2t=nb@eDuKwbs7G?X-Q)ikRK4Dj*7Uh+$LPmXhQ8ovXevhg
                  zzuuXBAFKiKT}8Uqz@VBL2rzL3kxR9eOjXJYl~!$y{CJ8mZkSx?33u?so451An4ZKroDMn
                  zAJjj`6*WA8hv5O-&$!t>J*599Rc5Q$YH8R3x26IOF|*MLEVnB=;8F7DN#I+tRBth9
                  zBC*^^^S={uJ#=SBpYiIFNaueLGiznxs<-fd@9Em55Dz)CnymT!qbZL52%g!
                  z&+mL9N}IGgESDLhoR%V|bdQltNK-~KYgFw)i9rESpQ}TBsd%($*~VCT4jHn&L@%>=
                  zBp}kkJi|jX&ALo@u==nfL%;qgG@b*K&F|%PL*b)$h4xUd5gcZNr9n7{cRmWjVa(uM
                  zJ<5}iH%}Xl!Pz?smG;fO2035@(8i-bZ^Nj+FfJO={LK>qg>(grj9yJ>?$6o2s
                  z=}rqW6k~yIwy`!0uuBZ#;nf*^q`U3NY-7Sdr--OZBYsbfE*f_H2ezZ26sjfkac#P*
                  zgmR)kdtbGU0SWoF`U#SYWY0tW_>21&?(i1%?z%)
                  zb7VBh!ql!_Lz=yq{W-gJ6f=u6UhJ9`r);uOYyb@&@{R&ed{+K8EZe%a*bfTQ+eQ*-
                  zirHED=`xydtX`WDIJk}Au*;LX2CPRLaw5+%B2Sr|oIKd`Xm?xESWMMAPnH|>Uv=Tn
                  z0nZ1ultY+ASh!FMgflEiF2~INSyO;|^qdF8P3AB9R!K)LI01cC&yPU}9gdjA3&Z9G
                  zs4ULthz-xl{Ib>J2>dW8F7<0%(KLkBrt+eo`o1T85-CSOGCoo~6kV0tO3MITb&Z-*Z~Vibp8fKP-7$1i*J0E7
                  zZbk7DRIQAvzZ-g`=wT|tCPiQu7v!%$6g2*(;+c$6!^CRYWva|7Ln=bJ1I6GFDf+~P;FlW4e{&d|%qG$RY&_W!
                  zA`$&0p!2xS9c;XT;o$@~1WM)yI#1B_(_I=WFZ@rZj}jhnNgR=s@U=R?SM=jtgMBqM
                  z+i4&Pc=6v^lE-2$lqI}tI3e~cBw9$=i{xSjEijawV8&LI5iF0gd
                  zv-5XD`=3Xs+x?|HXlCRaW70*1V0qg=cpZybgae@i30MnJdGp)Ii{xMDg!mU}wxu^T
                  zaHj3aBr0}c(bAkj&>e}BD#M?*L(Tuiy`%j(R5uAxbpUNM0~M9QQ*Sz2>qFj_D)5y(uG2C{G?%3!`6&-L
                  zFO?-1ky#}~f94J44Zf=E!8(PRb1W;PC19-yTmV3>tXTbX+fByV=rM)MY&utgtpC(S^9}TqVQ`VbzQXt>~N=IO$;Ga%W8QSJPw(UZDNT)DStl-wa
                  zSVB?(KM)(>p`28tY!7peXjbdxO|vx_23;z-z}Fk@Qa3_^;|nse{(7#GJe((tB!RD9
                  z6(?GJ%IB$Q8?{y+RO%MBY?y{3ksbc;46@2uU(4FYF^*Rw8kFp87b6h5*O9vT~SlI;Y*9JXG?
                  zF{8}cE4mvYv5*gXyWIgvUix?Wy2i>23+oIX5%}k*->-GPG0sxw$&n#-hXJ8~BkGCi
                  zrgx4%cInCgLE|KyHC8+LCNx$Y`qx&IEmTCoBkrx!e=~-|$8~Cve!D0A1lL;
                  zO?`|{s(yz7Toe;tQ-{27LnJl+=)Pc<@n;0P0~9pquU7`h3vN4AgP$rzt0gSXg622Z
                  z)NhTlQd5Ys;8iiCkZVz}B0=K9Y?DD97X_*1BmsIei;=9SLfom9SO@*PZ$28{N?vOW
                  zsNB*G2H!{fC6mlnX!KR1z^ZH#o-4Aaym05LH=n@6(#<+$?^eOnwHxCoJKxKF@eyB2
                  zcjiS_B{@0kb4#!!cN+D64cYMCl}mcPc64M?VxEqMCfWJO#GlCK|7?_FN_GPoyGwOF
                  z3wuzc$%H0Ic@4*05ms&>}UU(*1}H<~*=(-#?8o9fi;IG8Bk?jbxm^|cr9FygifqC^;Q#__uAD#BFw9x-JtX!7?A<hl
                  zI1D5DnH-%3hd;*)%_nO|v+RKvkX^BH7)>r&Y3nC)Y`2pwVs&^bQBw&kS1$;*$>m4A
                  zCxNaft1+Yqgth|{2*L-+h>NIAv4~M_gHc#w^$f{6JBZd{diJI#o4ZJyy3H6*QZ_y|
                  z3oqG)O`Coq!r|7IpDmEpl*NLtyhG!5Qdw7RLTWdu^H#TGZarr?E(Yu6Yq1m=1YB$l?M365awY(tdn=Q%NUvdhnl5mmV
                  zdnzD5aAFqB`D0jO^P7YWk7_ykBCHgkx=SwM140`!k>kk5UEms}r0l9Bf%k+X#3Bj_
                  z*C>A<1=Du%VqdVl(OW)C?(rmAl9S}aF<&EK*sfB#eBzfc!H(m_-HFCr(uv?$C$r^b
                  zF`DEY&C*wDg&V-vZV$M38=NfWc&Tf+S$>6G&HG0V%G>rpdleFOTGO_MB1VTfvy
                  z9%SJ-7iovvRdDL)E2jL2Y90xT$tlkOy68LlnJ9SlK6|(sn8O()?faUlw!VTZy(Erx
                  zoO+9USF<8GLRFZ|4N|kpS?A_1Y{6`TaTjMeLO#H?5C-v*aJXJl5^uqVp;&uu$TbPt
                  zH9Bzs-8u$NQ|?3-gZYvjJFIw)1_XZR4hyJCH*GkmC+R*yH-ivgqs6(0(PUl)x-(Lu
                  zoiC0XGjex~%IG0dpvf3xJ3ueqyB2DMne07Z$Ni^I?RQ8~K?
                  z1rsk(>pM-^Ab;rwNFi$;S=6Z=7mE9
                  z;q330*08U4#`}hJdJ4qXCZvc+H%BvoG*tPW{p3Mq7g}lmAk$$l8whn$<|ei49s3Tz
                  zE3Ga3wO}8{^n%5%mxMv?Ve!PI0y#Yx{s0D9P62mK;p-(-teF>jz=526%|MNhLA|l4
                  z=9AxmiDpe0e%!hH56(7J0r^K){ze5&!mvHG!!-O1DB_<@m{UQuRyaHQ9;*$T)?b^N
                  zuUX?ocMqZmFsUgU6Qa_XDy_2Z_WsV!rD*!RDes;>tZQN*Z$*U~<4~-YGCZzf%W5jc
                  z5`BTpr_aw7qiBij-~8ING2paeYg%02q?I=kVd*aD-tjA0x;#ca{h*ShnfW(~h}dMd
                  z-utF~NRM)2smE+SrPNip1hR#8uIXz}iYI|(1*pz+6$HejW{?;*19qN_r-bZNm8Gol
                  zp0rr9C93V3os-CJ!Zr*aLV8qdvCeBy<_GJ2$z3z_P_(IHWVHVnPczPPZ@RkHeB8?K
                  z+!lLV{Y($|&u6Jdd@w}^s(;sRZjZ~s^}dkMJf(HkQ*Dl8l>VpJdt$0t7FwdO?pO}769_5>}QLK3NyYB|MqQ^cq
                  zn37v6Ah
                  z>$BHInhxD<)>yr;7W!&GdQtg{xzbERFW53+lj^gTotA+xq@oBnL!YAcu*;H=tv)E?I;Q>AHacek8Z
                  zF9<4nDqRKe!FX~)=SxM)W#8`oBGcD;nA<#}ggb?3XSm;xH*u>!LUw&826omdw&sEE
                  z7RBTY>fy@oyz8@Frm9({6+jR$--2v;fV-NivckjX9O>u$>7}}|ElKNW>#TAkppaWW
                  zIf6CoGTvQ&J}4_Prte%UFMno!JEo-=V>$SI9Xd4zpPIy7&2(m}O<>T>4k5Zn1^h|EQ7#Bk
                  zI_f<7>aDLL%IeYgRIi%;5U~qMqXNuuFqA%)AKgoBAtCr#rAVrn{_)5KP+ZFTzBR~N
                  z)TfM)1hbF!kk>!M7w=2V)7>Cl5$D^$FAbKu!kr?6(qyGJ>ZH)0{wq38m`CC2x{wiU
                  zybzo6(NCPTP(x*b5F^E=#w-W2{wMV!1|aruJ>f@rj$CAAPrU3bXf!3Y@@_>vY8CYx
                  zgW}f@eNVt2&7$@4n-sKd)hKa~q`J&MUS5MfaAMO_>0RE{@I&O36F`ohW|KSwiWB6wV<`jBL$W>qc=Y_>pe~(pWg=-3V
                  zlYR}EAvocUU8wUQC_Hb6z@z<6WlMIT^s5y8Oi_9sK#nl>;ewwy2_TL5JT(MI@ui}Fod~evCn(pGX+R13`fp069%#(b=R403RVk>XahV)J|
                  zbt~R=9#1U3*~v|AO4ZlCsjZkl<*~!&u06-Y-9m1wxPnHG
                  z#eY~HC8yk8E&X9?=#C3MY7x`suYUA@yXJw4PLbvBjuf?=`kcQzqkMK^w8xTiS7Wyq
                  z6VgPVdIb30I)ACb$G+r>=;5#WcjdSj-BH-Px^PNR^Do`0&;I=rJ!$ev;%KDje!=`e
                  znMqX|9{V+-mjwGyF?4ua7<H45}$PdW0)L*TG|-4W-PI+eD5i9xQf-!49K+~be@%HlOspKRT8dG88sCAa&F
                  zl{!41$)+~{;G6$YSb1UblnJS>xyq{T+(y9;ZkrM=R~EP|EwIBrnxIk*|j7??$)a5dGgEFT=|_Oxj6TJ%Kp&r
                  z3_jg8GZyfFwUAD{d3^tgAOD_lO1}Reu%IC^Yv-4_J^ZXy*Pet&>8ZS$JjbBMZGOAZ
                  z%{u*B&zB`1qy8zeO;E}YnR@w~QH{qrcfSSGrWfsK0M1G8iwY1=%~JlEEbcNx>+~`8
                  zIj`G3ik?2&ufcvab6d;#-PZ4t(bwe6t;Ve;st29qp)|^mdKI;Vst
                  E0I_f$od5s;
                  
                  literal 0
                  HcmV?d00001
                  
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area004-v001-MC/word/media/image2.png b/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area004-v001-MC/word/media/image2.png
                  new file mode 100644
                  index 0000000000000000000000000000000000000000..126279f21b456d0d6a7f822ed1aa886e252b8795
                  GIT binary patch
                  literal 24541
                  zcmeFZRa9JI*QHBBfZzdwySoH;g1fuByF+0~2o~Jk-L-Jn;O-vW-R*3?zfbq+V^@9I
                  z#b7X~+Jh>#ylc%lpS4325Ec;uHVgzlIacSF|Ni_?9JPBF
                  zsib7*^ZNMKcps+YjTM=WZnFxatIg+v!)S<2?Xt2T8*tD4CoBna>GIXnr*o#?b{UWzC%gz>)fcO2s
                  z++Ck?-(WcA`4U#yUW9Zu6>%u^I{fP@iS3EiOr|^ly|i+3)R%|JQpj~AO$}z#&@qYW
                  zfeNQiBiv`1r;|I9+AgTS`_6=_-`fofe+fi1-xI{<{cVR+?mqBefB8N_q5x>ckWR}<
                  zlD^a?xwX-W{9}(8e&=Q`F^I_NL8?(}>|AhXX0M!|V=|`)`X2w}PfkX?LlwtBQgpn-
                  zxy0w)5uV)fr;W`ot*b3xt<;?7f;6>Kir&!BVkg>{#Y9Bc2YMZ6H%{$xKQ^B2JsLig
                  zlv?>h+cw+uUNc(fm^gafESARcA>+Lt)GPZ%ccRas33|WQqwO4MZOQ{ZtuQZBX44%x
                  z==4m@`LV$IP>g4{7gDb=L5LV{YoFqe=mu6E%)gm@*JRW9gR)2qXE>4Qqs#7%d0gu+Odfb#I<_T#`C-PwBF8tHB_cLtS;Btli1
                  zojpO|Y<$DH{po3O0`13Yt0IA{rxXK!-vn>ixJwwI-i*l-0U_(0t6iA0P`48}d5$7H
                  zY&PY`v0CahP4-_ayP%A;>+f_WjD_J)f@JV@~rknBbe;qu@jB{gj{7Vd6p|
                  z!(Xr#^t-pn{Esw?vKcl(wZkBJ?suvtxuI}u-)vM|u!h38J4vBm4#B5{%b$z(y-?Tm}e7e%atlM55&P7u9kVi?v{2}8M
                  z<8g0}e&w6FneNM#yTIdSxVziN@r7M7gYne8mBs7|{iQ_F@>E1s4Qs%7#Shl4`iB+fLp}JN?-OOsmz4}
                  z-7RNxSHLy#h@W;RbMAbiqjNGo|G|vK>dnZY^Jk)i<0@#HrgMLNo@bO-R>sM2DUr?4
                  z?Dk$lh`VpD{N&G?4suiM1J=NZg~9~tfBy)Iw43vtnNd&_<$5Ucg7P#idWPn(m|T!oq+UZlj;WPM
                  z4o*)aW%_7|%CeZLn39o`XIrK3I1Jf`{4M&_Xfa)`KZ#19iGaa;HE$md{$YyD+lEo{
                  zu#Ob2ycm5mtbNb{Nt(wPo-Gi*!oFG`&to=T6e=t(G*Le+wy==Yy)yDC6qEH^ieF1b
                  zY8bzCX6CRj-%JgArDbmY>Z0+7v~)UE3JLD7^647>Ffb@6JDg25p1xak^9$c{11&M1
                  zvKf!%qC3g1<KEyGNd%$fvFQa^V%kE&{*2cNUv9NC
                  z`hf88>84Jqo|%)FEK_b%>^SuXYO#n&Ko?Aqu}H9ZQ!V)m-+iq`eJOW5qdPY({b8C;
                  z9yINIeCN*4P*7gb7GVDGRp7s>!+VYSpQ{5j6L64$qx?Ufhr|L&-meF%$(K=(kboxJ
                  zRK|sH?)p%UmvHme_FU_}#|8$RkEP}t7{$;IRMhe|Ii#J@cpeMf?94V`wNz0s
                  zMFtMYM4Pi>Sf3VW=pv@
                  zQ#A`6wmqm)tgapn96Yx{NzYtf{4!7~dti948yY#RZ)G2kZAQ*%+)zx%FPBwSf6ILY@ZOia8~ysrKT8-75hgq%BTijCqZFbJU;Qi1
                  z?@P{9isJ}jVMD~8tbk&oQFqP!54_`UvsVm5%=}ig|7is=bf5-ZU4`BHnNoEIRIcNU
                  zh=Ou)e=zU7Q1t+fGwUu|9CP~_E<$l#x9zm~wvF?-W`no>aYe|#8OmWt>uYNp-puQ_
                  zs18w8+w`Ht;o;h-;NaI~?4+5ToU@*(ZV@OH!LI6ahX&Q3V$=Ol-)y$|%QSrGxf(e!
                  z0~L*tvV9t4&+j6|93&7<`&I`0VI=n_<{<6c^-#TTp>Ry4C}g<*%&%YkRHqi7DLV~&
                  zYpX_-)v62#$53!N*)N7dqE!7sG^YDmJoNTRvHTB9e?&=G)N=K`er35;T4*S`)7}`A
                  zJTmT0&BUDh-s$)2<2GF=>RfS^sb9%o5U{J|W&H%<#l#|c!q|1$|D|AH{cSFwd|dNk
                  zwW-GWRvqHeAaA*_lw$pJ3ex9UhCV6f`3AQ2ssI!En%4iIR?cXRaW4ikY4wB0PWZ`!
                  zI}uj;k{8Lf9NuGVgK~JR87W%qiUYkt{@i@m8XhrmbrSRH-KGb8Qp&E_heX~-4_FJa
                  zNP#lOr~Xk3geMCD9o?&Q1Tqp5GlSmv(r6n0jY?gz0UzH_{xET>J=*NFVHmRTTgML$
                  z+ttm5H6LPj_7}#4ff`WL`+92%epJe6RRpnl%ta4jxf{4B@Q6)sJ^OE$hL-sC
                  z{)nXCM+YjM$D?FCC~|F1kNB|G#PqRatK6KkMAh+^aF@QS!9=ShF*u_Q#BcTMfbE8p
                  zpHLlLmz%;o7!JK8K#J|H{}|hK#(XgNczI24IU?-MJ2X*O?Dbjg-VS7Y)8q=z;mvmP
                  z8^ri?5mTRFU~JS@v8J&N=k`E6{`_TyWq-OQ?(tdb&gjv7INniYOYLapi5skAU~5}4
                  zI<7ljly=)v%GjWWh#8+B^Fluj=T7esXB$Tsr!EOYufSb;8>;Lpo$>R%yA!incZA1e
                  z6fa77GdC_hOgEk{>xlRueAiiCg(wwYHIPpmUD6Tuv#l*a@tj2SmpaH^+`@v6CT=`v
                  zfBzF11B4=5FSd!Sp`8&osNwMj?0HRHLHuvto&A3Kz}M_r~`<3MaSwlWtxdu%Fm
                  z+m@0{6oOJ9o4N<-bFjHKOe3d2CY{8gE$9s2p4GNRZuNs|?=(_8?e5m1xQK}SiNF;P
                  zlcQq@C{XmV2agjk?cn<20{QxYJhsL+_Dz|w#RnI8B+W<5^)H*wN`7sXi3{E_y^0_D
                  z;60X$#ZmEN;qQQf((xG2=!4APtm`%_PQquTwXRRHv)|OAnC8qZRyxs*`FYCBT}epL
                  zR0>zh92}|?Mg_4WIp#mIY+az!Zu_fK!yr635JF#H?Ir`CXuS8jqb55uyg0C;((Y$y
                  zY&=F%QuiSB)ksg)-B6Bc(2WBlSivV@oy}8gO7Zp(ED=}Utm67BUap*6nzP6z%H%u9
                  zjWO^K+nZPhZ-GWl7A!x$CN^ZyiJ;<{sMRBn`_@E}pkSMytd+p4H^x>wXUQlBh8}w2
                  zd)s8OID$Bu`c_*o!P4H#d
                  zVB*{-iRprB?Nk@;MB581+)p3(?X}7$iFJo_&7(Z8o-cmJ;Q*2>J+sAys+%P;I5(tMP)T%TNs41j2W`f>*^(r7J&Machi9A{sPtyu7^p9#+wQIyFLRtdGVcNs
                  zGAZ%z1zPr@_`06Ur5DR(k2laOEOy1U5Shav{82p`r@zt$mxn)K%HM265Rs5b!K4CZC^+~7f~kP#
                  zpPNzbyVvR+sG#1B!yBsJUNWaWpcjHnN;4R5Ct|g%MH*Jqk#xWRXWHMhBgD`{>E}Z-
                  z+L}_Y8)W^eI9|sOoKcEbiSy>Mk@-BMT|LAWOJ*l5_D?4h8g#mLtv>5-9%6hood&)8
                  zkmnVxU(@v$!w^$nW*IXs?b^Q=5PCVP5B9#fb5`$QjV)4@M)bDN#a$*
                  z1;zce-|%rHHaODHfYolG0zyQ5-LK#Vn=gkM?|4+PzK(S5MESAF?g^+1_ZwS~Vm&3Q
                  zgOPzZa3yy&>9xD}o51Bun`xrgdLkT*#o)u1DEdpz4xJ4==O`d~Ugg{+DZrer+hJ)k>zB
                  z;8wn>P%PxjHUj>EUUrq#-PMIB_dtJR>3#y+i!6{XXk>({qkD-p$^(>5@23~)cs8dY
                  z`+&QrM8Tau4>OH~yXm6gRu9!qqin|lSYeN@@K#3(1QZla=gXOxz>$lDjg4X9ds(M0
                  zPYKy(p#0{uOP!Rmt)_{st<8dfuYocDk_$fL|Kp5F-&S_3ZS)V)opK??yaTT0
                  z3!n;VWI?fLg73aFwWpY^9Ft*Z!p27YTL|Gv_ErCdY1tk9LyBM@3kBQ$>nHG8JuJ}F
                  z8P33
                  z%xn9&xl}1&<5xSoLjb3z(e6BWb`Pk@D(6Ik!G@1O^P3|&-F^51K8mLKa&+frX{$ku
                  zK5~7iNwT`bZm)!8Oo1oq-pZQklMm%xh~zGs9n>YO-~jdRjEr~Bl%M=s-(}m@6n$3^
                  z8TJ?jyrA|b{95xF#V%1PK+u&4pQTnNs>m`5J(kctJk`L-0Zqf4OqWg+*rl(e7HKGCO(Z2H<-v0G?7N3g1GnyTYpE9_#3VU>vwn~620%v{V5vW+
                  z@>9xc@TZjJGiyuxtJb+P=`5b}fz-C~UYp?+qHCy&)D+C_$t#a4Vd99yI;LfN%t8Kv
                  z7&kKRyWQc+tp~ns2Hr8i!4+n9YhgLHRJ(Xbu8eZ$pH0Z2YC6+xEoq5yb<{4a@SZLS
                  z@W!ZwMS@6vSf%y=nC!>;n=E@h_w1X$-wzteOvoY)nVw20fV9a
                  zx90TW{ubH8#StNBY8oJWtM10W&`OIHAY1~jM@{Om?W;bvuKA|YfcKUEmzE1x&
                  zY5lW(>sIcZbjtL0z4bvU=}QQ3uD(kCPcrvDd!=Rkdkx+zM{YD@rD&imJ4fAxnHdEQ
                  z&n4MMe7N7H=PfY$?SpUNbn;B36g#Lk&Q>tS;b2Z&Ge=Kk;_`74v%;^_b)TVi7ZpstJ?X_
                  z_w+M}75&K6mi?`#g4pv#2%tTEx
                  zEb92c-
                  zw^RkA!?*OL0W-OjOrfiH!oJ(
                  z?*<5ZUS2%xWfo8@wK`bbMgrd8n4#iA%SoEiEbhWBw!4dINk7GfSB3uwrnP(G6ScqCE_SY*9q=^dS*19TFM^
                  zp{PGbX|=r+I1pF+#8Mtt+
                  zt1&Ee4EsBVfRx#^8^eU9L2}gpmJV1_Uj2Wk10}Ia9(;7Y!TUQb+dV!S9fO3*6mudE
                  zPM#=uc)1@_EY}~6PTg;2`s$vnwJ#nTOOguW;T5A{lQ?fU4>`2MUwF8?*TxWlUbMKz
                  ze&l!0{?ep!Wti+#L2S+C(#<|y`S1aYA=9^ScC5i6ZISpbAI~>_J{P$$&~rA1w-{dB
                  zn{*RDw^b#lP;k?HctVCgSht*aMbk;6|MnIH{WozORXlRFU%n%whn#+*SczJI!Rlv<
                  zibOst4SM&xmGTs!tx;PB^-I{uaZBv0Z<^}31)mfz9kQt|x668%BB9!Z9{Ow*(Chu{
                  zi9{xYVGWXfo4j!3fDTo99R=3<{!u*MWeUtY+%f(a?4+WhEhj
                  zVCJj4YyqlNia2~D9T1wRQzS;0fVQ44U-p1hwPIAiI$J9K42YV^c1S_MBSU?TaPikR
                  zv}PMoZi$*NJ1vv@JUHf^h3|pd+PXY&w25No-`Bw*xWhgC&HYsq0b4;0F=0a(Ft*SE
                  z4+!Wamp@PcO2?u86*Ti~FS2!HFK_gAdt0PIoZ0>iUXoNU`Db+U2|?|ML&
                  z?OL<&%NGZE{B6{@zf}v3y{yAj`s|gjZE>$!ZrHx&Jr0i&>I+Lr2g7z6>#DXb#4Thp
                  zPJ2Q?hdmo2C&I`G%f0*T4GnZ*!qp`8peBX3l2{td-*F+v{1s&kx6poL_P@eS{wgDGTIt)-DEMp
                  zx{O{;;pHAfUQH|^zS3B+ePW~@gnC{HVA8pY?514}#TNgeWt;P!3gyj;DB*moYb`PS
                  zELmB=n>Af48+tB{(J<|g3CXp9GvnGbp|2MMw$!N1B3Lo$znj5-@w$vb
                  zHSW*klXkrN3w)oSbo35=BiY9H#l)u-h)p8L*OO+7(5xo17S
                  zWSAqPve#j9LryAs4Rvta@z#nZBvi6S@>&s6%4$Oo*eO4lQL(Wz&G3KyGG<9@mz8!$
                  zpLuROq+wxVB!z`rfnPS^qu|JH!536?1iVdryMdLg+
                  zNJ`m^jA=jP&^eX>*65egh(0qn8U9lqe)2NInQQo2r%YyT_nZ)v~C|PJ7+KYz5gL8O<(PkDIRMS8g_}
                  zXDaQahsNeBI)J?uoe^Fg2wQ0xRef|y)EtF68d}31Db^5z=lp+#C`WFN&P$hA#y0S%
                  zG5Qgj`V75iL_j8lYpPZw#Vky{x0qvT=n?Po*WnSDBX_#YKO0#_>GD1o0YVwa<`xyqEV=Y$-QD@Hk}VIRa2$}
                  z@HJsG!vua4n&aH57i)0|+}hX{a$iZYB%5^T&ktD+R@GUjub`-N6G;Ccnuj{*TrPB{
                  zet8lNT`~ev4a>Q+?P8w8M+e4T{!0zM#r)Zx9*R{@v%I>*Ei^z82^%Y(8r}saLjAv|
                  zc##oF51n^r>)525qQWj3F!Azf*QraRO8^r
                  za-acZo3*Sub_x0ZK*q$K@ix>qwp)R(8}!HW*nLvui6K#
                  z3Cf<1MYlLm$Z=&W`2%)$SJtMNG11ZBqKFVu)}g#Ke-wMz@3riVZ^MqM2)YpAo|PCs3Yd
                  zm_>C~AYG*!T;wQn-ZI$fS7*|hDmza6CwK<2wW#&yEHL-0GYJ)Ume0F(n7p@rXYYCp
                  z0E@rMFjfG%V1L1yD88hUa$ccsj;GqgTh#hJvxROI;wIYHabipNyaVy
                  z+CD}9u#5b_$IxUb@{#KR6!qwKJi~pvP-eHeW|4qvsMV)N(<}5bZ{~=}PtK?HRSNb-
                  zkEZ)FhJp!JOUzG2(lk$xeQ_1aJM9*S$83h_#7N*eV3is*Ng`Z$$u)l-Waac-s!-SY
                  zBnw2)kS94q*QG2rJRW9ZPm=qO$l`|-MmZB1$Raw%}}-wVOC~C(X3Jw{&=mNAPuDCY_`Ml>g492IrlFCYTGnb;9-qtBDRUAdXSR3Z
                  zQ7n!85||yY>Qj@RZ$c0Tq%m}Sdqn;sduj<7KhTcyjq_9)Y+OFS3!@yr_-CuK*5Hg!
                  zJQsjw0-V$TZnXZlsQ3S2!2TCE1X!u>`VfeKTLEKzrj~oVNggn58B;KC6+f19+kN-$
                  zhP=_s-~#Nme-=wc1`&GZp4-nS%hg5t4V}v4##;%v_g2l7AbU&0Upb;SlVy&EKzLh`
                  z;gEv9{<0tR4GpQMrw8M#T^A>{eyua>)s(PB@71W
                  zywUz*8x}YCZe|$M-$-lm&MNZXe`FuQa~FRaxAXk{NAnb1T=jaDGeTa8?pFOV!^tV>
                  z#tPN7cl4?ykOe@m$_aMw-QLn4@7kZsxJ%T=A~#8qH|_@&ay>C_>iQ<`hBsd}y>1Kx
                  znJ-oaTi%z-$!pItnQD-wGZ0!;WE|6PORh5$dbTS^GW5;V=4F`p$v+=9y3wDD%gB(l
                  zN^x!U5bxZ)5P`0j0++L^58DDf?NsI>{O=w?N63VFjoUFxm_oNcnQQrBbBy_KuJnK0
                  z*RGY$@~3!iQqdLw>CGTLAw%Vs
                  zx?R4owq$_3L2_WvWyBk-Yjaow!1DQmikd5jMU5AM2j5o}dHb%O4F`V}91@#GUM=Ps
                  zFVr=&m8c9=^7AZcck;m_6U4^q5DYRz)?flTjv9ItH6#|>+Tb5`oE)2az-@b$Z($0@
                  z*Tn{!-LT$Xm=YltqiaF*&c9HlcCoXELiHwsXc`(R20JO%7E>VnIXdg?L>?aZ_3lYy
                  zVvnnvnD?$6=XO9Jv-<3Nl<%Y$>LuABpl<5mmsAx$teJG+_Ixk*qlT4}CUTRdlLY3?Ik9
                  zjL)z9l_Kj#gvnh6<*zhK@xfOo98%dz0o$QBhpzKr
                  z`1&Td?D6mu9{X%xeD#Ip&|Zf-?djTMz^nx8><793!lsZaDjqA0bbMWO`eOm7U2)uNYd$IVBV>-$47A85kkTv#MC^7hhN
                  zKVDgU;&XMQ^a!~Om@hGCoPhnQ8VrOD-TTP2*~xnF5*FaW&1
                  z9Jx!ItRwuxm?#-#@f1M*z?T$SP@Jfp!7=1`VazDd%iv4pp;|yrX8(|Of|6#wi}}!m
                  zi&07AOJG-T<7R1_oU$%q-j}n)}Gx3z>3#ieou}r&~-Dp0dl}~US`%|5G#2%@MT@A`H$`U3O
                  z?LRFECgMe|A_S{ZD_devZy1$Z5e23M=*Wiq-Ox~*7Pag}UllkeCg
                  z>3(XVzVclwyd0O@T1757g=&8r1;VTbe0@cr(9b%wq3v&ILZUMXRJy`68YcDg*@7au
                  ze<;|#^mK1cuexcMi!rH$)??Di=wU|hc
                  zh`aian+gHG*J;T)R&DE`!gk!UqeY8pKV(?T<@NPk+)^~8Uihrn3jD>Heu2e5H@7Jz
                  zGSu10%4z5t?K7<8+I*&;r%paP`H!QSF=gA(Pf;{KCVyc{QV+wDfyI;6_te?1q(tM8
                  zI#>+PJFv^GI*PftlS?Ao$9`try|kHjNZ)zG>5lpnRIRlO3lZh+HYVQCm8Uuvlk
                  zHU)ruN>tTOu@DpgB*kINZECm5$w3u~0+IlIL_2)Ohp@`mU07LQ-c!B+WySm{u8hD%1ZTCBC8Zn&-_v&J6
                  z^=vVpnZ{LgqYzOHj}q)kU@7teVNw#yMMVV-w&E-;AQ+?~6W_SiXfH|zt(Qp>qpzgh
                  zom9L!1ZIiuGEy&%QxNvS*)GBD#46XK@t6O(K#Mdw_cB#1FF_-)h;{-l>uZ+{j#|0R
                  zsRIHUwCJ>l#=<2^@)!(R9Q5AE+QWmRWNst&sDiqqS4HI9YZi;?Aw)=^wjT%$UjF3<
                  z!aEJbqqU|af|0yi0N1;wS{8<{1GR0%nxz29w+e2>C&$1ON!@!NmLoFu3afk$Rmp5t
                  z+0p~-scNMs&3kFmn|5Js`EA-~T)?i|7@?pdA#M10Ryhqg`c~apb+6gtG23&YWQ+NaJ;idaH
                  zK(BUup12Ly&gPW|k10jR?Na-nbrkz6ksq_9y`IIZSMi8W80|yGMgtug{ip)~ThP$P
                  zC1-spwkcdi;$k=9>RRGOIHE9pO}QCF7i+?>Tl7T(0BzM5Rc6#eC>p^1Wx=8FF(B(9
                  z7nIo)n&Ucb^~i?Ak}Q<;GC@Jcwb5P|>rn7zeyxI|*{-dP&HrOVUc*YYVdM>Av*-(d
                  zhOhuT|It&$>T)IEGd)cMD|a;FvCXvDk<)jH6lD_UH{8kn=OK*TYYVX#=?a|?k+6C@
                  zHrz5+9K9n$<>)BaA-F+^9WRZEG%j~c?fTVj&`Iw!Jkp5>d!4v|+|Wrp8YwaHLC72X
                  zR2>C&?v!5S<3QYvn~Lp5WWp7dRYL=d^3$ny5G2@iA{G~
                  zPclvF@=fc49KvF=<{Ja12=Y^5hs%x=WLZ8XCP&Ln9lV5-H%9SCQ$wy4>(3~B$cl0T
                  zn-1J0-IiA#qDDpYs!=R7*Sn@{I@!j$#vN;d1eqa|3Yqqnn?aPU{#%qn7cY^%CFRo!
                  zu>vkGngv&$_UCrq-zriLPbz9CVk1hHhGJ{#m{i%qMwdPifrGBe$oaUlZRnN8U9h>o5TF!>3!*;cQv)j
                  zzs`z}g{+*2pM_{s*Kk{5ZVvPOg#ArCc2vttYB5Y+@`sFtuOhE6qW|p17HO_R0n}0s
                  z!}U~JX6$ou{OS~Ul%|=;dW6-W-xe|C5DwzqB6`-NJt)y_gy~9E6kbVrotXTCquQxn
                  zyp#5B8|Z~CHmT~p0v$v131mRbcr_*<$23)D;Z!Atc^?53Yljj*PUGiWXE(xs$
                  zhk?fNSoyESn#cz;v;fpv2T7&FR*7ZBF?CD#A=WU7PM;gmJiuEVblb6LPZ@#V5&kWg
                  zrgSqVCH?J*EB96*d2f2fFv_wkA6?A}Q&5ZzQ1rSg2_sb%PRn{?0gNcbu_@Kmfe3W|
                  zcY()>`1^?4h1hyN)-51L*}c%W_OiQmv?)#BnI!*v2Z;ceJ=(=TaSa-U4ElNNDcOV}
                  zT{-!QstL>A9|itGc^q=IgP1k*H;hPN_97UWGVHkZ297?!8
                  zij|QT8(r0$1yEqs{^47!$N9f~ULo}z2m;a<^05a0rh!5npzRAHp?$og_XkX~Z&yL$
                  zK2h6Zv4TB!Rs-UTF8(aV#!~Af2PyA~fzO-NaIfRK0{V(sA0;VG$#MhYsFIMK_rcw(
                  z-Rxy2f((06h3N5APg~I)$--i?b#!yvS`!B;u!8^McziVIwV*}6{|X9pYbR_k4{cam
                  zg`LlVpRv!A7~mQVl)%k#QG2;OLOVa#Dgs$b3#7aU43+%+OV@ryE!ifIj+rWx_AD}y
                  z*W=&7Pm*nkvD(}OXRB*^XX4Y%0l0z46+f23)r#x#^4{RS{`DU%)iyn9Pw1}nY`LM~
                  zjKTR=Ban&{p4iTl4zlTXDvyd;rV9O9tqe?@$lDzcs2W&V{W7zi?^#+>(M{T(GZh}t
                  z>*1optVI^!FJf5OL~+D=5bUFDH~#Ce8T%tguKc4|a*S}0@QiK-HA}0r*_>$Pd_#^w
                  zwSbB(-?kea|16El)Efh7OhECxP57&(ued0UGmu>(sweW&7}L6=)4!EA4ee5x5_{5d
                  zK>wvR&1a^#rgv4JEMO~FnJZMd5K!n`l!^!Ug)SB!w|qjQU#?VNk4|Ov&75cIIgW~w
                  z>2N_;m`?-IUfgvTfUG-@?4ODff10SBt{msDiHlI|n>MVVFEt7hmmi;I)yQfRuaeKv
                  z+yC_SciXxe9JuzOAJr-5Ibio|e=(}DQ?}speH-v8iirAUF-8L+OIVi
                  zPNisuuk5ICa~ZCHEm(O@wa0CIr?hn*cef=`GzJB+(7e`*YL{wbaQYE#1tfOGr~1bI
                  zO;Ymwvr{py^N)FAr`X=8l2Vh4(AX*e2jPD;CBdcAyi;rHJpDS@Fyqsy)pWmXhtN(mr`=OjNx)gIHgRW4&Ora(kp
                  z3$bp3jgBl@s>fG+rW?fT9hphLyP>X3K#3aAJ9hQ>Q3Z@g$(efcCnFNeCtG%f!xazt
                  z^WVnKw;UEz^rn&MA*955q6S$9=f;EX+OvTAX8A={9jKlRl
                  zCYD`uJQPZb%GcasN3T=F0=ajsOM%Z^ONi6Zszd=D(mO1ot28NnhC~F6Gj&H3f*t|x
                  zyd<_P4`yc`Nj$PB&X5J5(E-=#abA+~6+miBkbrho@o-=p508$i$PfGUKa)^Bx=}2H
                  zEW!xe9H!fa_mKoGqxis#(eK1_cLO~&%9qmuPc_*8{F$NZ?T|4{#sGoIaZLaL1n>jD
                  zaNgvb*o&YlGs{rSM-F)4Bh{cib#5C7jPQh37NmD3fNd3KPEmIMgDq0&h9>Cr0_n~Vg~m;D5TsV{eG
                  zRpd!;_&i~hDQ7*7-8)`y$xu-V47ShVJ|l&6owfshNj=Z2$G@w-F;ziV8B2w;F=`~6!HT>
                  z)yAkV|NbNxYs~}vY21P&=PlTe4AS{Q>XS{`==+?;`=lT3ypHeyL8`OI9H}JV5-&5&
                  zYw~WbwLOvEftrl1SFBh-m9;$4kg9edFkn-2{qoR}DVz&kan82@wLIS-*yr>x(Q3I#
                  z=hNVZXg*V_`@OBh;oC=20X_@Xb~85fnM&o2+IhbfET<&XS>K
                  zo5
                  zt~=a-_gR*Aaw`^l5gr`+i2wR)YgAfak|U~`TEYIx8k*@a=RW`z8<|QVep9df_ZvA#
                  zO+gcK(Bb)U0P6bSBtUeDdp)!%a&xIwBwp&_9oMvd`ngsa->E+Bb1{Uw>~QPB5nml;
                  zGyZNi_L%wIJe2F@Pt<4{0@!^h828!G-aY~#AhR{Mepz`p*025>Tjd;iI6zneUv_e=
                  zr_an0W4x^03Z*8TT0OUU-9;y*Ju5CdbI{3+ibElsfk-JRP=JZHn~rGS?@qhN(~WL?
                  zN-y|m%F&05G9YR@AmM-}h(1=%R*}Mw-p*)N*^=JimUmr4EvRdQSBh
                  z4wo2>#n0u952h+}V}OjV&Gm0*;2$H0;Hj7yCj(C_^c
                  zE1%nl%Pg~&30!6rO!|Zt6Rwyke%zCCGyhEmzSl(H8X#AInIED^Ft$zI&XPuIiEC6?
                  zPZue%Mh$Nh7XvU(R__;Kv~kW?q&SNGE;nrx%_yr)pXhB?yoK8mPog)(cS#vpYF8H8
                  zuQ29puhqA95>EQd=Sn&SYpB`_PqP3(v#ZQ{}!}@PY@!54&upr@aUsq3;hdTUr9=3Jgp*8PtNO00mPf(0(bg0wc
                  z6AhURHzD1kE6bmut$-sO3CtsIo)HFsTy?7749;^?+L~b9Y;53RyqtX&IFzl5k9(S~
                  z3<0%^-}ZQ46lzitgnkJyA@jSjE37q^!?Lc#EGEJqKjx~Q=*Zq3ak1L!eD;4#RLne@
                  zaZKejJTqZ#1OS#4N
                  z_VV@xyDH4>}wXpRQt
                  zv_p=+|zE;9soj^bk;=SJ&AZN(H=V{e)rff5;-5zuxtNov;@es+5FrY67Qpu|5
                  zr%3<^1n_e;pMEGAru#v$7p6lDMq*Heyj{_!dKgaiL%iRp)Us3dZqHiNI
                  z?(gd`&4IxpZ{`|Q=<6Ff+?D&)(aZLQU1#{{XxR7hModNucL)BntHy-@hoowk11lfPDYNdd^#or}shBpGjSk}|s3Eh|OT`$Gkjr6+xCj-o}Nn%~k;u1;99fYHmyAcH4CuN(53&I2^|#
                  zk2Hn^85vnI(wHXkGEtW*7?^_OZ)~-ii~W%p46F%*YEI%4*7gquha8kMdsBK5$*-qF
                  z+HF!L{GyE#1Pq(+(?q59DmS6g23aDGUapQ~GQdbGplTp;*yMVoi7uUHAB?)NI
                  z#67j|zfBow88EXB>&J|Qx(v~8Tczg{^2fIPezq4Y%_5~0@J^V0kkn6&d$IjpmS_Tj
                  z&|pbv4nt71+`eO!It%ZuCJ`v|xW_wQC@*bp<%wl-c)}XB?h+jq@VuX4l3kN(Ql94*
                  z%Bq=v%1HJz^;&>tKV@YFtrUt2u+k10$c16{%Ay|r(&l!I|Bn#74`N3_UNr-CM}&H4
                  z)h3k3saJk;sE^Loe0fA-u3MpY94UE}u}!WihInXf2R9EPCL=KpKW~~;lf;v+Ay|{g
                  zg=NXT7*fJg2$b@Yrbi?N#Lbxe@b8HE|Me~wQaer8KQ9)+>Q5XYUWxDE@KYn&J`}f}
                  zW(Ml;svq5t#U`%~5YYY)E9dMHw?HPHl+jFts!(q*WZ{MFPy;Xg@5lfD9snG7U~V0e
                  zusvAs(=vD-=@c4(@*@wNKO6KrHB7;iyx(#J&}h2;An-(%9sPd;?)w1JzKQhxSmnVP
                  z)NPoK6aj+(al+*97y_tkXO{t()B3Lwum9VS`Trmil9_iHJjkeFlir>@pPTMUD)hpC
                  zmzJ_wskjPt@aHS$B&DbHo0~%vjGgx_IvZBiFbfWw+1-1HkaGg*!v&8!jL~ymuE*Od
                  z^ZT%DW`p6q*IArcVuUEOPEe*FPvsmj5fM&AM8f`JZW24AeNqa=K+3!9BOhiwn#N?b
                  z3IcA9ko|wua-QLA{_o#!OYPCtDq5=6m)dHt+Et^rid|ywU22q~Hc^{WBWQ@dN2ooD
                  z+JxFvh#6Hu{4d}Car__r{!i}vxQ{yz^B}p7E~Ytb(Rl$>U?G3RG?ZI!IdoMO7X2Nl`3go(~-xInC?_-kTKs%319MhwxM6uv6H
                  zl(q-XP>XI^0m_P{l|*Pf$xfI0E6>||6VH
                  z8d(9R?Rm%X{IU#&ER&mVNDor>SmaJuth~Gt@0+sS7)=v5RQH`b2UbA7?-Ww5*&T5A
                  zbcI70Xt#ear_2Jq9cAN{WQ#9P0U>``V=kZm~*i+NU6H2m{66|7;YFI`-^+|f%=*PkSsf(nfho>4I4z@!)-K@YE
                  zZ$nMQe)hq`5NTcvp`yI=FHEMO8Zc8YRW-%+BQsby{&b-B99>;=nn)5qMdem_ShD_)
                  z^HSifHDDlD$_P5#STCshQ8W*uq{PuVxukHt*b*VNHBt@>!R@QcwH=L8Aua+a53zrz*(_1rm{DOxgtDkq5mI>i4l{wm5gt-G^5f
                  z0VSCw(Q14e7d0FsBTUR{FH7bC5&LKBLE&b9AK)5XSsKWmy@Lj|mRz)(005l-W5eOo
                  zr$Y{NA2CVKNnPH|GvGz;e=r%8(*aaY5w3Ru3#+xSVWkdzao^&KirDlkYHuQz_vuq_
                  z(YdsoJ_CJcjqOsf#bGO|X{+`=l*}rKTmv#Bw^U8=yJuH^mLD<2f|!zIBox`;*$;&D
                  zJ$}C=TJW7GVr0|Z
                  zvd&Sa@5|uDv*Oo@h2hFAkJBs&s5mqy%_qtGcl~McfTNqq)^dX7gJM76=P%Apqs4Qor`|~RsZ+CG~m<#NG1|V(h&=X8}`6QU1x<{8NXCi
                  z-HSTdkwOLG-ly45PLNk3bni5KZZ781K6(Hs{^8@z;oEva7EHAB=c&9I!nJ%c0SgTA
                  z*|NLT8UUz9`&uY-wD4vNCELuA^_&|sg=C?0-NT}2uTJ`z_5GpeH>+v#-PUgiRv>|N
                  zf~mB#OvocsPK`Ogk-eU~=@P9Y#A6csnTCE!q1TFu-eU$ol;Ap6<jK7;oDKv@Nx
                  zYtc2ukFS%_Rkb4BuWNVL2Yw*wFx-5O?i7~Si3!naJpf$kXT9Ei8n(q|#;CJp-tf1|=tJ~biTg3;
                  zah=3cTnwTvw9kfHgP<5UfIh=#NH*w}z(Jp_v=-$c2uL
                  z-U2Kzm)FQvs;bf<5sH^S}XlboQcwNsZYAygn5-wwleX^|iWD=KJ^cY8Ta~AW^@b&(WGX_1|QF
                  zk(0>A8aTbx*1qL0R@47GIexm@qCG2|zeD1KkClgg$z#P>+XR0LcPc9V_;b~nRQheCNl
                  zp41lBn3M%s>RXj09T-J?{a(+={w;^v=#{81~p2LO#Ije>Li@Wy}Rh)kkOp!Vo
                  zZ+xI`lYJ+KrJzuK`<4L0ZwpLCro3+i6)V4xADUWF((q_dEIK{vDM2(cv-UYp-eDyC
                  zdoj~F8T5VpbY5Fr5>>ZSD*G#|0a!}2e>*)>ftEUa@pajClvmMvB$phSY~26@KM2jp
                  z%*^i)wI5RaG8~FKZbC0SS-eHne*w#PM2)q|w21G^kW>7FMUJZfvdm^7Kt{{0%=ptlx3?ikODC8eY!?wgqkdMD8ZFK34(TQ@Q`3OnuJ#stbf+TU+j
                  zkaYE5uaM!sHxYuM`?+6sufE*EjnZ@??0dd}-89Ao$vN9;NE*iGv<(^~K-ZtXp#%g5
                  zvJs2@shwxs?&4m581C5Zbr;Q^8WRtu4b%-qrx;lpPg84NI=wynWrJVmp*y_WI{)^h
                  z#Z^FzpC=>p{@*HY_f%2vD@QbT?k#ems)f{BQt$M#wz8nwAII7^q6|R9{_G=4&Bx6A
                  ziS#&RKLszm;AKnlbiuH8T-H_0z)6Gu?mQ=;Jme95$d6sQU#}_XW~h##Z@MpBBC1zu
                  zmQzv1db#uVVxbTQ%Tj^xK*&0ug-AuYFt#wJkA)zLhp2PKGofLj2lXynTeQ?p>sr41
                  zS_%pZk_zEcFb(zWnfm)367r-?qgI#p%gEsU@H5a?1g$txS!%LIoVYie0eD2xue?M^
                  zT&A^^Ud|c}j^xWleLe54kExr~z3Y7Z*f)6ME~%`vsk2nqvoFtQZo5o3uq;>Fy)7^j+n16bVRBc
                  zg&ycSO^g?2F>J5}vfPgUP;TKZAm_8ijisC~x`JI3Tn0HlVHYtmxrTmDQCr3OHqiE_
                  z4Pp$;%{u~ur6tK*gI|BoIVX%C-jy_FSr2fH?tenhFu0$QN!#ECHk)e~y6fw;B3Oms
                  zj7(gJX|4s?2e~ut@B1D)lvjofHhqce>SlF+v6~*1HS^rI*yb9D0SzxU3W-p8$>Mzp
                  z9*%A2mw(})p-GbB1<@S*F?}{X-W7l7eIPIezi!V0L2lXpy?5{+7EZ-)Y`5qy8jB7TvCCDt_Pq8f4h`9}sR!V7sQ7aXZ?H534WJ$g1VYM;`mwaIpnDJp
                  ze}_Haa}fHWxS<8HMq+f{B6xM4G^v
                  zWHWc~_Ab}fS9cz}2>w2B6kJ-I)
                  zE{SPSoUmZ8o(_9%k%yXVE>mqrL
                  zm;5NHHS>uG4K-KS)Jgnh1zt#?mQ+W-R_kZgGg6l$S*c9_^jp@@p%RaE@^14xG5y={
                  zPtlsHQ>*I5!5k(RMom@$FCF<6y4QxuFbTL-cC&wROC&
                  zGQA4)x0De4=im6CQ#?@)G?4p{VOC?J?3sc4k^yjy|%8sgp%57gcqU)2Bfk
                  zdOGr5+i}ASa^^;0-e5By_#5b}u;^o=rF$jNk3|E1bC&#n&!;+jr+9*(eZLgIT5W8-#hMdmM|-8S5s9fVwKqDe1a;begumOcZKn{y=O
                  zGt_N=HpMUnFAk5dXqLn)eeR}ZALiOV1Jj7Gc^NbFc9EB>Cl$ny8IWAYU8d~tvpfwu
                  zdyN;rXOJ72eoZ36OI_X3nnl1M;me46$0rQuk7#)?_gSTe@5i06pUs7_+!UhzIEmNq
                  zua=0L{BcCWwcPe+Z#q~
                  zVi$vzpWo2jG~P1E5WF-Vo}7->#}X$_ok^O9?v;_xjA~YYb1f#Pff`%gJ=%d|)X}!1e3EB9O74<1L=qzgF891;rsyxf9@K}Jw685A@Jk^+$$B-L
                  z)PGt9uiEb}SbtqTI5oq$0q9ry3=+RaBcD{BcvECi!RHxswOO0w+tcp3DS_Z7Ep_7o
                  z@5$U5ACCrj(iLQH4&C5$a+KcSYP<-SD>jEdMc6%kinUv9zhTq-X6}zO)0S|Vqppkz
                  z+++}dxcr{#0^(+(!oMPcFZvzaN2bBo3#grVQ*O
                  zOn>}|b<XiMZT;7-%lD^)*;
                  zNMucR&d%SPO3uI&dC#`j*M!HvB0;7tIYGlUWx}jS=o&pg=fZa{1PWf8Zt?#&W#{o9
                  z6=?p|`Y2J(6m^BkblY!TewFY|nRw|TVIJYP?y(XAT0Ysho+6D5M;6Or+JuLvZ>=-347-3r;WKoS
                  zg3dKaO3F=1B(@H+azL!ixk{F_3i0^+-EHy63tlz?CMMs*)3O9cF%kinnc$wjVpbVey7+eV5$a8deq&=(
                  z@wFj-ZbTrSiI0Kh{U9N7DPQ*0h;7EQStIzCWB>byt!Heo6$hX%on`{=GhqQ5Hda1{X1JQ2aNJF0|_c}6s~mw%|pY{(F|{F+%{mhL27
                  zSG`!d>5hI|2XQz=(RRjVH&H37s664?X(55yF#8>-$!j>b9L=Tk$`#&WWVt<3?;d`tQa={hP}07W{~HNrr(4%vJ-N3clsaR~)?
                  zs6bNa_TssBPmif$YiJ87Dappv)&(3%4$IRWJ2^f+8r<%$+JkY%p(`%YkDeCR{b8=^
                  z-+QN%A=b+NWq%8r_M>v1YS{&aU@ALuN+Qh@OiHOdBIy-CD4V~t~cyTz-N0f
                  z0QCG`vq7!4W@OIJBLWvoTPPo(!>e}GBm?Ff{d>SRz2_D*hb{ab)BQxrdY?BqG?o4G
                  zsBt^OW=C)&i>er^kCHH1pD1=t%@jy-s-h-0r+C!%=|lI^{K-2s%m*mY6EAYnnXSG}
                  z4&`GIz=5fnpgFJw_GasuGW~^<`ZA+VDZY&9bS|(`r=4b0dA{9+n^Nlcr4LTYdKF-j
                  za{I%lY{=uT0!8l7^YhtS|MGY$l=#k+5V0u%*;1U>HvH>OIK_g;Hl5U;8c1B~)ZTN9
                  znfcz;;^KSU&`n7jY0o&)62|;Sf%aquU$%+v_&vJ3GByx?8i1jAR{uDYDFB|w2?cgC
                  z<{>BDT;)XA!jTJ|;+GgJC+h@$*>@V#9iNNxU-DQPPm^tJ8C0ZghQrTWi2l_ow
                  z;C05(Fyqp-g%ORQ@h4re8b=!0^kp+to+`=Ir)er-Z1baW5`^x+z=+w~H{5u0JpCMk
                  z&kwZGAd^Np7bGwkOZjoawmtJWxClglPn0omEKU0aB)^@tcd8yv6`x{bt*%?gIg$i
                  z2l=*tE8&tX7V-Rx_j{ZjpYO}C{yo-7^+sWoGIQMlLs)=0)(4M?%e3)p>*Egd1={dP
                  zx5$WQF3*!=D_7gFeDLGH&j3a&iBWMFG8-xbCD8g3+BsN>E0lc7C818UC^=itJ&A<~
                  zCJQ@n@URYAF2W`jQb;G}=Z#Aj=);E{BmkL(5Y9K#i}D&$M0u=H3D<>|ejAzrdMbG}
                  zu1t5&sjlM?JC7xeQGbYnE%5+%;m!f?I1?#(NaewC2q1A?OSjQYTrZ-3JOJk-CM_*=
                  z(1Ridt{k%tTst7%O%^>paQikyBX`NctTCW11SlR?&HnuVi7xuh5%P*$qo*NvA%t|U
                  yRi8`Q8QJ?Uy2uMwf%Jm`7~%gPud6Z~Dbth9ER#;Ap8!<=6Wk$aaDoJf;1b;3gF|q4cWK<+Ew~c`1b6q~?leK?@P7B3dq--1
                  z&9A9xilX{7z5ATqd#|+~StmmAncILx>tv;13O`
                  z`H~9*Qy`tuiCh@JZ&gMs{x?KG_~Ac9j7Covs{;MAjLweaiG5qXdY31=4Ft-919oA>
                  zzP`)87k4*$XlWFT@bDa{{Z3fm^xoeX9*$3rfr*I;4MRyuY3%=g+VB4oerRCyk5O-|
                  z4S73_b&s|A0wp*-ogngqt3-zeQlYgZSz2Z$1wSR4fxKX}Staw9ohg4Lj#HmxmrS9!
                  z3d@e*#!(v%MSgwSn>CfDW?DL9k0S@+=$lQ((G`nsWN+%uOTF!o%kLrD0#8mil-E|M
                  zk>rW$MM-h$JeQ81=v6*m&3uWb&chd9OP(*0_iJGSi`rXns?CQ@w;d~>_!G0ad$%|;-}aOJ
                  z@ud!Mg_Cyv4yO+!bJopR0vikw|9Ut>V`5;N?a);T?nORZpGN31bA7*`A>`rH+Ah_)
                  z+uApeVp@fou70ACBQ?ObcfOl{T6WvQtO4+JgPyd
                  z^z)Uy(XR;schVY4R+eMz>4y0DvsOUQVx!o=wOzP^)Z9?koAuY$z50POJ~n)T2{Mbx
                  zknON^mpfm5yR#TVwe{(aH#A-J_R3V)^>9%|#Sh)-%A>n!)R6}>Z}w}>IJO-&zo$fS
                  zTx8_rW<&=3DZJ`DEuE4-omI5x)IIQ{ksuDHQdN9}r=u4^#KfHDAR_nXcjs<*W(=(_
                  ztRzgu`SiDl!-mLOc1#Z=k7KzXxWgHnq9BIw`l+d#dom;5Xi~
                  zO>1*Fxrawq&u$&0%`w58qpKk~p74zMbvE0-U2@(JTam3ke1y3%YjN|k8APcX8j$`L
                  zBJeLa=|7E@>W(TL^`t>ZvOj(_a4q)~7E&M259gk@V*R{5@4@a5Qx$y^G?TlZtxjV3
                  zanKN|pk&cy)APop+eVna?F%eKWiOf)^0k=Ap?%xM>6a#~qXlWsZV-rI!L~C{L!ZG0
                  z1r24TTUSiTlgHsQ#Zjx@6V|8_Doo9qW&2?mL${MSAY~kB9ZbAn+ZxDB;yuH3F*7Zh
                  ztwU~Xf*mt@f7+36jg?Z}89p#NaUuzej)jR?yP3qRrvW*6xKDgneCteO3l%ZH6gzi=sBOx@J&8KIbhi+g%FuTaUHQz(X&|K}dwV
                  zP?5aHr+u$ME-;9XqQ0(00qtAK7*B;Y^R7~F@o0i((|#h73{qO7ht$b&lhg|jB_|@|
                  z$M^*D@IDAkOg3Su{;6ICLcEcmFJsM!$Wh}C*^F*7H~ji5P$(o#1}#Dlb`m6~LJl|G
                  z2juC_-{GFnk)vk&Lij1;{e{P#iu129ziPS@Gc0OHTLBBI_-nl!*gzDPfk>lCuH~8R
                  zO{X1>nubORmgF>9R7`AnC;gAob?ZuAYaFtAMWVZTg_`5g;P@hNh3aog(}-nhC9WbZ
                  z0{AMZ20mIZ-PBKBPm@tGnKKuD{ri=4Dl0f>_XI=6Gv8-wlRrUCgk~@*NJ)*%G^JiS
                  zg>+?8FI07mDRBJfnymlyBH`cdL00Mc4YZyfH+8r_K_BJdhq!Gp#&SUBKX_;Lu-$-i
                  z;4ki%W8F3x(v5Jsoc+A(&GH#Z3@V;1-khOEHP(@pT`#%d#28*`emtnjo_O
                  z)`+AU*?8C6sTap5(d`G4t45ZVv2>tqKfz9R-lk7h4Yu3LH_<|=pH3n#ddj2ltUU9M
                  zWUU>v%}(9Uf9F-U=gf7Xe!OXMew{WIn&G@2x9fh8gO$X^-Tyvqj(U2^=yDdu|HHld
                  zC%VwKnAok{_#D#T#_Yf5fU|N#~2m9v1#Q1^PbCobN49e_*a##*#`M@cgk?W
                  zE>CEq`*H}%Cil}2Ha@HAg^7X2%1)I2i|gOXfrHyg_JN!I>VRieY#?U^M>8rC>;n-r
                  z?QvWwSn{{osxP-qd!Uw37VG;^zFBH`2a{ntO%vVU*Xj&o_1_0lAMa9ZPp*9Rm`xFu
                  zd%MRMng`~1DQ9?@*zb)B;w!v*@56AIbNOpbO?SFI9}9%6hVE1oWcDiF*A9)y!#(Ro
                  zgMgT(FT^C(b&fZjADB*~n@(!BuICY=Nl(y;h@8AvdOC9ire|hQNY9&TR6f7)f};gp
                  z^|^I|LkE8Ky>7IB(x76q-B)@b>yG(Rtao)4W~M~mBLIXWAfZtJIfKr;Ec*4=fP?ed
                  zZV)p`B*meGbLbE{VvO2_>{J}9`kM>lfodJ)Np;oOC{u#jQdjz)`QKi;EqWk
                  zr=Q*+pFm6gTb=-ddiuqBnftC|Qvk4Ok-Yc{rhH1Ab3UIT41VJ&gN_|UMfy89PPfDB
                  z(Wz8>B;#HVjw4oGYVX8D2Cp%TC)dtH*%oD?$Xq5~4gByN!1>SA^W!lvCB}1ual^QORn(kG@o*uUp
                  zan$AtwbjrdvrjC4gZ;dGuOt3bhV8QTt^KobISWv|iVFNkaygW1!B%JRCCPTu0A;ZW
                  zs)>-1TT8zyqvPt}`5!UqBQaF1B*lX(3WLU2=C&u|2Ou*%#%Rc;Y<3a()oKr|ecp+S
                  z^19W>y8vH)jq#LadyTT<<*{7YfyU#EPt8V&|Vy2xkj)M!Y13r3}Pn{e`
                  zP%yNTpENZgB=4Jova<)i!cu^#IPoYyGY)EU82!+tm3`qcSv#1YsU9s8DNb(;_72~n
                  zEnd!3MZ{CBJdVxv*LM7!7qc7`oR-dX>v+YIBIZRt{V|!-
                  zbn%n=U}33Gf`Ur$xL6HqT!BmxNmkw|F!MahXnatdmar;{RK5K7#>!2NWP{@
                  z#AR2_eCW3@`_L08CRQclZY*tnoI-oDYC#=8wT_8w)}5VvdC~IfOM2Vgc))EosML95
                  zKK#bd0|ah3gj*QPjXCU?W4x^xa>@cmlLYp#JEB${bmv=xM956`VQ#3fTm9R8REqaE!>Cqf;k{SWf9h8|3H}2j5<&N))o(3L^;_e>c%^8o|F?*O
                  zj;}7k813IyKZ&P|1;MvAYp{HK{om=Av*@1!K;6YA?2a~`@d#xPWEg>_hw%S`CeL^^
                  z@Zv|yly9i@^%0)UL%krg
                  z{Ci0B{1!Y^?>MXWfngVB(|F?1Ma+~~|GbWL(@#Y*ZpEFK{6maRwL}hovuDN;o{r~^
                  zwjqoJdgU(#Uf`rxIT4;-?2Rf%E)Q6EEp(eLHc=V1JxPJh$-R7Ur^?@*P?+rJ|%Kx+4#5#t(UsOASmIo8x6c&!lKyJkJdLoKRL>*E%GuKOuKc&*QZ@
                  zEgvra^y7)Rul*46Hlg91r`ps&L^!v{7z@k>@f>-0&PB?vR%v*bh_x}4w97lAE}M!G
                  zVHKU`Ys!&i*MW|8S>x+ls>97vxs*6I*S{j4t27|yE8B@uZ8r$RgCqm5lxlZhmX@{h
                  zgadZ-dRIpwQ&NUG39osKX6C5cL-T>Ku-0m+z24*GhT;3Xm+X71So_WQ_Cya?UEQ3=
                  zmt72=FNB}uvY(|iAuTPqk1SO(6M?EOd8{91*
                  zYchO|{GJHD!X;}g_R}iib#z
                  zoalx3Qx;hiM8R*+spa!vfa!WX>m9pL$n(Hf*me2YH%hWdK|vvHP+Of%{a!cMwG?Wn
                  zKDX}PIKCnvM}+`DhxoL5>(r)rarDHN4|-mpJ+Gw$s37k$YJyW!sU*4JYqK7
                  z>GnoOibP*O_XRCDclx?ffA&bW>B)g;f>YgaU
                  zQ%@9%)jSaS(HkRHmpS6WBmi2b0<6a9$FcUjV($*@+)3|04&kVXM1JTMw93(Ellv~Fc@r7iqf1QntFf@jbw|EyQ+&Cpdola_q;Q8;1HV^vw-t9-X|<^$*>Q2HeD
                  z3qIViP1456_^1+AC&Hl39M*Tryva6=6ETn|9)-(5D>ut#V~+llQyXU4>-3XrvJ02_
                  zNu8`%UMWMXd~e1|xtH;g)v9ua6XaT4Raux=DKo0-$+`DvGL!X&1uD|(H!SBKHuQ-#
                  z0;rT*n9*}CgiPfh9mKnNlrY>l6j=h5>@sAQ6{YODAnSc*2+g8M46E+ak!MWdy+2+T
                  zO`jlDbr4RKE?hJ)MbB-*F|t%BVVrO%K2~IHHdV8@76M|{3g1FC-
                  z?Wyeqj>uqBXqF-Lc{I;)LNEi*C&@(}6fs59A~AH;f-!P|BN~{2vNFM2b4abk$YXlB
                  zudUy>hA{)1A~B3#s}YPidVB$1M8Us~ntG4CluLMYQ>)Fi%p}g}=n30ZV`U!1SrSXoEx9?3k*0
                  z{+o8?+x%lFLy*GtX93zM$YcE303)m1^JC5Piq;;kc~1@(l8bT(qg|Xlemiut2b`{L18}
                  zLU5owyCtkb@c9*rh6keEI6r8mr?&4}PfDtR38kLs$UE0tu*P{Gr8st%W4
                  zBQl@>zYR^Z1`D;pN|`%EuQ}h{wq9zGvWtlWX@$(wW(65@;Yz0L9>
                  zsJMh{Mx)Bdx0tHUM9kxM$ylX>rmrt7)tuR?y%;c>-203E;o&pJDtE*jG;v6Dr)s?p
                  zUy=xs2$Y892jByQH^a&n$Sjf9w~T*_-<@~`4}GDcrn`l)QHy7#OYQ-H+W%)C1*HK5
                  z_K=tYCdZ{83l66LoUSBLUjQ^{5acg}4LD=}UVy=*%l>cP6Z2MgsneFW*={qt`pFd7
                  zfRpC_d4WOOK~Gl_Q%;ohtI#k`8>+x${VzP{{{_+B*8VxSi@oc^9HX=5DsK#F3CN-C
                  zd2xj6ndFQ5Y4LS?+bFIAw060{=S!#dOT2co{u2Urw_tSPkX`@60+u`>?(g^jocP6Y
                  z_1aDFq&x~?H~Krr`0Xr`5ZvMRCXYf|j}CAMu{9(uQz}eU^DXtBP>$$OYKK?NBW_L$_Mu$H+vr+^19`t`QIk`W-J5Py61hEY!KPIRJ2boIyZn@n
                  ztT*>^M}Is9u?=v{v4#>_2>|V!LraFb6vBDJZ1O9OkWOO(huco<$lvI?vH#&Ulb84B
                  z@sur9H@+5Z($J!?m^<;H9DjJbyt*Mch0DRQ`4<5Ad5YKvwhO_9dYQlK8s%zWNGqH9
                  zyg%aOv51==>BeRw1cZcG!v0Wo<_Bm6G2;Sn&T-X!FJw1SV>ahoLB`j@hz%NcO0*6z
                  z9Kq&|afi#LL(9PA=E7H?u;bbCLl%1dfn=dZuGCgQ1f@!z%$Lgf*l9qx7*xP&Hi&7n
                  z@&ok~9_M@I-uiK_Vn
                  z>!0pJ@)5k8J+X(C-1$4;@XS+LGc4HEmCb6SNbP;O?Fw)S!Qc(%^3>5U>zxE4M@d%c
                  zHUx!$@uO~V`zw$
                  zu;o+QW}my=-e_Ba97vp(3J)z-Jw3-QH_pv?igwS%aw9Le7P;M7s^;#`fe}3Iov-w{
                  z$65615}&4ds{&#j@m#wugJHsx#n!H=&!(3~gBbJ9<9#izT7Za=vxgJ5)%>M!!1FzD
                  zk-WlN2C|ewXFpzGHbg;FPQtq1`;@?2$ZhHix4&
                  zKP+taB&~vODsx7FXN;dY6@riY;tq
                  z%3oMEPV}*CSJx_idkFE%IkxhMrtvwZ$?Ut-b?q~~*QWs~K}fz@oS=2TIUpvcO?q5d
                  zU3y&N*oVvd)MFE3du0BP^MT>_pm>5@)${VY>VI
                  z=Ac%PVyl9T9Hn+Lo0oPwf|>D?}KryK`B+x}JZ1Q}I|N54AJ#R6Mm=fw?M>T&QSEwUd5ZS4u~)^ukKMXLx;8SiXxCJl>Q
                  z3oX8hqZu{#eF?0wjDIpJDacD*sSRpsYOC=GkNqZma6fSCy54U8tD-5@CGP_vZe~q~
                  zskSX|&7vOTTLZhKlvLHZ48unVX)iRP$(pD|-lyZ-O>eiTZ`a{sfq|2P)n(SIIq>Go
                  zojm|L!WV26@?ujA{hyr31;U;`?c;?afZgq2hsscfW{NtpMdaitq10$>$^(%UaD;b1
                  zB8nC%of^660hq}A>pqA
                  z*IlW}1eRTIJOoDOek>@0Wa?VrZ9KI56bJV)ISo?yUFX5^-mRXiF&KoQ*iDfx^G|me
                  zMK^xdRo$kzOYH)RW=rrc+^PRV0bTFf|1SZwk_c6rbAI=VGe%9~32p6HlXZe-<1G|#
                  zqx^ZrPbatd3Dcw*t|xi%N4CYP9+Wc!roe%lj9!2Rzj@^k1
                  zW|pQ*|K(5F_nCGL36dux^XoqbEG_pEF%{?S3^R%#TD`oY%vo*~Imsu6gc%o$osvp`
                  zqbsagN%}a+wHFs0&C~oYcFJ1Xb{JlH5c6V1vq-8+zkc2OK41?q%^@N2k_1TG6d@>W
                  z%f%*a(Ik5Ft#WYG2`Hy~_e_7eOBjz0#9;i8)9~J)8NlyYP!@PyeULsg|P}05ET`wVkR<_{8{)K5gN?w+>rdOgjyscSyg~
                  zVc+TL8K%f$9obQH@Wo7nT|daVFb^?($>gS4c>UpzFyVlde4w0hgZr|_OWBqPC1s){
                  zyll29@zpG3emhP*ieTbGkOVOm@aZMi7)7@J{5Rm+u}+aV(-IIvYq1V!U}UnqBg4t|kF>PHb6yQ%
                  zo4=e-oxjj&=xKTDB!~@cHo8$ura!CDLADShlz#;Mn4c{uNr{h7F1BXbIj9Ju1X-F!
                  zyc;Eo*h~#!qaUv!7HWEobzSdP^g3Vq)CJOp`0R0q()|^^1t&Js{>e-Rxjoqob=ZT(
                  z>LT^qg$M_+{V>YUQ;&4bikO1dz3jJ;T{`DxK_xUVVbo>Iop*$U^DJf7P{DE`43J+b
                  zCgI)A610PWYQErtmaqP;x6AcI=|phBO=ji;A|Q@PUXR@xA1(~Tv#}w%w}80-7e(L1
                  zf+)Hr!wxy%SU4GsI7w;gBj;%`U>>G#JO!Yp-yr))m9!-^VO7klX8=h@hM
                  zYCWpW)BVcQfTlWD$tW&sLko*?YaxJ>x6bzYAEzf5TSUhRjTj+)$#59Iy#r}khhH6t
                  z2<~h~7f{hum#T$7@=aU5;-I=n0FTrahaM@Cg>JuKk-K{dq(etJd=!7gXbg}$qu8*YufXO6hm38dv%S81icLTCcLX!KI&rCe^jKYt
                  z<#*T#z(uyHsC2t~X?E_n@Cn?Q(QeJkz#2+P_N*OQI18t?|Hsp1YJae-lwc`+Um8-XomW3&m^*@w2
                  z=Bl$5E-X&&tpTj15@)KN?@iieGw}=oAPmznRnpMU%qdFB#rZB)2NPjO>3HI%V#Kk;
                  zUDaM@wri^RF@zr{JIGP9fElg_@O0;r9m$}dlA3}waq&iny58m*tc45B$1~6_&)ZWC
                  zDL*og;Xw|Or}kdko3+3CIC9^cL*2xsih^mXXNpAn>q9(mSZ#M%$w6?!KWpE|yAS5&
                  z(Y9k{R=f^Zm5msgi_H>8%EL+X(hiFCx}-@tM(kvA^^_B7JSBt`3tFKst1E|#f63kq
                  z8*TQ>;S*%DMItXRHBU7HvgLAUyJpbHI%3K>;*3_ROcUORfb#=1<3d_Rk*#=Q?oM);y_1zN){Kt{Evl(-hyR&Rj7WxM2-|3y0
                  z*8xj#DPPZAr!uKfETCeHiW<7b@dANIe
                  zJo1Hqw{$h6C;NJVR|8li)I~19&(WjBaNBpx!(USr(tST{Y{Wizxa#dZ#yzEoo0<~C
                  zp{)n4XBu!Zr?%+~mXC?R2`5EsSW$0iP#?|h)cpBzWc*?*%Oc>I88Eg+m?tyLzBt++
                  zuiS8}|7bJk`?<=1bzQ2KojKA}_oBcZS8!+x_|9>{AvXs$iQ^jq
                  zDz^)&fAS$mCZB{A8p;Xb0!yA>D!ZlLn}XX;>cxq`C8;lXRywU5MT2IN1BUdXM@2bx
                  zA0B178h(^xZSmSnH)bd@O7?dcv?~FaYJHmeh5bOThDVn?=YA4o0r9DO$ZbXLy3FtwOI9Usv1*G}Uso56}cXZ5>?e#>DO2qWnTWM?_6uqI;9j4t5Eer?~ClX#L7RX2|a|xxV(ioA91&O1zFO3erc+|4R8VBIiD75HpQ9o
                  zPMrHIOL0FqbI-P^6>*UtN;ICwGMWk|>tBEdHImRzK15L4{flWTDc!f6X<2$5xMW!Yh|K6(%Aad?
                  zYUytU#Rv6{E}wSVaVlAi3@Z8-Q6_t!=ew>LzQ0KwbUxOOK3;|Njnx_mBO0X2wWJQ8
                  zHkTqHq1a-ut5lW!^p$gZk(h(_avpyE0*hSKgZ9tnkE30g5B|hii_iqV2n$eWP`O%@|7*c
                  zR^Cf_k-XAhdxFC3jP4a^r^^NyvUul2suea;<&5m@?aM1$T57CguJ^9-!GH~9PnEvK
                  z9S%GwGwF3hCwQv1vRgkCghHUn)}N6z_Gioehh^y2nJ;^$kR-dkB}N9Xf7XMU3yC2j
                  z0c49uCTAM|8LNb^`j^?4)m1H19>3VRj6Yvw&J-j>4wHi8@WT(=DAV)!5A@!^^Kvc2
                  zHg+HYG9Npt&!oKSW>vGkMjhh|R9%~7XC~`Ye{b^`b#`3_yco0dg7{DYKylr7VDiFI
                  ztqx||j|TXed8*o+9{hZ3A(Wz+5L07z3ccg4Enh3un<-mbWd)7EUW0k>r{PPmkF!*{N5~Z-pN;M49Y9t)?wK>ErZDQ
                  z-cTm5Q1_YmOD$qJ;}0ei`{bV=>l`QWztn=PnF}qcCQ-oaoe{K1c&@)^aPXo>B`WFQ@mzqs#}D8NNE1$(Q0J-ZP$$<{jP5M&2Zms
                  zi0!U2L(6j#{vu`YK6{bvW!1}87-}LU|6+)5{-6-0s(KcnagwNP`HHMfcHqGKlL=d=
                  zTiaXkXfqb9&W5n-UF>%-K>*u(sh@l1`EiRDmW&N!+R5T~{76NST>wq>VsBrc^4oT5
                  zO-N{HlyZjt=a%{jMmUt^N{-)Cb@(WcMZdm+d00&u6ODQlIdXGa1`Ib}Gb=v(5*S36
                  z8S8R+dD=RA+fpHY$Sjo2WVaZr>jOF029HTGiDuJ$im5dthP3=ZfAeb>T(_upH1o-5
                  z__^d!Nn9D1CJI!K`>~k$izKYuVi(pzwM{?{*}1St?w3CYcBMqNj~|=>Q)%V#So=R&
                  z>sv3vX3daI-!l6j^fYpQY+?e?%qeo=D`DRx>F(D$g;|`6m^FqGu$Jd>A#Ek@-}Eq#kE-?MQ+s9yBbIog``)yD39ltCLFXB8X@ocP2)h-e^H6kvK%D
                  zWkDo5t6?3B8grXY=^t4psmxEWU)@10?znY5_AE(Z533_>_$WncRng@4O111X&<-{m
                  zuBiQjZ<6SpS9Dx*Ug4!SKB>5N^%7OP7szD6N$e8hUo-#Y
                  zFLYik$eCg)RVSjp2ysr;77H~Onk@Lj&R6aZtS2YTG3z5q_9(bz!XT)9>Y!j81MDJ`
                  zeCez#g`_aI#IOi6gc@+U@k-+rb6N$J5$sVg#TmB8+(XXL*z{L^OFvOYKrZtqMF}z|
                  zxEnlxy*n&!V}U9vTL7;F${)G42r7Wxx9zS>qd;_-f6!3a3VpXLd-Ivd0?lm>HF|e>
                  ztmeiFRH&Wi=QSTOMRWh^dxz#)WO0%f@aa{u0?~zT2u

                  x|X9@fSu$b)le!rk_)jr-18j1H7y^N$Tr)D1Y?&5e{`V>L2pt zF^WbYbo#BB#Aag3EEa~8$%o}qXNyG0ulps9i7Bu1Gi7CxwP$6z)ADh5%uE$##<=xn zPcG|;TJB{KL%*Org%XRJ&YH6Wc=IqdYS+crX+GWVk^z4D+94bJS;wxcELwSiK!D{X z??EbAspyr|o@Lf^OxT12=m9P(jQug>DT2JinQ3?xbK?1(;!^6D>|&yc-}S>g`m(70 zje7B>_y}U!nhi9OgQIXQCc}(2 zau1ySOnMUA0Q0Q*+JO+fefp`a6>;@>~Wdb2z~!>FDj6>C6X$ zxv%EFvfUfrmkfd$liC)Cp?5|BMyKk%?$=qreFKclw{vg^Gu#hb+pF!M8vfPP z!65ej^jkG9eqO1rGei)O#}$&MH%>INCU>TZ%GcVkgZOKjJ!fzT0xAJ|f#$@FGMQ21 zsECkhd|-gk@d{lCKVl9)nZeOM9^KM|i6dp0wJsE*kAFU#R5_EPi5xJ&D){)5H^H;> zr6+r%$~^5YOwRW(=&YOS5a2dRxWt9!Nb=DmXNS05bmb4Z+OO65liuh)%I02P#51ku zkFgV^jGjVvX=Y_tW8mVNG{`+V@bPI`{2=zl3=gN154f}Bw>;|LcN2l2@m4|=ny9dr zW7iCimNUl>7}Hdl`ic(@y-kspGYB7IJ7>Q5yD;hyx|V>7e%=R5Y4-*^+Yfs32VRUHP$NG6qd^dXkbMZYc8DqynVCQqdz(-V}Y zi}(t>HsH}kDfQsZWE787p6cc=uUkb*NXCan)Qj*!Zw>$0z;IZ8rk4)Y_EFx)Kah&N zWpV%ehK9MfwW%Ik^iW1h)1R^}Pxg64+q?nGpT7n^W{a+gI1#Y=lj2%90gmN&X2Aq4 zo?cOiq#ge40e)v9`+G874zh`a`tY^)32-)VoPbRZ;%J-vD}x{38SHaY0kzCSd){89 zH73z$JsdC;#3BfGE@)S~bEniaJvVt6L(Gm}u|ESOz(U)|3q{xDU$pye*C>S{u z>@d!okR7atNl2b!PyodNhcNji{nx(%SHFC97j%?|GGcoKz`nq_6h#sChg_ms&0#9< zo3HnsnahM5pf~|TxIrHLnrax=zJ1O6{8#}D3+S!yPAs6%mjocvi7C*Y@I`+x9L%(farzvoE^%P4Ln4 zrzo6bWO(%GwGSEhQ9P-{<4(6(y~(1>Em0#;7`Snd8zA#I5#sFD2P=8p1c`6(vikuw zWx3e^5ltfIi($j*-(m-#Ysm<3&i$KlGYl~v7tDsM| zt+p4H@cN<*XR6`yNR*c6+x2{^Gb>2V#cJ7mTLhix6DBRUudBjheGFSS2C%rA$WtRUAx0HLRa%;(M*rQp!+zG)Xnf#)9*#U zKTnLbLd>>|?K`lw1P`~vtXxvdFqY$;mPViS__RRc0FYgCMU?lnF+!wD&dOViOU16tz6SmH(&nVoF9C~mZs+Q0kk}_V^zrb{@oM;t5Re5) zPPlX>Hgn7rbwE=(UG2E==+uimHp{*wdK+uO*&RX7gQVVkaO*-#o||4ws~(jm1Xh?u zG^WqHUk~%yPv3!ik)`D24oj&ss^qyY7Xw7Y+`+yU`Ip1i3aGjfoSTBlr(ze3x!VEG z!DcwW>YhN<%$j1p{b>`osqR&YIgNlwm=CzPSgbJDL=s}Z34^`3>{rWQImchnNgE_K zI@KSJ7MGR2Zbjqx>D20hjL>cwk*2Am#$b@&LMBA;?qF>B%IGX%lbAr#GWZI; zVD--w6fnZ^B$m}vCrXV-KBjuP6+J2OO=*Z-gP=3WF}H9?MtYNA*5cJ)w++kjxUq{t zjke6tG-?HoPWKO?A9EWdeArnqaklQz1GU2Lo4Cn;OJ(iXjL29K8|#92%t zTF3;BM=+v>NN+?kA*4>{x)Y?n9Z4}1j7~D0U8pyy*R2=wZcFc*uiMlCi`|+7&=Xkc z@K-f!*ky2N*<|ARgu%ohCPF3q60k;Ey;&rI4c3r$Xg20Ji6|(z82+$nJPDe0PV8!< zau5qz)dUi7Xlkx(&l(B!wrF-DO`WRl=N2_5HKV7rdd#ZlMy)M=)U13s%IqxRe4(n06k^gD6#zq&%3Q;q){t#Yax!RJD^EPB}oLvoHiR z=G(L&D;Yh18Dy2}Pc_Oupl;cwssNc9`X@R04Fl!kT(#qTWoFRd85^phdgUX5a&D<6 z?=qRqGH1!+Z}f`|LS}mOAbrIncu>(tLE#1+P?5zTAA|I27&iT?3}2`SgHO4#Ac(i( zGuyo5Nby=OnM%zl{k+dewK5B+Tgu}lKt{RHfpMI(vv@`tF+%lGQ?%~$iG9Uq$>Mf; zu%SnV%bjXPN#fiGv68h-GX`mlXhurzDKrywuu>;D)* z_aI)}zCUce0$MQH1)Kn0Q687)X|m1u;?E8^BbD|F=;}P=t$7_YVg|g*tcI~QZL?r; zRS6En@K_Ck=y#8#9jUvTS;bfX;-CIEeMjKEnjh|qpD{)CK|x<+#8~;}+3!}U<%7v5 zNv$f%wz76J_|zm`;2d@l>h6UfcRmb5YZd{POts*xBFbPs2GKvolrUgb;O#gRJSAcX zuJo9JZIKvQ!0Tm{!GK+pCjpCMsYnb#ok6rt4#iR>LZ6;E!jQ5!Ldd*}*PZI#oz}3DRwD1h1p`zYPI}*qDrTV5c`|}9 z{eDRx9Dwc=RQj}kfDvw0z>KxLgY-BQt>xk5Y}BF-Dwu&jGQk*yuTQyI9g$q#0&4y$ zk}n&R5Pmj)stO_uEGY|UHC*8lbd;3|1ynV%n(876@~_8e_idN zYRd|qC_s*xPmr}8mBNSEYWU%5!}>34Qnsb+!!i|8@v7sEx64J%&xOsIdCD?F&&s&R z0t1OHMCE~)H<1h`Nr@py!i3#LP#B=XwspAcPV_lNg1>)G7}6_!T2$<{Ae_N!)O+V8 zLu^DH8#l zbcZ2-3E!G-LwuF`Dw7XdsdNIEsaOKoez<5p2b?fD6;&sXlHtpO{W zIrk+l`GreWI!7p41#+P-8CwHf*>XEhoaimMGdIcBH20zlova>^sU_)xf-{y@4pFT0 zCeU}x5|*T>LPE0mJ zGq|^wBfTbkabm(IRxLS!Lm4;q4}`^K;JT8T*mbE(#0INCL0jO&>&l@`$yqslR7})P zKHN2^VPr5=(y@;IkNw51ja1p=^R9>@Ti`oGw9|Cf6hO!xe{*6ONTS`r&e z^C6B(%^tctaogV83vXxH?S~h5j-TxRX8+S+*kkN*8-`gQC9E(BXQhcg5|F$?va>_< zdkm*N#$JzL2BWJ2kJZ*=o^pCFiMyZveUw12js}`|i}>#E^5~q;y6M-i&0_?%b;byQ zZqUBdqbB(U>W?4u<%jMbjz^DM9e0=|;%*ecujpPWeX`X^+ev+1TYfzF2643k4Q9G` z?KeOplHnga#;jR!$;W}vwTcaJs~$mBf`BJ8Vp)Jf6ND(PPD%}C+M zc)za30q)tt*B=e)9e_Auqi>(oTD{*u0R~ROcx%dMshtYLI+ZJ|t&M=$Af}fBgz3lj zO0LdmQvuEfnsR`iC~`$ulD-xbc79)HIVivx`(mdVWIZnTk@nb~;P1X;9*2nn9@vrl|!g{@l zR_g89^6ff2PGL?6eAtA#&ij<7fA;+70vMeCtC5d@d`!n3m-gF6U%lT--|(~yOVU`Y z@A`8qHda*KB~SFjGsOPef@111>WK!kRVdaTp5ef;tb1Eii~dGKdg_EbIw_LGdtZ_B zfVfHdi-^_Ym_=2LRP_Y%zssRO2$a{NK*wcWoL1+ftwLyQqYJ}`cc|HJUoQXN>3X_G z60FTBXU(R(X!XbUS!Tccq8nIHGoCc7?=LWbNIwXDSW9-6RNg0W7CZZrNg{< z7M~ie&O=;?YB!?t7{{k;6~07gJ4^NC04-K(qAaP!H%r|o?KRS@MM(*waQE3?aRUg$RrrPOBFqO~zpS0Om}Z#88#-BBl5SpJO|(UP4&PR($wx8_)q9 zGJUW^GN>JaQ_0*{nij=ybii&$NeL(lNDEaIf>c3jC`#lrfI(0+5PIkxLWezg?R~bd|L8x-S>EJe=9zidTKB3k z66D+pX;9b?t>NS|t;Yo!cTbWa8V;WRHTNK`N+fB9@06XuT*p`V$fdy(&UtlqKiJVs zABzVx1a0mw{)K+kY@q!;kw_GT@G7kq*Om{22LM+#)>ca^ZXS?R*JBe z;=sl@My=@k`bOGtbEd_kLe&AIs_|SW4=JT9ozOrelnE)tfBGcG%v;Yh!QnOc=e>Co zg5+J@oq6{`?J|G1!sU0tyr6Z0dVBF)cwF=Hg=K7KCo_=DJGLyayH75P7P@U3X*d8~ zA#odOSzv|{@Z32TSP6uCZJO47=tC*LZ6ZD*Z>jFOj7yKYYS&{p&r)OVeK2oE>%}JX z3B{ygPmF9ZfYt*lU3SRSm0rJ!2;YXoqf)wgV(`|mfVt|4ON|?l@Yjyj#DBmEBt4H; zVSJhB^ zCn8!vlS9RAYq&?sST4j=e;s+M8cb-4w6cmhcjG&5oT4C`F zLd&FTHwOwOKk)X_{CqOu5*9KR}W(!X3IYXGj__WdrezBT;>26iswRLKA-{_%fs zkZLc+OqBy=D{DBu@Vx}TK-%L}w3$R$69U!Djs(htV>@idD80fQ!68I8`e1E-vh(0j zbv7xltm%oP$=1@{Gazrii#_26d}9ZZcou_GVX@?6V&=1A1l2QDfFPx@!6XJU^>?1! zku5Xz|7Ujci-`)5*Xm}=SUPj|DCY(W&OcOyMuRa5_zV45f_1Au&vtf2bY%*YKEf1Y zXlUp%N|xEyWET`n0i!!V?;&OtmHjF3Dv$)~RX5ZBM0667p59GLh`K@1;@gk!lWc@h z>KBbvl3EWucpK8jCr27Rk2WLqX7KQ^VJk4W2xO(_D?)A^o#M0W z_n;m??JDYW<=bu=X@mn=<3k_zHVP)lg$Bz9EGvy-j>#;HwByDn-l}RjY`F|i$Lc24 zoz}A8COGD3f(9I-k)U_rz3s2Ei3qAMq;X#@$(-Dmu5_kXo+1zTmR3d$Uf*p9#PfYY zycCklQRXT;5mN6Pa~g|PWT^Bbe=))2>3oz5^E%|{3+iMPDr zdRA7Vn!R8zP)yhx!Xr*|)uGgZmxY(lf-)a?O+{J}S5T`NZx?;3M-h8~x|C%f7KFE6 zK^Mz}gbaeC1wF)nnP$Ebr@!!xq%^cB6hi}ivKuK=jV@8bEEH_~Eir)@#mPUo zqX~=cB3BsC0|r;DFON-0I_<*?Km)xIyztE3HAhuo|IX~T`_4TO2dGkQusbriu)PjT zRu2bs?UAagDkX@C|2v@JGh5Tq^F!p&3G75yc0s3=!&(>OXC~=B(~IBK8f0R#STg3x zjPF}F?%9tL^B?AlHx<~L2k>847f6EB$Zr(XK?8!Xj%*C)hmCo=+^N*sVDSf4CTdT9 z$pV~yf7WcsYoBE#=2!D>=T9=xhZ>St05n?3xvQ|{ep9yb!A4!VmcfONj~3ChxS0WG^O{_x;@?3bk&;F`#3BwiBT)`kmkf4`fod=QY{09~$9F)WV}FgR%zi zHT|Z(U^zgyNMy!&V7bPXIRAtO7k3nH4Xly9Lnc?|=c>~lWI61jlP1klPxW3C0Vwq9 zIq6s1Mv57UA8-DC7V>`Gz;f{g*FbDX2k`|)3%ml%5wR|GKbRIcpa;dPX$3UCKwH}lb(O57nOKla@gMGgNhgG;ZlLv(+c z@c~Kr`5^L|Zb-;WcTWT0PAQCEh~*bkXJi#%?PkN|bQ3&YeUG|us=TuRO)~0s-kC2v zwgR8=jvbJ`h0`w-JAgk^X8nyi`)6HeuO(j6I#48m+kYSp)ah`j&w~;d8E|4T$;iO? z)kEWyqE3UV*DG0t8k0{4fvv}Ar~tTfY5V;YWaq&D6Pa?}TMGo^|2!jvN7JxUft3_Q=q%9ncI0Mn;pM0U)SP9e<4h5McRcnB0JBXOWP>@+7ao@$KfdE6o(u zBBS8Apl78k7rwyp06ONXu-h}PzNX2a<4#B}e@GhMrUkW2F^L>5Bl+Q8zX#vIszZjv zk7|wNmj4-qfK*l?%o&%ksC{?1b%zev3ArW9W)-c`F}I}0XMg)`^PkmlCQXq_ex(9x z3nTE?5i!E_vb3MJ#9UuyI0d=5xgY(m89ObMz{&cBd#)MCO1g^3@;ttgDgYZzuL$hX?i3ME2x^Z2jMu9Jn7Z&~*bokQt;G)U+k(p8Ny6=x=0KhH^ie0Z41!(>B@ zD(uoI7Q>2clHBKfEYuLL(d>ngHB>8o$91)KF0P0+#2=B(w=3rLAz?*+tGRU$)C~7s zv0(e@c=z*aq15&6GOWv%>m8I%$i6R2jm>u+F2H(wC|-`>Jtg$<%3_lvtm_{G$;&cb zvBt24n1cNF#KwMvrCCbt;gSSKhyF}p;||R}n@w{16-U|47q>EHD5>LS+E>{Id7~|{ zq*xqw%|2IdW&*zJa7(VR5S^;>Jh>KYUx>E|-4PoJy7lZb;+gH-N0oX@cUxHPcaE!q zZ8U1nGVCU&dkYYkmM6!(Ek3FkYkt9)7P>w?+dcXw7P{X6`#D&#>ynIsOaV!)<@l#b z>9&QnfEGr(93L?|yHfqcz}T05Q`~9Vu2wkHo?5=}FEL1h(uU+MLAQ|XxFsp{c$y=pLLzoQ-8y1rKlF{tFUxjlJygZI&FZ8#KJ(e_J^#N;lj z?GNO7Wxwd5QweoKJ105u+bx0e9j>KvsB721-LhoaHa91uQgYbxR%?>iE4dte+TEf2 zP^5*c=WT3ll6UDLU2G%7n{&#cbeUkkY}6L+gPve^sGN~pmP|AtY@z$`HLeFD8I&B7# z<06G^b%sTV@fu%a=>1;d2Q7q%rkbgW@FZSdnzAQ4nYspZ1_d}8n@pJfQCgcNUSyY7 zIl3MvFjH39Y3NJQ6E?wqM#kx6UdvbT;9I_m`BI(Zha#``mqW??%mO-80y>RF=vgba z8-le0I`RTKiFB+5y`Dbw`bX7YHV{o)f_52RT+Pa4Mt%~V-4yXhvuo~|&$i!^c^3cG zH<}tja8>Q_v>-inegKmA;n8JZBTjf;DeB<>%WVsdHj z+@^$v)B5el=y`wZer@DyKkN_TfP^JPZWBfB4mEU^0`Y`9l7ACABIsc&qxH+_@sn`J zY!ff(Qd#=h;cj6B&Dy1yQ8=X;Gi@wh!RREnaZlqR?sei5`q z;?r2Z_U?#=(omFnSnVkGHJWe9#Y5A1zeqb%KWhA0Et=0~`Zttb7iW&bqiq>PoY;@W zA2k$xVw-j&f7qYNvy}`dTyi4?b#7E`JWbg2J2zi4LNbDIxsAQtt~oB`tZ%qj6Dp#& z%6_e~!J6OdYfTIbH-(EnI)Bte(KzB7t3gnu`w6bX?S%bWZmpLI#7C^E>RdcOc?ZjD z(m}=#^OKZo_H1xZriw+5-}vu;M;Oy$oB!=U2b8z$rd@Fab74Rf;u($PJ(N{V)Nf zL`)|)BTjj1$Iq;an0I^7G{H6?l&YK&NDIaVarVsD!;z6#jLNo-urF-N1uj3{p z35uT>MF|Z1Ug;UCi0?Ntvz3zYs+>B3xP_h$*(lLyb{z(h|JuhPYLEH~y#u69a&ZcD Q#!?vS-M;Zb$1d`J0D;`mm;e9( literal 0 HcmV?d00001 diff --git a/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area004-v001-MC/word/media/image4.png b/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area004-v001-MC/word/media/image4.png new file mode 100644 index 0000000000000000000000000000000000000000..e2cdf4eaf49a121e17477d6536977d7b9f111317 GIT binary patch literal 60771 zcmcG$by!sI+dYbcgp`0VGzua}N;gO=NOwy&(mf#3jgktI(%s!1(p^J03_bLmJ$^s$ zd*1h4-|KhI_m4ANxUbo>oxS(-?B~AMz1F%3Rg{;;eoFcj2?+`N!+Qy3B&5ejNJz+7 z=%~ORtSxF7uz6wpURe$a$@4W5(w6`vq#Iz@mmMS|m$yhrd!LYy_>+*3K=vsON`k-# zDCVMaqDV;PQQo&ovB3LBPRi0^NF~GMyTBV%BUxz)Bsk(Hy*U^0F^2tnEhi)-oG!%g zqj*LfGT?MbA0$Lo-RBRM(7ffgsZfvUyyz-mFVu~ovtCeb=HhYE>hOe2F1UqKK^&2u z%%PmE5tLBk;8_KY_~l(1Ob!~~mx&$e-jX&_yy$cUhB(O|*`}T?Lp)gDN&M%p^Pn;M zjmw{RU>Z+C9L8E2K`h`q&bh~Zp0tCX;xaZQW1+eMJ3aR;PoF)*172)(1c(iuzrg?8{O`R= zY?=4m2PRUe$NN;Z$J;jo$1vZgUS2el`IeFG$byPJORB;>w-(Q~n9uznf9Q#cEi&X} z%|DWBU~kbnZ{B3}`m@ftX5mBE$p0**5LBy$2Rv}#c9G~P?G3vx0@Sd8)vDT?Z~%&7z7(i}M?m^P}CU9_+)-`;{1!^Xr|mySd?Mq(Way245co zEu!B=g9APDNY*}sx@jpXQQacfMrSp*=r~cqm6dFyQ?)8LtdSXMseMjfxpD=5s24WZ zI4^-AFtYarqhgB$shEqgnVZ?VdnOGc-7Xa9Xf~bm6Ac%J7Yk6P!&hjMgqpdD{**@V z*pBGazfLvurR3+ayl~AJqc~gYO52xP2;=} zoVKfDye-gde++~6ei{nk;PqwuNYMseicYwXpwRlTEV6S?Tr2?fgLWU$Z<>9@H)}|` zljKTieioFbzNlCWzVs#*KGML^ueO;SJin;kXtlH?*_kwEHCk6@v$kTct0NvHNTeME zmzy@W+9+g$YnwHXBS8ZR+_A91M2_`F{}ABSet*H|@*2gOXE_iWNNMlN{(W#U4ryO) z0ri_wza!^EB}T5P1>EG_^$=Y>sqsD4AEo98A}070ZW>M@Jt%yX*=A`qy5!fQ{jLme zW?YN`ovekAep?o=_wBt}itr+aTA^maEu=c1Yd}pedcs_Mvj+XrHE0jd^#uC0d*<2m z=dAvX=<7yWM#|bz!VDT!iXyCqF3CsjGptW%Se=7I%cB~guOkmOTMC8co>g&jDK-}n zTB%m9HGTyyJ`bJYlIy7P5+z+yMcTz;L&2kuDcKlk+NLh~5amT>&yv)USESXncRXS#vekjWJyQH35i$c_ z&E+`w_$r%{DGd#CB40wHJ_O}|xO~TIwa^<`^0fuIsr)WDXmoP2uhy5qSg(uzaO3rs z<@j|_7$G3}ClM)#!7cLrq3yN5G*XQo z5J+dH!y^AYDh+GcjZ^O&JOY0+KEW|LsH`$E1?nN{Dy-phJ;I1_xkC&h5TSlIPxNCG zZF%nST!l2fP z)|0PM^6ePfx(9RVsX{l{p3}ZYMx;Rz{5Y7HLe4hZ-}lcR`>&ZYgC}}$-hb#<42DgZ zcW%T*u^PQ=Jq6-G=Z-_JNt&3lazn~bWnE|4e~vP-|{VdMFpy0Ws;#B5kt-WQf-`zvZ3|Dv2VRF11Q6zK>dh znKrUo-9WD|zk?4UbNWY(k^2m@n)`#_d>t|lnzUT5_7HR9>2LAe(Mu(MA+DdGhu+ZL z`P+gPULQ^Bt9~tYCgyX;B2d=&nvtp=g`CH#g<*Kqhi`P)9v5j;Y}#;6ZaxU6Ev9En z-W(5WM&f>8o#fp4+*$m>=+` zc}RXk4nI5#1(x7WYj(f*-{jS`@^?W<{LMKM|F!uK_wosOk_T^WoQv6>IeZetCzx=z zN1P=L{cx>D91RD}XxGsI2%=vC11T9iwLg7=JLc*1UdEr(-F#4dT%uu{EN1z6YF=Px ze2frSCVQs4yCj+?3vxwE?jT&Mo{si*beH%CRNUitZ+HkeEy|I})VZXKNv8vA42t<5 z0%;*r((6H&-ie6hNBF4Qs_VX&&}U}}`i#HEsoSr0emyZea&^rnpwvv)-4txMaDl`K zZ_=|k#HMt>GF<&ImjLEHM)%R&3O_L}=)1r1^kkM0{LmFWfbkTOKbtAS{)F7d_PvUL zpJD-%9W~9IGC9bop6Az>XL50G0Iv(A@D=*v=f{21Y(T`E%r~$ptdZ8XeM6wBz0==o zVQu|se0xfO$BRiW#%8@#%Bkxe5+fp-#W+!#o+1ke=LPJ;-0r>+wct_v8nzPp0|NA~O(4ZPGG} zey(h0A!m#IuRA-hOueW&ppLk+bEJLTi@Fg?BZJ%vK9YhTI=bF$+n+e{YFFF$?5q-I zWIVd4Vb%AfXyM6Hl%0zjk=F35uP7GNbf+d_ZVvK-rFBgAJcG7wM_H*ARZuKMV0{X8 z{Jx@8gYuKhVWlw$@gRvP+DI)%lVg5w=d-rZPzszR0YW0p4DxNF^!BCQ)lMwUZ2fJ9 zuG^+I3L-O$OfM$*%_(ABE_qVL?BnB)kJe4e*ENtDE5aQIT3^fT_@IM@n3I0&wasdx z*$wd1q0wBs;~h!P4TLB#v?*y#S9BVnW60eJ)QL#IgwY%{FpicQ69P&Np7%tEFwe|s z?=u<-AV)<>RR|dy+makDR68gKUoKwC67yZYDk{bvEtdT-bUTc;&$ARe2xahVlDyT+ zQ=Y?Dp;PZw*?g6y1HE_DQ*~zF<5~(zN_u{Ns6wQ!?x|UEAQj~!1@^&Ta1-)2-IPLv z8`Ux+jx|bRa$Gv;b-|h3Y}1v-ZjEwZb1&6Wt2c>~y{`-(G7H)BFfaD!S4Rwz`_lxf z-2&s!s2nBufrw6>g+EpuOQxF=G1ioy)v#0`^8yFw!#l{bX=>okOG1;`Ru9If7jb3Q zW;vKtn_cg?8bow4&N*Js^kMCDqp~|=X6nhwVK+_GzmjPng*O{G*bkexsy;)<6ZWpC`J@H9Rip|R zj?ksH9}2L|Hq_8!VO3p4{R>aQ-9ARRJR^*c+rAkslc3GZZL9RgxTttaxg|p%sScSL zIK39fs2mzQh>LTsOXO@11`l*(&7-=<@kqy_UJ`Rud}s3S|5K#}I#~}R%TxLzgL)Pa zpz5)fek9H4CGzGC$@M{EiQ{;T>dHfSTd9#*0iA*jiV`Kwz?X+U<>1e@+0nCg&o{fM zNx2HNH|K`oTe>~hn1*#;%^>l=;MU)3^;u;@i1v|=%rjPp@#~LlA*cQ#O||KY#i;keA6u3(XRP<{u8_Qq455v z@NH(wk&*_in;}`EUT&J;=ZSG)-%nTy-IMvby^S=ws4V&?_@G`p{Rw=2ep2sVM9{gH z4wH*)ME{Z5(&z^7tb@N$Z@xR9Q^Xic=>TKvmYD}p`)Pl9CV&w|ok@9W&(qAGj^1u@`NW!}fg>jv&3UFdhkOoz=2OB9|B z+Qe_q^8|OF0r|Mx@JwjvemJ-7lHbif9yEn27^cEXaIt3;b?I8HR|cTRB7e}@n#yK( zC4&&;O{kg(kEFL)K@;W5H9IMgh^RfmVN-%fBCNI{4za`Oj)#$D)!Z?ns=6lpo+h;Q zKG(R|W7*q2HtHQ#2NNcBiR|4Qp;MSP8Yt5~{!Q_|kI2Zt0RgX9fY7?p0APvLTdI=I z>N`?REs~YHau)W*Mh#6m)&%B5J5=O*5G%*Evpeni&C0VPri+dD^>s0>kl`9){yh|O z+0q1#`H(p)nZ{(Jtx4@CHFWaqM@!M7@%+gfLtJZLCzWaCOoY6$P+cpc`6FvOI&>8h zHX?|XMeSO{uAGeq=MyZZ?Lfj5Zcia2g}rXrz;ulHrk7b$p)1&yKyFW^W(lwxTuxMu0ukcAx@VmYhzes+AJq0hMrAY=*X45Dg{cUbjIF zu4r6o2%dvi49>14tmc12rGxnr$?vQqY1CM-eZEKV?hvwy+Q+ z8YwN+SAV`gfJnDMRZwhhlnGRfhaN8w??c*~=`nE?x&}l(5B{(uovz&u%=jC*UQAmw znQ>3w09lx*R{_;{KME~R)tW}Vw6POe9C5_;TF9;S^zU!YP5E~~)iz00#yf%%3Ux+~&u8|L$kndX=F?AWcb(xQ_vltf_t_7>zP( zzY%SNr?96dC;e+K-*oW?Iikq@iy@g(G(eT+li$zk_xCN^ho`@w1tQJ^+$FU*vaS51 z4~PR<1G$a@nO5PSdwdDj9D5FTOoN(*$w_}m-*qUEO|b}XH` zw6=DG?&WnCM=4WXnh+=~&8J?;q8)q+XIV)msjhqigM*z&2IGXchKv09t8JeV{s^ch zgBtblB$n-t5S8A8+@U@ZSlz}_suDvJ&r^5_BTAr0(yg$;wPg4d%ki~nJI0mm6f?@= zUL;VtI(7+dS+Wm(ym;zek{u{4e4v6lKTqmQReE+>m-n^NLZN78YHUp)5}2(#3sg63 zEGqEh3A&lKzL$iPvfUxKz_=+vKq@p3_oK84QRaV%@5 z@%NM6vM`Iqw`bwu61#mc*^>3kC1P5^y$k?vb6S0(OFKI@WXc(7c}2xzsjGI4oek8z z;_od4i;A(1<;{6q%0#kIz+;I)K|yzy$~5A(AAhJKAJNK{!P;m77)G?3FLC74uqBuH zx#@L!usF7LyH1dQDQ5jt+mZ*0?QfR|80XX7o4dCExpbwk{Ka)0Yp+Hu&G=XP4_a59 zYPxmgevYOe+00B#U78!|%e5+oKpNiEpX^G4StxYJnkj|dmPvOa9p+sQ()mh%w&^T&nF zCMNeZNz;YcAp5|V#7%`TJ%JJq2 zZOlSeX6_UIi`n43ogw?h@>^kAlpMpIcettrpE6K{d};fv20oSK=04%kF!oS6<$WCg zVrN(Bv3T5DMzL)#D$4KK0_=5ZxShfNQGEmC6AjE5gn)$2xt@Yq!&)5g`j_Eo};!jZCA zc1^^p0;&az1yfuW-KWwJVN<1?Dv~YMhJ>uN?t##uBEH19^|hGo6A;~Fuvg-@44r4T zuHetDSTF;y5`|AKHJkk`Tm5iP4-yGU%1O!+?X%&iCnKmF zUY^Wa)YM%JkKAF)NY|Cb&87N(@Ykg@5@7o?)$v)|bP8xRv|Py1l-;YN28SEyH9JmM zpGIsB!&t4g9}1~(4y@3~tna;R+neLw$fw|Z6A32>X6;e`)+=^QZ}2!OTZ4wLo=uza z-a9wtZGO~`S=ctXnB02mp{qN0rBvto!lYX;)N}nxcGdkT1 zIye(}^-Aqb$UWx_{*5JeK}@&LAXo)i zS>N`J?I58+=Joh{x2cp{=r|u@vc|s>i;ffo{7A)$H+l{p=-S&E1+&V;bNXp8lSNP} zkx*_9IUa7$h}f+b?rtlU*kJJCQ;?I>?H{UDRi$3g$WwOhRL


                  PAJBm$PJM#y(y2 zRT4Y3X>^HKOr1+BHTX?l&8p|1SJO-PI=dfJh*6^=CPPnBi+%JU`PO&Ol#&P_y|G+|C-hOO)%dbPYWhZo)xFt0Tw-4jQmD(qouIbMfZ}d z_GWu2`qT?S_-1MlFCN-VWYFxVB2RKnk8r4c)p8!HT%q5amF(jgWp$73iO&CO=r82( zAjS)DP~p?R9y*X)VH*t*Oj-&lf>=~ekELNQs)@A#*Lo~_C@YnKx<6f`F8_GApCAHM z+&taqxNKyV8J@bdSnh0iPaaJG3YC)D1S_ZK76#&_slJ1VF7uviczKA$fbiUBKDRJh z_i-rjI=^+$V zz1Xo&;8~g+ugWK{wT`ii> z6yg-9)x=#qtnmse458D^Tf>GawTvH5f;T5ee$|em0p#$hkG3`{_q|Y{i6Q>XBNHKg zEj6_o9o=IFAGd;71_#lyq^M{}Zkob&=DZcH%Uw)z|jwrKp{X5zG_$p#O zbido%hZTjE(!-K66(d^0SzqCIbP#M>oDW{U4B@xOb54V^XQE_7pP7*~o5 zVXqcPopevI-1bw?Z2pCE|KK$p|k&Z$n3g1B2uBzx_)>GO}lth$NeqTt{{BaL!kB zrxFOw>Qy*UKwa^v{eeJZ+}WBKK+3DS6pho;PgQMdjbF4%zxe6|Gve4_T~|f z`H;D?(;#16MC)8R-BVoMiUc+{daL9qsU7QaYIgIK3X2KcH)YP17!H98T zt7{eZ52EVK=g3InsN@zD8Z!NI4?t)pfLFuZp6Z^az#a8H#v4l2Ckx-2k#<(a&+!H0 z0cAs5e&;VhcZfU=k+{;0Y}+8&9;^3f4_?O1*JOoiJ1NcYl9iN#W`|_VsPkve8?mn)<^GD zV6@9y5cU$rqJlA^m1=YEncm!JpF*mtu$=eGLFEqlNnF)Ly1EgYp@ZKyTV^Yk3~F-6 zTNd=0u6i&{Wt01FHwS;5EQ$WD)E;h9_zAuOTX*sd4gP|n2m zhFO{_o>4n5Epe(r4z{un3fu=ZbarVwd%yJv$Esn4{E9TRv-fzaDr>~`UlR2FggKzGxbiFct zQtN*4fo@Cw&BkK zM89VWlrVdk#+Ykr3#0-tls*ZEukOtCS*>%tB9d;OW!Xw z^|cgs;g@g53Tr_9cyUH_@2-cs|I%O3sVYA^+wa2vO6R}40M`(AQR&!|2M`ks&+Akw z6kfi0qbD!-hNXe_p9yA-$J=D}s;TZQ8>3s%y;PW;Bkmg~;o(skx+)0r9@@Z|`u6Rc z-_MKMws{#U1!I*@g@SglX>NOPdrV523uE#d(R-A|fzoe>!P2k#$BvhD<_oqRKoZ4G z1^W6Q;j1HIFxY(C8IRzS6^F+vC@*p{JbnrrKG1KPe;CjH; zZ|{OD^0N*w2A*V=t#Sg4kDcsPXbM8=$GZi$OT*BI;GCS{yJYY`&!ga%*T8C&IERdH zyhH$7U_ud#1F$q8EDZm>`Oo&U+VuDD9s@+sN=$%Jxk!c~Mo6UWn@R4@4uTU-?m#FJ z@Wq+%n9Jm*6KWe6U^cjENe*XQK3t7T_(N{6bItQvIt$PN%4)d3WHsZt+Spu39l(Z{ zaLW%sB3H{H0rBw&jk}EwSx~9DfEEF8^aScxvsz3si(6NXlI5J2yru0Fxc9$||xarFwnf3{x+~3Hn@645FjR^)bb6T%`2~X@ScZ1Wo*el4% z_2Sc}Q=Q@jWMmMbUclY~;jhmA4S8@BYR8{$lnHYKv0PV{Jne44IfAwhlsGS$1Ru$f z34EFyeL6Zl-BrE+tVOO2-i~5df9zr&H*v8mS_#s)V!iJ2Wi9 zgb|jBuI4J6H4vKF%%608WbU9@KF$IpmB6y2??8q4*6ulgrFA1nJnx(3i{< z10NLLwET5O=*Jpqtg}3>NKP)l@qxEX$A2LY8xbjvD4|#yZG;=@w%|W9Hl`pklaq5^ z*|Nf-*?c$xKO*Kmpa*O$-B)aCWdPsyF~w27#%T(M(c|l(9A1F`g(m(9~ zl0o9`uKK{0o}C@)3Ox{&LVX5G%uIQvt9m2y)k-EEM2C4Fmv(O_*?%cv0Ek?w(^~y+ zp>7;9eD&^3ogNe10!s5sA8Yb69#ugT=C&ThqgVCEH?%B9I&?AS88RVVU8dp^-X=0pGsiwA^GiEFPKJy1f*Bsa6BYxYhSyAFEZ+ieuDy4Ds>hk`~F7 zFrP1ywODLRg;FA(_?bM-h`NzfH?5$pLE+WWv9UHl2kPIfh4!qBe(ODM9n)a}4I5zf z1~J3foUG(%%aYU8<*d&S^|qifz9@i1FLuk#a{5qPx!3nX*xbzQO=NTPOCVEY0mReU zFUv}nOj$G@ERvm<(D3niK-lZSZl%}M+U+-8_TtZ@YBg;X8P-D=_n>_~lHx=%(Ne@B zJr_7kq5Ca0_2t5II^r}edU(+v_QLo!s^WkfUS2*@kh`GS#}YrkdycfUxVYCa4b9pU zO2L7|wyu%FzFR;?GrG@d+UU_!1Q+A0%CUF-OVB^6AeX?AG^K_va|iRSNlu zKZy79d~4p$s07=u-bB84r^4<4DB`@t-F?e`JewCBb=GFrA3KLsLHYS4r{-)O`dL3+ zY96?_xK;{n&c@b7XIu8Ql2LEwL!uS@LPJ@ov%WtSBwBkVl^yVd5}-dPd)JS@y^AZU zV_8^_{XXsheNaL0XTt4Dw$Wj{ySzT^#JO<*CT0`u9RFpD_KVK@!#Ynqn+fs0_{Vm~3 zL3XxiZXq^PqYK^JJMT41K~E;BT`ii0#9Ks)MW72zH@sZ+CtniR&4c(AAY zvC%MOKt6pYUtSWOUPB~}v3->yt3}B#CF)a8p-pb@^wW3M7KlPWSYGXJlkN4Q2!_SF zEY|NXE)xRms`7|Gi&SRqp?8eAFHj=g-O6cw&vIO`e~~IdB*?H_5=lVBQqQve4b(Lm z2k@vS{Sg*t!_DTlVG8&Xc_m7Jp8g>fSZnqPHg(s)G3&*z0vsj{0-3TdfEg#Gz<7WInH7LsVDvzVqFd=3OC| zr6Sx?vD^YDC!<-K7fvcRdNWV&Q7PIZ05BDd+zn1g~S35P7rTdrJmmczmt{iImHTgF1v4Lz>gB9(z&vN z`UBa3D}+upE@n`(yJPX&&gpQ#j9BRC`GCd(k^mXTf~DpyADqG;9~BrF5%+#V_Mgietse( zTQ;hQP&T)lF{G(*U+4K||+n^Ga;UAEl&F$q%qGy^GL0f#kmO$vmkzM~D>= zT;0i^({(nYcd?46kcU_jQ&3L}^sG(17hH{ABB+4*&_62bH92|2#@(q=st4k1nRoVG_gsJ_iD)=Kd?21_;~u~S zO66NpL+~EVY4sbyzb=_L#;CehGkKgK^rxX35Rjps_pXwSE(0#kKUY8qOi^bCRS5zR zE*mr-;SAIzpUOrf&QEW^6z}mT=VO7NJ{5UDaxbZ-&OVJ6#xdYwN&LSBGznr7E932) zX~5ecA!fuNJ^wF3ubIBGdNnW)F>vQ=VXBdhb?+zOhD?tsy9vYnZvol{u=@dOn5uJy z4NMJxfyoCK0F_sNy^svlPd&Q8vuN+g)l0a)LW;!!1&k1SVeh+IHd{A^^ZWO2aSa7b z4f)nHDe^YJ;&*Zn#7^Ir+*b>QHR|Gm!e(>sW8N zw|PpB1g?l7L#@=l(;88R`QKk#j7{PJ>!igV`~JHr&+*i`lf4U9`%3h{dfVzd03C$_ zs^l41AE3{)UFMl<2LT%axd_Q)0LQy~#wm*Ac-*!gFY)N-sg8Yx3L@qO&RwTd_c(Vn zFM|tk4t6G;*S)7VZ$r*-(-)!9;68=*EWgT{REV zdMke+3aq3Q?DbWA4Ud#Gy8CROhV2bDh(+?#0Vwxma6o6auHlKZ^HX^!M@vgc^TI-g znM>giBoDtuGK4jRm+h)df#gE>e9))fk0GA9@`+pda!*eTl>hJ53D;rz**kscEE7#d z$B}PazK^bW0t37_-3f;e?-fSc8kb}<0C;4g)zec9`<9dx1gHvtILNHc>GA~{Nq+}e z_}q@V)8*wDy@eZ|B1{&)s~V*+Zm7{q0M`>x`w(+gWs+CJ?M~EEgs5^-P>79(`ecA2 z^y8%fz@t@JZ$`xXF89P2;#okZX%}3VnkXUxgXud!7+sY8k?9L@Jnc|oYha!ibbF~= z!{@4M$_LIu-=z@|2)%|(N&<>s-U43MA1Yr>d9cC3_DCzF>rxNb@U!_BOM_|Enc7~u z-$rBO`;N}@<6^j-@rO!J%ubph8jzm$&S*oE-~IqA>vVs<1|+nr<%o_^ztq!~(9jZ3 z=O!0Sx(MR6P*i5uPs<&QNyl1h^>?dTnoQb`6p5w6qEj+N0}cgDwQ}bmqEvccku?+v zL197a4|d^Y@KIx};pgds@ay}r$;o%06r1i~?|y5QFpCyJ4?WHK>tWY zy!o)TxS_ae9Tz~wo5TsRY0Bstr9w(I%wl{PZx!YF?K+?d=(jZk%mGkMV8T4Do5x9E zy?ze#yO%aqu01n}8}EzIFOYBIJ2yx`We$U2t!YEE0%T-l=DK>)&ZdA8tV7$zqaY1i zYk*4mIj%0a4DZvaApl&a`S8XsW`}?k6QkJBFqHkA$FfodwHJ^K#k-#pSxmcvGL6~y ztF~E=MFE+jV{8l^C>9KZ9KV*Wmj*lj+9}Myw>vz<9&6OFd`0i4?fv-0yiGw>Mse|* zg`yS9s2mw8HU$;Hq*YhM16|@UPa;|DsK7v>w zogm}FbS(n3Dqr(x!BD)QNa0X`u-B^UKnY?6FBAtN8W?86?u#6}ZJ7jWr zy3-bEJ4r8tD(5&Yt1;~WX>qS>Z&W1;oXpZ_%3E8_786~r^0@v=C?uxYxt{gzKF#dX zZ3WNsobQYEjMGu{@t<0a4LYWto(9KDa?DK=iK;9sjXRt!s7w;yHak#wQy>grGf{S@ zv6xfPPQVL?Md_f6aalVm%GW+VL1+lqYtaEh+)nZ3Q>jJkwLS+SlCG{kSgNh=VQ!ATP&{om$K_`0532blp^CJV7l*(2Jnv6pvWWSrsD<5G&wMTl)Ze=4 zz7elX&&>^`@e)W6&@y{ZbjZul?iGeF6?o%fiy-pIPkosD8_MiVIb6Wiv)m5*v%^my zK2REIs0h5OLU*R5x)Q4*Qw}hkeM~(r`XdME`bu_66Smg2NP0_mBVg1^*5G;o3a2gU zemrjf(s{Z~kSq4ADCNt+(zJSz-PmP&ryl?SA2qnJ@C}L{OZKEE)Oy3^Tp!OP@EiJHSvT=LDqAq zV|bB-htz(8{GQVMR}<`x*FEzg1E%v*K-E}fxfvkh`)4jE53B%`_<*)&G1+#M9sPY) zgzd(6?Ne`x^s$i{iM&4D6NR+b#y16kD08v70&hsTS;n~U9j^0Ui?sglot;l1 zR%%Rarae!z%rc+08a1>pIv=fsK@)Yw?caapSGAkB<| zB<<*~Ij8b|4q^=~90Yec5SsF?8R^E0FZ)$+H@}Ui&tMec>x)F+2MC8Zw{GIi#f)+5 zkeYZ7$TwiBBs|=+At?-IdEODPy=et}(9F)3}Lia(IZkytspA@xzSXqZM5emFF_yTxn(O zH>@SCNJ@RY)zwhImB7;kGmBabZvfj)q-~A>rj(7`XLPu3$_f+o9VfF&YKpCMuJxsB zvIz$VSmmF+7R2tCe9uMs_(~h|7D|=p9w*OK4b}MkIBnb;cVgvcq+>a8$fwsDf6kaN zxgvm&8tHLK|2OjbR-Hw`aI| zx-|WxPa&ZA|A*HO*XVyYXLZ3)$X5-4i^!~1GW2~Ei+-r$uDMIt|LHGf3G`r1)*0$? z+9@UidRQQ=JeJqmQW_sucCD$%V+uIAK{E8gQYxy&WTQ4)LDr7QpZ~MOu4W zizHG(^XSp<14gFMKc+fR{t~DY6Q`*>{Ncp99;Sdo`J`ua4*olTyWF)?Z%zY1Vs*YE zsK&2T+ONY6_mF&`K2-$K4(=7d*(o$Nuob2GcTuLuIvcxbg73=oyZq3v>Cat4z=7oDxFNVX$!|t!2 zn-puRel!`hq>w-;5TOj~sB|Qs7$ zx^})Q4^Xx+)JIhZn=pf5baU9duguMB?qak-1(07(_0+Dfg10{oq;4FXvLk!k()5FNRCX) zJrzHGNJX~XREA!6yFSJ)_CYzos9sd0ueg)*5xx3s6xZ@W9L*(fBzmNpZf`qu;fGU( zFZ5R28LF&IF`owcD+72sJ-@|s!wb?&i8#}xBK?U@BTkX@V+*Sm@O+`;{LvR-v4YUa z2}EZPeqQksqW_LnCWIl?^DO~EFX1`#U?@SE>eApt1SdAd16k8O&$$6iAp-nyM?Hh~PI7=YJQgO3 zGhTWLZL9ea%qs8z~x;c`GQH1ZNbqY)BeuHz9nln6YBM#0I;bU z`UyXOmbARBd7)ojT<)asrD*-Hrh*EiKKvzbSN3*BytQ3=@d>BscT!HJ_gqSUId_hYIe1qlgBo|Z2r;M4%5 zn#m<|k!L_y{nuKx6+iGN721mLNauXqCBBnmLz=UTJt^HpCkG1mHoMQGDdrnK z?RKE@y1m2#D8Rt-a&Bjrsxlw7Gn+%VgBI2Wu+oI@NNwVQHGCM5iEVW?+IzGOqVB>m zO}GCPbZUqIb2COJkrlI$T(Fq)G4-t!MrT&|;&9kIN+4SfR~T7lBpNpp#}k3F_Vz3W zFr_hdoIi#MTJ{yf??T3Ia?AU#^(}Np&m{k}cwjW^vUV{K;8yvT>yQ&O6C8RdeFWuTP*j=ukD;n2tEVguDnDyZyjSsGrfM6*tsJ+ zkWBJs$NmGUEz>AqLKI)AJpS9GyPIC-yZQ$lp!n-pUPgDZ(l$Ou!i{s_iH|-3Z0R1D z;1xHHr>Lmf78Bzn1ifl1z7xm)xkaN_?*CVd#>q28Hl|Xbj!nTzQ4WS54TwKM3bjD!U8?~Y_`C$t=~hK zhA#LtVz3haL1o1FFsQMjG>nkR9`1wH^O4v84AeRK=x+JmVs2#iTl~ho|8n$L!x`n3 z{y~(o-D`ToobY}F)y_Fg!z;^fY?lS|k>J&JpUoAuL8<1C1_rVZ$q5O5@-sIyJY0m#Xt_3*k>7?in_g93HLSd>k!+dmk_bBrMOQ{WrbItnjp#HIii-^5beW2Wt?(xcriyULVyBucsUE&{dIx zRn?aV3${(G?Iwh-ZX{Q40*`>wPYE{9s0{qAfq(s7fF+>KVG&k@jPpM{Ba-40s$I?1 zTu0`^K^eA;=6t7aGOdXg1P?e5VG###8v9Ewe#1G3cTx4>1zp<^ zpaqjVLw{&Bps18w~E3S^Y^WS=Rtd@=kWZImrN(veIXM7bEO0fC3%5 zny4tzBWzQX$dAk;b94HGg^?K`b*IF#YZi8Ct7{T@&^IFAAKfHS<sBd$C2vBL_5D=8G$n=ZRn9;- zuZv5i?-emcES5^_fuH_l4bU(D1dQfx40La0du*EMDS%t` ztU-5Gd44x7^jWw66Qz7lBj1{Kb9TlzK#`E>#>(~gmVZP0DjZXsAYSqIu%l43wj!_y zlaOXBExLrs+AM9RAu#q-T3-WW&~!si*Wxv$h?xW}?NIW7QmZysk!c7K(7?U2VWGQH zW1~HRz%oVvlX2a9Jyid;UU%pV&`&{2G7mV-yVssvlsUN}0ljMR&wP}=6I38$b zjXNsY!H(lB%dyQ~2`puB{_3JtC+5e7tD$oV;RJ!}bpB@)av(6|%$Gr-Laob%jg-}0 zuO47|4;BetK!63K>J8{Ye0U1@hL#z)@L+{adarx4g^J=*z5Q-spXHYQmr@Zzk3i-G zTHBrw5!BR8jzP7LaWPbcYR49u(|AH0973D8Ze~a)%_OwQ{V)+-l~Omyw_OvtZ|X9N z3iYShM_ha41^t1x!#b~Gpox*t8tUxWIrNz&6S6{cb#jY(I>DqwT?3v$-UQ=EhNfw> z=NS^dbv*cRFgvL&B(#x9RXX^ISw18!H#_^=;Y8tGNVpK$WMyJnQ1MN6{(%7&Is#h} z5qSb~5ADqM6V&cO?VFrP3ZOIV5yh_|*zy1HF)^uM8UsG2)5o4CmIlho{D6xii`?HC z>%btD^%+8l<5`%pR@l%T21?8RZwx2Bpc&T8D( z0E}6gGsSSc?n;OqX-*MxbBi}&wcaUg>L@7h-9$wgpJFb+76107)M3}FedfSvQro z16xv_4q>}iz!gA_65k2sR^$nQoZimB2Aa^%vsyOGj)Sd<*)E?0&L3t4tghbeOe{KX zZbET1kB!D=BbHqteP!A*(s{7`yyDdZOyyQk$>M{&5e1{Jn5T{+K<~k(_ek+ifr0HX zR@WcAB@91n7qSJ9o)dv}qFIp`YPu#1bY`mK{B(8SvB-Ne|6hc?byQSs+c$iPg3_V_ z(o&+Nh;&Jp(%pziw=@g_0xFGCB01y`LwBdNba!_R%`o3NUibYx-}kL|t#|%#xn@B3 z?7h$PIF4U!w&c;+kh2p6-0I!Z`shk~PL06Nt+U2%!KB$0Hr`sE%Kl24X<03zH@NJJEu`0%HJ7SQR(fuHeGrCdH-PV^vK^$rPSU~oMRl<5gH)6 zf(vYVU~;k^cZs;x`n(Is(;^4EdK=%=@#{HC8UjR6z?Bt0SLnSxBZvx{j00T1OEo+_ zF1Jk4Fy8aX!F=^jDoIUUElq`d5y^aqg=H=rQg{B_8`a+%^;)k|%QeU zGka0;&wS5ckgVp}eTo?>oM10T(p802ue9S4zq3*R93mM>8&95p?UR<)!aiHHrTk5j z$1OFc(FH-jZ`_AJ2W+h*iB;t3KDc^nNE-LEy=uI7hzjxL3S4gV5dk(ksz3uKPL1lf z2|^}#K!|Q&Ll7NLEUka8^G9YqooDoqvYxPB=)IAIQkfN`5GNhG-4cIw-^=ebj)MlW z+Wyy%uP>aaM+H=_ZnDNplv0F^s@at58?p{@F^t{0yW*SJqurBj?e?BAw^4gDw&JFX_Dh$jlg(0<*yHq4;&%`9Jdg zC`I&m4lwOI-aN4AUt-dXdU%1ez8sZ*9e~477fO zXcf38QM8SED%y>k$-lJz)t@)lfBE_9r0zPM;gIn!yN>?#KVQ{o`8)*f0H4NE^IrfC z@bOmHTIQS(n;7rLzNo(-S~F6#4Cs6O{g*i3e_|rU8nh-!iDWi+W`47j_^q9n2}J=~ zoT#5a`;7oc4;padCBo7i+Z3T<0R+PR{Hq}*D!BNu$l4v|@ww0P-{9py&jiY4i@_~zz?q!Y}Z~L+d#cXPu#CLS{uPIZy?#3k+TnG z&u`(gDYnx!VQ2TrVtPrj0n{W&EUBmWuz|D|y#cwu_+ogAQ%`L-NDqio!^#_ZJI786 z1`9$c)_NO{;4ipc=4|X9Z(98X8^?y+){sSfnFmKQol9qlD~dwhc=x zEDo+9B5_^=)o1y?4(s+k=FZv}OitnE<@@Vm$4@aGju2EMg^S@htH)dG!V*_L-=(Ra z84P_Dd_<(eegxpt`C;}{+O%RN+e=jiCjNYWIVT&&@l#72oN$fjx4(YPof+QDe4@lS zSArCn+fv(#a`dq2J=wGjjtF`;rY~A%wV3O_6)s$v^N&vG^;Qwi%)D=9K2K7#uGm5< zPGtLj2s=o7nzhiLznwJY)#^6>mQvVt+Ct=()?S)RXV^29ULu0iO*bTzl z7SgUp_;|IfNk_$b>s8r)ydV9)}lGSeta~x4SJrd{Z7E|pUMusdu*f+l<8-zeZl}@d^Vp$tM zyHMOdJR4eLZZd3m`HzpMupx7IdM0V{>soE2x<}Yc(> zN{M76HcH=OVyWVu7uje3YRf7ZAN9&DU{UE6yE0T!&s&P#-8_R>->tZs8yRbt);qO2 z7prxEpF#&a&!HpqR_Sv3fSyv6GvwE zI7DQxdf|q@C@HtvzLzUoP>Qc`NE5}Nm1xT4Fxj2+6ZLgETJ9x3V zWfDx)EoFANY-&ql&eSZQOr1O{+bX*CumKjeS6py>m45tedpT5Yd3X;;mO1RsI-Q7! z)M(ok)ovE%1ka^-6>C7@SUpNF^I(_PvXO1aGMM*rUwxl~m-Qc9XSI(OdfG;M4JhMZ zkOtL-qLP;qS7V0HjMxi;>QhWDf56J#;2uCnT@$(2^IdOPyQtw{Fs{m0vKx&ZW`E}- zD6pd_1XgCaz*|kzqc&Yw$F}2V8HR-dH@C$TErq5w2Cqi4%gtNB;Qe-17p_f9BQ9ZD z>~JXMa(Hd_A;7#rxIc+7IGDtt@%V#fxrm_K-88eSlk@q=Z|6J9-*j%~21F_KD(9Ot zP+BIowprw`S^S7#5be}253y~4*I%aoIX*nNt=lxOPgA9kw&sW{B{}e|zCKW3ueJ4| zI*y!l#+Z(b)#56j+?zLIuU|7PEqzxhZJw8&hpY7%XyC|tD#XYaN-t*w>CKGx8}v=* zce3;ebKy?~j>MX)-)|&$CmiII%bB++A3U(qFu;#RHTS8?+*PohOt}s>ZpQFX7n2+c zTA?g;=)&BYol6!31?2WwC^5@gs#U<}I|uL+RzJ-oo>V(qw;#-lIYIV={(~1G>^ahg zY(I%xy!OvGIDQHoqxj%ADEZk-Zn6F3_E9O%EyVD>8sgi|yFRm17n}>bLtB;EW#X;9 z)et_%B3yYArNoHJxTJ1=?i~+WRa{7CxG0SJCqpC6jhxizAN4zi5gid+ip%G@f;s9U z96=CeF(b97erE_B$bqOE>BW&QRAxM#`JVek9p?I|?M_9(kkwJ0&@N(H!fN31gslLF z>tuUHYg%$g)Lo%=B3Z4nhGL{Af;OP1b!h0(cL-muUA;nI{T&XtD@PEE7IcJ<(>z%e zrs+D0!=go_L-UYr3mf}wUfPvcpTNE-K~joOC9dDB`~_Rk!jd}jy>F&;4 zae#nYMv~0V4qN$h(;f5hk6sz$Oq)^CL2|U(Zr&8pi}Ol3fl7^hpV!{vZbhsjaxh#Z z-(hVV=i<;X5xDr-CYw8di*?SO$#ixp7YnnpyL6@n6`#GDr?cLW%57v6L*LSdaRrr@ zvL`cOCv|vuceU6?>YolJfy3YXN443bCB&yCTKvCwrZA8CliXMOtX&$TbclL?EeAgz z9(EELx5ZKSv-TuqZvE%jm!80iRL>cJ^>~dOLJ>NR=Xr~j;!A&u+I1g|`Hu~zXsOJ5 zWCHuxl@L2SS(siy>ncms#&9h|T^UC62$?x`!ob8~=fN@jW=ddvz`;xQJ{^B~^bo!4 zPTkk>`BM#UvsTgE&%#%Bxl@N_w#HEQ>yn!X#*#AG!~!4r%S2J01XNx&if%ss{-!U? zrsPfxttK=7&^P<)isWO8i@#HEex0oVx79US-(s_ziQE_2Ep%= zr}OYvai$ekW~8B)TVI%2zX-Z5YqU$b@(JoJ&Rl%K>r|-uwNgwGEsw!3Lx4J>!GpvN z#66+wE^u;zzibcT&q-DC7CwCTL9qai;RzgSJW(ij8G zF-MC>qtEnfU6n=^73Mp({HY(^hKsxEu=j-0Y;9TpVIW1Mo?bQI?#`Lo9)mwp-5+NE zy|<-VIb&_A+`H?ToWHxds)+KtI5$z>%dr$ zfV1sY`#YtP#EMrp&~koUW%@Pw@TRKnkagA7@Q)gc@yo#zkE(+oOcDILm58DFvAB~V zeh3|&Ohn*PNBbO%$LPp9!qTsoqcN#9o&yHk_kL9+BuxO%Cw#`>o4jGUHCFxX-MjCc z7QYSaxGXAR-6jV6zxo@j?(6xLV18{X0?@-e^Pkm&T_Ed7CU!Oc8hT`hf$3$y>KFJ@CM z;+>1zo2h}vS*OTDy@z#&;jFE6F*x)+2Ny-%7IPWKu|2581*a){H!Dng7H2La~X0kcZIT$TG1FTsFueud*GM(~C zm?LFUrk>)H3EV+L*h45Rn?`S*^cA=8+QHCe52T!>``4acUZAaA)wIWl^m9beg{Aw_xELU$-E z^HH*k$YX6y;;GDO8G~e0`>-%#`EJ8^aTUtVg(G$ahGXLM4_lTa|EZi$%se4gl2eG%wNt6hO5Ac~J2HG1WKb#G+qTgC zl)rrF3nFoFl=@PlR=BvIMhP$~a zHeOjWh}ktLj(K^5#h;9g-38-}x4RT{#oX-dvRzD<+9_Y~2!_o*IQkQFl8C{%1@yt} zaMp2q+yS!HPI z%=OO91wGK)Di-EC#<7#Fnwgpgz06GFEHWain;wu6g=}R^F&k+(iDZ(<4_T~m&J9(T z(B_s?=O7F1zH2x*6t(?I*;?)yV1}M0HpCw-KR=<`bP=~x!mT!|ca>78LmfiguUN$( zycDAkLxq~&Bi1!a_3f}#MK5yFc^XH5Z`)+zU=6ul#&Q>^RD_mp4V6e;;WLLxc_u|- zl?3&$9vdO7P0Kb*uzl{HziUR4b8Hex8%77wg^8@XMTfxhsAz=Kndh!7IKG{;j@d_m zBAF{R_lu!&_AcRM@Sra3T2iGvv|LP?-R&94_0Z$``KfTaIRY5r^|%pRp%T%PbQ!tn z`yNf-e^EH$$~k)dGIU4hBSsBRhC<87bD~;<->n?bDw+AY_(W5z z;-gWV8bg?DP2i84w6mmP^yf!L?c8g5Z@= zw^tZ)?mIoPtx`#*OXmHuA@%;Ij_sheI)TiC?;!TqL4NX`XSZq#;%2|w$`;&TOlr30 zqBygkoYc)3A7(xl`{ zy(RVc$E&#<=5J}14-YT*ynQ{uB8qY-+pob^8I*%jj4!RmrlY1s9`j^i@B-C5lF9F? z|B8c-?xk{8*+cf^y=Hu1(^U!$Q$ve?Ks)}BXs~r@DcW)QLoZjNk*o!4p?-+Cjm=A5 zfY;o11Gj6(9J2CHS)XVA`IS>mYh1w#YW7?Ccqs?SuQFMq`MaL__@S3tJzVY^hTJ|L zKHQ7iHS_!*`5yI6V%6$QU`L*|8bV!vmFSS}$lDN3| zx528U+JO61NeFnXd0P>)gHxF#KaDw9N9(zTSF0>%2VLuT!-6#6TmI4~xH)Gf$-_Xj zfO6-hoSnwD)g$hps8@IbFC})Pq)T6qnBA=)ra#Yo)~*8*Xn0SO^r zi<-x(@aSD!d5^6{YK?Sr+sE(7H|nS3=O?D#^9aqNqWb=s#{8G28@9fI&B0AmNsj9C z6mnkcLQyMCw`N$mmg9o*J@OHjR5l6B_=E)G8yeF4WC@>&mxrxR!Hy0cGRYVx=QNwL zj89B}>AHJ);o_0$6O3a(%jZRMN_CFRKTX+nbv*~{)MHOqHdv7TBt!zqA$BuH#j9NZ zjpgSn=BA`DkSN(k?ndWHEBjj5#xw6z&V7d+kNa zxJ#wh^Ue3Y1tZz1Bu~4*f`UNiAH7NI5!H#WdIQuQGTV|G)K?YNG zWBH9)9ktau^iqj_p)Bf83W|ULT84<42tF5)@=+gm3we-C0s^#q?wWQ|Y53LQ%v2h5 zeronQXlA-{ymF=73+i-cqNlrzSp6901-;@(&lXF5*t948+@LSOS$I zIR3!fmY&(+chSN~`Uk3@qM^s;=e0WJYkA8O<5v=E=`RQhY-V0@bkeQw1%}$83Jtw# zN)1U)4^k|}E>dsIM$FBbSTq7STz9d>CzANyTs4GW>Q`3O;{0ShAM^1&E%UUP%#ZZ+ zJ(&{L_=oJEB7!GB6=&%R!5p>ct@n!UbChXBhM?il=Y~-nfowuIspcy&WI^ON?UL*0 zhB5Rs(VNnvCO|Y8LRl5D^dU2wA;wS8Oj=dev%dN^C`lS(`cw@=ncQ@y@^s!9T{Qr(k`!0%DhAt-%ct&Bbo648pNq41KcSY0-BZr1^&NZH6%9| z`>9fX%wAR5KeKm@ymjS7SwIDthE~0vX|{s+^n{%Uo0w&# z=VJmT6`Mv}TZ{I#+udjGF9iI4tmshNcz^a2w{%v(( zSY^=*werOXi9JefodmPIC|l2rF~gb+)*Z{vV=RCpc7WX?-TbwxN{Q8P-JI0jhi|Xu zdFWia%nRzzK`HCrorw511|L)n^b5VAgBK#&{khXj=6bNlJ#WqB|7rnn`=%W{0x<%4fB)FVC^Vj@;N_O%Du6A0S&hh2QINxQf{oGo$K+#Y z$|;$LI{THbIcL!WH5=n))J%rML721OxPQha=HZi|VtEXc!})wFXl`^}$eNou4-jP% z0W}xp7o?qDG`oEc9-W~%u;ibz95kD}qPsd;k^{$(x)cgOP((!|E(zztkar~jOvbI; z(W!%3)W{|jvB@=%Q#f^F=uB)+F!A-!)Y^DzrRK}Mh|URYnZcq}@}2p?TcA*Az;T(B z0!>!5f(O%VO^_1G4HtWSioft$PZ9^o`hD9rTDLftUc#Nsj+c&BW$~yW$|rI8xJ|d& zWpXaOuf?W@i7PMWUiT1CEV`AkeDj>nE1Z&sXp#koe|~p5Q+jFH109&()59spOD=gv z=tVRXA_cbT`@~6~9ie%xJw1xV`X71^Tf0ZKMi3vTK2Cmq{?Iz@y`#)Y^~dKj)KnbL zH@Q-fYXF_%bnsm}rKt;K^fmOKkFq;p{V`@5fY?#a3rh5y_%hPr`||n|&eZ&_8*1}w z;BJwPn3{TS?E~kvi)EWDFRP5ZocVXB&!J*A){#iDMc(eM)si1xyXg*R&XIpxHl zp)i#SFUo~QH(fo`jL+ejBwNVA?-UuMR(6z90)$*ljFZ_R&R9RFy`4$)WdzRZ(Uz~d z#pbtvPWVo^WNNl*Q@(rf0`zojwrHD=OYNb0?utJw#=u>@u5KlkAa80@3f(S&UMuAx zNcM#>J>2qlm3UBfnL^k(+Vre$sy_ZOh?7^UQcwX-lA9g57dslymK(lHh%Xr@c4CAR zL||27;!e=_L+WxvzPsfONIFSEkTWdH?;Ky zvT)|*2Ekh_ENb3-Ijkb*?lkQB-$qb&Q~6xXMbs0Gz4XIBWa5;PwQ)&EbY%VvO_Ul^ z5h8X`#y5_RU60QfsR1?@=vq)egq-b5eH@zdkur>e>b|l4&@+VWAm~Hu|IF0YN)~=3SzZ^L^5p{qA0Z3wa!Q zu>DX|QdFa@deSwxS$DW6_pVmtmt_&Uw%t!Sp2rQNr;-d^isi2;3@0dI*Tsd-+3QnCowZ) zvvb}xW&O<#Mc&$qJ_m-+g{32$Z^~qwt~10+KhB@q*En2PHvUcO zLB&1?oj3aR|E(EqP5%<7=;`GD_33|xrT^cjoc|3r+2aVX9*0K8$Nz*5*FosXv9X`e zRG~`{Sn;B>M)N_YOm?C#y|=>?H%``0nSQR-gpD7peKOeck(Xy)Lpk0$JnR4uy-~%< z>JtbEVjE9)ug=^;5kU#*4?N4rjjG3tsvh4@fNtw%cUk=sa1Qno0>?J!+{Y*`%xub(JY1)e(teu@%UtIGD7YRdi z7Vf#}9)gqYwN8ToaYK z!+ghqEbbn?7J6UZCk+b`xaS`};+NSkXNu5VGu@F14}^W1Q4Yxp96<@!JPK53C{riP zErx3{Zh!IsNU5$^vz(}phg^5xiY3!wv)AguWgg>56?2UKg1&;l4i-+13sbs9IZ_b0!Nk(Avf5*w~bAJVNP*uNtP(8CDPuC|Qs=KE^yQO3EBXFVWKYd`Hx%qp|J;nAo94+~NVtGY8DP7o_C-2GlgU;m}Q#Jk0zkq@oYWat0((@=2I zHq6>6&&;3H7t#d25{Mc94nmI9kd2~yeCX2aDZ<(LcT3ygZz4Z4-!W9D3yKi>%r++;s$t3%a=h^4nQ)O0k{c8C1zHeps(x~KQFtX zY%Ry@>X-j0Xx%YB_*0*wKZsfH`Di`puNm?Ur^XuD_J}jfoJZ*^o&rzITjrjyhS}+l zbHDNb2A1Q^IENg3xdZq;+_&V!$|=XS)5a}Y+ztS-*b8EExc%>beKyn7JcofPbhNO~ zt%YbkrNQ&lqOE0u-2c0u*HgwX->@pkWj)nCS1_%cv%edQav>uj$pYDP%|n=PNB*8O zbiX1Q;CbOV2?s{ohHR0zXKPJi;{V>_&h)tk=1qSGj0j>0r-$#^pYf4!7R&Jq^eyNW zgNOZiZuR)A>OOk#K=oXP0euB-#jhS9$h-1PkW-Q4%jfUU#Xvl6s=AyEbn#}rbr3q> z3IMyuy}i^Ngx4#%f*Z(F0>q|}Ak?~gOFkeX}SN9La zJe9N45{c1nc4;JRK15#K?|2T`oCEFiI%kS8F^Q@W0;Ry>SR@R})S{ebV~B@L6~ZC; z4egMcQ)ole*n(bnJ&twL^s>_dP=KP}KEF!GMWcrR)f+V*@UH+W7K!>e6XYCg;8d6< z)bCVp_CO+70`Sz0Q#>#G()P7J#l$>+igZvt(L6?usKHX)vD@JKVg8v?x@5axK*+Ua zC_f~GM|}N?EiS%1a;6FQDypxrQJOY1>*1q+#wUGcIOU{(Ge|f*khAITF|~;FGdr19 z$+9=I{1$R6O1qL%nZiC~kRAr}e~eyD!eaWrrb!R_XWc_ldt$q1hy?RLyX6JHvoSw` zp2B1!`>t~R9PqKozm6zuFLF8|zRvNH`TV&p_qFEAFowCavzq%#rJtLLAn`N%3Cb_z zqce!+ELw9W1?1HtJz=h~c2=WBmsG()Bo7j(Oe`ke;p15Ooo)=|H8nSjXO1y2Wy5BU zo)(NRUI#iLHVsr0vu{JrHxcy5WTKl@ID5mm8!ilQv%TWdwTsUEFYC7JEu9hGkjxrQ2R+PgIVjfDe!jf?`Dww}Vu_~g{RjDOyY={SWlirr) zJo?B2^xn47B@|cR-J3M{+UU5>rPE~uwis?A!JIRo+6pC70%F>r7wE`P6&3g5O4a88)ZrUv*{CFTQI~DSxDF0tT?{h@bz1C6dv->o0pFK(` zVB}jQZ*iBPVrF4kf@YVN8h{13fKI^`687jUanHyVH7W1 zkjz7)#ERs4opKaC_fQ9aT&5z<&Sz-eFi^Sn!_;Z?DVBiw_1?Sv8@+ot8wGoIzg;6K zFZdgi+d-)sb(^En#xiZpcWr!a5w ze9jrxv0}AV&P)VA-LbvSa&bxDNj(-3M}D+(`oy$KB%EM!-Y|$Et|3P=J~GuHJ5hC~PXI!%Sw1w0ojjan|L*>IB6Q!H@o={4XN33u zMA!7x$7QZx;m`ogISBNTp|987ihSFG{c1*GFnYm);|7h?HBxrVF2X4cC~WmSR+~;= zcAcKSWJXLR(7$YPM}pQz8S}5}uG@n{Lv&A3ag5JxQHa3v7&TQk+sl3a5ppm*W z+yE~icX5Tdwq?#t_0OY;KvI_0RcC^#?<>{WuZVN9m zn8q*_QPkIo5@9wUnK=#}h+F|LdhM>(>1!;D0BYo9C~9U4+&-YuVO+lqh&VHysq8%H z04HYEJf_&w19!BjR5pR}_x=YcW-2y}mt-^HDa%_5(zY*3EV)>)enrhM-xPuIh?u9q zDomA;lGE0Ss%)6gi->bYGbcaGOziPzdC9(p!XXs$@!S!qtRF$Ps=E*x-fEgfXeJsBE4ky8f@V9PpKv5#}(47 zv+oYa3Esi=wGC}R`e?LHf9i?SZBCEhTKxNP6emMPx8K75ogmK%x?)&Z4Fshn8B+g9 zgsHB|WvOnn-^xWmZ}>7u6M#w$wodFp7JYrV&1(t*0mFoN`1KTr*h(Mq;W_s?M}M>= zBfHo*9g3>EOl;<44i>K6l#a0eKg^ZWIMdTQIpeJi#+4@}Ug?(drb_#G5EcVwPtnDX zrAPL${Ix4~eswS3SzaK<{su!)zgT_xufzRcMDo9En<0S`W9O_}r4a3R!s)bMQz@s; z^ytR$_E|RPpn(@b4k`K)60P<(`P|hWRaA=L_|LHV_wE1tAHuhv@(a~VpBYIi1qd-2 zGx4IEqxw*%%Uf?Al>HB?58mT+7!bqX9+z(QEU$KXE_1#&7YzP;2Z?_VhLUimJkBvi@%THF-|&}<_51)yH^>pw&Ae=yhoe#8HKI*8kLZKmBdqHa9re|&B_DWzZS zL`Y3tk)zW`j8-xNO!ABiN20?XM=!{ckBHE z%hBpglKE?LzkOz&4P>VizAx^~L)31YdH>P?4OgN4Tx7*#aEIv zjlmX!Y8SC#JU8DL@2dZ~v1=T%6lJyvHpBgyEoz}qlj)gnF(|N#BodBYzSGLMep0e0yPzzInP;( z^CDW}7eH5Wa#KsAxHOzb%$0;XP2yE4sR|IW7=ONyhPinnROB&@k1R@Ecno&)3`13g z`5eeCALW#U@7enszD)1{)aMzaGwY41;x8f=zV5T=aew3Duw}eT0U)iv*;@~3X&u3A zdrKx*CSckh(}sxh-7iu0>V5hS%8p)sbH}NDc9I*_$Bowz_SVh2^WRkXPd1|#kg?5( zOf27>&!$^G7CAgKcbJo&mXiAvyI(LuF<$G2*Cy(o0lc|74n5?6HI3Y{VRPUW5?MZU zB>_3Ps$qO=Y+?2w=I$vNj`&jJW==tOlCC6b)O(RD^5*T^mr0HFNsM&mn;A?;hIDoH z`G^#~N<_ote)GB6n*xY&Lu&A1G<2L*uNyYD^>BfvYAuAyPP3K|ahUC** zSnlY+!|z_6`o2I_RlNs-JHn&2a`DF`vX*#WG2yBGZH~bI2RT%Iz_xDrAl6=svD9Rl~OuNk5AatBA zZ(n=nc-ZPpOBdAYEe1L`muqsPhLl~0s(#K~{l%K-(Uo9u%6jDYqC~l|yKJGJ4)*WX zy|z3<&7;+F&-ZmB@(QNv3b<;c4zIGMB%i{>C8UoBLPy5Hg!8*B%~rE9?w5}_Q{G34 zrL_;Hol0YdY9Fu0A5;H*6zR*Cz6qL|7;A_c>5-_0q0E%yY$=R2Cj6h7R~^2?z
                  6=xg{_^nrfoKcMUX4OT^;XUYG9uK!bSe04IjFtiG#Xc-x~_2whKDN4#(
                  z*o3o7e0=l3-@g4Q0v!gApn2hINGc>mcMJ4{EkE(c?^DHmNtdGhlP@QR@XdR*v&(8&
                  zC93|$=E1i(y>CU^J_{R>6_9lfY2zV6rsDnA_ulkDSzKHI_EJ^5Ma2im~i1VfsOBc0{8t`~2{FfLwB6=|{w
                  z8J&yH3@)31hZ#{}HR_S{ka7o9S7W>G5wyga5T?)QE`Sj9O%enLpav?XH55U0M(9o7YNkxbT)EK|!g_K1p#K-X
                  z%sRo`##HV-$S+4MuTxB@JR>O@_Se(|AV+xn(rTP?=}(pqC?^uf!>;p#dhndqX@j>4
                  zs#+iVPC5Y-ytrZf)oqS7%+qD4V|R`sABU_&pAPH_SvMcajUbvjKFNp2IwQH8K{3{a
                  z3k#yO79*+u0JuA9uG~d9SJjYN>m%nBmW0S`1jI+dw3k%lq*eZr^XoHqsi@Ai
                  z<`kFN4(oH|rppa_c3nV3wxQzHi)X<_^C`QCcA>7c781&{=KEO_M
                  z@q2!8WK&SP^0~4tAq52&H99t1QfbgRVYxvQS9*TKK%8b_OH2BS)si8ta`{i{g;f;*
                  zh`?y>u>9ebuFFi$0AWfN<_19Hu}DcN>W0$qi(Jk_Mr?|31_!?ahxTL5Yag;<^AweN
                  z{08DMFrS*txOJBQ!y_sm;~>7RNI~Q-tQ$tdvxLSNKc4~9$Z;0tAee@kjkWx)8uXaY
                  zN5B5@KZi3>5Bnw`meL3`))1eb#xl2?jm?w-jJ=MW2{Y)jZ>)(ir5xvv8ouiEeh`!K
                  zyq}(X=>W93ETA5oNK
                  zbQeukSLFh+JgB{Y#Pw)$>*Jo>fEgKjac+s3>^jQ>6|b(t`e{03z99&@P~6xjFSODC_5yWi|e>bLvEEu+)0+W2eFsY9dR@i5_#WD}+}fCui67
                  zajRW$duz|IVILFdPywBJ`H?6gB1sI+^Y!cVNkfj-3thbg+LtepEplo86$h;EL(o%q
                  z)3iuLJ(A&|vb4PE;`=O(9B&P2Ois{jeWLLX7C5~a5)AlE7@&-3?ML32p-Oq@((mGFW+puha74}3A3L9A
                  zoc&~*E`&-2G7$ARAkJ;uIwRhyCv9yJQXUre=VR0MEuGD
                  zLfRUxLLW@n4hnm67mlpfSI*)t&;URf$|cC(&EZGL06DIWsLG+<{Pk>VU0
                  z+pP6=n*Wp_}#hko7&HCNb_>K4P(_?N{byy#FhB4l=NHTFxUFuv7AS$-+<
                  z#PG*1j}t2lgJa6c<~9r-NMObFlrT}CX$>%L4k)KU8i10iy<@cCJ~?>^@7yFd;N9`I
                  zjDjfs!UQkd)Dz4%T(v0yd>mxon45bvm#5{@zConH>9wb0NBQr+ldRX)&X`ASVUtfY
                  zvvKfz^$XC|S39B?1e&s-6>gKIK}d*B6QYh6`Ig;Cdv0n%fBaBCLH{y1iev?Fi#-5J
                  z8Z?ZL*2iQH{0>N?u0*+@KliLIa@^w5EP73S@<=NQK#ysT0T?qceo(xsLD6|e{a(&=
                  zbK*J>0^JIEUlWo)=Esk8&ln<*v(}_kI$+!xQ~`cgk3Ak*MYe(Yy}K!Cofc3N2uU8h
                  z>hLp>sgRYGM=L$nVXL@_X`vAhdGS`s|2xamZd9+;deOM<@;Bi(AKxFub)g1~Uue0_
                  z+E)X;spg@UM}Q%52vFXuHMSz{0Rm_Ti9gQlK8`6qEY(>EQNJmsW7X;t>c17zBiYPcPe(O{O+(Vu<5o@
                  z188}%K!g!ped>fAnEI18l1-0Acil*-YV5@qE({|=L&D|6fsW`TMHqJ~{eufHVoQZG
                  zoPcEVX9I$BJ{{=^mf+Ap$+cBoh#50vjUBzmgSOo%D~)!#(5;JqG_S5iRD0D`J80Nu4P{T%pi
                  zG+2P0E`Ie@*1&0NB0R1IT^0xKqOeuUuO|mHOm6Y<>*Suvl!^EJ*vt;YI0N$Grm8$-4WV2jl-^ErLxVEtEZak+U?375Z9A6iBQ0+{B-rKFxY}ow2;}rvsO3
                  z?N@t2q;}n4?Hz&gvoVgoZ;c$LT`9M=eD9?7)S9WsC6stSY!LOEHYpLYeV^BWRi%&7!Mc)$E=(MWl)oK$qZEI~SuR?Sw3-5e
                  zfkxwM-&CQDn-S_EZxIvGKBqk_N&%@9Oz{gg)5&hGv5-fA!*l~Pkb!6mqX6f{PDZyw#KdZ
                  z3xXmJV;DZz?_I|1ao+I8#|GuNR*+m8yM^-9OXK5!*8L&Kpvu6|rfoj1+7Dmc<(1D(
                  zJppAg*Jbc+t@XZbj_xGptN>}?{G@};S-r_Cn&;|eHjUKm7x{~OACeZ0tlF|;9Cjq*
                  znZ0xT`}71IcFt|_C{%Cl>XJ%Vj#t1QkpZW*_H=ynU^C8~Zd&(Pzc`EbY+F#DpXIg_
                  z8+ofVrTR8~Aja&aY*Qi2=bcd;iU+@dAG^7G=*?Rh!>lRl$`45Hogo~oC4fGGtk&-&
                  zi1kkJ$l_rfYd`n10AXogU>9PXWtQ~9G#ojtu>n=~rnb
                  zighCecdu$*aQfjOT&?|1qgQXaR~lKKQ01!Zk5`T$|G6q8Sz!XtHm}(#ttWW};XaHX
                  zd^HaDmP*O<0XppK;+=HZE)udOcYR=B>!TZVCp;zMvNI=En2TN%?k|Sy$vJ!e{Ez>Q
                  z^A@t3Tg%wYHi%y|Q~0pVMM3Eeaub2v&xHN-9S~1&+tvQlNZC@(PsV+d8R_v$-0P@JMo)D7wOSx--3cGE&4o|z6V;`$vv>lG;DQfAKab>tT*m(
                  zUmcB{-=Q-)ky@#mUt~wKXt`(O6wf{-=;-cNj_km-UC8LmFT99Lq=4iN2yfa<3nEOc
                  zB4c85_YQM|Am;@?6F>>Z$`j9R~$4IeiO>!?(_iK@K&se6h>
                  zq&%qYTFCo3OKz@mpc}u;UjTRtqNg@3a~E+e_VpdXmY`FoWwh&FWJ`URrm;_EHIoR9
                  zrjCZt7XvSUPHC3c4JbPuB$ZI>;=X04L0q`hOMR@|7m;Rwu^+=h{uSQd6h_B$kJI#M
                  zVQn-T)#cpwbm7SAj}a#iR-o0BO-z$&(+QLGSO1qu$ge1_Fsj@@_y
                  zf^fg=Y%21RKKNA4?^1@BFF#0XKx_RZ+m7!KNN{K_K$N`9&hMmw;dVi7N)B^Zz^r_L
                  zlwEp5bQ?p4IA>Z9)@0BL6bEu&$<{SVIo7`HHtY-cwlH&oUNh1wU@=YHOIzRUAKs9x{H*
                  zUQJ68qzQ+`=u;h{=98_o|6p=j
                  zldvFS@zj$NJOd%!av9@tppbpcq02l_;Z_u|$HU1#ynDs+aF_7syJm^F66pVe*b+$;
                  zD=mlri(wb+5!C-b?7d}F)NQyoiYTBUprRs32olm#A}s>aA<{8}(%nNd7>Lq2bST|Q
                  zHz?BG-6b&$3^@#O?s=ZQ&)IvQb9&%Mr!0vw}9nfAwoE$1!C1ypKB#tLo>))7}tocWU0#r(m8z=9*Tq
                  zEyS>q=Igf>@}=ED_45Fp1?NwR{q6KII%)qSH*8|FViD^k&tci0>a8t_1h)4cY+fT*
                  zYgR>4IgW*Oy`{X)OW}b~tw??Swr2BFlQ4Si;>PdUIm6lAEXoPGB+RHZ7Xal~!leJb
                  zZuSfIrBDtv*Z{<&{5U+MqKcpFPk;}i{Htq@IZc*08uQkD2l&)#_zE}DA2SoI`-yhQ
                  z+ev7clsvW)orG|FoK$Rt$(Xji_bf`>0lxSxkT~%O*~sZ_9vgc}umlDa1c`rnM
                  z=$YL;am`_9Xumn4xE*D3IsKdDmFM0@TV2qhi(f|jT_xEvjb!%fA$LqHlIEd96FMj@{`9toQ#&B@_S*#>E?c!o)VY&
                  z+C8?G1J|++b`2k^hH%4{K)yvYiCSTgcs#5-k&v<=P{F-u{?db(2v#n~jEo=dh0g{d
                  zo@iMmSno4-Gm4?t2ghwYFNe}apFDYG^mLW+NsFtU@=dJ);;Pzts;IWVQFmC|t9EFf
                  z?AwntOBdA@-{&d%{rj30drhvZ7~_)Xm-TNmTtv<@Z_K3wx-xPsS2_2~H4tAFQzGI<
                  zvgyVYEu+e~GcWfKlZqE(*8);K!WM5^y)Qfnm4FY*#y;fHuQ>SAzkhZ(pLE`>=Q|ZL
                  zGZi^yW2A~jH{st(>xF1+j>6ih3ICs3}=WDG1QMH|1~Ut!rgPk$CXj_FoOZcmK56b?7Um8S>!I2g=V
                  zV~-wcg2Iw2J;zh>!2s+AW#_v6lWH};NWG#yOn=}63>L9Y-uB_^2VHvkQ8;ON>iyfO
                  zB800VXp0jjIoV(__=e@2IwpQS)Ozqi5
                  z?v#;^G(LEjT*W4w13VRNaW;hvOhD7!HlC)mZpYJKRqr&pZM;^#dv+V2YPdXuz0@xY
                  z9T?Dc+t;u+v2aU`;dUqGskf@hvbUZs(1xw5zW8T3xj8e;udi?YY@kb>!hb|9u<`O)
                  zBh{?7q&78+A~`R^H>Z5W#E*jt&5k0XCu;jjk6fAN!q!UYzR0`5ReJXZ^@f8jUpeJw)HPPIfJ^
                  ztXBO@4z*V2k+dgjEWS*>i-95F6;pz_j!bV!2G&^W}avi5i5D{5CIZxq!$i4SRdZMTZjIUwHjq{zSyVx&4C$>ZquaYe+Sb{sYiU!3P<8Ls>3Kwy`Jcmjuyo3hA~?
                  zx!_`Rv#5YvBFBKO
                  z+m`0Fk3=z2B|EKU$?)FIVlXF5dDfSoiSn;F_5*)WYm}#wiFe+U0m`;$4dbZZ7HO|f
                  z`gOb!Tra@s$Ps!WQt+Pr+O6AW*`Pl_YXK>0oOAKkaj5(Kf%(&&I*NS9
                  z^TqVilZ9p9eD}w+8$nv!mRC{kq&D)zh-lU^jeg6HAc4|+opxz)o0mfHnm5mPTf{q(
                  z#)*;o-dR}D8er}hqM!0vO@FVmqDM_S)!oFRvw$
                  zjEorhp4fqpXECF(LP1BaBuGn3J5PK5ch71QQBhTOwehqx|1?aj?8Q`zWmPS|v&GFCWod0MZ>m~6%>k3e(E>o&Sl$UwNj}R(6
                  zehSR1SP{fn^bUA$3Z3^dO?TP)_SKryw
                  z#0Ogp|33vZfb~ixifZ~tJbFTu;7ozbQT%5@;(v5p|G(rXoZqjkXd2eskIfiXR!~SX
                  z-+bevX{71O`0}L*hKT8V4)?B?z#R(AwhGQa>u<)9X2Hb=`JCy>+RFc$u?P;68WgvJW)WT!MI&3iaYFh=o%;rr^UVmm@ylql
                  zDfa~gY*59+)MM{m7})GH2`=#6V!M3a=q}HuKS+YU0?ur_#MVthzxXQDBHQgq-fsLkR585w(!CwxPJ6+K-*xoh`
                  z*qP!LHJ`cd#{D%|?G>ifb8iqg(qy=g#H5{GI*x1(*ZYiXPXMg^+bcnxv!~|*VV3Pq
                  z{C4_jKDt*}ta2W>*++f&RrY0)IcW
                  zx5;nz40L-C0IS`)DO`P>Pw(Ph0e690BB|p+-&B?1
                  zDFOr326J?7_zu{2fb`HgPtD&b7$apa;nY9TAIA;9qJb&W@uv&t;kNqm(?a
                  zx>hy_@fUCxS!
                  zy`|hIvzc1^cpS!aZ}ClrS+<*=947TemS*{yIbLcw9~oAQ4Zn>{SYKafW7Bx9@Pf=?
                  z-?8e*9nT>B0MKbwcogw0-e#H_$n;tZ_=#fuzMCefUs+h1f!Jn_OnV%q`rBfAD
                  zcka`1mB2WkNJ!X^5&S+(>b$kZxYQC}rH~UxEMLVPVAf+HYI+v_6FF8Io0Bz5qGZ}z
                  z%g=(j?IZD01ZHHvW+snf=<8!+a$!*`YqHX)>zpiGL^ttHJM_29pu%6
                  zbNLjk(pmimHq0(-F=_{Z|B3ov7B)8*uz15ny__M>N`4C8U@vN!sop4D>DzdW3ZG#I
                  z!!Vz+z7%BF61KYN!KdOaEIdO+BZn}n_(OHxxA{w)K5nmlDyqm)EVHvKiY_$ol<+E<
                  zF+yIRH9br$j7{W6RTs{CXe-9bJEWCVpt+{GqS6}k7zFdp*63-fl>);JpHVF@Ydbz)
                  zX;2v|GuTGeN*TfPpzYA33zyd#UJ$`aXs@*poINlBl{6?l#%;wyN7r}c7V6Vfe5WaF(CC4PBu^t6F*1>iK&%IPD8>IgQniah}G<9}>CwJxX^$_y#DrSq11WHT0|QTkf|<7{iTuRk3nsFbLm_IPh#
                  zH#{$pNt#d%KtNYcp7IP(?WY3AU1be
                  zj^@4x3@a9W{wcT}%W?WOE-tvDar@}zY4NPk)*1)mnBSfGz+(
                  zw%QjHHepI_H|ehJ;O#P@kDLUn?4sY1OlfV7*gJEvKWizsaQM>cTG!S&;hh!Iu-f2$
                  zDI5J&%~sql70SdgR*8CM8QuilVWDtvS(z{!{#IyF_4^vKSzNz#JBH@DYp1DKAUXGA
                  zr2hJ|;lpBss<{HDq^7DGn{4;xayp3}6rcS-vECw#hdXj%!I2HZ+3@KzBzSyKa0ew4
                  z8=lm_$#PUtATw(Thaqbo!TX*wF2g5m($bjUC=M@5FnAvY$TwZtTA6*Ww|THJgM9ou
                  zQ*qU6I(_!O^44tKr)1%W_Fec71=F^kiZ|WUoSx{q?og>Wjyj!}K?POX#VR$@fq39e
                  zEAvZK=V96jit#<}<_uarGaZ{T0bA8OKW`NdK0T@KKuL~8Dc(C<;>ww1XoyXUXCW=?
                  zbRYZrO0Mt$U;2SK98t~c?snl*eUnyKagM59%38CRbG7>vO-?qG6$kC$acFuiHs{*l
                  zc$c!-Fv8vi+wh-RfMfw$Rh5OERrZQ}3xrgQ&{Ww;95<9d
                  zMJ4*N3bp&2qo@-fp{);pocz8nZDhT;5E$C(6&xy3`gZxpJq)+La5hwkulEz8z2*hc
                  zk!~-Csnw7RS*)xEgh-eK4W!RiwHI+LG+d)7=R0_83x|Jz3OkG6PbujIfOO%8uQ&eg02A0@#kfg*ZB4#Lh
                  zo`}?j(ixE?O&w$&coh9O@GuFzi8U^(N5Av4n(FvT>NlHs>6IqPw*)s>4OmC(rR8KM
                  z6boKVY_q+8hcHQIe+*{Vkl+MXAze|9O
                  zAiyJ+Hdc?P`T%R&&LCSZ_}EN~cdOmsk9oV_h2TU!I0xT!AK^mt0FOL0tfCk$rYIMy
                  z*TDVdD*C~9@I@~OL}Ac~GmM7IBRsMC=Gktoe4Sq9Y3T(rJo#dJKa3n1O}%BC1reS<
                  zI4qsin{0Z-dugGL9=1c2b+rIqGn`Totoso@f_^0-Gz}{E`>YuW_FW37@m_!CaOJ;^ITv26Rg;4qy$(g7HzAd5DSdmbR*?kLeQ`vv63Ec{IIO>Qv
                  z7Mg?}Km4Ie9Gl3fR%P(Wg_1@H>$Wh!-1r=PJv=;eon6fJ$x3luLehDr@sjq59QbZi
                  zk@@LfblCfo5(@GT49RUi^BJHahiO#>*j`Wi!w2mc)R3hHO&{-sco|WDP0oacoZ5_ZZ#8S
                  z2w#sQkxxPh(`IjYxqfNCx#0ly;&bkSc}^2|)wyw-LUL4=?fFiuFc1Si$YMsXPIR&4hHXt%
                  zJQ#j`n6TI9xt%r9{PDy>`%*c=Vu(3*;gfQ+BX7(wzv24}e!fbxzd|B9J
                  z4ssek81f}LW+ZR6Cn7?mv@Zp{e;DCx#@Ds5n4}!2mt`hhshal%Fdsa;=BxLec{R*?
                  z#aZZYa&0{|Qo=z+(^rX9BTbnJ+J!TkfoA0`e|M#_%+_~E&{%q+)w01@=N-aM;ltO1FQ;rt4fL)t?PDE{P+LkW5Gd_KyJTsdTJ=*zqN9*yb&}ycG>Ru
                  zXg3}nKJIwSGSHv3n3mBI`~=fgv33QoT)H_UpqbXc_YOmA0BgSn*%jn1@UQ>(>;I=S
                  z5H8G0cE$gp^^6CeS`_n`302^g=IG`CX}m|O3li}y{;bM3-;3gbM_ny*Q;S3Kko}(U
                  zEssJjqo4YS62tEII9RZ7gKVZK-BfcRd6Qs<;FjdV6`Ka^
                  z%Rj@zdLVnif;!+}vl^~Wz<>}#*TC(h)k7T;rTrY|iE+E6xr#SZR+C~D-?6*r{g?5+
                  z&wWKShq4bNj_h0vw%D1txqo^_m$ac`JBP_9d#
                  zJiAKf#|8S+%Cb``K}T8A;2Xb7UYMWhiW_EoYnBgL(sJj4hgPZCKEgVdUvIkqv5|L?
                  zqANU*>V@=&cO8tI8Tk4vmsHAMb4IwLo4u`PM?&3!D4)2SR!kLO93ujJb0hsX9;
                  z6fI+Xo@N%B_V3tn8#bQ6s+2FWU-Z&cmJ$1=J#zPe#xb(y_Wmpnv-Hmu78A1>Bk26Y
                  zMr3xJJr>nF->ppY1Al^e)o1mkd}e3cF|ujw8WMgE
                  z(Y%y!cC(*KE>m_GZ?Y7b{7F~J5A$4VzbGv2dThAlEQ3v)Km!fNBDbA+{S`^hbPm70tKmNXKm!TW!dUV_>Xtl{O*&rkXv$JNF
                  zm@7WA8_z{d`oN}VudOEkR#1%Xc$B4NzMym!FZ{VRxP2qR>d)f@1t
                  zq$u9Po=h8UGljy(#qEo^uYHm(EQa+OwThdXdmpC@_3D{+Lrl)A#~R5W)V^*!gN1L;
                  z_)4+(#7Q?|t)Snx$ZytKTW?Z)|K+Wod}u=mp9nPQ*)Ovw+E9JhWn~{XsMDk-@z?Rn
                  zEraD98wu}?C@RdIf3MtWeS;ymN-|6P4MxnIVqLCFt}ZV17>_-T%uKY?&A%0u4N%n5
                  z(6?m`%+Y>+6l1`!T@`8>$r4w1$h0!FYI7%IcJ`w7_4zjXu$uj7JPlrE0Qp<4d}MFu
                  zJ8c*8Kwq1BtQ)aV$pZ;lP{PAgd!T5BCl<-By~|H4-tzl9MKZM7Sby)pF*1uowLPiI
                  zV}mVFHSHNV)iFCp#0uDFo>4P?m{KY;Y@e~PH}}ljTF8?^Lt2k%+gf|Q&OuPC#KRZLiI?Gvh^rvtj|
                  zp&{GGP)+xn&{EcuMgUo!k{3emK?cq@&N_
                  zP!Ko1NS`Fo!wn59Vtn{4C65XyIj^_C77dM&&5u?u=zJu8hm=N1
                  zq%X8nR6wASg=&HPTW3L5VZYc
                  zxy9Rd)IitO|FAjQ9|%FLsf0Z@NJA|%OtQ9~uagH6_P9S3*xC&}=KHkV&`6KB`!^jh
                  z=>G&6|B%rC20Q+j@9fgUw*TDw8dU2C9rrww$(4Bpfg59KZaW#Nrq-Um2v^e8EvFHN
                  z$%0m}WhHz(wWpMz9?As}u0nn4MgZ@nUiZv@ZhTxC
                  z;_=KOO3GUUWV_7(ZAKrjcrC>a$-+>ikv9OXZa1mwo@sih&_^?;P`n)750me=56FVg
                  zPb`;Nt3+hVuQiN#xt%dbm*jXhdfBC)S=)))FF>j)n@r```{F3@06JL6ZZfA6oZJvM
                  z&{s+vu{TdNPcP8wWTJe@i0mdH{M=bJkBX(O>r*OYxq{Zu`EcY}2h@}Prb)Zf_Iq9C
                  zF+$#y6b>a5Jr#%opNm6oVc1!aY44I*X-{HG7zbd@66elwF+9<)0UuX#g{BmK5r6vE
                  zT(4__2c}qLt+#UANn|!WW}K%ZT5#amVEN&F1EO5{EqJGq0_^Z_ohbiFh8Mp
                  z-Ls-y(Q~!JtkeT$!Vgt?D^Ygj3oIOkxG|$zH#Vl#LSMrg5qYqDKaLzP?*4JxAXB9~
                  z`Hq*MVzR@v9U?NLC|M;{#c%jlt6Qie`D(Xs110WG`w+Licb_s<)
                  zv29%I3I5&#)67M9;+i6^hSU$Y4WwYLiSUGV+SFcFi1t&Fi*{eK>4A_-juNh_4~s9@
                  z45p4Nv0lK@0?HH8eBok}+p~5SzcYUDjlLlHQ>pFDyuhUf)Spgus{z+Ax5bE|YYSgJ
                  zkC7TI@{-m@rnv|tWykxEaVtonpd^0`Sao_@zY=11==#>;308IyF>FSra~~*59Xr|f
                  z8>Pqi8s_ymF0rO{V463Na480dKvZTM62;DcfU#=YhK9*Z(q80c+(v56p~{ydO=R8r
                  zTfbiv=~0^cwgqU^ncsI=e0td5GSseLRqM>$MSLRE-Ce>R7u7nPL=r)kg6L{Ir^LLw
                  z+U$#~ua7~4WPwJO#u`&x657CyErKUhJl?Qsv2dhhnFohAAwVQ?>0ja9FEq*l>7de~=U>_-QcW=9;CL1hXJ;IC4x
                  zV!I`vJap6oNgU_%oNv2q?d7g|tEpKC+Z*{@BZS00mMiHfv?5g|Y;u;B)T=#vu;rJldyBiRo{gF-t=^5H!c}$aOZJGic>>@@03|QX#HyHs&{tq^B(Ue#*)Z
                  zWuTx(RX~9uNpm#VKCQy|I0JREkCgOyJyq3d2Tz%uHxQdKTIq=FURsYsx1Bn0m$+Xo
                  zHVR%0CdJk8RDpY4n66_rX^p29LS0X1fAmEJ@_F
                  zn`haE$s5}_$>X*$BuFKZ8&c2j@$roJ@JF6(Q_4IGZG>2jhQhBiE7RjtlC`F-IH4w<
                  z_Q_7RJ!6qqcP?kv9zbd*$6o{v+zkJ6Cr#7-t8M#N9znbri;?Q99!!?az8h%4jWO?v
                  z&gat~TA+UO4kF1cS$fel=+1Rf=D*6e*#_M&U3C>kbNyh$P9x7!Yhi68+x5NtMb6zL
                  z^VUgsqQ>WSUFIbX5It)5Suuc3-@MQ@{vBG=?ofO6k{etWhQ-L;0Ft{uvm-RO%h
                  zPZHdp+Hf64xE#CD4`;&S9?NkvCo(&zk3;>Ecf)-z+$E9GfGM%stUSbPK9|DX+ft&s
                  z-0_q0wa0o~3C^mwnnF?mm3Rp_0tY=QPuvQ&&YjKlb2z6intXT=eHJirTxlKoCh=Jx
                  zH_kv`TFpsR{RYhpL^<5)XHUF_nzQLK@9;48()J>W_haCOVV$G437Zxp?1AF!yj9b;-(lrWdvo)CO-#_VPZ&|99H#VXc#EN{~
                  zojlL%pKsD$rS;>DPFue^{n`Bd@ZGOxA!|hkC1sF`Fq1IbIrI~qmYWZGr@TUb`j!Nu
                  z_X&5I9xanCM7juF0cW7?`*PF#Mt%GHuxI<}Ryo7dd%b@O1eITFU>sUWYg-D7pQT19Wu6(lId=h*Rz
                  z>?Yo$$&Tu)&C&w}2DbypL$|Qql0@82#{WwBPloo!-FF&s)~fZz1jT>o`={1tbb4hw
                  zAu(*RQha9UC4W4;s8FDsd3eVa%U<0|%
                  zOtwHAa9{J3`QwJ!$??@_EaV{~#EY;6U#VI8smal6&y7*DC}8B?kf3L14a$x#X&+r{
                  z#`~v;zvf%SCbA6siTus?@T&fjRzgHX@UJ1k=ze?`kbxxdd#X8b&&)eu^0LI07}k|+
                  zi2;qjL+{%`zA#$d#iCT@5C{3%?G|Asq)!IL8rmqq=^j(*rt+G9x0DSuG;-JPiL$t{6
                  z#^XWly*;N$Fi5In=w8ms>|&DXa?qO39^S(37vSMCF#*8~l}FS0vi_XOv$}0?$SAS7
                  zxLF4_=`!{lw;*rNx-{=Z;b=|c@`rdHOu)R_)x9o4!HpuDeo~er7-6l&H)odBslWk)G0-Op3HpPV7qr@0*=JQDW;fem$Y7q^i{BmrA#1mBQr=
                  z079BoP7^~$D5v^O#LSf2rVek=arTE$RR#ND=7n1tWA}Gm#7zatBB%#)Mlg8PG
                  zHyT)Yc^P}BxFc4zBc>N8eKb0VPb4o~m-~`@#vO!tz`u#Yg18t=nAYR))q>G-|pH)rLl%PaHdjK+o^BdFvlVMbfORL0(yH7Sg)(zXSv%trCRg`tv
                  z(9&+Lz*AgbNYK?80c(*{uPn2E`5ZNz5#MlM!i`&o_vUz}a*qT(uj0q+@dkOr_FGb7y
                  zZQvziB~a4fDBsIZ@~gy+Xg7A9$)Ef6BgF}VgGl6ro0N~Qc$QPkcGS?YEVWQaU)&ws
                  zTJuPP-hnbOD*n%N(RrWLDPnoS;G&~#(#Y6?tITSV3S`}KGBVu|4u39<=P5U)?3M`o
                  z_}6I!Cs%>dFrzi#x8-MbUu?6@Z_?G%H;YEtS>edmD#di5xV(qi*UMel%4oo_{w`a^
                  z!#?Nu5@wmNkeT`_g~s!@X>8$OjeooIN`{p;S7o?OcmBDyY>CiQsvg>cwP0zgF06T
                  zMQ8lt#pNCoSJMsB1{U$t;z%BeJfCSZppZRDs!A=BP*U0Y&^D?(U7a6L^GIG^xu-Yy
                  zQ%W6oM-FtGkMeqDUs)Ernws;a>#WlHGv0Ri>?uF`S8kDZGd;635n`?T1|Inh;2P7B
                  z;FfJdxAUy?;NaDXuN+4k9NGkmY8(?PU2jOsx_gA%O=myzA6X?;CP#k^PB3k{
                  zcaulgX9zF`3gjp2;mo&W07I37izG`eDSrGuWb48QE5>J{=)1L_i~#Plq9awqG7fl~
                  z=XQcwC~U$m9!Y(9TI^;~xL`>8hw;9Q{rjm;``;K`IR{QWQv*MdlI|`=QkjReDhn%Z-LEm7p{!$)dq2+%
                  zGGY8I-XFa{++$aUVr0EHdWt46^IBT?kFZ&v&cxAf*EKg7ENX*d3!Qb%Kd|G!dN?>Z
                  z6Mhi3IS~5Z;&)Fjn>)XDEyCOKR^fZ+m;0`@Mb}oHzW=JYSe-CX`dSPP2Y%_x-qx@p
                  zmh+Xo0+y4;=w%Co@FW{z{*aXn+leoOV-1w!tNR%ll@N
                  z3voz`)IUt3v(jf(e;<4XfOI+)rB9losbWgP*T5V9`}P0j8K7hTpGM7l*!2@i(i$j-
                  z^P(>P7nk2OJ#U*SSUxwWz^()BXICa4Qt@50L?iO*`}V1!dj)2|fTOuS#jx%^zx5sk!2q1ze$jFr6CkCSz|#5_8#KHiYN1jtY?2!+7+-{Zf4d828K7c^sw{Z(G=KHK
                  zodXXm$Xgf#Xs73i8C`WgIJp;y!DU-V<~Mb_ljG(bN@6uyhr2H&o;ajQ+Ws+T(-ZqB
                  z^XgSM<@}Chim%QGwTeDq~t5JJAZ#hS#^2NEhP-en)gVsyCwBRO0tf|f>=rXA<*zGRaJQ;;&ed##xh$a(Q81t|1H76
                  z*GY>MO+Kt=B88_RkdO6Psnu{4We@+jzj2D0M?9@x43v(-azBwc&4T1kiTPfxfb&eB
                  zX5y!?Z808@IX0u>=uoda`V=4hwT-k?>GQ$QE3Igdtr`9VU#a6MNEq+yoADr6+B{sN
                  zPT;?+cDrr(%dkF8n8F+%Gni%{=O9^P{h{MoKUdW8=a@(kLx|vrE9oT4s8p<|qDfS
                  z?X)%iF{E`R^unffx?2kZFN#Qj13NK{uEEwJ(6*e^7eHdPet&EfN3&dQ{hevZrbLSP
                  zLl(g2SAO`sKeOtE3)u;C02fSrs)FQ!RAzPXq$^M5-
                  zd0S(gjjBm@DccUL-p?HJAc8LS8;PDabFfCAXSJoBj(Gr&bU)j=HeZVAjaH3(X+`1F
                  z#HBP=r1X~RscS|Lw%~n>*kvJP?VCWlyp>T5QzhL(lk!JoNz?peQK3r2jIasMpR1+b
                  zN;P~`DvpJx`ci+>-4zoajjvVFTPp@o!xMt-dT$jNj$sc!cn*z7uL(6;%*zV9uAr}C
                  zkcT@E%{f2!1_ky%4br)NsU&fNTOV+;{n5>GKNiybjPJ$MaovfN-Hi^d!CBFaX4#2&
                  z2A-aEEVc6`O+WR)Aki7qCc6WBbL_L9?l<@_o2jx7`LmZ1Rc^;qoLQktg
                  zk{brUr7$Pevquy6I?~!CpwTo%`q$*KlyUK&xxMNKYE9PFi9HS$(R;_Y
                  zfoY}1VFAYX&YG9_Dk9l`hwXuvlfy2f}8R1o}kcIGB7KbBtb40_u
                  zzy#95ZYzc1;c~B1TAvXRGGih$syYGi6X_|Ny-}@YX&LieRP<|-fi0sH|4CJ)5upD-
                  z1~2K@X<*1cVEtJs$g5vU;qF_h5%&l5!&5oXFI9F|4IRDth_Qmxdwy@sz)_z){HrZJ
                  zc2mU&N(WB~p+1l4+Z7;|no^beAUq+%_wF7Xgt}oxrRyzhc6n5G-D=b#Z
                  zD^jZc&Kt8ky;yl8WN392pUnNBoU4qWg+65J
                  zUDtu@yB~y7aHYPJ9A$5);-l6w$2i
                  z?82~ZzJH!bpTcN0U5|1Z8ABn~gijuxbsbsV<4Y<{uEIx0)yJU}@hapwK~-KyEHYR@?kAEYT&
                  z6D~fPCHMypX?xUlZ8R5r?K`fVx>3Z{;G1m85X4n32uv{*RXxJQkZOH*
                  z`j@8Yh_!K{0vR%XYOnR|=y<(r^>MJdU{Do&s)U6PU28}h%=h)9XyoHS_YYgj%D?cf
                  zP?nzeXlS@)NpifwJrdJ}=dlC?ioTH4?`B+I^Nb1RgAvIgLPm1&gCQP$1|q4OopvkO
                  z)s+S*vz=}UYZc4A?;B=a2QAsk*}cOxJzs9SE6($q8e35b_+-e)LD%W&tFKN88;ZSPdO>KeLHB%!v&nG1g8z+>%hQZvSHGGUrHWqVE|!~`_Ix&dKjn7j
                  zHRKkD>S)wvA7DP?a={ddW`LCEg50A1GkXb(v|{P73U8;co^u5TuQ4ubw=qt?{jfeo
                  zZ&5;yDfN?JJHsjW(Qm$xEg6*e{Lvemb@+u{6IIr$wE3b+E|;%Kb-|pvu2FEG1u_Bq
                  zh~5xe^cjZ|^NG)=glwv#1Z`uHlLnRS9c*Z->}qJ$c;Xb8R4%y_U9%sqbo`uF+pZjW
                  za?*l63R`#o4nf+Y+smb$S9G^&#c91@2i3G1C91zy84?G_(|u;*>b8ers2h3#X
                  zUdigfFPD_EX>!x8_}sg$%c@T4!Z$jUu?=|%+ZK5zTkNlS^o?cN`h12la9m%~XReU;Sg6<;S6nUlhsyyclZ|K4slP%~#cCrM5vZAusWO#EaevdvP`-Zwno@dB
                  zR*&Bdw@nt|)%oA$5gH9qE5?3b^^Eo_j{fUiZg12cKknrl%kZ&|iV;j8&NG*sHB3>t
                  zkxmvoo$FU=iVTDexGNl{w3Gw>Z_BsuC6-+HD#vOIWBx_Icf=;g`}`pl3&S4zPJ-ZZ
                  zwN)H9Bq&6vaHR-PUgOW-lh+epzI@5p8WVJosp9M{kw^>h1Rt0
                  zhDZJXC4@W6SO)Hl#17a11K~IEH6xnO%;ke5m&4kQ+wTalm5bW+cN?A$^d$r4eWZ$Z
                  zS1dc6x}s%veC+ioV|rre=0w!(a_J)wDWtUp;_k&80b{kzOmw>1Z#+8R#F|mLcjebm
                  z5PZ$^tBxXkTJJtL8BATsO@g$`mvM2z7X2}F`c-TEBcgB|3teCsZbIjgFQ___KLFh1
                  z-`L^*(*Fma{69a_oUyQ7<5=U0nesKV0QvD6j}2-fN)UE;T)c(nVaR3ZtOx=%Rk(B&
                  z2zMw&zTC)M4#s3@5J+y!I)uh>$G-M*=WzzYGkn0SGjdjr@PK3S>G{V?yJ%S@HI|dq
                  zJF>&w?eqxvllI4)ocf97iL6jxeOdIHDs#7X@_p!hjK)*AHUA|L4Xp-z!f+_ZmwGpM
                  zx?WJXEoAy17S$iat?>v-?OADOkHhi_@XZ6QEum^zP?EVKBL_7~We7Jw=qQFOWe{v+
                  z+qZu!PBl?$+N$gBg&+-7Bf`rX20*%n*RbYh(LfOARr=|rT(jYs8Pk<
                  zYEYoLr)1Wn^1PwO{(hTz>KXa8Y2`zpyq=g*MSWUWU)GQsmIY
                  zn6wwmuk}DQ^6E>#AbNF;Ovfl4h=DzPUaqBEAwh#`1uQR}W3<1>wt9fn+yLca2LNhH
                  z!fvKLHdFn*0NOe{w)Ap=IdJujS8YcK+o5THWAIQzKRbW#{?v*)&K$#e(=jilZa#`aDh#;e>|H
                  zbA0^l5CdX;ajze<%m0nF;alyOM(^yZlv-+M1lICQebFgiut|j<4@*QN;n>inH8&vp
                  zlG{ld8l|iRSnMl$Z85f8yFI@XnIFqP`O($Ff_I~fF;2d)Gab1NdbaG~B`uit$f_djs+fCn5LJ^?w;&-?v)ou`K?
                  z<24<)gvkQL*=}g~@WQ}F-ln_2FIYDm8h11=?On8p*8m^S_9PVB?W*ian9=K9(n|qD
                  z^T@pg)Xm~=2l>IDOzCOP0Zo*HM-HTG_w}U7JF6*6Q>ZquajC+cBa)vISbQ&%$0kXP
                  z9HM(`qRdKmPubzI%ewWvErvh}i=ijPF^5m~78qr&?f34@fbUN-frbXIY6xtGOy#lR
                  zSF6Qu#Iw-^B65=QxNWhecrtmY&f%Frma?#rZP9@MkBKy>bSPKsCo#VXH&~e7cKiKH
                  zpq}o0N)4t0zr)2r^*2VFs11M&m*l@YD}KKW>HsTp(Tui_+?5h2^*FZCwT+CGkF4*m
                  zXyPQ0L?7UDc8uh@-GC8Ht8_&pCw`M&MDM3n`UJ)lTWrT8AhkbGHXZTLmAM;rFYwpi
                  zgdI+G+F5oNGy>T*Fazq=%dO`9rjHcLd|dmJ549tQOo%%snpYfr)B0zh361nVWCIeh
                  zgLR;?=`?2@>EIs@uM6Z2+S~Z&GdRUZb_8vS<))`$UiWLoZE{PNRd&SYe~*ZfWUQxQ
                  zTw1tRdzXN4`l<{<(OhtaO5ge=U-VEfp;Pw=e%0l%kH+!?i=>^TDlj;Y@ZCI0YtMW)
                  zdSnwU{r&JyQjiXtJuzPW2v|5m36z=MDRKpn)8XHNk{I0UqOm-hDN&M9Z!HHwC{KSG
                  z)wG1*Cfam|wfC9iK#t~`S7Z^hyJ-!>1sUEs?lIFqzNqzfdJc}Ur=Mi6ssZR2~Ao8Au6
                  z=3|XpB0jKZT#FMq-vjCn^ng;pK0TTXYvcyBAxFy>>M(TEe3%}fQWW{Bz7hev=c#gK
                  zaCNxKkR&C5Foh$PXNa2lb~b&}<3IRw{k{W1P$0s-OdkcSx_#<`RV=V&nCQ3fE5=M@
                  z@&H5PCb?5Y58Da{Dn-ySTfhr!cf=D(tbRO%PtDnpyK@QF_liA{r+&|
                  zoVQvRUhrJ%@_J=Je^3{Iy=bAZ!=3sRWBs)of$RHLt{76WmdXeQa;bq-{-Glfx6@;pX#e?iDOMlv5x&a>+8(=_5>~3pEn9dwwoM39EQvY3opAR|ir#7?QVGu{tS@u$f^|SkR
                  zXj#xmGcmg6J&3c;DV*tDFiZ|oW8ZJs@ZPIiB{RKA@)K?UmR(LEY^jJ7{s!*Q(Dl1F
                  zCA@@h-8Lpm?$htA&i(f<3mA8v3o38V8gRJHYR6x@J8=$kILdF0S*s39oX7{h+~Aho
                  z(PdRXYnqK3gTH2`tf$Mwg@U!G1D9pIsuC3Lx81C0T(@(Dhe<0c%6CkIC{A%^*k9M^
                  z$(7D=BBY=B$uwE6Pd{LCoxK>OCF{7{O=WNh0`I|D56w%yhjkcCs$+
                  zIchH)03-1|i_H(>1oS(}0pR5B>JER?kMnp`JKLl$Q4iIl9(qv(YUSJxmLek&y(xIS
                  z{Aya_^d32--E`E67n*zE^D49nXFAvW&PMW8hts<>qhC{_k-E2_Qch2N;N@k#XYNWr
                  z8Wycf|E1`X8jss4E*vbm=I3V#qdCo4ZrRp*xQSS&{iO~uKnOv?>2d7}xLGs=U0llk
                  z7nZZRg7U8h8;d$vOER=seM@jvmY0Ug#I*x=(4jtP?3C2}?vTY*#qKqJrdQgT2B#)x
                  z0J#nq=eX)V6qqC;o|Zeho+0&zK}ij(uW+Y6|6P|saS3kJ*L)dk>35UWozTShd(>Dm
                  z+e`G%jlah1aFZ1m2RpxoW}@VFW8|Eg0y>cZ@8r9`K#GEo*yHrSLRaWs;{$RQJ_<6IEg5`OYXZxt+63oIfO5Gsbk^oW?@juQEc3u3h!1N
                  z@$~o;8z<=cwtfKl{q+6E{ER=>!yJ9Rp3@y1{-&qG&jS;()sS0($2hv7bfBG<<{e&Hm=Y2m
                  z9Geh(bt^K!3`ovw2ZhMfH*r^8^1eb41O_}l;j&UW=bEfoNb77`O(Vf@%*hW
                  za@YR5v{lWZI?K>=!f6Y;M!xbwza_Nkk_*a9wSt)u>Ods@EO*T|V756EjDa1tk?lU-
                  z)c>yMdOXNvphkbcM6Y31+V9$xD=`bc((eQ239-c4&4eR4JXS7l-ZCH*CAbXwxUE7a
                  zA-|3a1|u=8sC$eFYLS3Wl6r8i$qChV*5)Fo~JT=650<9g9XAVVxCxmOA>$
                  zVFSnc&U2?a@s=}q!pS?5=p)DMhd|zxWzCYX{wT9?$`)*t=avvXabE%mDjM?w2Hurg
                  z>7*)g&KY=Kai1&f5ER|EIvrT#LKSDZwu^PvV$kY$`WcF&f`ih>bboX
                  zp10TDkZvAo{h2j`)jFkv_(PNY!{{}XWl(BNK={l5CZZofcjthX;V&+yx+te4qQYFW
                  zq5rIEp3MgD(AndbTi@g~OAd2=Y@&FNdSV4qf91;v79Yl}fZO)MwY`lhYVWfVtD;!{
                  zpsd|do6KwH7XDhvlD$$vRi(bqm3X~}PW;t&wyHW9e9CJ2NJE;1<(%CS3vikc<>;f`
                  zavgqCzGZ@)utM#S);L2x+0t)=GuhI`772)xYQ;_TP$x9o`zF;i%btB<o*2)7rW(M(ryBqQ>+|Ul|2n
                  zul!#%8(ZiAg?AoPvcR|z3y9Msh;u*%Te@$Uc925#K2mPJ=H46d7pqsNPIz|#%FXY*
                  z^E~Bk?umm6@2e?)K2a_vch{jx@k+cnV3I(r-P%{I-t{?eCS;Cxo=K)1cH#=y`T-E<
                  zF2ujWygjNoxp=E#xV8-FEr6Tg>qha9IY3Giub=@cU+;Pw{@6J~Q^*L2SsLtiQfV^#
                  zTI1nYR+|rw`na#1{6-i$3(^M5$hc;)9%J%6D`D{#jXeB;Y&gQU?}Ie_rM!`$qp1rJ
                  zecv%p0x@XIR>tv=XbrcHXz;WgvoQKqNueTNdrkFLmBfupE&`kUj%QS;2d~C0^yQXL
                  z#DyIFDx}c5y|lYeFWn1|bG#Hpz%QJ}cFEFrb$)8X-@b823DR)&%`SFq@$`f05BjW&fIu&2(++y4cz>OfH))G4
                  zsa$^#a9thunE!Od?wQ1;4KXIi4{~%+h*pQ;MyGKEV?_Q!oo6VGjIqqaPiBE0!2kz!~KtZEJzrs+CU1mUlwYd@}7Yt*r)-if?br#c`v
                  zr&Pt=6ANh{dA8y5fmA2QU^AJ-fK3SxeN)RT*2Mx^!7t*`o
                  zjq0XFzQ(4F*@)Wu?>7N}p=)_@GY1@i539+>x3R!y#K^iC}mj}WdF)i
                  z2zinPbgqAW2Jkii>-q_LROoA3YwpLb@xj}CN`Yx|J&iobaRtwR
                  z1}#L#9K-bY@7yIhg12a%9zRIObQB7JphesL-JAVXk`E}eUx?4-|EZtM27bEdFNS%)
                  z!V6agXnPKq0qssKaQ*|k75{ZY^V26!BOp)p!){-re;W38)~&*t{0r@GBu>5vVPumc
                  zG}8{s#dIqdG`@u4(|Dc5bT>BKwT6GMhBvB+$UkKQh!8DbCA?C7i*{D)2#M2$#Z71l
                  z^_$QBnhP*lUpaL?o9;=GdHk%$Z!7YOi-YYmd-0M(lP=%pt*0||H9TOD>!-A+Bn(yVj`uwtV>EdDGD
                  z`Yl38y}oMzQDbGP5kDeBza!AtQ%zS(Oz^Uvp7`_sDOXn?MkMhLd_HS3yJDqw$gWcS
                  z<<}$fK?9ebyx(Vz697C3WZ2E>cD|a+<3)8*sAt&eTl+m*s!ls
                  z%V)1+Ykvi9R<`g(Q1@L&$1#>M8NjakUw_}MF9S1H?Qm^*bou}G`9~3kg$}7rQ~=fG
                  zok4C$PJcOL_DwEO(o#;&hxwWH@x!*R0+#gCdyKq=kj456DVbhBQjr01pfXj{+6bOJiDi@?S=rxk%fa
                  zpPO4O5IlP|$oot1@qkJ@%i!P;aKVJpfyGT0108^kom`WBr~RTHeYp_Q3jtquA4poS
                  z%QxB+LH-@C#=9xryT?Tex}_0!(Dxh`1rx^+)14?vYNsybC}Z9xKXgV7!*ph*SUy;P
                  z0u1h?Ei!wG%pWg;w5!_LdFeRE3p_9Kn%yE2ZyIeUmCJrlXX-f*6&jNCdV6|?RP6Z;
                  zHb^IScI%usBzW?T!ub6jTh?p?yPM0U4GoG_FcZ_3f0wSyhw>`KRk^e{M(*iyD6GuR
                  zqA&CsSGSDUzj!&garIn_{+(b)_9S_7oy6Z^h4A;U?y-eL@pbNT-s-1wMs)V~28n$!)D4_vhv!6mLH))7#IvAxeQ2oBxol2C@yGTj@JYtoL>hm!
                  zHq;C_w@ou#4IhI*6s^xoy(r2>@q#=SdK)k0oaL0<9Oe2gtlwS&c1EyOywXg>Of?uztNh=Wo=Rp@N87y`gM!d3iaORjRmh!MS*n
                  z5=S;)R5Rtlo)mfey_2~DANQ5~Swo>s!q-PByg1JWnRm@l%;r|1VGBmq2*!6h^kPAm
                  z#_|7r!EFSF(`dz~XEwe%)zn&c74jTUelJWCFOgcy@S3;RuETzRos#ek(I4H-jeke2i16NQuet4y`vu$Ibswd~`&x=op{zWadOc_>5cWd+5{t0jVV>(5mYTW|2-N9t8RT6RAU8NZuA3xb@BFt}!G5x_alFc1)hqG_
                  zN0!Q=N1pbM?{6XkF`!0c9`-Ee|CA{0AM;W9ol#$m%Nu^840+8XH~Dsyk
                  zcTw`Fi+y(~cOksD^qK`|ERpKoFyTZXeB#?GT|rk?Ucrug9$;h&6Fi4U>c8GIQgQRoorR3hS9??T
                  zF8#ehSHHM?0Sv6#9J7JP8U9#j#GGEq@K`B|ZEmOVWK!Ltdt4)qO!t=PI?lqU0{GDX
                  zTS$OsAkYNP$KVJCG=r1H;3i;1}h8j!vFur
                  c3o>!$v_t!TTsHrG|p?XaxlYmGcP(
                  z@Q5L5JrnQ`y{W94A_|JvD-;y}uP7)8;35Al6ckrZ6qFrf6cnK(6clpDv_@4C;EBf;
                  z5{eQiD3wt@H>$C~{YNfpGVf8!hN-uKI~bqjWu#E*4RC
                  zcouvr;Mbvil#n8L$VPTJw{Ig>-N#F`szi%I-aFH!sdrPOCtI_n9tk%`Yvc0Pbf{>it1HIe
                  zz`pXeH^j(lUbd!BpQ~S=;<@}b{
                  zPB)8>;{}rpOUad>?_G;`v35ltre9fGR92RNhsR9TM@e$KoBX4xnIN5m!bm?ibtaS~UdQnK
                  z1u++Lg2Zyp4GsVB0DBj;;0ca$dvf(^l1LYofv{)i)?Ks*n0xc7QYMy6`~D1TowyZ*
                  zU$d+gQVS~n#Gv0s8+=R>-FYKbB=*CwiMF`*^guWszMJlCpKUkIb|g54!`N(VVl+w}
                  zD_#_3+ACRU*^iEFjP?xuGbCZAT3#CqPRY;zh7f0D#53@6_@H3RZLU-r`KjAhMs=2GWtatt7rZOP4SVoWUu2i?9E#c%!8TgW4
                  z$x3$3pMVKY3BtO`jWWA`E*hwmTALs*`0vKZ%%G*6KTR2|jlM$VANlsM+>huvDh(#B
                  zX`m!zF;5T^tJBU($IAtu4VsS4RHgf|z7U75dpwDo8G$-+@|2h>;YS%QK>COUQs71|65`
                  z9(%+}S~}0>!B%2y@0j2F1HX&ZEqH0Y*p=ArEN~7`I=24I()_*nYVewY0jq-DI3&<5
                  z8lyPJe(DJ}m#tBJ?dr#g=1Rw7^t984a5Hg_KcPnK<_&jQD+2J1G)k<_4$3JG%JVa2
                  zWyofB_OW#db8*2idlwmtrV;OxzuR{0N;}olB?o;Df<#1UN7WXlb|Fnf-*iT%tGcef
                  zeunGxFDz8Nr{~_G-Lu6*tFA#RQD~8(h3s|wad_4>BXC1RV`ul9D8H16M|JGu5wm%=
                  z-(t2M7i-G0>^&m&(3jJ3%kU~=Cw-sKToD?1VJE`9==S;Z^R{&Z(HjCqXo)GuD{98qIkELldGYJ&D{_I5I9g5*)76_10q
                  ziH``Vu?P5?;_Zx1!=*u-W@bV!8BoV(R^(Cn>!QKJ=(hNKqkz)7?!pDS4e5
                  zD_>nb7o&{g?Ow+P39%Zd^Y2GbnLh^%(|k8;T-a|HfKM$n7gNQ=jGswd^;N34vZ&hQ
                  zQflB!NK{hruU5ZCqyazB5LxNJTGjjEM4oB3i!JaZ?cH3J8Q$HqfqE>5bt
                  zBBHG!mkJr$l7qw(D$rG30kTS|FABtIuuD6`Y5a@^T({Y4Un?B8722;_4W!mclhtp`
                  z!i&wdEq7wZ40ipE7oQvUi_~vEXwk2=IAxTNQ_|Wn?|}qq7=}m4sdb1$_bp_qHn)8T6tPcxK-5k)pX6C
                  z+9FCC=1emVZg?XL*@(E%?xKITC(g173OSdTE-i^Fi_+LiAe+-BJ>cOr2<4h#mR#=~R64&m_+C%(z`nKE)i=|_E**HCI>K`Is
                  z*4!HtVv|=%1)p3r=q?X0)~S>vvB@RYsF$05iXDZGxUpW>Vtw~EN8XHzwGutSk$)E}
                  z&5p3j?V)*J-NU}Mm@Abq*q=q{Yq)&fcg7Gj@CUxcc)Fg1gdM-KhQH3Cv;4DjZi!3P
                  zLg!a%j|MEvB2*8<%jH$qX@h{?>gI=`$@)enrI6z6+cGPOd}&zc)t!uyM!Dw8=|@+C
                  z4#Tz2`2X#7aXO5o^EcI0XIiugh40^*`-ZnHTzWt>|9*v-j|qS#JAtc>xSw~
                  zFUD{ke7K+)VkmlpR^{hHHX?I-LR2SG8HXbBOYCUc?WF|q1SCtoOr
                  z5epL99;lx_#i&$$WkX!D1s^6{{mEQou$FzNOrRG*tE0;12dvU%`jNjv6!{4qS;$CX
                  zS&P+rPFIUz0mW8`ut@$})1x8xP1wCDyuPue=6ZcV$awbxZ*jzA<9YpBo(2C{aVjBNpp!RdaC)#Zgd{E12REBAXQX987;Zs$8f8%Nt5+~4yFPBS0
                  zh$IJ!rwxS2)E^n3<|UPqKF=Ga|4awgS$M0}Ydm)kA1~+mFn?DSpLpKUU@YOndJD<+
                  zS}ZVAg^3E9bGNw4yVqD}wBFx6szjU{v@xIur9Nq%GKx%Is1kJSxMXidE@2w^Exl{m
                  z911Yw0+#sm=C6q~hLrWO7KB7&gHQcID-);(9qH*H*TZd|)tQD(GDB|{e$C{%$v~S*
                  znI(?ogFY_IN>>>aYfX+E?)NWp-|~tw#ZX53H4$6$8-`bz?Tr<+R`2XF!j}XaJOqhJ
                  zmZ2B2kKS*V!|mvb1BdZqaffQFeALu*5f?R`!8HLEu$B^8(&o?vHu)oXv3AEJoBNZ&
                  ziXqJ1pS8z%c^VlKQc@gxD8m#_Quy3J(drflD@pEQVkm|A`P<8vm*#%(TF=$b4!(tj
                  z;#1d@B`j+(JJ!d>k}ym~SX4<3DqBYYeZOYb#=J!UY&{As=Yn|O^
                  zBgAx>fq1F*JD2C5$TBOv;LmjnZ~;hX*FUIfDA6=^AR-?Ymh`C5ky
                  zKI<7x?AQC7ETOr&W0gZnku2Ofx7k1gZ~I*9_|6BkPWog~{=UGAh2MS)l_VB(J=!E_
                  zFk5fgPFK^%z;zN~rAiWH7v*_a(a1m3Qp9V&7}b5tF+Q)&IG=&+w(>~OdnAuTqAxZ-
                  zZQKz3O0yRL=f(SSFn3#h;skd4f;Q6EJmZoL=6Eu3kTYS{8dtaNEh`mdDow+PdrzFM
                  z<(zpCcKx`MJT`8+@Kg2lk&tE>ozbv3RLCKcLd~!(EjXA9d{c~$AXo|(G|EsFZEtcr
                  z(WrYvM5MaJ^Pgimx}T(X{bpF6cfYj#EJ~_-p_I;QH?HK;O(o5GeiEH?TfxlKu3*lU
                  z?v;+UimZr;sI75a|IeRM>R8|2VC+sDH&N!=D~~T?pK)42qoR}oLu)e|TzTlF&nt#)
                  zja9-lRQonGoj9y)q
                  zn@%>HEoaNFIux!}JZuUxJ)1CC4;FwsaL5Izx
                  zq|Uxv>5T$Z6t|rtTD`D~>kj!sgb+B^-`t_z^Ss*cQx_L317D~eym_(c
                  zyF^1hB9hb+Fqs8e0E(3xb*w!0T|KOboV*(`!a*
                  ze2_Zh_BIENLhqYH4#7v=kyK+9wOo?0fnct)NN3B*cAdz5?-dnJuP^5V@J3Yo?mv^s
                  zj=W^$!%Ug!fiT#co+wD%x^r={mGzJ7R#AD#u|s!ldR@hrYev?aO3&K)w3A~eY607;
                  zL6B0EruMPRsgIx`Ifu-1PEP!xl=_{*NaV7~Wbyu2u&>-k|ML63qi+CB8_Q0|oU3&n
                  zfuB@5^(h#!byCmc@il0M|#JWj^WtQFoF3VIt@1`lcW`DmYCQz#}1%OPRYUdpm0HydBC;uN>GWJ$~`*aa5hYp>`p}(M>>B1tfE1ph?r5;rGRXN~6{k;^YO^=mZDfsHs
                  zQouSa6uzg6o@tkn@AjX4s9DoT52j`Xjxw`-3Q50P%rlP2xVX0u%0fVg6DJR^v}x(P
                  zx1UvXD5wf$PJfJkRcND9yE#6u+l1GC&dgI`ypfbT%kh3?*ACD!<3$W{(y%{&V(Fy(
                  zCeDTi-(6bMdni+#|Jdx93vNgX#ap7*CM(sgUtRnb3d-WAhDM`T5yGGPusZ;RqTA7tc5!l7j@Z~K&y%6Qjo0J42HrS*Fr^sa5P
                  zS?!-`PX~SrNjVbhcL~d4H*fUVPJQge~ZP@G`5SHtNn-J{wAQ)rQ!hCbLAR
                  zWC+f0Fv{%z(vH4al5i{rSf&VLn@Oyf(9eZ5QUkUJ;RDLD%D;@yhf1vbx~IvVXNf*
                  z7FO}Kg=-5g6CaRoe0||0^IOBveiECa=?z`;HVb(sU)QR~hp~m7FjRlVsT-Y6eEvhs
                  z?Q304X7r>Ew1J}O^BsZgikor>vL*7OZfrmV*}^3tl~vxsKu5xM7|P=;B?$1Lv1@s8Fl&Ye2=QG1nxi&2~}ZVha2tL+K~
                  zZO6IiewyO9cP(O=$&+h<8oEX8TwpC+4xsm$)9#;!bj8_z2tsyN7iu_+>OIKe5V9$)
                  zR0wk*?#ME=2HByF#GzAi5(QO>GGy{_QC^~bU;9@Nqg60^7k!3Ps?JZhQ!YxOw0IWN
                  zaxbz$Av4bxFJ1)I>fZ!z$jZs}yQQzX6N6w)M-3DK6BeD7w%zf#I#t2U?>?H}RlMkZ
                  z4~QbPGxK^`K04m|jl{)wZnHm;sX1oT>D~_NcE{&6?|bX(pq7I!d9NQnr~0c`(#$vU
                  zp|QD)7`U^!ZG`fCabrhymutHtR9W7MXYGPcC*ry&o{qb6&&I13qCQ7Y`xzH&P(yFN!V`{eJ;9&
                  z-0-H`6DEvX`
                  z-(2|)@lKZSmKc(=T4oDv%hHekv{jlO6cBj%NahZUt8W7p^%LG)ERSy8YRFC;2qtF|
                  zL2IZw_zRn!RYVmus7ub-oj>?9nSHtzCX7#qrD@mG==;NU{a1fKHfD6*;qo~ZSM)+z
                  z9O8!p9V7iBX`nxloN$Z?rtecJy`*oe$hjv@y!KfpKuq?tP2V
                  zd~pg^UT*vkw}s&4%-$h?%>ABm7lS#QeOQ~;cg>X_JLc(9Y`KZG#zd6yc|u|9Qg>j#
                  zlBTjA*@UGf;^us$5M%J=6A~hx6%o}&4T%U^zb62aQimrIlmDY{lOdqcj$
                  z4bm*8ZS$^m>xt-xY4BE6=f;zTDZ=P4=__P=b57RxRC78Hnbn1El$C?_X@rRL%v!uv
                  zYa>JfRQlocmA&QiDs6vKQP@%L)L0`6)V+ZIo)=U#^zO)6z3dUEOP@+Qmr4K1JVl>R=K@+C5*
                  zXCeV$CE~9Z_gR2tVlLvP{7{LVMq!a&0PE(*_Nw9Mug&U|7y^!*&{7^>hobo!Qm5{D
                  zv4!`RI)n9z39E(32*}Cys$S!+OHHlyx%><>--?f)2H+
                  zK{;{jxK%mSlMrxD1o$s#1afErOnqjHdSqYF8kgD6N$>~&!~eehU-p1m|Lf@K>Akz4
                  z*W!CqwBDW+h62s@qw=0K+(V%xR@nDq|JYeZGbq1zFiUJh!gewr#K6AC5)9sdX&>f365FUz9h`}u&}LJ
                  z)Bo{Z{_}+b1myVx3jsD>*aaM2p$hV755yg;=ZX#nk2$)+q!)FgD8%wa9t6w7*=i2L
                  zOg~qQR`M6dW@dqIrJ_fxUw0fU__a48@i?Pv
                  z))RGis_i_XONDNhTTP(CJShbQbxpcQwoief*d6#m?16baM(^(E>cUWb)@V7;5nR_p
                  z``g*CP!aM?8ZXT=gzy;Axr>8#6idbDC5}&r*I|)4DG_{vzY~6PS|zVtaU{};Xcn8Y
                  zs}JB0IqWXkcIEW5mz0uz`3X_TG+MKdLA|s{I)$!4M3&*tW6{Os8N%P_cJg%$Nq2nv
                  zdH7A57)g}>e5H=P-?)ZDiM}t$4yxAuz8)-!y~acveECfUNsgR5mxZOfFBg{>9xk}x
                  z*frS)jC?bEy=sO7OzWgu30G=i+V3Ca*|(;Be+xf#z-JEkf~B8Lu(Bym-oJTcwKeX|
                  z^6677my5OCQx@}FcEV-$i;lUr+eyS1p^Js@p4GeA3dMmtt_@Y_o@R`H&V#4P0ax#T
                  zH@l4Dyj;^9`Tt}vx3uyfhY1Nv>|ugS8(O=5v1FoBMj$g6$^jS)Rd(Q??mi7+~%?kXzB$6cw(~kiB=*ig1Gor
                  z+@V9TREnxliST-Su;%NpIGI}2d^HB7GbQq_m-p&Qdgb=mumZ+4;n1W*qIEv&n(tup
                  z$@c3r`1dUH^XDQgVIID#=j)UntMmT+_Qx{NjSuHcGSVmLfRcs!p#55B#)L4EsGFW0
                  z7^2R*J*H5|fu!ylxYjBC~=n2T@=_PiiF7-#d%8Z-$HCca@_;#f6FfIb?WNd|nteemdaO
                  z879E`=rK(F@L0qZ5lExs+Mmf
                  zY5lDCb{UfI2)Ox-DRzQ|E?iy=xQ8
                  zcU}N5&P55huv2H7U|~$Ge-&|j{d#`9(Do+9=&c%HT~7d#|2fTDXSMRE7k5j4%IC7f
                  z!lua$jVSyxi)js-Rr)$mgF+5LG-zMXmSPRP00}+>(4KlCAYtxHqF)EKa?b{b?hl#~
                  zsL|A#t3O>+k|<0L_PjWG2Cq|@)A672I(BE75Y%S=_z?(T><5jCE4+R#{Vlz?3UYn^D>{UhU5=@^FXP}
                  zE&-0RMt<**&HV1+1j+bRuFc`kc~l`7M@X;{Z>M;#P6?yWalN~#5YYkviQF|%
                  zPph|HJz)Iumd;>S+GLJ=f$gUz_U0u*oPS|`MK4{Q&0)wr*=;_d4Z~U*F=t)FxisoM
                  zHtv1G6OmLgo3e|f!W*#Sn$=CGXIVK_b8GX=bfVv>&}Rg9`ua)t?~=jhs0AFR%gS}~
                  z>rZ0aiRz8#;)>IE4=&lmn_+Y~uFLvYIO0DO68~p=>_1`@6#m#XCb;e|D%ik@l7Zp4!oA{M>CT6T8B(O(ArTqrd9M3Zx9)Wc^xUAH
                  zqPUa^Uy-V5r?3Ti!0;Aw7}(k(_qieM))G-r%71Kq7=y3^JRjUl9QUJHrrGG{++QZa
                  zXNP*&fROb}A(2S20PKuPb#I%x20oniqoNxUz&}JTdSHyoJM1v^R^F>rc(F_3)Y@u3
                  zm0W%e4MF!YG;_oA)Nd3vvs>XS>8(+wu~mHGIW)Js(+J9|
                  z$oKNSSfGjUy?^3nzn5ir->^gw`Andzf9yNuQTW!{EK}u5(`nL)3Etk!B$0~+JP1&O
                  z`0P%#P6_DndH{jqua_@3;bmPo2Zh2ephL&k7-yunXK6<~^By(UJ!cLcZOr$Mnm-ex
                  z3>mGsk|}6v(9OMP$$uvmz4;)7F`I<;(`jg}Z4U6h@0sw;_~)JP!)!py8H|p*nyh4g
                  z69UVZ*M6~4f9B3Dkv2?)s1!48HFxKjbTnP-EULf#jWhr`?we{COO74%>>bmK*tb@H
                  z1ONWjkov$>EK!53Vf6r{FY7y*IjjbYWxEo@sZbzHVY)Jm)XSBljQj78Q4iZO)Jw&C
                  zigPff#|`orL`39Cz&^Ykq&|3L%6(LO`HgdCE-43WV9_jC!3sw1V-p|dZ`JX5yrTqE
                  zD|+Ug46uy3m3@vi}>|L%hPP^$B8xV8ifTfURh342+Hs@h1A>J
                  zu-#N^4_ceuL{c>x-_C<3VIPN&TW-+cclVWdjR@ANh|j6!=F%8z#F!Y}YvJX?MP`7b
                  z69_n$L8gq;{qedNKFagpx?w{EJ@an#H$^o`lDo=-Mu=k4g&!{*TzY>K(%9PX@k_53
                  zGpiv1E0IlIrKzmIsG85Vu{cES76|dMRW?KdD*QDfl0xIPMR`gpdq-YHL3(o@;A@r&(Hd@NmT&x_RQ0c2}r(7
                  zwAQ@Z!O_g}FZOb%yfIo?2Dd?m+Hy0Z(;c|g|u4&K!n5ayVnMxM1?B@xr}E3Ui(E=p4idRC4rH=a|Xau#Hi?Nt*J+V{IeP#
                  z&@>8IsWX<3Dz*4I*pAXckCgPAslU}4@a4KGGASf$OX9iR5BR6+7)oByJbB+H(FFRD
                  z{x-XjEJ6~_E2}>hxSdzLv^C?xVs9D1W@;juJ5&GptxeOTW8D+ZPqLmfb160fVjyuN
                  z;_u3B0+HDcaq9iQo6#*Q|89nFKe~EHZ%9+G*R&B_WD^w;De||}*E&N(I5ml)3*Ifa
                  zU+yd6@-+lFsET
                  zem1C3QTF3UII0Z;=vlnlr$;R6@H@wIucsJi-YRU*lM5g3hU5>2M2xQ)H*j5Le~_nvXDoT^`WShJn&
                  zC4kw<*>vgPyU1_A}X1NVh))+MO7yE2Rs?a1%v?dpT0Mogma1h~KWHpxd8
                  zx&^P{yr*rJKeoBm8dFay>&QH4Gjz&Xm)yQHk}l4gq1c
                  zsxqCSibfr|rf7qfpC-wHZW|an_Xhhf?H8S5FM=Gqa@$p%0_HH)!yER~Ly2plX4_<6~kH);+BX&61=k
                  zmF$XxV_tEQX0b28tL(&C8KmTE`=X#$khvP@wwT1Z{aS3`2QL}>=WOxA{k`8+
                  zc&&|DuR+bpSYzB%ock^xBXy+BU@Jwjm1`-~sd;}VneI{rW>TTUCE*EIkoS@L;rF_W
                  z7r}_753F$nUNg(-GR*f_DHaeTaLSRp@-
                  zm9Y;hnk<2wV
                  zXnxdQb+xhxiB_NkoMg6Kn<7XYC|g(9s7iP<|DDmo1jY@FRaLf@72eq(u8bFS{P!Dg
                  z4Qu`Fi^JHR?NE0~MDp*u`m)9ikvDG?WPc1rMAm}eh)^%UNr#oLV}r$Rlb4?9O2D<{
                  z2=@LMxK$5@Yb;W(bw^ZS88IY7~1A|rT-P?vFA^I_~6UI($Us>{v
                  z8bGpuqo2PKDqk-&K4jFY0<(VFapleobz|HPGcJ$E%`g2RH<-LVQ$}&8?`HrT!QP&!
                  zu!8z!(1sK1zA>CD(&VuDCed{Pxp?uMJ1!|HXT&jI^s2~Rw)Qa5CiDOq({I0Y@pscM
                  zF)Aae?Wp-K!?z(p)`Fv9>9ZT&_FTU_Y-GSyQFepn(2rUT+2ktY-x}$$d7!t0$VIJy
                  zQR=>R?fy%-gecLCdAh9;PjzuY1`!h6z24C6=yYs-`Eh+<&UEh{-*oZ_n`7Z}7Z@m_
                  z-^o1HD!gwRLd7DnDTXQ629?kzB_ukR34r3mFyx0d4D!
                  znMrz;;k!R^7k8wb{5&1-Q(wH=I=7(A#`Nq5D(%dR-Gz~;Mbjt+|u~Tk!P5+1%D+(A}Bgl~oj^9B#FaEGeDf7KHS-#(bf`wP?rBDYzdU(s~EudJ9
                  z)P#fAI@|8rR+(B}YN^R$eG_2aNnEth{Q$jwGsv_%0#=-3-89rM{DS3Ax;p_BKl_39
                  zv(t#+Z44SvI7Ev_=(s4Etk{@M8oYi#*Pef>J5t7BsIFtUY$XQrR!A0c5&_b2mkVIa
                  zH@vTG@@1_^YT1u0DW$;I-5nkJ@mF8tF!Db`cLk0ssP4F|4U%EyeR!wNe`Gnt7ZG3b
                  zq}W=@8T-r)5lSD79n-8Yx%mA&{c8TFxSYvq@TtBL|I0qv0;W2)4R#wPafj;0RuT4w
                  zbgtJg#U{=HWcf1!6oaF+i3(}h|JYY5t44G1$2NYS>nE5?I-2Oi=VZ%$)k(I~jNjv}
                  zG{t5|l;toWvMI5xhJOC&`a>grOPpQ14!W9e!JfTc>_!c?q#SezX{}~T0
                  zUjcC6x%UL+2TX#%_;@S=AW6*CFjOgDUK;jIQB(Y*4rKh0;=`hvYSzx~jKO#t2UA;h3+_(L@gQ2o8l=VMjZZtZ*M#l(U!Gl7ugYX@o(
                  z>WBmy{?%yLX`b}f9fGcH;;_#MzyJk*HYgRcQ*!=t>^n&OD2%*^AztLx%l-K;A`Pu@m{fBaYkuGdz=5OI#=0_6i_SP&x=6Lt^
                  zFox?JNwH~U&hb*H3|;}eOy}{?v!>$B6G3v;lYqnGB>|@jVIkP%ulBqA>l=)Qb|q~o
                  zsRotSw4i6ZT2(7cqH-(0XN8~ON6G*xzvyNy)T3#mx9wX_n3bNX;sCh(4d(+QfIWAT
                  z5*~g&AY{#3wk7$5`Gz1&h!$H;LBB@}ARn4IINM`KZst
                  zfW^hg&s)iCKk7rt(M8|)BGuB06s9&sl{z;f-ireuOAc7~iu0k&)^U84pf}7rv;`w_
                  zBQ-MkY~_&T{6tt1|2?&WVgyLj*2X5pDVJrnz^|lsFX+~OJ;i3HK0hxnM|mX1BVP-P
                  z*Y~DOZ^sX7O4x1r{riCVIv8@ViYRVkqSoxR9i1m6_Yskfo8AV;))WdVGD72vg
                  z>%wY&u420&B}3OPd`Kg$t&Msh{gNB))$<$~n7!&#I;G>D&TjG=e~OSyGT!c!WjwS!AhI`B
                  zXMq(jDu+^Lc(2S>u@DrLP`dGXX2n@IM0>$Fr9{S_jag0LhItWSn;n?Cjx@X_fnNK@
                  z4%yt+m51->I}cwPwU0RSNjm{
                  zTi?QHC8Ns>DMXu54gJo?B9y&QQd6m*dd`0t^7geM*)AmhnIZZ4SkH4~xYL>JssV?(
                  zr`0aq8CDhn+fnPzNJzMly7_ElT9zR0nHPGo5Mh)NT7j1ow&ld0(j%P&a0Tod0(pX(
                  z_2aJ2SBTy!x)kWn0(3gpMgKBk|IrRvZUo@R4*k5*pmK1_+t-4$ts~XWS<>6S=<;$v
                  zgd%}ta{+j+d+;X&(_IPMnzDJ}`%BRdy2R>O#+^y$UvWUVqL-5ae%v^$#UX6oE+yqj
                  z|NMlO&%WVX@`N>&LL&2&d8C2H$W}iI6lw+9xivYW-KO9*byj?6DF6wbPaO*(2+tUw
                  zyQ*96XH)JHYa#5`x+7rW3YSZ}q?Bh2?{O?28Zhc&B>_|Ed>yb~&M%pOaEQEnkgs-2
                  z^Ewh=In=nsEdNb$@s;bxQ)+Q7pa5h!J%_dqE!PZ=vZE3bnR3#(Q+L6oZj{+i)aV_w
                  zlONY)+u!C828v6|8v9&kC%=y8$nB^{WCutlEQa8;r(c%Ktwf%4P#f}}gndrFtNWx{
                  z|KmdfsP)mD4-XGXe7aZ^V2WsKC;f%+=$O9@PteN-qIGw%y?o+jlD~oP(~xld4QnC3
                  zp0W_`&V*Y6v)YWB_mM*!(LC_nza%)|f3GwD%2OR>AVX{XCOp2piT=mGGyLAhQ%-f}
                  zY!G_Fh;k_GC?y&e=CMfc#rMdAKfEF?GgyT-kes-j>entXVg7ylKktEcynh$d{#{J_
                  zcQNhX#k7AH)Basd`~O-@yUKsrg|h?%N2l%jEakxbri2tvN6?g{&eE>5{BRH>=in>1
                  zN`l+l91}a!5J)`sDo{xQ8pbT0og@_&M)ZKGlL2+@Kk{8->Kx5q3tB~*kBH)tkeEJz
                  z&e}nCgnsFvrzZLyLY!072lqb9RroS
                  z+sXqWu?cK4s(Z`A5YpfMf9QPSNnL=tn`M|OLKE^Qqk+mX#|cdfNV@p7hgh}
                  z64=UALA)@Kk15808UeMl_mU)MhjfKzc0m4K7e$GH{v;za(V!=4@sYK{A_RnO`YUz)
                  zp*+reKZtGtYqyFj(?vor@0cvX2Q9!rQed{uKQk|Tf0z`JDXg=18fOG*7yZoek)19X=+tyAre@?*3HOnamcFVf
                  z)^60{%-D7>e=g7%Gwyg!x6nuv-h*erxlt--{q@c9@t*qDST~M*OexptcN0XD^J%26ptwT3Zyeje%{gaONPzqb}E&LAoL@V%x
                  zAMkK;#KNCy*xC)jEvjL>UD>$|Koj1`3kCmU`@Q06PZJ&OhlhTmPRkRo=0*b=i%K&+
                  z|JtSb%joiaP2)aCADHh#E6+R8U->LQA&t!`niZ6V=oYhgHVy|7y>r3x=R*l5Pj~K7yJZ2&H`FJx!yrLBH
                  zC{wcq=oJ0Um-hRQNl0G6Zs%Vxi(PCYPpT1!oiA99#97=iB{hN8Qd%P2eE99oM^3H)B@xx@@^zUt^Vhd5^$FThEOV7{zJx%-
                  z7E0%!1DT4p?9KZ4f;=M_sJ7g)ek8nhR`UIwZa_c|@NxY?*|ysaY9%Z3`+cf8i^kuY
                  zZ0-1dH~!dh>w|M^Cve&Lf7yFzU2^O_ZU&~%G;T%VKRvOMrD=mwUz&b7~M
                  zRf;?GtncHbym<2lbgv8P6+U119_VH+h+)J4>WpC{XSc;#4*v=H-u!6@j&Zm>HOt}-
                  zq9^brYYM$!t9yxdFnS?z(-aA#1c;)OPHGuWJLUWu&YbA1+XEpy4SVeWos@bqw}?#J
                  zySZ@S}i*@Mc4a9B0H#AU#
                  zKGCpayex%AkBTSA?k{?7sF!`e-Fu)m^UK0zWCiLlQd~Q+C#zTWLrG=4Sk6nzNN}3p
                  z;Q~*3_VHawba}d_M_2^6h|F4fW2F(wG;!_omQy})>zvf^6V
                  zcm}KFB!K_Z1bxX<1Wgyq2tB3|A-4SiT56>!tm^nJ%Uh~(s#&c6!~u^j8n_(9B*Jyj
                  zu#q}>+qqPatQ!d4IBnh4e)gNTtN&Tp`yLV%+NMLBI$hVb$1z-lZ<&k*oG6##h)?Z5
                  zL?K$$)Zr;`8jxPYB<)roo6ZfvhTRRMr6pL`L9@5cz=i-`Tbg=5-IFT&F~C|2kefDN
                  zqp|Dt(3;-6YvWXStK?M#W7mwkTois#gx`)c?oWPb@i~V>T;R2MG@Qs>-7Rqs@-*0Q
                  zkk?J)l0!8q97-mAZv8<8GR_G6e?Vf;<4MnIv@Rs6sxM6C!vYu&d2`L
                  zmBME^?aD)4`c|8vfz
                  z#yQv!qM1)@9X|Gf?B4UOL4wdTA(*OIsC6?kd}DbY-?u}Ac-)McjZ;wVT-eSTfe
                  zf?8-D{U(+vs`u}=HD{RrXV+t_erBBb-mbqgY%gczdRZClGKq~}a++&KzR^j6!IG_&
                  zeUr{=@v#(D_M;omw-*{x!@MumRsk1b8!RWhKjg1{-t`PnPBRC^3#eJPVFr_>?^^9%
                  zG_65}qtqr;CgDO8^CcO-&U9R0y&{X3HqVsxo`1qf!*t$}I(K{**M9AI^t*3}cXvg-
                  zeL!Ow=h7s`z+9$krzFAG@H5DxPkxrhXwm8Swl+{(|EKo9wGQN8_~zXgI|C1W9FNry
                  zBiglg>rs^I*2NcQK=K(w;rj1waMR8uRj4SdrectMBXbFX;55y0@zvsQbryS#mb
                  zYh8QuSyV+hADV?{tkmL^AwWD3F52D3ZqSJNuLfJ)nRSZA
                  zj+njnK2?lJb$mJDS#CAISbM5jcG03U-{$m3!?NJ?m4XoD;sY&kWrJ^T=;%VD9i+;l
                  zkAYD%1KV^fTfSc;Hd4s=c{hIk3^5POW
                  z(C27?X6{s*#pF!T6Ws5EaKvYk<&GB@4BR^s?d+-x_@Yf@BTlnGv$bP2w*xUf?j{U?
                  zx|!Kzi>9=_`Qqx;$A1F
                  z`_Z==dWcQWLk+5*r0_efB?DcxxQuzel|^rdE}*t6=1~U$>jpbtP#~mr&h_m#8xrFJ
                  z9mub<98Kf_q!Zp;Nm$}%Vd(QujJHpnyZX
                  z>~k0dPym~GC)EkL_$tYXp0XWJAh$hMuKe-K4vZAYu|Y=|Y7d^Ym(OwicoqbtzB!#O
                  zJz)fX4i~+EdzB=%n>Tm)kpxow`*!4fnuz!r0dP5@=5grD6yA?Uem*|fIi@i@NChUP
                  z;I-cT)+c!KQe5sfxU|~%>w{!}b)*68KH$%i;I0z%l=b>Lr_n&h=o6>nvKf<%JOw3X
                  zha!#|z$k!rg=7tx{%7zdyCE}*9K5m&Tbp0IrHPE
                  zA&mt{mPieB-$oFfW3;U1ahX1#eRo6pJHz{#xp@!sjGi_6(`(y|OW}}30HhA+O01Qd
                  zkg9$hENePnEGwT{@_S9_XLsiPIaQ5j87M8WNxF3ciKPHw?6}>cd4v!VA*Z=lgkaRi
                  zK-Y}xv|9b46d#Yr2j?EV?A7|vjg4=)G>K=fTd_Yii(@7)-d6<>rc#KBS@VMl0WxR)
                  z+psl}n|C)ww;WC|CpVJOh9kpPVeu@skX$d*M6?Y?{>}-%HIxhTG`B
                  zwfCJtO}$^YfFeIdKtVt{NJonF9#j;hO9@D*N(bpRKmb8Ny3#u$odBWt5GjHo^j<>m
                  z9Ri_*cJuqc^Uiy}-23T%yywF+^JH>n&Lnf5z1P}nuYDWz6nnLzrL`O$8l#Peco7{
                  z7H@?R_<|tnUn_L^A)$AIO}%lhShf!3n=Ym9uZ-o=!ech8dvt@d*suK%BNzJ
                  zel+xT#yQJ3(^Hl|tw`-r=a>8Nk78h)_EzuB(kvg36#)TPYn8?Cg#l@{8h0`qfm^^q
                  znWdiGbYxT0%t*osP}xV5mR
                  zj6r4P0(Qt&5N4_;>rOFV9V+JCE?sIkr^^Bz@4Kzzs)HzeZ@WCo_qeduzHG8GVF!Pn
                  zjoqBq3#Kd+%5hSLG}GpH6wsjFNZ#fU
                  zE|D<($V{ZG=7+nb_fSpCizfeWO(LC7jQ&!x5?F>lMjxS2rGyyIdk{Z*#}?%E*VS={
                  zGplDh>+1E+t110Gka*~4ZDgJT(XL%Ha|9k(l
                  zEOLG*2&bT9(KEk`vtp%E7^>2`RfZ^
                  z&kJu7&joR8YHr#7sn|iv*B%yt|7%eMX(1;{2;Yr!hMb*^DAnsLoL8X0ZsH;8O)Rr%
                  zJRk7z<^3-WBL~L=LoCOG!%gnmt4m8S3)C#Nv9Aap{LRs3UZ{E=-G-C-hCj$uyu9@F
                  zTEdD-DI$OP(a3`R7ry*MFY<{6a+0f1=ePxR##5O8(95{7c=`&l)EQXub6V)lEoIDx
                  z%GBcf7aS%niWN6BPR^=vmX40Eu1O9GS?gFtxqv^32rDp|H5&&*huW8R?atz>2eaA~
                  zcIYm}+MAsB%`8mH+1asrbvhFCLq-2IS=Z)n)x?fsfNU6JS{nyoeNBlBG-%Az_$=mn
                  z`F%WOX94;MuB%XVbvbopq@%DuO{-b&m7FM~rG#y|E(TMv;4C+pWu83Y9fZE02?A+?+Is{!+OP(=
                  zA%Ae*qRP~b-y4B_00e33$O)}EI=Y>$ueTy#mnfF8N({6x0MpLlb2gja`?}AK?ElvJvl4#szm7X)<_|MtFNRY-cC1w;&LQa?I9ca;-&s*Bw(A(9Tzv+GS8RiS5H
                  z2w+iHGcZovv!k#7psb7F;UUKFfVa^Z|@gAijEqrptOHogQXOym^MC;HD-uaSv`PkxA7gY%GRrC$^
                  zWuByBOZlZ+C)A^b=2BBziT#^8B{fsMM=uZVP-wKw4W1=y_Pk_+$XK%oq!}1xQ$Y?M
                  z@69t5A_}!p*wr87u>sj8Ng_7&c_HCWLve`gU+#SGQ~0w(2TH^4aZ_c!bg>B7?#rvS
                  zLjgf`je?=dT{^a#^68>A)x!a+5D@KQo0uK^OBgv{sneg;wwR2Hp`Rc9D2ZGU&%|6d
                  zo!s1N3+LxZ|E?IDg?&XAu-E{FXRIrX2TrEHQ;xw8yht?xN&)h5SdcTbTP3|DV)gKj~fwfbUV#
                  z^8}!#{XndOHa7*yLR`zag1lO$?b3mG$(ug~C)b1AC1!)K-6To0>OZf&wV#*@CueGU
                  z)c~v%ba-?{*}_P#kx;}^Fqc8ETlFgqduCRyd3E)Nru6j_!OMv@~
                  ze=|)z@=|}Z-H;xY`Mh_z>bRYU0w4UdgSF-hS4cqdH3@Y$^W&wKDT5VOXMG|e#7R8K
                  zZy!AWJsTOa?yZpZ)8f+ThnbTNTs@I@P0%XX74qWKhx_;S)0-3wirmJNNBgFGI4vyN
                  zwy}nKl`C%D)B6#++8(CjE*eRHQpOPmAL%jErpT96lah}mKNV!lf*X^vA7gBm7oXCe
                  zy$Q^=@lu8?MA9JNgsKW8zeF+uug#qheiUdGMF20~bTL=peDqj_Co^0*c89jj^&q3W
                  zeYkg3qKR;&nAshOrC?Ersj1PZ?io-(KyQ4Y>ur38xc4m-6563|%!%wRoq-sC|DB#7
                  zgIkCpNE37@-bJ`MmNxsu?SdITJ2Tj5^$S#6o_;anJ5Dbl))@HMZcSwWmxvs%#)Wd7
                  z$nl!%a0o0+E44JKdKCBj`8^Y@vw}LL;VzTZa8m{~f=
                  z?WL%pDOG>NVszi1KT2VqUi;)l)1%LaBgfh7st@D_EpZJ!`DK2MvvlI*$pbJ&2+7_r
                  zBF>w5;dvd-xe_Dpz&tRoLB-phSB_WtiYFg?{4waSgG|s#`N8V_*NMpf^h9widtFSC8Ct)l&AK5g8Z3Yna
                  zqAF0rOgtT(Z#T{_iQU#`Rgp~MwNh)*9jba~M@GM#;Cnf+gS2kAnwKj~d_l)f7`OEy
                  zzd9UhOy|Ajre^$`a0KdRCC5R!O5mVsiinQK5<4}guU5STvLp&+)G9~ZVT_{<9AaB=
                  zKhRoNm$(l%2}{evWpJBd9&UEcJLecQ$K8Uw+E-7{Ju{QyZfZHkE0#DD#Kbigj(!j{
                  z_x0$obhB+yOsH?_d(2ewFsR&6v>UpwXYbKrB!V{LEh)^
                  zjbOww(u!b9qtka@gsQ<}qyGt5G}rqZYJ!j2Tq#zT)ymI&p+n5&uM^$n7`|7V7w30v
                  zwQco6Sgn(68A*le<&+g^Dmy}$g?cq1a0^AZ~VY_wxXqnUZgGMc7%xkJvm1^W>&`J0KIp!#bdlvEd;$`({o!SnAr{U3uYKiPV0mHU?
                  z&J(q&I^XB*sx+H>K9>pDEwPBl7%d7+GFNA
                  z=Lzb>G^v}+y%e*j^%ljSjOo49DgK#JDr%nwA&c9=+L%<12!GPr2?
                  z$EW(a@2-gI4F&=4{3fP2(sFSvmI?!hjN=k)#+I;gL@u*#@-Kd4}KZs>`YW
                  z*?gxZcVfYbuOOpSMLidHCLGzVp8Cs4x9-?MtmCiIhFOW^{#%9k?#hI`q~Wy}^!ozM
                  zg~6Fg4`xiWW9^!S7+0HI`#L}R%O6B7?xt~rIK?`cMlB`klS_`RG`BQBV~YA)TLku#
                  zrD>fBj3bz?<=+Zjv9OO;
                  zSL|}JLWXB9-mV~$?vtlJqw&;uJo_8kgP7@(Byg{MipRMB8@Od9!0-RF{2x9%M6AqU
                  zpBkD`5fF^P0@sRoz#oHzS15EAlb?Gi$Y>@{LP5L?WShEQjWf%w-~(lbOgyZC+xpB)
                  zf{z%^2?!Xu|D6%AV2thGdmYe}wdQQ9o&UBaraE59EsFLq-bB(_{--Ln+{tA#c3u-}
                  z@26eU4d62CR2Z7i$I7IORLN2Q<09_+`ILg2cYELtZXxIwa^E@1i(yq-V;+g^==n|?
                  zYdiHR>&E-mG}IECPg~~?{8pxs+26@rKxA4IJRNamxBi(M)a=H4vEg2D>Uec>oR+fA
                  zcstI9vpE*`JwFtt7D^7icP8|@Kn-A&(cqMTKq@#ZrAw5w2C%?vyRa`cfe3%mx(@ff
                  z$CISxGIx7tn!*sY*L#^%Pc9dQ$u>>C4VW~lnfN&-P{-q~!;2McFeiD{sZsTyp?aoC
                  zyOG*F54m%$=^0R|Z)eO*-RbB~YC75ECTvZn43Z&NT`073i4>IaT26K?a7_9#ApqmP
                  zT`zb7F6p`m%*w+DK<(4rSiRiO`r8wnFKH|`(GciOvru<(t`2AQ&~G-s&BNh$d5$=o
                  zl<{IVQzw&+GQ8Laf;A@wL2!^+n$g%HK&#>6Y?^WtkUcU9uM=05#OliZQI)H6!diEg7kEI@-K
                  z7alU^HUpv;28~Jf6^X}w!z|*+i2)t@C~=0eTwv6W4)wT;4Ib$igoHoa?2NszY|=R0
                  z2(H0H#8gu|1qvry_h*l2X`MZ8@#e>tYtLx#5Qj7Wb!dL`TzN%;8o)$9ccQT?Yxpna*#}0%?8MT=KL0I;^G-O3hk
                  zmXVt~kE`|AVKvMiS6mvGr&4%zma#bHc9H$KBp`cyyW&@CDckWS#W-&sRG@tJQ7L5>
                  znVWICgz7szuLH8Y0Qdvl``BxY!#M=x{V;!zfdRR~DC%bE{!^%sF_)C~fNNSoaVC8m
                  z-w;yBS7)HontJQdaZzV6>6tFI^{w>`k8sz(EvI47JyY%5nKGxe@j&|PtDL@|CUL*T
                  zAu`a3jfT8ze-
                  zNxdKbx4k_Qux0e2p5<(_stwUfbKvYgSPTKPI=sg`J7dzTytSNS#`){7Pi9UFQ+leZLdrj;rKP$tz2C6#c^}*>A9#I
                  z=bxMeGXs^Zzs5^3xGPo@ayU1t-c_wJ@ZcFPQni)Y?hcUm&>^;%Xzo2Q8BRv?T%mw3
                  z_driEa*`K&?3qikfD*by379w)@5;J_xRoGCP6b|ruZ~bo
                  zFOHcsOa47neq6JM@kM}wCS0t0b6P-2yB_lVAR;jm^JJ|gU0t%zrn)J#g$j7cIq$MA
                  z(v7`yCW6_1*VIZCAI~VwsJCohf=J#0>du~E)Qj_4TNz_SJ`B9;7sp5+k26EH1xWDO
                  zaS*7MG@tNxRs#`WCjQ4lYNIH@GIv|sRMLcWm&N-i<+I07<(y8ALr-0?>QL>O@5$zU
                  zEK{x80{JA&{}MYWYJDbDbqi^ZOP4&#g*}{5-gpzc^1~|ZAx?NvW(ZU|6y>jbD_w~N
                  zCI(Fc?)61=*m&Zh9~a5+^s#rmN4XTVHYbF*A=6*4{n$lIs;Z;YLeD|61?NVpss_bp
                  zeV9Pg#%v>j)@*Kt1^Fnr2P!(v<^2O*g>WN-wDFZWnF}=oY-t@^{3~mngLYKV(N1el
                  z#o5Iyy2e9HDi^iE0(5D@f*Q@a?B_bPh~ygv7D{r|=>I|2<);-rP=~HJS+(2K-
                  z?K@LbQud=GaTCQ4%sUK}PkMjeE}D#B)&+mfmb$upsH?pA;Qn##bze^hur%AxD+G}(>Ydp}b5a$WkI0Y5do@}Poct_VG
                  zJ@wo)vqk2^nOZvfY&^GX$QbkzZ$MtAz5c2bP?fA&?yj&K5pMvGugaNdzeari3iseBkY+jXpK0o
                  zcMH_43ieA2dQHeKj;#~-w?+!kz~@p2HL;~yYQ6XURjDhK$lO&Vv2{CV1>(p#a&!#(
                  zXzuF`o3vu-8(M0}zP5orL==q+ZbCqzr^V>-6NzMBf#4!x(i9~&d
                  z&UlJtM0G8h8nMv9No%`x1;RNr`K60~nqTO)4+MV>HYymb;c^}t&hX&a1#DAqdq^I^Bb-aKndY4>(LAT1vo&!XnVVqc*2re&Fp-f9>!dGM4US{5*+BP8e6qa{
                  zN7)`#la9m(rX9JQ!y*krg-z?YfNF!$m6eycr#WnGaW#hf!o923Pzrgh9@&Xd(Os1S
                  zd58}2xJzpq2ZM}XS&V%pgLjOZG|N!YAt~g6pqjBl3}b@=5{&+3=OmLGY>=bnrQ-bP
                  zY{r#IOx>zKO#T!4n3jfyUH-i>7ty5H7|Tl79st|;k*U|>_vBdB(W!?|F2uBEzuLpu
                  zq3yc)*BE@A-!R}yJ;PlS$A?pl``G3AmK{DEMziNi;d4G|Op??mFR53=Gs099baOoxztNq)Urp`UVX)5U2HioZB&2GKgm`jL
                  zmqjJ|ZCBcSHL+*0lK_lkFz|#Y8=oQkWlM{S!PWj8Gh0-Q{fq^7X3Ef1FMJ
                  zndVaIWEGFiY31a$X?sQ*vyV?7+APg%?9$p7IqHEuLb=p4xsImyyO{w9UApn#OJRNZ
                  zf@HpqDnDlZj{VsZSF_7fth(fJX3#s^I$=Pw8~EWY?m_Xf10acSNs}|uN|Q3E&S|EL
                  z<68@-e8UPAQ24502@G3eJzSf7CBk9xZKq@~>`4lPmZgmU>OIKWs7k3}pm>(d2uMD=
                  zvfR0iH2LF;{Tp=i4HF-TUL0(5afcgRw&4
                  zJkKsBZ}pHvQg=a^L^=DgkPKF(l9Mu?z!OV~O|K~6Ep1o8m&I#ly(=5?e~**JqX!KY
                  z4%p93Q|(vbb%axu8DB*O+x8TmzVbVLyGb~8*k#tX{VTdETW$=*(z9q77(p5)EqC#;
                  ztCF&sEPHpnS@9>pD-pdT<$`%y!J7#`x`7#bt2AfNG(eKy3VrZ51;LBR8whAyP+4vbygUi{S=%R3-1
                  zH5Sf5I%14T+FavUB=L&wN&F11=!~AA9HAdaKecmMzT*@baK5^ICNBEEBnc>W?4Y*H
                  zlI;Fu&G+H!j0TegwhkgfCu=`u)lwz>Wx5&T1<;55);Pu~@a*%+Fpj2QYo6e}g_$Mx
                  zA7gn7dE>vxTl11R`k{ua@I&u3XLW=Y+Ll2
                  z+n43Vf$QrZS~hPn5SxLwbi~YxXipi730HZ=72%zbaCR(Fk0=aGMCkqa2$5su5r+ir
                  zLDxnfDaXd%&EsSCPZPHZTqu~^|495VI;(ST
                  zzd+SGm*EFRHnSqb{k||mURrzdHh+Kpa(L$UncaIKZpbZ41=1I#a7XLNSx=a}YDwE=}$JcMu#u4h^D1J!mk?^ase}=-IssXg2L_9m+q$m0GhS<
                  zg2Oc+dl8usT)T4vHo_b5JWmtU`UgVis5j9cV|gP7GF(}#dB+43D!O<5e1RurZLpj1
                  zr}M_$(OMx?(YE+p3r+r>ENnD-da!%3sbUY$%3*aE5GCEj+?vL5hn4!}+u69IwRvS`
                  z`;~4(dw-e6RO6d`PY2No_6xT$RPL~|*}dJRC05Z~(v+Jh5u54+;i=8bINR0A`0bZm
                  z9s(W#3JBxUTBlAcKEnzmUy|WUfJ=|}Un5I=#`hm4xJSM*LKnt1d13=m+s=WhChSx0i
                  z))~lOdfZfqY(bR~dx<9F5Mvr2{o@g0&wS%QMRJi`lk~^^FOH)kb~)f*b_~W-%4S6e
                  zbKJ!5YN?{~s&@yKlakFpz>Yv*4KiSI;B9XD^scd5Y&xPvICmo#uod^P*nf6EXbnS0Txo10P>(KGzGuFImOoxeSCf&%W~eQ0y7%`MZ3_Ml_DtGiAI
                  zm6~Y5GG%Fs)lp=Fr0Sef>{FQ_rH6YtyHwJ%Exy-nSF$M$y77W{27Xg=(MfGvB+9YJ
                  zA{ccilU-jfAL+Q?xj~mMsn59h(a#GG)=Oj-I)Cda1uJ2XA5OTpKhP$O6Jk=eTc(b)
                  zGH#*~$U(WZc0Q5>HMXQ{9j4^MY2%_SJtgO9;v!rot0sKa`vW+`8+t5W6}Ba;wxPQI
                  zhYJjzm`!;AEw#1GVZHiT_Y5%on_e5JyfuVRB4;QK7*zHG~e>_o1?uQf?}5rp~T>f~|jGZ-T|mrY60Tlo`M
                  z457PqDtcFHpGft}$8B&U_y>9gNnDX=z2!;($)3g=kbA1mihmw1JV6_XtFShmEeF{?
                  zwbiXLL#njGH>B6U&mVGzYQ<+Urp-A0G1#+WfJcYCUKi^tmO3o7ZpC`8aO98n7$s~G
                  z_Oa9LLW?&{y(Eqi!VEJHh*|KQAkmpqdis}#_bZ=vBEG@SR&tE)5Col&&>bQy&*ok5
                  z)b)nD8N)*Yg1Gaa0Pw;Uv~zj?2jfNShP}(1tSKAzvcdMb-_O|oyV*HaGpg%SBl4yg5F(U
                  z2nb#h{5wV!&kymoHiy?I3;)ZBA|zUCfoE;9#qUf0Bo+-38LGLVX~Wk>Sn8cDim&*9
                  z_IRmSM1?UNcH0jtpLU7i7fsH*gRf)bxryj~hdJTz63%ezQ}I@RI_KHLYcVP=row{&
                  zxgX0n`mhF7xcA)ww|`Ycli?x!La(pSkEqh|SQ^w&{e|DJ4)6khLR*@tOTYFz3oY`^
                  zU{_Fh*%R!%9e7L`+Un9+u7TOn7X-OwuM5f8c$h)0n|KWbZE9dkX2{4Gh&m}vjuxh=
                  zEgKviNiz^#Lrbuzuv-p)$a~%;AmhD6&NM$~Y&JD5)F6r%c_?dTca0`HPHv7A_|^Jc
                  z5X*RSMMhF1)&B(wyO`Z3S&yC5JH08~?ASfS4-JD=e-asTokNlSplOR-Ec
                  zA-ylSfvj-7>aQ(gG(P2hEP=9b@A%S=L*V)+t}zas|CTGe(WzV^0N`VGg~&PevyO=iEq{IwTCO#Df}52_`gJ9J;#
                  z9T{#<@79##h|Z+8+)4}3l*yyE{&m4BHroHCIMh!ku7a4CUoJVl
                  z*0ji`MPeeEGV}Z*4gGm*e@>aNm^rcMpg7O~+7f?t+@gc0L3Lvp$!qZv0qH5DtthMG
                  z9en1`kCWR8H*fwK{4<%&d$(F8*gmST$?mrOpZj0Sjm}jSpPjEdLT)z%<&^h;<`Zw`
                  zqYIkrT8oV~2$~Fed}!Kj#d|>ptbUqF`L;Ai%kg1l5g&Dpc1Cg=Zih>Q
                  z2U@)l?y-I1=v&k#c?~#-_P9(I+|sOYlF);O72TDye){wE>wO*dJ`4Mqzse%(Guz%Zo&@MQh49JNPJEDx^*9=n_V!iR|w
                  zGg&+kqZ3-ccKjg3?YUKjZHfafu0yL2bP@dAfd>2suN)@L3W3{jydRD-FCqTD3ji?Q
                  zr8uzHlze8fwYc;SXGENIum7fSE+gZ8#3z*&gS>;D;Y$|BWEEY`C>u7vmam;uXXp2)
                  z^M?%I7vmX^`L1xxlWZ;GJLqDiaYnJ9S|5A2opP1~vSpawa*kcnd1@3dqGW3O)k1*m
                  zpZaV#?Y1JL^vZ0lF<6zSva!v_-(CKX;un(dnBsffOt+V+31+RAb
                  zK6pxR(%t!L7u_VQ*B0G!)t`{oxTAl(xMY#`-s-|b=QwhlHl`klcTpNZOI!pL4Jr+1
                  zLzXCa@dQ!AOdXOvO%j#bxAP&SdHw_|*`s%w?gAdGS{dwyI68{H$8!W?VBhaEw=NeA
                  zZ3v3&zYjkP7@0P4b?y53Sk~#1g}ku)$E6Tq`G@$rN=6)Rn`58o(ohq|ok+|CkDw$X
                  z2zq#aamZ2D`Rd22f$f)Qq}$>W!P#DIByM*;uI29gjMy(HmuOMFqGZ|_Chf?8o9idw
                  z^)#r+;zN~Yb3f1L@3H{%s-kW3ngSVXg#h{Ne$80jX{*_@Tejy(5!Sty%0KwdZ*UNC
                  zaG4`iPV6$AYL)7R8P~_Xe?D8*&heTh=AC9qpe`|%<;t!{wf?UhuU!Xx@x#|RP0(`5
                  z
                  zg2{uJ{!CRRj>0$ClE$7R+^JaHI3#7YuG;KP5Qf7L-{vfuPm%
                  p(y57%;O9L4hW{5=kYwL2;iLB4Eb-rk|IyE?yw!YD@!CB2e*sf%1Uvu$
                  
                  literal 0
                  HcmV?d00001
                  
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area004-v001-MC/word/media/image6.png b/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area004-v001-MC/word/media/image6.png
                  new file mode 100644
                  index 0000000000000000000000000000000000000000..cbfc8ccfb1f2740176b40f5fbc44e79aa12602f9
                  GIT binary patch
                  literal 27153
                  zcmeFYbx<2&<3C7C3xy(umf~(LF2$`BcMTMGDDLjiV#U3_I>Aj
                  zcfb4NZsz9xyk!_By9vo|_IaLmwlWCLN10En5%1DSJJpcR2YAO787{yLf!w~@iqwC-Aiv)TMLg4KX
                  zq(p^P-R2LMklj?paFJG-^R8b>e)D_hanf?V98;jbrXEl6DJv)B+t=5sVQ<1hLSE-{
                  zz1VA^Z27q?^X(fM3QAt|W+uDVEV|U2m(r)6nLFQHPL8dcT(<}RGk8;TqT(&VBnJ$3d=?gRio0Nw4RSKzQzFrb0vnoa2(bC1U;!KAdtkSr
                  z{x@LvW%Qxj8@9yQmxDKODxXYGf}N3-04S8c1au_~&Y)Jziw^b~>KP)(<2!p7nHlo4
                  zx|%VC3#BbMkiKmJCOopz%<+Lz{6yq=Ie)ZOF3WwcVCTM7_a*THuB0oW&%;*Ua!_>i
                  zcQ;SIY^|AZ78=wBW@aJu(EBy+ZAM;8AMdpQlHKY2cl%RkGf^VoCE;szu3f0(Ezbso
                  zlyDcSr#kYh$UV`^JB{^#w)5fVPh;5(g79B5!{lEsIbXh9RD`H8)joCX^66_eF7O%t
                  zpq{MQ>t)8o!eV7{UtHdWyykQHwf1|YB*z%VR!8{x%LNsU0#8_|k){6G_}d#jupFL1
                  z6&+0k_*YS%TR2fQCOn0)I}-h9b>A@f0Lz}+iTh=z;9Q_fIii74Ggh0K9!Xof2v)rp
                  z2j>zT6Ma5#?qYb?Ie{sGcxPD5Xf#@9wwig7NIy*gH-F}0Sj*&c!*l642WchvMjK>ENI9==ZPFk83{8>us^N$6097DqsLsdnb
                  zP1sHWVzq7IYojsJ9r(GdrnB}hluUJrv5t&8`!mCghxK>BR~gr9-CJRqEbxpLaP1=g
                  zRagB{+Xp194&MKr8iT@{dVU<8&iiR^sk(km&fg~a-jY(atoF@>DN(NXci0YE$TZkieUA2LQrG3VR(prr*BU9+s|*2A66?Fm@^-G(T;L`j9p9Fd
                  z0;}l1L#BaYTaG!(ztSGY-(ihWuHnU@G3dFYL=bMWB2y>k84B9dVdFA&ul{2CRhBEz
                  zWVO4PO{NBJv4TIW`kSzN9KLwGPSPXpxDOmKsegi}R^9K@!
                  z;YgkhsWg`f$)JKML*;E8M`L3|By5sbXeTP59pU#rSn2b)EXdTw*Xh83z>o7yR=v7C
                  zZ_MWtVqn0iV7fZJtcRWt$1UJw8%%F-86WnKVtKNd%(D`qw1)nfKxBQ~dB4XbbUAM=
                  zP(aOyou*y=z13J>JaP{FjDZQwJt1UV62Lbx?kaOPD|<=QiT7TwbwA+JttC*k7;g}Had`m3UTXZ{
                  zvwBwwI&06S#CiiIF@rb1`lba5Hcdv4an2O*ecRvvd3)!0S&kF4**kh4=ucN?>`fFJoQ#OLdhLiyX06<{Ze#M#kBfU6Z&y`h
                  z4DaPn?kjB8*48Xf7yEx9zIH#!0;McxE+wM4j?0CZm{7czm%|R{h{p;{TEDEga%|R-
                  zz{az5ZK!Apk^|$?n>yjt&_83<681lXdJI=ri9OOO1O+wp8W{pTLPJ6_Ub$=;e{D2V
                  zV=@orLbeh4I<^u6o6&GR+8jCYR}ieo(_^=i6wAxY%W^0eJMG{5sl^(4ssh%ktmk>j
                  zj{nNoc$gU-L{^1<`+H;@1|`7)SL4%vtYvwQ42`a&D>$QbaJM`7c*|m9X#G&jMO4mL
                  z5s;cnOmt|?>S{_^x&_&*ncuGrFXka!1c5Dws?df{XO*UIw#X=Q
                  zXgju9nVBW!I)l;i^XLx!M<)Ga{V3PPn_H!+C0u&%w`J6Xk(zjC%_b04NFhbLqQoEa
                  zAy46wbz5q(-+~a`NiTiy**A{1lDEIEm`(MKZA^V>zic6CUk?b`?KkS7ilZWvJQ&w_
                  ze_Q_UHa&_~>}3Fy@I&8LOO!+CNp5RqNXVyZ?w+5(xA$*h`8Q>f|357iU2Xs8r)Se1
                  zYkns(G<@$)_Mcl|<8<7TaBS_CLsDM8KXw7?w)gs{Zj+IZ*SXUNg4#Qkl~1QiMEoDJ
                  zlZ;a2Gb7|LoWbz9pYCr*1kQb|7Ks8jXeo!H-ebqYJ>*8LmkGjFH)8nThKB6Uq03^B
                  zHuwWmso_Ygoz9twm`LDL2g+|$0SOn{=JA#{hleCbrlZ|q9&6QW3Ba&_LlaSY3pwFT
                  z(^&B$4Tlqo3`PO>*`?3s;94H3!s8j98n|h&Iyxj|Fr%UA?MRw8K|0?DzZP#!`1R*W
                  z@PTbcQha>Ci7$U7#{qNa0t^dhU`MpyQ1{1oAxMVr=B}KMMh2hnTlD=cajQceuLt4R
                  zvqf&JO{9^z_MMB|1)4YanBuGXHe!loqv+K;ncV^1JCjv$WBEqp{42#-?%p!b%^?kM
                  zhbfo@QQ-SG2Tku~x*5bHm!mFlZOGZ^NV-97r&p;at2+ljh17Mvbw#*6JS=>+QuYTO
                  z5%?5+C#Pl7i3ItFl1Ii5_N%WDwND>q_W@JYqi52$J>_MO<&xT@7{*j|ChhRCgOQ_?
                  z04!3_PjFOqD`Hi%?&e#&Ux9%J?ykpF1`m0ivkiP`-C=GNT@+fBE+;6xHTb>uTNVua
                  zlLNnmA7LG1tf|ABlF=$Pe`#CQFQ_Tm-1Ie6i#G$IS3w&$p{X8PV2Q51Ef-L)cp~`%
                  z}L#byWk@BKz-$;OAl^5lH&*{JI4AyqU|NQy$kFhU)X7pHC>@*s`Uy)RA
                  zrwd>2yv@~`>G)p1*<9fyhtvv1WcLy9$IWEU2?*!EG2fO-*TGWm=loGAtG@cED#nbn
                  z-8Xjcl>ezUl_WgzNPYi$r7nNXl;#bbw
                  z=DzofV)pM|2`Z<23WWL_Xj+bNM=WzjW_>*$&uPC^O(=6|LFqM!vu|rB{DJQD?8>EW
                  zsP9$yodfi?Wl3)-i~b3?99i0bh<;33@W`jLI>E}6aol%~51bIDD!qNucyJ@0P7eD{
                  z>sv;RS}+_ut{Eb8==|!7UsA@EFM!u>lV)=N%ui)1ac*#zbWGLEQHP?*YAWxz|$lLjg*Oh_NOAyE262543_UhJ=%r{4G6
                  zj(POwn=Y)zFIA~6*~|x&nn&}ahoeKzO&s+H>jTwb&yqu)4XNZCj(
                  zI&bNN=jd2s;Soy0ur6lH^#+&Q2#wGtUP2=_dn=l@v-|cBwc!XXg2Jr3P(iAq4N?d
                  z@5rSSPdf&tu6r!{zGJ*sQ1GOpp(*@_&&31Y!nQPG2VwW5M;(7-JO@X%2G@!Z*;^{C
                  z=E|n&mq4!XpP#Ze1O;UN%_w_qqE$+^txB!GKqkn)G($jorA9e$HJ13!L-+A
                  zms{ZR+IKkVMNRs~Wnva2BpCb7u52xWu3X5(qC~TBqDAea6TJ*gy<|lJFBSJ
                  z#(=8=pZ!Q~Bs^UPHPl^Bwnw%*6pbg*qX-m{!^VzXUDYo|_7BVV)%~kkmy|>)pC)~;
                  zygY#8xPH9!fkDe)_6k_blR2(Gq;U1$Ln2e1YJu_jOUL&YJ{y&Vr$R;;+lVdrWy?q}
                  z={IB50H3tvw2{fGmKLJ23MT0x*u_@B
                  z3LLZVGkjYeg>mfCIu^WTjFty`cAt-3zSuUs1kv5+I29jm%h;Kub>TPQ
                  zmW0MR3{XkN&lkdx?%+?aeN__50!i4}He1et!H?PFt4sWdWG#{!NsooM8_7o9g5}kr
                  zDD`}jZ+HX0R_W6+PSo{%uN2hXZ@{{J
                  zxoG$F4K2eGw+Q)CFys~K2((J~nQ=ojk?BWJY7ZB*+ubZ~Ly^>3ZhlX$nA4eJh%OmVmrY@56(xhis>>6v{MQHT1|i
                  zY)vU2o3$IhxLdH?{UrHqvp<0;G3YB>%gY1XLu8?0NWy;o)9PJiK5
                  z{L|!}rHApmV%fcz7uEPJ&jwOAjM&9S1wD{I$`?uJC!Mx
                  z;v;oe*5?OIN%ZQrxt4|Bek{
                  zt{u6;EA;YL&)UNeJpz7cs3aAU2~NTPn0%aB3Yrh2YS#C82MdaGRh!
                  zGKToBOpXZ=tXjN^)1jEd
                  zU||V3R-L^w&Ti|P(tVcouFT2c$NM*X{zHHN6%hUl7XK?CJWDmx(Y{3yBnhocS0ksn
                  zs(8A+>B!$%jhKGf3HwSG{2ti+2jz^&c)I
                  z7ba{+Ia|E`2;x@@4b2<^jJl^hQRuu?FDj(-L2UZ|`slj%Qeh<(jim7{HT`g}BXe2%
                  z07ufLOS&N85HrSqqylUTo34%3>^Hy+#T*-_GB^@-ckbu&G>&udbptY2Xun~~Pb144
                  z4#*Fs?x}S@$vCf$DXm9<(F50smPtAlKgpoZ*lo=OP~nMBJ#4>$F2NzkCw=kGc5b9!
                  zCD8uitJ&eg^ow$>SL+GKVwXc#z*QvS!tmjsQ(7d9jGS|t&bx4YZNGbpuKgAom@@Tv
                  z>{{{1F5vjV^IGOhqNL?7ca(s@`J=
                  zYibez?$e0hNrqFNC*3sw#GUG8{QMbThxa4f3dnuvj{eRU#c{|QM*n4gdd2?^bboJ&7?i>|Ci#^ekt@4s;^wI9_
                  zj)Vc(BdxQ+eMN4M*SnR-s-xK9t#n!L|2vd)(yuyZ^MEgeL6(>N4`w#(*x54l*eECl
                  zqKAxhb)!>)X3BMl;Rlm_Y{+X}pFOQs_ClUpJ_MSxFDkZLQ9R9CMhSv@4TrsOUu`%2
                  zCYVA?*bkeM=bad>86y^5>avFqfsT?&Yc%YOS~^9Lrp74K$Kw$)bP?2I!+C9W_S
                  z-rQGYWoIw1B;4L&lPBiO-3g-?d;Qh^?yRh#f{wc$LX68aZ?K0-dwGBpc(H$yVA14p
                  z-8{2ZV;9Q)@|-4HI{#HmLGN+@B48`n;mUs`wKHYvwTnR>KmvxU|{~!Z9-N%SFXc}c9AP?mvNF2
                  z*Tx8rgYEmiw%6!g5p8*R_QA
                  zhe)M;{*P%}49C7b_G&)Gdp#p#<=kXcc}>JyRrJh}cw{9GH%6Sw!`m}mSxKoL6
                  z*{agMu4M|g$`j;QWdJ$L#zf*#HD0$0mu((+!J6O~Dpb(IfQ$2IQ#Ga^-^h4fMTJo)
                  ziJYy!g5rIzYD_3NOm;CmCbTe2)=EW;hLeuXUi}~fY8f(F5cR?)e@tQHqD+*AP($@U
                  z@~?56{eU3>MCD9XP^9#GBb6zVhU$32RNj^O*>`xOdx`RsGN>!_`Qnnua$Pdc}~r^`$h0;>Eop`91154VUN|
                  zuV|>P{Z>i#Z_D@nSy@mtUx|>8>2!Jo-Vwee>CedfSv)hZVMcCD804zzE34vLiXf6x
                  zN~Kj>zC_xrM_TGf^W$~2o$@0yr3InDruyz{GNso7?G{Y|6#h4d7A?6M{tSRZ{`l6)
                  z?M+o|1KsQ!41_dFziZq4_g}YOAHMg`o*`j79eB;%gD7J2G}Ojeh^nlOuJHj_N&o-t
                  z|MeBPyZ*mg9}LeS<2aY~AC0eH$q%kQcOt`O%Wx+2wXd(bYUyF1u7FIIBsu0|N<^v%i_1DWkq{P&nVHrX
                  zTWmi}WOYACQeXzu-SU%o_;T=5i%hn6>eq`Zxshw{mRG!W%+bf34>vHW7Ibp*%F`>C
                  zZ;*;#lU33k!^7{?eXcw02eq80AMQF{3yhY_kWZFwfJuXOn*xu)Hlw~f=Z-zLLY$+%
                  z(4vgDN*4^bcicwP3PHChDE-O&9C&Y&(nNmjTEBW#pKVjFZSnYP%(bn~3F6u{DqW;A
                  z5v50xQ`iNrmN(cwWaoCILG|%rDpF=Gr0bN<5oJ{n@LhA<1nlOat-u)
                  zK6;eT?W`94dqe%}!y{`JyHj~0m155D
                  zcuYz6Ikduv3Fq6Vx-n)b*X?%gUIlqqAs=ZXcl5YX`i->m`vva5^|`gMYCK4av%hL)
                  z_t43gG3jk^9K*|#4;Q%a7<$n&=cwc%aMBDC7t)2Cp{CSog|2$1E3!bF1eJol6<;)g
                  z*4P05NbT2vr9fD=2aeu_qx?SAhyU@8CZ&YvicrtD94GweAQJ(VyHOV&?lk4R6&*iE
                  zN)O`HKX83?5xqPiJYB{p`|gdR7g-WnWl}}Sa2Sc9+T-i}W}>w?m%g8gxuUaBIDu6+
                  zy_Xe&&1!M@V$!}d;7WrD5QEkzn!%cVy%!JCib91^
                  zEwNbmR+5!W6O$#&W{ZOb9XL~~X$^Jx-Y$up1z+*w3ECVAm%8WWiHh<_65CV9FRf(3
                  z{E8_yM8u`DGi02xoul$bhGV#25i&PhvsatWQzKjII8N}A*1N74tAVEdw{*f%CmG!l
                  zE23P3kF{8I)0#ic*&~hGQuE;x*s3AjG9$Sn3lFotr@R!PcPc{^pCpgQx4wtp-?6yZ
                  z{P=yo<&ZoB)lS#$9vA`9S|l%jT+4)Yr;*1z)5;14L`N^&8At1jWc>cE&}d6+B4fq{
                  z9T^9NAS^F_Y>8`^fTq+I_a*qj-GMikN#IXwPC@|etKhy7y}XRpH{6fvwKG;Q`#`s9
                  zBN$bxb~UzB8O>%j8;s*jZF7Dfj#Q-Ui$de;stP$36NW#f(Y=YT60V}`1@zo9i?TeB
                  z4}XdO*2xQ;EzB
                  zZE6w;>aB2NWxjYA9>Gz4A?4$AQ2BzR^qw37g|R=jZ2i|Xl#(bf$m)t!9i){PTkpun
                  z`zLBT*A!~L2L$~tiz)2NFMwqIDh6lj8Sd(HsS_sdN{=RHVuECQyDb$ypt$M1Axi7b~sNk*d$0lt5&~@%l
                  z4_jkMD`)nO-^3tvs_v!GBTdb^wK^J=oEnkcAv}9U
                  zRr#mG%8$L{{!f&YrbB#2IIDO)$v6AnVAb|uy_Y!*vIEh6{Ckj!e6*OhZ*+HGV9BaR
                  zqj|4S*4DC`oFFG?ovwN_J)|&Z{ut||N>@E!Ptha=A3=FF;fb6%xw9)zKEY8le3RED>7nmOZ0nUGbZK}6LV?GCI}^99cq|-W0PUyNrYKV
                  zb2EqG!lkd_N#L$!2zmi4&E9A2K15vRWkY@7?7c&{C^sfDPfWr05+>0_fq~9>Bsl5%
                  zf+(`aR{g8~Tc-{q5skLj!i?yEGAb%To5#a^r$%wU6$W{!chK)%G<=V9o&9T4s0
                  zc$fafj8T?kiB0%@nIXo(8DV~*^pOT%!Q41cFKBMBk{Du$eFBS=p4-@V@lE_X@K=6m
                  z#&A7}V|++4Phx<-zwSGmfV>WgH11_DscM@90RYDMzhqC=_(j=
                  zu>**W!djC6>FQd$Wd~?=br}{JNZ0NRTNupzBz;3umKe<=vm2B
                  zmU7%MF>00`IQBYUenPoC3=@MmbTp=(n#aD*26Kpokm4ZmNw3q74RO!6w%>TV)&oSE
                  zjwG)W@=j@5sih=ym_TwhCXwP7zjLDgQc&sjkXGTqUxKOQkre4}<_#r}=I@u;5LyWr
                  zWD)Thwuvkf7=m{L1#PW*BktG|%LQ(xjHCOxVE=mfO%Zm=m%&ox%hVd%bUpP4nQhK?
                  zLh#2C)ucEyLHMOz+c^$yX5)x*5V~YyNyOOzITFpY(n#$PSYe)|h4T+`SpO8A18AU#
                  z8FN2=Wx+PFL+iw!AFN(x=QOg$)
                  znMl^s1)6djOrldR69&E~BEcOfSy{V@(he7iE0}MG!ZQTID8GF9h=_bLdhp@wtp9G@
                  z1bMAoqx&AUB6*-K2S(cZ)U50PLp9jqFaMDAB67@vm)O>SJ
                  z2&olI@~+vRTTImDk@7rEw_+3B99KDCeRw2p@Je@{k$-w1x!K&1zT@Z&QWce!Mx~q4
                  z%mZ^JC5C2tEQNIsVI}vIkx@D<`D8*MpCCWSJG)?bJSaY0o+)2iP6A6#sczSSH%>EH=3g&y+0g(w9j9$^r1eN*
                  zP=p>v4#U@%QCn|Qa#ymf->8~|#2bu1l0)ywpAJ5TtKs|C9#}{k4>6p&W~+p8bm8+B
                  z;KjW1x)gq0WA!n*_=wx-2I-K$Kuh5INWIp{R4g($BCK`ZMYsF_p}$6Q&(rLHz=cdFhRIUZ*lEOqqts4^MD{B1qe}vpy1of%*h27BMY78%WqhZkS~%Zu@#?C
                  z#DiM(gw3L#-jZC~?UQk!lX4nIm;6N*R6zzrX>)r?p|WsP1-aIGw%I9R@7s*7d~IwF
                  z8O8YJJ9dh>L@ibne2h)+(fh4emsbw5j#($w7Mr_g7Ag97x>5QZ5*iH;zeD9F(FwWK
                  z`AT7Ga#WNAIdr~!ID?x*8+W1*u>ex@T}k!&2a^63^0|-rs}?^L8w6uY17-gZHxT_H
                  z`7SS5hv|nOC(EV-$soZmf>S}8vEMx`WqoCG^o*DBB85K!a4#+q0;tp#dlH{J0b?bA
                  zbpxY-Pp@k5oRH|7&%1Fr7EET(#eMt*B4VsB@;^r8VSG-X&xR#Hhv7pF@Vfuo2-*Ld
                  z3;1u0;BtlRx+eNwOgk!Mqy1mnfl20>>T!#{(rqh3?uQ~5m!JpKD{;Z6p?Esh1b4K>
                  z(%`}oI>Zwp;0ZSBz?~vBpW9*T$}(FSy0dL~Yuf&BT%Fp`U+H7?2C$kGv%TceNWOmr(cLB|
                  zjRA(n2j=xqAUu|w8OQg^^{`GYGj~O{=vHyTX~VQxa3*Qc+R#}j-4-eoRDVN-wy#HE
                  zHoP>xQ@d#IHqfQHJp%x|zpeJgd&fxfWs*grEY9n)p4ZS75|iL^WSUtj!7U$ds$2B{5;9AkUtOCL*m`Sj2_
                  zkCxxn#EHYUVMeq$m+2|L78^7YDX*XR<}0IHXGS}TPL%YB+JHQP-HtqV7~s2lA`YZP
                  z1@7LRdpHJ;j*%16m7EB#a7m}wV)I!p<9jpwB)SJCQ4QC`ypMRTciVsO0&0KyGVLHUiJ&IMkg5YR
                  zd=T^HU4;7DRzd?GA;cU%gyNUL<%;FB-ZbQ<4oy~*6ZZS1KS^2su8_%A3d~Ix#N8RJ
                  z*7X;Yp5pUo4Ul{itJ|&(ak8YCYSWmqj_^?G+?&V}*|;8=+(ci)xd78`#~&BdrLzzr
                  zqG!+IPXkFX1DnaiS?42L6Rxe{j`4R5o?PAgx79m2&eN)0Jyh$bF@)UCyr>79n-aN5
                  zLHFxv{5bi`NoCK=Ewn_|yyZPRnQHAfBc&UW9w*YZzRGGcTZQ|=Eg6}u;Na#4ok~Cm
                  z2j;Gb6<-TKwV?}x=j=DcKWcsu=r1F|nvkv)(Z>QU2wQJz=)#Kqj`yd&1Ns7rtP;+C
                  z5f;d~O%(uIR@!p}`Kn*3s6G`dat71Io&QPN*fs?RP+*1=gK$9m4DA_=M{uJ`SKpsZ
                  znFP}?YY^*iEeN)1Co7Tfpk;|*(+47655)ISfiQ3(5opWex9rlbPNdnRDNOZtH&oB}
                  z2Z92qph9`&w~Nm7?gm8!Po?8E2imSW63)~P{Yebm$=#f|uEIKZXQpH=c(FnI^!6r@
                  z+x2PMd%^58S(_bu2axztg7mZf%kY>!Tiy6rFJOhS8e#4`W8P;4_$);(86>kY;z4Cg
                  zeOLZ-rgJ7uKx<~yxn^bDPrsAyZg^APk={p
                  zu+@BSh}Bi9rl6{t<1WOc9oF8}FJX7-MpaVsaUu&ckbH7UKW1%>Q_lR|K_2%F`eZ1T
                  z5@b(?>JPTcE2fKO)iD;zn=Qfwc}C{{XbdDJ1yVO2fk(Kai1TZum$;noh3g=c~^IY{Ym4awy1{xmv?vQ
                  zi$My3bh!Xv+}@!!I(LBN+?}ArMUt_MqO%uFbBy>(q+e8)WV7Dn>dZD&rr+KIHc=ZM
                  z==0E1Lw3a}_1lRiGn6tF^f&L_pW;~WLHR`bOyI74XLY+f*%}M~B)1~(=rX_fU=fK!
                  z;m$kvOCAezz~pLNJb=%)Y$Y;nSz~C+QpJ(q>p&}@bd-k9s}%mBpESE*bdLH}fCTVR
                  z`9Kj#x?2XLBX@mH2=4}T1#ie&8-nYj*YP5golEPCVuHA`CTuXZSCLdwZI*3=96!89
                  z*LEO2d7A?;a(xqto60-0u3i5{6-eCBpwDOAR;uniJ4r#?ei8#;`gNPH*W_y~iGK)I
                  zY)PAOf$3RU@ok}y&gL{P_od6r3){l+rPj&i=UwK1l2a=YXo${|+PSd2BulpUYt=1~
                  zuiRtWk%Cnj$zGL8pWVUTyt!bwjUSYS2h2-%p-Ql=Hz+OTFGG}1RrJ=C^bUJ}y=C=y
                  zih`zfeT7q7%zpyQvsS2KJ=*qMOGwZbp*oT77l*ivv>v=sPpC>;1j2?LwU!Xp&872_
                  zsr9JsBenf3k>+W$_aB)Bz*@`>%05Dmcy&k3rbSt{J*8QF!iDp^uAho#tQ$G%Gr_;_
                  zUKWr+=|YSh9BL*G(yCX(d6v{6{mRB8$3HPw7z+c+`F_ls{)(J*)<4%_;pK;Z%*cq`
                  z{|$P#Qu37=o;11NsYcr=QKA?_CjSyqL;m*_Jyvl*2<8esSmCt5T76fa0^n_jQ&N=A
                  zsdd&s#(MiP7A-uF-}h#(o=)-Q>Yf3(&Ll!mZ5~PF7Zn#R)pXLwoEgISjQ+`2`23*AD6@P-M2gTYdOkQWb(upNe4XM*gN$uEU
                  zvnfrvp~>0rwZ~NrGF{_ubx=zaADne)l7TVFx-_4lb_x*EEKz&g5A^%)dMs2s<4=KH
                  zWf@659r5N8&(l85cMkR-Q>xt_9gEofXz^hn*aF09-1K_L8Ch9fLDX){A>8hC%3SBN
                  zamGH~=Lt!pIU0UEpQH|M@^>cpegF$BB|T-Y!gt%wI^vme+oe+P`_mSOl5Ee9_V!Yk
                  z{65Mnk~-0M$&vyzOANFM5`Qw|4x`KTsw~FeJ?=iDVrsX>A0#d?P0U?DoYXUo!TDoJ
                  zDe)ti6FA-BQoKH?-bgwb^jSjMw_k-+{DY09yc~G<$l8Ym2@4chYj}Z(%WvDl8EOHuC;ZZ_=Z3!xx38j^(9)$?uXdzQ$@Suac{AI6qM6so{#MoX
                  zqMzKmlg31~i$2a+aJZCN0ujgmc#*hZhr>EeLJTseYFR8ff6u*BBRD3vVMawpr|E(*
                  zU78rUceOrII5{@=&i+m|{+KNW;j_RmRF7TeV;s;|Y4XpEe=2iJ|6Cu8fRZjR_hDkr
                  zUnh%%Z7%Gk-Ksm>KWx9^muB$PS;iTyJsl!4*RH3PKfARF($*(EZyAd4IqoBEB=`J7eWNBc3
                  zmxc}GmfWh
                  zEHy$VE4^P3sU+NKog9z;QNs@;*Z74w)xc2h`QF@5M+H4=h;H}$-y5Ro$GHK1+r3QO
                  zv!oPTjWgIy&^u?Vm*)>Hj=BS1_Gs8*&Y|D2Mx6AZiV1sKi~(2^cyZwaAoF*@K}%yA
                  zY2n%`z0?ZF_tzq=gjE?VwP+J{kGu!*Hj-iQ=@4`P$+FRjp{O@7PonCWviA_;A>WfM
                  zDJ~rl*X*vHdFMzigG8hJXJD1K-$fFpEt%8_2!76*a`NNjJx|>=%k+pM)Gf&*gdjvs
                  z@vZiKQNHp-jrvQX(wV7>y~2s?arG44E}vEXSGr!-xyLYi(4q|TC*?8I9&?y53dkx{R#PhB8A
                  zXBu>=kyLfl3?$vg8B+lHzsLJ0Xkb<)y{-7ZBQ(S1*v5rdjLAgN1OL@O#YK#E@!G3~
                  z^_~p&cX9_FyZ?|LF@WQ(Sm_mc|MGo|npkllq3wZHiKLXXX8%S_53c0aO}BdR;1<{f
                  z9}Wn$msE(7m_*Hy#X=+!xgTNn>-xAlb^BIei%*S34vLLfoM4*>2NTESq%(k$J9q9r
                  z85w~IV|;r7m7r>0*CQHmXe8Mk6OkPuzu5|A_YQN%TLM9Vyvslkbc6
                  z-#${;f0zk=_oYU;5$0-N2SRU1ycS?KDY42mZpye4*GWW^1%eG0Pi&GY(vq23HF?x5
                  zF<}RqZrY9JTqtNAs<2MBfRXyIl@i^kJe3AwrT5$Yvlu8yRBy@4<0g@Oo3+fGWXpYd
                  zVoVOhJ|jp=NkIdg)s-r1cp3U}d0RdvIlUENnfS6(bG(w!4p#01fw!-t!t3OvD*Nq(
                  z7!_2dUcgYOMtZxJO(MicUKM-glj`-@=5vWlS4AJF-kS1|>6R_Hy?)`Yb7FZUjk^!P
                  zOOZcl1e$-y%bhP;hLqJzU*ZEYuvF2|LDhEGO`>eW;PY5!F+
                  zffrklcuz7vT0;rTZgorJ%Os}t!v2#I?SwNtd=s|8d!_DEd`!3MnyCvykPeNrO1~4q
                  z)c9#>UckttI+|3LWn5@wv9fJnRZ>NL7NM^~H3LtN@phTY-T0@y5>`3r$PYin;EIDM
                  zHS;r>mC{RpY3MP~BC)%*D7$@ROx>AC+8~}Ot}OMiGZ8mt7!iF5{9aF6I
                  z$dBngm=~pl)b1^Kj6f5`rM*AXEQR25+*r_*KRB1Y5#ynMu(5fxRU}{VX=x=rG0{S3
                  zi=8DR{SWVBJ=4$4n|A{ARHfWmdY>3RM4>x>X!_xzBA|Jfv?5zJO7FgN(&^sm!1fLx8b?$xmx~;KgYHe&hR@x*Ns8%U
                  z)Dn8>v>q`X2?>#ci0$!-Pz*X{-9IOxB2m%8MDszM`5+dA0?oK;LBtYq+23*tIF|F
                  zu2-`$RTBPOw3Zhlf-P%k~##pL#ung{#~7ERF!RGcdiaNxt(pza~ZKfA%~{WK7wOE
                  zf3G`_CD}1RmCo}t?g7)P{yZp#E;``P_khaTY8PviO~=1++tW!)3<9xJ^$`3$C*Czsk1`Ug`*j4Hmp4?G6+#Ep)~w8>^NipuprMeF}ACWBhY_){Pu9z}EZT
                  z%K!Pj$@&U8E?4usr(@%Vo>%MNDNtM#+Z(tNxWYXJJnU|Y_#Xci{fu94QPJaXh0<*M
                  zKu_qpdU;sXuwfq#$N7P0CI&nCoDP
                  zpvivObCm)6DzSaQbo@LU82@RzxR6#3>0*FP3Ez^!T?HR5_duG{3K)@Us6C
                  zZ3ABOD;D{A7U-@V`5v6@!@A*eM6|NJWr%TrvUfg6OW`5?XoMdZLU@+U`^eqValE^-
                  z))z(t*v7zpFcd{hY;`7mO>uhV;I?T(%1z`Sw&kEdi;Oe6)$p?30nS-6r4z8Soi;pq
                  zKU0#mXKKt3l&!-kJ$Z9viw}37yw+q})Q|rz0wv$4dmwA?y>JW&+uOGQ_Fn~xA*Al4
                  zCUZbIc9%~G<}+Qi{Tt}cWq*VJ;&$hyQ-R@eoxQ6&K^wZ{<*TF5dWr9vu_r1znEXAp
                  zX_W!!{z^>rxI3HN18kvudnChGZAD;acvu|t-RJb$QM~u+^=0$hBtsUB+NUiV7r+H>
                  z@99Bm@%%U=#KbAl0tTi_z!ePvh;cUPqPa+si54h$1?c$-{VLjh^~Ew4*V`lUYn@e4
                  z)2Ypp54zB^3-;Q~#%NXs^!N(z)YM$ScA&-xXzpsOpZmW!-km9ow@J5MaYr{B7T<{4
                  z!nNCTV31BY9ba&L0!l5%t+Ce8t1@h886+6HbGga47`;u`KR4E?J1wax*MQov0jZiO
                  z&}mkC5kN$#lU-s0BaU8h)+xW@N#dcbHiT0@J|!nN0YxZ;7G3&^rcXXMd)&t~1*;Py
                  zn7h`cfWmFC<~j&_GVCC)vH0kxH_6IV6p%H|i0JI6kBTR&L&Uc74uL4Bx|%q{GL`fS
                  zW6nw6oTAqnz^u+!rP}7U&5x$|oBc;QI{>%%5QcNs(HNor7YHTMsb7v=-^4VLr}ov|
                  z?l?@}-}RJsJJ;<3Ez?RzBR(7G#nkCU=0d{-&{vd8O&_P{
                  z{D_+>_VhcAAMz;iI2|zOYcWJ=LFCN39=f%8BdPR>yb($JtJzRgY$9T7R)noqkc3wFKB;*3e9VSF0M1o9<0i8hH3bdskL+l$%%lLhGCE8Bt9
                  zNh(q;KmUN}x&nQ$A_NA^#^xG%^kv!EUx;(fw&`xM~o8Q9te63wMMAsEcp(W@JkUmd_ukjFHL3;Er(olOMS
                  zt6RR;t>R
                  z)6|k?kTrjK6C^g)uOc0FPv5Z&)q#!e@)32`mF#7&JYE&e_@l$A;wvOfhTm$8=h-UP
                  zwQmGJq5xSc?h*uAxS8GK9kF-WU8|C`FEdaeH`l$oW{*6`JXWyYzcjkpPtA1$>T!1$
                  z(MEQzhZ*Xz7+}x}>j|GCZ=4RdW&s~Kmnp~?aJ~xrEu;AC0
                  z=#5=)S}h0Jwz`TeB-+n5JqP$ye8=MRdbECn{eGsjt^IWZ9ThpR2glQVX&qZPhSJ!u
                  zh0aC<3`st{PU&DM=;jrnHoATHYE-LQf+5@SqP?(a7fu@VG%3YcXp1-_nZ=zhjmRHd
                  zSf6`xz&Z<0%8q4L@4@n3*3AKEeC-j&r*}UJ=_Up4T6|jPSj<`p0|Zn3tmc&M)^g|*
                  z!TiCamcE+AFfB-0rCq-m&YQ9+*vaHmtFu}qk->nk3
                  z&r;}xV!}1Ls5n7DjMuI9q`h8&U=laZyV;F%9EnFwluyQ)Ogg%+ad$qnl)W!JoU~^d
                  zOqvPObNvaqer+}1sPmdeQ8l|)1>2s*s
                  zJFj6K7jdV(y?0`vFR0%hD_~LeKyspwA}o4|S?xXud#gNgdY@@SHdU13LO_bEs$#<-
                  zrxusDh+JwOp0XZ(QCj->tDLfVO^gLd&XRFq)*^+1JSrtaJubX+)+pxH-FLY$wRWs`
                  zr3K~|```kcp6lI3zZ6~o*qyah3F4>PPt`A1^&G`JJFBbwO}Q$Z-?F!GP*!2)@U~zD
                  zhoq#G>=AN+;_TY$6^M$-5pnp|)BC@b_mx3$L~WM|!5KWbg#>q(03o;pg1a-gySqCiK#<@%xVr{-
                  z3xm4{cZY0~efO)~+F!d>`)jABYPx57`dZ65&pprSQ7DDN0O96?1;o5L)hfFG1ch^%
                  zt6lX|OLO0*nwIP{?t{N_<|KXJrsDulMQiF1ia`Pz_cysKsZV%?)uCAtFmK
                  z{z%!m@qmp)8Irl6ANT+*ITr>xSV
                  z8qspo+E9!-{8&l{y7G!BPJC23@@DE{8CMgdTIn0;5rH1IW3@5Vs}~e!3lvB)!JjJD
                  zMOKIzy=Oc#s%zaAd_~=Tyej&@?FZAMtZ!HvTwOxAG^rjq%al#GPDO{IFx+mv_wzGB
                  z9YgF1=-?dCqOY=EZGAfE8gNb{pEWFz{*a__v+`38I)Da6aC3Lu_eHa))nvL
                  zMXx;2aZ+vzB4iwzO4h{16eXbc(nzd_vm3NGG4YgoI4N$LqEtT~@&zq`#i9X<5jPo!
                  z;sJ_z{FGbBO%u@vY%M?wU-~|N5om~n7?ln1Q4^t=BudAAQnuKEjX^&78@G;(j_s^2
                  zOvY=d=q7zaZ01=z)Le>-T$lrTh+($yUYxu~70G~t{t=Dn15Um@B~DP0
                  zdG*3IY@Hwzog!^XJ6Q}JTe#9Hw;E7m$iP-Ygp3!U&^L;bF><7qp2&Zn(6#SqUbfT3
                  z2veUfLyt7D0i?BMo;ALSm+c$uVuAL2{Zkh3ed==(MdZD(+@D&%Qo=Wk&@&ym&Pmd=GPAxbJpJL%_Eu_c0bTO1xnh9C)
                  z^!D79Lb}4UVz%adn6&jTc|TzwP+SOmS6sOisgVpHq#so|4xF2M8z@nHLkTHrB9AuI
                  zOj4fsl;ofI0YH4Zn@}&Pc7r*nwXoj4XSP#WMMzgCd*#z;*xq@>xY%cE3j5da0s#
                  ze{OC|*?tPK`{tl+7j+z6!G91zfo{zLf#Z&3uKb5i*I4p*g$j~MaT2CFUlALaeieCw
                  z+Bas+z-+Q$jrzOy9xgEPwGiC$QSE~)(LBgdm$(YQ5S^RkH)$1>0j`qizx~l=*3@AA
                  zT$prBvSMjfm20l=(RXkk^=vbfpXo?cjB%Ksh>A6copgFh=2014Ae}v0D(c+I+ZlP9
                  z{aouIQLpI;S4@GrMk+gzhxoz&ggVW>UsG62F8zTyJ&)lBcO{uf;-SE(w$lLciXccj|JJtV~BBd9JTpVBn
                  z0cXR6C(L=)P<%!qgk&fsdQ7l7yGaw!-5Wfxcii@rgp_hmo5ttB1SFV*0JB5BDELJI
                  z;S_b5-6|6W4`6L*)sgvQQ~_kRWSmwKj;%RX+#3+1VlZT;cu~(7pR1Snap}VK3sFOx
                  zpFkCss{;E$?S@(sScL5
                  zlhR-AwwpAg*VVnR$O|a-1$mE>tPUl#|$G(ppLa7J}4S1mqsa;nkWdBagNl4
                  zbF?xo;_WvDAuy{c-bp%_nZ-qQCqsVZ1`rVu$W1~qlGX3`gyD^2YuCn!v>wfSJ!nJj
                  z!VCf
                  zCOne#Ml|n|*oR6Y(*#e-xmK@79D^TC&%;$3Hocy$;}%3VV5ggWOUdk
                  ziS`q|m(&M=Q7+r%BIc+8?jrY&
                  zgon>+#TIBChXL-7(_@f@^N~@LTc!Yp3nqdSgIvN5lqj#}P#`d%?
                  zc_q&V^KOVQ-T1#*ZT-(WDFF&T(txP^yjOtZMfmD&M&I2pWTspH=dQgX=`+BU
                  zr45`1=z)s3W;W2BjXE>B#*c%S%urz7QUW5jrBGwnh8B;+`%`{8HAz
                  za*sCm_S=%+q?Z`}_-IuOsc1Z;Pn7%nj`HTwDqyaAw8#kpaqMhdjL>x=TF2G`ib!~L&-W-XpXCr@iGTYkcP|%I!
                  z8(mnD3Fg~87a-X1lA6xPT`P9yz&moF*PcZXk(e0?B3L2ba1_dq6
                  z_=m$1ooj1*O?e-@BKOz)PS(Gf77SR*@h1D(l3;BWBI1>>d8VG}0GHVG40vh@#
                  zQqRwSpSIOPPoJ|K2+Dn*3QB;an{MKS>w`!C5lN@QS3qyWFbaYgIJmW!BK
                  z^3^RWfhU_&52;Lw3rHfs)^O+Yv&`Q+(dJ?FHW#f}bE!yJ>RE;#%mm5bz}E*I-Q6d9
                  z58_{3<-`dHSOFrz8qWCBFlhpSIu9Xd*ta%%a_Zc!RUBmXwSW9+d312XN$Nh}|+C6V(T9
                  zHPeqj($g)GTfH$*_gnNgcUD!1qk&@Hg|WDU_GSiA#wg1$c&w6;Z;jmQkSnB9?tUSu
                  zYor()()dQXI}46UP^Ogse7G~GBo+r%QhzBjT*v+};lRV>_#`3oBcUn*KGk
                  zdAuz2i@7C5p;0y{{bm^5dQC$HQ~vELqvcm&BeK@wa^>ySsB!s~C_od)DbOFZu8sq4
                  zMP^1no|t)q^2t1?TVi7(`vG@u@n`pxa3pkCYm2@E99wpG&0DY|>}IPnTOWO-vZ^DH
                  z)D7*`bhqKbxam$AA4n1bDtY^5f`8*YfL0bMmBSx&ed`PTT(uS^Hy~f4EX}L696zoL
                  zhvrgO%cA686r0+U$3Piztmdmw*+9ulSu^l?1wm(=m7Vg7Iu7C9gRSvG3z=2LFdYcad$Fcr|;B$Ncxb&{8!ueRMjiL4Bi#=52^@-olAD
                  zJ$xKR%lbJs4W4uW&2UkZY@ts9F10BY(V|
                  z=R)2%_&7$Wr)ly002`;4CJcD&cJOOu7By`glL&v@%|1cVA0
                  zCnb$+Kw;K%CVlguB7WIxv=Gx%N^m9XZUx$91W})1y}7BbhiK-*?n9ZPO*3h8&(WW7
                  zL-U8nHZ(^_U^$#6R8^UD$@G-AM^o@ZNOfB6Pft;UB$oOrlS+ULKSDhpN3@?@dLbz(
                  z@XXgYVxje<1^22I(S6NixwPnJbDgNhdyg5*bnp52@P3^T_a>GUNw&qKb`(>x_&A{^
                  z*j4wWUQITN^y4xKh-@$Bs5rX1dGM@>Yd04yZ6z>_qI#AmP0m`R?ACPsQ9yDnfEy~3k!^-ld4sBFRriS=#y_0MCv-uA84#r
                  z-EkUhOylCJy5l;FAsXFx8TOxCHmKf@QRdjnk=2c76cg0MfHxWmE9)kGaoV4+`F-y1
                  zzAx-Fw>VuYFK!Rd7je@hIn*m!8`mqOYxhAdT`LVXDY3v@h|hW?jfqtXcO9h7{>JoU
                  zA3l-4!D%Btbj-a19kK
                  z#1tt`Y3F`9uH9siDH$0N4!E>MJ61l?Rec*BoJ=`?6B!fU2)Y#fKn^eOPkXo(<$
                  z$$ZwCoz8>La7$iLo5JAYR~mMKr3PZ{{we#6;$3)n3WbBi>4Fx5l%#g&+&Ac%u%KR)
                  zk8=lGC5WiMp@3Mp--UD!IvTp)76m=XQPEZXfmT#BZ?;+hqw7xQZGU?s+I
                  zbhEFE85+}Lpg2LExT{tMTl|oi!==Y@71=P~sY+9ElU&K-R*+G$j~$uhS5IWm$6AA7
                  z@ZAq*RV?M&(ZSFBgjD6p@EPy%Css&q=)(uQ&&D!omnG+h%dyscS!BR;pTG^9kl0CN&^P1S*&?0_ZfpK`NcbMM;@$S_^;^T2X>E&cv>~q>7jEOEO
                  zf>(C#kU9Dm?XSIZ9{1sdFnYiazFbz#K^7`s=$QQ*3Io~1$&ETS;Tu2DeIyXHX^txS
                  z_LO+zH*bT1IdUi`XLyO|8z0(}+bW=18Z)Bye0Y;V&YFD_MlrE`zfm!^ao*H!=Tyl;
                  zFrh*bq6weST{_=iwK2Ri^qK827-`;H*1E&$3Maykof8Y%@$i0hxlkS9@Y2
                  zZo1^eH00O{OI951$wfq`=BTiqg_~QXhRXPCQK7AH*SA8jY|K49ike8iZ)}E`U9gqD
                  z68`c^;fe55WAVc7QIamia43_fKIDAEj${?kz+5Eiy@I
                  zdT#5A2FJ)wUxl+zMvPhF5_KuNzI%L0HIpEcAHfr)meN2!D3}0+7B@t^00F8X)NDGw
                  zEWV4TYjMASAMLaqZ1BnBL<8_dqhbYajt3S$`zK=C1<6LH8`ke|x2IkA_RicaL}11;
                  z_VW3`;{sanp4YwK5o7xD!sUjU^?(a~kkmThs;Wys=5j~BxpM@GsbUF_l2$hCrjbT=
                  zU}8fOXnsp_vZmTMQ%gdS806GkQ~q?=?6q6_PT_k(T0Y3Y*>_iX*g$BC+m71juK-+K
                  z22)u=UJ>>%T`UB_NRw^TKp0DOg
                  zFkRVYmtWUZ(T2t6=0`BoFkL(C+F0j{0l4cfPQ{4UKo`{iQ1jDDckk)0>K>u~MyNDJ}e0LSq$vCfnP!MR_+0e=T
                  zzVWy}lE;G|&D7kAH%1I;M&;WLh41o10pLNd4EYiF!@%5WBE@1PQ^_
                  z7P1tnTy&9?D5=R~^!+;1J_}+5#VKTIpDC6neIIlvTuvf6b;gxAGMSOogwjJ}
                  zdkkhIs3S@%ER3mfdIq=ufLzYRwNoR!^}$QU?(QSW&dTmQT(&I%wyGK2I>W3WRn;Bo
                  zgi861wfWWr1_Sq1%F5_W$L{cA#Dh9d1FLw<
                  zB9QaIm0MkbZK3L_DxOBbJ3_{|Xe}H(L_ba9iH$|%PQYIMF(hgsQc5V4)uPe2-79AP
                  z*10|j@~HeehtQ^Z3^t43#r)o`ng*u>%WmLvA$0}c-%~YGk6iywt}bxY
                  z4rUUbjJfng9ui_I$1}6J-EyDcyW6sbV0feQCvr_j%$1h5%{Rjaa!Ab7oaI)uAl)jZ
                  zu0d%y6E^;3N5<=zR5sSH`CGw(+)7F{3H^mEjqS+?t_l5qzjK2MW#%k5_6;vO9p_s*
                  zySnkWG%>ClD=~L(GeUz8*k&yfcJnH$PP5Lqzy210=!pFqjs@H1Wov8jaZ)DX>DKk=
                  zQf{*CY_J_I$I^_l`cxDS`Qiab#$Sh6sj7rAJ_+RsIyrW`QW&D98OE!OkS`sDYulJD
                  z3fMgx2T$l)y3A-*Oy2A7b
                  zYkxn&=wxx?AAO(+?p1p|=eYKf3gIu+8-TgKd$eRpB6oAZ=PveWf4VLkE(sk$dcjqQ
                  z*z070WUk}mAJ!2jy=xj%Kw&TVzf1IXcg@u2R4d|Oh6xpLB_+UkDMv4`Cz;>>h1wc)
                  zI0N<&Z61EfFPj6T++
                  zx+fVi7S>10QQG1MDCl3E^BVK=x3ipgNAcP1|6(tO0zkFI2Y;S)pr{{s76Fpz%QFHT
                  zP@mwBydZ3jj?Q}vrawJA9fbhs(X~~C?sNDw4CKyVEtuVjy>!icnTX-opG@RbTsV;(
                  zA0ta>c?Xr?-(Ef6*@xqBW&w&~drWXl+9I+Fh8F`=|(v
                  zOHfDfU*)L5bCqxSyghnlHX3){Z>eI+42Cw%!{h`}`hlzE`oSh5I=Ux^?MAt3I}3SB
                  zdC>v3jqy8xE(7RN9Q8`co!x|_AK)N{!`JkU80k?+;NtED=}5T9aeava&bb8(RwsE*
                  z4ogMV^orlFUr36eZ4(HHQB0R@21Mwh0gx!bqQ5ppLh5rqIXxd9XGv05quQf^B{;^I
                  z{yp@{aVH~yL}xZXklM;>6pBppp;h1^KAy*cpOo|Ii{T+;pGNQNU#B_Sj!02TECTWt
                  zaHXXj$U;zuFn$%1zcTegM?5Z9W14C*mFyWt?jRIbX$i+VmtDJ&`ItOzx9~R0V}26u
                  zo>7Fy6@A6;Ja6>WHhY+fjlL^YLq-h{Qia@7_)!E?!RDVs79
                  zEm^w_ck`-eS#mmx(&)#SFu|@rX^jX9a$;+h&xrO$DBrBJ=bS8y=e|cp{x!LIe-7Zq
                  zU;P(y*=pQmwYEyHOC%|*7am(y!l+HVmzF>}eC`JNtI~6%4se^gd|Bs9LvxUh?cv2=
                  z!@o&gu5rVnqGU2Hc)*M3m71l)wJdicrdyfl63mh2AJzL?Jajp
                  zAl2UNrpdd@5;pys{Plgoetxs<9&&5dK8L4*G4
                  zR&#EXwV4SC!GBIjIFHcDYVi1kD>k64oRck{Vz6kaj8247|GFyMy=NOvDRnAO;SGo7
                  z;~^M285mk-clMo^U`v^8gmC0}`ZaS~Tm)M=Z=(a0xMXHd|B-%h!XkPFhj03FTy&IB
                  zL%qHW4O(oJt4q>my0KyG$hJ0v&&kpIP9}}TOdolu=>RNsWG#G|`S
                  zK(wQ_L1Pny^#%=}jRuY>-w|3hAuuB;3yqVMVz1-ogo5nPOd35@BI6By;ImR_xN8=4
                  z>;@r$zw6r;vb%APU{((kis(uIn!nhY!!!*1CK4~Z?e$bfVsUGlef>M-_Q(B}9wUmJ
                  zV16d@N3R~_-M!RjZ$;?yn7rju-bYX8Svkj1Ewk7eMz%GrKQ{7~;vwSc-QY&Ux^#;q
                  z$3bl@Ru_mSB}yISunnOUBQr~E_u3U?I1F;!ng3v>h=mnDa@wotDT6->E;|t!u(6~=
                  zH(O?Vs=6NwI_3o)-QdglU$+xE2#Y&^%g2N#Dh7Jc14CNQ9GUPRT4`q*#!<)T&(hSi
                  zRT2g;`E?0Q1m~?Z&icQt=g@O5k@7{meQ=}&X!GBiiQwmh6T}r#f9$%wqRgD(A6&+JG1{TA_XvA1%;j9E_cioVjOG*zZ~toe!wJ}e2tzXdi?
                  z>)WvM+Zoi5qfqr)w(XzN{{@I{f4WVxQjsS(#p-d>f9qvrhaEtgC6W=B!0q_TtG`Rk
                  zmX_#0RkpXb)H2KS4ab#}2Ah!=+;a6)*rP>R!$=7eM
                  zNl~X#hRTweAQ?e^Uw{8odB+foDo-X&GNq9)A)KBz{(Gsz%%Aa^;ar(RN#5{tkz}47`r8@K;lKP@0@|_&Zj`%pS7vqR}sYsezC(4)I?#S!%#(
                  z>XEqr$3n_Cvv8DRN*#Wkt2ce9zz1QtEC?|1
                  z^>NvU;)^HW415!xr`mS{enAL9#W6t=OrETUppBA^r-QUO@xJ=p6-QReu%V52Xt?h`
                  zT-`0SE2AUfj&jk(??y<GZucTQjSbiP-3vo(!9)M`EB|u+bnPgVGt8bp;A6k9hk}
                  z>S1%_{@I%?&rIk{2kF(HsiH5YEycp9u_OuEE|os99y;oW6DiBf08&$JBopRP%BScy
                  zIrsX@SbBYtobBi>2|g}%eyP~FWW;t2kkH<1^;MV^nbvXMX$eQdgF&@zKI(r^Wzd#_
                  zw>^&{UlNOi@yhjFX<>h!XFk=GsMq7Y&p;
                  zT>;OHUiTBi3r^~YQVr>ptT~{-b)Y@#7M}Uc_!DV>bL&i5hHYCT{&RMVXJmNiBK2P{
                  zo!71WG(U%G3VTRX?3Gun??5k@@c+U4`NJa_tcVP%Va3=x;6Y5Uq{P08mJ90#{5Qcl
                  BCfWc1
                  
                  literal 0
                  HcmV?d00001
                  
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area004-v001-MC/word/media/image7.png b/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area004-v001-MC/word/media/image7.png
                  new file mode 100644
                  index 0000000000000000000000000000000000000000..9edbeace61b0a546cf62585948322d203f426026
                  GIT binary patch
                  literal 39314
                  zcmd43WmH>X+qMZsN^vb(++B;iySqz@yA`(#Mj3^Y+a6I+l_g2H(T%R53dLBUiazgGWk!vYMEFLoz|-D!pE#&0<-n8CE|v
                  zYy|SM&(kC?%jqzs&7;2m`XuCHt@CEp=fsZ!ax)m(d?JHh{WHKkU5DQc<=E-4jBxL5Nr&LPB$ZzgPwB#4><_;%HV)KT2$ie
                  zjR;b5csg=&Z%I+PFD38H!!9MJ0u1xCHp@4zek-<@gEh@P{;!*k@l`OZco
                  zZEyX?QEnfk`<9pAG?wA^26pApYWC_?*1wpLej2+TNGZo)<>2T6j~ko~?9taWvT2Q?
                  z5u^4NmRg<-_qgm$EhskIA3y$l5|}O(uN4?QyS%V1LkHQn~co
                  z2&U4m@#te(y{C%OFOXiuJhS;zaq?C$ddP?5M7=qiX#5O388d&JV`h}6llo1ZjH5!Y
                  zST`p*In)d3=?qc~MnH@ViHf2kSa8LBV2SvdOFUfPku<0&{?r!hdybC523)=A%(9nw
                  zaUKr=ymdcyERdkRW}Z&d1;Ork_m^dk1Cy;({ymOAP{m4B5v?4DWbEV^Nk6iKw4<1K
                  znyLjE$51c`QlZw7Ow-Ti=^7lj-~|Q8o4UXGqeA@poK8jUavn$^eux1Tou${BU0EL-
                  z)?<6aYloZ<6vCO&SKB_6UURru!MO)aK0jDZ`@emhaFcTOWLUyx9sI(k>9pyF@SeG~
                  z0(>2zPIg=3i9c7hk(X&{W0Uu+tf(m6&diU2l^IO8#`WjGrZjk4IqIp#w7&ayj@F?P
                  zKieVrH?3h^VB4u`F_bZngaophgv8%sK95JTXB|&0{~zr=MI~P|Ak1$hk26pa;$+k+
                  zHFIOGRLN{ijM2tJRv2qPNvdm9HbX}Rv<52+Ggp5aMW?i1*^G-lUU9zmr6rfxD@&p4
                  zx4?B`dA~l{3YF`3tkS9`y87H)=@`VGve*NWsG*PAKC-B?4N82O%<#kr3Ua2G8Fr$C
                  zP*E1|E=dnuc(e_Hn!KNwZVe-Pie|G-LDq#}&w|j2gQdnw`^2Cw;xer!=|=i%-)VG=
                  zPU+kk&m)_4I8G#4%8l=`snV)5gTEs
                  zTV|;@|9JTmH7Tv(z4?4Y{5f!js?wcIuDqrmLGdcP)^^fwwWBAGhlmHegnBu0zC_g2
                  z@Rv8{dQ_ZST+-}$(og&$f81<-?Afm+M?*@$M&xdKT`j`YeG#^*qXKDf-_rE-t{}iw
                  zxQ51%e`P|)&T4!~IO6AWn4udp_Ql72>aBGtB}{$x=9)YPR;;>ToeM?ZT%Q6sjmZF5
                  zLYmFuV*S2?C8IAnbDLC^dOjTTq_ck$TvUdPD&@$!5W>U%?aZ8*qOTae6quJr4%T08
                  zzhHCGhSWMQM3IsgB%0W#aG4BusTPE3_rCSJF+Yz($*Zou>3`DKC7_VAqv2Ma9(MBN
                  znqGCB@5MoaEG(|RI46*JU-1VrK-vVHNz`fPMMig-TTl4e*%Mgakmqw_vm8^9=Lb|M
                  z*-LXdiTnE6RE>^${q7x`Lw`Vn+tq3EdEp29`bC_So?e@Sk(^wHLtfO6Qp0-mrV|8}ryd~Qhyq_G?fRNE
                  z1eISO>o2jB2ucm<@buAkiMx7nZdgQwP^g~)s<<@qz*VMd+t9e7lPp}e=+o%#QgKia
                  z@h5+MLMbU_Wloo~(0ljn>GqecCmPB^v#FZCntBdVuvS&8(21x?)BpjSZn{`y)(MTIdmPN?{rj*7at^!w5dDFLuEytj({fK%M?=#__^&DXdvk|6p0
                  z^^I+lV&*GX&*njGV=eVV1w4J6{r&wCBS#p-<*O^#Nj4Pez4In;+Xs{f^gu>wRbs0n71VvuiS$yZnj5SGPGI5S93wF}p=aO730M
                  zF~I5EyM#e*f*eqZssLYDBOPIb-5%^g&6_%^MabLor8c390AW)yDq2p9jJf(rIKpl`
                  zGFH}mvj<<w;x|K$Lm-5zd8SJ^9(}hYu0njY0CB_V-}KJ
                  zWj?ZqmBT^W3?Zi4Q2C|MtaSSPcB)a`xxr@RLT;qN^92T*$tGxq3TgX+4VUGs`JkOK
                  zkuW|omO9MU(n+@bpX}?CmwN~)6%`88@6(=@)5H9VFcjlt35gdry96LN!h8@S_)>L>
                  z-3LV6Gp!_Yo&&5eh+GSOKmc>dMzvp6J-`4`D5`>?q7mO?Fu!ZP=JY`Cqn@nh%a7I_iMG1H%*
                  z?=kGgh^Pby_2hlNx@A7a)_%yoOv**{u4}a0%X29)D9!tQN<$H6c2pvF>nlOE%9cW>
                  zDUw`Xc=B8&cvEY)qe)3wm~Uw7`S(OuZae@lD-fr=s=%7UaxDAwN9@%WG-z7ki(KnV
                  zZkq8xdP0hcN#2izw9C{Ne-t1d1?S`-=cCQ@p@nQ|-i4vjp^1z8-5SRBM9h*|9qmM;
                  zWIm}*O~9UZ>mznob_E^t!)Sb_H=aNZdGP6-=|w<$vo$9`XP9NvI$jAr?d@Gb_giC$
                  zDUOLM0a;FlZH_d`=;-4|Y_+1AI};DZRQ0AZlIOoryhi5)b~hE>{(egHm+x;6x+><3
                  zTM4QhZa(7*c=Qf3J==64E4vfe2S-FeubryOX`ZE3wv?p~lg^h6d^}pd
                  zfr=xhBIV-x;0I6CU%T}a@5)-z&F(Ok*zbB{<&ITHpRjLk4E-8T@z2SpQZaQsJwCne
                  zdMq-sbG!##5NE|{^!wxHt>+M)m5aF0^%Ml0k9GAx`Saqq=7IYpBvf)eTOIdym$~H&
                  z-Rz`o@LV5H^rcXQ>XuUYmb1q9I`f-Vgm;SQ4<83+K-#rFr+%v+cUt4qFhNXmPUdEkLhb;s0w5CaiJA+=O
                  zu>GLdmk3u1#S9mMDF3ctXcDh{dj{^m2LVw09_ynBYH>iw4$*1cE!Nqke^UzG)^Wpa
                  z+yLwk>DT>1K28EF?$^?$x8We75DNmz8dh%!D);>?ZJ0ehk6o6oXlf%#R%>4__wE6G
                  zNlmDkd-q!0GR<1;=IZt6-Zhw;jeyoLoAX4a>~{mdQJT+VJl$KcYej&f<2Ens6WHf^
                  zRocz~@sppn{%W=MkZPlY{i^?4oRQ^-v*O$$Wo-`*$h}$bQdt>Dp5DSSH1$JM)S0^K
                  zYBQZlba!*pOl9|Dvn@}+2F99=0UpUUeL?Rmcs#N!HQ!jTF8og3Jw27=}sge(N8M*dZ9MrFjc3REpxM-bG3g?
                  zB}lW`5Ax2HZR9a8m#dFrq*aF&hzdd&4{ca9)xY;{I8U|uQi*9k3YJ$4*ZJQtQ@Joj
                  ztRs9&
                  z8a;y&a0IeVZeHOo@L~O1iN-t%iYWcgeEYHHdzR8{F41u(wOXlhqon%%4P`
                  zPt|@(!w*b+h}!SXPwjAH<)hY3QI$`9YS)Fh-=H89JJts_M%)YY^2V^}k^k!*?gRKf
                  z^T-%}S}0WAAR6`dV2POc5V?`%n10YVo4<;>(t6KaQ5g;Fy!7hh(VC4Tt5`zZ_MKKG
                  zZ|~i!7}d%$!RzOFz9H}7;eB!iJo8N2sHOore%+>DC6udAzkXTZ`wi1bg@>XvC1tVM#>{A&7xayp^U4TXb)jkHZTZoX&o-32rok=s=bs3l`
                  zv%Tb5_P0C=?vt->BmJ-_@kPN)SdI?m2>k=yFf>KO?`G$rWPFGwQX-}P;75nnB#1}T
                  zaZ5S#EQ9fcR-;l1v!+P)<(LISs(^4^bmEaR_2^nzE0S>@u;SGIr7rP#>ki!~mWL&c
                  zQoA@DdBXCuM8aiht6ygnwAu@(+!8toesPiSYeg27>Qd;jcgm|nvMVDH)FRS3yV`8V
                  zhbP9ypa`|OwY!z6-sZ=rZA(hhZ2cfPDBXFwPZkAF@Yhs*rkE@md9!2m?Gkdv-@s!3_%4N$^as6h4X4hvip0yXNZUQ+WN=oPy`rjL?
                  z2F#WQeBID|ZmX5|(UOwX-xaJ0qe;}ivS=r5epM1LUb{dM-D@e^d5
                  z)Ul!vYm?S#oOo1DDP58TBV`qa9Dun@Lu*)=-#f9ZyE{sXjZK8MnEzh)o^?32oCbw?
                  zBS4!&B(%L8RP`XIB#Q%X@cj-EZ<6^cD5oK8#Tc@ZWECfG^uDCijfKVYjoDm@uTt!%
                  zm;1&3?NW{bPWgwnoc?BRj856tJTGxat`A~w9fG4TI$^5qAJPWBfdj
                  z&1pF8xW4MJpiNZw-*z`>b#|@Yj*1E26AtwIZ~vWxp%47F*H{bma0G=LzprHG5h=q6
                  zNVwbNx|q2s$;r*)$$=6*5lAU+hXzDf2Rvk?r0^tv!DxhpSjZnVVrjzu+cLOtIJkjU
                  zk2g=W_LdetSWbjq^rK@;BMk|?wt&Ce{@}*47a^TVp#MiWQ1$;sg5TxLq4tEpjPaj`
                  zrqwIJPJ~-D+5HRdOmk>(Sb)4>bwmMt$m$e0`Kmwd-yr8VO&`w~`$q5oTLJDxbY=Mx
                  zfIZd*ey-Z9G=#$`BVhdNt}z71No*beTxa98_&g_o{Qvf?0m8tacR*%&l_v6!s*Lvr
                  zlSF`*hJBk!3OxFs4@#cj0V^2&ni`a0F{WKNU#s&M7x`4ffwD&Kd3y$V3T)42u_2EW
                  zE0syv=84ep=cU>Q;`bAkFLEPpFQP;fSxAyVBXH-hVBm|m`{?$Lu=$pPlM{L%Qn#?sRLMoFm;C}DDJ`G=I@w~$WN51JCb6GvKRg(-blF||tXKIIP3
                  z_k#g~PU&Lb?3ZxY)y_qu3WMKx6H1@i;Eb5OCT{G
                  zN~l?$Y?m!3t0ehZBHzJpnXl2Ik7*uJqs;;u`L?72kaHx#S+vhcS(T1$x2GamS*Q9O16D+woQSBE1jiz-6tR)(lczNCS5%nCF-dqC0di_
                  zp2B{)x43$YF{^f}p@N)VZQzw=uHylMBNNMTgZd1x$L%fA`k(=^rQ}oIW&^H3TkKaeZs
                  zB4JH_Z>05<#CEOMs7xBBE4_6NBC)eqoGSZ@Bo_g>&2*e3Wu-M@lo#KLgmd3vW9JNf
                  z$;QJY*hc>STdTJo(r3byMdP^=
                  znVP<%_XVVoaN^FJ?;uxP96ev9FMnpIhcsAS+*onQ2BA*!%~)t){QMrfcB!TOoDJ-K
                  z3K1ACF6tdEbF?2;o3^Ubjm2>D*@0qL%GZ~kpu1BuWhZKqzSNJ?rdCt)Z;`Q3nels_|s~f!O2+Le@--zN$?-&Iq{F
                  zJO$D$o!i;QuJFzO{i@HgXswx+6?gUHlRR%%GAC`ikKrIkdHI5NR5dS
                  zE}i}{mDY$_BE=X3g(s#NVq&O1@10`Xg*`1%8J-tM?2qH6lBa!?ea)SbXHdB)jRz@iE)r#kWxVaQi`Ce?ax%rXtRkt;lwJN%9CxCp-Yl~kjQD)Iuw
                  zVs{pd`lb;C^O&ktc6E9l8WldLUC?bFk>Uy!#Ji6cG0N~#Q7Q?c=0l2Sq*GAYeEp@z
                  zIagd#lP9%p$ILI|Z|2LXzE?=sA*e0vEeWAgMOu##5qt`i+{9}Hj~t!)6_fAne;?34
                  zUuqmemX)n@SGmlhq&YMlv}5>tiWLVP65ZLZu1Qn5)hVKjhx=
                  zV(X&`$*;E)=2RdNW~%E=Pf*>w${p8rLK9!AH
                  zisXCTUks;7DF00^(!~T&(qSAiG1VLWHiVV;CG#%wkI;WfItDBG}ByscSc
                  zCDuUyoRmVn>$0>w+wjQW9ED3Mi^p%j))Luh%)7_?Ifc!06zq&gTBx^lcgs4XCCu(s
                  z6tpd1N4D@f*+(8Mi@iRuH#M_tonPQFgBZ)Hsh6t{ZlWIy2e2uNL(J}V6apglo6-rQ
                  zWUncrCW(~?+(Z=$I3||+6awCZBT9qQ#n_viIk$K+KtvE!woZm(eSFXiL00W*xfuaV
                  zK~Z`yM`|NZ60*|603}PdZOZ5+=|iR;X|ZGf-=_5Ky!Y>x7w#Cg?ugQyPe?#x%{c0~
                  zZ1^Ces1C{*IR#SPseZZ|b){TP~H27XfMcuaqeX9Z;0n
                  z8aEXtpna7{WS>ke+&*(?ypNK*(p9uy6Q!g(jHaYwc#7)ZcA%j@W)^`-P$N=`R6!>d
                  zOO?^NpABlT1J&Tl((~#kvg5rWTBZx`zsdsDvCxeq)5#V^!6x3r)!5h4syj_wVfDAo
                  zM}^xnjXvQag*R-`CaskXU1n`pAHrKDMyJTAp>Fc9fGA7FG@%LOhGY+v-sL68z)llN
                  zv`S#MT^8&LfakDG#g9BUGFEPEDHD@pcr4L45|ag(GA&54WD6^JJX37n6b;ml>yus6
                  z#fl13$m)7v{-n{!x`+7|D@v&>{|)wOz?)oFH-i0(C1q(ax$L)3z`Fsb-NZtIsEfBz
                  zPsPo`o3+Tr>-W!+0C<_awiKl{S$}1&lQZ`+IQ+=)*+sH!jnZ05n`-qGhHMuNR
                  zI3Yg4c$FxMkz3iR-47S>-{6?2*zb}_2HARE!Kam9)-8;#g-~ku_(;a
                  z)akHeY|yk@fTzb=8{0A(Cul1$&UHK(~PtqN|&F|A8Lz!tYx8RLCB3wqquJYy#9oBSZ2(09@j;n+8s
                  zqnCVQ^|>>*VDk$QiFK*e!O}
                  zq~Ad4Fc5V;V&F-_6t71ICbES^3n1C?3&LZyQ1~G;hO=r2+^UmdY
                  z4h}lYo1MI`8LqPbabRBjIwe5b3UO+ZRF7rF7vd+I+hFZTRC71P!Y4Lk|B~9?C
                  z4ra_&hqEPX&`k&QjeMx-m-bzW!M6p
                  z^Usdo^0(cs$de0S7)S6bbcN-rSgJFzL`U=;3g|eQbo$s+aWR{f!&OL60=#rJ)`W2n
                  zqgZ#2X+~&!zpmkuFBy!j?@!C)#_1!wFBh)W4PDNA2xEe=pvU-)u)e5C{^GF89m+T24R?v@T*-K6iG&uf(FkgFynNKc;md+BfzuY^+q}dE(sCFy~ZZzANDT@
                  zBrzyyjL?VFdv@v<56Crl+2LcUFGJ?;~=|I-2OQslp9_v*L
                  z*|x>-P&4D&*eX4Y+>&F%gx-p!F5K~QkkI+U^~aY4FaB{eSK4cMn^M&w9DV1B7Th(!
                  z`;i?BnpefuxDkpka#O%JR3vTxt`1?kff*BMq5l7TOm_znD??*UGtASPlY3_$Va-D4
                  zzyrEJ-o0V|D-LJZ0!)fvohl_n&9WzYZAW5kTAc`?m9)SrHrXkOVB<7$#)@>5_8@s|hKTkV(
                  zG>KFmd}Yn6rjbjj(KP=!gdhwls|}~ZJn=$J
                  zDl%OY6Mk&n{}>#+`DfECBJ?V&|5@Jb?1%IP<7uJuyh?W!g|Wc@_^t=S+vu?$&;~u%
                  z=OlEM^>JuZD?38HE?G>kqxqIvc2Mt;c>+t5Y|T!_yu+hq`nRnu|IC{q#U9(DA-Rfw
                  z38m_}5yPYQbw@k~w}>h$*B?6;=k|H6v#$7{XF{HbymEVi9=pshg~c)q++4tFcI2GJ
                  zhn0^c(d-~y_7qK|C%U>`|01Ngu!8RijG%{lzAco+yC+TSj^}YbI>BbX48+W4>)xY3#n~qg)ze
                  z-ic2#T@Nnme<_60*bf2W!V9Zk*7unK%i{ZPYm|s;dofHeMWTl7yrsFHMmWLJqWC2#
                  zw|s@}G`8lUeb1(G)t}k8(eh<>SXrP;FEHo#%n~GtM8IgX0U@$2!>vRO+_*CLSQ_(d
                  zRB5O*zt|t@=PB%Po$+E+jF9v4e>>F6+kUCvHIy(h$wE|PCmQy87g5T4tyK)*5^v~f#=8pG;Z#RK9Kd0rT
                  z^DS|no2;#2_ze9KqnNs%<tM{}6H!$U#m7p>I6a7^&9qJ|s$ilL(0jeeukKyT}n`%Qqsc9_u<
                  z>YtHTX62QkIa#i$x>otBhuCO^?Wn-;J(L0Y2SDT^DOU%pqO72k&=e^
                  z38|@7nQ4iM#e{pC);5cbUn=?EXb7|ZS3??U_Wa%2H?aWQ`IblphEc|alb_dSHF+Om
                  zYL*{oN|M$GNcGN7pOR0UU2zT6L@iZb>Uf*1P4dFNtuKToOwVG)5OsX_H?;hF^78rR
                  z-Mdme&Lh^NBZaA^6x*seA9TDQ_hwwz^wHbfZieX>ycqeRtdntFor37t*ijn=aixB8
                  z5fRolv>v?S@PL4}_Su>Q1LMj3!lm;=rryTZhV&n`druzT^iuh!mDS4g`Ly{tKCD44
                  zNpEkyvPE#9*mZGutZZn3j^o2%^G53A)CFaE8aKwzeS{T3tT({q9U^B804Bypjk$+BiKtj^`TCAiK*Mc#<;z?
                  zNo(ljPZK8UR|U<{bfR0c!DKyOXCMdc{{4&ySip3SY>HW|9$ygf`i#qAlA!61RPzZ2
                  zs`9dBV|VK2rBIno?Fy^mgFjCLAcAK2sO^g~xqf}Vd14Na)8H&I%Y*Oo@APfHn!!Vx
                  zi@9%R8AbnXsn#f8mFs+5G5GYA&^L>T-SdWjyNDAyb!cVq$tf=}u>%*&J2Jk2^_pWXL0W+w;^EEqjZ5Ju@Kj{#m#fgsSE8@4E
                  zbVv0byjSJToFW9WHU#)_thQAwT@S_Y59Xc4G%PT+s=MJ%9Vbji+jfE1+TOMb%2|~^
                  z8xZ?X%Ke)xOdjfe){O;YZa$u}iIi#}T1jxd)NqCBs{{-9NS4v~y6@oOy>0HY1M$Y5
                  z_Aw_65ya=^;MmNpBr!zB(DAV2B8+o;tHvuO!d>RvDzmy_1$t1njxo@Qm69=ces?pql{H;%0g2JG}d{iWytnj>uLk5C*OahFX8vPI8layP
                  z?&~rTi-9<}-t$kfj+2z6+A6oUbi2W2yb>Qe3FzzX1#BQdDbd96uPOtvGjiF~;tWLT
                  zn$NV@kQ?k5%=7bWe7^Hp7i?+Q1HDt#Yx@603o5>f(${+D
                  zHJWn>b%0|0Z=Arc5H!>N^eqIexU}ylz>aphx1)vk-zE#r$NK0nT|tPAO%t3{?LhLO
                  z?RfBtFab}n15*yWIaK?yvc*$aiwWE?Pm=9@G#K)>c2fYSZ{PL%t?%Qzt~`LR5dY^X
                  zu*?PXUY&c?=O0|J2I6J$;6w-c3D)dEMy=L=qX1@k8OYt1-)x6u(fLjemKb*MyA=Q?
                  zHGhkbk0imp+nC#krB#=kExTmpA%4w|=GDCi{+Gp)wRQ<KO_7>oDO_1*3IcnMgJ?VshH@WmpO~#h_>vvamgf@0_&D$^bK(#p4ag2>!aGQi42~#zD
                  zK8xWsog%8F(X6#hF-dzB(Mjg4?gQK
                  z0*J~IDRS3V3xx=4$DP`XaWa5Ii_ja;{5tBM@cq;~wM~WSL?@Oidv8E3#a??@IIHxil=5UAR3pD}y&rUD<
                  z#dH|lFx!p$}xAKKdgzYaRq#Zo9wP3XQ)!+irq4a9|
                  zm;VJ3`cqhqk#sf1DQ+WKXPQb)gs=Y|mv5iqrga|f9WSrx5rP69|6_~*bRF0JS_se5
                  z@AU9LiI-~JyfqRkP67&w$Qtq*9?zcUCZB8&q~Ffs>M`?{83Q)eiUDJ8n}dW!V#X0t
                  zhQN7PI2P6{`Yo#xT=}B2)#X3R>b)?H@#Q4LE4JHF^LVLtFXP2k0#kkOe#@cUU@
                  z+WD*oO&N9?>629nn&)CiUu0?NPpmXy>*dQD7AyMV$I8rg6Uu9djZJ3;U45^F$JUU4{~?JNXxwHO_-zbr87Ste
                  z55N3;8tDbRbii}jEO(sTr3Ign?MxRJmACnwtMRx`ud(;=t4+a;dIbV4fwypP#$E}N
                  zsJ69+2qP^t1EY5+RQ`0~UDn5J|`X_slR(a2Y)Fs&YxAznc%;=-iml8iv2QC=?Ncx>gIU#~8b58QV&&49NSq^dBBJWx`7z$E
                  z14237($n9rXkFJ;u|TOVrQpV1JjN3iI^NU+5qXPU^RXA;>auV*OnbN0_f~!y-t^|s
                  zFI;w_hw^)xUuvexr%{-g#5Yc}2$8`7tr|m)68o2XURA`rWV{L~Uh|0%Tb<(IJdH
                  z5``~&NrfIUL24ksXMU}le;*^*&9%Na&AjZDYNb7K_zF;4duwL^WtRTnx5{|vlU%F$
                  zk}E_Q+)RM08uU@8;%0Her$oy$pz@(vA>Pz{il0g&47*@(o^sJ$Na}Qz?knENvrQW2CL$+UGo5y
                  z{9|K_eKrTiys62K;da@uUzi_BRiey;8zjHK_oFg3dY}z
                  zw{&-#hPRg>1A%!ssz}{ZuM6BATP>Et-pIe-5a6)7O3K8-7EZf4rH-XCSsi~;%?Fd?
                  z;KrqOyL1Em`TV`xoeiZ!1a8(fI1tzRHXaf0a_8MVdGZsQzl>Gz=RV>76jwtxCeDj=
                  zi(j&`va^-i{mWw7O>#KLDqZ*9S5j$=j4>CCH?J(^m}QE_VZ7EiHMpq)TiI3a4;MGu
                  z+mzk&Q|!&GWA2&k;dX)ui0Z5*R-mB-A|oc
                  zx6NKftReU}HU8e=cN>t;6-cmCRMh4$7K*dNSO@ThlUUI2-lPV}5Mnm`9Y8AfNlRSn
                  z7&pc(q{L^on2J9P5PlGl^3zkTaD{wL(+`cCHZwN(Sa>$Xh&EBmTB;Uybr~Au8Pg18oQ6Ej*cgsG)0kW|R6G@0kkA1retPXM{e3^F
                  z`>DTOEW6c%%ubQTJKL2`!f{VJ3_+~BR_bnRD)JG9P^`s#uYixRQTK^oTNCbs`P=_H
                  z43R_oe@j(b!p$`#04iFEp1Di>zf)+P7Ul0%dbnQg#~H}jg15c2*^<>r6tIF@5XGx@ulq|{hG5la3oPH-;-G&GtytQZYr4_$8dj}!O)k=R!f$GCHPb&kmu
                  zH2$Oq7Ih^4*KLLq-et9Aj=R+KeE26-)NK!ydM#!fEB9>=!ps-q)&6fawBu;L@s+~s
                  zee@i5Ur$Jg@Wtpbsh{spvt5}b%GBhc}kU8vWD4+4?vA5Vjk6RKKG~sC&eXIS|kl>ivyI6<`1z-RQnZ8
                  zmF0$Fe4vXupX08lWT|8@v5&R~pFT4%z}Ml_*bn{+mPih$>jq6mV`SGQQG9)Fx*tSZ
                  zjCV!XdY1cohMupp(AfguMjX^=*XWlc`|r?d<{H*gF_?!%v{
                  zggjqiqw5{L2S}xFHH$R%;r(;YQ0`93;vat#BI8>LWz`=|1q3Z*LPA`NJ39jQ^He_{
                  z>fI&duOq$9jt%re+T0k6+ej@=KPG1WXY3@st&D~Pe+88U#oNp_X{Gt7yc)kkLHs&p
                  zadvdQcCkuV#yv<@8FCmXN{?2#?x9LC)cG>)e-$R1$kI|tPW#JN2h{yNp^x5V8;@k3
                  zoA#3AC&0w8QqDqQf9tmYhwnV@)Z47h!P)kcNWZkR0Z_TYSe6g;`1;6`%f~zWd}LWy
                  zi1Ez$Wjj$&kT_a7*)+#w5|fI%jo`YB2K!hHfe}V-tWYt%k=~-C)OYY(pBI)%Qwt6D
                  zkB;q8pYp}n0rqGlrE#Y{c@KX$L7F3AI&m319+kg|WVPSvM+47A=pZI%L!k9E1FQey
                  ztAE9i-h8H(I$0jT!E5JSnm8#;FmJEg%Eq>!U0^g^4h@(iub>%@-sM*8Eg_p(v~t%C
                  z&C7)QMtHHrXSmafhsq8?TO@6n2by_#>39iGQWLl|IZYEyQX{_)^dCH;wTac%eInj3TyY+#Dy1Xl!oB
                  z>B2K@8}ByJE;wbl+hJ=Q=yZaYTClH*e|I!_r3MiheetL?l>BopQj~Exe@Zc2m&{@r
                  zH9xvOa>-V=o^(`0TV0R>=yP-Ne^P8JwRbo_vWsZAVGc$KF9F+XyPT*Cm-y$Dw{@zQ
                  z@RN#iqrvdycbXZqcII{sjwZX|M8_J>b}K%;5ywUlL;;@`RPS+ZI_IjP&~~gPUVX|r
                  zBmLzzKAwa*5!q&W^lY>@^z+NA+CkH!NiRdVAGu%gV*plV)CCmcZX=EHNxxb74sl-ESF3lrD80mb?x6rPz_h=J-i)
                  zwJEAqH(&k1Oh$3m&e$lDkwrQoB{1|Vo6XM2OH(!Bm7()rGnt+lZSkN`i&>z1@ECE_
                  z`QdlUAe1|@ckejj1x&jQ(S(eYrh2t@5rM9N5sA4HJsCeTO2}w}9O&iCGl_SZ=@c+#
                  za=u)HxKw}IMNmu6M-5jbr&GEkIj|0g&!etJ93c1rz*H4F?&6OzGMd>#jor|nUqrL+
                  z71QqBv*!GFEWZo9=lz|MnzXfr(X{RO7v<=XE_hdpvjkEorJJ(7GbhZ{#TcxOeK6;u
                  zVSF?^*|D>^G8A4n>`Fd7-D_bSBiU`B)h$RHChA`*utLh(hs(2w
                  z2E4)CT`1gXkW(MJ01CIM8VV=eD~;BtsTzrSy#_z=QN}dL$RxXc0K?rKwXpW?WL0&S
                  zjN`2JkAo`m!!Nd4pFX5$7~#i%JHql9tf*sG
                  zk|&dxlP7QIbdMW9)Mp6(M~fABG~6c4x=lkbf2(SJ1+4NcnoSjh;R!_8eGA
                  zWMt5#<4P!M^Ah_JnC`mxAUtK{X{<%LeJVffNV*+}nZf;4GFAR&cdP{P@!CD;sf*(-
                  z460hYn)5Rnm@L2XTUU?WDuytw?}f_+HJQb)4$hCej3ou_$$tN38Q{}}6=9Sxf9O~y
                  z9|BsJ$1e;G@J9v)7Ny%491iL%y@r>(ay{qTa-#*P#Uv{3nXr~e);-TeAD`v1t_s!z
                  zjuCq9*IoVT3g5}y+kBb(WZzsq+2fF1!DiV-GLeI(E{sga!jvGa^9;r0mWSSr*>jNYN6a7EFEC}f`&iwP39-_4(O|_#)_!(2^fMY!S?&Tm
                  z_-+{*!jXHuE9_`cdG1Us$QfaIv%1Qe+sWP#`em?u;<%2Z9ofNHL7-F!XzyJ{-q+m8
                  zKN6!&W{Ku3QZqGgJ`oqOol&3}bP!d+%K)x}cZH0ptEP4Ww5)&Cu+XK;7Yn94qpU}e
                  zyDwW=B!NNil8o@sWQ{;6al`TCd*zjGWXTIx6{8>uaf9n8d0>`UUa>VHXzzOGB>z#C
                  z7k;8;7km}*keciM(A2C|X?o#0urNru7{o;$;(h-0q8Ofz>5eHk>*AuLfbSSkZDzZK
                  zb3FqAExZg}<^n7c1tAiZ`-tCtq*}r=f-_xS|1zbjd*w$5?(&~idHl|aWeWNf3(~Is
                  zM!|cB7%cvbDLR5z#T-hj`pEfsniX0QBE)>BYx-EID8xX}>%0g_(-1{xJa=_b7p}QV!Kb
                  zkdT_%_<(DTq@cse;}CeMR-c5e_Wq#xc6VYuf{+`_>9C1ROiaOj($S_2p-h+=1Eer?
                  z%)hYdOVaIh|SwkN*wUASz_J=!H{P_M3qFzfnxfFGkyt?a|e*cF?H>784U7T~D@E
                  z>{(eh%}E{4lxqe;wivA0W-}K|b!9ft%e!FPI&YTZbF+J0g_{f7z6Y}ltl52q%g{*c
                  z%yb7(R`4l@eRn~+MR!%-l-v4~hQi?hHgz$X*}bSjU5JMx+i*}&9U6TD`Id7XoWEZ2
                  z-9_fM=Ky8*QX&kBA#T!9TyjS3No}-CEC4*3&3Le@UWVgXUG${E0DX
                  z-TNiE_9TtnKSK8UDMcG@ZsfBU9qg7c%a=M0F_yAkc-}bdZ
                  zR&EXx$q`+2#Q2iOr}otC+hcKfT?F>0L?+p9QIsH-#5sG_)K^T_*k^(2OV&ThJk36w<3W2fGO&E|iivf&vLgcOi8ENT
                  zBXX3b2nmHAQ4cf<&~fA70yVD!Lh(I;#-r~aX6~xHTl0YwI=>1uuQ)@(n5uYFEDFMZs%Xkt+dIby@
                  zZLwzr8bn5kki8kt#eblGh`NO&raMwyFB@V#QVv0}#lV$aW9D+(p5rK`K
                  z%h8Pkw|~EdRNbx{KZU_>wv19ml2R?yVhk->#C+xhrrjxe6$ouHjHsjPqW;__Aeiry
                  zr%;B+UnnWERf86eGono9y<2Hh5%@tC5N*rx3tnoGbOcs!Gyb~PGQGDZ@`*ggo4yOj
                  zaB~&tWk!bTjdsCupLPfg?jk^S|*Z|r22WcgS+%9f?Qg!%k{
                  zN&-im)vK)#lYRO%ZDl8+GThQ-ng4$=_f}DHZe5#bLWJN65+D!=1a}GU?(XgoTno40
                  zK@;3v3wQSb0RjXq+_i9u!lhsK{`x5DIxjqPpSlA?FC58mJGSEj0is)-{4@u9JPWQQ3VjcJU8nZ9Dq@VAIj5I
                  zAZabiY3qH&t=}EQTB?5rthbOJ0vy<+1#dTYUqnljbA@2(4sZev+LgtW>pYpsFd=bmhxibT!7U0ZG54w)co`K#*E@TqfPzi||ik
                  zK(K7#y~OC_mP$2DWh7OU!~Ujt9PQq=xMJ9W1IPl<0akwK1pwt+`h4z@tQp^UpMB85
                  zfRG=yHG28&`5ZT+95t1bKaMIQ@o_w^2F2VNOtJytyW;vs*d_>q_so~{H$FMP-Sc6X
                  zW(I3Cocvz-T6PXf$zwC9USiXkORIBd`t{5=zgb{fJ&1?veLHG`<=9D)rrp4KUzW4y
                  zi)w(mF=>x}vP|u&;a{E%4iBu1dClQE)rD2z8WiT7X+Z8_jdqZ!yUN?TY)rzdh+VfmiN^W0MP|_3-By6ncZj|ED?w0=c_&$@&H&USG-=h#kTHi=L@0&
                  zWJ5sf)#4!~Ww|@GVc*oExjvu;$|{kK>A`yH*=)2YQ4`;bw_FR*w?qd0QjNUI=e1jo
                  z7JnoORRqj9f3ohciZnX1oSz40jGWpfVL~5rJ_{u?-y$$v^F0}v0q!yv$Vb_o9o3_^
                  zpTA*TGLgZq#T?Mb)JIF7zBkJH*xNU(g=ot1Wolql&c5^?IY7+;%~KeN+i`yv5aR+^
                  zj0^=06aazGTAmOhDCYK}G__cNn&|TY;XpHr7UFLj0ES-6QtbkOPU!Z?eFwvk=d2-M
                  zGHLQJtso-KTi2C*8ox~LHix+(L87=i6$IDfa9LsLTTsn%p-Oza+(FFl_
                  z2=CCW;ZzY0Xh#To(X9^%+=>?{`frM9^brGZlhk&!wE?3hH*PHNrH@zApmN6_z;hJs
                  z>%%)`>*u&^e&;}hh=EAL$M>->0!MKysy^YJukL2jZ5rvMGhieWeMEm^VgR_9)0rK+
                  zp`q}}EQBFI6$tcG4{)>2E#fF&V&WmCOK)5xI)61QEd(^@!8W^G3YdiB1wJPadilQKJ2$#z4)KrP~?B$UZnK||rK
                  zgafd^xhy^yc>@`WLelE#`y5NTG*i|Z?7`nlp0nGw2Nsq;^vuBNUF;(RLy5yUg
                  zqB+lUgVgGwe*fn>@G;nvy~&p6xTnzo()GvQ`m;W-Yba;O3S?0=0i
                  z=}#SJ1@_lyfN~$KjEj3Gf7S0|5mhVEd~2)I3~ey6v?LQwXET>A`ThZoeQhcS9ope?
                  zV}qw%PZds~A6)wqiJF@msYvwMa$7^Q`_aUj*WNqxM;9dLZ39f9JaXju6kfRQFl?^4
                  zPdy&MV^7Dx{Ug1O$44Oi<{hXaHTgnKPHpGLxmKWGjyqVSb>VJ**q#yK&_SQ55}E2n-5}@;07}`8x#f$7^p`P%zr8%p#@``J_u1YPa=+($dI%wPqC?y*K|NhegTt@172<)poYq
                  zJ!Jc4CR5Oi``yipzQUdxVymj8yg2a7){z)}w3^p?N2;q>5DR=7kkR0{VUGR!(yu|4
                  zK}WAYs-kQ;U+x3WJI2hi;YL7JfOGf9veTPONAK@MEWOxS69Jox_}^YloI2AVvC>I3
                  zgA*)y^~YT=Y=Bq-jZx6IxV)6qog=Ff?I3^!Gc?Ud>7K)IcE20eczR&z
                  z2@(K$&wBKzn;t|!$gnqRT>vEi_>fZ;8EF>U>*_{mgZCgS6+2oT2mHi-n8$T)1LxHB
                  zE-=$lLx9LK1Ojb%5SiEE=H^z(JFbA)boWt0KbPI<4>MiH;}wdgl=^ZgDqT@)=UEKF
                  z?5CcDpFcam2iBd%7XTiIRU{(H_Zu+U7gT?y%~9?P00-}Mt!2}JenlkptU0r2>fMtL
                  zGG1>bFaz2?@G@!VY?7%pAZd&(j?n@$PHZL3kECMvDMT=?0Z2O?J*wCnN5M{hGgY6h
                  z(Iq@Q0&6JInaus1fFAb38&!=J@5RnCnway;4n!~mJ|1>xl+IDH=W71x^weX`QLK)S
                  ze4_148;VsY0J#9^5M`a0K2X`>;y69=u69iTUdx9r6c)aQB9|@YX6ovv55JPRn@Z3+
                  z1Lpv=-ISUcZr?Q$hJvW7YRwzR87P=mi{ZKe)(kU(%3O4XoW4mNcpdFA{2V@5svvi~u_<*OtP{f5
                  zZy4C^Kfd(o)6!BwShzG*fq$-lkKn5pLW)dp34XrbBU;kSOCvW~vRQfbkgtkDqks=K
                  z`9a`S&da_l8LZ2wAc6LvKmmQCbr%`){{U6Fptz*AB2}I;L#zLZTBO#?Fe*Wt_re*i~FClGO
                  z@{L2+MiGXtsw{pdw`s|rp<&9shj=wuFu2?xja=6zGGDAM$HWPF*07ld$-G<
                  z-}FLj%og9icP;8mY|%Iz_xha5b}@6Q9vU44-Onpl=kF!Y2fr5p!xI#YaF;x#mo~U~
                  zbb1HJwG9}vNJoELlm*`iC!!(A`PW87{b^(#8_OC~Y79^wK~}3$RwW;J+bmAAxGfq}
                  zE)ET8d$!~>*VD(f@0u+nRK3m5WLaVf?LmAsux}7;Y;O@P^kQh3@wm9-I+Op}Bb_sW
                  zpQ)tI@5o(Yb0n@~a4z|>)Ub){7%|7ncdF>w2LGHNgg~?4Pz6&sq@z{F4XQF-3Z5}P
                  z|4q|!L3UX5Oel6{nn1q2grmaBIu;f6!pa4oPP(7q)dIVfRE7i
                  z<05H9;w3cGap>HnB`wT~I{%l{Tg9~@Ro2`aea7@jS%D+!%lEaurvvo_%s0N}Dm=t@
                  zHv{g`frwKe0o@!)Ze?aUR5@tccD+emiUYP-bbZh8WSwP0CG1@Ug*<
                  zIE>BjO{PZfa1Dt2j{OSk)eD#Z68k8s;j$U_8cAIV{En!!+)v>2$qxnW41ccH$Oy^D
                  zOK}%wK!<
                  z4&2Iwqrv?01a*{t+A@eref**yW!(A;^k!jG~f^FK6B=$wER#;Ahj2AEks~qF&(EY!K`aftEgM<1DtSNA@2}`YYSd=^O
                  z6b7cdx*FZGeV6`7geV;ZO@mB^KTIm+&h;iXZNrbze@t;C4u!pM21`
                  zV>?biQgEqEC53rReYuNX!B-_&a_O{v-qON(NZekhDrX2n8pfBvR_*5Hu@{FAh}wEx
                  zLx;~M(Vh-n7f*SF?_fUVK!3HeRbPnr^qAHXq(soHr7|K+GWIsUtW`K45bp)1m0(;#
                  z$~wah9yp_724?RDeZD*RERiyhqACM2)f3{}=A)P$h0^Dx3(**y1jJ&Mo^{dPSlCwrpz3i!sZw1AI!rWsb4U*b)Y0
                  zRGr=`L^&N;!>X5ZO3ihSQ5h;148aY_6qNV9rxW{WaFb~Umxpx}&zJmhc>_I6RtNf0
                  z=LxJ!72tL$o-dx-;PTQBn2S?mzc-JAaZlE+?zeZqev!xsah?3&+u7u3>pp0ymO39;
                  z0n6Jvz1roP99D-EhrZX1VZ4F*`M$*Vp6fEb!eeO1@=+0@(EdivSscV)_@F@}O7~+Q
                  z-Zz!^n1maF%tkE7>7OEy`Kyi*YHFR)c#{ON&$aL9oRm0R43m
                  z4+BSMjC{cTVqh?>e|a*V#%*db5c;`v*9amv@+!fwCemBJt;D+TfCHtfHebq5td3eT%&kjN;YEWet?y
                  zbdeJA51TN!PiEfS8NcNA3mZ+{hx3CBAso7Jg`lW|WK}bi?qNEfJD+3s;n_CDC56-r9|61OgY&Ryt+B@GCFTi4
                  z9$GzuX}48%J+0UbjO8r#7|<2WF|TwOr4M;zp?s!9zrAWYV))CmU~s+mxdy9`%Kh?g
                  zJ2$7OWbVW263wG$5Z@$$#H+Lx&{vxSNpeH+p!hdi>d*f)Tidm*-u|J@H{c#gRP3T~8Q3=vvCNWMrs#%{;
                  z{u*^DT7jR(v||Q*ZPedQrj0iyp=9K8^;h~Pit~Ia;|7fwE3Ry8{0r2ie}h$NMTFha
                  zTh8TJSyp(~7WG4eh@V>^_&G{@O18jH$FcsuhfmvaCHuxJhNux^8cHX$%zM$|<&Ugb
                  zsB~*CUm7aU2QlhPr45UbnehQnxzU*=K{xXFT{M>1CT4#Bd8l}PbAB19Q7r(XQob|}
                  zT%k)cv!+!;Dd4YCD>r7)i=Mb71X*qM!U^2?yVQtD$F7@^JY|^f&i3;>zjUJ8qU0$Y
                  z$6oTuv&HH|^!MQ#A3#aQgDWHF_vg4-Gs3m5wD9`V69@nH-VB{P3~|+&KnrZf$HvUc
                  zQK2Q;(w|Ys5@aK;n*Ger!#q$+
                  zulYSatn56rGbXkLL*>#0?0Vp$pVQeqQ<*!_ZHq`-IsFx=Im;w(8Y
                  z{uHM&!i_FE+c8vLMB={|a+Zd;4U2+Almh=0v=1ozLr7wugd57;4|Q$&3Pa_v_z-u@5haEd!d^$7ir4^fbn#ndftH8lI1idS1kuYKHS
                  z$1gcO0c+Fvq=L_^Z>85z8Gn_ZCJnaPWv>lRs80u>3^FDAb&bI*_SK
                  zw_~`FIuqib(k6EwMd2pI4-ZF#&iq!-!jlZ>QuZ{Ex4xA9YZ~(GK?qzw*H|iM+@aSC
                  zH<<2ul12m1<<@~s6mBan8Y{wH%$F6GDkber?b)I^4a2;9K`Z>S|p
                  z_mdSxLH)A{$&eJg%v{f~;J=BwoPkrE`mcwKl<@&f^69IHT0`Lb*+%W$ZEw$2VG9jd
                  zI*rHM!Jj;z0aao=XF*$ZfJ{b8_&YM}?_*RA9#s-;0(X(5qeKU#y59AcQaU>>Yy!nro<;rxLBL3GIKj&<+*(H
                  zjDvG+u!O!BtY*RW<@)Vhk;5&pP0zRr7hGj+Sb!y3VLi@!#%=gpXG^JEnuzcCHtSBQ
                  z)LfrV#}U8v@^zk2JAxBxf}xq&x0Ofk2*3&=n`~Nq?OAG|wdAc3gCaka6tu*^5q0YX1
                  zspD2^4#i<>mV7P@g6@XkWd#nexo9o^1JE0bA0VLA`mK*l)JjM6{O9^
                  z%am=e6;F3$eQx6O4It*G{p9Idw{dq($h5Q5f8%JM^8OQS;_Td^YtaA=rpEedTGsru=1CqamLoj+Rgt6f
                  zp!4PHj@r+|8y^J(hmaOEl2zES@qrZ`>ucz6g40)gFOCESH}x>D*c1E
                  zqnXa}mxuVjew9InEA%a5dV=Z5WM#!>>1FO}C-CzIj=1THdq5#rmwE
                  zmni2RbHV|W@h+30=ykt>BWTTTkYRNul!OlO7G$lEX00Bi2QYTJ
                  z_GLee&o;m!GYuN*qUdVTEk^r|A^KjMLuTI+M^s0qw9+|W>1A%+az{wC@flEWTv3KP
                  z;lW#o#)buB&W<;My6gPsQW8#3CugS_aN1WimZLkj$gOyHvx7f7r)@O9$*tLP$D&VA
                  z^(u~nH#Bji{oT7vf26FBQyFP)wnxQjZFKssNH0Qc;?iD85b}G*;Qmi7z}zHGAx4yr
                  zt8U;6M3Iy6Vz9fHVX*9_K);*7gT90QajCF}n{FH4_qDu>-Q%y!uSlnx=O1NXilden
                  zXW5^(Mgu@j?_l7P;-3MrnB;m31Eve2H{BQl87zK{G9}WmQ}L{cV!g@9HUTd$+Nszb
                  zFqixSgY|imrTlsM_nzPk(2sPkeKN4xUht-8>WNG1QP)nl%1Luj({K{TPsj|BQ_~P?OW~7V0-d@Zd-yVd5{
                  z!mR=C{$ou2s-U>jz_M3Qgc@o;CZMe9-0Q1MQIPWZ)3Fm8SVW>s%5uOVIK;cbOue6Z
                  z0fB!W7KmvPw_?@A5#x#>W_+%+?RtpRvw||VvH9(YYV**v>EjPUB^}{kVY>T{{!PiA{(GJrn=5kR9zb%iy`zmQPml|qb9
                  zrq4}g+nZm2RYy&hABV)~m0E_pm;ACDnEw|4Fb98A7AW%dB7FY5np?8OA-}MXa*+?)
                  zp#b@48$OZRxQifv6T0#1o1KGW12Yh`)2p;&2ewryqoa3e0_(Fe8hknb;vs#!&$}5D
                  z6~Qc(5u3IRqyM%6MwVV)wTsQ?jgkV(TY9)Pyg-&ArMA)K5Wxj#Dl8Qz4
                  z_)WIOAT>k*@bUPl*z=!+hW=7uc#uhP;l;)4n0;#DW;)#Y)3`+?MN>&u0_!K+I&HHN
                  z=p>P9mWizy{*lj1F2zLE}HK8A0sU!I*!s?EIm}W-=Mv08LpZ
                  zG8icH&uJmLVzvFRMo4Jramen*g7$L))m8#s9qU1@zrd
                  z@GXc0h&XhvGh@{0F|A=yumrPW`>mOBmyECqA7j~q`x0S30)h$rjqVMDU}33JnU%nf
                  z$BHwrCogI=y4yqRmubmzUFTOz+&FBZ#gRMm@h^A_EwYGv8ZbxjpN&-0T+9w;w~cwxfWg
                  zYYo?<4L<5}9D6n8u-iqPHkE35pU*@nsp;@qf15~-Lhn;F-WLFpzB87(BkWg)3$D!TAKN`RJ
                  z3U;Mo(@a#m+}NKW?ro|#Gfd=76wIGkwWZ~nNjmb=Czg5!(?cW6{F!C-GNSO2VYi+bh4&lU&?@bMc_Iqdj6G*XKvAXlfuG+;8!2zz7W2R?IZ>^!Ml_<8cFBR
                  zW#CaCxXM`c_x3}zSfRZWXUlSPdg-=s#m}nFqGam
                  z>>jH$CrNEs=Yk@HQ;v8@1M<}0-Cyo%r<-ZLEWWVJ{3*bI&hhOsZ(>Y?O^}Lo*y9DeR9ABLmwoj=RpoS#Ip4~%G>ik{PMa-TkI(88i2jL^K~yht<>zw<
                  zyvdCH6VI4NfPOJ^!pdGEV;#2=~gG&9f%k&Qb|O9)CvqQ;Bz>?k_!szFG{Nj
                  zSh&dec3EbteB0qbO|yjSNodpSr8o9@c`p}lM4AbA8d>nn4e&cQ5-v06E$o1<=
                  zp+n(*$+3mfO43A=(Q`8Lg4EurqjnO{H?V`g>yHM9Oiigy6}P@5@;H2l
                  zlM&=yvj{CHS0qcz+0x&>Ult9RM8AqpDQzV7WEFzEFV~-#zvEL5hgzFK?Y9z#-ydq@
                  z_Pb3&jaI(Bt=n&TKRP;7RbSn6Cot(o{dI-j2l8y1@}Orh)6-yIqi%ZVNNZEU-E($7
                  zm6`3NZ}WTo)%qvWp*1>pB;drOGT5v-{>h^Be9v4nfT)ilrgcdVrdA#Ws4Zvul`&qP
                  z7K@2e?7dBzemEAJHU|QWmz`H5Z_6uhytiCyhg}S#(!*DPEAkl2%#+#la}I*6xyZM)
                  zVx!*aOFBLVnl9e2VM@IT0)KvNVYKoC2Z7K3nK1?r!O63xFJBG7gx|hXiZ&UM0b~i6
                  zu$=z$@EPt+Lx9P{Tzn$m^5&ojWEXM)0Skw2wnc
                  zgHaHDhG22Dwg(twcc}hr8@nOx`!U;S-3s=nxhPu>PYrMG?YtiqHXORyJBtC%Rl2{!
                  z13*ju`}LF0O9NScSt2{QGdY%d2%4>JXuglt@1&EQdW#)zGsCUpho{jiJ5(`U8}2Fr
                  zeVta<2Ozd-D6z)ODbL7<@#%hlvNe^5$66Dfc?mnVs4|9|adK*I)F;X0X>B05l?(Wd
                  zivcfXQK{aI*V?NqY*+Du@FP5SCtTmFLjD#IgH@(MMH#^|RAc7uuJU@P`s<#UrjE{f
                  zfDM*2lH6@jcognNl7WGKE%&7IaXV3oO{I4ayoW~C;m>`hv~dH(Y8D<
                  zm{!qx8U^WA9R)f5HM9Ch>BnRqO!gDRd=^z6FxANNC9I#D90k53C-x*2rb?H#;+_;&6`STY=zn2~BNn)8@y@!jHYg0&Ej(
                  z#?s2l$Q|jf*nCkw^)zY@ko&lJeLm@3f54adCH%T+SG&UCkuy*V%ZikSTMB~kad}dV
                  z@pf=0w93knR+TDCN8s|Ko*cr$J7+ZY0%VUW8((Kwbvok~7wKC>YEUE+VSRM+B}qCwsymvz_Xt6LaPFz==_jEnytRo@pHZ<`gI
                  zAn(kJD_ix?dNAkDpVT3A3A7t_`W4=Di=18z>lN_B!}60G+5(qDwG8d+lU{`)CU^w5
                  zXJ%;xeNQh|?P4SNxymh#PCxyU?`THE7lFo_mdW2e{rw2h=ri0l)Zjh6#w7ODjp}J;
                  zzwuXq5Fof`c@*;o6Yk1$p@|sr1;65}k_OB~tu=vtH40DrUHi&x7Rtm!J3Frp{hR12z`!tf
                  zYcKn%vCZQna1f|1Wm%tlCBR(}y{wm3tR_<%sFZ(m=`2_+Ry||5?F=)a?5P@Oe8y)m
                  z7qpbd1EmOe3;0P-nuiH;7E=*q)y0k8mJp3s`6uCmj|m4AIx`qb?8jf8Ra)pPa1V`{
                  zp>Jc=(?@$fUZ*6~#%0R$8lB1l9sd;yXRgArvU~lCdAgKJT0uYp)H=UM9=IYi@9(I1
                  zwjfi1_w@JQ2iN$N-5W3lI%W|G0*PQcstpArb^25B?gS39=k|aNHY*JN~J%Mr@D8!=FEr%U(=n
                  zKi`7i*%$H0$k${^*S{x`5{@Y<3T#$Tb#0rfeJSo!hjAQJj7m!z@nyh3!S7M!+q&~=
                  z=7N08#HIO4&DTj5*x%am3hiV?{A!`h-XTLju_X4k1ILXfeQAtH|sE#K5-J1RjlK}ku;)y*(>
                  z%BX_0bRXOwZ&or)nN1B}ul;>q;NLtVnmcv(TsvQl*@eB#Kz%B!E@ZX<13QjZFW+lB
                  zCnw~JrLf?L+NdCrR>Di;OeV|l_>w{h+`Xgy`>xhMM}{X^&E$Y2+EKRn{z7|!N#bzv
                  zJmK_9CfZ=KU0!snWYDDI{$*akPnyen1@)fQ_R*)dNB^Iwd4)*u>Gkz(2$dQsE+Y`2
                  z^)#yOomnWj9y-aSD0uZ!xvvo0HVNU5wUV+SCXXTe909t<6(J<;s
                  znM;MsD6vuhT&ITcPXO>lESXs?k>nB-F=$j;GxS
                  zxv)jvnArMy&r8LLPF+%RKZ)ld|VlB&AZ4}7ISNxDBTpXwHOpgIyuCkgqt9G(PA?~!`12A##_X4
                  zY|4po-3Wkms^1rmPr&P1o~uc3IQxx9;5IGOWn+J_+GHG~FMz9uu>su&m#m;6on1(u
                  z$pNC;sd{G(pjbqOr_n<=4q~KtN8G3EnoyG}#W#|UKNyY(l!N?J8&41}4lz7vDpVrO
                  zmy4B|$3*ORJO$~1>U9n$`jSm}wpl%pCeoM(u}=FD>-0F^eiA0y_OPve
                  zG60(gya*LOT}ZFxzQdtkkAxV|M=6s#k&u!;Z(gz)xt(qJ{8r%J^TWHJ-|;KEqIy4brg@(!
                  zJ78k;6WsZkw$z`;wjU{-3-=rEk?W1-l$$lMJ@N*C&6P{Yz`VyE8>_PV$w=x|et)?}
                  zHh{QA{&?ne^_5EB-E2~CAN%)lSS4B8!7PqxW?`m5+}pe|0FdzUOkxS8!oqo`t7qdf
                  zt0*@bj_ulg+e^D~7fj`{+cB!U&jL@&+nu-OJKJ&=ghcamC)4Y@Dvj~@Q0O9}#{nJs
                  zDZFvuhd|b6;DYzJcncZHk>LcmGGwWg%9nyhVs0ju0H!@R=Z{7XGuapU&}LUX2=o)A
                  z$W4lqd)_e4z<>EDfE>5_(m&_IX8%I)JbwRgu9lEq1czIeu&)0Jrk5cU$oc$~{cS3I(Bu$azK=niT#4
                  z&q#9zegz}}nTp@f5?CsP+ULKjc8;3Nb?1C;n5`XqU#|V@GxNJyw=Q+NMS9?V!aTcc
                  z5!1wpQfF^cJT58U(6wpF;Jz{a)qPX0+rpqZ*B}dTbI_T9fPLXJ%Mhj>_b*bCZUlod
                  zhi-pJ9^io2JPJOlKA}!e-($8}unf)qMC-CoSejLoUwpC|p1EYarpJV@(&5;Rvb3()
                  zMLUQ0htSYEEqq&U-SIvI=OOhtY)vGWJh=esfsS7Cb%IIXo`Yoq(^hAx1^z2MraK-sFt<_nGrARSi1I3N10vbG>JvJ?{)$$xN^93
                  zinXpqP`E%ph-Ff%?;WT#!+hSFW?PEOM%Tc0Kg3a=l^Q&^VzmL|D6mO#(jIc47AV#v
                  zDJYG{RK{dEu&<6cq$ZY3`O2$-*Epvl{cZyekemlq}6imgjhz!XnBNuWpV1dw#qaY^UshT%~zYed=I5NUxRHOm;$1bxJ-ljL2Qn5qiQZ!$t99VrzasNVT6lImW6V+JO0*o^7
                  zq$tM*WPWHTUNbk<{q!lZ%3*UWY?d*0R=eeUH7o7(o1S_-gjvc%GPXuOF27>t<%fh<
                  zZPCw^a5go!@d|kwUsU||-LY%(%4$A9lNwTwRn29tE>2AmC~$9R(CYKBM^!+NXt_)D8*`Z4gZ^$JpEcJKJZ#GNPJSy#5wE6(DQaxNL(8`(-U**VYqYgP!FHCpZtaJCP1Bw`{prB$
                  zI+4HGPmxG0Zxv;U&9D0)Vyb1`>umt9jV1Y8f}PY@eiy&5dxEOC%9@>fXXnj`-@vTD
                  zT`*+bEmffx8I)7)x58Dl$TD_MjHK*z&!3cya~VhHHD48zwAo~T+2qW7f!V@6miX62
                  zGC)USt{2#-bH~nH)
                  zPDjkZvAwd4q{RJFGW+z9Y+wH804BfpXVctJx>_Y)X~7SSB){FF|0Ef%(mwxG5cD!b
                  z!_3QQj(1eDw^}$re-6hoS^{Cw9qDxmk68y;OQoLco1if3r`qE|X;7k{sgFUu0S<*J
                  zN$F?`-DUHgidsONF4oFhE`2F=^^cEz!L|(hDHSouyiVz^nD0RYl%PfDttJ_~fT&}+
                  z>lB%AWYs8C$g*1@@3IN!@f3$DLVQ+D^l>X@?$qn4U4p?m&S(tOg%6YvKD7%A=46ua
                  zFu?5bG?Kw$f(!{63992}|2xWcoex0{A8$SaCvjjrg%M`S{|T6vVf~hgx3_5#oG1-y
                  zaKd;NLc!Z3Sj_+C{Ph93tk2t@QCmK!LccEO+mi@(s2|z5hsK8Y0yjSM*s(2pJ|A?(
                  zELGk`0cJ)6PmN`|RVGIQWxm~x*}o&7p4j~Vd!C`+{}xs&Q#w(uL33&ycYFXGGk${c&VT(k1t0&U(RvCC
                  zNefQ_t(QB=E_KonAVL|VlhH@`_b>gATH}8kTRVjC53U^=n~HpQHh_P}_6R6G!UK|$
                  zu&ky}y8JuLlxmtv_51CupHV3AAU{s7IXF}amu?3$d77$iy4FquhB%C0S5k=o^5Gp}
                  z9t(wgFK!dWAo60hydhbB0(mh{lf;^x7xFa5)@#b0sv6k6^{?&~9yI@p6EBr;1SVS+
                  zWFfxpTPuKY>_~qwkatJR~LxojsLf-_`k`Tp6YPo
                  zHni4@mm3iZSt89f&7kZn_!#TeMJrY^doy|>LuVx9wM}=W=R<9_TxDAG?byc%;4^HG#eP&iYzn)I8y#L2V$UqL=tNXs?fF+mKE2i>{|so
                  zzA7(gMAee?fwsql2<=>#gzMRM4o%{S^@Npi-4_ME^7j{W4B+>rO7{rcKR}EUF`+3C6|=Dp
                  z!;NMGp+m{uqWIRVh{ZV<7}iUJ5At
                  z6!k~0#2lMv^qj^up6ncuCf_gY(KQm|VVB;TYJOF+c=imhSxQt$)l59NB>M~C{m{kY
                  z=gB7y4f^eZvb*hf2|iWcX5h?X_<;|kb3&af^``^>D=6J>U~cerV-HqM=CMs+)0HV7
                  zRbaX8jrd!j+j0O&5m%|M6az^@8wnl0$!vN2boBH`&3?ERI-*0aELivnFSB}Fw}F7}
                  z_x%_vQ>+46ryEjj^Y$o!z^QYGpCYRA`wTs@S<7))*vqHc-qs;_+q^dcvt3SMDL;y>EE~_M~KA_?KL8
                  z78{OH+bnG3<}ZPU7J%2;6lCP(nK4`(1?sb4UEypRp#LW+y@BDQH-I*w`@FUpe?doO
                  z^@WGcYUvkaOxNfrracBtOwMQ5^@D3knCFVOpD^N+uDI1YOap~}HhuoShr1jm~(pzITJI!ZOQYG6=^c}8^aUso7A8-kJWoS#^Kz=0Ez{RobZiX}lV2PR=-!(oFmd;=6)qGFUJS#*t_mbBP|=3kqWJUTgkuGYQaH`|6DhAzwgtrsgz
                  zs$=(yiO;>!PPx%3SsPubXNWv5obK&-LGl#>qEF8#2V9-O*M97BjrSKzGX-81H$i%w
                  zb1KKy_u&mUi+mAxND3HUdaQ-7JCb>;-x~naU%Ar%7krJ}5Or9IvJhcnr0OMKxE_&P
                  zYwLEYHUV2xPQXbdZ!v
                  zzARgN#Q^M3PIL_OemKhJ-+r2Mxd
                  z)iq(5!18vw`$gZz=ah8qk)mwpUZ8U>%6KHr6_p#jLsh78g&nBB<(?SE@kF;zpo+=abz(n&?A4HFee89
                  zv1>mJr7?~N#3%gW;?IpHOaVZc%Tb>&T0XD9tZ?gvwh|7oy3N4
                  z15j1HBYtrK0K@T-pz&q4Qvt8%{Q0r`t|5q)_qkX^lkxAavlHrrvYmUNeyY+PN3-o$
                  z8r_aQn<`1b$XhN)(9!9&a80TZHF-ikfa4IfzbRp5Me`bs3K38#dOob6Fap_25luck
                  zulQQt51=fC@9kyzfnMtCM_=tHJz+tFMe`P+4PtMx(#o<*f3Vs1GpF<6exD!nFrNJp
                  z?f_z*QuW~jMsu;#`8T7CZgj1seVzM50NA+xE~Ek|(VVU$7=&Qfe^clh+Ih$
                  z3*Ah`<=>
                  zxp^CZ{}Utx_?<{tSjN41hobd_lHn1Zx&xwhU)A5*!|73EWKaMJs?pH-#xC_vh1IIv
                  z%U|mNpO+&eLEOO!3@tbL2jfnWmX;Qilq3Y$m*k>Xhy#1sZ0>>{WMmY1X18jXVW=?Q
                  zhkI0RxGo|st>jy(=w{fMNovqru~!i{BM;*-p>1mV2x+e)`wc)}f_E`6v&_b^m5x3!E_QMqY+$0FlJwz@{v}Zt8fr;B2{=
                  ze};j9=(4{V$XG~=qJP{q@JEjF;8@
                  z`WF}1-0ptt@U(cAiMcA;+(IDD>J~2AeSvhspJ1oy_l7;Q&~3AZGTWlS++3@@3u08E
                  z!SxF7ZU+X;MhJSd
                  zuI?UTiug_d2O9%O}adCB=N7T%x8io@bWt>spW4bK5
                  z&_`2CmY6$J03HxBR0_NcC31}Ln6LJ7@og7GmDX2CnIgS0dkL%tL&tgnsH9_C)b%vtcGutwH$7`oA0Lt9C
                  z@2*D0sweRuGVSq`goJhEM>RD8^^sv!m3Fz(g`V;54-tuaQ*tZv#78;S_VEJSnZr&x
                  zmTBwF(s;0!w)zI!uzdj+7M3taV0?KVGJlt|AKy~WCT1z*8AqZdY2V2
                  zwE>IRA3p+KB9$;yuxk-kzA{J#R4PLMkSHlPcG`TLlK!3rmBh-*%5b#K`ly2D8L8m3
                  zsi`R&+fu##9?iA`O!n)gu5lA1Jb}~fqrieqSlxg#AhdPudG36e2>zyRUxws)oFSdu
                  zxXas-29hQYC7~kU>k#$TdGQx4Mnb3MD|Kn9?0SsW-|YNzTZr{&r;n)5ao2&0!p8#-
                  z*zzWs6|ZZbG!E(9AB{2#F92g%)}AXmQOEbVq8_**HqCjxy~;0dS<4a%KQL0x-ksmg
                  z2yuaQ3$&XaAZ+&jg5nW<$}jk>3)sEpNgdajBp{N837_
                  zBR$jIeJFMZN?++wx80yvR<`?p)`^?jwSbfgbs#UCung_0ADj35C>y*^e0MW1eZN_{
                  z6w%07SZr3%`0h|Tr{JT`(8GCSADP?+&H{YuFv6bQ7FCo^hqXy{*S
                  zxVwvd%JQ`D^pJWCpx+q{8&D_~U+Y=zU;NJpuid)Ei#zo;iVZWym5-ihh*4Hkdm`>k
                  z0x27r@S>N^yk8z2_TB|!at;?({TO6ZTI5N>|30z^89$)wAgwUqiYlG_iMgAhADMx8l*p=@OZg&X8xPXHXmpy}Ae?)}2AHmvkld}5o#l!PET{<
                  zMIU-zCa2@UKTKO&+c~80Vyk&jcitoF-P0rQiArG_psKeg;4+l9u<2L}+u%PIEwm#g
                  zKb3*ScP;j#1@_xil_*7ac8s98tT8r)q~yo-qedi3cO`PV$Wm{vf9AoF#K+51B5G=}
                  z=bV7sl8rcIc#(&0K4L#qM%Fl4uuF#Ad5tEKPH=pqAbdJKF%Y=+qr0#IjWqw7X2u3w
                  zioLDwHobOlQNvDJ@h8G3{o`6XQdC#Hd4@^Fp-1K4%5mX@TGpA)fsC;q9bZk0Dh5aa
                  z*xj*DI+v5W?3TdK)h8g1vmUZ6+c|De(5_FOKhC5EE{)Nl@x
                  zy3^lZ-wcY0=3?z1HyWqa8iI<+U%PDZwp(U}A^vw3mm5R5)#`I8asZ3%$(Qox*6;Ja
                  z=NAa|UF$}ptpf$>Qf;*cxFTtkX!QEu40!;PdSF7NgXEV3FiMBax1Ag50|TA5f@+!5
                  zZ;QPGfXst%$_m^ZM%I+42!5|$bB9Kh)g=yysaRyqE8z<`Br2FQMngwi7v8f~o99S-
                  zYU*#AW69w^0pWb0n#Z%M(UV~zm$%D#-bD=^8F3mj>JNpkJZ~60lCk2$Virb
                  zvJcMt#|;CaX0ELRD_D3ExH{^C$J*(a7osyXzCkCbE~
                  zx5B@h?#b%(^Wr77rXPKJeFpfw6mBmvuFc5rSW$h1hzLGfEmk-~y}Typ#BnA}&tH>AWJgARjfdjOa6j$xwM1fI~aqpWN3TzXa0SKSguJxe7F{Y^3
                  z_e(!~X|h2O6~Bqh?HL>6jA80Dyt^I$@BEullsF$ZcjSfbrkmvAn}14u6Dz#!Aw)j<
                  zPF*F*kvj{6J(b;A*(Z~6cS}?_!Pju-5*RP$2@s44^%u4s^YxEq8ESL+?BuS;21XEx
                  zMOVanDU13{@-;?H{1$L7D0S-m{)`kRMUhIcI?;=rP3m+^?nhyC^xReL@0+c+JYTk)4vxg*F8{w5)-c~CHdpi?)CwvZway8LygDf%b
                  z6?)3ucD|13Z$lQJsc+BnZ}At(b#xn-R$^+KsgfT*Y_f?CF_N`fY7w*uEclv53d>XM
                  zV*12%GbBDgEOXqiJbXs`X)Jejdu!Wmzm)}0s{9GlDrf($bkTpapkN#?T}65uJ*!{Q
                  z;&QYXnaJ&XtF#n?Z+3`ONZ=R7KIV*lq0Oyd-=DRT0fm}$HkfwlS@p^b1SwcNL_jrV
                  za?KXhKsGJRBJd9*qs7v}?D2fZ!!H;2f~_f1IVuC_A>5^d!rgk{S`gNeD|gFHAcctY3v_d&Qzg{D{?s
                  zH8*t)@bjVz-mrL%9bXi|6PAS(Nvu-nX%a%1Y3t`|j9^!!PPXC)QSCf1si?&*`}FPM
                  zE6k1+uUHTP@P;e4IUXpEIhn8joUpwQ9+`sE_N-ZwG+~#l9%mhyTPLn
                  znj{Ua!35iXbRg>;opA-j(`@!Of&81=X^B)@W;#{}%rZXyt5)|BuF3O6B>ebSZveF|
                  zDi411cPJ6KCPPpd!&pqUgqA5ga6+^Yxef`26N8>7Jp43Wp9t`(`>XVrW8_cV9MQ9E
                  zZV>t|oaHG~^ivKc;{Jr;0gZdSHC-xnK}d@*ltvay8h}`mCefd~7KhM$=JB^oUF`M=e}-|3!JrL~zVm@!tz?madGuTvsl(P@rWgAvvJJt{Ru{2Z#@;^1d34W>k?3p~05jRmQfSlBO0&ou07VW%bYT?f%wZtVb
                  zL#S#xN?J23PNQl{Y?-}Rz$r3m6>J!Rd^cS1gvqjRFcR_!e68>JK-
                  zym7YtHidA;nq`MQg`e*s^QoICnW2gvJEk~9B*(XAQDw&_s&}dOodG8u-f~@vQ}G+J
                  zj7oZ+GcrTc9%igFJ?qestY
                  zt8&h51Rg%1H0Es(+h*0idvK{(C{(gGea56i`xSPKAu8qOJ5O&H+ArJCFt^O!I_O!2
                  zJ0R(LMDnZ_lOBV44!Id{Y4To|9(-?O7I!tYV3L4}bY)RdT)m-um-1x`nx?8ccadcf!D`UZMVmHxR2z9aZaOA~%z+(8%CD1fXik
                  zNsFG%9aNf+g}m)KwlNr`hPO^O4MY7a{G$9dQODBgy`#+!3TY{6^;q
                  zH0*7sM{FXa!)5FG?7F|W`j8{eWy#y-T;Ft7uHWlD4(Cq&P?}NFE6UF`T3VAiH&qo=
                  zP;BUJ(Mu77TT@U~+nOfF@&z?A(ll19v*>DB7_2j?XuGL5ynNEv^1^3?Dee%dCSw}|
                  zc`T9n3oz*wrrD0a?9+-I<1U`ZN`#vwXlRY7jeX~EY+l8WPOxvy?_sQ~QLYi^8Q=6V
                  zhGVYt^^xEsCZ^_H9`<{)f=H*L^NTF1R>R!~cYSF#>AFvLbjJO;$>5UQ&}c^S-8ff#
                  z8?w?u;D}I-{(2s)W*ew}N%krP|4z{kWkzn!iYl>D^maepedK3xMmzr>-j-hP@m-*i
                  V@2nuY{X+p>TK9C-%2lkM{TKV@1^WO1
                  
                  literal 0
                  HcmV?d00001
                  
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area004-v001-MC/word/media/image8.png b/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area004-v001-MC/word/media/image8.png
                  new file mode 100644
                  index 0000000000000000000000000000000000000000..36f8f3442f76576111cdbf7a2743f3651b62228b
                  GIT binary patch
                  literal 16068
                  zcmeIZbyQnnwDyV9;!c6$P+BOi#ZrnxahIUQo#K|_v_L6N(c%zXQk>uvcPZ}f4uRxL
                  z?{{adx!-)V)~s3guUV6xaD
                  zV%SKjNTHzAd=G$WBqFy_KWoZ=K&c#kxsTkyvQU+ty)Nj0MwYv|w2c8=i
                  zqm=-sl%a&p#Nl(RD+Q*z!|PvGLEth|Z;dImnbrbviI+ULl--Z>^Vn%OfhZ|&TfY4I
                  z<$reLC0B9qZsrCz&l^fxdU9G~zO9jONRTalr3rI7p&I__O|Ux}&LmGDul+U^xJ}cm
                  zUavqQ0qU=$d4Y%pe5Zw?`};cxl&2bP(^##=FPn_5daqGL;H^fUATGN(XfHBmTf7mR
                  zc(gTyE>MFPRb>w6ZgOSfuRxM|9=_Y_wZT#vdl#dx%J1vmI6A%^2c0?Jl|7}2=2Cwn
                  z_naEal%S6=XTG(BANf55D%if2r1ySy2yg%9AMf@jYw12MU|pxP*6M)|H$B
                  zQH~8^7USa*B3tz3sb#wFuqA0sR+2!kgzb#U18z5;XNr=7SLe#IaJ#47fGz9n?de;H
                  zKNs})uVdw|KX10d#oR7DqOxCsLM?)vMXM4YlY$YfQ~6^;M+=`xO#?L)fkY>wC~&@A
                  zfuhpHfQvBj-RFDO$Esb57+T`o7~e+dF#vzO%8L
                  zd{10@eHOU-1?48;W|Zj9DwDX6o-p_I5hEW}mol02@5XvjCbr-thrp?vFCh%FBmoyz}!mtF4R}=)`}}7uKswT??H=
                  z^lT(fz^XqvOSgUe)Dw8L;@^GsGlh1RF|t@92wo{vYgO0ZDcx|sSyk++N=`JGI`X{^
                  z{DnE0wscLw%5t(kf4+WORQIiOOh!YV+qFGLP@3+PBLIhWhpLvlLad^HoKU$;TTX4U
                  zdY@YI(I<}a?3N=uSlYY$?*P{6Eql?fa=YKYrbtkx#*kx{q$Jm!hr+w7gBIW}NMiMz
                  zU+0VS^0%((s1=eHX|+=VO8TWhCgiN
                  zL4b-a+9ej3n7vbmW|pj!{lFAI`$g*DQ_?SlvoN%$Zj=f)s4UKXCe>nRjBVnyjl{1O
                  z!|8nYBHDIwkTUZ7l3Wx!i?%9>M`DY+Ac?8kyKl=GhPfa29gB{uv?(>?`EaLYeYH-b
                  z&j$Bx!Rtea#3EX0vo(pp4P~BGy9wU&ILCbLujNH!tb(9(UyMw=&U19ywGBth1+Oea
                  zlZO@>BmS`DLd?PBflBV6ywog=!&8uGuq8|^@4Y1D6hx~uB(mKrY>TEFz*QVtFhLKP
                  zlT8*K;yG^FY>r^RC>yiUlhUn}FI~M#-KOgw-Rb-&e+*lNrI2t^3J}#R*Y>
                  zxNl>ADc0Ln#SnMnCG;uxrnbzFFx_Tt-K3IgeQewHf{Xa+8`x8@81E-_J0MJmUGp`r
                  z$)Wc6wC0=pA1rps0`4BQs%}}DuI`$bOWKmG{bPT6dxb_UclCNk1fZ5JkL+u(4M=5%
                  zdW90f)`k19!0v0<-Bh*v2ssc<0PCrMCC!4&Uj#5MZ`cGf*=W
                  zmO5GJ$*2;bsCJR`SfMl&j@z6b(jK4r1>)dizTD@an0|7yuUW@p$6BJrpIWN^g92gc
                  z{V^wzg|cnE#Z(s(6HxRk=dp!UV^FswAYV7u_}}J2JX#xutED=>RUa7TNvS_XAJO33
                  z&UoLGYDzyr9$Upm-x&$M;TV#1AbE>j<`h_d5w}%q1<^{z#SRcWf2Nv)AIJh#R{Zqo
                  zWqJ8qGY1DNdntwVIfdp*b~Z{b**&EQ51_c62{VvDan8mOtfu1QbHogD-L&=q4+*;@
                  z=uu*&JbK0p!c)UBrdoY7wX#53Sv;!Wg&sl_xxBg9FqQ>Q0jcc>^ZXmjzK=RI&l;oO
                  z0Uq{>YNs)l8;kqN3S>eMu`GwF6k!vac!9Q)nXF^Lq?0f8hGacU;k&~)L=lofYER2U
                  zsn=_Y@2|qPny*K*{EpQtjh-)&C}_1-CdRhJQDq63MZ-9L?
                  zDnElh?mmAfel&u^s=O=sVU^H3SHDTNnGpKHm+&fJam+Db64Ifd#Y4-#P6WS|GjA(j
                  z_m|JOD2c4VWBoC+OyK2}Vl8-om5>ruaOk+iK=_E$QrP@B;}9Qr6j~Dp5X8i7+_>0w
                  z#X|n`S8U7pUljw}!T8FiKk-89AcEZ25fQ!Vsy@v7i}XuSft91*2Dg_ImD491j?vZC
                  z^JKf>;j57@CSp@C>)6W;SgGL0Q|J>Tii_uJUdGNOpO?0*fYVmi#&2n9OCJ&<2}V2C
                  z#E{Pi_Ysg2BSJmFwJlD2_ck#xfZ;sy*H$7TA}Vg6aB=R2oEoKX4tC)(L(yw%wn-n4z$0(xr*k5}
                  zI_`VH?iw2BZ$`OIrfCUoX6MV58V8=*?wkMqdYAv*=`vSs%py+UvarBimhg@qceZe$
                  zV2kN*JOAsEg;qzS2Q>UpZ@dETQKl@;FdcT^y;nn9R9M6kCkq3)4s9g!TAC&ADS$)E
                  zjr$MGmqOrxeEV&AqXm}gL7y*`Kpen1{L_%VgDvJqLoMA?tMRIsJ++gHIoy5g2U(Db
                  zf?MFlJG<}~*NVPKIU!F-B4j_+rH4Ihg-e~+zZkTCknp3^)4ho
                  zFn<&0(2x6ebhNYby8dxqZg3JfOx4n_JHdHip*pi+!Mv&J*O_hTlPHzDZmTgH@HK9I
                  znY*f-&Es~UAz=T*{qlGHYX$Wj(alCX!;Y^+t*}n7z-ZG+JI(GY!@rlM-&423>2J8h
                  zgV?Khzw?qL6nh0-o+7qfUQm0{Bj;93#E4$5cU<0UlVJ(1tbE4Ilb+q#Iq7?S&VwRZ9Tw*J@4
                  zsHV^+zo&*!OAn`j>&YT(l^{Od4iS_0N?YzOM==9}SK)v2o(z{;Z5=GbF+U$<%&~};
                  z^ZRpKQjcPL%q|*2^P1o%*^-~v_RXt|=sx{g593YtbtfwPfCd}vRT;PGAh;_z)V;vB
                  zqf3RYYzuRR2`noQ0U^yGMt>nOnU(0N+fj
                  z5^rud5u}rb4Cr@w$r#1E?%u&QRv(-xS?U7ze$qP5-c1eo5Zc*)QXjq)*I-?PPyOO(
                  z=n)^`^ihNP=A|Z2zho_xYsSrawW^P}6^wyBD1a{utu#-hC@+{zRn>mVE7m<;68yot
                  z8>2@SKpI%AP(HS=dy1~E^#7#}`rlVa|79;?NF{sFCLn>1m{>#UF0rljN55JS|MBbJ
                  z$F0G8B_dBU?bJG-_xfl2wmt6jZdvb7-MD`)^7O7AyDWI&x6>J6;vekzfsZSUKT{Pd
                  zeG2ua>z050!sDn`1JEM5e|oQmSjWh-+~8e%A`$Usd@1qZIHh)!!Q0eq_p_?_
                  z}dd
                  z_S_FmM=wM^5faej3mMr2nNnVXpe!r&jZ*?n2Xiy(!(%Fd3*r6zk?{Ob!4z)$Fw)`=
                  z*NFt-;`i#a%wzO>OYL8RW;+vKp7NT~_ATJ+5s{NuT~-sqlKE({8RJmfk>|~H@vmWC
                  zrYND`?Q3hlvjt?zzp5c}KWg#hwD=8DY@1{RG$Y2;pefjdDt9~2emfIRs(l{G;f{tc
                  zHa5?%Ez+ZD5{xRsvG5)dXucknmtGF%CSw+9Fl7l5aLh&&sCxh1RSv-$Sk*~f=2qZz
                  zyT@T0IkwmD(CEv{r@BC)6QT%wE(e@Pu7j;4d96XMww|=}$cYATH>{vRqJm!!-v-C!
                  z@i-#a=~JZx9?_HUO?%hO{XN%GW7_4Ownb4C)@MgoaE5e^KRj8NRa>}OPJ`pMs%#E#
                  z4n=(SDEWNQJu!u
                  z{hj%4cE-bb1L#qcawKD`mod3Pk-=qQZ++73|{0*NOv%hSXbONhEM&
                  z9Nwe;Ew001LxA1ZR?w-7%qZ8NKri3<$qZ>F<3@Lg2!^ZG{Nv!~3X5hHYD
                  zG08%~)%InR?SuALk&F|QA5Z0ayX&$oX6Kk&1IM<0d@m+IQkA8WPu^>n@#G%se--Q>
                  zUD|c^q1gi0F9HHGuRs5d#R^g8T#Y#M!dmsC$_e*E~98jkZTTjN++AMC#F#0HNVF9LdYK4+~kW*u6S(}F^A-yr+R20%mp65
                  zobo82J-fSkoL9U%xcv+pn*$k~$URitvV7fXE~>@B7V-6cT!LpwDZ;Z?v6n14@lY#d
                  zaJ1-H6j{JRZW@Tq5igoeKrqsCbcec&fz{i11
                  zUDiWVHt8$Hc#=(i$XqFjXWZ@Y{ltx%W7|Mtg^>+T9Z~1M!}6wK?zOShpWkzHcWU!}
                  zEwCQO=?KS-*x`JBQ`LSg%mvo`)bDk#{aoyYi`Qc2L6FiwgIk#nJ458*@SmX};&tL0
                  z>)-~&+Vb8KBXqQfqU1wAr77*~ITcTSXz)434+A|NMe}7k>+S
                  zfR1$chmSDy
                  zYM-C6S*Ihd;P8F9@n=jG8vl%tAf1
                  zUrFF*It%nA~N+1(Ta>W?W3wWweVxY~}YioGArmdaSZ$>G?K!U{)Yt
                  z;7XKNY(OftNu5q=#AmV+`<=@xNJ+q(oJ2D_gpQQ9d%8HKoyr|4nvj~GTz8}0F>2`|
                  z65=n_TOueI8U~7slerIrrKG(N6M;%)pLeolx4&gKV+QX*J%Hqmh1CZej)@0+!p=+l
                  z*XyrXr?#4*Zu|>L^a_Xb{u0rfWnbZ<`X7I)`@*3OvuD
                  ztaj7+Jk`2g#$}n4o+D7LgmC{QDzwr>ix$7QQ(z
                  zE_xrNw+tll;6JEY{w_T2Hjs5Vamu(G;ka9580ogk0yV99s0|8KB0npTZP0=}HUlID
                  zdD%PS=)C_preB>aM}NaWAl0Ku$zez^fJ#q~2H2h4N#AG9LG^>N(B}=Nw=d+!n=>|U
                  z%p4t7W2zDh7Iepg`&VajTcoFvpG1+yK{G>w<{E&)RS$Fh=*M_|%ydJ;}5-XnL^hHTwI
                  zqS@a;<>sCuhso91X#}z^+^JXNqI3ug2RM!RH;Nvp;`zZHXhwl&|N-)5m-#>B+hvvQ34PxBk6pc&U^AWI1i)15x+GS}}
                  z1b}0_6-9kGOO?pQtKFtNB_<_Gk>>9{YUO}~gS-4lYL1@Vz{ZIh#6@#4sq0V0qK5Uz
                  zjZ8rD^7cFX(oIjv@>d;nte
                  z`SKPgCFJU>^7HFyDrwUMy!7~m08Pa?K+q&{GNW&ip;D3&uJ=)UE-XH5=_|vCkKE)-
                  z5&I*lWp~B``j1%q1(7WoSts2eIlB3R2$=^MXoUad_e)$IXdE?tS724*w(C2dD;Dv)
                  zT@03%rxUWmM*5$JE-sT*RvpJ7th?9G0+|u{-aH<6CIRzR9^Vd=7u+U|o)QvfrJ8z2
                  z=GB~8!Z+09j)mJ&;lSs{q}rS-X*Pd?D)a*}V-JdrT~p8?RaN|Ol8szv`d$
                  z+BgQO9u0~kl99Vpv32`PlF*ZtAE%Zt0SrMbB5u_R*qqYohr25<
                  zK4tZO3>(bAM46qmaqHw#CXai2VuHuY{#H|v$cT)4r_u;Drk%=^d|8KR6nN&ntiu4~
                  zMmI1N9D~iDayRgL`TFw*sbi+jat3&snrph7mf^`f`rf<|aM-ATy_22e3a?o|Jv{KI
                  zSXY$cjv=N`)f05!5OA!aR#lx9l}-%?_o0F&*{kp3utc8)+?|`y?tSRC;Q6HflZ`Ie
                  z1@8q(RGHq0oi6`s10n_d(YSLLJnMY*G)=wt*eAEee%4Y+yV6WsaatX(@lYCX2#ulT
                  zOE{6G`Z(XR>gBWTI?Wl&rv%!6lxs$TH_nPN`eqdr2riebHF$dOHj}G(a)fTNzLTK!
                  zFww03!qNW1Km&XIRfX>1*tA1433LRUXzvgv62S7}*kswv)~>V(PkBd(XPNp9Cs@%)
                  zr|=bMcOl~eQeR-$0xvNgIxU$l%c2nzhRjyb?8lGwQx=8yR<-
                  z{}kYElw%w-(2xCx&_tnB>mj~ipSvwo>Jv}gm2{zitE__gy0Ze_MajKg?1hSIGxaAk
                  zbEQ=&g?&A)%z{g7!o~bzwG4d;t;b{exU7;%mQ7!YZ;S%n3cU0Q>33E--L>^$e}6R;
                  z6kt(Qr3@W!7lf`tW$nKt*leA-^0cs?C@MtfUA+-2>r%Pdb(N3B5PtqZ@?&bM3Z9oB
                  zE^-4$2SzCx8Ysn;%`wfa_KO0cv_BShH#bPLUjtMV2qo%B69nP?3Y@=+SPP9zW9WoC
                  zq|*`EpD;>_sl~l`vLfU*0$AL)}I
                  z9V28191H$Yv5(+Sh2W4La1#1cMMkElBj@WoF{4BJ#vj3AVz*0csEkZ`Y<;jhe$6%S
                  z+KJnzR|qH9fA0)J4i;-{|2h26?LlJ^FaSLs+o%4Znu0jq?Li~|qUA|qH|-VkFXt!3ASQmYbUgTv_ZL%UiIW;;zr1saFGewGeHmO*;zJkk@2`t->VK8&
                  zfP@0*2>-DFl{6)*0pt`2U&h{jT#5{}RFv0K{egj7@t%UVHA(=^1G_7#YUwJ|Nt;cA
                  z!p7m1r-t!g_k+dolZ(A&S>+Mv>J`1}UJjN}LjN%ZN5ivY6JVU+Vb$J~sJ~;DyZo2F8xFDZ5~JzQuybeoCnbgR;xM1_hih7(|N9c)?jC>kw%FwYd`al(pt`ir{L8-6dl>?
                  zltPxL`wM-e%fi)8Hbj!t>I(v#Qpx-Ux~sK6g$GkcD~ku}nzE4g(vCH5+|f;uRm1VK
                  zE~MOf9}s}n>YfJB61^~aS@aQ5Wb{V7R&4Fbq*tTzqmaaDivgQPlZDq?Be&()6|JRk}B!0&e$S4Yu3fpDY0Y
                  zhm>jhLLmba;lXpxY}=i4_&(zrjwNrk)04w^#N3=n&MOscfma)#tr>*u*5%
                  z`KEDMuKMISXyZoYFZ^18WcmFsr!i4!?}SZc$0QfeJAVNi1I4Jlr7e6Cke71*+wAiP
                  zIj}&UZY+C=R-JvsyJy9t^Cb(7v`AwI!y0}R!&i7>xr$1o1B>l>l>L4-Kobd0#+P!q
                  z7WD^eIco!OI=$cOI4w}21D-{;wdF>eUFqvxH$Bri3_APcWnuA_s6vxM@6wksH^tRM
                  zL0#(BT)2A@`cgXeS1)x{D+goMs!gS<=_
                  z=ECo9gFh(ycbruOLhxVNh9MyafYgqhbApN-r5T+EjlvCfPj$N{
                  zC2So(mBMIEQ@sJD!eDmAy1R;=F`*xTSS1+g>d;(H_9r-CM)ey8`%~6kdyW$5)k*Z3
                  zPHCZ%mJYZ?lR23wvBJ{Z;-F&EFnN?!HT9Go_(EBGup;46sH2A^r>r7D9QBMlxd4{i
                  zGJTvlj1X{ZnKZjz6X3bj?Zq{GEFUtWm(o|c3eYGlWdC(d(UoHVyx!UXanzaL|j3yQP1
                  ze|m=>4=DTg=rzCuE&ld6`ZXR9{q0c~xfTBHk;}e?*DWGpJZ|&L8QH?Q1fTNO>aaMQ
                  z^uVusq6z4x0XCfT>zh!!al>s=UwnwDU2Qf$pCVEDuY?CxkgEC+r?!+!D~?AFYpJmU
                  zN*h{$ko-*87!?|blKf5{OT0NtLuKYcr-RCCyr*@&SaM2j3OrTiKY0CT3yH
                  z$$Jl3NF&ZoxN(eWW-9elG@q@cOcF0T=#|i<%2U2QEJZp&g-}y*hKJ5Wk!0;VjUkOn
                  zU&(DZOCI?Bn?P(uG!QQ?!>_XRc3_(#-Xn8r*LWn6&HTxqTYOBM(kHeh?IFXAxjZX+
                  zxq3ZrYw#TV7v+7{6{X|D!#IRV4j8Tb&&>NHyK897i*iI*@pxHBpiap%b(kO@M$`cK
                  zx7aJv>5H#Xe5|;1Au*qVaduEwzJ!8*g2=L!P+1AhKGVPO+I)^H^bWPa%Y~TDH1S+^WI6gAaoB`uDX-Tx
                  z{dI^-?#a$f}H8;FPYQi(sIi?cLi7A1Rl@%ofJ$=p>WaE{IiI2ciPFH57b+mbn
                  zKhPQ_1@5U)HCEyagQQ(qk&|(y$wF^A62kveCf5D$5voQSk}@N7Ed1q)PIVcPwr;+20@SoT{fqsOL4riI@Zy}8T{#CbT+lM^wPw3d@U6#Msu|Z5vgJqrSFV)AKqW`n
                  z9=>t;OoS?A6I-;S_itbQG16$i@)rJW{ft8yH;E&Wc6-QrS5aE#D#Vf=M6Fxd6oTdX
                  z8R@`klH93gJ?|{!AohW1pRHmySK@_q+RgrSjI7A;k5;V-(xk0SB
                  z184GpDpISjQ&Vv+1Y4_}HwCBaJAV1k*K(?}{jVrez0K-K&uI`9?ZOs6=F`?{R#cS!
                  z=9mXd+Rn&k=D}lzaQ^z1ZRp#|IIRAqrc5G_saAyX13WTzA&!b)ZB4%eID9{W4S@Tx
                  z&s<~wUjQJ2{kaBb+5KHECGYo!oH!OIU7xKnpGnh0k%E7F$nT7W;oto96%qTp=B)7X
                  z;8Mp)gk4mX@E>jCBK{mdI=n2}H~9U-4fZW}tZ<7{->{2A*CgL@F;k1kBGbnTHdgcX
                  z+x3jO(W`cY&DOghd;BSw3(^@eT5ed|TK{h6YZk>uYN}dbrCv`gYEV^|6L#N_N64CFq<1qM~$d
                  z56<$lRpY@#Ec?6c8(mE18|eWsFlF-)Ye2sYrdK<`
                  z?GSY=P7-2`zMdkufWqZdy4A>;34->F>k-@CPjs&cWNNAxaAW7&Hhh-5tz994N)F}@
                  zm-q4ylV6f2fGiyVGCJ6@q=YyxZRWIsgRldhb`Gvr3BFH2&S#V}(oZ%i|0mbsyy`F^
                  zz-|4pGB^<1Iad}2arOEgQ4vc{F
                  zl?8eXI(NtT@WIlTCo1Ys7<8t}ao&R#+2BHxe+*q;v&CO+<+7bw!UmeWDajeXbxA1R
                  z$ERvngZ{4h{T?1rSpw|FJzl&^mx$%&#HBEOU)8?2wz(N{Q*pUIx$P?8kV%Qeyv1+o
                  zkZehRSIWb*!-qk)OLlXDhL`dV@1ZkmtJ`covcA=ZOghkypJC3oSf`>d**GQsz&+x
                  zKdgi9cOc%EIWY^7v@}Nf#y=g4_JhKg&-%*3iTnX3&>VR8a{=cxY$RCS8K3VxejWSa
                  zPvX$?)e+IJo-|cV(Pf-SG=NYLygfeTvPfKzF>fTqk6~ixh2)w_FRX#u9eY2?R;b}h;jwgAd+5h5UVD4(l5MOcCg>zEWepy*YAo%
                  zZOPuQeM6;B`hbKU-oh`@xWK0n=Wank?iWaMw~~IB#v337a^5|mY4qiwuBjp9ahWhc
                  z5(yStY}+bo6s@!`V=*9m`*peVklUgKHryCG|7Y*Sk0&m(^6Z1~{>1^>GS(rke*x~{
                  zx(qx%UJ0oR3OxBBGV9VBLDIW4rAA5JlTjY5K%5!LFTO7wZF)hk)9+7qs
                  zUj>K2Te+D9!k;T@2uYMG&nKF{wSV(flubWox@%KnX)?nuCcaGG1;P!UB$+NG?S&0d
                  zZEPF@L%`-qh6k5<>zjKcy2*1p4!2*~eRTI-(E2mxmn
                  z+bPK-g;)MMF3bw(yl)D4hlYd!!RluDiREmmsk!84eZwfgY9eF~!0DDdnF2B;NYd4)
                  zsgY7n^Pxu^b)}NV{R&!MYK9e9MS4EWBN-rvN5t2T4*#&8cq1!gB_VPiIut?dn~Nmc>k%+6B05bz*e@hyuAGJSu1c_ABn
                  z?rvC=W&Do)pl!B{%&ySvhP{_U70%{3k0$S4stf^}
                  z$xt~saJ9xMd!w7pM_c*#SAN$RnEsP0t?v+9Y!EfU*8FV2EjNM6;!a0mW$g)Qif%K>XI@G^oh0)c38M*hRl2ul{)QY4dlPmxX3&ig%3vWCzIEo`hz_+M>2QrFzbxO0vA*6O3$^X03!CVNGw-70mHJ2+B-uuvo
                  zCuIEl7jG3iGU3eEIVb)n`)7tMO{fmuD~voIT>C#jF!ZB6UQ*d%LOoc~z7y!4UAgjP
                  zP$CsD#~jo8iFM@L%AMO4N^a=0DQM~U$->(GZ6x~*lZQDjwPPU4PrSyq8(%=>D>J{B
                  z!qX-MJ(miU8PuGMKYF^w(1~djD)wFak=5ZMPZxln_L+n7RNK)$mtbj^lzmQoI(&0>
                  zH>LMxU&+bN5n-S>cKau5D4vZ7iSTu<9v}zd{rMt!
                  zADlU5^Wl0KgLYx3ySmeA#CeSQpXWTr@+l0oOK`8zX0K}8L=udo?jkZWXeIY_GO;87
                  zU9$Wc=AlDrCPSweL)>SyAKjIafZ)VtbsPX)jM|k_7RP4&-=VPJ!za6|s+&hm>Q6o5
                  z$dVB0h<^;~Rik5Twb0ny^+HGz6I-bsZH}3>XLypBs)&c+a~S=yB^J6wuDe196!lwU;HZu(fglEKLI&m5C|sHR(>#D
                  z&cP=9g0#5L7vnsCAQ>y9nC#9g+~o~Q0O)esg^=_v)3}Wh+O)V-e2vkDpT9{SDNTTLcUcd-k3LDx~}fEovUCWAS8he$r^Sw
                  z$IhJ{o)#06lSk@~1WrJd8QUI{%i{H$AM^fpdlm)Ke@Pj+=;~iIs2Up_BwmV4|T*Cu>EUCi-;QL
                  z`s)FvE3$C?ZDPU$@8bi>cIXZeSI
                  zPd{scPs|RtXdHPN_n{NT_2+JXiRkW`-Uv2A;tAYufsc02MBFHMxx#XhZ1|hevFwo*
                  zvb&b+m55;JTLyh{tOELgd+?C`f^NMAWE;5@Z3=S4-7Z?53iabe(`uKnMqW5GkIJb`
                  zSBE+dRcpz@!W#<^1@fdzOGNIX4{Vv!?&R=?RG}L(FA&f^pFJ(~H8JFnJkrBCHr(z;
                  zHjMi^yE|RoYQoz>$&oX44oHzr7jf!(s9Vn^bEOe1#x6=1Yg9RlNq>InQcUD}al*X#
                  zh+Iq;0N<8soozz-SA!M~5sP?=h9T?P3EU$Cz@NYZC1(4Xk`PhBGV8n0&nF>*DQ`ck
                  zck(X@9RHb!gg94ap0m65m36qp!Q3cpXWkA9oX)*deXVmLIhgW&=Clgi(0o*!4N}QN
                  zepgX_#VsE&E+(!RyGq5GA=l03l8N(3;OeUIe%UaBBK(KC^2e<8kj|%WGpDRyI79|#
                  z@RoH~Z;;t<=xV@W$SeH(Ysn|^MXINVuuk^#8#sOj9%{SPvaOD?w@fFR+iO#y*`rHd
                  zUW!Iq$3ir~S$_Z<-VqHJTR+C*MFu~+PK*>U6gFQoq{?aeb(S-)+BqNngEZ%O?y&@L
                  zbIei5Wih;B(VON!b$l=&xg*DyK#eXLUOf3Cd4rTt@36}fk7QN(@|Gw0RSC<}*)gj&n*ls9Ii<`)qi}~^mepvrn0-Wj-+ANk4g0dH3`
                  z>`y=M5M}J|l*A&G*tA8FUbJNJ>@eS_?W?`R|ztr%?TsasW!rLe9jX90g&!q
                  zA7S`lQU8adY?&Y%q)a~Wxk@(}QNG^RQupxq{@UX04?*m;abDiqSMKUVHd^tByl;1=sx#II_}!Z(pNIe2@Clo{c4y{esz
                  z1#4Ey!s_QY+Rib+MAj6=j>;B;EG#LDCH9|z&-#w)#wm>bO#et{sEnk;PO!9Al+IIoK_E1hf_P$x_>Mo9*c41w
                  zYVrt1%dDSU)sg~~J(yyuN8^`*MlBj2
                  z%KTQv&b#?_41c~@^Ddo}&^{d>A&qrn;t$S1Cm4a1$D%LW+h|
                  zOv28@J8@y6VzkCXd}&vexcGNE9S!J`O-UbenNq(Uo_AE!3`kxg*U;XXzV|MOYke5I
                  zH88}m;KUR3u5
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area004-v001-MC/word/styles.xml b/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area004-v001-MC/word/styles.xml
                  new file mode 100644
                  index 00000000..ee967ee1
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area004-v001-MC/word/styles.xml
                  @@ -0,0 +1 @@
                  +
                  \ No newline at end of file
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area004-v002-MC/[Content_Types].xml b/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area004-v002-MC/[Content_Types].xml
                  new file mode 100644
                  index 00000000..fbe325d6
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area004-v002-MC/[Content_Types].xml
                  @@ -0,0 +1 @@
                  +
                  \ No newline at end of file
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area004-v002-MC/_rels/.rels b/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area004-v002-MC/_rels/.rels
                  new file mode 100644
                  index 00000000..d6637f3e
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area004-v002-MC/_rels/.rels
                  @@ -0,0 +1 @@
                  +
                  \ No newline at end of file
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area004-v002-MC/word/_rels/document.xml.rels b/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area004-v002-MC/word/_rels/document.xml.rels
                  new file mode 100644
                  index 00000000..7af141e1
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area004-v002-MC/word/_rels/document.xml.rels
                  @@ -0,0 +1 @@
                  +
                  \ No newline at end of file
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area004-v002-MC/word/document.xml b/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area004-v002-MC/word/document.xml
                  new file mode 100644
                  index 00000000..6f95f076
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area004-v002-MC/word/document.xml
                  @@ -0,0 +1,3920 @@
                  +
                  +
                  +    
                  +        
                  +            Specification: MC
                  +        
                  +        
                  +            General
                  +        
                  +        This section contains the specifications for the MC services.
                  +        The M&C services provide operations for generic monitoring and control of a remote service provider (e.g., a spacecraft or ground system component).
                  +        This area contains the following services:
                  +        Action
                  +        Parameter
                  +        Alert
                  +        Aggregation
                  +        Packet
                  +        
                  +            
                  +            Service: Action
                  +        
                  +        
                  +            Overview
                  +        
                  +        The action service allows consumers to submit an action for execution and to subsequently monitor the execution progress of these actions.
                  +        
                  +            Table 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Table \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Table_TOC \s 1 1
                  +            Action Service Operations
                  +            "
                  +            :  Action Service Operations
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Area Identifier
                  +                Service Identifier
                  +                Area Number
                  +                Service Number
                  +                Area Version
                  +            
                  +            
                  +                MC
                  +                Action
                  +                4
                  +                1
                  +                2
                  +            
                  +            
                  +                Interaction Pattern
                  +                Operation Identifier
                  +                Operation Number
                  +                Capability Set
                  +            
                  +            
                  +                SUBMIT
                  +                 HYPERLINK  \l "OPERATION_1_execute" execute
                  +                1
                  +                1
                  +            
                  +            
                  +                PUB-SUB
                  +                 HYPERLINK  \l "OPERATION_1_monitorExecution" monitorExecution
                  +                2
                  +                2
                  +            
                  +        
                  +        
                  +            Service-level Requirements
                  +        
                  +        
                  +            
                  +            Operation: execute
                  +        
                  +        
                  +            Overview
                  +        
                  +        The execute operation allows a consumer to request a provider to execute an action.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                execute
                  +            
                  +            
                  +                Interaction Pattern
                  +                SUBMIT
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                SUBMIT
                  +                No
                  +                 HYPERLINK  \l "DATATYPE_ActionExecutionRequest" ActionExecutionRequest executionRequest
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        executionRequest - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        Unknown: 
                  +        Duplicate: 
                  +        Invalid: 
                  +        Rejected: 
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                Unknown
                  +                Defined in MAL
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                Duplicate
                  +                2
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                Invalid
                  +                3
                  +                List<UInteger>
                  +                
                  +            
                  +            
                  +                Rejected
                  +                4
                  +                String
                  +                
                  +            
                  +        
                  +        
                  +            
                  +            Operation: monitorExecution
                  +        
                  +        
                  +            Overview
                  +        
                  +        The monitorExecution operation allows a consumer to be informed of the progress in the execution of an action or a set of actions.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                monitorExecution
                  +            
                  +            
                  +                Interaction Pattern
                  +                PUBLISH-SUBSCRIBE
                  +            
                  +            
                  +                Subscription Keys
                  +                Long requestIdIdentifier actionKeyUOctet actionCategory
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                OUT
                  +                PUBLISH
                  +                No
                  +                 HYPERLINK  \l "DATATYPE_ActionEvent" ActionEvent progressEvent
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        requestId - 
                  +        actionKey - 
                  +        actionCategory - 
                  +        progressEvent - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation does not return any errors.
                  +        
                  +            
                  +            Service: Parameter
                  +        
                  +        
                  +            Overview
                  +        
                  +        The parameter service allows the user to subscribe to parameter value report and optionally be able to set new values.
                  +        
                  +            Table 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Table \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Table_TOC \s 1 1
                  +            Parameter Service Operations
                  +            "
                  +            :  Parameter Service Operations
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Area Identifier
                  +                Service Identifier
                  +                Area Number
                  +                Service Number
                  +                Area Version
                  +            
                  +            
                  +                MC
                  +                Parameter
                  +                4
                  +                2
                  +                2
                  +            
                  +            
                  +                Interaction Pattern
                  +                Operation Identifier
                  +                Operation Number
                  +                Capability Set
                  +            
                  +            
                  +                PUB-SUB
                  +                 HYPERLINK  \l "OPERATION_2_monitorValue" monitorValue
                  +                1
                  +                1
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_2_getValue" getValue
                  +                2
                  +                2
                  +            
                  +            
                  +                SUBMIT
                  +                 HYPERLINK  \l "OPERATION_2_setValue" setValue
                  +                3
                  +                3
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_2_getReportingConfiguration" getReportingConfiguration
                  +                4
                  +                4
                  +            
                  +            
                  +                SUBMIT
                  +                 HYPERLINK  \l "OPERATION_2_enableReporting" enableReporting
                  +                5
                  +                
                  +            
                  +            
                  +                SUBMIT
                  +                 HYPERLINK  \l "OPERATION_2_disableReporting" disableReporting
                  +                6
                  +                
                  +            
                  +            
                  +                SUBMIT
                  +                 HYPERLINK  \l "OPERATION_2_setReportingPeriod" setReportingPeriod
                  +                7
                  +                
                  +            
                  +        
                  +        
                  +            Service-level Requirements
                  +        
                  +        
                  +            
                  +            Operation: monitorValue
                  +        
                  +        
                  +            Overview
                  +        
                  +        The monitorValue operation allows a consumer to subscribe for parameter value reports.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                monitorValue
                  +            
                  +            
                  +                Interaction Pattern
                  +                PUBLISH-SUBSCRIBE
                  +            
                  +            
                  +                Subscription Keys
                  +                Identifier parameterKeyUInteger parameterVersion
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                OUT
                  +                PUBLISH
                  +                NoYesNo
                  +                Time timestampTime samplingTime HYPERLINK  \l "DATATYPE_ParameterValueData" ParameterValueData newValue
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        parameterKey - 
                  +        parameterVersion - 
                  +        timestamp - 
                  +        samplingTime - 
                  +        newValue - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation does not return any errors.
                  +        
                  +            
                  +            Operation: getValue
                  +        
                  +        
                  +            Overview
                  +        
                  +        The getValue operation returns the latest received value for a requested parameter.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                getValue
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                YesNo
                  +                List<Identifier> domainList<Identifier> keys
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                No
                  +                List< HYPERLINK  \l "DATATYPE_ParameterValue" ParameterValue> parameterValues
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        domain - 
                  +        keys - 
                  +        parameterValues - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        Unknown: 
                  +        Ambiguous: 
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                Unknown
                  +                Defined in MAL
                  +                List<UInteger>
                  +                
                  +            
                  +            
                  +                Ambiguous
                  +                5
                  +                List<UInteger>
                  +                
                  +            
                  +        
                  +        
                  +            
                  +            Operation: setValue
                  +        
                  +        
                  +            Overview
                  +        
                  +        The setValue operation allows a consumer to set the raw value for one or more parameters.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                setValue
                  +            
                  +            
                  +                Interaction Pattern
                  +                SUBMIT
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                SUBMIT
                  +                YesNoNo
                  +                List<Identifier> domainList<Identifier> keysList<NullableAttribute> newRawValues
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        domain - 
                  +        keys - 
                  +        newRawValues - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        Unknown: 
                  +        Read Only: 
                  +        Invalid: 
                  +        Ambiguous: 
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                Unknown
                  +                Defined in MAL
                  +                List<UInteger>
                  +                
                  +            
                  +            
                  +                Read Only
                  +                1
                  +                List<UInteger>
                  +                
                  +            
                  +            
                  +                Invalid
                  +                3
                  +                List<UInteger>
                  +                
                  +            
                  +            
                  +                Ambiguous
                  +                5
                  +                List<UInteger>
                  +                
                  +            
                  +        
                  +        
                  +            
                  +            Operation: getReportingConfiguration
                  +        
                  +        
                  +            Overview
                  +        
                  +        The getReportingConfiguration operation allows a consumer to retrieve the current configuration for the generation of reports for a parameter.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                getReportingConfiguration
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                YesNo
                  +                List<Identifier> domainList<Identifier> keys
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                No
                  +                List< HYPERLINK  \l "DATATYPE_ReportConfiguration" ReportConfiguration> reportConfigs
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        domain - 
                  +        keys - 
                  +        reportConfigs - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        Unknown: 
                  +        Ambiguous: 
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                Unknown
                  +                Defined in MAL
                  +                List<UInteger>
                  +                
                  +            
                  +            
                  +                Ambiguous
                  +                5
                  +                List<UInteger>
                  +                
                  +            
                  +        
                  +        
                  +            
                  +            Operation: enableReporting
                  +        
                  +        
                  +            Overview
                  +        
                  +        The enableReporting operation allows a consumer to request the generation of reports for specific parameters.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                enableReporting
                  +            
                  +            
                  +                Interaction Pattern
                  +                SUBMIT
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                SUBMIT
                  +                YesYes
                  +                List<Identifier> domainList<Identifier> keys
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        domain - 
                  +        keys - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        Unknown: 
                  +        Ambiguous: 
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                Unknown
                  +                Defined in MAL
                  +                List<UInteger>
                  +                
                  +            
                  +            
                  +                Ambiguous
                  +                5
                  +                List<UInteger>
                  +                
                  +            
                  +        
                  +        
                  +            
                  +            Operation: disableReporting
                  +        
                  +        
                  +            Overview
                  +        
                  +        The disableReporting operation allows a consumer to stop the generation of reports for specific parameters.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                disableReporting
                  +            
                  +            
                  +                Interaction Pattern
                  +                SUBMIT
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                SUBMIT
                  +                YesYes
                  +                List<Identifier> domainList<Identifier> keys
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        domain - 
                  +        keys - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        Unknown: 
                  +        Ambiguous: 
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                Unknown
                  +                Defined in MAL
                  +                List<UInteger>
                  +                
                  +            
                  +            
                  +                Ambiguous
                  +                5
                  +                List<UInteger>
                  +                
                  +            
                  +        
                  +        
                  +            
                  +            Operation: setReportingPeriod
                  +        
                  +        
                  +            Overview
                  +        
                  +        The setReportingPeriod operation allows a consumer to set the reporting interval for specific parameters.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                setReportingPeriod
                  +            
                  +            
                  +                Interaction Pattern
                  +                SUBMIT
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                SUBMIT
                  +                YesNoNo
                  +                List<Identifier> domainList<Identifier> keysDuration reportInterval
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        domain - 
                  +        keys - 
                  +        reportInterval - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        Unknown: 
                  +        Invalid: 
                  +        Ambiguous: 
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                Unknown
                  +                Defined in MAL
                  +                List<UInteger>
                  +                
                  +            
                  +            
                  +                Invalid
                  +                3
                  +                List<UInteger>
                  +                
                  +            
                  +            
                  +                Ambiguous
                  +                5
                  +                List<UInteger>
                  +                
                  +            
                  +        
                  +        
                  +            
                  +            Service: Alert
                  +        
                  +        
                  +            Overview
                  +        
                  +        The alert service defines the structures and patterns for the publishing and monitoring of alerts.
                  +        
                  +            Table 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Table \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Table_TOC \s 1 1
                  +            Alert Service Operations
                  +            "
                  +            :  Alert Service Operations
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Area Identifier
                  +                Service Identifier
                  +                Area Number
                  +                Service Number
                  +                Area Version
                  +            
                  +            
                  +                MC
                  +                Alert
                  +                4
                  +                3
                  +                2
                  +            
                  +            
                  +                Interaction Pattern
                  +                Operation Identifier
                  +                Operation Number
                  +                Capability Set
                  +            
                  +            
                  +                PUB-SUB
                  +                 HYPERLINK  \l "OPERATION_3_monitorAlert" monitorAlert
                  +                1
                  +                1
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_3_getAlertConfiguration" getAlertConfiguration
                  +                2
                  +                2
                  +            
                  +            
                  +                SUBMIT
                  +                 HYPERLINK  \l "OPERATION_3_enableGeneration" enableGeneration
                  +                3
                  +                
                  +            
                  +            
                  +                SUBMIT
                  +                 HYPERLINK  \l "OPERATION_3_disableGeneration" disableGeneration
                  +                4
                  +                
                  +            
                  +        
                  +        
                  +            Service-level Requirements
                  +        
                  +        
                  +            
                  +            Operation: monitorAlert
                  +        
                  +        
                  +            Overview
                  +        
                  +        The monitorAlert operation allows a consumer to subscribe for alerts.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                monitorAlert
                  +            
                  +            
                  +                Interaction Pattern
                  +                PUBLISH-SUBSCRIBE
                  +            
                  +            
                  +                Subscription Keys
                  +                Identifier alertKeyUInteger alertVersionUOctet alertSeverity
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                OUT
                  +                PUBLISH
                  +                NoYes
                  +                Time timestampList<NullableAttribute> arguments
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        alertKey - 
                  +        alertVersion - 
                  +        alertSeverity - 
                  +        timestamp - 
                  +        arguments - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation does not return any errors.
                  +        
                  +            
                  +            Operation: getAlertConfiguration
                  +        
                  +        
                  +            Overview
                  +        
                  +        The getAlertConfiguration operation allows a consumer to retrieve the current configuration for the generation of an alert.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                getAlertConfiguration
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                YesNo
                  +                List<Identifier> domainList<Identifier> keys
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                No
                  +                List< HYPERLINK  \l "DATATYPE_AlertConfiguration" AlertConfiguration> alertConfigs
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        domain - 
                  +        keys - 
                  +        alertConfigs - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        Unknown: 
                  +        Ambiguous: 
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                Unknown
                  +                Defined in MAL
                  +                List<UInteger>
                  +                
                  +            
                  +            
                  +                Ambiguous
                  +                5
                  +                List<UInteger>
                  +                
                  +            
                  +        
                  +        
                  +            
                  +            Operation: enableGeneration
                  +        
                  +        
                  +            Overview
                  +        
                  +        The enableGeneration operation allows a consumer to control whether instances of specific alerts are generated or not.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                enableGeneration
                  +            
                  +            
                  +                Interaction Pattern
                  +                SUBMIT
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                SUBMIT
                  +                YesYes
                  +                List<Identifier> domainList<Identifier> keys
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        domain - 
                  +        keys - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        Unknown: 
                  +        Ambiguous: 
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                Unknown
                  +                Defined in MAL
                  +                List<UInteger>
                  +                
                  +            
                  +            
                  +                Ambiguous
                  +                5
                  +                List<UInteger>
                  +                
                  +            
                  +        
                  +        
                  +            
                  +            Operation: disableGeneration
                  +        
                  +        
                  +            Overview
                  +        
                  +        The disableGeneration operation allows a consumer to stop the generation of instances of specific alerts.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                disableGeneration
                  +            
                  +            
                  +                Interaction Pattern
                  +                SUBMIT
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                SUBMIT
                  +                YesYes
                  +                List<Identifier> domainList<Identifier> keys
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        domain - 
                  +        keys - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        Unknown: 
                  +        Ambiguous: 
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                Unknown
                  +                Defined in MAL
                  +                List<UInteger>
                  +                
                  +            
                  +            
                  +                Ambiguous
                  +                5
                  +                List<UInteger>
                  +                
                  +            
                  +        
                  +        
                  +            
                  +            Service: Aggregation
                  +        
                  +        
                  +            Overview
                  +        
                  +        The aggregation service allows the user to acquire several parameter values in a single request.
                  +        
                  +            Table 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Table \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Table_TOC \s 1 1
                  +            Aggregation Service Operations
                  +            "
                  +            :  Aggregation Service Operations
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Area Identifier
                  +                Service Identifier
                  +                Area Number
                  +                Service Number
                  +                Area Version
                  +            
                  +            
                  +                MC
                  +                Aggregation
                  +                4
                  +                6
                  +                2
                  +            
                  +            
                  +                Interaction Pattern
                  +                Operation Identifier
                  +                Operation Number
                  +                Capability Set
                  +            
                  +            
                  +                PUB-SUB
                  +                 HYPERLINK  \l "OPERATION_6_monitorValue" monitorValue
                  +                1
                  +                1
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_6_getValue" getValue
                  +                2
                  +                2
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_6_getReportingConfiguration" getReportingConfiguration
                  +                3
                  +                3
                  +            
                  +            
                  +                SUBMIT
                  +                 HYPERLINK  \l "OPERATION_6_enableReporting" enableReporting
                  +                4
                  +                
                  +            
                  +            
                  +                SUBMIT
                  +                 HYPERLINK  \l "OPERATION_6_disableReporting" disableReporting
                  +                5
                  +                
                  +            
                  +            
                  +                SUBMIT
                  +                 HYPERLINK  \l "OPERATION_6_setReportingPeriod" setReportingPeriod
                  +                6
                  +                
                  +            
                  +            
                  +                REQUEST
                  +                 HYPERLINK  \l "OPERATION_6_listDefinition" listDefinition
                  +                7
                  +                4
                  +            
                  +            
                  +                SUBMIT
                  +                 HYPERLINK  \l "OPERATION_6_addAggregation" addAggregation
                  +                8
                  +                5
                  +            
                  +            
                  +                SUBMIT
                  +                 HYPERLINK  \l "OPERATION_6_removeAggregation" removeAggregation
                  +                9
                  +                
                  +            
                  +        
                  +        
                  +            Service-level Requirements
                  +        
                  +        
                  +            
                  +            Operation: monitorValue
                  +        
                  +        
                  +            Overview
                  +        
                  +        The monitorValue operation allows a consumer to subscribe for aggregation value reports.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                monitorValue
                  +            
                  +            
                  +                Interaction Pattern
                  +                PUBLISH-SUBSCRIBE
                  +            
                  +            
                  +                Subscription Keys
                  +                Identifier aggregationKeyUInteger aggregationVersion
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                OUT
                  +                PUBLISH
                  +                NoNo
                  +                Time timestampList< HYPERLINK  \l "DATATYPE_ParameterValueData" ParameterValueData> values
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        aggregationKey - 
                  +        aggregationVersion - 
                  +        timestamp - 
                  +        values - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation does not return any errors.
                  +        
                  +            
                  +            Operation: getValue
                  +        
                  +        
                  +            Overview
                  +        
                  +        The getValue operation returns the latest received value for a requested aggregation.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                getValue
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                YesNo
                  +                List<Identifier> domainList<Identifier> keys
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                No
                  +                List< HYPERLINK  \l "DATATYPE_AggregationValue" AggregationValue> aggregationValues
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        domain - 
                  +        keys - 
                  +        aggregationValues - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        Unknown: 
                  +        Ambiguous: 
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                Unknown
                  +                Defined in MAL
                  +                List<UInteger>
                  +                
                  +            
                  +            
                  +                Ambiguous
                  +                5
                  +                List<UInteger>
                  +                
                  +            
                  +        
                  +        
                  +            
                  +            Operation: getReportingConfiguration
                  +        
                  +        
                  +            Overview
                  +        
                  +        The getReportingConfiguration operation allows a consumer to retrieve the current configuration for the generation of reports for an aggregation.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                getReportingConfiguration
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                YesNo
                  +                List<Identifier> domainList<Identifier> keys
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                No
                  +                List< HYPERLINK  \l "DATATYPE_ReportConfiguration" ReportConfiguration> reportConfigs
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        domain - 
                  +        keys - 
                  +        reportConfigs - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        Unknown: 
                  +        Ambiguous: 
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                Unknown
                  +                Defined in MAL
                  +                List<UInteger>
                  +                
                  +            
                  +            
                  +                Ambiguous
                  +                5
                  +                List<UInteger>
                  +                
                  +            
                  +        
                  +        
                  +            
                  +            Operation: enableReporting
                  +        
                  +        
                  +            Overview
                  +        
                  +        The enableReporting operation allows a consumer to request the generation of reports for specific aggregations.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                enableReporting
                  +            
                  +            
                  +                Interaction Pattern
                  +                SUBMIT
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                SUBMIT
                  +                YesYes
                  +                List<Identifier> domainList<Identifier> keys
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        domain - 
                  +        keys - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        Unknown: 
                  +        Ambiguous: 
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                Unknown
                  +                Defined in MAL
                  +                List<UInteger>
                  +                
                  +            
                  +            
                  +                Ambiguous
                  +                5
                  +                List<UInteger>
                  +                
                  +            
                  +        
                  +        
                  +            
                  +            Operation: disableReporting
                  +        
                  +        
                  +            Overview
                  +        
                  +        The disableReporting operation allows a consumer to stop the generation of reports for specific aggregations.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                disableReporting
                  +            
                  +            
                  +                Interaction Pattern
                  +                SUBMIT
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                SUBMIT
                  +                YesYes
                  +                List<Identifier> domainList<Identifier> keys
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        domain - 
                  +        keys - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        Unknown: 
                  +        Ambiguous: 
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                Unknown
                  +                Defined in MAL
                  +                List<UInteger>
                  +                
                  +            
                  +            
                  +                Ambiguous
                  +                5
                  +                List<UInteger>
                  +                
                  +            
                  +        
                  +        
                  +            
                  +            Operation: setReportingPeriod
                  +        
                  +        
                  +            Overview
                  +        
                  +        The setReportingPeriod operation allows a consumer to set the reporting interval for specific aggregations.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                setReportingPeriod
                  +            
                  +            
                  +                Interaction Pattern
                  +                SUBMIT
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                SUBMIT
                  +                YesNoNo
                  +                List<Identifier> domainList<Identifier> keysDuration reportInterval
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        domain - 
                  +        keys - 
                  +        reportInterval - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        Unknown: 
                  +        Invalid: 
                  +        Ambiguous: 
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                Unknown
                  +                Defined in MAL
                  +                List<UInteger>
                  +                
                  +            
                  +            
                  +                Invalid
                  +                3
                  +                Not Used
                  +                -
                  +            
                  +            
                  +                Ambiguous
                  +                5
                  +                List<UInteger>
                  +                
                  +            
                  +        
                  +        
                  +            
                  +            Operation: listDefinition
                  +        
                  +        
                  +            Overview
                  +        
                  +        The listDefinition operation allows a consumer to retrieve the AggregationDefinition objects for the supported aggregations of the provider.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                listDefinition
                  +            
                  +            
                  +                Interaction Pattern
                  +                REQUEST
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                REQUEST
                  +                YesYes
                  +                List<Identifier> domainList<Identifier> keys
                  +            
                  +            
                  +                OUT
                  +                RESPONSE
                  +                No
                  +                List< HYPERLINK  \l "DATATYPE_AggregationDefinition" AggregationDefinition> definitions
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        domain - 
                  +        keys - 
                  +        definitions - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        Unknown: 
                  +        Ambiguous: 
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                Unknown
                  +                Defined in MAL
                  +                List<UInteger>
                  +                
                  +            
                  +            
                  +                Ambiguous
                  +                5
                  +                List<UInteger>
                  +                
                  +            
                  +        
                  +        
                  +            
                  +            Operation: addAggregation
                  +        
                  +        
                  +            Overview
                  +        
                  +        The addAggregation operation allows a consumer to define one or more aggregations that do not currently exist.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                addAggregation
                  +            
                  +            
                  +                Interaction Pattern
                  +                SUBMIT
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                SUBMIT
                  +                No
                  +                List< HYPERLINK  \l "DATATYPE_AggregationDefinition" AggregationDefinition> newObjects
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        newObjects - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        Duplicate: 
                  +        Invalid: 
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                Duplicate
                  +                2
                  +                List<UInteger>
                  +                
                  +            
                  +            
                  +                Invalid
                  +                3
                  +                List<UInteger>
                  +                
                  +            
                  +        
                  +        
                  +            
                  +            Operation: removeAggregation
                  +        
                  +        
                  +            Overview
                  +        
                  +        The removeAggregation operation allows a consumer to remove one or more aggregations from the list of aggregations supported by the aggregation provider.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                removeAggregation
                  +            
                  +            
                  +                Interaction Pattern
                  +                SUBMIT
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                IN
                  +                SUBMIT
                  +                YesNo
                  +                List<Identifier> domainList<Identifier> keys
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        domain - 
                  +        keys - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation may return one of the following errors:
                  +        Unknown: 
                  +        Ambiguous: 
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                ExtraInfo Type
                  +                ExtraInfo description
                  +            
                  +            
                  +                Unknown
                  +                Defined in MAL
                  +                List<UInteger>
                  +                
                  +            
                  +            
                  +                Ambiguous
                  +                5
                  +                List<UInteger>
                  +                
                  +            
                  +        
                  +        
                  +            
                  +            Service: Packet
                  +        
                  +        
                  +            Overview
                  +        
                  +        The packet service allows a consumer to subscribe to a subset of the space packets, with filtering capabilities based on packets metadata.
                  +        
                  +            Table 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Table \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Table_TOC \s 1 1
                  +            Packet Service Operations
                  +            "
                  +            :  Packet Service Operations
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Area Identifier
                  +                Service Identifier
                  +                Area Number
                  +                Service Number
                  +                Area Version
                  +            
                  +            
                  +                MC
                  +                Packet
                  +                4
                  +                9
                  +                2
                  +            
                  +            
                  +                Interaction Pattern
                  +                Operation Identifier
                  +                Operation Number
                  +                Capability Set
                  +            
                  +            
                  +                PUB-SUB
                  +                 HYPERLINK  \l "OPERATION_9_deliverPacket" deliverPacket
                  +                1
                  +                1
                  +            
                  +        
                  +        
                  +            Service-level Requirements
                  +        
                  +        
                  +            
                  +            Operation: deliverPacket
                  +        
                  +        
                  +            Overview
                  +        
                  +        The deliverPacket operation allows a provider to publish space packets with associated metadata, and a consumer to receive a filtered set of those packets.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Operation Identifier
                  +                deliverPacket
                  +            
                  +            
                  +                Interaction Pattern
                  +                PUBLISH-SUBSCRIBE
                  +            
                  +            
                  +                Subscription Keys
                  +                UShort apid
                  +            
                  +            
                  +                Pattern Sequence
                  +                Message
                  +                Nullable
                  +                Type Signature
                  +            
                  +            
                  +                OUT
                  +                PUBLISH
                  +                NoNo
                  +                Time timestampBlob spacePacket
                  +            
                  +        
                  +        
                  +            Type Signature Details
                  +        
                  +        apid - 
                  +        timestamp - 
                  +        spacePacket - 
                  +        
                  +            Requirements
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The operation does not return any errors.
                  +        
                  +            Data types
                  +        
                  +        
                  +            Area data types: MC
                  +        
                  +        
                  +            
                  +            Enumeration: Severity
                  +        
                  +        The severity enumeration shall be used to hold the possible values for a severity.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                Severity
                  +            
                  +            
                  +                Short Form Part
                  +                6
                  +            
                  +            
                  +                Enumeration Value
                  +                Numerical Value
                  +                Comment
                  +            
                  +            
                  +                INFORMATIONAL
                  +                1
                  +                
                  +            
                  +            
                  +                WARNING
                  +                2
                  +                
                  +            
                  +            
                  +                ALARM
                  +                3
                  +                
                  +            
                  +            
                  +                SEVERE
                  +                4
                  +                
                  +            
                  +            
                  +                CRITICAL
                  +                5
                  +                
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ArgumentDefinition
                  +        
                  +        The ArgumentDefinition structure shall be used to hold the details of an argument definition.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ArgumentDefinition
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                1
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                argId
                  +                Identifier
                  +                No
                  +                
                  +            
                  +            
                  +                description
                  +                String
                  +                Yes
                  +                
                  +            
                  +            
                  +                type
                  +                AttributeType
                  +                No
                  +                
                  +            
                  +            
                  +                unit
                  +                String
                  +                Yes
                  +                
                  +            
                  +        
                  +        
                  +            
                  +            Enumeration: ActionCategory
                  +        
                  +        Contains the default Action category values.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ActionCategory
                  +            
                  +            
                  +                Short Form Part
                  +                10
                  +            
                  +            
                  +                Enumeration Value
                  +                Numerical Value
                  +                Comment
                  +            
                  +            
                  +                DEFAULT
                  +                1
                  +                
                  +            
                  +            
                  +                HIPRIORITY
                  +                2
                  +                
                  +            
                  +            
                  +                CRITICAL
                  +                3
                  +                
                  +            
                  +        
                  +        
                  +            
                  +            MO Object: ActionDefinition
                  +        
                  +        The ActionDefinition structure holds the definition information of an action.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ActionDefinition
                  +            
                  +            
                  +                Extends
                  +                Object
                  +            
                  +            
                  +                Short Form Part
                  +                11
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                objectIdentity
                  +                ObjectIdentity
                  +                No
                  +                The identity of the MO Object.
                  +            
                  +            
                  +                description
                  +                String
                  +                No
                  +                
                  +            
                  +            
                  +                category
                  +                 HYPERLINK  \l "DATATYPE_ActionCategory" ActionCategory
                  +                No
                  +                
                  +            
                  +            
                  +                progressStepCount
                  +                UShort
                  +                No
                  +                
                  +            
                  +            
                  +                arguments
                  +                List< HYPERLINK  \l "DATATYPE_ArgumentDefinition" ArgumentDefinition>
                  +                Yes
                  +                
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ActionExecutionRequest
                  +        
                  +        The ActionExecutionRequest structure holds the information required for a specific execution of an action.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ActionExecutionRequest
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                12
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                requestId
                  +                Long
                  +                No
                  +                
                  +            
                  +            
                  +                actionRef
                  +                ObjectRef< HYPERLINK  \l "DATATYPE_ActionDefinition" ActionDefinition>
                  +                No
                  +                
                  +            
                  +            
                  +                source
                  +                ObjectRef<Element>
                  +                Yes
                  +                
                  +            
                  +            
                  +                stageStartedRequired
                  +                Boolean
                  +                No
                  +                
                  +            
                  +            
                  +                stageProgressRequired
                  +                Boolean
                  +                No
                  +                
                  +            
                  +            
                  +                stageCompletedRequired
                  +                Boolean
                  +                No
                  +                
                  +            
                  +            
                  +                argumentValues
                  +                List<NullableAttribute>
                  +                Yes
                  +                
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ActionEvent
                  +        
                  +        The ActionEvent is the base type of all events used by the monitorActionExec operation to publish a new execution stage reached by the execution of an action.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ActionEvent
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Abstract
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                success
                  +                Boolean
                  +                No
                  +                
                  +            
                  +            
                  +                comment
                  +                String
                  +                Yes
                  +                
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ActionStartEvent
                  +        
                  +        The ActionStartEvent type is used for publishing an action execution reaching the started stage.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ActionStartEvent
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_ActionEvent" ActionEvent
                  +            
                  +            
                  +                Short Form Part
                  +                13
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ActionInProgressEvent
                  +        
                  +        The ActionInProgressEvent type is used for publishing an action execution reaching a new execution stage.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ActionInProgressEvent
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_ActionEvent" ActionEvent
                  +            
                  +            
                  +                Short Form Part
                  +                14
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                success
                  +                Boolean
                  +                No
                  +                
                  +            
                  +            
                  +                comment
                  +                String
                  +                Yes
                  +                
                  +            
                  +            
                  +                stageCount
                  +                UInteger
                  +                No
                  +                
                  +            
                  +            
                  +                executionStage
                  +                UInteger
                  +                No
                  +                
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ActionCompleteEvent
                  +        
                  +        The ActionCompleteEvent type is used for publishing an action execution reaching the completion stage.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ActionCompleteEvent
                  +            
                  +            
                  +                Extends
                  +                 HYPERLINK  \l "DATATYPE_ActionEvent" ActionEvent
                  +            
                  +            
                  +                Short Form Part
                  +                15
                  +            
                  +        
                  +        
                  +            
                  +            Enumeration: ValidityState
                  +        
                  +        The ValidityState enumeration shall be used to hold the validity states and their numeric values.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ValidityState
                  +            
                  +            
                  +                Short Form Part
                  +                20
                  +            
                  +            
                  +                Enumeration Value
                  +                Numerical Value
                  +                Comment
                  +            
                  +            
                  +                VALID
                  +                0
                  +                
                  +            
                  +            
                  +                EXPIRED
                  +                1
                  +                
                  +            
                  +            
                  +                INVALID_RAW
                  +                2
                  +                
                  +            
                  +            
                  +                INVALID_CONVERSION
                  +                3
                  +                
                  +            
                  +            
                  +                UNVERIFIED
                  +                4
                  +                
                  +            
                  +            
                  +                INVALID
                  +                5
                  +                
                  +            
                  +        
                  +        
                  +            
                  +            MO Object: ParameterDefinition
                  +        
                  +        The ParameterDefinition structure holds a parameter definition.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ParameterDefinition
                  +            
                  +            
                  +                Extends
                  +                Object
                  +            
                  +            
                  +                Short Form Part
                  +                21
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                objectIdentity
                  +                ObjectIdentity
                  +                No
                  +                The identity of the MO Object.
                  +            
                  +            
                  +                description
                  +                String
                  +                No
                  +                
                  +            
                  +            
                  +                rawType
                  +                AttributeType
                  +                No
                  +                
                  +            
                  +            
                  +                rawUnit
                  +                String
                  +                Yes
                  +                
                  +            
                  +            
                  +                convertedType
                  +                AttributeType
                  +                Yes
                  +                
                  +            
                  +            
                  +                convertedUnit
                  +                String
                  +                Yes
                  +                
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ParameterValueData
                  +        
                  +        The ParameterValueData structure shall be used to hold a specific value of the parameter.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ParameterValueData
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                22
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                validityState
                  +                 HYPERLINK  \l "DATATYPE_ValidityState" ValidityState
                  +                No
                  +                
                  +            
                  +            
                  +                rawValue
                  +                Attribute
                  +                Yes
                  +                
                  +            
                  +            
                  +                convertedValue
                  +                Attribute
                  +                Yes
                  +                
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ParameterValue
                  +        
                  +        The ParameterValue structure is a contextual object associated to the ParameterDefinition. It is uniquely identified by the timestamp field, relative to the ParameterDefinition object. It represents a specific time stamped value of the parameter.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ParameterValue
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                23
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                paramRef
                  +                ObjectRef< HYPERLINK  \l "DATATYPE_ParameterDefinition" ParameterDefinition>
                  +                No
                  +                
                  +            
                  +            
                  +                timestamp
                  +                Time
                  +                No
                  +                
                  +            
                  +            
                  +                samplingTime
                  +                Time
                  +                Yes
                  +                
                  +            
                  +            
                  +                value
                  +                 HYPERLINK  \l "DATATYPE_ParameterValueData" ParameterValueData
                  +                No
                  +                
                  +            
                  +        
                  +        
                  +            
                  +            Composite: ReportConfiguration
                  +        
                  +        The ReportConfiguration structure is used to retrieve the configuration of the report generation of a parameter.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                ReportConfiguration
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                24
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                generationEnabled
                  +                Boolean
                  +                No
                  +                
                  +            
                  +            
                  +                reportInterval
                  +                Duration
                  +                No
                  +                
                  +            
                  +        
                  +        
                  +            
                  +            MO Object: AlertDefinition
                  +        
                  +        The AlertDefinition structure shall be used to provide the definition of an alert including any argument definitions.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                AlertDefinition
                  +            
                  +            
                  +                Extends
                  +                Object
                  +            
                  +            
                  +                Short Form Part
                  +                30
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                objectIdentity
                  +                ObjectIdentity
                  +                No
                  +                The identity of the MO Object.
                  +            
                  +            
                  +                description
                  +                String
                  +                No
                  +                
                  +            
                  +            
                  +                severity
                  +                 HYPERLINK  \l "DATATYPE_Severity" Severity
                  +                No
                  +                
                  +            
                  +            
                  +                arguments
                  +                List< HYPERLINK  \l "DATATYPE_ArgumentDefinition" ArgumentDefinition>
                  +                Yes
                  +                
                  +            
                  +        
                  +        
                  +            
                  +            Composite: AlertEvent
                  +        
                  +        The AlertEvent structure shall be used to hold the details of an instance of an alert.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                AlertEvent
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                31
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                alertRef
                  +                ObjectRef< HYPERLINK  \l "DATATYPE_AlertDefinition" AlertDefinition>
                  +                No
                  +                
                  +            
                  +            
                  +                timestamp
                  +                Time
                  +                No
                  +                
                  +            
                  +            
                  +                argumentValues
                  +                List<NullableAttribute>
                  +                Yes
                  +                
                  +            
                  +        
                  +        
                  +            
                  +            Composite: AlertConfiguration
                  +        
                  +        The AlertConfiguration structure is used to retrieve the configuration of the generation of an alert.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                AlertConfiguration
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                32
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                generationEnabled
                  +                Boolean
                  +                No
                  +                
                  +            
                  +        
                  +        
                  +            
                  +            MO Object: AggregationDefinition
                  +        
                  +        The AggregationDefinition structure shall be used to hold definition details of an aggregation.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                AggregationDefinition
                  +            
                  +            
                  +                Extends
                  +                Object
                  +            
                  +            
                  +                Short Form Part
                  +                60
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                objectIdentity
                  +                ObjectIdentity
                  +                No
                  +                The identity of the MO Object.
                  +            
                  +            
                  +                description
                  +                String
                  +                No
                  +                
                  +            
                  +            
                  +                category
                  +                Identifier
                  +                Yes
                  +                
                  +            
                  +            
                  +                parameters
                  +                List<ObjectRef< HYPERLINK  \l "DATATYPE_ParameterDefinition" ParameterDefinition>>
                  +                No
                  +                
                  +            
                  +        
                  +        
                  +            
                  +            Composite: AggregationValue
                  +        
                  +        The AggregationValue structure shall be used to hold the values of the aggregation parameters.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                AggregationValue
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                61
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                aggregationRef
                  +                ObjectRef< HYPERLINK  \l "DATATYPE_AggregationDefinition" AggregationDefinition>
                  +                No
                  +                
                  +            
                  +            
                  +                timestamp
                  +                Time
                  +                No
                  +                
                  +            
                  +            
                  +                parameterValues
                  +                List< HYPERLINK  \l "DATATYPE_ParameterValueData" ParameterValueData>
                  +                No
                  +                
                  +            
                  +        
                  +        
                  +            
                  +            Composite: PacketValue
                  +        
                  +        The PacketValue structure is used to represent each space packet published by the provider.
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Name
                  +                PacketValue
                  +            
                  +            
                  +                Extends
                  +                Composite
                  +            
                  +            
                  +                Short Form Part
                  +                90
                  +            
                  +            
                  +                Field
                  +                Type
                  +                Nullable
                  +                Comment
                  +            
                  +            
                  +                payload
                  +                Blob
                  +                No
                  +                
                  +            
                  +            
                  +                timestamp
                  +                Time
                  +                No
                  +                
                  +            
                  +            
                  +                apid
                  +                UShort
                  +                No
                  +                
                  +            
                  +            
                  +                keyValues
                  +                List<NullableAttribute>
                  +                Yes
                  +                
                  +            
                  +        
                  +        
                  +            MO Errors
                  +        
                  +        The following table lists the errors defined in this specification:
                  +        
                  +            Table 
                  +            
                  +             STYLEREF "Heading 1"\l \n \t  \* MERGEFORMAT 1 SEQ Table \s 1 1tc  \f T "
                  +            1
                  +            - SEQ Table_TOC \s 1 1
                  +            MC MO Errors
                  +            "
                  +            :  MC MO Errors
                  +        
                  +        
                  +            
                  +                
                  +                
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                    
                  +                
                  +            
                  +            
                  +                
                  +                
                  +                
                  +            
                  +            
                  +                Error
                  +                Error #
                  +                Comment
                  +            
                  +            
                  +                Read Only
                  +                1
                  +                The operation attempted to modify read-only data, which cannot be changed.
                  +            
                  +            
                  +                Duplicate
                  +                2
                  +                The entry or operation is a duplicate of an existing record, violating uniqueness.
                  +            
                  +            
                  +                Invalid
                  +                3
                  +                The input data or operation format is invalid and does not meet required criteria.
                  +            
                  +            
                  +                Rejected
                  +                4
                  +                The operation has been rejected due to policy or validation rules.
                  +            
                  +            
                  +                Ambiguous
                  +                5
                  +                The data or operation is ambiguous, requiring clarification to proceed.
                  +            
                  +        
                  +    
                  +
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area004-v002-MC/word/numbering.xml b/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area004-v002-MC/word/numbering.xml
                  new file mode 100644
                  index 00000000..d159498b
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area004-v002-MC/word/numbering.xml
                  @@ -0,0 +1,41 @@
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +        
                  +
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area004-v002-MC/word/styles.xml b/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area004-v002-MC/word/styles.xml
                  new file mode 100644
                  index 00000000..ee967ee1
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area004-v002-MC/word/styles.xml
                  @@ -0,0 +1 @@
                  +
                  \ No newline at end of file
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/AuthenticationFailedException.java b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/AuthenticationFailedException.java
                  new file mode 100644
                  index 00000000..fa3ee5a6
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/AuthenticationFailedException.java
                  @@ -0,0 +1,28 @@
                  +package org.ccsds.moims.mo.mal;
                  +
                  +/**
                  + * The AuthenticationFailedException exception. A failure to authenticate
                  + * the message correctly.
                  + */
                  +public final class AuthenticationFailedException extends org.ccsds.moims.mo.mal.MOErrorException {
                  +
                  +    private static final String MO_ERROR_NAME = "Authentication Failed";
                  +
                  +    /**
                  +     * Constructs a new AuthenticationFailedException exception.
                  +     * 
                  +     */
                  +    public AuthenticationFailedException() {
                  +        super(MO_ERROR_NAME, MALHelper.AUTHENTICATION_FAILED_ERROR_NUMBER, "");
                  +    }
                  +
                  +    /**
                  +     * Constructs a new AuthenticationFailedException exception.
                  +     * 
                  +     * @param extraInformation The extraInformation of the exception.
                  +     */
                  +    public AuthenticationFailedException(Object extraInformation) {
                  +        super(MO_ERROR_NAME, MALHelper.AUTHENTICATION_FAILED_ERROR_NUMBER, extraInformation);
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/AuthorisationFailException.java b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/AuthorisationFailException.java
                  new file mode 100644
                  index 00000000..43e09c9c
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/AuthorisationFailException.java
                  @@ -0,0 +1,28 @@
                  +package org.ccsds.moims.mo.mal;
                  +
                  +/**
                  + * The AuthorisationFailException exception. A failure in the MAL to authorise
                  + * the message.
                  + */
                  +public final class AuthorisationFailException extends org.ccsds.moims.mo.mal.MOErrorException {
                  +
                  +    private static final String MO_ERROR_NAME = "Authorisation Fail";
                  +
                  +    /**
                  +     * Constructs a new AuthorisationFailException exception.
                  +     * 
                  +     */
                  +    public AuthorisationFailException() {
                  +        super(MO_ERROR_NAME, MALHelper.AUTHORISATION_FAIL_ERROR_NUMBER, "");
                  +    }
                  +
                  +    /**
                  +     * Constructs a new AuthorisationFailException exception.
                  +     * 
                  +     * @param extraInformation The extraInformation of the exception.
                  +     */
                  +    public AuthorisationFailException(Object extraInformation) {
                  +        super(MO_ERROR_NAME, MALHelper.AUTHORISATION_FAIL_ERROR_NUMBER, extraInformation);
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/BadEncodingException.java b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/BadEncodingException.java
                  new file mode 100644
                  index 00000000..e48cf2c4
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/BadEncodingException.java
                  @@ -0,0 +1,28 @@
                  +package org.ccsds.moims.mo.mal;
                  +
                  +/**
                  + * The BadEncodingException exception. The destination was unable to decode
                  + * the message.
                  + */
                  +public final class BadEncodingException extends org.ccsds.moims.mo.mal.MOErrorException {
                  +
                  +    private static final String MO_ERROR_NAME = "Bad Encoding";
                  +
                  +    /**
                  +     * Constructs a new BadEncodingException exception.
                  +     * 
                  +     */
                  +    public BadEncodingException() {
                  +        super(MO_ERROR_NAME, MALHelper.BAD_ENCODING_ERROR_NUMBER, "");
                  +    }
                  +
                  +    /**
                  +     * Constructs a new BadEncodingException exception.
                  +     * 
                  +     * @param extraInformation The extraInformation of the exception.
                  +     */
                  +    public BadEncodingException(Object extraInformation) {
                  +        super(MO_ERROR_NAME, MALHelper.BAD_ENCODING_ERROR_NUMBER, extraInformation);
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/DeliveryDelayedException.java b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/DeliveryDelayedException.java
                  new file mode 100644
                  index 00000000..ae7fb240
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/DeliveryDelayedException.java
                  @@ -0,0 +1,28 @@
                  +package org.ccsds.moims.mo.mal;
                  +
                  +/**
                  + * The DeliveryDelayedException exception. Message queued somewhere awaiting
                  + * contact.
                  + */
                  +public final class DeliveryDelayedException extends org.ccsds.moims.mo.mal.MOErrorException {
                  +
                  +    private static final String MO_ERROR_NAME = "Delivery Delayed";
                  +
                  +    /**
                  +     * Constructs a new DeliveryDelayedException exception.
                  +     * 
                  +     */
                  +    public DeliveryDelayedException() {
                  +        super(MO_ERROR_NAME, MALHelper.DELIVERY_DELAYED_ERROR_NUMBER, "");
                  +    }
                  +
                  +    /**
                  +     * Constructs a new DeliveryDelayedException exception.
                  +     * 
                  +     * @param extraInformation The extraInformation of the exception.
                  +     */
                  +    public DeliveryDelayedException(Object extraInformation) {
                  +        super(MO_ERROR_NAME, MALHelper.DELIVERY_DELAYED_ERROR_NUMBER, extraInformation);
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/DeliveryFailedException.java b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/DeliveryFailedException.java
                  new file mode 100644
                  index 00000000..51d27843
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/DeliveryFailedException.java
                  @@ -0,0 +1,27 @@
                  +package org.ccsds.moims.mo.mal;
                  +
                  +/**
                  + * The DeliveryFailedException exception. Confirmed communication error.
                  + */
                  +public final class DeliveryFailedException extends org.ccsds.moims.mo.mal.MOErrorException {
                  +
                  +    private static final String MO_ERROR_NAME = "Delivery Failed";
                  +
                  +    /**
                  +     * Constructs a new DeliveryFailedException exception.
                  +     * 
                  +     */
                  +    public DeliveryFailedException() {
                  +        super(MO_ERROR_NAME, MALHelper.DELIVERY_FAILED_ERROR_NUMBER, "");
                  +    }
                  +
                  +    /**
                  +     * Constructs a new DeliveryFailedException exception.
                  +     * 
                  +     * @param extraInformation The extraInformation of the exception.
                  +     */
                  +    public DeliveryFailedException(Object extraInformation) {
                  +        super(MO_ERROR_NAME, MALHelper.DELIVERY_FAILED_ERROR_NUMBER, extraInformation);
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/DeliveryTimedoutException.java b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/DeliveryTimedoutException.java
                  new file mode 100644
                  index 00000000..707b7606
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/DeliveryTimedoutException.java
                  @@ -0,0 +1,27 @@
                  +package org.ccsds.moims.mo.mal;
                  +
                  +/**
                  + * The DeliveryTimedoutException exception. Unconfirmed communication error.
                  + */
                  +public final class DeliveryTimedoutException extends org.ccsds.moims.mo.mal.MOErrorException {
                  +
                  +    private static final String MO_ERROR_NAME = "Delivery Timedout";
                  +
                  +    /**
                  +     * Constructs a new DeliveryTimedoutException exception.
                  +     * 
                  +     */
                  +    public DeliveryTimedoutException() {
                  +        super(MO_ERROR_NAME, MALHelper.DELIVERY_TIMEDOUT_ERROR_NUMBER, "");
                  +    }
                  +
                  +    /**
                  +     * Constructs a new DeliveryTimedoutException exception.
                  +     * 
                  +     * @param extraInformation The extraInformation of the exception.
                  +     */
                  +    public DeliveryTimedoutException(Object extraInformation) {
                  +        super(MO_ERROR_NAME, MALHelper.DELIVERY_TIMEDOUT_ERROR_NUMBER, extraInformation);
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/DestinationLostException.java b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/DestinationLostException.java
                  new file mode 100644
                  index 00000000..d1cd8e4f
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/DestinationLostException.java
                  @@ -0,0 +1,28 @@
                  +package org.ccsds.moims.mo.mal;
                  +
                  +/**
                  + * The DestinationLostException exception. Destination lost halfway through
                  + * conversation.
                  + */
                  +public final class DestinationLostException extends org.ccsds.moims.mo.mal.MOErrorException {
                  +
                  +    private static final String MO_ERROR_NAME = "Destination Lost";
                  +
                  +    /**
                  +     * Constructs a new DestinationLostException exception.
                  +     * 
                  +     */
                  +    public DestinationLostException() {
                  +        super(MO_ERROR_NAME, MALHelper.DESTINATION_LOST_ERROR_NUMBER, "");
                  +    }
                  +
                  +    /**
                  +     * Constructs a new DestinationLostException exception.
                  +     * 
                  +     * @param extraInformation The extraInformation of the exception.
                  +     */
                  +    public DestinationLostException(Object extraInformation) {
                  +        super(MO_ERROR_NAME, MALHelper.DESTINATION_LOST_ERROR_NUMBER, extraInformation);
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/DestinationTransientException.java b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/DestinationTransientException.java
                  new file mode 100644
                  index 00000000..fdbef9a3
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/DestinationTransientException.java
                  @@ -0,0 +1,28 @@
                  +package org.ccsds.moims.mo.mal;
                  +
                  +/**
                  + * The DestinationTransientException exception. Destination middleware reports
                  + * destination application does not exist.
                  + */
                  +public final class DestinationTransientException extends org.ccsds.moims.mo.mal.MOErrorException {
                  +
                  +    private static final String MO_ERROR_NAME = "Destination Transient";
                  +
                  +    /**
                  +     * Constructs a new DestinationTransientException exception.
                  +     * 
                  +     */
                  +    public DestinationTransientException() {
                  +        super(MO_ERROR_NAME, MALHelper.DESTINATION_TRANSIENT_ERROR_NUMBER, "");
                  +    }
                  +
                  +    /**
                  +     * Constructs a new DestinationTransientException exception.
                  +     * 
                  +     * @param extraInformation The extraInformation of the exception.
                  +     */
                  +    public DestinationTransientException(Object extraInformation) {
                  +        super(MO_ERROR_NAME, MALHelper.DESTINATION_TRANSIENT_ERROR_NUMBER, extraInformation);
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/DestinationUnknownException.java b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/DestinationUnknownException.java
                  new file mode 100644
                  index 00000000..7c2b20da
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/DestinationUnknownException.java
                  @@ -0,0 +1,27 @@
                  +package org.ccsds.moims.mo.mal;
                  +
                  +/**
                  + * The DestinationUnknownException exception. Destination cannot be contacted.
                  + */
                  +public final class DestinationUnknownException extends org.ccsds.moims.mo.mal.MOErrorException {
                  +
                  +    private static final String MO_ERROR_NAME = "Destination Unknown";
                  +
                  +    /**
                  +     * Constructs a new DestinationUnknownException exception.
                  +     * 
                  +     */
                  +    public DestinationUnknownException() {
                  +        super(MO_ERROR_NAME, MALHelper.DESTINATION_UNKNOWN_ERROR_NUMBER, "");
                  +    }
                  +
                  +    /**
                  +     * Constructs a new DestinationUnknownException exception.
                  +     * 
                  +     * @param extraInformation The extraInformation of the exception.
                  +     */
                  +    public DestinationUnknownException(Object extraInformation) {
                  +        super(MO_ERROR_NAME, MALHelper.DESTINATION_UNKNOWN_ERROR_NUMBER, extraInformation);
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/EncryptionFailException.java b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/EncryptionFailException.java
                  new file mode 100644
                  index 00000000..6f28d32c
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/EncryptionFailException.java
                  @@ -0,0 +1,28 @@
                  +package org.ccsds.moims.mo.mal;
                  +
                  +/**
                  + * The EncryptionFailException exception. A failure in the MAL to encrypt/decrypt
                  + * the message.
                  + */
                  +public final class EncryptionFailException extends org.ccsds.moims.mo.mal.MOErrorException {
                  +
                  +    private static final String MO_ERROR_NAME = "Encryption Fail";
                  +
                  +    /**
                  +     * Constructs a new EncryptionFailException exception.
                  +     * 
                  +     */
                  +    public EncryptionFailException() {
                  +        super(MO_ERROR_NAME, MALHelper.ENCRYPTION_FAIL_ERROR_NUMBER, "");
                  +    }
                  +
                  +    /**
                  +     * Constructs a new EncryptionFailException exception.
                  +     * 
                  +     * @param extraInformation The extraInformation of the exception.
                  +     */
                  +    public EncryptionFailException(Object extraInformation) {
                  +        super(MO_ERROR_NAME, MALHelper.ENCRYPTION_FAIL_ERROR_NUMBER, extraInformation);
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/IncorrectStateException.java b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/IncorrectStateException.java
                  new file mode 100644
                  index 00000000..f6df738e
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/IncorrectStateException.java
                  @@ -0,0 +1,28 @@
                  +package org.ccsds.moims.mo.mal;
                  +
                  +/**
                  + * The IncorrectStateException exception. The destination was not in the correct
                  + * state for the received message.
                  + */
                  +public final class IncorrectStateException extends org.ccsds.moims.mo.mal.MOErrorException {
                  +
                  +    private static final String MO_ERROR_NAME = "Incorrect State";
                  +
                  +    /**
                  +     * Constructs a new IncorrectStateException exception.
                  +     * 
                  +     */
                  +    public IncorrectStateException() {
                  +        super(MO_ERROR_NAME, MALHelper.INCORRECT_STATE_ERROR_NUMBER, "");
                  +    }
                  +
                  +    /**
                  +     * Constructs a new IncorrectStateException exception.
                  +     * 
                  +     * @param extraInformation The extraInformation of the exception.
                  +     */
                  +    public IncorrectStateException(Object extraInformation) {
                  +        super(MO_ERROR_NAME, MALHelper.INCORRECT_STATE_ERROR_NUMBER, extraInformation);
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/InternalException.java b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/InternalException.java
                  new file mode 100644
                  index 00000000..ff17c251
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/InternalException.java
                  @@ -0,0 +1,27 @@
                  +package org.ccsds.moims.mo.mal;
                  +
                  +/**
                  + * The InternalException exception. An internal error has occurred.
                  + */
                  +public final class InternalException extends org.ccsds.moims.mo.mal.MOErrorException {
                  +
                  +    private static final String MO_ERROR_NAME = "Internal";
                  +
                  +    /**
                  +     * Constructs a new InternalException exception.
                  +     * 
                  +     */
                  +    public InternalException() {
                  +        super(MO_ERROR_NAME, MALHelper.INTERNAL_ERROR_NUMBER, "");
                  +    }
                  +
                  +    /**
                  +     * Constructs a new InternalException exception.
                  +     * 
                  +     * @param extraInformation The extraInformation of the exception.
                  +     */
                  +    public InternalException(Object extraInformation) {
                  +        super(MO_ERROR_NAME, MALHelper.INTERNAL_ERROR_NUMBER, extraInformation);
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/MALElementFactory.java b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/MALElementFactory.java
                  new file mode 100644
                  index 00000000..74a46a6f
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/MALElementFactory.java
                  @@ -0,0 +1,118 @@
                  +package org.ccsds.moims.mo.mal;
                  +
                  +/**
                  + * Creates the Elements of the MAL area, without holding an instance of each
                  + * of them, so that the class of a type is only loaded once a message carries
                  + * that type.
                  + */
                  +public final class MALElementFactory implements org.ccsds.moims.mo.mal.AreaElementFactory {
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createElement(int serviceNumber,
                  +            int typeNumber) {
                  +        if (serviceNumber != 0) {
                  +            return null; // This Area declares no types under a service
                  +        }
                  +        switch (typeNumber) {
                  +            case -105: return new org.ccsds.moims.mo.mal.structures.MOAreaList();
                  +            case -104: return new org.ccsds.moims.mo.mal.structures.AttributeTypeList();
                  +            case -103: return new org.ccsds.moims.mo.mal.structures.QoSLevelList();
                  +            case -102: return new org.ccsds.moims.mo.mal.structures.SessionTypeList();
                  +            case -101: return new org.ccsds.moims.mo.mal.structures.InteractionTypeList();
                  +            case -19: return new org.ccsds.moims.mo.mal.structures.ObjectRefList();
                  +            case -18: return new org.ccsds.moims.mo.mal.structures.URIList();
                  +            case -17: return new org.ccsds.moims.mo.mal.structures.FineTimeList();
                  +            case -16: return new org.ccsds.moims.mo.mal.structures.TimeList();
                  +            case -15: return new org.ccsds.moims.mo.mal.structures.StringList();
                  +            case -14: return new org.ccsds.moims.mo.mal.structures.ULongList();
                  +            case -13: return new org.ccsds.moims.mo.mal.structures.LongList();
                  +            case -12: return new org.ccsds.moims.mo.mal.structures.UIntegerList();
                  +            case -11: return new org.ccsds.moims.mo.mal.structures.IntegerList();
                  +            case -10: return new org.ccsds.moims.mo.mal.structures.UShortList();
                  +            case -9: return new org.ccsds.moims.mo.mal.structures.ShortList();
                  +            case -8: return new org.ccsds.moims.mo.mal.structures.UOctetList();
                  +            case -7: return new org.ccsds.moims.mo.mal.structures.OctetList();
                  +            case -6: return new org.ccsds.moims.mo.mal.structures.IdentifierList();
                  +            case -5: return new org.ccsds.moims.mo.mal.structures.DoubleList();
                  +            case -4: return new org.ccsds.moims.mo.mal.structures.FloatList();
                  +            case -3: return new org.ccsds.moims.mo.mal.structures.DurationList();
                  +            case -2: return new org.ccsds.moims.mo.mal.structures.BooleanList();
                  +            case -1: return new org.ccsds.moims.mo.mal.structures.BlobList();
                  +            case 1: return new org.ccsds.moims.mo.mal.structures.Blob();
                  +            case 2: return new org.ccsds.moims.mo.mal.structures.Union(Boolean.FALSE);
                  +            case 3: return new org.ccsds.moims.mo.mal.structures.Duration();
                  +            case 4: return new org.ccsds.moims.mo.mal.structures.Union(Float.MAX_VALUE);
                  +            case 5: return new org.ccsds.moims.mo.mal.structures.Union(Double.MAX_VALUE);
                  +            case 6: return new org.ccsds.moims.mo.mal.structures.Identifier();
                  +            case 7: return new org.ccsds.moims.mo.mal.structures.Union(Byte.MAX_VALUE);
                  +            case 8: return new org.ccsds.moims.mo.mal.structures.UOctet();
                  +            case 9: return new org.ccsds.moims.mo.mal.structures.Union(Short.MAX_VALUE);
                  +            case 10: return new org.ccsds.moims.mo.mal.structures.UShort();
                  +            case 11: return new org.ccsds.moims.mo.mal.structures.Union(Integer.MAX_VALUE);
                  +            case 12: return new org.ccsds.moims.mo.mal.structures.UInteger();
                  +            case 13: return new org.ccsds.moims.mo.mal.structures.Union(Long.MAX_VALUE);
                  +            case 14: return new org.ccsds.moims.mo.mal.structures.ULong();
                  +            case 15: return new org.ccsds.moims.mo.mal.structures.Union("");
                  +            case 16: return new org.ccsds.moims.mo.mal.structures.Time();
                  +            case 17: return new org.ccsds.moims.mo.mal.structures.FineTime();
                  +            case 18: return new org.ccsds.moims.mo.mal.structures.URI();
                  +            case 19: return new org.ccsds.moims.mo.mal.structures.ObjectRef();
                  +            case 101: return new org.ccsds.moims.mo.mal.structures.InteractionType();
                  +            case 102: return new org.ccsds.moims.mo.mal.structures.SessionType();
                  +            case 103: return new org.ccsds.moims.mo.mal.structures.QoSLevel();
                  +            case 104: return new org.ccsds.moims.mo.mal.structures.AttributeType();
                  +            case 105: return new org.ccsds.moims.mo.mal.structures.MOArea();
                  +            default: return createAreaElementOutOfBand(typeNumber);
                  +        }
                  +    }
                  +
                  +    @Override
                  +    public int getAreaNumber() {
                  +        return 1;
                  +    }
                  +
                  +    @Override
                  +    public int getAreaVersion() {
                  +        return 3;
                  +    }
                  +
                  +    /**
                  +     * Creates an Element whose type number lies too far out to be held in the
                  +     * jump table that is asked first. This says nothing about how often the type
                  +     * is asked for: the numbers of an Area are not handed out in the order of
                  +     * use.
                  +     * 
                  +     * @param typeNumber The typeNumber field.
                  +     */
                  +    private static org.ccsds.moims.mo.mal.structures.Element createAreaElementOutOfBand(int typeNumber) {
                  +        if (typeNumber > 0) {
                  +            switch (typeNumber) {
                  +                case 1001: return new org.ccsds.moims.mo.mal.structures.Subscription();
                  +                case 1002: return new org.ccsds.moims.mo.mal.structures.SubscriptionFilter();
                  +                case 1003: return new org.ccsds.moims.mo.mal.structures.UpdateHeader();
                  +                case 1004: return new org.ccsds.moims.mo.mal.structures.IdBooleanPair();
                  +                case 1005: return new org.ccsds.moims.mo.mal.structures.Pair();
                  +                case 1006: return new org.ccsds.moims.mo.mal.structures.NamedValue();
                  +                case 1007: return new org.ccsds.moims.mo.mal.structures.File();
                  +                case 1008: return new org.ccsds.moims.mo.mal.structures.ObjectIdentity();
                  +                case 1009: return new org.ccsds.moims.mo.mal.structures.ServiceId();
                  +                case 1010: return new org.ccsds.moims.mo.mal.structures.NullableAttribute();
                  +                default: return null;
                  +            }
                  +        }
                  +        switch (typeNumber) {
                  +            case -1010: return new org.ccsds.moims.mo.mal.structures.NullableAttributeList();
                  +            case -1009: return new org.ccsds.moims.mo.mal.structures.ServiceIdList();
                  +            case -1008: return new org.ccsds.moims.mo.mal.structures.ObjectIdentityList();
                  +            case -1007: return new org.ccsds.moims.mo.mal.structures.FileList();
                  +            case -1006: return new org.ccsds.moims.mo.mal.structures.NamedValueList();
                  +            case -1005: return new org.ccsds.moims.mo.mal.structures.PairList();
                  +            case -1004: return new org.ccsds.moims.mo.mal.structures.IdBooleanPairList();
                  +            case -1003: return new org.ccsds.moims.mo.mal.structures.UpdateHeaderList();
                  +            case -1002: return new org.ccsds.moims.mo.mal.structures.SubscriptionFilterList();
                  +            case -1001: return new org.ccsds.moims.mo.mal.structures.SubscriptionList();
                  +            default: return null;
                  +        }
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/MALHelper.java b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/MALHelper.java
                  new file mode 100644
                  index 00000000..e4150796
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/MALHelper.java
                  @@ -0,0 +1,252 @@
                  +package org.ccsds.moims.mo.mal;
                  +
                  +/**
                  + * Helper class for MAL area.
                  + */
                  +public class MALHelper {
                  +
                  +    /**
                  +     * Area number literal.
                  +     */
                  +    public static final int _MAL_AREA_NUMBER = 1;
                  +
                  +    /**
                  +     * Area number instance.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.structures.UShort MAL_AREA_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_MAL_AREA_NUMBER);
                  +
                  +    /**
                  +     * Area name constant.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.structures.Identifier MAL_AREA_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("MAL");
                  +
                  +    /**
                  +     * Area version literal.
                  +     */
                  +    public static final short _MAL_AREA_VERSION = 3;
                  +
                  +    /**
                  +     * Area version instance.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.structures.UOctet MAL_AREA_VERSION = new org.ccsds.moims.mo.mal.structures.UOctet(_MAL_AREA_VERSION);
                  +
                  +    /**
                  +     * Area Elements.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.structures.Element[] MAL_AREA_ELEMENTS = {};
                  +
                  +    /**
                  +     * Services in this Area.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.ServiceInfo[] MAL_AREA_SERVICES = {};
                  +
                  +    /**
                  +     * Area singleton instance.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.MALArea MAL_AREA = new org.ccsds.moims.mo.mal.MALArea(MAL_AREA_NUMBER, MAL_AREA_NAME, MAL_AREA_VERSION, MAL_AREA_ELEMENTS, MAL_AREA_SERVICES, new MALElementFactory());
                  +
                  +    /**
                  +     * Error literal for error DELIVERY_FAILED.
                  +     */
                  +    public static final long _DELIVERY_FAILED_ERROR_NUMBER = 65536;
                  +
                  +    /**
                  +     * Error instance for error DELIVERY_FAILED.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.structures.UInteger DELIVERY_FAILED_ERROR_NUMBER = new org.ccsds.moims.mo.mal.structures.UInteger(_DELIVERY_FAILED_ERROR_NUMBER);
                  +
                  +    /**
                  +     * Error literal for error DELIVERY_TIMEDOUT.
                  +     */
                  +    public static final long _DELIVERY_TIMEDOUT_ERROR_NUMBER = 65537;
                  +
                  +    /**
                  +     * Error instance for error DELIVERY_TIMEDOUT.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.structures.UInteger DELIVERY_TIMEDOUT_ERROR_NUMBER = new org.ccsds.moims.mo.mal.structures.UInteger(_DELIVERY_TIMEDOUT_ERROR_NUMBER);
                  +
                  +    /**
                  +     * Error literal for error DELIVERY_DELAYED.
                  +     */
                  +    public static final long _DELIVERY_DELAYED_ERROR_NUMBER = 65538;
                  +
                  +    /**
                  +     * Error instance for error DELIVERY_DELAYED.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.structures.UInteger DELIVERY_DELAYED_ERROR_NUMBER = new org.ccsds.moims.mo.mal.structures.UInteger(_DELIVERY_DELAYED_ERROR_NUMBER);
                  +
                  +    /**
                  +     * Error literal for error DESTINATION_UNKNOWN.
                  +     */
                  +    public static final long _DESTINATION_UNKNOWN_ERROR_NUMBER = 65539;
                  +
                  +    /**
                  +     * Error instance for error DESTINATION_UNKNOWN.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.structures.UInteger DESTINATION_UNKNOWN_ERROR_NUMBER = new org.ccsds.moims.mo.mal.structures.UInteger(_DESTINATION_UNKNOWN_ERROR_NUMBER);
                  +
                  +    /**
                  +     * Error literal for error DESTINATION_TRANSIENT.
                  +     */
                  +    public static final long _DESTINATION_TRANSIENT_ERROR_NUMBER = 65540;
                  +
                  +    /**
                  +     * Error instance for error DESTINATION_TRANSIENT.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.structures.UInteger DESTINATION_TRANSIENT_ERROR_NUMBER = new org.ccsds.moims.mo.mal.structures.UInteger(_DESTINATION_TRANSIENT_ERROR_NUMBER);
                  +
                  +    /**
                  +     * Error literal for error DESTINATION_LOST.
                  +     */
                  +    public static final long _DESTINATION_LOST_ERROR_NUMBER = 65541;
                  +
                  +    /**
                  +     * Error instance for error DESTINATION_LOST.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.structures.UInteger DESTINATION_LOST_ERROR_NUMBER = new org.ccsds.moims.mo.mal.structures.UInteger(_DESTINATION_LOST_ERROR_NUMBER);
                  +
                  +    /**
                  +     * Error literal for error AUTHENTICATION_FAILED.
                  +     */
                  +    public static final long _AUTHENTICATION_FAILED_ERROR_NUMBER = 65542;
                  +
                  +    /**
                  +     * Error instance for error AUTHENTICATION_FAILED.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.structures.UInteger AUTHENTICATION_FAILED_ERROR_NUMBER = new org.ccsds.moims.mo.mal.structures.UInteger(_AUTHENTICATION_FAILED_ERROR_NUMBER);
                  +
                  +    /**
                  +     * Error literal for error AUTHORISATION_FAIL.
                  +     */
                  +    public static final long _AUTHORISATION_FAIL_ERROR_NUMBER = 65543;
                  +
                  +    /**
                  +     * Error instance for error AUTHORISATION_FAIL.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.structures.UInteger AUTHORISATION_FAIL_ERROR_NUMBER = new org.ccsds.moims.mo.mal.structures.UInteger(_AUTHORISATION_FAIL_ERROR_NUMBER);
                  +
                  +    /**
                  +     * Error literal for error ENCRYPTION_FAIL.
                  +     */
                  +    public static final long _ENCRYPTION_FAIL_ERROR_NUMBER = 65544;
                  +
                  +    /**
                  +     * Error instance for error ENCRYPTION_FAIL.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.structures.UInteger ENCRYPTION_FAIL_ERROR_NUMBER = new org.ccsds.moims.mo.mal.structures.UInteger(_ENCRYPTION_FAIL_ERROR_NUMBER);
                  +
                  +    /**
                  +     * Error literal for error UNSUPPORTED_AREA.
                  +     */
                  +    public static final long _UNSUPPORTED_AREA_ERROR_NUMBER = 65545;
                  +
                  +    /**
                  +     * Error instance for error UNSUPPORTED_AREA.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.structures.UInteger UNSUPPORTED_AREA_ERROR_NUMBER = new org.ccsds.moims.mo.mal.structures.UInteger(_UNSUPPORTED_AREA_ERROR_NUMBER);
                  +
                  +    /**
                  +     * Error literal for error UNSUPPORTED_AREA_VERSION.
                  +     */
                  +    public static final long _UNSUPPORTED_AREA_VERSION_ERROR_NUMBER = 65546;
                  +
                  +    /**
                  +     * Error instance for error UNSUPPORTED_AREA_VERSION.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.structures.UInteger UNSUPPORTED_AREA_VERSION_ERROR_NUMBER = new org.ccsds.moims.mo.mal.structures.UInteger(_UNSUPPORTED_AREA_VERSION_ERROR_NUMBER);
                  +
                  +    /**
                  +     * Error literal for error UNSUPPORTED_SERVICE.
                  +     */
                  +    public static final long _UNSUPPORTED_SERVICE_ERROR_NUMBER = 65547;
                  +
                  +    /**
                  +     * Error instance for error UNSUPPORTED_SERVICE.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.structures.UInteger UNSUPPORTED_SERVICE_ERROR_NUMBER = new org.ccsds.moims.mo.mal.structures.UInteger(_UNSUPPORTED_SERVICE_ERROR_NUMBER);
                  +
                  +    /**
                  +     * Error literal for error UNSUPPORTED_OPERATION.
                  +     */
                  +    public static final long _UNSUPPORTED_OPERATION_ERROR_NUMBER = 65548;
                  +
                  +    /**
                  +     * Error instance for error UNSUPPORTED_OPERATION.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.structures.UInteger UNSUPPORTED_OPERATION_ERROR_NUMBER = new org.ccsds.moims.mo.mal.structures.UInteger(_UNSUPPORTED_OPERATION_ERROR_NUMBER);
                  +
                  +    /**
                  +     * Error literal for error BAD_ENCODING.
                  +     */
                  +    public static final long _BAD_ENCODING_ERROR_NUMBER = 65549;
                  +
                  +    /**
                  +     * Error instance for error BAD_ENCODING.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.structures.UInteger BAD_ENCODING_ERROR_NUMBER = new org.ccsds.moims.mo.mal.structures.UInteger(_BAD_ENCODING_ERROR_NUMBER);
                  +
                  +    /**
                  +     * Error literal for error INTERNAL.
                  +     */
                  +    public static final long _INTERNAL_ERROR_NUMBER = 65550;
                  +
                  +    /**
                  +     * Error instance for error INTERNAL.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.structures.UInteger INTERNAL_ERROR_NUMBER = new org.ccsds.moims.mo.mal.structures.UInteger(_INTERNAL_ERROR_NUMBER);
                  +
                  +    /**
                  +     * Error literal for error UNKNOWN.
                  +     */
                  +    public static final long _UNKNOWN_ERROR_NUMBER = 65551;
                  +
                  +    /**
                  +     * Error instance for error UNKNOWN.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.structures.UInteger UNKNOWN_ERROR_NUMBER = new org.ccsds.moims.mo.mal.structures.UInteger(_UNKNOWN_ERROR_NUMBER);
                  +
                  +    /**
                  +     * Error literal for error INCORRECT_STATE.
                  +     */
                  +    public static final long _INCORRECT_STATE_ERROR_NUMBER = 65552;
                  +
                  +    /**
                  +     * Error instance for error INCORRECT_STATE.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.structures.UInteger INCORRECT_STATE_ERROR_NUMBER = new org.ccsds.moims.mo.mal.structures.UInteger(_INCORRECT_STATE_ERROR_NUMBER);
                  +
                  +    /**
                  +     * Error literal for error TOO_MANY.
                  +     */
                  +    public static final long _TOO_MANY_ERROR_NUMBER = 65553;
                  +
                  +    /**
                  +     * Error instance for error TOO_MANY.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.structures.UInteger TOO_MANY_ERROR_NUMBER = new org.ccsds.moims.mo.mal.structures.UInteger(_TOO_MANY_ERROR_NUMBER);
                  +
                  +    /**
                  +     * Error literal for error SHUTDOWN.
                  +     */
                  +    public static final long _SHUTDOWN_ERROR_NUMBER = 65554;
                  +
                  +    /**
                  +     * Error instance for error SHUTDOWN.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.structures.UInteger SHUTDOWN_ERROR_NUMBER = new org.ccsds.moims.mo.mal.structures.UInteger(_SHUTDOWN_ERROR_NUMBER);
                  +
                  +    /**
                  +     * Error literal for error TRANSACTION_TIMEOUT.
                  +     */
                  +    public static final long _TRANSACTION_TIMEOUT_ERROR_NUMBER = 65555;
                  +
                  +    /**
                  +     * Error instance for error TRANSACTION_TIMEOUT.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.structures.UInteger TRANSACTION_TIMEOUT_ERROR_NUMBER = new org.ccsds.moims.mo.mal.structures.UInteger(_TRANSACTION_TIMEOUT_ERROR_NUMBER);
                  +
                  +    private MALHelper() {
                  +        // Utility class; not meant to be instantiated.
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/ShutdownException.java b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/ShutdownException.java
                  new file mode 100644
                  index 00000000..212c14f6
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/ShutdownException.java
                  @@ -0,0 +1,27 @@
                  +package org.ccsds.moims.mo.mal;
                  +
                  +/**
                  + * The ShutdownException exception. The component is being shutdown.
                  + */
                  +public final class ShutdownException extends org.ccsds.moims.mo.mal.MOErrorException {
                  +
                  +    private static final String MO_ERROR_NAME = "Shutdown";
                  +
                  +    /**
                  +     * Constructs a new ShutdownException exception.
                  +     * 
                  +     */
                  +    public ShutdownException() {
                  +        super(MO_ERROR_NAME, MALHelper.SHUTDOWN_ERROR_NUMBER, "");
                  +    }
                  +
                  +    /**
                  +     * Constructs a new ShutdownException exception.
                  +     * 
                  +     * @param extraInformation The extraInformation of the exception.
                  +     */
                  +    public ShutdownException(Object extraInformation) {
                  +        super(MO_ERROR_NAME, MALHelper.SHUTDOWN_ERROR_NUMBER, extraInformation);
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/TooManyException.java b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/TooManyException.java
                  new file mode 100644
                  index 00000000..084dd762
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/TooManyException.java
                  @@ -0,0 +1,28 @@
                  +package org.ccsds.moims.mo.mal;
                  +
                  +/**
                  + * The TooManyException exception. Maximum number of subscriptions or providers
                  + * of a broker has been exceeded.
                  + */
                  +public final class TooManyException extends org.ccsds.moims.mo.mal.MOErrorException {
                  +
                  +    private static final String MO_ERROR_NAME = "Too Many";
                  +
                  +    /**
                  +     * Constructs a new TooManyException exception.
                  +     * 
                  +     */
                  +    public TooManyException() {
                  +        super(MO_ERROR_NAME, MALHelper.TOO_MANY_ERROR_NUMBER, "");
                  +    }
                  +
                  +    /**
                  +     * Constructs a new TooManyException exception.
                  +     * 
                  +     * @param extraInformation The extraInformation of the exception.
                  +     */
                  +    public TooManyException(Object extraInformation) {
                  +        super(MO_ERROR_NAME, MALHelper.TOO_MANY_ERROR_NUMBER, extraInformation);
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/TransactionTimeoutException.java b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/TransactionTimeoutException.java
                  new file mode 100644
                  index 00000000..0d11787d
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/TransactionTimeoutException.java
                  @@ -0,0 +1,28 @@
                  +package org.ccsds.moims.mo.mal;
                  +
                  +/**
                  + * The TransactionTimeoutException exception. The interaction exceeded a certain
                  + * timeout duration.
                  + */
                  +public final class TransactionTimeoutException extends org.ccsds.moims.mo.mal.MOErrorException {
                  +
                  +    private static final String MO_ERROR_NAME = "Transaction Timeout";
                  +
                  +    /**
                  +     * Constructs a new TransactionTimeoutException exception.
                  +     * 
                  +     */
                  +    public TransactionTimeoutException() {
                  +        super(MO_ERROR_NAME, MALHelper.TRANSACTION_TIMEOUT_ERROR_NUMBER, "");
                  +    }
                  +
                  +    /**
                  +     * Constructs a new TransactionTimeoutException exception.
                  +     * 
                  +     * @param extraInformation The extraInformation of the exception.
                  +     */
                  +    public TransactionTimeoutException(Object extraInformation) {
                  +        super(MO_ERROR_NAME, MALHelper.TRANSACTION_TIMEOUT_ERROR_NUMBER, extraInformation);
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/UnknownException.java b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/UnknownException.java
                  new file mode 100644
                  index 00000000..60cf5b07
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/UnknownException.java
                  @@ -0,0 +1,27 @@
                  +package org.ccsds.moims.mo.mal;
                  +
                  +/**
                  + * The UnknownException exception. Operation specific.
                  + */
                  +public final class UnknownException extends org.ccsds.moims.mo.mal.MOErrorException {
                  +
                  +    private static final String MO_ERROR_NAME = "Unknown";
                  +
                  +    /**
                  +     * Constructs a new UnknownException exception.
                  +     * 
                  +     */
                  +    public UnknownException() {
                  +        super(MO_ERROR_NAME, MALHelper.UNKNOWN_ERROR_NUMBER, "");
                  +    }
                  +
                  +    /**
                  +     * Constructs a new UnknownException exception.
                  +     * 
                  +     * @param extraInformation The extraInformation of the exception.
                  +     */
                  +    public UnknownException(Object extraInformation) {
                  +        super(MO_ERROR_NAME, MALHelper.UNKNOWN_ERROR_NUMBER, extraInformation);
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/UnsupportedAreaException.java b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/UnsupportedAreaException.java
                  new file mode 100644
                  index 00000000..78efcbd9
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/UnsupportedAreaException.java
                  @@ -0,0 +1,28 @@
                  +package org.ccsds.moims.mo.mal;
                  +
                  +/**
                  + * The UnsupportedAreaException exception. The destination does not support
                  + * the selected area.
                  + */
                  +public final class UnsupportedAreaException extends org.ccsds.moims.mo.mal.MOErrorException {
                  +
                  +    private static final String MO_ERROR_NAME = "Unsupported Area";
                  +
                  +    /**
                  +     * Constructs a new UnsupportedAreaException exception.
                  +     * 
                  +     */
                  +    public UnsupportedAreaException() {
                  +        super(MO_ERROR_NAME, MALHelper.UNSUPPORTED_AREA_ERROR_NUMBER, "");
                  +    }
                  +
                  +    /**
                  +     * Constructs a new UnsupportedAreaException exception.
                  +     * 
                  +     * @param extraInformation The extraInformation of the exception.
                  +     */
                  +    public UnsupportedAreaException(Object extraInformation) {
                  +        super(MO_ERROR_NAME, MALHelper.UNSUPPORTED_AREA_ERROR_NUMBER, extraInformation);
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/UnsupportedAreaVersionException.java b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/UnsupportedAreaVersionException.java
                  new file mode 100644
                  index 00000000..7f8980d9
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/UnsupportedAreaVersionException.java
                  @@ -0,0 +1,28 @@
                  +package org.ccsds.moims.mo.mal;
                  +
                  +/**
                  + * The UnsupportedAreaVersionException exception. The destination does not
                  + * support the selected area version.
                  + */
                  +public final class UnsupportedAreaVersionException extends org.ccsds.moims.mo.mal.MOErrorException {
                  +
                  +    private static final String MO_ERROR_NAME = "Unsupported Area Version";
                  +
                  +    /**
                  +     * Constructs a new UnsupportedAreaVersionException exception.
                  +     * 
                  +     */
                  +    public UnsupportedAreaVersionException() {
                  +        super(MO_ERROR_NAME, MALHelper.UNSUPPORTED_AREA_VERSION_ERROR_NUMBER, "");
                  +    }
                  +
                  +    /**
                  +     * Constructs a new UnsupportedAreaVersionException exception.
                  +     * 
                  +     * @param extraInformation The extraInformation of the exception.
                  +     */
                  +    public UnsupportedAreaVersionException(Object extraInformation) {
                  +        super(MO_ERROR_NAME, MALHelper.UNSUPPORTED_AREA_VERSION_ERROR_NUMBER, extraInformation);
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/UnsupportedOperationException.java b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/UnsupportedOperationException.java
                  new file mode 100644
                  index 00000000..cd190bc0
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/UnsupportedOperationException.java
                  @@ -0,0 +1,28 @@
                  +package org.ccsds.moims.mo.mal;
                  +
                  +/**
                  + * The UnsupportedOperationException exception. The destination does not support
                  + * the selected operation.
                  + */
                  +public final class UnsupportedOperationException extends org.ccsds.moims.mo.mal.MOErrorException {
                  +
                  +    private static final String MO_ERROR_NAME = "Unsupported Operation";
                  +
                  +    /**
                  +     * Constructs a new UnsupportedOperationException exception.
                  +     * 
                  +     */
                  +    public UnsupportedOperationException() {
                  +        super(MO_ERROR_NAME, MALHelper.UNSUPPORTED_OPERATION_ERROR_NUMBER, "");
                  +    }
                  +
                  +    /**
                  +     * Constructs a new UnsupportedOperationException exception.
                  +     * 
                  +     * @param extraInformation The extraInformation of the exception.
                  +     */
                  +    public UnsupportedOperationException(Object extraInformation) {
                  +        super(MO_ERROR_NAME, MALHelper.UNSUPPORTED_OPERATION_ERROR_NUMBER, extraInformation);
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/UnsupportedServiceException.java b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/UnsupportedServiceException.java
                  new file mode 100644
                  index 00000000..0d5efee2
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/UnsupportedServiceException.java
                  @@ -0,0 +1,28 @@
                  +package org.ccsds.moims.mo.mal;
                  +
                  +/**
                  + * The UnsupportedServiceException exception. The destination does not support
                  + * the selected service.
                  + */
                  +public final class UnsupportedServiceException extends org.ccsds.moims.mo.mal.MOErrorException {
                  +
                  +    private static final String MO_ERROR_NAME = "Unsupported Service";
                  +
                  +    /**
                  +     * Constructs a new UnsupportedServiceException exception.
                  +     * 
                  +     */
                  +    public UnsupportedServiceException() {
                  +        super(MO_ERROR_NAME, MALHelper.UNSUPPORTED_SERVICE_ERROR_NUMBER, "");
                  +    }
                  +
                  +    /**
                  +     * Constructs a new UnsupportedServiceException exception.
                  +     * 
                  +     * @param extraInformation The extraInformation of the exception.
                  +     */
                  +    public UnsupportedServiceException(Object extraInformation) {
                  +        super(MO_ERROR_NAME, MALHelper.UNSUPPORTED_SERVICE_ERROR_NUMBER, extraInformation);
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/package-info.java
                  new file mode 100644
                  index 00000000..2f718f0c
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/package-info.java
                  @@ -0,0 +1,4 @@
                  +/**
                  + * The MAL area.
                  +*/
                  +package org.ccsds.moims.mo.mal;
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/AttributeType.java b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/AttributeType.java
                  new file mode 100644
                  index 00000000..2e38c219
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/AttributeType.java
                  @@ -0,0 +1,391 @@
                  +package org.ccsds.moims.mo.mal.structures;
                  +
                  +/**
                  + * Enumeration class for AttributeType.
                  + */
                  +public final class AttributeType extends org.ccsds.moims.mo.mal.structures.Enumeration {
                  +
                  +    private static final long serialVersionUID = 281475027042408L;
                  +    /**
                  +     * The TypeId of this Element as a long.
                  +     */
                  +    public static final Long SHORT_FORM = 281475027042408L;
                  +    /**
                  +     * The TypeId of this Element.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM);
                  +
                  +    /**
                  +     * Enumeration value for BLOB.
                  +     */
                  +    public static final int BLOB_VALUE = 1;
                  +
                  +    /**
                  +     * Enumeration singleton for value BLOB.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.structures.AttributeType BLOB = new org.ccsds.moims.mo.mal.structures.AttributeType(org.ccsds.moims.mo.mal.structures.AttributeType.BLOB_VALUE);
                  +
                  +    /**
                  +     * Enumeration value for BOOLEAN.
                  +     */
                  +    public static final int BOOLEAN_VALUE = 2;
                  +
                  +    /**
                  +     * Enumeration singleton for value BOOLEAN.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.structures.AttributeType BOOLEAN = new org.ccsds.moims.mo.mal.structures.AttributeType(org.ccsds.moims.mo.mal.structures.AttributeType.BOOLEAN_VALUE);
                  +
                  +    /**
                  +     * Enumeration value for DURATION.
                  +     */
                  +    public static final int DURATION_VALUE = 3;
                  +
                  +    /**
                  +     * Enumeration singleton for value DURATION.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.structures.AttributeType DURATION = new org.ccsds.moims.mo.mal.structures.AttributeType(org.ccsds.moims.mo.mal.structures.AttributeType.DURATION_VALUE);
                  +
                  +    /**
                  +     * Enumeration value for FLOAT.
                  +     */
                  +    public static final int FLOAT_VALUE = 4;
                  +
                  +    /**
                  +     * Enumeration singleton for value FLOAT.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.structures.AttributeType FLOAT = new org.ccsds.moims.mo.mal.structures.AttributeType(org.ccsds.moims.mo.mal.structures.AttributeType.FLOAT_VALUE);
                  +
                  +    /**
                  +     * Enumeration value for DOUBLE.
                  +     */
                  +    public static final int DOUBLE_VALUE = 5;
                  +
                  +    /**
                  +     * Enumeration singleton for value DOUBLE.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.structures.AttributeType DOUBLE = new org.ccsds.moims.mo.mal.structures.AttributeType(org.ccsds.moims.mo.mal.structures.AttributeType.DOUBLE_VALUE);
                  +
                  +    /**
                  +     * Enumeration value for IDENTIFIER.
                  +     */
                  +    public static final int IDENTIFIER_VALUE = 6;
                  +
                  +    /**
                  +     * Enumeration singleton for value IDENTIFIER.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.structures.AttributeType IDENTIFIER = new org.ccsds.moims.mo.mal.structures.AttributeType(org.ccsds.moims.mo.mal.structures.AttributeType.IDENTIFIER_VALUE);
                  +
                  +    /**
                  +     * Enumeration value for OCTET.
                  +     */
                  +    public static final int OCTET_VALUE = 7;
                  +
                  +    /**
                  +     * Enumeration singleton for value OCTET.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.structures.AttributeType OCTET = new org.ccsds.moims.mo.mal.structures.AttributeType(org.ccsds.moims.mo.mal.structures.AttributeType.OCTET_VALUE);
                  +
                  +    /**
                  +     * Enumeration value for UOCTET.
                  +     */
                  +    public static final int UOCTET_VALUE = 8;
                  +
                  +    /**
                  +     * Enumeration singleton for value UOCTET.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.structures.AttributeType UOCTET = new org.ccsds.moims.mo.mal.structures.AttributeType(org.ccsds.moims.mo.mal.structures.AttributeType.UOCTET_VALUE);
                  +
                  +    /**
                  +     * Enumeration value for SHORT.
                  +     */
                  +    public static final int SHORT_VALUE = 9;
                  +
                  +    /**
                  +     * Enumeration singleton for value SHORT.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.structures.AttributeType SHORT = new org.ccsds.moims.mo.mal.structures.AttributeType(org.ccsds.moims.mo.mal.structures.AttributeType.SHORT_VALUE);
                  +
                  +    /**
                  +     * Enumeration value for USHORT.
                  +     */
                  +    public static final int USHORT_VALUE = 10;
                  +
                  +    /**
                  +     * Enumeration singleton for value USHORT.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.structures.AttributeType USHORT = new org.ccsds.moims.mo.mal.structures.AttributeType(org.ccsds.moims.mo.mal.structures.AttributeType.USHORT_VALUE);
                  +
                  +    /**
                  +     * Enumeration value for INTEGER.
                  +     */
                  +    public static final int INTEGER_VALUE = 11;
                  +
                  +    /**
                  +     * Enumeration singleton for value INTEGER.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.structures.AttributeType INTEGER = new org.ccsds.moims.mo.mal.structures.AttributeType(org.ccsds.moims.mo.mal.structures.AttributeType.INTEGER_VALUE);
                  +
                  +    /**
                  +     * Enumeration value for UINTEGER.
                  +     */
                  +    public static final int UINTEGER_VALUE = 12;
                  +
                  +    /**
                  +     * Enumeration singleton for value UINTEGER.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.structures.AttributeType UINTEGER = new org.ccsds.moims.mo.mal.structures.AttributeType(org.ccsds.moims.mo.mal.structures.AttributeType.UINTEGER_VALUE);
                  +
                  +    /**
                  +     * Enumeration value for LONG.
                  +     */
                  +    public static final int LONG_VALUE = 13;
                  +
                  +    /**
                  +     * Enumeration singleton for value LONG.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.structures.AttributeType LONG = new org.ccsds.moims.mo.mal.structures.AttributeType(org.ccsds.moims.mo.mal.structures.AttributeType.LONG_VALUE);
                  +
                  +    /**
                  +     * Enumeration value for ULONG.
                  +     */
                  +    public static final int ULONG_VALUE = 14;
                  +
                  +    /**
                  +     * Enumeration singleton for value ULONG.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.structures.AttributeType ULONG = new org.ccsds.moims.mo.mal.structures.AttributeType(org.ccsds.moims.mo.mal.structures.AttributeType.ULONG_VALUE);
                  +
                  +    /**
                  +     * Enumeration value for STRING.
                  +     */
                  +    public static final int STRING_VALUE = 15;
                  +
                  +    /**
                  +     * Enumeration singleton for value STRING.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.structures.AttributeType STRING = new org.ccsds.moims.mo.mal.structures.AttributeType(org.ccsds.moims.mo.mal.structures.AttributeType.STRING_VALUE);
                  +
                  +    /**
                  +     * Enumeration value for TIME.
                  +     */
                  +    public static final int TIME_VALUE = 16;
                  +
                  +    /**
                  +     * Enumeration singleton for value TIME.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.structures.AttributeType TIME = new org.ccsds.moims.mo.mal.structures.AttributeType(org.ccsds.moims.mo.mal.structures.AttributeType.TIME_VALUE);
                  +
                  +    /**
                  +     * Enumeration value for FINETIME.
                  +     */
                  +    public static final int FINETIME_VALUE = 17;
                  +
                  +    /**
                  +     * Enumeration singleton for value FINETIME.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.structures.AttributeType FINETIME = new org.ccsds.moims.mo.mal.structures.AttributeType(org.ccsds.moims.mo.mal.structures.AttributeType.FINETIME_VALUE);
                  +
                  +    /**
                  +     * Enumeration value for URI.
                  +     */
                  +    public static final int URI_VALUE = 18;
                  +
                  +    /**
                  +     * Enumeration singleton for value URI.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.structures.AttributeType URI = new org.ccsds.moims.mo.mal.structures.AttributeType(org.ccsds.moims.mo.mal.structures.AttributeType.URI_VALUE);
                  +
                  +    /**
                  +     * Enumeration value for OBJECTREF.
                  +     */
                  +    public static final int OBJECTREF_VALUE = 19;
                  +
                  +    /**
                  +     * Enumeration singleton for value OBJECTREF.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.structures.AttributeType OBJECTREF = new org.ccsds.moims.mo.mal.structures.AttributeType(org.ccsds.moims.mo.mal.structures.AttributeType.OBJECTREF_VALUE);
                  +
                  +    /**
                  +     * Set of enumeration instances.
                  +     */
                  +    private static final org.ccsds.moims.mo.mal.structures.AttributeType[] _ENUMERATIONS = {
                  +        BLOB, BOOLEAN, DURATION, FLOAT, DOUBLE, IDENTIFIER, OCTET, UOCTET, SHORT,
                  +        USHORT, INTEGER, UINTEGER, LONG, ULONG, STRING, TIME, FINETIME, URI, OBJECTREF};
                  +
                  +    /**
                  +     * AttributeType is an enumeration that shall be used to hold the defined MAL Attribute types.
                  +     */
                  +    public AttributeType() {
                  +        super(-1);
                  +    }
                  +
                  +    /**
                  +     * AttributeType is an enumeration that shall be used to hold the defined
                  +     * MAL Attribute types.
                  +     * 
                  +     * @param value The value of the Enumeration.
                  +     */
                  +    public AttributeType(int value) {
                  +        super(value);
                  +    }
                  +
                  +    @Override
                  +    public String toString() {
                  +        switch (getValue()) {
                  +            case BLOB_VALUE:
                  +                return "BLOB";
                  +            case BOOLEAN_VALUE:
                  +                return "BOOLEAN";
                  +            case DURATION_VALUE:
                  +                return "DURATION";
                  +            case FLOAT_VALUE:
                  +                return "FLOAT";
                  +            case DOUBLE_VALUE:
                  +                return "DOUBLE";
                  +            case IDENTIFIER_VALUE:
                  +                return "IDENTIFIER";
                  +            case OCTET_VALUE:
                  +                return "OCTET";
                  +            case UOCTET_VALUE:
                  +                return "UOCTET";
                  +            case SHORT_VALUE:
                  +                return "SHORT";
                  +            case USHORT_VALUE:
                  +                return "USHORT";
                  +            case INTEGER_VALUE:
                  +                return "INTEGER";
                  +            case UINTEGER_VALUE:
                  +                return "UINTEGER";
                  +            case LONG_VALUE:
                  +                return "LONG";
                  +            case ULONG_VALUE:
                  +                return "ULONG";
                  +            case STRING_VALUE:
                  +                return "STRING";
                  +            case TIME_VALUE:
                  +                return "TIME";
                  +            case FINETIME_VALUE:
                  +                return "FINETIME";
                  +            case URI_VALUE:
                  +                return "URI";
                  +            case OBJECTREF_VALUE:
                  +                return "OBJECTREF";
                  +            default:
                  +                throw new RuntimeException("Unknown ordinal!");
                  +        }
                  +    }
                  +
                  +    /**
                  +     * Returns the enumeration element represented by the supplied string, or
                  +     * null if not matched.
                  +     * 
                  +     * @param s s The string to search for.
                  +     * @return The matched enumeration element, or null if not matched.
                  +     */
                  +    public static org.ccsds.moims.mo.mal.structures.AttributeType fromString(String s) {
                  +        switch (s) {
                  +            case "BLOB":
                  +                return AttributeType.BLOB;
                  +            case "BOOLEAN":
                  +                return AttributeType.BOOLEAN;
                  +            case "DURATION":
                  +                return AttributeType.DURATION;
                  +            case "FLOAT":
                  +                return AttributeType.FLOAT;
                  +            case "DOUBLE":
                  +                return AttributeType.DOUBLE;
                  +            case "IDENTIFIER":
                  +                return AttributeType.IDENTIFIER;
                  +            case "OCTET":
                  +                return AttributeType.OCTET;
                  +            case "UOCTET":
                  +                return AttributeType.UOCTET;
                  +            case "SHORT":
                  +                return AttributeType.SHORT;
                  +            case "USHORT":
                  +                return AttributeType.USHORT;
                  +            case "INTEGER":
                  +                return AttributeType.INTEGER;
                  +            case "UINTEGER":
                  +                return AttributeType.UINTEGER;
                  +            case "LONG":
                  +                return AttributeType.LONG;
                  +            case "ULONG":
                  +                return AttributeType.ULONG;
                  +            case "STRING":
                  +                return AttributeType.STRING;
                  +            case "TIME":
                  +                return AttributeType.TIME;
                  +            case "FINETIME":
                  +                return AttributeType.FINETIME;
                  +            case "URI":
                  +                return AttributeType.URI;
                  +            case "OBJECTREF":
                  +                return AttributeType.OBJECTREF;
                  +            default:
                  +                throw new RuntimeException("Unknown Enumeration for the provided string: " + s);
                  +        }
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Enumeration fromValue(Integer value) {
                  +        switch (value) {
                  +            case BLOB_VALUE:
                  +                return AttributeType.BLOB;
                  +            case BOOLEAN_VALUE:
                  +                return AttributeType.BOOLEAN;
                  +            case DURATION_VALUE:
                  +                return AttributeType.DURATION;
                  +            case FLOAT_VALUE:
                  +                return AttributeType.FLOAT;
                  +            case DOUBLE_VALUE:
                  +                return AttributeType.DOUBLE;
                  +            case IDENTIFIER_VALUE:
                  +                return AttributeType.IDENTIFIER;
                  +            case OCTET_VALUE:
                  +                return AttributeType.OCTET;
                  +            case UOCTET_VALUE:
                  +                return AttributeType.UOCTET;
                  +            case SHORT_VALUE:
                  +                return AttributeType.SHORT;
                  +            case USHORT_VALUE:
                  +                return AttributeType.USHORT;
                  +            case INTEGER_VALUE:
                  +                return AttributeType.INTEGER;
                  +            case UINTEGER_VALUE:
                  +                return AttributeType.UINTEGER;
                  +            case LONG_VALUE:
                  +                return AttributeType.LONG;
                  +            case ULONG_VALUE:
                  +                return AttributeType.ULONG;
                  +            case STRING_VALUE:
                  +                return AttributeType.STRING;
                  +            case TIME_VALUE:
                  +                return AttributeType.TIME;
                  +            case FINETIME_VALUE:
                  +                return AttributeType.FINETIME;
                  +            case URI_VALUE:
                  +                return AttributeType.URI;
                  +            case OBJECTREF_VALUE:
                  +                return AttributeType.OBJECTREF;
                  +            default:
                  +                throw new RuntimeException("Unknown Enumeration for the provided value: " + value);
                  +        }
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createElement() {
                  +        return _ENUMERATIONS[0];
                  +    }
                  +
                  +    @Override
                  +    public int getEnumSize() {
                  +        return 19;
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.TypeId getTypeId() {
                  +        return TYPE_ID;
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/AttributeTypeList.java b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/AttributeTypeList.java
                  new file mode 100644
                  index 00000000..b19b14a3
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/AttributeTypeList.java
                  @@ -0,0 +1,79 @@
                  +package org.ccsds.moims.mo.mal.structures;
                  +
                  +/**
                  + * List class for AttributeType.
                  + */
                  +public final class AttributeTypeList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList {
                  +
                  +    private static final long serialVersionUID = 281475043819416L;
                  +    /**
                  +     * The TypeId of this Element as a long.
                  +     */
                  +    public static final Long SHORT_FORM = 281475043819416L;
                  +    /**
                  +     * The TypeId of this Element.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM);
                  +
                  +    /**
                  +     * Default constructor for AttributeTypeList.
                  +     * 
                  +     */
                  +    public AttributeTypeList() {
                  +    }
                  +
                  +    /**
                  +     * Constructor that initialises the capacity of the list.
                  +     * 
                  +     * @param initialCapacity The required initial capacity.
                  +     */
                  +    public AttributeTypeList(int initialCapacity) {
                  +        super(initialCapacity);
                  +    }
                  +
                  +    /**
                  +     * Constructor that uses an ArrayList for initialization.
                  +     * 
                  +     * @param elementList The ArrayList that is used for initialization.
                  +     */
                  +    public AttributeTypeList(java.util.ArrayList elementList) {
                  +        for(org.ccsds.moims.mo.mal.structures.AttributeType element : elementList) {
                  +            this.add(element);
                  +        }
                  +    }
                  +
                  +    @Override
                  +    public boolean add(org.ccsds.moims.mo.mal.structures.AttributeType element) {
                  +        if (element == null) {
                  +            throw new IllegalArgumentException("The added argument cannot be null!");
                  +        }
                  +        return super.add(element);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createElement() {
                  +        return new AttributeTypeList();
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createTypedElement() {
                  +        return org.ccsds.moims.mo.mal.structures.AttributeType.BLOB;
                  +    }
                  +
                  +    @Override
                  +    public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        encoder.encodeHomogeneousList(this);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        decoder.decodeHomogeneousList(this);
                  +        return this;
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.TypeId getTypeId() {
                  +        return TYPE_ID;
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/BlobList.java b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/BlobList.java
                  new file mode 100644
                  index 00000000..65b90354
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/BlobList.java
                  @@ -0,0 +1,79 @@
                  +package org.ccsds.moims.mo.mal.structures;
                  +
                  +/**
                  + * List class for Blob.
                  + */
                  +public final class BlobList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList {
                  +
                  +    private static final long serialVersionUID = 281475043819519L;
                  +    /**
                  +     * The TypeId of this Element as a long.
                  +     */
                  +    public static final Long SHORT_FORM = 281475043819519L;
                  +    /**
                  +     * The TypeId of this Element.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM);
                  +
                  +    /**
                  +     * Default constructor for BlobList.
                  +     * 
                  +     */
                  +    public BlobList() {
                  +    }
                  +
                  +    /**
                  +     * Constructor that initialises the capacity of the list.
                  +     * 
                  +     * @param initialCapacity The required initial capacity.
                  +     */
                  +    public BlobList(int initialCapacity) {
                  +        super(initialCapacity);
                  +    }
                  +
                  +    /**
                  +     * Constructor that uses an ArrayList for initialization.
                  +     * 
                  +     * @param elementList The ArrayList that is used for initialization.
                  +     */
                  +    public BlobList(java.util.ArrayList elementList) {
                  +        for(org.ccsds.moims.mo.mal.structures.Blob element : elementList) {
                  +            this.add(element);
                  +        }
                  +    }
                  +
                  +    @Override
                  +    public boolean add(org.ccsds.moims.mo.mal.structures.Blob element) {
                  +        if (element == null) {
                  +            throw new IllegalArgumentException("The added argument cannot be null!");
                  +        }
                  +        return super.add(element);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createElement() {
                  +        return new BlobList();
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createTypedElement() {
                  +        return new org.ccsds.moims.mo.mal.structures.Blob();
                  +    }
                  +
                  +    @Override
                  +    public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        encoder.encodeHomogeneousList(this);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        decoder.decodeHomogeneousList(this);
                  +        return this;
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.TypeId getTypeId() {
                  +        return TYPE_ID;
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/BooleanList.java b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/BooleanList.java
                  new file mode 100644
                  index 00000000..98070a38
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/BooleanList.java
                  @@ -0,0 +1,80 @@
                  +package org.ccsds.moims.mo.mal.structures;
                  +
                  +/**
                  + * List class for Boolean.
                  + */
                  +public final class BooleanList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList {
                  +
                  +    private static final long serialVersionUID = 281475043819518L;
                  +    /**
                  +     * The TypeId of this Element as a long.
                  +     */
                  +    public static final Long SHORT_FORM = 281475043819518L;
                  +    /**
                  +     * The TypeId of this Element.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM);
                  +
                  +    /**
                  +     * Default constructor for BooleanList.
                  +     * 
                  +     */
                  +    public BooleanList() {
                  +    }
                  +
                  +    /**
                  +     * Constructor that initialises the capacity of the list.
                  +     * 
                  +     * @param initialCapacity The required initial capacity.
                  +     */
                  +    public BooleanList(int initialCapacity) {
                  +        super(initialCapacity);
                  +    }
                  +
                  +    /**
                  +     * Constructor that uses an ArrayList for initialization.
                  +     * 
                  +     * @param elementList The ArrayList that is used for initialization.
                  +     */
                  +    public BooleanList(java.util.ArrayList elementList) {
                  +        for(Boolean element : elementList) {
                  +            this.add(element);
                  +        }
                  +    }
                  +
                  +    @Override
                  +    public boolean add(Boolean element) {
                  +        if (element == null) {
                  +            throw new IllegalArgumentException("The added argument cannot be null!");
                  +        }
                  +        return super.add(element);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createElement() {
                  +        return new BooleanList();
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createTypedElement() {
                  +        org.ccsds.moims.mo.mal.TypeId typeId = this.getTypeId();
                  +        return new Union(typeId.generateTypeIdPositive());
                  +    }
                  +
                  +    @Override
                  +    public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        encoder.encodeHomogeneousList(this);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        decoder.decodeHomogeneousList(this);
                  +        return this;
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.TypeId getTypeId() {
                  +        return TYPE_ID;
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/DoubleList.java b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/DoubleList.java
                  new file mode 100644
                  index 00000000..f201e195
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/DoubleList.java
                  @@ -0,0 +1,80 @@
                  +package org.ccsds.moims.mo.mal.structures;
                  +
                  +/**
                  + * List class for Double.
                  + */
                  +public final class DoubleList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList {
                  +
                  +    private static final long serialVersionUID = 281475043819515L;
                  +    /**
                  +     * The TypeId of this Element as a long.
                  +     */
                  +    public static final Long SHORT_FORM = 281475043819515L;
                  +    /**
                  +     * The TypeId of this Element.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM);
                  +
                  +    /**
                  +     * Default constructor for DoubleList.
                  +     * 
                  +     */
                  +    public DoubleList() {
                  +    }
                  +
                  +    /**
                  +     * Constructor that initialises the capacity of the list.
                  +     * 
                  +     * @param initialCapacity The required initial capacity.
                  +     */
                  +    public DoubleList(int initialCapacity) {
                  +        super(initialCapacity);
                  +    }
                  +
                  +    /**
                  +     * Constructor that uses an ArrayList for initialization.
                  +     * 
                  +     * @param elementList The ArrayList that is used for initialization.
                  +     */
                  +    public DoubleList(java.util.ArrayList elementList) {
                  +        for(Double element : elementList) {
                  +            this.add(element);
                  +        }
                  +    }
                  +
                  +    @Override
                  +    public boolean add(Double element) {
                  +        if (element == null) {
                  +            throw new IllegalArgumentException("The added argument cannot be null!");
                  +        }
                  +        return super.add(element);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createElement() {
                  +        return new DoubleList();
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createTypedElement() {
                  +        org.ccsds.moims.mo.mal.TypeId typeId = this.getTypeId();
                  +        return new Union(typeId.generateTypeIdPositive());
                  +    }
                  +
                  +    @Override
                  +    public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        encoder.encodeHomogeneousList(this);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        decoder.decodeHomogeneousList(this);
                  +        return this;
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.TypeId getTypeId() {
                  +        return TYPE_ID;
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/DurationList.java b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/DurationList.java
                  new file mode 100644
                  index 00000000..c4428ec1
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/DurationList.java
                  @@ -0,0 +1,79 @@
                  +package org.ccsds.moims.mo.mal.structures;
                  +
                  +/**
                  + * List class for Duration.
                  + */
                  +public final class DurationList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList {
                  +
                  +    private static final long serialVersionUID = 281475043819517L;
                  +    /**
                  +     * The TypeId of this Element as a long.
                  +     */
                  +    public static final Long SHORT_FORM = 281475043819517L;
                  +    /**
                  +     * The TypeId of this Element.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM);
                  +
                  +    /**
                  +     * Default constructor for DurationList.
                  +     * 
                  +     */
                  +    public DurationList() {
                  +    }
                  +
                  +    /**
                  +     * Constructor that initialises the capacity of the list.
                  +     * 
                  +     * @param initialCapacity The required initial capacity.
                  +     */
                  +    public DurationList(int initialCapacity) {
                  +        super(initialCapacity);
                  +    }
                  +
                  +    /**
                  +     * Constructor that uses an ArrayList for initialization.
                  +     * 
                  +     * @param elementList The ArrayList that is used for initialization.
                  +     */
                  +    public DurationList(java.util.ArrayList elementList) {
                  +        for(org.ccsds.moims.mo.mal.structures.Duration element : elementList) {
                  +            this.add(element);
                  +        }
                  +    }
                  +
                  +    @Override
                  +    public boolean add(org.ccsds.moims.mo.mal.structures.Duration element) {
                  +        if (element == null) {
                  +            throw new IllegalArgumentException("The added argument cannot be null!");
                  +        }
                  +        return super.add(element);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createElement() {
                  +        return new DurationList();
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createTypedElement() {
                  +        return new org.ccsds.moims.mo.mal.structures.Duration();
                  +    }
                  +
                  +    @Override
                  +    public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        encoder.encodeHomogeneousList(this);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        decoder.decodeHomogeneousList(this);
                  +        return this;
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.TypeId getTypeId() {
                  +        return TYPE_ID;
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/File.java b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/File.java
                  new file mode 100644
                  index 00000000..2a9f47ad
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/File.java
                  @@ -0,0 +1,303 @@
                  +package org.ccsds.moims.mo.mal.structures;
                  +
                  +/**
                  + * The File structure represents a file and shall be used to hold details
                  + * about a file. It may also, optionally, hold a BLOB of the file data. The
                  + * file type shall be denoted using the internet MIME media types.
                  + */
                  +public final class File implements org.ccsds.moims.mo.mal.structures.Composite {
                  +
                  +    private static final long serialVersionUID = 281475027043311L;
                  +    /**
                  +     * The TypeId of this Element as a long.
                  +     */
                  +    public static final Long SHORT_FORM = 281475027043311L;
                  +    /**
                  +     * The TypeId of this Element.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM);
                  +
                  +    /**
                  +     * The file name.
                  +     */
                  +    private String name;
                  +
                  +    /**
                  +     * The MIME type of the file, NULL if not known.
                  +     */
                  +    private String mimeType;
                  +
                  +    /**
                  +     * The creation timestamp of the file, NULL if not known.
                  +     */
                  +    private org.ccsds.moims.mo.mal.structures.Time creationDate;
                  +
                  +    /**
                  +     * The last modification timestamp of the file, NULL if not known.
                  +     */
                  +    private org.ccsds.moims.mo.mal.structures.Time modificationDate;
                  +
                  +    /**
                  +     * The size of the file in Octets, NULL if not known.
                  +     */
                  +    private org.ccsds.moims.mo.mal.structures.ULong size;
                  +
                  +    /**
                  +     * The contents of the file, NULL if not supplied.
                  +     */
                  +    private org.ccsds.moims.mo.mal.structures.Blob content;
                  +
                  +    /**
                  +     * A list of extra metadata for the file.
                  +     */
                  +    private org.ccsds.moims.mo.mal.structures.NamedValueList metaData;
                  +
                  +    /**
                  +     * Default constructor for File.
                  +     * 
                  +     */
                  +    public File() {
                  +    }
                  +
                  +    /**
                  +     * Constructor that initialises the values of the structure.
                  +     * 
                  +     * @param name The file name.
                  +     * @param mimeType The MIME type of the file, NULL if not known.
                  +     * @param creationDate The creation timestamp of the file, NULL if not known.
                  +     * @param modificationDate The last modification timestamp of the file, NULL if not known.
                  +     * @param size The size of the file in Octets, NULL if not known.
                  +     * @param content The contents of the file, NULL if not supplied.
                  +     * @param metaData A list of extra metadata for the file.
                  +     */
                  +    public File(String name,
                  +            String mimeType,
                  +            org.ccsds.moims.mo.mal.structures.Time creationDate,
                  +            org.ccsds.moims.mo.mal.structures.Time modificationDate,
                  +            org.ccsds.moims.mo.mal.structures.ULong size,
                  +            org.ccsds.moims.mo.mal.structures.Blob content,
                  +            org.ccsds.moims.mo.mal.structures.NamedValueList metaData) {
                  +        this.name = name;
                  +        this.mimeType = mimeType;
                  +        this.creationDate = creationDate;
                  +        this.modificationDate = modificationDate;
                  +        this.size = size;
                  +        this.content = content;
                  +        this.metaData = metaData;
                  +    }
                  +
                  +    /**
                  +     * Constructor that initialises the non-nullable values of the structure.
                  +     * 
                  +     * @param name The file name.
                  +     */
                  +    public File(String name) {
                  +        this.name = name;
                  +        this.mimeType = null;
                  +        this.creationDate = null;
                  +        this.modificationDate = null;
                  +        this.size = null;
                  +        this.content = null;
                  +        this.metaData = null;
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createElement() {
                  +        return new org.ccsds.moims.mo.mal.structures.File();
                  +    }
                  +
                  +    /**
                  +     * Returns the field name.
                  +     * 
                  +     * @return The field name
                  +     */
                  +    public String getName() {
                  +        return name;
                  +    }
                  +
                  +    /**
                  +     * Returns the field mimeType.
                  +     * 
                  +     * @return The field mimeType
                  +     */
                  +    public String getMimeType() {
                  +        return mimeType;
                  +    }
                  +
                  +    /**
                  +     * Returns the field creationDate.
                  +     * 
                  +     * @return The field creationDate
                  +     */
                  +    public org.ccsds.moims.mo.mal.structures.Time getCreationDate() {
                  +        return creationDate;
                  +    }
                  +
                  +    /**
                  +     * Returns the field modificationDate.
                  +     * 
                  +     * @return The field modificationDate
                  +     */
                  +    public org.ccsds.moims.mo.mal.structures.Time getModificationDate() {
                  +        return modificationDate;
                  +    }
                  +
                  +    /**
                  +     * Returns the field size.
                  +     * 
                  +     * @return The field size
                  +     */
                  +    public org.ccsds.moims.mo.mal.structures.ULong getSize() {
                  +        return size;
                  +    }
                  +
                  +    /**
                  +     * Returns the field content.
                  +     * 
                  +     * @return The field content
                  +     */
                  +    public org.ccsds.moims.mo.mal.structures.Blob getContent() {
                  +        return content;
                  +    }
                  +
                  +    /**
                  +     * Returns the field metaData.
                  +     * 
                  +     * @return The field metaData
                  +     */
                  +    public org.ccsds.moims.mo.mal.structures.NamedValueList getMetaData() {
                  +        return metaData;
                  +    }
                  +
                  +    @Override
                  +    public boolean equals(Object obj) {
                  +        if (obj instanceof File) {
                  +            File other = (File) obj;
                  +            if (name == null) {
                  +                if (other.name != null) {
                  +                    return false;
                  +                }
                  +            } else {
                  +                if (! name.equals(other.name)) {
                  +                    return false;
                  +                }
                  +            }
                  +            if (mimeType == null) {
                  +                if (other.mimeType != null) {
                  +                    return false;
                  +                }
                  +            } else {
                  +                if (! mimeType.equals(other.mimeType)) {
                  +                    return false;
                  +                }
                  +            }
                  +            if (creationDate == null) {
                  +                if (other.creationDate != null) {
                  +                    return false;
                  +                }
                  +            } else {
                  +                if (! creationDate.equals(other.creationDate)) {
                  +                    return false;
                  +                }
                  +            }
                  +            if (modificationDate == null) {
                  +                if (other.modificationDate != null) {
                  +                    return false;
                  +                }
                  +            } else {
                  +                if (! modificationDate.equals(other.modificationDate)) {
                  +                    return false;
                  +                }
                  +            }
                  +            if (size == null) {
                  +                if (other.size != null) {
                  +                    return false;
                  +                }
                  +            } else {
                  +                if (! size.equals(other.size)) {
                  +                    return false;
                  +                }
                  +            }
                  +            if (content == null) {
                  +                if (other.content != null) {
                  +                    return false;
                  +                }
                  +            } else {
                  +                if (! content.equals(other.content)) {
                  +                    return false;
                  +                }
                  +            }
                  +            if (metaData == null) {
                  +                if (other.metaData != null) {
                  +                    return false;
                  +                }
                  +            } else {
                  +                if (! metaData.equals(other.metaData)) {
                  +                    return false;
                  +                }
                  +            }
                  +            return true;
                  +        }
                  +        return false;
                  +    }
                  +
                  +    @Override
                  +    public int hashCode() {
                  +        int hash = 7;
                  +        hash = 83 * hash + (name != null ? name.hashCode() : 0);
                  +        hash = 83 * hash + (mimeType != null ? mimeType.hashCode() : 0);
                  +        hash = 83 * hash + (creationDate != null ? creationDate.hashCode() : 0);
                  +        hash = 83 * hash + (modificationDate != null ? modificationDate.hashCode() : 0);
                  +        hash = 83 * hash + (size != null ? size.hashCode() : 0);
                  +        hash = 83 * hash + (content != null ? content.hashCode() : 0);
                  +        hash = 83 * hash + (metaData != null ? metaData.hashCode() : 0);
                  +        return hash;
                  +    }
                  +
                  +    @Override
                  +    public String toString() {
                  +        StringBuilder buf = new StringBuilder();
                  +        buf.append("(File: ");
                  +        buf.append("name=").append(name);
                  +        buf.append(", mimeType=").append(mimeType);
                  +        buf.append(", creationDate=").append(creationDate);
                  +        buf.append(", modificationDate=").append(modificationDate);
                  +        buf.append(", size=").append(size);
                  +        buf.append(", content=").append(content);
                  +        buf.append(", metaData=").append(metaData);
                  +        buf.append(')');
                  +        return buf.toString();
                  +    }
                  +
                  +    @Override
                  +    public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        if (name == null) {
                  +            throw new org.ccsds.moims.mo.mal.MALException("The field 'name' cannot be null!");
                  +        }
                  +        encoder.encodeString(name);
                  +        encoder.encodeNullableString(mimeType);
                  +        encoder.encodeNullableTime(creationDate);
                  +        encoder.encodeNullableTime(modificationDate);
                  +        encoder.encodeNullableULong(size);
                  +        encoder.encodeNullableBlob(content);
                  +        encoder.encodeNullableElement(metaData);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        name = decoder.decodeString();
                  +        mimeType = decoder.decodeNullableString();
                  +        creationDate = decoder.decodeNullableTime();
                  +        modificationDate = decoder.decodeNullableTime();
                  +        size = decoder.decodeNullableULong();
                  +        content = decoder.decodeNullableBlob();
                  +        metaData = (org.ccsds.moims.mo.mal.structures.NamedValueList) decoder.decodeNullableElement(new org.ccsds.moims.mo.mal.structures.NamedValueList());
                  +        return this;
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.TypeId getTypeId() {
                  +        return TYPE_ID;
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/FileList.java b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/FileList.java
                  new file mode 100644
                  index 00000000..e1b0efa3
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/FileList.java
                  @@ -0,0 +1,79 @@
                  +package org.ccsds.moims.mo.mal.structures;
                  +
                  +/**
                  + * List class for File.
                  + */
                  +public final class FileList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList {
                  +
                  +    private static final long serialVersionUID = 281475043818513L;
                  +    /**
                  +     * The TypeId of this Element as a long.
                  +     */
                  +    public static final Long SHORT_FORM = 281475043818513L;
                  +    /**
                  +     * The TypeId of this Element.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM);
                  +
                  +    /**
                  +     * Default constructor for FileList.
                  +     * 
                  +     */
                  +    public FileList() {
                  +    }
                  +
                  +    /**
                  +     * Constructor that initialises the capacity of the list.
                  +     * 
                  +     * @param initialCapacity The required initial capacity.
                  +     */
                  +    public FileList(int initialCapacity) {
                  +        super(initialCapacity);
                  +    }
                  +
                  +    /**
                  +     * Constructor that uses an ArrayList for initialization.
                  +     * 
                  +     * @param elementList The ArrayList that is used for initialization.
                  +     */
                  +    public FileList(java.util.ArrayList elementList) {
                  +        for(org.ccsds.moims.mo.mal.structures.File element : elementList) {
                  +            this.add(element);
                  +        }
                  +    }
                  +
                  +    @Override
                  +    public boolean add(org.ccsds.moims.mo.mal.structures.File element) {
                  +        if (element == null) {
                  +            throw new IllegalArgumentException("The added argument cannot be null!");
                  +        }
                  +        return super.add(element);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createElement() {
                  +        return new FileList();
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createTypedElement() {
                  +        return new org.ccsds.moims.mo.mal.structures.File();
                  +    }
                  +
                  +    @Override
                  +    public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        encoder.encodeHomogeneousList(this);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        decoder.decodeHomogeneousList(this);
                  +        return this;
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.TypeId getTypeId() {
                  +        return TYPE_ID;
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/FineTimeList.java b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/FineTimeList.java
                  new file mode 100644
                  index 00000000..278afb49
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/FineTimeList.java
                  @@ -0,0 +1,79 @@
                  +package org.ccsds.moims.mo.mal.structures;
                  +
                  +/**
                  + * List class for FineTime.
                  + */
                  +public final class FineTimeList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList {
                  +
                  +    private static final long serialVersionUID = 281475043819503L;
                  +    /**
                  +     * The TypeId of this Element as a long.
                  +     */
                  +    public static final Long SHORT_FORM = 281475043819503L;
                  +    /**
                  +     * The TypeId of this Element.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM);
                  +
                  +    /**
                  +     * Default constructor for FineTimeList.
                  +     * 
                  +     */
                  +    public FineTimeList() {
                  +    }
                  +
                  +    /**
                  +     * Constructor that initialises the capacity of the list.
                  +     * 
                  +     * @param initialCapacity The required initial capacity.
                  +     */
                  +    public FineTimeList(int initialCapacity) {
                  +        super(initialCapacity);
                  +    }
                  +
                  +    /**
                  +     * Constructor that uses an ArrayList for initialization.
                  +     * 
                  +     * @param elementList The ArrayList that is used for initialization.
                  +     */
                  +    public FineTimeList(java.util.ArrayList elementList) {
                  +        for(org.ccsds.moims.mo.mal.structures.FineTime element : elementList) {
                  +            this.add(element);
                  +        }
                  +    }
                  +
                  +    @Override
                  +    public boolean add(org.ccsds.moims.mo.mal.structures.FineTime element) {
                  +        if (element == null) {
                  +            throw new IllegalArgumentException("The added argument cannot be null!");
                  +        }
                  +        return super.add(element);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createElement() {
                  +        return new FineTimeList();
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createTypedElement() {
                  +        return new org.ccsds.moims.mo.mal.structures.FineTime();
                  +    }
                  +
                  +    @Override
                  +    public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        encoder.encodeHomogeneousList(this);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        decoder.decodeHomogeneousList(this);
                  +        return this;
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.TypeId getTypeId() {
                  +        return TYPE_ID;
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/FloatList.java b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/FloatList.java
                  new file mode 100644
                  index 00000000..2c7d042a
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/FloatList.java
                  @@ -0,0 +1,80 @@
                  +package org.ccsds.moims.mo.mal.structures;
                  +
                  +/**
                  + * List class for Float.
                  + */
                  +public final class FloatList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList {
                  +
                  +    private static final long serialVersionUID = 281475043819516L;
                  +    /**
                  +     * The TypeId of this Element as a long.
                  +     */
                  +    public static final Long SHORT_FORM = 281475043819516L;
                  +    /**
                  +     * The TypeId of this Element.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM);
                  +
                  +    /**
                  +     * Default constructor for FloatList.
                  +     * 
                  +     */
                  +    public FloatList() {
                  +    }
                  +
                  +    /**
                  +     * Constructor that initialises the capacity of the list.
                  +     * 
                  +     * @param initialCapacity The required initial capacity.
                  +     */
                  +    public FloatList(int initialCapacity) {
                  +        super(initialCapacity);
                  +    }
                  +
                  +    /**
                  +     * Constructor that uses an ArrayList for initialization.
                  +     * 
                  +     * @param elementList The ArrayList that is used for initialization.
                  +     */
                  +    public FloatList(java.util.ArrayList elementList) {
                  +        for(Float element : elementList) {
                  +            this.add(element);
                  +        }
                  +    }
                  +
                  +    @Override
                  +    public boolean add(Float element) {
                  +        if (element == null) {
                  +            throw new IllegalArgumentException("The added argument cannot be null!");
                  +        }
                  +        return super.add(element);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createElement() {
                  +        return new FloatList();
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createTypedElement() {
                  +        org.ccsds.moims.mo.mal.TypeId typeId = this.getTypeId();
                  +        return new Union(typeId.generateTypeIdPositive());
                  +    }
                  +
                  +    @Override
                  +    public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        encoder.encodeHomogeneousList(this);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        decoder.decodeHomogeneousList(this);
                  +        return this;
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.TypeId getTypeId() {
                  +        return TYPE_ID;
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/IdBooleanPair.java b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/IdBooleanPair.java
                  new file mode 100644
                  index 00000000..7337446d
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/IdBooleanPair.java
                  @@ -0,0 +1,147 @@
                  +package org.ccsds.moims.mo.mal.structures;
                  +
                  +/**
                  + * IdBooleanPair shall be a simple pair type of an identifier and Boolean
                  + * value.
                  + */
                  +public final class IdBooleanPair implements org.ccsds.moims.mo.mal.structures.Composite {
                  +
                  +    private static final long serialVersionUID = 281475027043308L;
                  +    /**
                  +     * The TypeId of this Element as a long.
                  +     */
                  +    public static final Long SHORT_FORM = 281475027043308L;
                  +    /**
                  +     * The TypeId of this Element.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM);
                  +
                  +    /**
                  +     * The Identifier value.
                  +     */
                  +    private org.ccsds.moims.mo.mal.structures.Identifier id;
                  +
                  +    /**
                  +     * The Boolean value.
                  +     */
                  +    private Boolean value;
                  +
                  +    /**
                  +     * Default constructor for IdBooleanPair.
                  +     * 
                  +     */
                  +    public IdBooleanPair() {
                  +    }
                  +
                  +    /**
                  +     * Constructor that initialises the values of the structure.
                  +     * 
                  +     * @param id The Identifier value.
                  +     * @param value The Boolean value.
                  +     */
                  +    public IdBooleanPair(org.ccsds.moims.mo.mal.structures.Identifier id,
                  +            Boolean value) {
                  +        this.id = id;
                  +        this.value = value;
                  +    }
                  +
                  +    /**
                  +     * Constructor that initialises the non-nullable values of the structure.
                  +     * 
                  +     * @param id The Identifier value.
                  +     */
                  +    public IdBooleanPair(org.ccsds.moims.mo.mal.structures.Identifier id) {
                  +        this.id = id;
                  +        this.value = null;
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createElement() {
                  +        return new org.ccsds.moims.mo.mal.structures.IdBooleanPair();
                  +    }
                  +
                  +    /**
                  +     * Returns the field id.
                  +     * 
                  +     * @return The field id
                  +     */
                  +    public org.ccsds.moims.mo.mal.structures.Identifier getId() {
                  +        return id;
                  +    }
                  +
                  +    /**
                  +     * Returns the field value.
                  +     * 
                  +     * @return The field value
                  +     */
                  +    public Boolean getValue() {
                  +        return value;
                  +    }
                  +
                  +    @Override
                  +    public boolean equals(Object obj) {
                  +        if (obj instanceof IdBooleanPair) {
                  +            IdBooleanPair other = (IdBooleanPair) obj;
                  +            if (id == null) {
                  +                if (other.id != null) {
                  +                    return false;
                  +                }
                  +            } else {
                  +                if (! id.equals(other.id)) {
                  +                    return false;
                  +                }
                  +            }
                  +            if (value == null) {
                  +                if (other.value != null) {
                  +                    return false;
                  +                }
                  +            } else {
                  +                if (! value.equals(other.value)) {
                  +                    return false;
                  +                }
                  +            }
                  +            return true;
                  +        }
                  +        return false;
                  +    }
                  +
                  +    @Override
                  +    public int hashCode() {
                  +        int hash = 7;
                  +        hash = 83 * hash + (id != null ? id.hashCode() : 0);
                  +        hash = 83 * hash + (value != null ? value.hashCode() : 0);
                  +        return hash;
                  +    }
                  +
                  +    @Override
                  +    public String toString() {
                  +        StringBuilder buf = new StringBuilder();
                  +        buf.append("(IdBooleanPair: ");
                  +        buf.append("id=").append(id);
                  +        buf.append(", value=").append(value);
                  +        buf.append(')');
                  +        return buf.toString();
                  +    }
                  +
                  +    @Override
                  +    public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        if (id == null) {
                  +            throw new org.ccsds.moims.mo.mal.MALException("The field 'id' cannot be null!");
                  +        }
                  +        encoder.encodeIdentifier(id);
                  +        encoder.encodeNullableBoolean(value);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        id = decoder.decodeIdentifier();
                  +        value = decoder.decodeNullableBoolean();
                  +        return this;
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.TypeId getTypeId() {
                  +        return TYPE_ID;
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/IdBooleanPairList.java b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/IdBooleanPairList.java
                  new file mode 100644
                  index 00000000..9bd377c5
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/IdBooleanPairList.java
                  @@ -0,0 +1,79 @@
                  +package org.ccsds.moims.mo.mal.structures;
                  +
                  +/**
                  + * List class for IdBooleanPair.
                  + */
                  +public final class IdBooleanPairList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList {
                  +
                  +    private static final long serialVersionUID = 281475043818516L;
                  +    /**
                  +     * The TypeId of this Element as a long.
                  +     */
                  +    public static final Long SHORT_FORM = 281475043818516L;
                  +    /**
                  +     * The TypeId of this Element.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM);
                  +
                  +    /**
                  +     * Default constructor for IdBooleanPairList.
                  +     * 
                  +     */
                  +    public IdBooleanPairList() {
                  +    }
                  +
                  +    /**
                  +     * Constructor that initialises the capacity of the list.
                  +     * 
                  +     * @param initialCapacity The required initial capacity.
                  +     */
                  +    public IdBooleanPairList(int initialCapacity) {
                  +        super(initialCapacity);
                  +    }
                  +
                  +    /**
                  +     * Constructor that uses an ArrayList for initialization.
                  +     * 
                  +     * @param elementList The ArrayList that is used for initialization.
                  +     */
                  +    public IdBooleanPairList(java.util.ArrayList elementList) {
                  +        for(org.ccsds.moims.mo.mal.structures.IdBooleanPair element : elementList) {
                  +            this.add(element);
                  +        }
                  +    }
                  +
                  +    @Override
                  +    public boolean add(org.ccsds.moims.mo.mal.structures.IdBooleanPair element) {
                  +        if (element == null) {
                  +            throw new IllegalArgumentException("The added argument cannot be null!");
                  +        }
                  +        return super.add(element);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createElement() {
                  +        return new IdBooleanPairList();
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createTypedElement() {
                  +        return new org.ccsds.moims.mo.mal.structures.IdBooleanPair();
                  +    }
                  +
                  +    @Override
                  +    public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        encoder.encodeHomogeneousList(this);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        decoder.decodeHomogeneousList(this);
                  +        return this;
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.TypeId getTypeId() {
                  +        return TYPE_ID;
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/IdentifierList.java b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/IdentifierList.java
                  new file mode 100644
                  index 00000000..f7e8b69c
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/IdentifierList.java
                  @@ -0,0 +1,79 @@
                  +package org.ccsds.moims.mo.mal.structures;
                  +
                  +/**
                  + * List class for Identifier.
                  + */
                  +public final class IdentifierList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList {
                  +
                  +    private static final long serialVersionUID = 281475043819514L;
                  +    /**
                  +     * The TypeId of this Element as a long.
                  +     */
                  +    public static final Long SHORT_FORM = 281475043819514L;
                  +    /**
                  +     * The TypeId of this Element.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM);
                  +
                  +    /**
                  +     * Default constructor for IdentifierList.
                  +     * 
                  +     */
                  +    public IdentifierList() {
                  +    }
                  +
                  +    /**
                  +     * Constructor that initialises the capacity of the list.
                  +     * 
                  +     * @param initialCapacity The required initial capacity.
                  +     */
                  +    public IdentifierList(int initialCapacity) {
                  +        super(initialCapacity);
                  +    }
                  +
                  +    /**
                  +     * Constructor that uses an ArrayList for initialization.
                  +     * 
                  +     * @param elementList The ArrayList that is used for initialization.
                  +     */
                  +    public IdentifierList(java.util.ArrayList elementList) {
                  +        for(org.ccsds.moims.mo.mal.structures.Identifier element : elementList) {
                  +            this.add(element);
                  +        }
                  +    }
                  +
                  +    @Override
                  +    public boolean add(org.ccsds.moims.mo.mal.structures.Identifier element) {
                  +        if (element == null) {
                  +            throw new IllegalArgumentException("The added argument cannot be null!");
                  +        }
                  +        return super.add(element);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createElement() {
                  +        return new IdentifierList();
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createTypedElement() {
                  +        return new org.ccsds.moims.mo.mal.structures.Identifier();
                  +    }
                  +
                  +    @Override
                  +    public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        encoder.encodeHomogeneousList(this);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        decoder.decodeHomogeneousList(this);
                  +        return this;
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.TypeId getTypeId() {
                  +        return TYPE_ID;
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/IntegerList.java b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/IntegerList.java
                  new file mode 100644
                  index 00000000..b38ca5ab
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/IntegerList.java
                  @@ -0,0 +1,80 @@
                  +package org.ccsds.moims.mo.mal.structures;
                  +
                  +/**
                  + * List class for Integer.
                  + */
                  +public final class IntegerList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList {
                  +
                  +    private static final long serialVersionUID = 281475043819509L;
                  +    /**
                  +     * The TypeId of this Element as a long.
                  +     */
                  +    public static final Long SHORT_FORM = 281475043819509L;
                  +    /**
                  +     * The TypeId of this Element.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM);
                  +
                  +    /**
                  +     * Default constructor for IntegerList.
                  +     * 
                  +     */
                  +    public IntegerList() {
                  +    }
                  +
                  +    /**
                  +     * Constructor that initialises the capacity of the list.
                  +     * 
                  +     * @param initialCapacity The required initial capacity.
                  +     */
                  +    public IntegerList(int initialCapacity) {
                  +        super(initialCapacity);
                  +    }
                  +
                  +    /**
                  +     * Constructor that uses an ArrayList for initialization.
                  +     * 
                  +     * @param elementList The ArrayList that is used for initialization.
                  +     */
                  +    public IntegerList(java.util.ArrayList elementList) {
                  +        for(Integer element : elementList) {
                  +            this.add(element);
                  +        }
                  +    }
                  +
                  +    @Override
                  +    public boolean add(Integer element) {
                  +        if (element == null) {
                  +            throw new IllegalArgumentException("The added argument cannot be null!");
                  +        }
                  +        return super.add(element);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createElement() {
                  +        return new IntegerList();
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createTypedElement() {
                  +        org.ccsds.moims.mo.mal.TypeId typeId = this.getTypeId();
                  +        return new Union(typeId.generateTypeIdPositive());
                  +    }
                  +
                  +    @Override
                  +    public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        encoder.encodeHomogeneousList(this);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        decoder.decodeHomogeneousList(this);
                  +        return this;
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.TypeId getTypeId() {
                  +        return TYPE_ID;
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/InteractionType.java b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/InteractionType.java
                  new file mode 100644
                  index 00000000..0b813bf7
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/InteractionType.java
                  @@ -0,0 +1,182 @@
                  +package org.ccsds.moims.mo.mal.structures;
                  +
                  +/**
                  + * Enumeration class for InteractionType.
                  + */
                  +public final class InteractionType extends org.ccsds.moims.mo.mal.structures.Enumeration {
                  +
                  +    private static final long serialVersionUID = 281475027042405L;
                  +    /**
                  +     * The TypeId of this Element as a long.
                  +     */
                  +    public static final Long SHORT_FORM = 281475027042405L;
                  +    /**
                  +     * The TypeId of this Element.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM);
                  +
                  +    /**
                  +     * Enumeration value for SEND.
                  +     */
                  +    public static final int SEND_VALUE = 1;
                  +
                  +    /**
                  +     * Enumeration singleton for value SEND.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.structures.InteractionType SEND = new org.ccsds.moims.mo.mal.structures.InteractionType(org.ccsds.moims.mo.mal.structures.InteractionType.SEND_VALUE);
                  +
                  +    /**
                  +     * Enumeration value for SUBMIT.
                  +     */
                  +    public static final int SUBMIT_VALUE = 2;
                  +
                  +    /**
                  +     * Enumeration singleton for value SUBMIT.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.structures.InteractionType SUBMIT = new org.ccsds.moims.mo.mal.structures.InteractionType(org.ccsds.moims.mo.mal.structures.InteractionType.SUBMIT_VALUE);
                  +
                  +    /**
                  +     * Enumeration value for REQUEST.
                  +     */
                  +    public static final int REQUEST_VALUE = 3;
                  +
                  +    /**
                  +     * Enumeration singleton for value REQUEST.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.structures.InteractionType REQUEST = new org.ccsds.moims.mo.mal.structures.InteractionType(org.ccsds.moims.mo.mal.structures.InteractionType.REQUEST_VALUE);
                  +
                  +    /**
                  +     * Enumeration value for INVOKE.
                  +     */
                  +    public static final int INVOKE_VALUE = 4;
                  +
                  +    /**
                  +     * Enumeration singleton for value INVOKE.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.structures.InteractionType INVOKE = new org.ccsds.moims.mo.mal.structures.InteractionType(org.ccsds.moims.mo.mal.structures.InteractionType.INVOKE_VALUE);
                  +
                  +    /**
                  +     * Enumeration value for PROGRESS.
                  +     */
                  +    public static final int PROGRESS_VALUE = 5;
                  +
                  +    /**
                  +     * Enumeration singleton for value PROGRESS.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.structures.InteractionType PROGRESS = new org.ccsds.moims.mo.mal.structures.InteractionType(org.ccsds.moims.mo.mal.structures.InteractionType.PROGRESS_VALUE);
                  +
                  +    /**
                  +     * Enumeration value for PUBSUB.
                  +     */
                  +    public static final int PUBSUB_VALUE = 6;
                  +
                  +    /**
                  +     * Enumeration singleton for value PUBSUB.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.structures.InteractionType PUBSUB = new org.ccsds.moims.mo.mal.structures.InteractionType(org.ccsds.moims.mo.mal.structures.InteractionType.PUBSUB_VALUE);
                  +
                  +    /**
                  +     * Set of enumeration instances.
                  +     */
                  +    private static final org.ccsds.moims.mo.mal.structures.InteractionType[] _ENUMERATIONS = {
                  +        SEND, SUBMIT, REQUEST, INVOKE, PROGRESS, PUBSUB};
                  +
                  +    /**
                  +     * InteractionType is an enumeration that shall be used to hold the possible Interaction Pattern types.
                  +     */
                  +    public InteractionType() {
                  +        super(-1);
                  +    }
                  +
                  +    /**
                  +     * InteractionType is an enumeration that shall be used to hold the possible
                  +     * Interaction Pattern types.
                  +     * 
                  +     * @param value The value of the Enumeration.
                  +     */
                  +    public InteractionType(int value) {
                  +        super(value);
                  +    }
                  +
                  +    @Override
                  +    public String toString() {
                  +        switch (getValue()) {
                  +            case SEND_VALUE:
                  +                return "SEND";
                  +            case SUBMIT_VALUE:
                  +                return "SUBMIT";
                  +            case REQUEST_VALUE:
                  +                return "REQUEST";
                  +            case INVOKE_VALUE:
                  +                return "INVOKE";
                  +            case PROGRESS_VALUE:
                  +                return "PROGRESS";
                  +            case PUBSUB_VALUE:
                  +                return "PUBSUB";
                  +            default:
                  +                throw new RuntimeException("Unknown ordinal!");
                  +        }
                  +    }
                  +
                  +    /**
                  +     * Returns the enumeration element represented by the supplied string, or
                  +     * null if not matched.
                  +     * 
                  +     * @param s s The string to search for.
                  +     * @return The matched enumeration element, or null if not matched.
                  +     */
                  +    public static org.ccsds.moims.mo.mal.structures.InteractionType fromString(String s) {
                  +        switch (s) {
                  +            case "SEND":
                  +                return InteractionType.SEND;
                  +            case "SUBMIT":
                  +                return InteractionType.SUBMIT;
                  +            case "REQUEST":
                  +                return InteractionType.REQUEST;
                  +            case "INVOKE":
                  +                return InteractionType.INVOKE;
                  +            case "PROGRESS":
                  +                return InteractionType.PROGRESS;
                  +            case "PUBSUB":
                  +                return InteractionType.PUBSUB;
                  +            default:
                  +                throw new RuntimeException("Unknown Enumeration for the provided string: " + s);
                  +        }
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Enumeration fromValue(Integer value) {
                  +        switch (value) {
                  +            case SEND_VALUE:
                  +                return InteractionType.SEND;
                  +            case SUBMIT_VALUE:
                  +                return InteractionType.SUBMIT;
                  +            case REQUEST_VALUE:
                  +                return InteractionType.REQUEST;
                  +            case INVOKE_VALUE:
                  +                return InteractionType.INVOKE;
                  +            case PROGRESS_VALUE:
                  +                return InteractionType.PROGRESS;
                  +            case PUBSUB_VALUE:
                  +                return InteractionType.PUBSUB;
                  +            default:
                  +                throw new RuntimeException("Unknown Enumeration for the provided value: " + value);
                  +        }
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createElement() {
                  +        return _ENUMERATIONS[0];
                  +    }
                  +
                  +    @Override
                  +    public int getEnumSize() {
                  +        return 6;
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.TypeId getTypeId() {
                  +        return TYPE_ID;
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/InteractionTypeList.java b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/InteractionTypeList.java
                  new file mode 100644
                  index 00000000..96048aa4
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/InteractionTypeList.java
                  @@ -0,0 +1,79 @@
                  +package org.ccsds.moims.mo.mal.structures;
                  +
                  +/**
                  + * List class for InteractionType.
                  + */
                  +public final class InteractionTypeList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList {
                  +
                  +    private static final long serialVersionUID = 281475043819419L;
                  +    /**
                  +     * The TypeId of this Element as a long.
                  +     */
                  +    public static final Long SHORT_FORM = 281475043819419L;
                  +    /**
                  +     * The TypeId of this Element.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM);
                  +
                  +    /**
                  +     * Default constructor for InteractionTypeList.
                  +     * 
                  +     */
                  +    public InteractionTypeList() {
                  +    }
                  +
                  +    /**
                  +     * Constructor that initialises the capacity of the list.
                  +     * 
                  +     * @param initialCapacity The required initial capacity.
                  +     */
                  +    public InteractionTypeList(int initialCapacity) {
                  +        super(initialCapacity);
                  +    }
                  +
                  +    /**
                  +     * Constructor that uses an ArrayList for initialization.
                  +     * 
                  +     * @param elementList The ArrayList that is used for initialization.
                  +     */
                  +    public InteractionTypeList(java.util.ArrayList elementList) {
                  +        for(org.ccsds.moims.mo.mal.structures.InteractionType element : elementList) {
                  +            this.add(element);
                  +        }
                  +    }
                  +
                  +    @Override
                  +    public boolean add(org.ccsds.moims.mo.mal.structures.InteractionType element) {
                  +        if (element == null) {
                  +            throw new IllegalArgumentException("The added argument cannot be null!");
                  +        }
                  +        return super.add(element);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createElement() {
                  +        return new InteractionTypeList();
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createTypedElement() {
                  +        return org.ccsds.moims.mo.mal.structures.InteractionType.SEND;
                  +    }
                  +
                  +    @Override
                  +    public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        encoder.encodeHomogeneousList(this);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        decoder.decodeHomogeneousList(this);
                  +        return this;
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.TypeId getTypeId() {
                  +        return TYPE_ID;
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/LongList.java b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/LongList.java
                  new file mode 100644
                  index 00000000..43d3ae5a
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/LongList.java
                  @@ -0,0 +1,80 @@
                  +package org.ccsds.moims.mo.mal.structures;
                  +
                  +/**
                  + * List class for Long.
                  + */
                  +public final class LongList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList {
                  +
                  +    private static final long serialVersionUID = 281475043819507L;
                  +    /**
                  +     * The TypeId of this Element as a long.
                  +     */
                  +    public static final Long SHORT_FORM = 281475043819507L;
                  +    /**
                  +     * The TypeId of this Element.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM);
                  +
                  +    /**
                  +     * Default constructor for LongList.
                  +     * 
                  +     */
                  +    public LongList() {
                  +    }
                  +
                  +    /**
                  +     * Constructor that initialises the capacity of the list.
                  +     * 
                  +     * @param initialCapacity The required initial capacity.
                  +     */
                  +    public LongList(int initialCapacity) {
                  +        super(initialCapacity);
                  +    }
                  +
                  +    /**
                  +     * Constructor that uses an ArrayList for initialization.
                  +     * 
                  +     * @param elementList The ArrayList that is used for initialization.
                  +     */
                  +    public LongList(java.util.ArrayList elementList) {
                  +        for(Long element : elementList) {
                  +            this.add(element);
                  +        }
                  +    }
                  +
                  +    @Override
                  +    public boolean add(Long element) {
                  +        if (element == null) {
                  +            throw new IllegalArgumentException("The added argument cannot be null!");
                  +        }
                  +        return super.add(element);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createElement() {
                  +        return new LongList();
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createTypedElement() {
                  +        org.ccsds.moims.mo.mal.TypeId typeId = this.getTypeId();
                  +        return new Union(typeId.generateTypeIdPositive());
                  +    }
                  +
                  +    @Override
                  +    public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        encoder.encodeHomogeneousList(this);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        decoder.decodeHomogeneousList(this);
                  +        return this;
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.TypeId getTypeId() {
                  +        return TYPE_ID;
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/MOArea.java b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/MOArea.java
                  new file mode 100644
                  index 00000000..6a63ce84
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/MOArea.java
                  @@ -0,0 +1,198 @@
                  +package org.ccsds.moims.mo.mal.structures;
                  +
                  +/**
                  + * Enumeration class for MOArea.
                  + */
                  +public final class MOArea extends org.ccsds.moims.mo.mal.structures.Enumeration {
                  +
                  +    private static final long serialVersionUID = 281475027042409L;
                  +    /**
                  +     * The TypeId of this Element as a long.
                  +     */
                  +    public static final Long SHORT_FORM = 281475027042409L;
                  +    /**
                  +     * The TypeId of this Element.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM);
                  +
                  +    /**
                  +     * Enumeration value for MAL.
                  +     */
                  +    public static final int MAL_VALUE = 1;
                  +
                  +    /**
                  +     * Enumeration singleton for value MAL.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.structures.MOArea MAL = new org.ccsds.moims.mo.mal.structures.MOArea(org.ccsds.moims.mo.mal.structures.MOArea.MAL_VALUE);
                  +
                  +    /**
                  +     * Enumeration value for COM.
                  +     */
                  +    public static final int COM_VALUE = 2;
                  +
                  +    /**
                  +     * Enumeration singleton for value COM.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.structures.MOArea COM = new org.ccsds.moims.mo.mal.structures.MOArea(org.ccsds.moims.mo.mal.structures.MOArea.COM_VALUE);
                  +
                  +    /**
                  +     * Enumeration value for COMMON.
                  +     */
                  +    public static final int COMMON_VALUE = 3;
                  +
                  +    /**
                  +     * Enumeration singleton for value COMMON.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.structures.MOArea COMMON = new org.ccsds.moims.mo.mal.structures.MOArea(org.ccsds.moims.mo.mal.structures.MOArea.COMMON_VALUE);
                  +
                  +    /**
                  +     * Enumeration value for MC.
                  +     */
                  +    public static final int MC_VALUE = 4;
                  +
                  +    /**
                  +     * Enumeration singleton for value MC.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.structures.MOArea MC = new org.ccsds.moims.mo.mal.structures.MOArea(org.ccsds.moims.mo.mal.structures.MOArea.MC_VALUE);
                  +
                  +    /**
                  +     * Enumeration value for MPS.
                  +     */
                  +    public static final int MPS_VALUE = 5;
                  +
                  +    /**
                  +     * Enumeration singleton for value MPS.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.structures.MOArea MPS = new org.ccsds.moims.mo.mal.structures.MOArea(org.ccsds.moims.mo.mal.structures.MOArea.MPS_VALUE);
                  +
                  +    /**
                  +     * Enumeration value for SM.
                  +     */
                  +    public static final int SM_VALUE = 7;
                  +
                  +    /**
                  +     * Enumeration singleton for value SM.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.structures.MOArea SM = new org.ccsds.moims.mo.mal.structures.MOArea(org.ccsds.moims.mo.mal.structures.MOArea.SM_VALUE);
                  +
                  +    /**
                  +     * Enumeration value for MDPD.
                  +     */
                  +    public static final int MDPD_VALUE = 9;
                  +
                  +    /**
                  +     * Enumeration singleton for value MDPD.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.structures.MOArea MDPD = new org.ccsds.moims.mo.mal.structures.MOArea(org.ccsds.moims.mo.mal.structures.MOArea.MDPD_VALUE);
                  +
                  +    /**
                  +     * Set of enumeration instances.
                  +     */
                  +    private static final org.ccsds.moims.mo.mal.structures.MOArea[] _ENUMERATIONS = {
                  +        MAL, COM, COMMON, MC, MPS, SM, MDPD};
                  +
                  +    /**
                  +     * MOArea is an enumeration that shall be used to hold the known existing area numbers in use.
                  +     */
                  +    public MOArea() {
                  +        super(-1);
                  +    }
                  +
                  +    /**
                  +     * MOArea is an enumeration that shall be used to hold the known existing
                  +     * area numbers in use.
                  +     * 
                  +     * @param value The value of the Enumeration.
                  +     */
                  +    public MOArea(int value) {
                  +        super(value);
                  +    }
                  +
                  +    @Override
                  +    public String toString() {
                  +        switch (getValue()) {
                  +            case MAL_VALUE:
                  +                return "MAL";
                  +            case COM_VALUE:
                  +                return "COM";
                  +            case COMMON_VALUE:
                  +                return "COMMON";
                  +            case MC_VALUE:
                  +                return "MC";
                  +            case MPS_VALUE:
                  +                return "MPS";
                  +            case SM_VALUE:
                  +                return "SM";
                  +            case MDPD_VALUE:
                  +                return "MDPD";
                  +            default:
                  +                throw new RuntimeException("Unknown ordinal!");
                  +        }
                  +    }
                  +
                  +    /**
                  +     * Returns the enumeration element represented by the supplied string, or
                  +     * null if not matched.
                  +     * 
                  +     * @param s s The string to search for.
                  +     * @return The matched enumeration element, or null if not matched.
                  +     */
                  +    public static org.ccsds.moims.mo.mal.structures.MOArea fromString(String s) {
                  +        switch (s) {
                  +            case "MAL":
                  +                return MOArea.MAL;
                  +            case "COM":
                  +                return MOArea.COM;
                  +            case "COMMON":
                  +                return MOArea.COMMON;
                  +            case "MC":
                  +                return MOArea.MC;
                  +            case "MPS":
                  +                return MOArea.MPS;
                  +            case "SM":
                  +                return MOArea.SM;
                  +            case "MDPD":
                  +                return MOArea.MDPD;
                  +            default:
                  +                throw new RuntimeException("Unknown Enumeration for the provided string: " + s);
                  +        }
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Enumeration fromValue(Integer value) {
                  +        switch (value) {
                  +            case MAL_VALUE:
                  +                return MOArea.MAL;
                  +            case COM_VALUE:
                  +                return MOArea.COM;
                  +            case COMMON_VALUE:
                  +                return MOArea.COMMON;
                  +            case MC_VALUE:
                  +                return MOArea.MC;
                  +            case MPS_VALUE:
                  +                return MOArea.MPS;
                  +            case SM_VALUE:
                  +                return MOArea.SM;
                  +            case MDPD_VALUE:
                  +                return MOArea.MDPD;
                  +            default:
                  +                throw new RuntimeException("Unknown Enumeration for the provided value: " + value);
                  +        }
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createElement() {
                  +        return _ENUMERATIONS[0];
                  +    }
                  +
                  +    @Override
                  +    public int getEnumSize() {
                  +        return 7;
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.TypeId getTypeId() {
                  +        return TYPE_ID;
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/MOAreaList.java b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/MOAreaList.java
                  new file mode 100644
                  index 00000000..321a2ab7
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/MOAreaList.java
                  @@ -0,0 +1,79 @@
                  +package org.ccsds.moims.mo.mal.structures;
                  +
                  +/**
                  + * List class for MOArea.
                  + */
                  +public final class MOAreaList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList {
                  +
                  +    private static final long serialVersionUID = 281475043819415L;
                  +    /**
                  +     * The TypeId of this Element as a long.
                  +     */
                  +    public static final Long SHORT_FORM = 281475043819415L;
                  +    /**
                  +     * The TypeId of this Element.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM);
                  +
                  +    /**
                  +     * Default constructor for MOAreaList.
                  +     * 
                  +     */
                  +    public MOAreaList() {
                  +    }
                  +
                  +    /**
                  +     * Constructor that initialises the capacity of the list.
                  +     * 
                  +     * @param initialCapacity The required initial capacity.
                  +     */
                  +    public MOAreaList(int initialCapacity) {
                  +        super(initialCapacity);
                  +    }
                  +
                  +    /**
                  +     * Constructor that uses an ArrayList for initialization.
                  +     * 
                  +     * @param elementList The ArrayList that is used for initialization.
                  +     */
                  +    public MOAreaList(java.util.ArrayList elementList) {
                  +        for(org.ccsds.moims.mo.mal.structures.MOArea element : elementList) {
                  +            this.add(element);
                  +        }
                  +    }
                  +
                  +    @Override
                  +    public boolean add(org.ccsds.moims.mo.mal.structures.MOArea element) {
                  +        if (element == null) {
                  +            throw new IllegalArgumentException("The added argument cannot be null!");
                  +        }
                  +        return super.add(element);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createElement() {
                  +        return new MOAreaList();
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createTypedElement() {
                  +        return org.ccsds.moims.mo.mal.structures.MOArea.MAL;
                  +    }
                  +
                  +    @Override
                  +    public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        encoder.encodeHomogeneousList(this);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        decoder.decodeHomogeneousList(this);
                  +        return this;
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.TypeId getTypeId() {
                  +        return TYPE_ID;
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/NamedValue.java b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/NamedValue.java
                  new file mode 100644
                  index 00000000..24ef6ac9
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/NamedValue.java
                  @@ -0,0 +1,147 @@
                  +package org.ccsds.moims.mo.mal.structures;
                  +
                  +/**
                  + * The NamedValue structure shall represent a simple pair type of an identifier
                  + * and abstract Attribute value.
                  + */
                  +public final class NamedValue implements org.ccsds.moims.mo.mal.structures.Composite {
                  +
                  +    private static final long serialVersionUID = 281475027043310L;
                  +    /**
                  +     * The TypeId of this Element as a long.
                  +     */
                  +    public static final Long SHORT_FORM = 281475027043310L;
                  +    /**
                  +     * The TypeId of this Element.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM);
                  +
                  +    /**
                  +     * The Identifier value.
                  +     */
                  +    private org.ccsds.moims.mo.mal.structures.Identifier name;
                  +
                  +    /**
                  +     * The Attribute value.
                  +     */
                  +    private org.ccsds.moims.mo.mal.structures.Attribute value;
                  +
                  +    /**
                  +     * Default constructor for NamedValue.
                  +     * 
                  +     */
                  +    public NamedValue() {
                  +    }
                  +
                  +    /**
                  +     * Constructor that initialises the values of the structure.
                  +     * 
                  +     * @param name The Identifier value.
                  +     * @param value The Attribute value.
                  +     */
                  +    public NamedValue(org.ccsds.moims.mo.mal.structures.Identifier name,
                  +            org.ccsds.moims.mo.mal.structures.Attribute value) {
                  +        this.name = name;
                  +        this.value = value;
                  +    }
                  +
                  +    /**
                  +     * Constructor that initialises the non-nullable values of the structure.
                  +     * 
                  +     * @param name The Identifier value.
                  +     */
                  +    public NamedValue(org.ccsds.moims.mo.mal.structures.Identifier name) {
                  +        this.name = name;
                  +        this.value = null;
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createElement() {
                  +        return new org.ccsds.moims.mo.mal.structures.NamedValue();
                  +    }
                  +
                  +    /**
                  +     * Returns the field name.
                  +     * 
                  +     * @return The field name
                  +     */
                  +    public org.ccsds.moims.mo.mal.structures.Identifier getName() {
                  +        return name;
                  +    }
                  +
                  +    /**
                  +     * Returns the field value.
                  +     * 
                  +     * @return The field value
                  +     */
                  +    public org.ccsds.moims.mo.mal.structures.Attribute getValue() {
                  +        return value;
                  +    }
                  +
                  +    @Override
                  +    public boolean equals(Object obj) {
                  +        if (obj instanceof NamedValue) {
                  +            NamedValue other = (NamedValue) obj;
                  +            if (name == null) {
                  +                if (other.name != null) {
                  +                    return false;
                  +                }
                  +            } else {
                  +                if (! name.equals(other.name)) {
                  +                    return false;
                  +                }
                  +            }
                  +            if (value == null) {
                  +                if (other.value != null) {
                  +                    return false;
                  +                }
                  +            } else {
                  +                if (! value.equals(other.value)) {
                  +                    return false;
                  +                }
                  +            }
                  +            return true;
                  +        }
                  +        return false;
                  +    }
                  +
                  +    @Override
                  +    public int hashCode() {
                  +        int hash = 7;
                  +        hash = 83 * hash + (name != null ? name.hashCode() : 0);
                  +        hash = 83 * hash + (value != null ? value.hashCode() : 0);
                  +        return hash;
                  +    }
                  +
                  +    @Override
                  +    public String toString() {
                  +        StringBuilder buf = new StringBuilder();
                  +        buf.append("(NamedValue: ");
                  +        buf.append("name=").append(name);
                  +        buf.append(", value=").append(value);
                  +        buf.append(')');
                  +        return buf.toString();
                  +    }
                  +
                  +    @Override
                  +    public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        if (name == null) {
                  +            throw new org.ccsds.moims.mo.mal.MALException("The field 'name' cannot be null!");
                  +        }
                  +        encoder.encodeIdentifier(name);
                  +        encoder.encodeNullableAttribute(value);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        name = decoder.decodeIdentifier();
                  +        value = (org.ccsds.moims.mo.mal.structures.Attribute) decoder.decodeNullableAttribute();
                  +        return this;
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.TypeId getTypeId() {
                  +        return TYPE_ID;
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/NamedValueList.java b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/NamedValueList.java
                  new file mode 100644
                  index 00000000..2c8642cd
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/NamedValueList.java
                  @@ -0,0 +1,79 @@
                  +package org.ccsds.moims.mo.mal.structures;
                  +
                  +/**
                  + * List class for NamedValue.
                  + */
                  +public final class NamedValueList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList {
                  +
                  +    private static final long serialVersionUID = 281475043818514L;
                  +    /**
                  +     * The TypeId of this Element as a long.
                  +     */
                  +    public static final Long SHORT_FORM = 281475043818514L;
                  +    /**
                  +     * The TypeId of this Element.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM);
                  +
                  +    /**
                  +     * Default constructor for NamedValueList.
                  +     * 
                  +     */
                  +    public NamedValueList() {
                  +    }
                  +
                  +    /**
                  +     * Constructor that initialises the capacity of the list.
                  +     * 
                  +     * @param initialCapacity The required initial capacity.
                  +     */
                  +    public NamedValueList(int initialCapacity) {
                  +        super(initialCapacity);
                  +    }
                  +
                  +    /**
                  +     * Constructor that uses an ArrayList for initialization.
                  +     * 
                  +     * @param elementList The ArrayList that is used for initialization.
                  +     */
                  +    public NamedValueList(java.util.ArrayList elementList) {
                  +        for(org.ccsds.moims.mo.mal.structures.NamedValue element : elementList) {
                  +            this.add(element);
                  +        }
                  +    }
                  +
                  +    @Override
                  +    public boolean add(org.ccsds.moims.mo.mal.structures.NamedValue element) {
                  +        if (element == null) {
                  +            throw new IllegalArgumentException("The added argument cannot be null!");
                  +        }
                  +        return super.add(element);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createElement() {
                  +        return new NamedValueList();
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createTypedElement() {
                  +        return new org.ccsds.moims.mo.mal.structures.NamedValue();
                  +    }
                  +
                  +    @Override
                  +    public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        encoder.encodeHomogeneousList(this);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        decoder.decodeHomogeneousList(this);
                  +        return this;
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.TypeId getTypeId() {
                  +        return TYPE_ID;
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/NullableAttribute.java b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/NullableAttribute.java
                  new file mode 100644
                  index 00000000..0c15270f
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/NullableAttribute.java
                  @@ -0,0 +1,103 @@
                  +package org.ccsds.moims.mo.mal.structures;
                  +
                  +/**
                  + * NullableAttribute structure shall represent an Attribute that can be nullable.
                  + */
                  +public final class NullableAttribute implements org.ccsds.moims.mo.mal.structures.Composite {
                  +
                  +    private static final long serialVersionUID = 281475027043314L;
                  +    /**
                  +     * The TypeId of this Element as a long.
                  +     */
                  +    public static final Long SHORT_FORM = 281475027043314L;
                  +    /**
                  +     * The TypeId of this Element.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM);
                  +
                  +    /**
                  +     * The value of the nullable attribute.
                  +     */
                  +    private org.ccsds.moims.mo.mal.structures.Attribute value;
                  +
                  +    /**
                  +     * Default constructor for NullableAttribute.
                  +     * 
                  +     */
                  +    public NullableAttribute() {
                  +    }
                  +
                  +    /**
                  +     * Constructor that initialises the values of the structure.
                  +     * 
                  +     * @param value The value of the nullable attribute.
                  +     */
                  +    public NullableAttribute(org.ccsds.moims.mo.mal.structures.Attribute value) {
                  +        this.value = value;
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createElement() {
                  +        return new org.ccsds.moims.mo.mal.structures.NullableAttribute();
                  +    }
                  +
                  +    /**
                  +     * Returns the field value.
                  +     * 
                  +     * @return The field value
                  +     */
                  +    public org.ccsds.moims.mo.mal.structures.Attribute getValue() {
                  +        return value;
                  +    }
                  +
                  +    @Override
                  +    public boolean equals(Object obj) {
                  +        if (obj instanceof NullableAttribute) {
                  +            NullableAttribute other = (NullableAttribute) obj;
                  +            if (value == null) {
                  +                if (other.value != null) {
                  +                    return false;
                  +                }
                  +            } else {
                  +                if (! value.equals(other.value)) {
                  +                    return false;
                  +                }
                  +            }
                  +            return true;
                  +        }
                  +        return false;
                  +    }
                  +
                  +    @Override
                  +    public int hashCode() {
                  +        int hash = 7;
                  +        hash = 83 * hash + (value != null ? value.hashCode() : 0);
                  +        return hash;
                  +    }
                  +
                  +    @Override
                  +    public String toString() {
                  +        StringBuilder buf = new StringBuilder();
                  +        buf.append("(NullableAttribute: ");
                  +        buf.append("value=").append(value);
                  +        buf.append(')');
                  +        return buf.toString();
                  +    }
                  +
                  +    @Override
                  +    public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        encoder.encodeNullableAttribute(value);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        value = (org.ccsds.moims.mo.mal.structures.Attribute) decoder.decodeNullableAttribute();
                  +        return this;
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.TypeId getTypeId() {
                  +        return TYPE_ID;
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/NullableAttributeList.java b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/NullableAttributeList.java
                  new file mode 100644
                  index 00000000..b5d1d244
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/NullableAttributeList.java
                  @@ -0,0 +1,79 @@
                  +package org.ccsds.moims.mo.mal.structures;
                  +
                  +/**
                  + * List class for NullableAttribute.
                  + */
                  +public final class NullableAttributeList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList {
                  +
                  +    private static final long serialVersionUID = 281475043818510L;
                  +    /**
                  +     * The TypeId of this Element as a long.
                  +     */
                  +    public static final Long SHORT_FORM = 281475043818510L;
                  +    /**
                  +     * The TypeId of this Element.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM);
                  +
                  +    /**
                  +     * Default constructor for NullableAttributeList.
                  +     * 
                  +     */
                  +    public NullableAttributeList() {
                  +    }
                  +
                  +    /**
                  +     * Constructor that initialises the capacity of the list.
                  +     * 
                  +     * @param initialCapacity The required initial capacity.
                  +     */
                  +    public NullableAttributeList(int initialCapacity) {
                  +        super(initialCapacity);
                  +    }
                  +
                  +    /**
                  +     * Constructor that uses an ArrayList for initialization.
                  +     * 
                  +     * @param elementList The ArrayList that is used for initialization.
                  +     */
                  +    public NullableAttributeList(java.util.ArrayList elementList) {
                  +        for(org.ccsds.moims.mo.mal.structures.NullableAttribute element : elementList) {
                  +            this.add(element);
                  +        }
                  +    }
                  +
                  +    @Override
                  +    public boolean add(org.ccsds.moims.mo.mal.structures.NullableAttribute element) {
                  +        if (element == null) {
                  +            throw new IllegalArgumentException("The added argument cannot be null!");
                  +        }
                  +        return super.add(element);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createElement() {
                  +        return new NullableAttributeList();
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createTypedElement() {
                  +        return new org.ccsds.moims.mo.mal.structures.NullableAttribute();
                  +    }
                  +
                  +    @Override
                  +    public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        encoder.encodeHomogeneousList(this);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        decoder.decodeHomogeneousList(this);
                  +        return this;
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.TypeId getTypeId() {
                  +        return TYPE_ID;
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/ObjectIdentity.java b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/ObjectIdentity.java
                  new file mode 100644
                  index 00000000..d3d096f2
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/ObjectIdentity.java
                  @@ -0,0 +1,173 @@
                  +package org.ccsds.moims.mo.mal.structures;
                  +
                  +/**
                  + * The ObjectIdentity structure shall represent the Object Identity of an
                  + * MO Object.
                  + */
                  +public final class ObjectIdentity implements org.ccsds.moims.mo.mal.structures.Composite {
                  +
                  +    private static final long serialVersionUID = 281475027043312L;
                  +    /**
                  +     * The TypeId of this Element as a long.
                  +     */
                  +    public static final Long SHORT_FORM = 281475027043312L;
                  +    /**
                  +     * The TypeId of this Element.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM);
                  +
                  +    /**
                  +     * The domain of the MO Object being referenced.
                  +     */
                  +    private org.ccsds.moims.mo.mal.structures.IdentifierList domain;
                  +
                  +    /**
                  +     * The key of the MO Object being referenced.
                  +     */
                  +    private org.ccsds.moims.mo.mal.structures.Identifier key;
                  +
                  +    /**
                  +     * The version of the MO Object being referenced.
                  +     */
                  +    private org.ccsds.moims.mo.mal.structures.UInteger version;
                  +
                  +    /**
                  +     * Default constructor for ObjectIdentity.
                  +     * 
                  +     */
                  +    public ObjectIdentity() {
                  +    }
                  +
                  +    /**
                  +     * Constructor that initialises the values of the structure.
                  +     * 
                  +     * @param domain The domain of the MO Object being referenced.
                  +     * @param key The key of the MO Object being referenced.
                  +     * @param version The version of the MO Object being referenced.
                  +     */
                  +    public ObjectIdentity(org.ccsds.moims.mo.mal.structures.IdentifierList domain,
                  +            org.ccsds.moims.mo.mal.structures.Identifier key,
                  +            org.ccsds.moims.mo.mal.structures.UInteger version) {
                  +        this.domain = domain;
                  +        this.key = key;
                  +        this.version = version;
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createElement() {
                  +        return new org.ccsds.moims.mo.mal.structures.ObjectIdentity();
                  +    }
                  +
                  +    /**
                  +     * Returns the field domain.
                  +     * 
                  +     * @return The field domain
                  +     */
                  +    public org.ccsds.moims.mo.mal.structures.IdentifierList getDomain() {
                  +        return domain;
                  +    }
                  +
                  +    /**
                  +     * Returns the field key.
                  +     * 
                  +     * @return The field key
                  +     */
                  +    public org.ccsds.moims.mo.mal.structures.Identifier getKey() {
                  +        return key;
                  +    }
                  +
                  +    /**
                  +     * Returns the field version.
                  +     * 
                  +     * @return The field version
                  +     */
                  +    public org.ccsds.moims.mo.mal.structures.UInteger getVersion() {
                  +        return version;
                  +    }
                  +
                  +    @Override
                  +    public boolean equals(Object obj) {
                  +        if (obj instanceof ObjectIdentity) {
                  +            ObjectIdentity other = (ObjectIdentity) obj;
                  +            if (domain == null) {
                  +                if (other.domain != null) {
                  +                    return false;
                  +                }
                  +            } else {
                  +                if (! domain.equals(other.domain)) {
                  +                    return false;
                  +                }
                  +            }
                  +            if (key == null) {
                  +                if (other.key != null) {
                  +                    return false;
                  +                }
                  +            } else {
                  +                if (! key.equals(other.key)) {
                  +                    return false;
                  +                }
                  +            }
                  +            if (version == null) {
                  +                if (other.version != null) {
                  +                    return false;
                  +                }
                  +            } else {
                  +                if (! version.equals(other.version)) {
                  +                    return false;
                  +                }
                  +            }
                  +            return true;
                  +        }
                  +        return false;
                  +    }
                  +
                  +    @Override
                  +    public int hashCode() {
                  +        int hash = 7;
                  +        hash = 83 * hash + (domain != null ? domain.hashCode() : 0);
                  +        hash = 83 * hash + (key != null ? key.hashCode() : 0);
                  +        hash = 83 * hash + (version != null ? version.hashCode() : 0);
                  +        return hash;
                  +    }
                  +
                  +    @Override
                  +    public String toString() {
                  +        StringBuilder buf = new StringBuilder();
                  +        buf.append("(ObjectIdentity: ");
                  +        buf.append("domain=").append(domain);
                  +        buf.append(", key=").append(key);
                  +        buf.append(", version=").append(version);
                  +        buf.append(')');
                  +        return buf.toString();
                  +    }
                  +
                  +    @Override
                  +    public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        if (domain == null) {
                  +            throw new org.ccsds.moims.mo.mal.MALException("The field 'domain' cannot be null!");
                  +        }
                  +        if (key == null) {
                  +            throw new org.ccsds.moims.mo.mal.MALException("The field 'key' cannot be null!");
                  +        }
                  +        if (version == null) {
                  +            throw new org.ccsds.moims.mo.mal.MALException("The field 'version' cannot be null!");
                  +        }
                  +        encoder.encodeElement(domain);
                  +        encoder.encodeIdentifier(key);
                  +        encoder.encodeUInteger(version);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        domain = (org.ccsds.moims.mo.mal.structures.IdentifierList) decoder.decodeElement(new org.ccsds.moims.mo.mal.structures.IdentifierList());
                  +        key = decoder.decodeIdentifier();
                  +        version = decoder.decodeUInteger();
                  +        return this;
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.TypeId getTypeId() {
                  +        return TYPE_ID;
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/ObjectIdentityList.java b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/ObjectIdentityList.java
                  new file mode 100644
                  index 00000000..0edbc47a
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/ObjectIdentityList.java
                  @@ -0,0 +1,79 @@
                  +package org.ccsds.moims.mo.mal.structures;
                  +
                  +/**
                  + * List class for ObjectIdentity.
                  + */
                  +public final class ObjectIdentityList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList {
                  +
                  +    private static final long serialVersionUID = 281475043818512L;
                  +    /**
                  +     * The TypeId of this Element as a long.
                  +     */
                  +    public static final Long SHORT_FORM = 281475043818512L;
                  +    /**
                  +     * The TypeId of this Element.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM);
                  +
                  +    /**
                  +     * Default constructor for ObjectIdentityList.
                  +     * 
                  +     */
                  +    public ObjectIdentityList() {
                  +    }
                  +
                  +    /**
                  +     * Constructor that initialises the capacity of the list.
                  +     * 
                  +     * @param initialCapacity The required initial capacity.
                  +     */
                  +    public ObjectIdentityList(int initialCapacity) {
                  +        super(initialCapacity);
                  +    }
                  +
                  +    /**
                  +     * Constructor that uses an ArrayList for initialization.
                  +     * 
                  +     * @param elementList The ArrayList that is used for initialization.
                  +     */
                  +    public ObjectIdentityList(java.util.ArrayList elementList) {
                  +        for(org.ccsds.moims.mo.mal.structures.ObjectIdentity element : elementList) {
                  +            this.add(element);
                  +        }
                  +    }
                  +
                  +    @Override
                  +    public boolean add(org.ccsds.moims.mo.mal.structures.ObjectIdentity element) {
                  +        if (element == null) {
                  +            throw new IllegalArgumentException("The added argument cannot be null!");
                  +        }
                  +        return super.add(element);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createElement() {
                  +        return new ObjectIdentityList();
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createTypedElement() {
                  +        return new org.ccsds.moims.mo.mal.structures.ObjectIdentity();
                  +    }
                  +
                  +    @Override
                  +    public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        encoder.encodeHomogeneousList(this);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        decoder.decodeHomogeneousList(this);
                  +        return this;
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.TypeId getTypeId() {
                  +        return TYPE_ID;
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/ObjectRefList.java b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/ObjectRefList.java
                  new file mode 100644
                  index 00000000..df57cac4
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/ObjectRefList.java
                  @@ -0,0 +1,79 @@
                  +package org.ccsds.moims.mo.mal.structures;
                  +
                  +/**
                  + * List class for ObjectRef.
                  + */
                  +public final class ObjectRefList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList {
                  +
                  +    private static final long serialVersionUID = 281475043819501L;
                  +    /**
                  +     * The TypeId of this Element as a long.
                  +     */
                  +    public static final Long SHORT_FORM = 281475043819501L;
                  +    /**
                  +     * The TypeId of this Element.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM);
                  +
                  +    /**
                  +     * Default constructor for ObjectRefList.
                  +     * 
                  +     */
                  +    public ObjectRefList() {
                  +    }
                  +
                  +    /**
                  +     * Constructor that initialises the capacity of the list.
                  +     * 
                  +     * @param initialCapacity The required initial capacity.
                  +     */
                  +    public ObjectRefList(int initialCapacity) {
                  +        super(initialCapacity);
                  +    }
                  +
                  +    /**
                  +     * Constructor that uses an ArrayList for initialization.
                  +     * 
                  +     * @param elementList The ArrayList that is used for initialization.
                  +     */
                  +    public ObjectRefList(java.util.ArrayList elementList) {
                  +        for(org.ccsds.moims.mo.mal.structures.ObjectRef element : elementList) {
                  +            this.add(element);
                  +        }
                  +    }
                  +
                  +    @Override
                  +    public boolean add(org.ccsds.moims.mo.mal.structures.ObjectRef element) {
                  +        if (element == null) {
                  +            throw new IllegalArgumentException("The added argument cannot be null!");
                  +        }
                  +        return super.add(element);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createElement() {
                  +        return new ObjectRefList();
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createTypedElement() {
                  +        return new org.ccsds.moims.mo.mal.structures.ObjectRef();
                  +    }
                  +
                  +    @Override
                  +    public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        encoder.encodeHomogeneousList(this);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        decoder.decodeHomogeneousList(this);
                  +        return this;
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.TypeId getTypeId() {
                  +        return TYPE_ID;
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/OctetList.java b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/OctetList.java
                  new file mode 100644
                  index 00000000..21b848e4
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/OctetList.java
                  @@ -0,0 +1,80 @@
                  +package org.ccsds.moims.mo.mal.structures;
                  +
                  +/**
                  + * List class for Octet.
                  + */
                  +public final class OctetList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList {
                  +
                  +    private static final long serialVersionUID = 281475043819513L;
                  +    /**
                  +     * The TypeId of this Element as a long.
                  +     */
                  +    public static final Long SHORT_FORM = 281475043819513L;
                  +    /**
                  +     * The TypeId of this Element.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM);
                  +
                  +    /**
                  +     * Default constructor for OctetList.
                  +     * 
                  +     */
                  +    public OctetList() {
                  +    }
                  +
                  +    /**
                  +     * Constructor that initialises the capacity of the list.
                  +     * 
                  +     * @param initialCapacity The required initial capacity.
                  +     */
                  +    public OctetList(int initialCapacity) {
                  +        super(initialCapacity);
                  +    }
                  +
                  +    /**
                  +     * Constructor that uses an ArrayList for initialization.
                  +     * 
                  +     * @param elementList The ArrayList that is used for initialization.
                  +     */
                  +    public OctetList(java.util.ArrayList elementList) {
                  +        for(Byte element : elementList) {
                  +            this.add(element);
                  +        }
                  +    }
                  +
                  +    @Override
                  +    public boolean add(Byte element) {
                  +        if (element == null) {
                  +            throw new IllegalArgumentException("The added argument cannot be null!");
                  +        }
                  +        return super.add(element);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createElement() {
                  +        return new OctetList();
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createTypedElement() {
                  +        org.ccsds.moims.mo.mal.TypeId typeId = this.getTypeId();
                  +        return new Union(typeId.generateTypeIdPositive());
                  +    }
                  +
                  +    @Override
                  +    public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        encoder.encodeHomogeneousList(this);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        decoder.decodeHomogeneousList(this);
                  +        return this;
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.TypeId getTypeId() {
                  +        return TYPE_ID;
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/Pair.java b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/Pair.java
                  new file mode 100644
                  index 00000000..d9555722
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/Pair.java
                  @@ -0,0 +1,133 @@
                  +package org.ccsds.moims.mo.mal.structures;
                  +
                  +/**
                  + * Pair shall be a simple Composite structure for holding pairs.
                  + */
                  +public final class Pair implements org.ccsds.moims.mo.mal.structures.Composite {
                  +
                  +    private static final long serialVersionUID = 281475027043309L;
                  +    /**
                  +     * The TypeId of this Element as a long.
                  +     */
                  +    public static final Long SHORT_FORM = 281475027043309L;
                  +    /**
                  +     * The TypeId of this Element.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM);
                  +
                  +    /**
                  +     * The attribute value for the first Element of this pair.
                  +     */
                  +    private org.ccsds.moims.mo.mal.structures.Attribute first;
                  +
                  +    /**
                  +     * The attribute value for the second Element of this pair.
                  +     */
                  +    private org.ccsds.moims.mo.mal.structures.Attribute second;
                  +
                  +    /**
                  +     * Default constructor for Pair.
                  +     * 
                  +     */
                  +    public Pair() {
                  +    }
                  +
                  +    /**
                  +     * Constructor that initialises the values of the structure.
                  +     * 
                  +     * @param first The attribute value for the first Element of this pair.
                  +     * @param second The attribute value for the second Element of this pair.
                  +     */
                  +    public Pair(org.ccsds.moims.mo.mal.structures.Attribute first,
                  +            org.ccsds.moims.mo.mal.structures.Attribute second) {
                  +        this.first = first;
                  +        this.second = second;
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createElement() {
                  +        return new org.ccsds.moims.mo.mal.structures.Pair();
                  +    }
                  +
                  +    /**
                  +     * Returns the field first.
                  +     * 
                  +     * @return The field first
                  +     */
                  +    public org.ccsds.moims.mo.mal.structures.Attribute getFirst() {
                  +        return first;
                  +    }
                  +
                  +    /**
                  +     * Returns the field second.
                  +     * 
                  +     * @return The field second
                  +     */
                  +    public org.ccsds.moims.mo.mal.structures.Attribute getSecond() {
                  +        return second;
                  +    }
                  +
                  +    @Override
                  +    public boolean equals(Object obj) {
                  +        if (obj instanceof Pair) {
                  +            Pair other = (Pair) obj;
                  +            if (first == null) {
                  +                if (other.first != null) {
                  +                    return false;
                  +                }
                  +            } else {
                  +                if (! first.equals(other.first)) {
                  +                    return false;
                  +                }
                  +            }
                  +            if (second == null) {
                  +                if (other.second != null) {
                  +                    return false;
                  +                }
                  +            } else {
                  +                if (! second.equals(other.second)) {
                  +                    return false;
                  +                }
                  +            }
                  +            return true;
                  +        }
                  +        return false;
                  +    }
                  +
                  +    @Override
                  +    public int hashCode() {
                  +        int hash = 7;
                  +        hash = 83 * hash + (first != null ? first.hashCode() : 0);
                  +        hash = 83 * hash + (second != null ? second.hashCode() : 0);
                  +        return hash;
                  +    }
                  +
                  +    @Override
                  +    public String toString() {
                  +        StringBuilder buf = new StringBuilder();
                  +        buf.append("(Pair: ");
                  +        buf.append("first=").append(first);
                  +        buf.append(", second=").append(second);
                  +        buf.append(')');
                  +        return buf.toString();
                  +    }
                  +
                  +    @Override
                  +    public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        encoder.encodeNullableAttribute(first);
                  +        encoder.encodeNullableAttribute(second);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        first = (org.ccsds.moims.mo.mal.structures.Attribute) decoder.decodeNullableAttribute();
                  +        second = (org.ccsds.moims.mo.mal.structures.Attribute) decoder.decodeNullableAttribute();
                  +        return this;
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.TypeId getTypeId() {
                  +        return TYPE_ID;
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/PairList.java b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/PairList.java
                  new file mode 100644
                  index 00000000..ade2f9a7
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/PairList.java
                  @@ -0,0 +1,79 @@
                  +package org.ccsds.moims.mo.mal.structures;
                  +
                  +/**
                  + * List class for Pair.
                  + */
                  +public final class PairList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList {
                  +
                  +    private static final long serialVersionUID = 281475043818515L;
                  +    /**
                  +     * The TypeId of this Element as a long.
                  +     */
                  +    public static final Long SHORT_FORM = 281475043818515L;
                  +    /**
                  +     * The TypeId of this Element.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM);
                  +
                  +    /**
                  +     * Default constructor for PairList.
                  +     * 
                  +     */
                  +    public PairList() {
                  +    }
                  +
                  +    /**
                  +     * Constructor that initialises the capacity of the list.
                  +     * 
                  +     * @param initialCapacity The required initial capacity.
                  +     */
                  +    public PairList(int initialCapacity) {
                  +        super(initialCapacity);
                  +    }
                  +
                  +    /**
                  +     * Constructor that uses an ArrayList for initialization.
                  +     * 
                  +     * @param elementList The ArrayList that is used for initialization.
                  +     */
                  +    public PairList(java.util.ArrayList elementList) {
                  +        for(org.ccsds.moims.mo.mal.structures.Pair element : elementList) {
                  +            this.add(element);
                  +        }
                  +    }
                  +
                  +    @Override
                  +    public boolean add(org.ccsds.moims.mo.mal.structures.Pair element) {
                  +        if (element == null) {
                  +            throw new IllegalArgumentException("The added argument cannot be null!");
                  +        }
                  +        return super.add(element);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createElement() {
                  +        return new PairList();
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createTypedElement() {
                  +        return new org.ccsds.moims.mo.mal.structures.Pair();
                  +    }
                  +
                  +    @Override
                  +    public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        encoder.encodeHomogeneousList(this);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        decoder.decodeHomogeneousList(this);
                  +        return this;
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.TypeId getTypeId() {
                  +        return TYPE_ID;
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/QoSLevel.java b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/QoSLevel.java
                  new file mode 100644
                  index 00000000..294e6d4c
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/QoSLevel.java
                  @@ -0,0 +1,150 @@
                  +package org.ccsds.moims.mo.mal.structures;
                  +
                  +/**
                  + * Enumeration class for QoSLevel.
                  + */
                  +public final class QoSLevel extends org.ccsds.moims.mo.mal.structures.Enumeration {
                  +
                  +    private static final long serialVersionUID = 281475027042407L;
                  +    /**
                  +     * The TypeId of this Element as a long.
                  +     */
                  +    public static final Long SHORT_FORM = 281475027042407L;
                  +    /**
                  +     * The TypeId of this Element.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM);
                  +
                  +    /**
                  +     * Enumeration value for BESTEFFORT.
                  +     */
                  +    public static final int BESTEFFORT_VALUE = 1;
                  +
                  +    /**
                  +     * Enumeration singleton for value BESTEFFORT.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.structures.QoSLevel BESTEFFORT = new org.ccsds.moims.mo.mal.structures.QoSLevel(org.ccsds.moims.mo.mal.structures.QoSLevel.BESTEFFORT_VALUE);
                  +
                  +    /**
                  +     * Enumeration value for ASSURED.
                  +     */
                  +    public static final int ASSURED_VALUE = 2;
                  +
                  +    /**
                  +     * Enumeration singleton for value ASSURED.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.structures.QoSLevel ASSURED = new org.ccsds.moims.mo.mal.structures.QoSLevel(org.ccsds.moims.mo.mal.structures.QoSLevel.ASSURED_VALUE);
                  +
                  +    /**
                  +     * Enumeration value for QUEUED.
                  +     */
                  +    public static final int QUEUED_VALUE = 3;
                  +
                  +    /**
                  +     * Enumeration singleton for value QUEUED.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.structures.QoSLevel QUEUED = new org.ccsds.moims.mo.mal.structures.QoSLevel(org.ccsds.moims.mo.mal.structures.QoSLevel.QUEUED_VALUE);
                  +
                  +    /**
                  +     * Enumeration value for TIMELY.
                  +     */
                  +    public static final int TIMELY_VALUE = 4;
                  +
                  +    /**
                  +     * Enumeration singleton for value TIMELY.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.structures.QoSLevel TIMELY = new org.ccsds.moims.mo.mal.structures.QoSLevel(org.ccsds.moims.mo.mal.structures.QoSLevel.TIMELY_VALUE);
                  +
                  +    /**
                  +     * Set of enumeration instances.
                  +     */
                  +    private static final org.ccsds.moims.mo.mal.structures.QoSLevel[] _ENUMERATIONS = {
                  +        BESTEFFORT, ASSURED, QUEUED, TIMELY};
                  +
                  +    /**
                  +     * QoSLevel is an enumeration that shall be used to hold the possible QoS levels. This facilitates the use of different QoS in out-of-band agreements.
                  +     */
                  +    public QoSLevel() {
                  +        super(-1);
                  +    }
                  +
                  +    /**
                  +     * QoSLevel is an enumeration that shall be used to hold the possible QoS
                  +     * levels. This facilitates the use of different QoS in out-of-band agreements.
                  +     * 
                  +     * @param value The value of the Enumeration.
                  +     */
                  +    public QoSLevel(int value) {
                  +        super(value);
                  +    }
                  +
                  +    @Override
                  +    public String toString() {
                  +        switch (getValue()) {
                  +            case BESTEFFORT_VALUE:
                  +                return "BESTEFFORT";
                  +            case ASSURED_VALUE:
                  +                return "ASSURED";
                  +            case QUEUED_VALUE:
                  +                return "QUEUED";
                  +            case TIMELY_VALUE:
                  +                return "TIMELY";
                  +            default:
                  +                throw new RuntimeException("Unknown ordinal!");
                  +        }
                  +    }
                  +
                  +    /**
                  +     * Returns the enumeration element represented by the supplied string, or
                  +     * null if not matched.
                  +     * 
                  +     * @param s s The string to search for.
                  +     * @return The matched enumeration element, or null if not matched.
                  +     */
                  +    public static org.ccsds.moims.mo.mal.structures.QoSLevel fromString(String s) {
                  +        switch (s) {
                  +            case "BESTEFFORT":
                  +                return QoSLevel.BESTEFFORT;
                  +            case "ASSURED":
                  +                return QoSLevel.ASSURED;
                  +            case "QUEUED":
                  +                return QoSLevel.QUEUED;
                  +            case "TIMELY":
                  +                return QoSLevel.TIMELY;
                  +            default:
                  +                throw new RuntimeException("Unknown Enumeration for the provided string: " + s);
                  +        }
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Enumeration fromValue(Integer value) {
                  +        switch (value) {
                  +            case BESTEFFORT_VALUE:
                  +                return QoSLevel.BESTEFFORT;
                  +            case ASSURED_VALUE:
                  +                return QoSLevel.ASSURED;
                  +            case QUEUED_VALUE:
                  +                return QoSLevel.QUEUED;
                  +            case TIMELY_VALUE:
                  +                return QoSLevel.TIMELY;
                  +            default:
                  +                throw new RuntimeException("Unknown Enumeration for the provided value: " + value);
                  +        }
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createElement() {
                  +        return _ENUMERATIONS[0];
                  +    }
                  +
                  +    @Override
                  +    public int getEnumSize() {
                  +        return 4;
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.TypeId getTypeId() {
                  +        return TYPE_ID;
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/QoSLevelList.java b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/QoSLevelList.java
                  new file mode 100644
                  index 00000000..9ede6e13
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/QoSLevelList.java
                  @@ -0,0 +1,79 @@
                  +package org.ccsds.moims.mo.mal.structures;
                  +
                  +/**
                  + * List class for QoSLevel.
                  + */
                  +public final class QoSLevelList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList {
                  +
                  +    private static final long serialVersionUID = 281475043819417L;
                  +    /**
                  +     * The TypeId of this Element as a long.
                  +     */
                  +    public static final Long SHORT_FORM = 281475043819417L;
                  +    /**
                  +     * The TypeId of this Element.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM);
                  +
                  +    /**
                  +     * Default constructor for QoSLevelList.
                  +     * 
                  +     */
                  +    public QoSLevelList() {
                  +    }
                  +
                  +    /**
                  +     * Constructor that initialises the capacity of the list.
                  +     * 
                  +     * @param initialCapacity The required initial capacity.
                  +     */
                  +    public QoSLevelList(int initialCapacity) {
                  +        super(initialCapacity);
                  +    }
                  +
                  +    /**
                  +     * Constructor that uses an ArrayList for initialization.
                  +     * 
                  +     * @param elementList The ArrayList that is used for initialization.
                  +     */
                  +    public QoSLevelList(java.util.ArrayList elementList) {
                  +        for(org.ccsds.moims.mo.mal.structures.QoSLevel element : elementList) {
                  +            this.add(element);
                  +        }
                  +    }
                  +
                  +    @Override
                  +    public boolean add(org.ccsds.moims.mo.mal.structures.QoSLevel element) {
                  +        if (element == null) {
                  +            throw new IllegalArgumentException("The added argument cannot be null!");
                  +        }
                  +        return super.add(element);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createElement() {
                  +        return new QoSLevelList();
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createTypedElement() {
                  +        return org.ccsds.moims.mo.mal.structures.QoSLevel.BESTEFFORT;
                  +    }
                  +
                  +    @Override
                  +    public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        encoder.encodeHomogeneousList(this);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        decoder.decodeHomogeneousList(this);
                  +        return this;
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.TypeId getTypeId() {
                  +        return TYPE_ID;
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/ServiceId.java b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/ServiceId.java
                  new file mode 100644
                  index 00000000..0f0645cc
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/ServiceId.java
                  @@ -0,0 +1,173 @@
                  +package org.ccsds.moims.mo.mal.structures;
                  +
                  +/**
                  + * The ServiceId structure shall represent a specific service in MO.
                  + */
                  +public final class ServiceId implements org.ccsds.moims.mo.mal.structures.Composite {
                  +
                  +    private static final long serialVersionUID = 281475027043313L;
                  +    /**
                  +     * The TypeId of this Element as a long.
                  +     */
                  +    public static final Long SHORT_FORM = 281475027043313L;
                  +    /**
                  +     * The TypeId of this Element.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM);
                  +
                  +    /**
                  +     * The area of this service taken from the numeric Area identifier of the
                  +     * service specification.
                  +     */
                  +    private org.ccsds.moims.mo.mal.structures.UShort keyArea;
                  +
                  +    /**
                  +     * The service taken from the numeric Service identifier of the service specification.
                  +     */
                  +    private org.ccsds.moims.mo.mal.structures.UShort keyService;
                  +
                  +    /**
                  +     * The Area Version of the service.
                  +     */
                  +    private org.ccsds.moims.mo.mal.structures.UOctet keyAreaVersion;
                  +
                  +    /**
                  +     * Default constructor for ServiceId.
                  +     * 
                  +     */
                  +    public ServiceId() {
                  +    }
                  +
                  +    /**
                  +     * Constructor that initialises the values of the structure.
                  +     * 
                  +     * @param keyArea The area of this service taken from the numeric Area identifier of the service specification.
                  +     * @param keyService The service taken from the numeric Service identifier of the service specification.
                  +     * @param keyAreaVersion The Area Version of the service.
                  +     */
                  +    public ServiceId(org.ccsds.moims.mo.mal.structures.UShort keyArea,
                  +            org.ccsds.moims.mo.mal.structures.UShort keyService,
                  +            org.ccsds.moims.mo.mal.structures.UOctet keyAreaVersion) {
                  +        this.keyArea = keyArea;
                  +        this.keyService = keyService;
                  +        this.keyAreaVersion = keyAreaVersion;
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createElement() {
                  +        return new org.ccsds.moims.mo.mal.structures.ServiceId();
                  +    }
                  +
                  +    /**
                  +     * Returns the field keyArea.
                  +     * 
                  +     * @return The field keyArea
                  +     */
                  +    public org.ccsds.moims.mo.mal.structures.UShort getKeyArea() {
                  +        return keyArea;
                  +    }
                  +
                  +    /**
                  +     * Returns the field keyService.
                  +     * 
                  +     * @return The field keyService
                  +     */
                  +    public org.ccsds.moims.mo.mal.structures.UShort getKeyService() {
                  +        return keyService;
                  +    }
                  +
                  +    /**
                  +     * Returns the field keyAreaVersion.
                  +     * 
                  +     * @return The field keyAreaVersion
                  +     */
                  +    public org.ccsds.moims.mo.mal.structures.UOctet getKeyAreaVersion() {
                  +        return keyAreaVersion;
                  +    }
                  +
                  +    @Override
                  +    public boolean equals(Object obj) {
                  +        if (obj instanceof ServiceId) {
                  +            ServiceId other = (ServiceId) obj;
                  +            if (keyArea == null) {
                  +                if (other.keyArea != null) {
                  +                    return false;
                  +                }
                  +            } else {
                  +                if (! keyArea.equals(other.keyArea)) {
                  +                    return false;
                  +                }
                  +            }
                  +            if (keyService == null) {
                  +                if (other.keyService != null) {
                  +                    return false;
                  +                }
                  +            } else {
                  +                if (! keyService.equals(other.keyService)) {
                  +                    return false;
                  +                }
                  +            }
                  +            if (keyAreaVersion == null) {
                  +                if (other.keyAreaVersion != null) {
                  +                    return false;
                  +                }
                  +            } else {
                  +                if (! keyAreaVersion.equals(other.keyAreaVersion)) {
                  +                    return false;
                  +                }
                  +            }
                  +            return true;
                  +        }
                  +        return false;
                  +    }
                  +
                  +    @Override
                  +    public int hashCode() {
                  +        int hash = 7;
                  +        hash = 83 * hash + (keyArea != null ? keyArea.hashCode() : 0);
                  +        hash = 83 * hash + (keyService != null ? keyService.hashCode() : 0);
                  +        hash = 83 * hash + (keyAreaVersion != null ? keyAreaVersion.hashCode() : 0);
                  +        return hash;
                  +    }
                  +
                  +    @Override
                  +    public String toString() {
                  +        StringBuilder buf = new StringBuilder();
                  +        buf.append("(ServiceId: ");
                  +        buf.append("keyArea=").append(keyArea);
                  +        buf.append(", keyService=").append(keyService);
                  +        buf.append(", keyAreaVersion=").append(keyAreaVersion);
                  +        buf.append(')');
                  +        return buf.toString();
                  +    }
                  +
                  +    @Override
                  +    public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        if (keyArea == null) {
                  +            throw new org.ccsds.moims.mo.mal.MALException("The field 'keyArea' cannot be null!");
                  +        }
                  +        if (keyService == null) {
                  +            throw new org.ccsds.moims.mo.mal.MALException("The field 'keyService' cannot be null!");
                  +        }
                  +        if (keyAreaVersion == null) {
                  +            throw new org.ccsds.moims.mo.mal.MALException("The field 'keyAreaVersion' cannot be null!");
                  +        }
                  +        encoder.encodeUShort(keyArea);
                  +        encoder.encodeUShort(keyService);
                  +        encoder.encodeUOctet(keyAreaVersion);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        keyArea = decoder.decodeUShort();
                  +        keyService = decoder.decodeUShort();
                  +        keyAreaVersion = decoder.decodeUOctet();
                  +        return this;
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.TypeId getTypeId() {
                  +        return TYPE_ID;
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/ServiceIdList.java b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/ServiceIdList.java
                  new file mode 100644
                  index 00000000..408cc0f9
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/ServiceIdList.java
                  @@ -0,0 +1,79 @@
                  +package org.ccsds.moims.mo.mal.structures;
                  +
                  +/**
                  + * List class for ServiceId.
                  + */
                  +public final class ServiceIdList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList {
                  +
                  +    private static final long serialVersionUID = 281475043818511L;
                  +    /**
                  +     * The TypeId of this Element as a long.
                  +     */
                  +    public static final Long SHORT_FORM = 281475043818511L;
                  +    /**
                  +     * The TypeId of this Element.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM);
                  +
                  +    /**
                  +     * Default constructor for ServiceIdList.
                  +     * 
                  +     */
                  +    public ServiceIdList() {
                  +    }
                  +
                  +    /**
                  +     * Constructor that initialises the capacity of the list.
                  +     * 
                  +     * @param initialCapacity The required initial capacity.
                  +     */
                  +    public ServiceIdList(int initialCapacity) {
                  +        super(initialCapacity);
                  +    }
                  +
                  +    /**
                  +     * Constructor that uses an ArrayList for initialization.
                  +     * 
                  +     * @param elementList The ArrayList that is used for initialization.
                  +     */
                  +    public ServiceIdList(java.util.ArrayList elementList) {
                  +        for(org.ccsds.moims.mo.mal.structures.ServiceId element : elementList) {
                  +            this.add(element);
                  +        }
                  +    }
                  +
                  +    @Override
                  +    public boolean add(org.ccsds.moims.mo.mal.structures.ServiceId element) {
                  +        if (element == null) {
                  +            throw new IllegalArgumentException("The added argument cannot be null!");
                  +        }
                  +        return super.add(element);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createElement() {
                  +        return new ServiceIdList();
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createTypedElement() {
                  +        return new org.ccsds.moims.mo.mal.structures.ServiceId();
                  +    }
                  +
                  +    @Override
                  +    public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        encoder.encodeHomogeneousList(this);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        decoder.decodeHomogeneousList(this);
                  +        return this;
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.TypeId getTypeId() {
                  +        return TYPE_ID;
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/SessionType.java b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/SessionType.java
                  new file mode 100644
                  index 00000000..fe0d4012
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/SessionType.java
                  @@ -0,0 +1,134 @@
                  +package org.ccsds.moims.mo.mal.structures;
                  +
                  +/**
                  + * Enumeration class for SessionType.
                  + */
                  +public final class SessionType extends org.ccsds.moims.mo.mal.structures.Enumeration {
                  +
                  +    private static final long serialVersionUID = 281475027042406L;
                  +    /**
                  +     * The TypeId of this Element as a long.
                  +     */
                  +    public static final Long SHORT_FORM = 281475027042406L;
                  +    /**
                  +     * The TypeId of this Element.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM);
                  +
                  +    /**
                  +     * Enumeration value for LIVE.
                  +     */
                  +    public static final int LIVE_VALUE = 1;
                  +
                  +    /**
                  +     * Enumeration singleton for value LIVE.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.structures.SessionType LIVE = new org.ccsds.moims.mo.mal.structures.SessionType(org.ccsds.moims.mo.mal.structures.SessionType.LIVE_VALUE);
                  +
                  +    /**
                  +     * Enumeration value for SIMULATION.
                  +     */
                  +    public static final int SIMULATION_VALUE = 2;
                  +
                  +    /**
                  +     * Enumeration singleton for value SIMULATION.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.structures.SessionType SIMULATION = new org.ccsds.moims.mo.mal.structures.SessionType(org.ccsds.moims.mo.mal.structures.SessionType.SIMULATION_VALUE);
                  +
                  +    /**
                  +     * Enumeration value for REPLAY.
                  +     */
                  +    public static final int REPLAY_VALUE = 3;
                  +
                  +    /**
                  +     * Enumeration singleton for value REPLAY.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.structures.SessionType REPLAY = new org.ccsds.moims.mo.mal.structures.SessionType(org.ccsds.moims.mo.mal.structures.SessionType.REPLAY_VALUE);
                  +
                  +    /**
                  +     * Set of enumeration instances.
                  +     */
                  +    private static final org.ccsds.moims.mo.mal.structures.SessionType[] _ENUMERATIONS = {
                  +        LIVE, SIMULATION, REPLAY};
                  +
                  +    /**
                  +     * SessionType is an enumeration that shall be used to hold the session types. This facilitates the use of different Sessions in out-of-band agreements.
                  +     */
                  +    public SessionType() {
                  +        super(-1);
                  +    }
                  +
                  +    /**
                  +     * SessionType is an enumeration that shall be used to hold the session types.
                  +     * This facilitates the use of different Sessions in out-of-band agreements.
                  +     * 
                  +     * @param value The value of the Enumeration.
                  +     */
                  +    public SessionType(int value) {
                  +        super(value);
                  +    }
                  +
                  +    @Override
                  +    public String toString() {
                  +        switch (getValue()) {
                  +            case LIVE_VALUE:
                  +                return "LIVE";
                  +            case SIMULATION_VALUE:
                  +                return "SIMULATION";
                  +            case REPLAY_VALUE:
                  +                return "REPLAY";
                  +            default:
                  +                throw new RuntimeException("Unknown ordinal!");
                  +        }
                  +    }
                  +
                  +    /**
                  +     * Returns the enumeration element represented by the supplied string, or
                  +     * null if not matched.
                  +     * 
                  +     * @param s s The string to search for.
                  +     * @return The matched enumeration element, or null if not matched.
                  +     */
                  +    public static org.ccsds.moims.mo.mal.structures.SessionType fromString(String s) {
                  +        switch (s) {
                  +            case "LIVE":
                  +                return SessionType.LIVE;
                  +            case "SIMULATION":
                  +                return SessionType.SIMULATION;
                  +            case "REPLAY":
                  +                return SessionType.REPLAY;
                  +            default:
                  +                throw new RuntimeException("Unknown Enumeration for the provided string: " + s);
                  +        }
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Enumeration fromValue(Integer value) {
                  +        switch (value) {
                  +            case LIVE_VALUE:
                  +                return SessionType.LIVE;
                  +            case SIMULATION_VALUE:
                  +                return SessionType.SIMULATION;
                  +            case REPLAY_VALUE:
                  +                return SessionType.REPLAY;
                  +            default:
                  +                throw new RuntimeException("Unknown Enumeration for the provided value: " + value);
                  +        }
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createElement() {
                  +        return _ENUMERATIONS[0];
                  +    }
                  +
                  +    @Override
                  +    public int getEnumSize() {
                  +        return 3;
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.TypeId getTypeId() {
                  +        return TYPE_ID;
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/SessionTypeList.java b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/SessionTypeList.java
                  new file mode 100644
                  index 00000000..a0f2e5bf
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/SessionTypeList.java
                  @@ -0,0 +1,79 @@
                  +package org.ccsds.moims.mo.mal.structures;
                  +
                  +/**
                  + * List class for SessionType.
                  + */
                  +public final class SessionTypeList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList {
                  +
                  +    private static final long serialVersionUID = 281475043819418L;
                  +    /**
                  +     * The TypeId of this Element as a long.
                  +     */
                  +    public static final Long SHORT_FORM = 281475043819418L;
                  +    /**
                  +     * The TypeId of this Element.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM);
                  +
                  +    /**
                  +     * Default constructor for SessionTypeList.
                  +     * 
                  +     */
                  +    public SessionTypeList() {
                  +    }
                  +
                  +    /**
                  +     * Constructor that initialises the capacity of the list.
                  +     * 
                  +     * @param initialCapacity The required initial capacity.
                  +     */
                  +    public SessionTypeList(int initialCapacity) {
                  +        super(initialCapacity);
                  +    }
                  +
                  +    /**
                  +     * Constructor that uses an ArrayList for initialization.
                  +     * 
                  +     * @param elementList The ArrayList that is used for initialization.
                  +     */
                  +    public SessionTypeList(java.util.ArrayList elementList) {
                  +        for(org.ccsds.moims.mo.mal.structures.SessionType element : elementList) {
                  +            this.add(element);
                  +        }
                  +    }
                  +
                  +    @Override
                  +    public boolean add(org.ccsds.moims.mo.mal.structures.SessionType element) {
                  +        if (element == null) {
                  +            throw new IllegalArgumentException("The added argument cannot be null!");
                  +        }
                  +        return super.add(element);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createElement() {
                  +        return new SessionTypeList();
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createTypedElement() {
                  +        return org.ccsds.moims.mo.mal.structures.SessionType.LIVE;
                  +    }
                  +
                  +    @Override
                  +    public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        encoder.encodeHomogeneousList(this);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        decoder.decodeHomogeneousList(this);
                  +        return this;
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.TypeId getTypeId() {
                  +        return TYPE_ID;
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/ShortList.java b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/ShortList.java
                  new file mode 100644
                  index 00000000..ee92b25f
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/ShortList.java
                  @@ -0,0 +1,80 @@
                  +package org.ccsds.moims.mo.mal.structures;
                  +
                  +/**
                  + * List class for Short.
                  + */
                  +public final class ShortList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList {
                  +
                  +    private static final long serialVersionUID = 281475043819511L;
                  +    /**
                  +     * The TypeId of this Element as a long.
                  +     */
                  +    public static final Long SHORT_FORM = 281475043819511L;
                  +    /**
                  +     * The TypeId of this Element.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM);
                  +
                  +    /**
                  +     * Default constructor for ShortList.
                  +     * 
                  +     */
                  +    public ShortList() {
                  +    }
                  +
                  +    /**
                  +     * Constructor that initialises the capacity of the list.
                  +     * 
                  +     * @param initialCapacity The required initial capacity.
                  +     */
                  +    public ShortList(int initialCapacity) {
                  +        super(initialCapacity);
                  +    }
                  +
                  +    /**
                  +     * Constructor that uses an ArrayList for initialization.
                  +     * 
                  +     * @param elementList The ArrayList that is used for initialization.
                  +     */
                  +    public ShortList(java.util.ArrayList elementList) {
                  +        for(Short element : elementList) {
                  +            this.add(element);
                  +        }
                  +    }
                  +
                  +    @Override
                  +    public boolean add(Short element) {
                  +        if (element == null) {
                  +            throw new IllegalArgumentException("The added argument cannot be null!");
                  +        }
                  +        return super.add(element);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createElement() {
                  +        return new ShortList();
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createTypedElement() {
                  +        org.ccsds.moims.mo.mal.TypeId typeId = this.getTypeId();
                  +        return new Union(typeId.generateTypeIdPositive());
                  +    }
                  +
                  +    @Override
                  +    public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        encoder.encodeHomogeneousList(this);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        decoder.decodeHomogeneousList(this);
                  +        return this;
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.TypeId getTypeId() {
                  +        return TYPE_ID;
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/StringList.java b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/StringList.java
                  new file mode 100644
                  index 00000000..f1e026e3
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/StringList.java
                  @@ -0,0 +1,80 @@
                  +package org.ccsds.moims.mo.mal.structures;
                  +
                  +/**
                  + * List class for String.
                  + */
                  +public final class StringList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList {
                  +
                  +    private static final long serialVersionUID = 281475043819505L;
                  +    /**
                  +     * The TypeId of this Element as a long.
                  +     */
                  +    public static final Long SHORT_FORM = 281475043819505L;
                  +    /**
                  +     * The TypeId of this Element.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM);
                  +
                  +    /**
                  +     * Default constructor for StringList.
                  +     * 
                  +     */
                  +    public StringList() {
                  +    }
                  +
                  +    /**
                  +     * Constructor that initialises the capacity of the list.
                  +     * 
                  +     * @param initialCapacity The required initial capacity.
                  +     */
                  +    public StringList(int initialCapacity) {
                  +        super(initialCapacity);
                  +    }
                  +
                  +    /**
                  +     * Constructor that uses an ArrayList for initialization.
                  +     * 
                  +     * @param elementList The ArrayList that is used for initialization.
                  +     */
                  +    public StringList(java.util.ArrayList elementList) {
                  +        for(String element : elementList) {
                  +            this.add(element);
                  +        }
                  +    }
                  +
                  +    @Override
                  +    public boolean add(String element) {
                  +        if (element == null) {
                  +            throw new IllegalArgumentException("The added argument cannot be null!");
                  +        }
                  +        return super.add(element);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createElement() {
                  +        return new StringList();
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createTypedElement() {
                  +        org.ccsds.moims.mo.mal.TypeId typeId = this.getTypeId();
                  +        return new Union(typeId.generateTypeIdPositive());
                  +    }
                  +
                  +    @Override
                  +    public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        encoder.encodeHomogeneousList(this);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        decoder.decodeHomogeneousList(this);
                  +        return this;
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.TypeId getTypeId() {
                  +        return TYPE_ID;
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/Subscription.java b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/Subscription.java
                  new file mode 100644
                  index 00000000..6600f72e
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/Subscription.java
                  @@ -0,0 +1,214 @@
                  +package org.ccsds.moims.mo.mal.structures;
                  +
                  +/**
                  + * The Subscription structure shall be used when subscribing for updates using
                  + * the PUBSUB Interaction Pattern. It shall contain a single identifier that
                  + * identifies the subscription being defined and a set of entities being requested.
                  + */
                  +public final class Subscription implements org.ccsds.moims.mo.mal.structures.Composite {
                  +
                  +    private static final long serialVersionUID = 281475027043305L;
                  +    /**
                  +     * The TypeId of this Element as a long.
                  +     */
                  +    public static final Long SHORT_FORM = 281475027043305L;
                  +    /**
                  +     * The TypeId of this Element.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM);
                  +
                  +    /**
                  +     * The identifier of this subscription.
                  +     */
                  +    private org.ccsds.moims.mo.mal.structures.Identifier subscriptionId;
                  +
                  +    /**
                  +     * Optional domain identifier. If NULL, the subscription shall match with
                  +     * any domain.
                  +     */
                  +    private org.ccsds.moims.mo.mal.structures.IdentifierList domain;
                  +
                  +    /**
                  +     * The list of names of the selected Subscription Keys to be transmitted to
                  +     * the consumer. The Subscription Keys that are not in this list will be removed.
                  +     * If NULL, then all Subscription Keys will be transmitted.
                  +     */
                  +    private org.ccsds.moims.mo.mal.structures.IdentifierList selectedKeys;
                  +
                  +    /**
                  +     * The list of filters for this subscription. The list of filters must be
                  +     * ANDed together. If NULL, the subscription will not filter specific keys.
                  +     */
                  +    private org.ccsds.moims.mo.mal.structures.SubscriptionFilterList filters;
                  +
                  +    /**
                  +     * Default constructor for Subscription.
                  +     * 
                  +     */
                  +    public Subscription() {
                  +    }
                  +
                  +    /**
                  +     * Constructor that initialises the values of the structure.
                  +     * 
                  +     * @param subscriptionId The identifier of this subscription.
                  +     * @param domain Optional domain identifier. If NULL, the subscription shall match with any domain.
                  +     * @param selectedKeys The list of names of the selected Subscription Keys to be transmitted to the consumer. The Subscription Keys that are not in this list will be removed. If NULL, then all Subscription Keys will be transmitted.
                  +     * @param filters The list of filters for this subscription. The list of filters must be ANDed together. If NULL, the subscription will not filter specific keys.
                  +     */
                  +    public Subscription(org.ccsds.moims.mo.mal.structures.Identifier subscriptionId,
                  +            org.ccsds.moims.mo.mal.structures.IdentifierList domain,
                  +            org.ccsds.moims.mo.mal.structures.IdentifierList selectedKeys,
                  +            org.ccsds.moims.mo.mal.structures.SubscriptionFilterList filters) {
                  +        this.subscriptionId = subscriptionId;
                  +        this.domain = domain;
                  +        this.selectedKeys = selectedKeys;
                  +        this.filters = filters;
                  +    }
                  +
                  +    /**
                  +     * Constructor that initialises the non-nullable values of the structure.
                  +     * 
                  +     * @param subscriptionId The identifier of this subscription.
                  +     */
                  +    public Subscription(org.ccsds.moims.mo.mal.structures.Identifier subscriptionId) {
                  +        this.subscriptionId = subscriptionId;
                  +        this.domain = null;
                  +        this.selectedKeys = null;
                  +        this.filters = null;
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createElement() {
                  +        return new org.ccsds.moims.mo.mal.structures.Subscription();
                  +    }
                  +
                  +    /**
                  +     * Returns the field subscriptionId.
                  +     * 
                  +     * @return The field subscriptionId
                  +     */
                  +    public org.ccsds.moims.mo.mal.structures.Identifier getSubscriptionId() {
                  +        return subscriptionId;
                  +    }
                  +
                  +    /**
                  +     * Returns the field domain.
                  +     * 
                  +     * @return The field domain
                  +     */
                  +    public org.ccsds.moims.mo.mal.structures.IdentifierList getDomain() {
                  +        return domain;
                  +    }
                  +
                  +    /**
                  +     * Returns the field selectedKeys.
                  +     * 
                  +     * @return The field selectedKeys
                  +     */
                  +    public org.ccsds.moims.mo.mal.structures.IdentifierList getSelectedKeys() {
                  +        return selectedKeys;
                  +    }
                  +
                  +    /**
                  +     * Returns the field filters.
                  +     * 
                  +     * @return The field filters
                  +     */
                  +    public org.ccsds.moims.mo.mal.structures.SubscriptionFilterList getFilters() {
                  +        return filters;
                  +    }
                  +
                  +    @Override
                  +    public boolean equals(Object obj) {
                  +        if (obj instanceof Subscription) {
                  +            Subscription other = (Subscription) obj;
                  +            if (subscriptionId == null) {
                  +                if (other.subscriptionId != null) {
                  +                    return false;
                  +                }
                  +            } else {
                  +                if (! subscriptionId.equals(other.subscriptionId)) {
                  +                    return false;
                  +                }
                  +            }
                  +            if (domain == null) {
                  +                if (other.domain != null) {
                  +                    return false;
                  +                }
                  +            } else {
                  +                if (! domain.equals(other.domain)) {
                  +                    return false;
                  +                }
                  +            }
                  +            if (selectedKeys == null) {
                  +                if (other.selectedKeys != null) {
                  +                    return false;
                  +                }
                  +            } else {
                  +                if (! selectedKeys.equals(other.selectedKeys)) {
                  +                    return false;
                  +                }
                  +            }
                  +            if (filters == null) {
                  +                if (other.filters != null) {
                  +                    return false;
                  +                }
                  +            } else {
                  +                if (! filters.equals(other.filters)) {
                  +                    return false;
                  +                }
                  +            }
                  +            return true;
                  +        }
                  +        return false;
                  +    }
                  +
                  +    @Override
                  +    public int hashCode() {
                  +        int hash = 7;
                  +        hash = 83 * hash + (subscriptionId != null ? subscriptionId.hashCode() : 0);
                  +        hash = 83 * hash + (domain != null ? domain.hashCode() : 0);
                  +        hash = 83 * hash + (selectedKeys != null ? selectedKeys.hashCode() : 0);
                  +        hash = 83 * hash + (filters != null ? filters.hashCode() : 0);
                  +        return hash;
                  +    }
                  +
                  +    @Override
                  +    public String toString() {
                  +        StringBuilder buf = new StringBuilder();
                  +        buf.append("(Subscription: ");
                  +        buf.append("subscriptionId=").append(subscriptionId);
                  +        buf.append(", domain=").append(domain);
                  +        buf.append(", selectedKeys=").append(selectedKeys);
                  +        buf.append(", filters=").append(filters);
                  +        buf.append(')');
                  +        return buf.toString();
                  +    }
                  +
                  +    @Override
                  +    public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        if (subscriptionId == null) {
                  +            throw new org.ccsds.moims.mo.mal.MALException("The field 'subscriptionId' cannot be null!");
                  +        }
                  +        encoder.encodeIdentifier(subscriptionId);
                  +        encoder.encodeNullableElement(domain);
                  +        encoder.encodeNullableElement(selectedKeys);
                  +        encoder.encodeNullableElement(filters);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        subscriptionId = decoder.decodeIdentifier();
                  +        domain = (org.ccsds.moims.mo.mal.structures.IdentifierList) decoder.decodeNullableElement(new org.ccsds.moims.mo.mal.structures.IdentifierList());
                  +        selectedKeys = (org.ccsds.moims.mo.mal.structures.IdentifierList) decoder.decodeNullableElement(new org.ccsds.moims.mo.mal.structures.IdentifierList());
                  +        filters = (org.ccsds.moims.mo.mal.structures.SubscriptionFilterList) decoder.decodeNullableElement(new org.ccsds.moims.mo.mal.structures.SubscriptionFilterList());
                  +        return this;
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.TypeId getTypeId() {
                  +        return TYPE_ID;
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/SubscriptionFilter.java b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/SubscriptionFilter.java
                  new file mode 100644
                  index 00000000..dc96fcbe
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/SubscriptionFilter.java
                  @@ -0,0 +1,143 @@
                  +package org.ccsds.moims.mo.mal.structures;
                  +
                  +/**
                  + * The SubscriptionFilter structure shall be used when subscribing for updates
                  + * using the PUBSUB Interaction Pattern. It shall contain a single identifier
                  + * that identifies the Subscription Key name and the set of values to be registered
                  + * for the defined key name.
                  + */
                  +public final class SubscriptionFilter implements org.ccsds.moims.mo.mal.structures.Composite {
                  +
                  +    private static final long serialVersionUID = 281475027043306L;
                  +    /**
                  +     * The TypeId of this Element as a long.
                  +     */
                  +    public static final Long SHORT_FORM = 281475027043306L;
                  +    /**
                  +     * The TypeId of this Element.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM);
                  +
                  +    /**
                  +     * The identifier name of the key.
                  +     */
                  +    private org.ccsds.moims.mo.mal.structures.Identifier name;
                  +
                  +    /**
                  +     * The list of values that are being subscribed for this key. These shall
                  +     * be ORed together.
                  +     */
                  +    private org.ccsds.moims.mo.mal.structures.AttributeList values;
                  +
                  +    /**
                  +     * Default constructor for SubscriptionFilter.
                  +     * 
                  +     */
                  +    public SubscriptionFilter() {
                  +    }
                  +
                  +    /**
                  +     * Constructor that initialises the values of the structure.
                  +     * 
                  +     * @param name The identifier name of the key.
                  +     * @param values The list of values that are being subscribed for this key. These shall be ORed together.
                  +     */
                  +    public SubscriptionFilter(org.ccsds.moims.mo.mal.structures.Identifier name,
                  +            org.ccsds.moims.mo.mal.structures.AttributeList values) {
                  +        this.name = name;
                  +        this.values = values;
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createElement() {
                  +        return new org.ccsds.moims.mo.mal.structures.SubscriptionFilter();
                  +    }
                  +
                  +    /**
                  +     * Returns the field name.
                  +     * 
                  +     * @return The field name
                  +     */
                  +    public org.ccsds.moims.mo.mal.structures.Identifier getName() {
                  +        return name;
                  +    }
                  +
                  +    /**
                  +     * Returns the field values.
                  +     * 
                  +     * @return The field values
                  +     */
                  +    public org.ccsds.moims.mo.mal.structures.AttributeList getValues() {
                  +        return values;
                  +    }
                  +
                  +    @Override
                  +    public boolean equals(Object obj) {
                  +        if (obj instanceof SubscriptionFilter) {
                  +            SubscriptionFilter other = (SubscriptionFilter) obj;
                  +            if (name == null) {
                  +                if (other.name != null) {
                  +                    return false;
                  +                }
                  +            } else {
                  +                if (! name.equals(other.name)) {
                  +                    return false;
                  +                }
                  +            }
                  +            if (values == null) {
                  +                if (other.values != null) {
                  +                    return false;
                  +                }
                  +            } else {
                  +                if (! values.equals(other.values)) {
                  +                    return false;
                  +                }
                  +            }
                  +            return true;
                  +        }
                  +        return false;
                  +    }
                  +
                  +    @Override
                  +    public int hashCode() {
                  +        int hash = 7;
                  +        hash = 83 * hash + (name != null ? name.hashCode() : 0);
                  +        hash = 83 * hash + (values != null ? values.hashCode() : 0);
                  +        return hash;
                  +    }
                  +
                  +    @Override
                  +    public String toString() {
                  +        StringBuilder buf = new StringBuilder();
                  +        buf.append("(SubscriptionFilter: ");
                  +        buf.append("name=").append(name);
                  +        buf.append(", values=").append(values);
                  +        buf.append(')');
                  +        return buf.toString();
                  +    }
                  +
                  +    @Override
                  +    public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        if (name == null) {
                  +            throw new org.ccsds.moims.mo.mal.MALException("The field 'name' cannot be null!");
                  +        }
                  +        if (values == null) {
                  +            throw new org.ccsds.moims.mo.mal.MALException("The field 'values' cannot be null!");
                  +        }
                  +        encoder.encodeIdentifier(name);
                  +        encoder.encodeElement(values);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        name = decoder.decodeIdentifier();
                  +        values = (org.ccsds.moims.mo.mal.structures.AttributeList) decoder.decodeElement(new org.ccsds.moims.mo.mal.structures.AttributeList());
                  +        return this;
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.TypeId getTypeId() {
                  +        return TYPE_ID;
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/SubscriptionFilterList.java b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/SubscriptionFilterList.java
                  new file mode 100644
                  index 00000000..bd827cae
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/SubscriptionFilterList.java
                  @@ -0,0 +1,79 @@
                  +package org.ccsds.moims.mo.mal.structures;
                  +
                  +/**
                  + * List class for SubscriptionFilter.
                  + */
                  +public final class SubscriptionFilterList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList {
                  +
                  +    private static final long serialVersionUID = 281475043818518L;
                  +    /**
                  +     * The TypeId of this Element as a long.
                  +     */
                  +    public static final Long SHORT_FORM = 281475043818518L;
                  +    /**
                  +     * The TypeId of this Element.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM);
                  +
                  +    /**
                  +     * Default constructor for SubscriptionFilterList.
                  +     * 
                  +     */
                  +    public SubscriptionFilterList() {
                  +    }
                  +
                  +    /**
                  +     * Constructor that initialises the capacity of the list.
                  +     * 
                  +     * @param initialCapacity The required initial capacity.
                  +     */
                  +    public SubscriptionFilterList(int initialCapacity) {
                  +        super(initialCapacity);
                  +    }
                  +
                  +    /**
                  +     * Constructor that uses an ArrayList for initialization.
                  +     * 
                  +     * @param elementList The ArrayList that is used for initialization.
                  +     */
                  +    public SubscriptionFilterList(java.util.ArrayList elementList) {
                  +        for(org.ccsds.moims.mo.mal.structures.SubscriptionFilter element : elementList) {
                  +            this.add(element);
                  +        }
                  +    }
                  +
                  +    @Override
                  +    public boolean add(org.ccsds.moims.mo.mal.structures.SubscriptionFilter element) {
                  +        if (element == null) {
                  +            throw new IllegalArgumentException("The added argument cannot be null!");
                  +        }
                  +        return super.add(element);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createElement() {
                  +        return new SubscriptionFilterList();
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createTypedElement() {
                  +        return new org.ccsds.moims.mo.mal.structures.SubscriptionFilter();
                  +    }
                  +
                  +    @Override
                  +    public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        encoder.encodeHomogeneousList(this);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        decoder.decodeHomogeneousList(this);
                  +        return this;
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.TypeId getTypeId() {
                  +        return TYPE_ID;
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/SubscriptionList.java b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/SubscriptionList.java
                  new file mode 100644
                  index 00000000..d786b05b
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/SubscriptionList.java
                  @@ -0,0 +1,79 @@
                  +package org.ccsds.moims.mo.mal.structures;
                  +
                  +/**
                  + * List class for Subscription.
                  + */
                  +public final class SubscriptionList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList {
                  +
                  +    private static final long serialVersionUID = 281475043818519L;
                  +    /**
                  +     * The TypeId of this Element as a long.
                  +     */
                  +    public static final Long SHORT_FORM = 281475043818519L;
                  +    /**
                  +     * The TypeId of this Element.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM);
                  +
                  +    /**
                  +     * Default constructor for SubscriptionList.
                  +     * 
                  +     */
                  +    public SubscriptionList() {
                  +    }
                  +
                  +    /**
                  +     * Constructor that initialises the capacity of the list.
                  +     * 
                  +     * @param initialCapacity The required initial capacity.
                  +     */
                  +    public SubscriptionList(int initialCapacity) {
                  +        super(initialCapacity);
                  +    }
                  +
                  +    /**
                  +     * Constructor that uses an ArrayList for initialization.
                  +     * 
                  +     * @param elementList The ArrayList that is used for initialization.
                  +     */
                  +    public SubscriptionList(java.util.ArrayList elementList) {
                  +        for(org.ccsds.moims.mo.mal.structures.Subscription element : elementList) {
                  +            this.add(element);
                  +        }
                  +    }
                  +
                  +    @Override
                  +    public boolean add(org.ccsds.moims.mo.mal.structures.Subscription element) {
                  +        if (element == null) {
                  +            throw new IllegalArgumentException("The added argument cannot be null!");
                  +        }
                  +        return super.add(element);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createElement() {
                  +        return new SubscriptionList();
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createTypedElement() {
                  +        return new org.ccsds.moims.mo.mal.structures.Subscription();
                  +    }
                  +
                  +    @Override
                  +    public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        encoder.encodeHomogeneousList(this);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        decoder.decodeHomogeneousList(this);
                  +        return this;
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.TypeId getTypeId() {
                  +        return TYPE_ID;
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/TimeList.java b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/TimeList.java
                  new file mode 100644
                  index 00000000..fb811d29
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/TimeList.java
                  @@ -0,0 +1,79 @@
                  +package org.ccsds.moims.mo.mal.structures;
                  +
                  +/**
                  + * List class for Time.
                  + */
                  +public final class TimeList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList {
                  +
                  +    private static final long serialVersionUID = 281475043819504L;
                  +    /**
                  +     * The TypeId of this Element as a long.
                  +     */
                  +    public static final Long SHORT_FORM = 281475043819504L;
                  +    /**
                  +     * The TypeId of this Element.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM);
                  +
                  +    /**
                  +     * Default constructor for TimeList.
                  +     * 
                  +     */
                  +    public TimeList() {
                  +    }
                  +
                  +    /**
                  +     * Constructor that initialises the capacity of the list.
                  +     * 
                  +     * @param initialCapacity The required initial capacity.
                  +     */
                  +    public TimeList(int initialCapacity) {
                  +        super(initialCapacity);
                  +    }
                  +
                  +    /**
                  +     * Constructor that uses an ArrayList for initialization.
                  +     * 
                  +     * @param elementList The ArrayList that is used for initialization.
                  +     */
                  +    public TimeList(java.util.ArrayList elementList) {
                  +        for(org.ccsds.moims.mo.mal.structures.Time element : elementList) {
                  +            this.add(element);
                  +        }
                  +    }
                  +
                  +    @Override
                  +    public boolean add(org.ccsds.moims.mo.mal.structures.Time element) {
                  +        if (element == null) {
                  +            throw new IllegalArgumentException("The added argument cannot be null!");
                  +        }
                  +        return super.add(element);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createElement() {
                  +        return new TimeList();
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createTypedElement() {
                  +        return new org.ccsds.moims.mo.mal.structures.Time();
                  +    }
                  +
                  +    @Override
                  +    public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        encoder.encodeHomogeneousList(this);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        decoder.decodeHomogeneousList(this);
                  +        return this;
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.TypeId getTypeId() {
                  +        return TYPE_ID;
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/UIntegerList.java b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/UIntegerList.java
                  new file mode 100644
                  index 00000000..5252da3f
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/UIntegerList.java
                  @@ -0,0 +1,79 @@
                  +package org.ccsds.moims.mo.mal.structures;
                  +
                  +/**
                  + * List class for UInteger.
                  + */
                  +public final class UIntegerList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList {
                  +
                  +    private static final long serialVersionUID = 281475043819508L;
                  +    /**
                  +     * The TypeId of this Element as a long.
                  +     */
                  +    public static final Long SHORT_FORM = 281475043819508L;
                  +    /**
                  +     * The TypeId of this Element.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM);
                  +
                  +    /**
                  +     * Default constructor for UIntegerList.
                  +     * 
                  +     */
                  +    public UIntegerList() {
                  +    }
                  +
                  +    /**
                  +     * Constructor that initialises the capacity of the list.
                  +     * 
                  +     * @param initialCapacity The required initial capacity.
                  +     */
                  +    public UIntegerList(int initialCapacity) {
                  +        super(initialCapacity);
                  +    }
                  +
                  +    /**
                  +     * Constructor that uses an ArrayList for initialization.
                  +     * 
                  +     * @param elementList The ArrayList that is used for initialization.
                  +     */
                  +    public UIntegerList(java.util.ArrayList elementList) {
                  +        for(org.ccsds.moims.mo.mal.structures.UInteger element : elementList) {
                  +            this.add(element);
                  +        }
                  +    }
                  +
                  +    @Override
                  +    public boolean add(org.ccsds.moims.mo.mal.structures.UInteger element) {
                  +        if (element == null) {
                  +            throw new IllegalArgumentException("The added argument cannot be null!");
                  +        }
                  +        return super.add(element);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createElement() {
                  +        return new UIntegerList();
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createTypedElement() {
                  +        return new org.ccsds.moims.mo.mal.structures.UInteger();
                  +    }
                  +
                  +    @Override
                  +    public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        encoder.encodeHomogeneousList(this);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        decoder.decodeHomogeneousList(this);
                  +        return this;
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.TypeId getTypeId() {
                  +        return TYPE_ID;
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/ULongList.java b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/ULongList.java
                  new file mode 100644
                  index 00000000..7461251c
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/ULongList.java
                  @@ -0,0 +1,79 @@
                  +package org.ccsds.moims.mo.mal.structures;
                  +
                  +/**
                  + * List class for ULong.
                  + */
                  +public final class ULongList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList {
                  +
                  +    private static final long serialVersionUID = 281475043819506L;
                  +    /**
                  +     * The TypeId of this Element as a long.
                  +     */
                  +    public static final Long SHORT_FORM = 281475043819506L;
                  +    /**
                  +     * The TypeId of this Element.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM);
                  +
                  +    /**
                  +     * Default constructor for ULongList.
                  +     * 
                  +     */
                  +    public ULongList() {
                  +    }
                  +
                  +    /**
                  +     * Constructor that initialises the capacity of the list.
                  +     * 
                  +     * @param initialCapacity The required initial capacity.
                  +     */
                  +    public ULongList(int initialCapacity) {
                  +        super(initialCapacity);
                  +    }
                  +
                  +    /**
                  +     * Constructor that uses an ArrayList for initialization.
                  +     * 
                  +     * @param elementList The ArrayList that is used for initialization.
                  +     */
                  +    public ULongList(java.util.ArrayList elementList) {
                  +        for(org.ccsds.moims.mo.mal.structures.ULong element : elementList) {
                  +            this.add(element);
                  +        }
                  +    }
                  +
                  +    @Override
                  +    public boolean add(org.ccsds.moims.mo.mal.structures.ULong element) {
                  +        if (element == null) {
                  +            throw new IllegalArgumentException("The added argument cannot be null!");
                  +        }
                  +        return super.add(element);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createElement() {
                  +        return new ULongList();
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createTypedElement() {
                  +        return new org.ccsds.moims.mo.mal.structures.ULong();
                  +    }
                  +
                  +    @Override
                  +    public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        encoder.encodeHomogeneousList(this);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        decoder.decodeHomogeneousList(this);
                  +        return this;
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.TypeId getTypeId() {
                  +        return TYPE_ID;
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/UOctetList.java b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/UOctetList.java
                  new file mode 100644
                  index 00000000..9ef4ecdf
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/UOctetList.java
                  @@ -0,0 +1,79 @@
                  +package org.ccsds.moims.mo.mal.structures;
                  +
                  +/**
                  + * List class for UOctet.
                  + */
                  +public final class UOctetList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList {
                  +
                  +    private static final long serialVersionUID = 281475043819512L;
                  +    /**
                  +     * The TypeId of this Element as a long.
                  +     */
                  +    public static final Long SHORT_FORM = 281475043819512L;
                  +    /**
                  +     * The TypeId of this Element.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM);
                  +
                  +    /**
                  +     * Default constructor for UOctetList.
                  +     * 
                  +     */
                  +    public UOctetList() {
                  +    }
                  +
                  +    /**
                  +     * Constructor that initialises the capacity of the list.
                  +     * 
                  +     * @param initialCapacity The required initial capacity.
                  +     */
                  +    public UOctetList(int initialCapacity) {
                  +        super(initialCapacity);
                  +    }
                  +
                  +    /**
                  +     * Constructor that uses an ArrayList for initialization.
                  +     * 
                  +     * @param elementList The ArrayList that is used for initialization.
                  +     */
                  +    public UOctetList(java.util.ArrayList elementList) {
                  +        for(org.ccsds.moims.mo.mal.structures.UOctet element : elementList) {
                  +            this.add(element);
                  +        }
                  +    }
                  +
                  +    @Override
                  +    public boolean add(org.ccsds.moims.mo.mal.structures.UOctet element) {
                  +        if (element == null) {
                  +            throw new IllegalArgumentException("The added argument cannot be null!");
                  +        }
                  +        return super.add(element);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createElement() {
                  +        return new UOctetList();
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createTypedElement() {
                  +        return new org.ccsds.moims.mo.mal.structures.UOctet();
                  +    }
                  +
                  +    @Override
                  +    public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        encoder.encodeHomogeneousList(this);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        decoder.decodeHomogeneousList(this);
                  +        return this;
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.TypeId getTypeId() {
                  +        return TYPE_ID;
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/URIList.java b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/URIList.java
                  new file mode 100644
                  index 00000000..f3244d81
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/URIList.java
                  @@ -0,0 +1,79 @@
                  +package org.ccsds.moims.mo.mal.structures;
                  +
                  +/**
                  + * List class for URI.
                  + */
                  +public final class URIList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList {
                  +
                  +    private static final long serialVersionUID = 281475043819502L;
                  +    /**
                  +     * The TypeId of this Element as a long.
                  +     */
                  +    public static final Long SHORT_FORM = 281475043819502L;
                  +    /**
                  +     * The TypeId of this Element.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM);
                  +
                  +    /**
                  +     * Default constructor for URIList.
                  +     * 
                  +     */
                  +    public URIList() {
                  +    }
                  +
                  +    /**
                  +     * Constructor that initialises the capacity of the list.
                  +     * 
                  +     * @param initialCapacity The required initial capacity.
                  +     */
                  +    public URIList(int initialCapacity) {
                  +        super(initialCapacity);
                  +    }
                  +
                  +    /**
                  +     * Constructor that uses an ArrayList for initialization.
                  +     * 
                  +     * @param elementList The ArrayList that is used for initialization.
                  +     */
                  +    public URIList(java.util.ArrayList elementList) {
                  +        for(org.ccsds.moims.mo.mal.structures.URI element : elementList) {
                  +            this.add(element);
                  +        }
                  +    }
                  +
                  +    @Override
                  +    public boolean add(org.ccsds.moims.mo.mal.structures.URI element) {
                  +        if (element == null) {
                  +            throw new IllegalArgumentException("The added argument cannot be null!");
                  +        }
                  +        return super.add(element);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createElement() {
                  +        return new URIList();
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createTypedElement() {
                  +        return new org.ccsds.moims.mo.mal.structures.URI();
                  +    }
                  +
                  +    @Override
                  +    public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        encoder.encodeHomogeneousList(this);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        decoder.decodeHomogeneousList(this);
                  +        return this;
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.TypeId getTypeId() {
                  +        return TYPE_ID;
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/UShortList.java b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/UShortList.java
                  new file mode 100644
                  index 00000000..81db94f5
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/UShortList.java
                  @@ -0,0 +1,79 @@
                  +package org.ccsds.moims.mo.mal.structures;
                  +
                  +/**
                  + * List class for UShort.
                  + */
                  +public final class UShortList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList {
                  +
                  +    private static final long serialVersionUID = 281475043819510L;
                  +    /**
                  +     * The TypeId of this Element as a long.
                  +     */
                  +    public static final Long SHORT_FORM = 281475043819510L;
                  +    /**
                  +     * The TypeId of this Element.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM);
                  +
                  +    /**
                  +     * Default constructor for UShortList.
                  +     * 
                  +     */
                  +    public UShortList() {
                  +    }
                  +
                  +    /**
                  +     * Constructor that initialises the capacity of the list.
                  +     * 
                  +     * @param initialCapacity The required initial capacity.
                  +     */
                  +    public UShortList(int initialCapacity) {
                  +        super(initialCapacity);
                  +    }
                  +
                  +    /**
                  +     * Constructor that uses an ArrayList for initialization.
                  +     * 
                  +     * @param elementList The ArrayList that is used for initialization.
                  +     */
                  +    public UShortList(java.util.ArrayList elementList) {
                  +        for(org.ccsds.moims.mo.mal.structures.UShort element : elementList) {
                  +            this.add(element);
                  +        }
                  +    }
                  +
                  +    @Override
                  +    public boolean add(org.ccsds.moims.mo.mal.structures.UShort element) {
                  +        if (element == null) {
                  +            throw new IllegalArgumentException("The added argument cannot be null!");
                  +        }
                  +        return super.add(element);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createElement() {
                  +        return new UShortList();
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createTypedElement() {
                  +        return new org.ccsds.moims.mo.mal.structures.UShort();
                  +    }
                  +
                  +    @Override
                  +    public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        encoder.encodeHomogeneousList(this);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        decoder.decodeHomogeneousList(this);
                  +        return this;
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.TypeId getTypeId() {
                  +        return TYPE_ID;
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/UpdateHeader.java b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/UpdateHeader.java
                  new file mode 100644
                  index 00000000..9362ed1b
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/UpdateHeader.java
                  @@ -0,0 +1,166 @@
                  +package org.ccsds.moims.mo.mal.structures;
                  +
                  +/**
                  + * The UpdateHeader structure shall be used by updates using the PUBSUB Interaction
                  + * Pattern. It shall hold information that identifies a single update.
                  + */
                  +public final class UpdateHeader implements org.ccsds.moims.mo.mal.structures.Composite {
                  +
                  +    private static final long serialVersionUID = 281475027043307L;
                  +    /**
                  +     * The TypeId of this Element as a long.
                  +     */
                  +    public static final Long SHORT_FORM = 281475027043307L;
                  +    /**
                  +     * The TypeId of this Element.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM);
                  +
                  +    /**
                  +     * The source of the update, usually a PUBSUB provider.
                  +     */
                  +    private org.ccsds.moims.mo.mal.structures.Identifier source;
                  +
                  +    /**
                  +     * The domain of this update. The individual domain identifier parts shall
                  +     * not be set as the wildcard character ‘*’.
                  +     */
                  +    private org.ccsds.moims.mo.mal.structures.IdentifierList domain;
                  +
                  +    /**
                  +     * The values for the PUBSUB keys. The values shall be ordered according to
                  +     * the defined keys if the consumer subscription did not enable trimming.
                  +     */
                  +    private org.ccsds.moims.mo.mal.structures.NullableAttributeList keyValues;
                  +
                  +    /**
                  +     * Default constructor for UpdateHeader.
                  +     * 
                  +     */
                  +    public UpdateHeader() {
                  +    }
                  +
                  +    /**
                  +     * Constructor that initialises the values of the structure.
                  +     * 
                  +     * @param source The source of the update, usually a PUBSUB provider.
                  +     * @param domain The domain of this update. The individual domain identifier parts shall not be set as the wildcard character ‘*’.
                  +     * @param keyValues The values for the PUBSUB keys. The values shall be ordered according to the defined keys if the consumer subscription did not enable trimming.
                  +     */
                  +    public UpdateHeader(org.ccsds.moims.mo.mal.structures.Identifier source,
                  +            org.ccsds.moims.mo.mal.structures.IdentifierList domain,
                  +            org.ccsds.moims.mo.mal.structures.NullableAttributeList keyValues) {
                  +        this.source = source;
                  +        this.domain = domain;
                  +        this.keyValues = keyValues;
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createElement() {
                  +        return new org.ccsds.moims.mo.mal.structures.UpdateHeader();
                  +    }
                  +
                  +    /**
                  +     * Returns the field source.
                  +     * 
                  +     * @return The field source
                  +     */
                  +    public org.ccsds.moims.mo.mal.structures.Identifier getSource() {
                  +        return source;
                  +    }
                  +
                  +    /**
                  +     * Returns the field domain.
                  +     * 
                  +     * @return The field domain
                  +     */
                  +    public org.ccsds.moims.mo.mal.structures.IdentifierList getDomain() {
                  +        return domain;
                  +    }
                  +
                  +    /**
                  +     * Returns the field keyValues.
                  +     * 
                  +     * @return The field keyValues
                  +     */
                  +    public org.ccsds.moims.mo.mal.structures.NullableAttributeList getKeyValues() {
                  +        return keyValues;
                  +    }
                  +
                  +    @Override
                  +    public boolean equals(Object obj) {
                  +        if (obj instanceof UpdateHeader) {
                  +            UpdateHeader other = (UpdateHeader) obj;
                  +            if (source == null) {
                  +                if (other.source != null) {
                  +                    return false;
                  +                }
                  +            } else {
                  +                if (! source.equals(other.source)) {
                  +                    return false;
                  +                }
                  +            }
                  +            if (domain == null) {
                  +                if (other.domain != null) {
                  +                    return false;
                  +                }
                  +            } else {
                  +                if (! domain.equals(other.domain)) {
                  +                    return false;
                  +                }
                  +            }
                  +            if (keyValues == null) {
                  +                if (other.keyValues != null) {
                  +                    return false;
                  +                }
                  +            } else {
                  +                if (! keyValues.equals(other.keyValues)) {
                  +                    return false;
                  +                }
                  +            }
                  +            return true;
                  +        }
                  +        return false;
                  +    }
                  +
                  +    @Override
                  +    public int hashCode() {
                  +        int hash = 7;
                  +        hash = 83 * hash + (source != null ? source.hashCode() : 0);
                  +        hash = 83 * hash + (domain != null ? domain.hashCode() : 0);
                  +        hash = 83 * hash + (keyValues != null ? keyValues.hashCode() : 0);
                  +        return hash;
                  +    }
                  +
                  +    @Override
                  +    public String toString() {
                  +        StringBuilder buf = new StringBuilder();
                  +        buf.append("(UpdateHeader: ");
                  +        buf.append("source=").append(source);
                  +        buf.append(", domain=").append(domain);
                  +        buf.append(", keyValues=").append(keyValues);
                  +        buf.append(')');
                  +        return buf.toString();
                  +    }
                  +
                  +    @Override
                  +    public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        encoder.encodeNullableIdentifier(source);
                  +        encoder.encodeNullableElement(domain);
                  +        encoder.encodeNullableElement(keyValues);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        source = decoder.decodeNullableIdentifier();
                  +        domain = (org.ccsds.moims.mo.mal.structures.IdentifierList) decoder.decodeNullableElement(new org.ccsds.moims.mo.mal.structures.IdentifierList());
                  +        keyValues = (org.ccsds.moims.mo.mal.structures.NullableAttributeList) decoder.decodeNullableElement(new org.ccsds.moims.mo.mal.structures.NullableAttributeList());
                  +        return this;
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.TypeId getTypeId() {
                  +        return TYPE_ID;
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/UpdateHeaderList.java b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/UpdateHeaderList.java
                  new file mode 100644
                  index 00000000..9d4caefb
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/UpdateHeaderList.java
                  @@ -0,0 +1,79 @@
                  +package org.ccsds.moims.mo.mal.structures;
                  +
                  +/**
                  + * List class for UpdateHeader.
                  + */
                  +public final class UpdateHeaderList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList {
                  +
                  +    private static final long serialVersionUID = 281475043818517L;
                  +    /**
                  +     * The TypeId of this Element as a long.
                  +     */
                  +    public static final Long SHORT_FORM = 281475043818517L;
                  +    /**
                  +     * The TypeId of this Element.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM);
                  +
                  +    /**
                  +     * Default constructor for UpdateHeaderList.
                  +     * 
                  +     */
                  +    public UpdateHeaderList() {
                  +    }
                  +
                  +    /**
                  +     * Constructor that initialises the capacity of the list.
                  +     * 
                  +     * @param initialCapacity The required initial capacity.
                  +     */
                  +    public UpdateHeaderList(int initialCapacity) {
                  +        super(initialCapacity);
                  +    }
                  +
                  +    /**
                  +     * Constructor that uses an ArrayList for initialization.
                  +     * 
                  +     * @param elementList The ArrayList that is used for initialization.
                  +     */
                  +    public UpdateHeaderList(java.util.ArrayList elementList) {
                  +        for(org.ccsds.moims.mo.mal.structures.UpdateHeader element : elementList) {
                  +            this.add(element);
                  +        }
                  +    }
                  +
                  +    @Override
                  +    public boolean add(org.ccsds.moims.mo.mal.structures.UpdateHeader element) {
                  +        if (element == null) {
                  +            throw new IllegalArgumentException("The added argument cannot be null!");
                  +        }
                  +        return super.add(element);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createElement() {
                  +        return new UpdateHeaderList();
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createTypedElement() {
                  +        return new org.ccsds.moims.mo.mal.structures.UpdateHeader();
                  +    }
                  +
                  +    @Override
                  +    public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        encoder.encodeHomogeneousList(this);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        decoder.decodeHomogeneousList(this);
                  +        return this;
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.TypeId getTypeId() {
                  +        return TYPE_ID;
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/package-info.java
                  new file mode 100644
                  index 00000000..faed47f6
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area001-v003-mal/org/ccsds/moims/mo/mal/structures/package-info.java
                  @@ -0,0 +1,4 @@
                  +/**
                  + * Package containing types defined in the MAL area.
                  +*/
                  +package org.ccsds.moims.mo.mal.structures;
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/COMElementFactory.java b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/COMElementFactory.java
                  new file mode 100644
                  index 00000000..ae21b5e5
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/COMElementFactory.java
                  @@ -0,0 +1,102 @@
                  +package org.ccsds.moims.mo.com;
                  +
                  +/**
                  + * Creates the Elements of the COM area, without holding an instance of each
                  + * of them, so that the class of a type is only loaded once a message carries
                  + * that type.
                  + */
                  +public final class COMElementFactory implements org.ccsds.moims.mo.mal.AreaElementFactory {
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createElement(int serviceNumber,
                  +            int typeNumber) {
                  +        switch (serviceNumber) {
                  +            case 0: return createAreaElement(typeNumber);
                  +            case 1: return createEventElement(typeNumber);
                  +            case 2: return createArchiveElement(typeNumber);
                  +            case 3: return createActivityTrackingElement(typeNumber);
                  +            default: return null;
                  +        }
                  +    }
                  +
                  +    @Override
                  +    public int getAreaNumber() {
                  +        return 2;
                  +    }
                  +
                  +    @Override
                  +    public int getAreaVersion() {
                  +        return 1;
                  +    }
                  +
                  +    /**
                  +     * Creates an Element declared by the area itself.
                  +     * 
                  +     * @param typeNumber The typeNumber field.
                  +     */
                  +    private static org.ccsds.moims.mo.mal.structures.Element createAreaElement(int typeNumber) {
                  +        switch (typeNumber) {
                  +            case -5: return new org.ccsds.moims.mo.com.structures.InstanceBooleanPairList();
                  +            case -4: return new org.ccsds.moims.mo.com.structures.ObjectDetailsList();
                  +            case -3: return new org.ccsds.moims.mo.com.structures.ObjectIdList();
                  +            case -2: return new org.ccsds.moims.mo.com.structures.ObjectKeyList();
                  +            case -1: return new org.ccsds.moims.mo.com.structures.ObjectTypeList();
                  +            case 1: return new org.ccsds.moims.mo.com.structures.ObjectType();
                  +            case 2: return new org.ccsds.moims.mo.com.structures.ObjectKey();
                  +            case 3: return new org.ccsds.moims.mo.com.structures.ObjectId();
                  +            case 4: return new org.ccsds.moims.mo.com.structures.ObjectDetails();
                  +            case 5: return new org.ccsds.moims.mo.com.structures.InstanceBooleanPair();
                  +            default: return null;
                  +        }
                  +    }
                  +
                  +    /**
                  +     * Creates an Element declared by the Event service.
                  +     * 
                  +     * @param typeNumber The typeNumber field.
                  +     */
                  +    private static org.ccsds.moims.mo.mal.structures.Element createEventElement(int typeNumber) {
                  +        return null;
                  +    }
                  +
                  +    /**
                  +     * Creates an Element declared by the Archive service.
                  +     * 
                  +     * @param typeNumber The typeNumber field.
                  +     */
                  +    private static org.ccsds.moims.mo.mal.structures.Element createArchiveElement(int typeNumber) {
                  +        switch (typeNumber) {
                  +            case -5: return new org.ccsds.moims.mo.com.archive.structures.ExpressionOperatorList();
                  +            case -4: return new org.ccsds.moims.mo.com.archive.structures.CompositeFilterSetList();
                  +            case -3: return new org.ccsds.moims.mo.com.archive.structures.CompositeFilterList();
                  +            case -2: return new org.ccsds.moims.mo.com.archive.structures.ArchiveQueryList();
                  +            case -1: return new org.ccsds.moims.mo.com.archive.structures.ArchiveDetailsList();
                  +            case 1: return new org.ccsds.moims.mo.com.archive.structures.ArchiveDetails();
                  +            case 2: return new org.ccsds.moims.mo.com.archive.structures.ArchiveQuery();
                  +            case 3: return new org.ccsds.moims.mo.com.archive.structures.CompositeFilter();
                  +            case 4: return new org.ccsds.moims.mo.com.archive.structures.CompositeFilterSet();
                  +            case 5: return new org.ccsds.moims.mo.com.archive.structures.ExpressionOperator();
                  +            default: return null;
                  +        }
                  +    }
                  +
                  +    /**
                  +     * Creates an Element declared by the ActivityTracking service.
                  +     * 
                  +     * @param typeNumber The typeNumber field.
                  +     */
                  +    private static org.ccsds.moims.mo.mal.structures.Element createActivityTrackingElement(int typeNumber) {
                  +        switch (typeNumber) {
                  +            case -4: return new org.ccsds.moims.mo.com.activitytracking.structures.OperationActivityList();
                  +            case -3: return new org.ccsds.moims.mo.com.activitytracking.structures.ActivityExecutionList();
                  +            case -2: return new org.ccsds.moims.mo.com.activitytracking.structures.ActivityAcceptanceList();
                  +            case -1: return new org.ccsds.moims.mo.com.activitytracking.structures.ActivityTransferList();
                  +            case 1: return new org.ccsds.moims.mo.com.activitytracking.structures.ActivityTransfer();
                  +            case 2: return new org.ccsds.moims.mo.com.activitytracking.structures.ActivityAcceptance();
                  +            case 3: return new org.ccsds.moims.mo.com.activitytracking.structures.ActivityExecution();
                  +            case 4: return new org.ccsds.moims.mo.com.activitytracking.structures.OperationActivity();
                  +            default: return null;
                  +        }
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/COMHelper.java b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/COMHelper.java
                  new file mode 100644
                  index 00000000..f9e51142
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/COMHelper.java
                  @@ -0,0 +1,75 @@
                  +package org.ccsds.moims.mo.com;
                  +
                  +/**
                  + * Helper class for COM area.
                  + */
                  +public class COMHelper {
                  +
                  +    /**
                  +     * Area number literal.
                  +     */
                  +    public static final int _COM_AREA_NUMBER = 2;
                  +
                  +    /**
                  +     * Area number instance.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.structures.UShort COM_AREA_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_COM_AREA_NUMBER);
                  +
                  +    /**
                  +     * Area name constant.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.structures.Identifier COM_AREA_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("COM");
                  +
                  +    /**
                  +     * Area version literal.
                  +     */
                  +    public static final short _COM_AREA_VERSION = 1;
                  +
                  +    /**
                  +     * Area version instance.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.structures.UOctet COM_AREA_VERSION = new org.ccsds.moims.mo.mal.structures.UOctet(_COM_AREA_VERSION);
                  +
                  +    /**
                  +     * Area Elements.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.structures.Element[] COM_AREA_ELEMENTS = {};
                  +
                  +    /**
                  +     * Services in this Area.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.ServiceInfo[] COM_AREA_SERVICES = {
                  +        org.ccsds.moims.mo.com.event.EventHelper.EVENT_SERVICE,
                  +        org.ccsds.moims.mo.com.archive.ArchiveHelper.ARCHIVE_SERVICE,
                  +        org.ccsds.moims.mo.com.activitytracking.ActivityTrackingHelper.ACTIVITYTRACKING_SERVICE,};
                  +
                  +    /**
                  +     * Area singleton instance.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.MALArea COM_AREA = new org.ccsds.moims.mo.mal.MALArea(COM_AREA_NUMBER, COM_AREA_NAME, COM_AREA_VERSION, COM_AREA_ELEMENTS, COM_AREA_SERVICES, new COMElementFactory());
                  +
                  +    /**
                  +     * Error literal for error INVALID.
                  +     */
                  +    public static final long _INVALID_ERROR_NUMBER = 70000;
                  +
                  +    /**
                  +     * Error instance for error INVALID.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.structures.UInteger INVALID_ERROR_NUMBER = new org.ccsds.moims.mo.mal.structures.UInteger(_INVALID_ERROR_NUMBER);
                  +
                  +    /**
                  +     * Error literal for error DUPLICATE.
                  +     */
                  +    public static final long _DUPLICATE_ERROR_NUMBER = 70001;
                  +
                  +    /**
                  +     * Error instance for error DUPLICATE.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.structures.UInteger DUPLICATE_ERROR_NUMBER = new org.ccsds.moims.mo.mal.structures.UInteger(_DUPLICATE_ERROR_NUMBER);
                  +
                  +    private COMHelper() {
                  +        // Utility class; not meant to be instantiated.
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/DuplicateException.java b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/DuplicateException.java
                  new file mode 100644
                  index 00000000..40c80a31
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/DuplicateException.java
                  @@ -0,0 +1,27 @@
                  +package org.ccsds.moims.mo.com;
                  +
                  +/**
                  + * The DuplicateException exception. Operation specific.
                  + */
                  +public final class DuplicateException extends org.ccsds.moims.mo.mal.MOErrorException {
                  +
                  +    private static final String MO_ERROR_NAME = "DUPLICATE";
                  +
                  +    /**
                  +     * Constructs a new DuplicateException exception.
                  +     * 
                  +     */
                  +    public DuplicateException() {
                  +        super(MO_ERROR_NAME, COMHelper.DUPLICATE_ERROR_NUMBER, "");
                  +    }
                  +
                  +    /**
                  +     * Constructs a new DuplicateException exception.
                  +     * 
                  +     * @param extraInformation The extraInformation of the exception.
                  +     */
                  +    public DuplicateException(Object extraInformation) {
                  +        super(MO_ERROR_NAME, COMHelper.DUPLICATE_ERROR_NUMBER, extraInformation);
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/InvalidException.java b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/InvalidException.java
                  new file mode 100644
                  index 00000000..7121c088
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/InvalidException.java
                  @@ -0,0 +1,27 @@
                  +package org.ccsds.moims.mo.com;
                  +
                  +/**
                  + * The InvalidException exception. Operation specific.
                  + */
                  +public final class InvalidException extends org.ccsds.moims.mo.mal.MOErrorException {
                  +
                  +    private static final String MO_ERROR_NAME = "INVALID";
                  +
                  +    /**
                  +     * Constructs a new InvalidException exception.
                  +     * 
                  +     */
                  +    public InvalidException() {
                  +        super(MO_ERROR_NAME, COMHelper.INVALID_ERROR_NUMBER, "");
                  +    }
                  +
                  +    /**
                  +     * Constructs a new InvalidException exception.
                  +     * 
                  +     * @param extraInformation The extraInformation of the exception.
                  +     */
                  +    public InvalidException(Object extraInformation) {
                  +        super(MO_ERROR_NAME, COMHelper.INVALID_ERROR_NUMBER, extraInformation);
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/activitytracking/ActivityTrackingHelper.java b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/activitytracking/ActivityTrackingHelper.java
                  new file mode 100644
                  index 00000000..1cb20ca1
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/activitytracking/ActivityTrackingHelper.java
                  @@ -0,0 +1,17 @@
                  +package org.ccsds.moims.mo.com.activitytracking;
                  +
                  +/**
                  + * Helper class for ActivityTracking service.
                  + */
                  +public class ActivityTrackingHelper {
                  +
                  +    /**
                  +     * Service singleton instance.
                  +     */
                  +    public static final org.ccsds.moims.mo.com.activitytracking.ActivityTrackingServiceInfo ACTIVITYTRACKING_SERVICE = new org.ccsds.moims.mo.com.activitytracking.ActivityTrackingServiceInfo();
                  +
                  +    private ActivityTrackingHelper() {
                  +        // Utility class; not meant to be instantiated.
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/activitytracking/ActivityTrackingServiceInfo.java b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/activitytracking/ActivityTrackingServiceInfo.java
                  new file mode 100644
                  index 00000000..1e964920
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/activitytracking/ActivityTrackingServiceInfo.java
                  @@ -0,0 +1,255 @@
                  +package org.ccsds.moims.mo.com.activitytracking;
                  +
                  +/**
                  + * Helper class for ActivityTracking service.
                  + */
                  +public class ActivityTrackingServiceInfo extends org.ccsds.moims.mo.com.COMService {
                  +
                  +    /**
                  +     * Service number literal.
                  +     */
                  +    public static final int _ACTIVITYTRACKING_SERVICE_NUMBER = 3;
                  +
                  +    /**
                  +     * Service number instance.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.structures.UShort ACTIVITYTRACKING_SERVICE_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_ACTIVITYTRACKING_SERVICE_NUMBER);
                  +
                  +    /**
                  +     * Service name constant.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.structures.Identifier ACTIVITYTRACKING_SERVICE_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("ActivityTracking");
                  +
                  +    /**
                  +     * The service key of this service.
                  +     */
                  +    private static final org.ccsds.moims.mo.mal.ServiceKey SERVICE_KEY = new org.ccsds.moims.mo.mal.ServiceKey(
                  +            2, 1, ACTIVITYTRACKING_SERVICE_NUMBER);
                  +
                  +    /**
                  +     * Area elements.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.structures.Element[] ACTIVITYTRACKING_SERVICE_ELEMENTS = {};
                  +
                  +    /**
                  +     * The set of operations for this service.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.MALOperation[] OPERATIONS = new org.ccsds.moims.mo.mal.MALOperation[]{};
                  +
                  +    /**
                  +     * Literal for object OPERATIONACTIVITY.
                  +     */
                  +    @Deprecated
                  +    public static final int _OPERATIONACTIVITY_OBJECT_NUMBER = 6;
                  +
                  +    /**
                  +     * Instance for object OPERATIONACTIVITY.
                  +     */
                  +    @Deprecated
                  +    public static final org.ccsds.moims.mo.mal.structures.UShort OPERATIONACTIVITY_OBJECT_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_OPERATIONACTIVITY_OBJECT_NUMBER);
                  +
                  +    /**
                  +     * Object name constant.
                  +     */
                  +    @Deprecated
                  +    public static final org.ccsds.moims.mo.mal.structures.Identifier OPERATIONACTIVITY_OBJECT_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("OperationActivity");
                  +
                  +    /**
                  +     * Object type constant.
                  +     */
                  +    @Deprecated
                  +    public static final org.ccsds.moims.mo.com.structures.ObjectType OPERATIONACTIVITY_OBJECT_TYPE = new org.ccsds.moims.mo.com.structures.ObjectType(new org.ccsds.moims.mo.mal.structures.UShort(2), ACTIVITYTRACKING_SERVICE_NUMBER, new org.ccsds.moims.mo.mal.structures.UOctet(1), OPERATIONACTIVITY_OBJECT_NUMBER);
                  +
                  +    /**
                  +     * Object instance.
                  +     */
                  +    @Deprecated
                  +    public static org.ccsds.moims.mo.com.COMObject OPERATIONACTIVITY_OBJECT = new org.ccsds.moims.mo.com.COMObject(OPERATIONACTIVITY_OBJECT_TYPE, OPERATIONACTIVITY_OBJECT_NAME, org.ccsds.moims.mo.com.activitytracking.structures.OperationActivity.SHORT_FORM, false, null, false, null, false);
                  +
                  +    /**
                  +     * Literal for object RELEASE.
                  +     */
                  +    @Deprecated
                  +    public static final int _RELEASE_OBJECT_NUMBER = 1;
                  +
                  +    /**
                  +     * Instance for object RELEASE.
                  +     */
                  +    @Deprecated
                  +    public static final org.ccsds.moims.mo.mal.structures.UShort RELEASE_OBJECT_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_RELEASE_OBJECT_NUMBER);
                  +
                  +    /**
                  +     * Object name constant.
                  +     */
                  +    @Deprecated
                  +    public static final org.ccsds.moims.mo.mal.structures.Identifier RELEASE_OBJECT_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("Release");
                  +
                  +    /**
                  +     * Object type constant.
                  +     */
                  +    @Deprecated
                  +    public static final org.ccsds.moims.mo.com.structures.ObjectType RELEASE_OBJECT_TYPE = new org.ccsds.moims.mo.com.structures.ObjectType(new org.ccsds.moims.mo.mal.structures.UShort(2), ACTIVITYTRACKING_SERVICE_NUMBER, new org.ccsds.moims.mo.mal.structures.UOctet(1), RELEASE_OBJECT_NUMBER);
                  +
                  +    /**
                  +     * Object instance.
                  +     */
                  +    @Deprecated
                  +    public static org.ccsds.moims.mo.com.COMObject RELEASE_OBJECT = new org.ccsds.moims.mo.com.COMObject(RELEASE_OBJECT_TYPE, RELEASE_OBJECT_NAME, org.ccsds.moims.mo.com.activitytracking.structures.ActivityTransfer.SHORT_FORM, false, null, true, null, true);
                  +
                  +    /**
                  +     * Literal for object RECEPTION.
                  +     */
                  +    @Deprecated
                  +    public static final int _RECEPTION_OBJECT_NUMBER = 2;
                  +
                  +    /**
                  +     * Instance for object RECEPTION.
                  +     */
                  +    @Deprecated
                  +    public static final org.ccsds.moims.mo.mal.structures.UShort RECEPTION_OBJECT_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_RECEPTION_OBJECT_NUMBER);
                  +
                  +    /**
                  +     * Object name constant.
                  +     */
                  +    @Deprecated
                  +    public static final org.ccsds.moims.mo.mal.structures.Identifier RECEPTION_OBJECT_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("Reception");
                  +
                  +    /**
                  +     * Object type constant.
                  +     */
                  +    @Deprecated
                  +    public static final org.ccsds.moims.mo.com.structures.ObjectType RECEPTION_OBJECT_TYPE = new org.ccsds.moims.mo.com.structures.ObjectType(new org.ccsds.moims.mo.mal.structures.UShort(2), ACTIVITYTRACKING_SERVICE_NUMBER, new org.ccsds.moims.mo.mal.structures.UOctet(1), RECEPTION_OBJECT_NUMBER);
                  +
                  +    /**
                  +     * Object instance.
                  +     */
                  +    @Deprecated
                  +    public static org.ccsds.moims.mo.com.COMObject RECEPTION_OBJECT = new org.ccsds.moims.mo.com.COMObject(RECEPTION_OBJECT_TYPE, RECEPTION_OBJECT_NAME, org.ccsds.moims.mo.com.activitytracking.structures.ActivityTransfer.SHORT_FORM, false, null, true, null, true);
                  +
                  +    /**
                  +     * Literal for object FORWARD.
                  +     */
                  +    @Deprecated
                  +    public static final int _FORWARD_OBJECT_NUMBER = 3;
                  +
                  +    /**
                  +     * Instance for object FORWARD.
                  +     */
                  +    @Deprecated
                  +    public static final org.ccsds.moims.mo.mal.structures.UShort FORWARD_OBJECT_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_FORWARD_OBJECT_NUMBER);
                  +
                  +    /**
                  +     * Object name constant.
                  +     */
                  +    @Deprecated
                  +    public static final org.ccsds.moims.mo.mal.structures.Identifier FORWARD_OBJECT_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("Forward");
                  +
                  +    /**
                  +     * Object type constant.
                  +     */
                  +    @Deprecated
                  +    public static final org.ccsds.moims.mo.com.structures.ObjectType FORWARD_OBJECT_TYPE = new org.ccsds.moims.mo.com.structures.ObjectType(new org.ccsds.moims.mo.mal.structures.UShort(2), ACTIVITYTRACKING_SERVICE_NUMBER, new org.ccsds.moims.mo.mal.structures.UOctet(1), FORWARD_OBJECT_NUMBER);
                  +
                  +    /**
                  +     * Object instance.
                  +     */
                  +    @Deprecated
                  +    public static org.ccsds.moims.mo.com.COMObject FORWARD_OBJECT = new org.ccsds.moims.mo.com.COMObject(FORWARD_OBJECT_TYPE, FORWARD_OBJECT_NAME, org.ccsds.moims.mo.com.activitytracking.structures.ActivityTransfer.SHORT_FORM, false, null, true, null, true);
                  +
                  +    /**
                  +     * Literal for object ACCEPTANCE.
                  +     */
                  +    @Deprecated
                  +    public static final int _ACCEPTANCE_OBJECT_NUMBER = 4;
                  +
                  +    /**
                  +     * Instance for object ACCEPTANCE.
                  +     */
                  +    @Deprecated
                  +    public static final org.ccsds.moims.mo.mal.structures.UShort ACCEPTANCE_OBJECT_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_ACCEPTANCE_OBJECT_NUMBER);
                  +
                  +    /**
                  +     * Object name constant.
                  +     */
                  +    @Deprecated
                  +    public static final org.ccsds.moims.mo.mal.structures.Identifier ACCEPTANCE_OBJECT_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("Acceptance");
                  +
                  +    /**
                  +     * Object type constant.
                  +     */
                  +    @Deprecated
                  +    public static final org.ccsds.moims.mo.com.structures.ObjectType ACCEPTANCE_OBJECT_TYPE = new org.ccsds.moims.mo.com.structures.ObjectType(new org.ccsds.moims.mo.mal.structures.UShort(2), ACTIVITYTRACKING_SERVICE_NUMBER, new org.ccsds.moims.mo.mal.structures.UOctet(1), ACCEPTANCE_OBJECT_NUMBER);
                  +
                  +    /**
                  +     * Object instance.
                  +     */
                  +    @Deprecated
                  +    public static org.ccsds.moims.mo.com.COMObject ACCEPTANCE_OBJECT = new org.ccsds.moims.mo.com.COMObject(ACCEPTANCE_OBJECT_TYPE, ACCEPTANCE_OBJECT_NAME, org.ccsds.moims.mo.com.activitytracking.structures.ActivityAcceptance.SHORT_FORM, false, null, true, null, true);
                  +
                  +    /**
                  +     * Literal for object EXECUTION.
                  +     */
                  +    @Deprecated
                  +    public static final int _EXECUTION_OBJECT_NUMBER = 5;
                  +
                  +    /**
                  +     * Instance for object EXECUTION.
                  +     */
                  +    @Deprecated
                  +    public static final org.ccsds.moims.mo.mal.structures.UShort EXECUTION_OBJECT_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_EXECUTION_OBJECT_NUMBER);
                  +
                  +    /**
                  +     * Object name constant.
                  +     */
                  +    @Deprecated
                  +    public static final org.ccsds.moims.mo.mal.structures.Identifier EXECUTION_OBJECT_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("Execution");
                  +
                  +    /**
                  +     * Object type constant.
                  +     */
                  +    @Deprecated
                  +    public static final org.ccsds.moims.mo.com.structures.ObjectType EXECUTION_OBJECT_TYPE = new org.ccsds.moims.mo.com.structures.ObjectType(new org.ccsds.moims.mo.mal.structures.UShort(2), ACTIVITYTRACKING_SERVICE_NUMBER, new org.ccsds.moims.mo.mal.structures.UOctet(1), EXECUTION_OBJECT_NUMBER);
                  +
                  +    /**
                  +     * Object instance.
                  +     */
                  +    @Deprecated
                  +    public static org.ccsds.moims.mo.com.COMObject EXECUTION_OBJECT = new org.ccsds.moims.mo.com.COMObject(EXECUTION_OBJECT_TYPE, EXECUTION_OBJECT_NAME, org.ccsds.moims.mo.com.activitytracking.structures.ActivityExecution.SHORT_FORM, false, null, true, null, true);
                  +
                  +    /**
                  +     * Object instance.
                  +     */
                  +    public static final org.ccsds.moims.mo.com.COMObject[] COM_OBJECTS = {
                  +        OPERATIONACTIVITY_OBJECT,
                  +        RELEASE_OBJECT,
                  +        RECEPTION_OBJECT,
                  +        FORWARD_OBJECT,
                  +        ACCEPTANCE_OBJECT,
                  +        EXECUTION_OBJECT,};
                  +
                  +    /**
                  +     * Creates an instance of the ActivityTracking ServiceInfo.
                  +     * 
                  +     */
                  +    public ActivityTrackingServiceInfo() {
                  +        super(SERVICE_KEY, ACTIVITYTRACKING_SERVICE_NAME, ACTIVITYTRACKING_SERVICE_ELEMENTS, OPERATIONS, COM_OBJECTS);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.MALArea getArea() {
                  +        return org.ccsds.moims.mo.com.COMHelper.COM_AREA;
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.MOErrorException generateMOError(int errorNumber,
                  +            Object extraInfo) {
                  +        switch (errorNumber) {
                  +            case 70000:
                  +                return new org.ccsds.moims.mo.com.InvalidException(extraInfo);
                  +            case 70001:
                  +                return new org.ccsds.moims.mo.com.DuplicateException(extraInfo);
                  +        }
                  +        return null;
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/activitytracking/consumer/ActivityTrackingAdapter.java b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/activitytracking/consumer/ActivityTrackingAdapter.java
                  new file mode 100644
                  index 00000000..134142c9
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/activitytracking/consumer/ActivityTrackingAdapter.java
                  @@ -0,0 +1,8 @@
                  +package org.ccsds.moims.mo.com.activitytracking.consumer;
                  +
                  +/**
                  + * Consumer adapter for ActivityTracking service.
                  + */
                  +public abstract class ActivityTrackingAdapter extends org.ccsds.moims.mo.mal.consumer.MALInteractionAdapter {
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/activitytracking/consumer/ActivityTrackingStub.java b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/activitytracking/consumer/ActivityTrackingStub.java
                  new file mode 100644
                  index 00000000..f91d9546
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/activitytracking/consumer/ActivityTrackingStub.java
                  @@ -0,0 +1,33 @@
                  +package org.ccsds.moims.mo.com.activitytracking.consumer;
                  +
                  +/**
                  + * Consumer stub for ActivityTracking service.
                  + */
                  +public class ActivityTrackingStub {
                  +
                  +    /**
                  +     * The consumer field.
                  +     */
                  +    private final org.ccsds.moims.mo.mal.consumer.MALConsumer consumer;
                  +
                  +    /**
                  +     * Wraps a MALconsumer connection with service specific methods that map from
                  +     * the high level service API to the generic MAL API.
                  +     * 
                  +     * @param consumer consumer The MALConsumer to use in this stub.
                  +     */
                  +    public ActivityTrackingStub(org.ccsds.moims.mo.mal.consumer.MALConsumer consumer) {
                  +        this.consumer = consumer;
                  +    }
                  +
                  +    /**
                  +     * Returns the internal MAL consumer object used for sending of messages from
                  +     * this interface.
                  +     * 
                  +     * @return The MAL consumer object.
                  +     */
                  +    public org.ccsds.moims.mo.mal.consumer.MALConsumer getConsumer() {
                  +        return consumer;
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/activitytracking/consumer/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/activitytracking/consumer/package-info.java
                  new file mode 100644
                  index 00000000..d3e33805
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/activitytracking/consumer/package-info.java
                  @@ -0,0 +1,4 @@
                  +/**
                  + * Package containing the consumer stubs for the ActivityTracking service.
                  +*/
                  +package org.ccsds.moims.mo.com.activitytracking.consumer;
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/activitytracking/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/activitytracking/package-info.java
                  new file mode 100644
                  index 00000000..6f93315f
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/activitytracking/package-info.java
                  @@ -0,0 +1,9 @@
                  +/**
                  + * The activity tracking service provides the ability to monitor the progress
                  + * of activities; an activity is anything that has a measurable period of
                  + * time (a command, a remote procedure, a schedule etc). It defines an event
                  + * pattern that supports the monitoring of activities from the initial consumer
                  + * request, tracking its progress across a transport link, to reception by
                  + * the provider and execution in that provider.
                  +*/
                  +package org.ccsds.moims.mo.com.activitytracking;
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/activitytracking/provider/ActivityTrackingHandler.java b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/activitytracking/provider/ActivityTrackingHandler.java
                  new file mode 100644
                  index 00000000..c3950801
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/activitytracking/provider/ActivityTrackingHandler.java
                  @@ -0,0 +1,15 @@
                  +package org.ccsds.moims.mo.com.activitytracking.provider;
                  +
                  +/**
                  + * Interface that providers of the ActivityTracking service must implement
                  + * to handle the operations of that service.
                  + */
                  +public interface ActivityTrackingHandler {
                  +
                  +    /**
                  +     * Sets the skeleton to be used for creation of publishers.
                  +     * 
                  +     * @param skeleton The skeleton to be used.
                  +     */
                  +    void setSkeleton(org.ccsds.moims.mo.com.activitytracking.provider.ActivityTrackingSkeleton skeleton);
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/activitytracking/provider/ActivityTrackingInheritanceSkeleton.java b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/activitytracking/provider/ActivityTrackingInheritanceSkeleton.java
                  new file mode 100644
                  index 00000000..6a003e50
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/activitytracking/provider/ActivityTrackingInheritanceSkeleton.java
                  @@ -0,0 +1,101 @@
                  +package org.ccsds.moims.mo.com.activitytracking.provider;
                  +
                  +/**
                  + * Provider Inheritance skeleton for ActivityTrackingInheritanceSkeleton service.
                  + */
                  +public abstract class ActivityTrackingInheritanceSkeleton implements org.ccsds.moims.mo.mal.provider.MALInteractionHandler, org.ccsds.moims.mo.com.activitytracking.provider.ActivityTrackingSkeleton, org.ccsds.moims.mo.com.activitytracking.provider.ActivityTrackingHandler {
                  +
                  +    /**
                  +     * The providerSet field.
                  +     */
                  +    private org.ccsds.moims.mo.mal.provider.MALProviderSet providerSet = new org.ccsds.moims.mo.mal.provider.MALProviderSet(org.ccsds.moims.mo.com.activitytracking.ActivityTrackingHelper.ACTIVITYTRACKING_SERVICE);
                  +
                  +    /**
                  +     * Returns the connection object for this provider.
                  +     * 
                  +     * @return the connection object for this provider
                  +     * @throws java.io.IOException if the method was not implemented yet.
                  +     */
                  +    public org.ccsds.moims.mo.mal.helpertools.connections.ConnectionProvider getConnection() throws java.io.IOException {
                  +        throw new java.io.IOException("This method needs to be overridden!");
                  +    }
                  +
                  +    @Override
                  +    public void setSkeleton(org.ccsds.moims.mo.com.activitytracking.provider.ActivityTrackingSkeleton skeleton) {
                  +        // Not used in the inheritance pattern (the skeleton is 'this');
                  +    }
                  +
                  +    @Override
                  +    public void malInitialize(org.ccsds.moims.mo.mal.provider.MALProvider provider) throws org.ccsds.moims.mo.mal.MALException {
                  +        providerSet.addProvider(provider);
                  +    }
                  +
                  +    @Override
                  +    public void malFinalize(org.ccsds.moims.mo.mal.provider.MALProvider provider) throws org.ccsds.moims.mo.mal.MALException {
                  +        providerSet.removeProvider(provider);
                  +    }
                  +
                  +    @Override
                  +    public void handleSend(org.ccsds.moims.mo.mal.provider.MALInteraction interaction,
                  +            org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException {
                  +        int opNumber = interaction.getOperation().getNumber().getValue();
                  +        switch (opNumber) {
                  +          default:
                  +            throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException(
                  +                    org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber));
                  +        }
                  +    }
                  +
                  +    @Override
                  +    public void handleSubmit(org.ccsds.moims.mo.mal.provider.MALSubmit interaction,
                  +            org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException {
                  +        int opNumber = interaction.getOperation().getNumber().getValue();
                  +        switch (opNumber) {
                  +          default:
                  +            interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException(
                  +                    org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber));
                  +            throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException(
                  +                    org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber));
                  +        }
                  +    }
                  +
                  +    @Override
                  +    public void handleRequest(org.ccsds.moims.mo.mal.provider.MALRequest interaction,
                  +            org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException {
                  +        int opNumber = interaction.getOperation().getNumber().getValue();
                  +        switch (opNumber) {
                  +          default:
                  +            interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException(
                  +                    org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber));
                  +            throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException(
                  +                    org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber));
                  +        }
                  +    }
                  +
                  +    @Override
                  +    public void handleInvoke(org.ccsds.moims.mo.mal.provider.MALInvoke interaction,
                  +            org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException {
                  +        int opNumber = interaction.getOperation().getNumber().getValue();
                  +        switch (opNumber) {
                  +          default:
                  +            interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException(
                  +                    org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber));
                  +            throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException(
                  +                    org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber));
                  +        }
                  +    }
                  +
                  +    @Override
                  +    public void handleProgress(org.ccsds.moims.mo.mal.provider.MALProgress interaction,
                  +            org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException {
                  +        int opNumber = interaction.getOperation().getNumber().getValue();
                  +        switch (opNumber) {
                  +          default:
                  +            interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException(
                  +                    org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber));
                  +            throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException(
                  +                    org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber));
                  +        }
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/activitytracking/provider/ActivityTrackingSkeleton.java b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/activitytracking/provider/ActivityTrackingSkeleton.java
                  new file mode 100644
                  index 00000000..47f4e634
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/activitytracking/provider/ActivityTrackingSkeleton.java
                  @@ -0,0 +1,8 @@
                  +package org.ccsds.moims.mo.com.activitytracking.provider;
                  +
                  +/**
                  + * The skeleton interface for the ActivityTracking service.
                  + */
                  +public interface ActivityTrackingSkeleton {
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/activitytracking/provider/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/activitytracking/provider/package-info.java
                  new file mode 100644
                  index 00000000..7d56379b
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/activitytracking/provider/package-info.java
                  @@ -0,0 +1,4 @@
                  +/**
                  + * Package containing the provider skeletons for the ActivityTracking service.
                  +*/
                  +package org.ccsds.moims.mo.com.activitytracking.provider;
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/activitytracking/structures/ActivityAcceptance.java b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/activitytracking/structures/ActivityAcceptance.java
                  new file mode 100644
                  index 00000000..fc039188
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/activitytracking/structures/ActivityAcceptance.java
                  @@ -0,0 +1,106 @@
                  +package org.ccsds.moims.mo.com.activitytracking.structures;
                  +
                  +/**
                  + * The structure is used to hold details of an Acceptance event.
                  + */
                  +public final class ActivityAcceptance implements org.ccsds.moims.mo.mal.structures.Composite {
                  +
                  +    private static final long serialVersionUID = 562962855100418L;
                  +    /**
                  +     * The TypeId of this Element as a long.
                  +     */
                  +    public static final Long SHORT_FORM = 562962855100418L;
                  +    /**
                  +     * The TypeId of this Element.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM);
                  +
                  +    /**
                  +     * The success result of this stage, TRUE if successful, FALSE otherwise.
                  +     */
                  +    private Boolean success;
                  +
                  +    /**
                  +     * Default constructor for ActivityAcceptance.
                  +     * 
                  +     */
                  +    public ActivityAcceptance() {
                  +    }
                  +
                  +    /**
                  +     * Constructor that initialises the values of the structure.
                  +     * 
                  +     * @param success The success result of this stage, TRUE if successful, FALSE otherwise.
                  +     */
                  +    public ActivityAcceptance(Boolean success) {
                  +        this.success = success;
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createElement() {
                  +        return new org.ccsds.moims.mo.com.activitytracking.structures.ActivityAcceptance();
                  +    }
                  +
                  +    /**
                  +     * Returns the field success.
                  +     * 
                  +     * @return The field success
                  +     */
                  +    public Boolean getSuccess() {
                  +        return success;
                  +    }
                  +
                  +    @Override
                  +    public boolean equals(Object obj) {
                  +        if (obj instanceof ActivityAcceptance) {
                  +            ActivityAcceptance other = (ActivityAcceptance) obj;
                  +            if (success == null) {
                  +                if (other.success != null) {
                  +                    return false;
                  +                }
                  +            } else {
                  +                if (! success.equals(other.success)) {
                  +                    return false;
                  +                }
                  +            }
                  +            return true;
                  +        }
                  +        return false;
                  +    }
                  +
                  +    @Override
                  +    public int hashCode() {
                  +        int hash = 7;
                  +        hash = 83 * hash + (success != null ? success.hashCode() : 0);
                  +        return hash;
                  +    }
                  +
                  +    @Override
                  +    public String toString() {
                  +        StringBuilder buf = new StringBuilder();
                  +        buf.append("(ActivityAcceptance: ");
                  +        buf.append("success=").append(success);
                  +        buf.append(')');
                  +        return buf.toString();
                  +    }
                  +
                  +    @Override
                  +    public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        if (success == null) {
                  +            throw new org.ccsds.moims.mo.mal.MALException("The field 'success' cannot be null!");
                  +        }
                  +        encoder.encodeBoolean(success);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        success = decoder.decodeBoolean();
                  +        return this;
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.TypeId getTypeId() {
                  +        return TYPE_ID;
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/activitytracking/structures/ActivityAcceptanceList.java b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/activitytracking/structures/ActivityAcceptanceList.java
                  new file mode 100644
                  index 00000000..fedeb5dd
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/activitytracking/structures/ActivityAcceptanceList.java
                  @@ -0,0 +1,79 @@
                  +package org.ccsds.moims.mo.com.activitytracking.structures;
                  +
                  +/**
                  + * List class for ActivityAcceptance.
                  + */
                  +public final class ActivityAcceptanceList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList {
                  +
                  +    private static final long serialVersionUID = 562962871877630L;
                  +    /**
                  +     * The TypeId of this Element as a long.
                  +     */
                  +    public static final Long SHORT_FORM = 562962871877630L;
                  +    /**
                  +     * The TypeId of this Element.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM);
                  +
                  +    /**
                  +     * Default constructor for ActivityAcceptanceList.
                  +     * 
                  +     */
                  +    public ActivityAcceptanceList() {
                  +    }
                  +
                  +    /**
                  +     * Constructor that initialises the capacity of the list.
                  +     * 
                  +     * @param initialCapacity The required initial capacity.
                  +     */
                  +    public ActivityAcceptanceList(int initialCapacity) {
                  +        super(initialCapacity);
                  +    }
                  +
                  +    /**
                  +     * Constructor that uses an ArrayList for initialization.
                  +     * 
                  +     * @param elementList The ArrayList that is used for initialization.
                  +     */
                  +    public ActivityAcceptanceList(java.util.ArrayList elementList) {
                  +        for(org.ccsds.moims.mo.com.activitytracking.structures.ActivityAcceptance element : elementList) {
                  +            this.add(element);
                  +        }
                  +    }
                  +
                  +    @Override
                  +    public boolean add(org.ccsds.moims.mo.com.activitytracking.structures.ActivityAcceptance element) {
                  +        if (element == null) {
                  +            throw new IllegalArgumentException("The added argument cannot be null!");
                  +        }
                  +        return super.add(element);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createElement() {
                  +        return new ActivityAcceptanceList();
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createTypedElement() {
                  +        return new org.ccsds.moims.mo.com.activitytracking.structures.ActivityAcceptance();
                  +    }
                  +
                  +    @Override
                  +    public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        encoder.encodeHomogeneousList(this);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        decoder.decodeHomogeneousList(this);
                  +        return this;
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.TypeId getTypeId() {
                  +        return TYPE_ID;
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/activitytracking/structures/ActivityExecution.java b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/activitytracking/structures/ActivityExecution.java
                  new file mode 100644
                  index 00000000..a9e7248c
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/activitytracking/structures/ActivityExecution.java
                  @@ -0,0 +1,173 @@
                  +package org.ccsds.moims.mo.com.activitytracking.structures;
                  +
                  +/**
                  + * The structure is used to report the execution status of an activity in
                  + * the final destination.
                  + */
                  +public final class ActivityExecution implements org.ccsds.moims.mo.mal.structures.Composite {
                  +
                  +    private static final long serialVersionUID = 562962855100419L;
                  +    /**
                  +     * The TypeId of this Element as a long.
                  +     */
                  +    public static final Long SHORT_FORM = 562962855100419L;
                  +    /**
                  +     * The TypeId of this Element.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM);
                  +
                  +    /**
                  +     * The success result of this stage, TRUE if successful, FALSE otherwise.
                  +     */
                  +    private Boolean success;
                  +
                  +    /**
                  +     * The execution stage of the operation.
                  +     */
                  +    private org.ccsds.moims.mo.mal.structures.UInteger executionStage;
                  +
                  +    /**
                  +     * The total number of execution stages that will be reported.
                  +     */
                  +    private org.ccsds.moims.mo.mal.structures.UInteger stageCount;
                  +
                  +    /**
                  +     * Default constructor for ActivityExecution.
                  +     * 
                  +     */
                  +    public ActivityExecution() {
                  +    }
                  +
                  +    /**
                  +     * Constructor that initialises the values of the structure.
                  +     * 
                  +     * @param success The success result of this stage, TRUE if successful, FALSE otherwise.
                  +     * @param executionStage The execution stage of the operation.
                  +     * @param stageCount The total number of execution stages that will be reported.
                  +     */
                  +    public ActivityExecution(Boolean success,
                  +            org.ccsds.moims.mo.mal.structures.UInteger executionStage,
                  +            org.ccsds.moims.mo.mal.structures.UInteger stageCount) {
                  +        this.success = success;
                  +        this.executionStage = executionStage;
                  +        this.stageCount = stageCount;
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createElement() {
                  +        return new org.ccsds.moims.mo.com.activitytracking.structures.ActivityExecution();
                  +    }
                  +
                  +    /**
                  +     * Returns the field success.
                  +     * 
                  +     * @return The field success
                  +     */
                  +    public Boolean getSuccess() {
                  +        return success;
                  +    }
                  +
                  +    /**
                  +     * Returns the field executionStage.
                  +     * 
                  +     * @return The field executionStage
                  +     */
                  +    public org.ccsds.moims.mo.mal.structures.UInteger getExecutionStage() {
                  +        return executionStage;
                  +    }
                  +
                  +    /**
                  +     * Returns the field stageCount.
                  +     * 
                  +     * @return The field stageCount
                  +     */
                  +    public org.ccsds.moims.mo.mal.structures.UInteger getStageCount() {
                  +        return stageCount;
                  +    }
                  +
                  +    @Override
                  +    public boolean equals(Object obj) {
                  +        if (obj instanceof ActivityExecution) {
                  +            ActivityExecution other = (ActivityExecution) obj;
                  +            if (success == null) {
                  +                if (other.success != null) {
                  +                    return false;
                  +                }
                  +            } else {
                  +                if (! success.equals(other.success)) {
                  +                    return false;
                  +                }
                  +            }
                  +            if (executionStage == null) {
                  +                if (other.executionStage != null) {
                  +                    return false;
                  +                }
                  +            } else {
                  +                if (! executionStage.equals(other.executionStage)) {
                  +                    return false;
                  +                }
                  +            }
                  +            if (stageCount == null) {
                  +                if (other.stageCount != null) {
                  +                    return false;
                  +                }
                  +            } else {
                  +                if (! stageCount.equals(other.stageCount)) {
                  +                    return false;
                  +                }
                  +            }
                  +            return true;
                  +        }
                  +        return false;
                  +    }
                  +
                  +    @Override
                  +    public int hashCode() {
                  +        int hash = 7;
                  +        hash = 83 * hash + (success != null ? success.hashCode() : 0);
                  +        hash = 83 * hash + (executionStage != null ? executionStage.hashCode() : 0);
                  +        hash = 83 * hash + (stageCount != null ? stageCount.hashCode() : 0);
                  +        return hash;
                  +    }
                  +
                  +    @Override
                  +    public String toString() {
                  +        StringBuilder buf = new StringBuilder();
                  +        buf.append("(ActivityExecution: ");
                  +        buf.append("success=").append(success);
                  +        buf.append(", executionStage=").append(executionStage);
                  +        buf.append(", stageCount=").append(stageCount);
                  +        buf.append(')');
                  +        return buf.toString();
                  +    }
                  +
                  +    @Override
                  +    public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        if (success == null) {
                  +            throw new org.ccsds.moims.mo.mal.MALException("The field 'success' cannot be null!");
                  +        }
                  +        if (executionStage == null) {
                  +            throw new org.ccsds.moims.mo.mal.MALException("The field 'executionStage' cannot be null!");
                  +        }
                  +        if (stageCount == null) {
                  +            throw new org.ccsds.moims.mo.mal.MALException("The field 'stageCount' cannot be null!");
                  +        }
                  +        encoder.encodeBoolean(success);
                  +        encoder.encodeUInteger(executionStage);
                  +        encoder.encodeUInteger(stageCount);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        success = decoder.decodeBoolean();
                  +        executionStage = decoder.decodeUInteger();
                  +        stageCount = decoder.decodeUInteger();
                  +        return this;
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.TypeId getTypeId() {
                  +        return TYPE_ID;
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/activitytracking/structures/ActivityExecutionList.java b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/activitytracking/structures/ActivityExecutionList.java
                  new file mode 100644
                  index 00000000..ba2ac724
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/activitytracking/structures/ActivityExecutionList.java
                  @@ -0,0 +1,79 @@
                  +package org.ccsds.moims.mo.com.activitytracking.structures;
                  +
                  +/**
                  + * List class for ActivityExecution.
                  + */
                  +public final class ActivityExecutionList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList {
                  +
                  +    private static final long serialVersionUID = 562962871877629L;
                  +    /**
                  +     * The TypeId of this Element as a long.
                  +     */
                  +    public static final Long SHORT_FORM = 562962871877629L;
                  +    /**
                  +     * The TypeId of this Element.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM);
                  +
                  +    /**
                  +     * Default constructor for ActivityExecutionList.
                  +     * 
                  +     */
                  +    public ActivityExecutionList() {
                  +    }
                  +
                  +    /**
                  +     * Constructor that initialises the capacity of the list.
                  +     * 
                  +     * @param initialCapacity The required initial capacity.
                  +     */
                  +    public ActivityExecutionList(int initialCapacity) {
                  +        super(initialCapacity);
                  +    }
                  +
                  +    /**
                  +     * Constructor that uses an ArrayList for initialization.
                  +     * 
                  +     * @param elementList The ArrayList that is used for initialization.
                  +     */
                  +    public ActivityExecutionList(java.util.ArrayList elementList) {
                  +        for(org.ccsds.moims.mo.com.activitytracking.structures.ActivityExecution element : elementList) {
                  +            this.add(element);
                  +        }
                  +    }
                  +
                  +    @Override
                  +    public boolean add(org.ccsds.moims.mo.com.activitytracking.structures.ActivityExecution element) {
                  +        if (element == null) {
                  +            throw new IllegalArgumentException("The added argument cannot be null!");
                  +        }
                  +        return super.add(element);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createElement() {
                  +        return new ActivityExecutionList();
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createTypedElement() {
                  +        return new org.ccsds.moims.mo.com.activitytracking.structures.ActivityExecution();
                  +    }
                  +
                  +    @Override
                  +    public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        encoder.encodeHomogeneousList(this);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        decoder.decodeHomogeneousList(this);
                  +        return this;
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.TypeId getTypeId() {
                  +        return TYPE_ID;
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/activitytracking/structures/ActivityTransfer.java b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/activitytracking/structures/ActivityTransfer.java
                  new file mode 100644
                  index 00000000..eaf8439d
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/activitytracking/structures/ActivityTransfer.java
                  @@ -0,0 +1,183 @@
                  +package org.ccsds.moims.mo.com.activitytracking.structures;
                  +
                  +/**
                  + * The structure holds details for a Release, Reception, or Forward event
                  + * of an activity.
                  + */
                  +public final class ActivityTransfer implements org.ccsds.moims.mo.mal.structures.Composite {
                  +
                  +    private static final long serialVersionUID = 562962855100417L;
                  +    /**
                  +     * The TypeId of this Element as a long.
                  +     */
                  +    public static final Long SHORT_FORM = 562962855100417L;
                  +    /**
                  +     * The TypeId of this Element.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM);
                  +
                  +    /**
                  +     * The success result of this stage, TRUE if successful, FALSE otherwise.
                  +     * If this is TRUE then the next two fields should be populated.
                  +     */
                  +    private Boolean success;
                  +
                  +    /**
                  +     * The estimated amount of time it will take to be received by the next destination
                  +     * if Release or Forward. Contains the estimated amount of time it will take
                  +     * to be forwarded by this relay if Reception event. May be NULL if unknown
                  +     * or cannot be calculated.
                  +     */
                  +    private org.ccsds.moims.mo.mal.structures.Duration estimateDuration;
                  +
                  +    /**
                  +     * This contains the URI of the next destination, either another relay or
                  +     * the provider. It is protocol specific how this value is derived.
                  +     */
                  +    private org.ccsds.moims.mo.mal.structures.URI nextDestination;
                  +
                  +    /**
                  +     * Default constructor for ActivityTransfer.
                  +     * 
                  +     */
                  +    public ActivityTransfer() {
                  +    }
                  +
                  +    /**
                  +     * Constructor that initialises the values of the structure.
                  +     * 
                  +     * @param success The success result of this stage, TRUE if successful, FALSE otherwise. If this is TRUE then the next two fields should be populated.
                  +     * @param estimateDuration The estimated amount of time it will take to be received by the next destination if Release or Forward. Contains the estimated amount of time it will take to be forwarded by this relay if Reception event. May be NULL if unknown or cannot be calculated.
                  +     * @param nextDestination This contains the URI of the next destination, either another relay or the provider. It is protocol specific how this value is derived.
                  +     */
                  +    public ActivityTransfer(Boolean success,
                  +            org.ccsds.moims.mo.mal.structures.Duration estimateDuration,
                  +            org.ccsds.moims.mo.mal.structures.URI nextDestination) {
                  +        this.success = success;
                  +        this.estimateDuration = estimateDuration;
                  +        this.nextDestination = nextDestination;
                  +    }
                  +
                  +    /**
                  +     * Constructor that initialises the non-nullable values of the structure.
                  +     * 
                  +     * @param success The success result of this stage, TRUE if successful, FALSE otherwise. If this is TRUE then the next two fields should be populated.
                  +     */
                  +    public ActivityTransfer(Boolean success) {
                  +        this.success = success;
                  +        this.estimateDuration = null;
                  +        this.nextDestination = null;
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createElement() {
                  +        return new org.ccsds.moims.mo.com.activitytracking.structures.ActivityTransfer();
                  +    }
                  +
                  +    /**
                  +     * Returns the field success.
                  +     * 
                  +     * @return The field success
                  +     */
                  +    public Boolean getSuccess() {
                  +        return success;
                  +    }
                  +
                  +    /**
                  +     * Returns the field estimateDuration.
                  +     * 
                  +     * @return The field estimateDuration
                  +     */
                  +    public org.ccsds.moims.mo.mal.structures.Duration getEstimateDuration() {
                  +        return estimateDuration;
                  +    }
                  +
                  +    /**
                  +     * Returns the field nextDestination.
                  +     * 
                  +     * @return The field nextDestination
                  +     */
                  +    public org.ccsds.moims.mo.mal.structures.URI getNextDestination() {
                  +        return nextDestination;
                  +    }
                  +
                  +    @Override
                  +    public boolean equals(Object obj) {
                  +        if (obj instanceof ActivityTransfer) {
                  +            ActivityTransfer other = (ActivityTransfer) obj;
                  +            if (success == null) {
                  +                if (other.success != null) {
                  +                    return false;
                  +                }
                  +            } else {
                  +                if (! success.equals(other.success)) {
                  +                    return false;
                  +                }
                  +            }
                  +            if (estimateDuration == null) {
                  +                if (other.estimateDuration != null) {
                  +                    return false;
                  +                }
                  +            } else {
                  +                if (! estimateDuration.equals(other.estimateDuration)) {
                  +                    return false;
                  +                }
                  +            }
                  +            if (nextDestination == null) {
                  +                if (other.nextDestination != null) {
                  +                    return false;
                  +                }
                  +            } else {
                  +                if (! nextDestination.equals(other.nextDestination)) {
                  +                    return false;
                  +                }
                  +            }
                  +            return true;
                  +        }
                  +        return false;
                  +    }
                  +
                  +    @Override
                  +    public int hashCode() {
                  +        int hash = 7;
                  +        hash = 83 * hash + (success != null ? success.hashCode() : 0);
                  +        hash = 83 * hash + (estimateDuration != null ? estimateDuration.hashCode() : 0);
                  +        hash = 83 * hash + (nextDestination != null ? nextDestination.hashCode() : 0);
                  +        return hash;
                  +    }
                  +
                  +    @Override
                  +    public String toString() {
                  +        StringBuilder buf = new StringBuilder();
                  +        buf.append("(ActivityTransfer: ");
                  +        buf.append("success=").append(success);
                  +        buf.append(", estimateDuration=").append(estimateDuration);
                  +        buf.append(", nextDestination=").append(nextDestination);
                  +        buf.append(')');
                  +        return buf.toString();
                  +    }
                  +
                  +    @Override
                  +    public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        if (success == null) {
                  +            throw new org.ccsds.moims.mo.mal.MALException("The field 'success' cannot be null!");
                  +        }
                  +        encoder.encodeBoolean(success);
                  +        encoder.encodeNullableDuration(estimateDuration);
                  +        encoder.encodeNullableURI(nextDestination);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        success = decoder.decodeBoolean();
                  +        estimateDuration = decoder.decodeNullableDuration();
                  +        nextDestination = decoder.decodeNullableURI();
                  +        return this;
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.TypeId getTypeId() {
                  +        return TYPE_ID;
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/activitytracking/structures/ActivityTransferList.java b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/activitytracking/structures/ActivityTransferList.java
                  new file mode 100644
                  index 00000000..35e4ad89
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/activitytracking/structures/ActivityTransferList.java
                  @@ -0,0 +1,79 @@
                  +package org.ccsds.moims.mo.com.activitytracking.structures;
                  +
                  +/**
                  + * List class for ActivityTransfer.
                  + */
                  +public final class ActivityTransferList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList {
                  +
                  +    private static final long serialVersionUID = 562962871877631L;
                  +    /**
                  +     * The TypeId of this Element as a long.
                  +     */
                  +    public static final Long SHORT_FORM = 562962871877631L;
                  +    /**
                  +     * The TypeId of this Element.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM);
                  +
                  +    /**
                  +     * Default constructor for ActivityTransferList.
                  +     * 
                  +     */
                  +    public ActivityTransferList() {
                  +    }
                  +
                  +    /**
                  +     * Constructor that initialises the capacity of the list.
                  +     * 
                  +     * @param initialCapacity The required initial capacity.
                  +     */
                  +    public ActivityTransferList(int initialCapacity) {
                  +        super(initialCapacity);
                  +    }
                  +
                  +    /**
                  +     * Constructor that uses an ArrayList for initialization.
                  +     * 
                  +     * @param elementList The ArrayList that is used for initialization.
                  +     */
                  +    public ActivityTransferList(java.util.ArrayList elementList) {
                  +        for(org.ccsds.moims.mo.com.activitytracking.structures.ActivityTransfer element : elementList) {
                  +            this.add(element);
                  +        }
                  +    }
                  +
                  +    @Override
                  +    public boolean add(org.ccsds.moims.mo.com.activitytracking.structures.ActivityTransfer element) {
                  +        if (element == null) {
                  +            throw new IllegalArgumentException("The added argument cannot be null!");
                  +        }
                  +        return super.add(element);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createElement() {
                  +        return new ActivityTransferList();
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createTypedElement() {
                  +        return new org.ccsds.moims.mo.com.activitytracking.structures.ActivityTransfer();
                  +    }
                  +
                  +    @Override
                  +    public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        encoder.encodeHomogeneousList(this);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        decoder.decodeHomogeneousList(this);
                  +        return this;
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.TypeId getTypeId() {
                  +        return TYPE_ID;
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/activitytracking/structures/OperationActivity.java b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/activitytracking/structures/OperationActivity.java
                  new file mode 100644
                  index 00000000..54952e2d
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/activitytracking/structures/OperationActivity.java
                  @@ -0,0 +1,107 @@
                  +package org.ccsds.moims.mo.com.activitytracking.structures;
                  +
                  +/**
                  + * The OperationActivity structure contains the details of a MAL operation
                  + * activity.
                  + */
                  +public final class OperationActivity implements org.ccsds.moims.mo.mal.structures.Composite {
                  +
                  +    private static final long serialVersionUID = 562962855100420L;
                  +    /**
                  +     * The TypeId of this Element as a long.
                  +     */
                  +    public static final Long SHORT_FORM = 562962855100420L;
                  +    /**
                  +     * The TypeId of this Element.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM);
                  +
                  +    /**
                  +     * The interaction type of the original operation message header.
                  +     */
                  +    private org.ccsds.moims.mo.mal.structures.InteractionType interactionType;
                  +
                  +    /**
                  +     * Default constructor for OperationActivity.
                  +     * 
                  +     */
                  +    public OperationActivity() {
                  +    }
                  +
                  +    /**
                  +     * Constructor that initialises the values of the structure.
                  +     * 
                  +     * @param interactionType The interaction type of the original operation message header.
                  +     */
                  +    public OperationActivity(org.ccsds.moims.mo.mal.structures.InteractionType interactionType) {
                  +        this.interactionType = interactionType;
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createElement() {
                  +        return new org.ccsds.moims.mo.com.activitytracking.structures.OperationActivity();
                  +    }
                  +
                  +    /**
                  +     * Returns the field interactionType.
                  +     * 
                  +     * @return The field interactionType
                  +     */
                  +    public org.ccsds.moims.mo.mal.structures.InteractionType getInteractionType() {
                  +        return interactionType;
                  +    }
                  +
                  +    @Override
                  +    public boolean equals(Object obj) {
                  +        if (obj instanceof OperationActivity) {
                  +            OperationActivity other = (OperationActivity) obj;
                  +            if (interactionType == null) {
                  +                if (other.interactionType != null) {
                  +                    return false;
                  +                }
                  +            } else {
                  +                if (! interactionType.equals(other.interactionType)) {
                  +                    return false;
                  +                }
                  +            }
                  +            return true;
                  +        }
                  +        return false;
                  +    }
                  +
                  +    @Override
                  +    public int hashCode() {
                  +        int hash = 7;
                  +        hash = 83 * hash + (interactionType != null ? interactionType.hashCode() : 0);
                  +        return hash;
                  +    }
                  +
                  +    @Override
                  +    public String toString() {
                  +        StringBuilder buf = new StringBuilder();
                  +        buf.append("(OperationActivity: ");
                  +        buf.append("interactionType=").append(interactionType);
                  +        buf.append(')');
                  +        return buf.toString();
                  +    }
                  +
                  +    @Override
                  +    public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        if (interactionType == null) {
                  +            throw new org.ccsds.moims.mo.mal.MALException("The field 'interactionType' cannot be null!");
                  +        }
                  +        encoder.encodeElement(interactionType);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        interactionType = (org.ccsds.moims.mo.mal.structures.InteractionType) decoder.decodeElement(org.ccsds.moims.mo.mal.structures.InteractionType.SEND);
                  +        return this;
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.TypeId getTypeId() {
                  +        return TYPE_ID;
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/activitytracking/structures/OperationActivityList.java b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/activitytracking/structures/OperationActivityList.java
                  new file mode 100644
                  index 00000000..52efb706
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/activitytracking/structures/OperationActivityList.java
                  @@ -0,0 +1,79 @@
                  +package org.ccsds.moims.mo.com.activitytracking.structures;
                  +
                  +/**
                  + * List class for OperationActivity.
                  + */
                  +public final class OperationActivityList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList {
                  +
                  +    private static final long serialVersionUID = 562962871877628L;
                  +    /**
                  +     * The TypeId of this Element as a long.
                  +     */
                  +    public static final Long SHORT_FORM = 562962871877628L;
                  +    /**
                  +     * The TypeId of this Element.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM);
                  +
                  +    /**
                  +     * Default constructor for OperationActivityList.
                  +     * 
                  +     */
                  +    public OperationActivityList() {
                  +    }
                  +
                  +    /**
                  +     * Constructor that initialises the capacity of the list.
                  +     * 
                  +     * @param initialCapacity The required initial capacity.
                  +     */
                  +    public OperationActivityList(int initialCapacity) {
                  +        super(initialCapacity);
                  +    }
                  +
                  +    /**
                  +     * Constructor that uses an ArrayList for initialization.
                  +     * 
                  +     * @param elementList The ArrayList that is used for initialization.
                  +     */
                  +    public OperationActivityList(java.util.ArrayList elementList) {
                  +        for(org.ccsds.moims.mo.com.activitytracking.structures.OperationActivity element : elementList) {
                  +            this.add(element);
                  +        }
                  +    }
                  +
                  +    @Override
                  +    public boolean add(org.ccsds.moims.mo.com.activitytracking.structures.OperationActivity element) {
                  +        if (element == null) {
                  +            throw new IllegalArgumentException("The added argument cannot be null!");
                  +        }
                  +        return super.add(element);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createElement() {
                  +        return new OperationActivityList();
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createTypedElement() {
                  +        return new org.ccsds.moims.mo.com.activitytracking.structures.OperationActivity();
                  +    }
                  +
                  +    @Override
                  +    public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        encoder.encodeHomogeneousList(this);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        decoder.decodeHomogeneousList(this);
                  +        return this;
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.TypeId getTypeId() {
                  +        return TYPE_ID;
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/activitytracking/structures/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/activitytracking/structures/package-info.java
                  new file mode 100644
                  index 00000000..2b76617e
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/activitytracking/structures/package-info.java
                  @@ -0,0 +1,4 @@
                  +/**
                  + * Package containing types defined in the ActivityTracking service.
                  +*/
                  +package org.ccsds.moims.mo.com.activitytracking.structures;
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/ArchiveHelper.java b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/ArchiveHelper.java
                  new file mode 100644
                  index 00000000..b5d22b77
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/ArchiveHelper.java
                  @@ -0,0 +1,17 @@
                  +package org.ccsds.moims.mo.com.archive;
                  +
                  +/**
                  + * Helper class for Archive service.
                  + */
                  +public class ArchiveHelper {
                  +
                  +    /**
                  +     * Service singleton instance.
                  +     */
                  +    public static final org.ccsds.moims.mo.com.archive.ArchiveServiceInfo ARCHIVE_SERVICE = new org.ccsds.moims.mo.com.archive.ArchiveServiceInfo();
                  +
                  +    private ArchiveHelper() {
                  +        // Utility class; not meant to be instantiated.
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/ArchiveServiceInfo.java b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/ArchiveServiceInfo.java
                  new file mode 100644
                  index 00000000..92d68e74
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/ArchiveServiceInfo.java
                  @@ -0,0 +1,331 @@
                  +package org.ccsds.moims.mo.com.archive;
                  +
                  +/**
                  + * Helper class for Archive service.
                  + */
                  +public class ArchiveServiceInfo extends org.ccsds.moims.mo.com.COMService {
                  +
                  +    /**
                  +     * Service number literal.
                  +     */
                  +    public static final int _ARCHIVE_SERVICE_NUMBER = 2;
                  +
                  +    /**
                  +     * Service number instance.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.structures.UShort ARCHIVE_SERVICE_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_ARCHIVE_SERVICE_NUMBER);
                  +
                  +    /**
                  +     * Service name constant.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.structures.Identifier ARCHIVE_SERVICE_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("Archive");
                  +
                  +    /**
                  +     * The service key of this service.
                  +     */
                  +    private static final org.ccsds.moims.mo.mal.ServiceKey SERVICE_KEY = new org.ccsds.moims.mo.mal.ServiceKey(
                  +            2, 1, ARCHIVE_SERVICE_NUMBER);
                  +
                  +    /**
                  +     * Operation number literal for operation RETRIEVE.
                  +     */
                  +    public static final int _RETRIEVE_OP_NUMBER = 1;
                  +
                  +    /**
                  +     * Operation number instance for operation RETRIEVE.
                  +     */
                  +    private static final org.ccsds.moims.mo.mal.structures.UShort RETRIEVE_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_RETRIEVE_OP_NUMBER);
                  +
                  +    /**
                  +     * Operation instance for operation RETRIEVE.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.MALInvokeOperation RETRIEVE_OP = new org.ccsds.moims.mo.mal.MALInvokeOperation(SERVICE_KEY, 
                  +            RETRIEVE_OP_NUMBER, 
                  +            new org.ccsds.moims.mo.mal.structures.Identifier("retrieve"), 
                  +            new org.ccsds.moims.mo.mal.structures.UShort(1), 
                  +            new org.ccsds.moims.mo.mal.OperationField[] {
                  +                new org.ccsds.moims.mo.mal.OperationField("objType", true, org.ccsds.moims.mo.com.structures.ObjectType.SHORT_FORM, "The first part of the request shall contain the type of the object required.\nIf any of the fields of the object type contains the wildcard value of '0' then an INVALID error shall be returned.\nThe second part of the request shall contain the domain to match.\nIf the domain contains the wildcard value of '*' then an INVALID error shall be returned.\nThe third part of the request shall contain the list of object instance identifiers to match.\nIf the object instance identifier list contains the wildcard value '0' then all object instances shall be matched.\nIf any explicitly requested object cannot be matched then an UNKNOWN error shall be returned."),
                  +                new org.ccsds.moims.mo.mal.OperationField("domain", true, org.ccsds.moims.mo.mal.structures.IdentifierList.SHORT_FORM, null),
                  +                new org.ccsds.moims.mo.mal.OperationField("objInstIds", true, org.ccsds.moims.mo.mal.structures.LongList.SHORT_FORM, null)}, 
                  +            new org.ccsds.moims.mo.mal.OperationField[] {}, 
                  +            new org.ccsds.moims.mo.mal.OperationField[] {
                  +                new org.ccsds.moims.mo.mal.OperationField("objDetails", true, org.ccsds.moims.mo.com.archive.structures.ArchiveDetailsList.SHORT_FORM, "The response shall contain the set of matched objects.\nThe first returned list shall contain the matched object instance identifiers and object details of the matched objects.\nThe second returned list shall contain the object bodies ordered identically to the first list unless no body for the object is declared in the service specification, in which case a NULL replaces the complete list.\nThere shall be an entry in each returned list for each matched object.\nWhen no objects have been matched only a response with NULL for each part of the response shall be returned.\nThe ordering of the returned objects is not specified and implementation specific.\nIf ordering of the returned objects is required then the query operation should be used instead."),
                  +                new org.ccsds.moims.mo.mal.OperationField("objBodies", true, null, null)}, 
                  +            "Retrieves a set of objects identified by their object instance identifier.");
                  +
                  +    /**
                  +     * Operation number literal for operation QUERY.
                  +     */
                  +    public static final int _QUERY_OP_NUMBER = 2;
                  +
                  +    /**
                  +     * Operation number instance for operation QUERY.
                  +     */
                  +    private static final org.ccsds.moims.mo.mal.structures.UShort QUERY_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_QUERY_OP_NUMBER);
                  +
                  +    /**
                  +     * Operation instance for operation QUERY.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.MALProgressOperation QUERY_OP = new org.ccsds.moims.mo.mal.MALProgressOperation(SERVICE_KEY, 
                  +            QUERY_OP_NUMBER, 
                  +            new org.ccsds.moims.mo.mal.structures.Identifier("query"), 
                  +            new org.ccsds.moims.mo.mal.structures.UShort(1), 
                  +            new org.ccsds.moims.mo.mal.OperationField[] {
                  +                new org.ccsds.moims.mo.mal.OperationField("returnBody", true, org.ccsds.moims.mo.mal.structures.Attribute.BOOLEAN_SHORT_FORM, "The first part of the request shall contain a Boolean that if set to TRUE requests that the body of the objects is returned otherwise only the ObjectType and ArchiveDetails shall be returned and the returned list of the bodies of the objects shall be replaced with a NULL.\nThe second part of the request shall contain the type of the object required.\nEach part of the object type may contain the wildcard value of '0'.\nThe third and fourth parts of the request shall contain the queries to evaluate.\nA single query shall be formed by the combination of an ArchiveQuery from the first list and a QueryFilter from the second list.\nThe two lists shall be ordered identically so that the query and the filter parts can be matched together.\nIf a query does not contain a QueryFilter part then that entry in the QueryFilter list shall be replaced with a NULL value.\nIf the request does not contain any QueryFilters then the complete list may be replaced with a NULL.\nThe size of the two lists must be the same unless the complete second list is replaced with a NULL otherwise an INVALID error shall be raised.\nFor each query, the ArchiveQuery and the QueryFilter shall contain the COM object fields to filter on.\nThe ArchiveQuery may contain the wildcard value of NULL on each of the fields.\nIf an ArchiveQuery contains an end time but no start time then it shall match the single object that has a timestamp closest to, but not greater than, the end time field.\nThe end time field may specify a time in the future.\nIf the sortFieldName of the ArchiveQuery does not reference a defined field then an INVALID error shall be returned.\nEach query shall be evaluated separately from each other, the filter of one query will not affect the filter of another. This forms a logical OR operation.\nIf the QueryFilter contains an error then an INVALID error shall be returned. The definition of erroneous values are filter specific and defined in the relevant filter structure specification."),
                  +                new org.ccsds.moims.mo.mal.OperationField("objType", true, org.ccsds.moims.mo.com.structures.ObjectType.SHORT_FORM, null),
                  +                new org.ccsds.moims.mo.mal.OperationField("archiveQuery", true, org.ccsds.moims.mo.com.archive.structures.ArchiveQueryList.SHORT_FORM, null),
                  +                new org.ccsds.moims.mo.mal.OperationField("queryFilter", true, null, null)}, 
                  +            new org.ccsds.moims.mo.mal.OperationField[] {}, 
                  +            new org.ccsds.moims.mo.mal.OperationField[] {
                  +                new org.ccsds.moims.mo.mal.OperationField("objType", true, org.ccsds.moims.mo.com.structures.ObjectType.SHORT_FORM, null),
                  +                new org.ccsds.moims.mo.mal.OperationField("domain", true, org.ccsds.moims.mo.mal.structures.IdentifierList.SHORT_FORM, null),
                  +                new org.ccsds.moims.mo.mal.OperationField("objDetails", true, org.ccsds.moims.mo.com.archive.structures.ArchiveDetailsList.SHORT_FORM, null),
                  +                new org.ccsds.moims.mo.mal.OperationField("objBodies", true, null, null)}, 
                  +            new org.ccsds.moims.mo.mal.OperationField[] {
                  +                new org.ccsds.moims.mo.mal.OperationField("objType", true, org.ccsds.moims.mo.com.structures.ObjectType.SHORT_FORM, "The updates and the responses shall contain the set of matched objects.\nIf a wildcard was used in the ObjectType part of the request then the updates and response shall contain the ObjectType of each matched object.\nIf there was not any wildcards in the ObjectType part of the request the ObjectType in the updates and response shall be replaced by a NULL.\nThe first returned list shall contain the domain of the objects being returned.\nIf multiple ObjectTypes or domains have been matched then multiple Update message may be returned.\nThere shall be an entry in the second and third lists for each matched object.\nThe second returned list shall contain the archive details stored for the matched objects.\nIf the initial Boolean of the request was True the third returned list shall contain the bodies of the objects.\nIf the initial Boolean of the request was NULL or False the third returned list shall be replaced by a NULL.\nThe returned lists shall be sorted based on the sorting options specified in ArchiveQuery.\nEach domain/object type pair shall be sorted separately from other domain/object type pairs, there is no requirement for sorting to be applied across domain/object type pairs.\nWhen the field being sorted on contains a NULL value, or does not exist in the matched object (due to a containing composite being NULL), these entries shall be added to the end of the returned list in the order that they are matched.\nWhen no objects have been matched only a response with NULL for each part of the response shall be returned."),
                  +                new org.ccsds.moims.mo.mal.OperationField("domain", true, org.ccsds.moims.mo.mal.structures.IdentifierList.SHORT_FORM, null),
                  +                new org.ccsds.moims.mo.mal.OperationField("objDetails", true, org.ccsds.moims.mo.com.archive.structures.ArchiveDetailsList.SHORT_FORM, null),
                  +                new org.ccsds.moims.mo.mal.OperationField("objBodies", true, null, null)}, 
                  +            "Retrieves a set of object instance identifiers, and optionally the object bodies, from a list of supplied queries. The PROGRESS interaction pattern is used as the returned set of data may be quite large and this allows it to be split over several MAL messages.");
                  +
                  +    /**
                  +     * Operation number literal for operation COUNT.
                  +     */
                  +    public static final int _COUNT_OP_NUMBER = 3;
                  +
                  +    /**
                  +     * Operation number instance for operation COUNT.
                  +     */
                  +    private static final org.ccsds.moims.mo.mal.structures.UShort COUNT_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_COUNT_OP_NUMBER);
                  +
                  +    /**
                  +     * Operation instance for operation COUNT.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.MALInvokeOperation COUNT_OP = new org.ccsds.moims.mo.mal.MALInvokeOperation(SERVICE_KEY, 
                  +            COUNT_OP_NUMBER, 
                  +            new org.ccsds.moims.mo.mal.structures.Identifier("count"), 
                  +            new org.ccsds.moims.mo.mal.structures.UShort(1), 
                  +            new org.ccsds.moims.mo.mal.OperationField[] {
                  +                new org.ccsds.moims.mo.mal.OperationField("objType", true, org.ccsds.moims.mo.com.structures.ObjectType.SHORT_FORM, "The ObjectType, ArchiveQuery and QueryFilter parts of the request shall be populated exactly the same as for the query operation."),
                  +                new org.ccsds.moims.mo.mal.OperationField("archiveQuery", true, org.ccsds.moims.mo.com.archive.structures.ArchiveQueryList.SHORT_FORM, null),
                  +                new org.ccsds.moims.mo.mal.OperationField("queryFilter", true, null, null)}, 
                  +            new org.ccsds.moims.mo.mal.OperationField[] {}, 
                  +            new org.ccsds.moims.mo.mal.OperationField[] {
                  +                new org.ccsds.moims.mo.mal.OperationField("counts", true, org.ccsds.moims.mo.mal.structures.LongList.SHORT_FORM, "The response shall contain the count of matched objects.\nThere shall be an entry in each returned list for each entry in the request list.\nThe returned lists shall be ordered the same as the request query lists so that the response can be matched to the corresponding request.")}, 
                  +            "Counts the set of objects based on a supplied query.");
                  +
                  +    /**
                  +     * Operation number literal for operation STORE.
                  +     */
                  +    public static final int _STORE_OP_NUMBER = 4;
                  +
                  +    /**
                  +     * Operation number instance for operation STORE.
                  +     */
                  +    private static final org.ccsds.moims.mo.mal.structures.UShort STORE_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_STORE_OP_NUMBER);
                  +
                  +    /**
                  +     * Operation instance for operation STORE.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.MALRequestOperation STORE_OP = new org.ccsds.moims.mo.mal.MALRequestOperation(SERVICE_KEY, 
                  +            STORE_OP_NUMBER, 
                  +            new org.ccsds.moims.mo.mal.structures.Identifier("store"), 
                  +            new org.ccsds.moims.mo.mal.structures.UShort(2), 
                  +            new org.ccsds.moims.mo.mal.OperationField[] {
                  +                new org.ccsds.moims.mo.mal.OperationField("returnObjInstIds", true, org.ccsds.moims.mo.mal.structures.Attribute.BOOLEAN_SHORT_FORM, "The first part of the request indicates whether the operation should return the object instance identifiers used, if TRUE it shall return them, otherwise it returns NULL.\nThe second part of the request shall contain the type of object being stored.\nThe third part of the request shall contain the domain of the objects being stored.\nThe fourth part of the request shall contain the list of archive details to use, one for each object being stored.\nIf the object instance identifier supplied in the archive details is set to 0 then the store operation shall allocate a new and unused object instance identifier.\nIf the object instance identifier supplied in the archive details is not set to 0 and is currently used in the archive then a DUPLICATE error is returned and no objects from the request shall be stored.\nThe fifth part of the request shall contain the list of objects to store.\nThe fourth and fifth list must be the same size as there is only one entry in each for each object to be stored. If they differ in size an INVALID error is returned with the extra error information integer giving the index of the list entry without a matching entry in the other list.\nAn INVALID error shall be returned if a wildcard value of '0' is used in the object type.\nAn INVALID error shall be returned if a wildcard value of '*' is used in the domain identifier list.\nAn INVALID error shall be returned if the values of '0', '*', or NULL are used in the network, timestamp or provider fields of the archive details except for the object instance identifier.\nThe type of the body of the object should be checked against the declared type in the relevant service specification, if different an INVALID error is raised.\nIf any error is returned then the store operation shall be rolled back and nothing is stored as a result of the operation."),
                  +                new org.ccsds.moims.mo.mal.OperationField("objType", true, org.ccsds.moims.mo.com.structures.ObjectType.SHORT_FORM, null),
                  +                new org.ccsds.moims.mo.mal.OperationField("domain", true, org.ccsds.moims.mo.mal.structures.IdentifierList.SHORT_FORM, null),
                  +                new org.ccsds.moims.mo.mal.OperationField("objDetails", true, org.ccsds.moims.mo.com.archive.structures.ArchiveDetailsList.SHORT_FORM, null),
                  +                new org.ccsds.moims.mo.mal.OperationField("objBodies", true, null, null)}, 
                  +            new org.ccsds.moims.mo.mal.OperationField[] {
                  +                new org.ccsds.moims.mo.mal.OperationField("objInstIds", true, org.ccsds.moims.mo.mal.structures.LongList.SHORT_FORM, "The response shall contain the set of new object instance identifiers if the request supplied an initial TRUE Boolean value, otherwise it returns NULL.\nThe returned list shall be ordered identically to the submitted list so that the returned object instance identifiers can be mapped to the correct objects.")}, 
                  +            "Stores new objects in the archive and causes an ObjectStored event to be published by the archive.\nWhen new objects are being stored in an archive by a service provider the archive service provider is capable of allocating an unused object instance identifier for the objects being stored. The returned object instance identifier should be used by the service provider for identifying the object instances to its consumer to ensure that only a single object instance identifier is used for each object instance.");
                  +
                  +    /**
                  +     * Operation number literal for operation UPDATE.
                  +     */
                  +    public static final int _UPDATE_OP_NUMBER = 5;
                  +
                  +    /**
                  +     * Operation number instance for operation UPDATE.
                  +     */
                  +    private static final org.ccsds.moims.mo.mal.structures.UShort UPDATE_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_UPDATE_OP_NUMBER);
                  +
                  +    /**
                  +     * Operation instance for operation UPDATE.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.MALSubmitOperation UPDATE_OP = new org.ccsds.moims.mo.mal.MALSubmitOperation(SERVICE_KEY, 
                  +            UPDATE_OP_NUMBER, 
                  +            new org.ccsds.moims.mo.mal.structures.Identifier("update"), 
                  +            new org.ccsds.moims.mo.mal.structures.UShort(3), 
                  +            new org.ccsds.moims.mo.mal.OperationField[] {
                  +                new org.ccsds.moims.mo.mal.OperationField("objType", true, org.ccsds.moims.mo.com.structures.ObjectType.SHORT_FORM, "The first part of the request shall contain the type of object being updated.\nThe second part of the request shall contain the domain of the objects being updated.\nThe third part of the request shall contain the list of ArchiveDetails.\nThe object instance identifier contained in the ArchiveDetails, combined with the object type and domain from the request, shall be used to match objects.\nIf requested object cannot be matched then an UNKNOWN error shall be returned and nothing will be updated.\nThe remainder of the ArchiveDetails shall be used to update the matched objects.\nThe fourth part of the request shall contain the list of objects to replace the matched objects with.\nNo wildcard values shall be accepted in the object type, the domain, and the object instance identifier, an INVALID error is returned in this case and no objects are updated."),
                  +                new org.ccsds.moims.mo.mal.OperationField("domain", true, org.ccsds.moims.mo.mal.structures.IdentifierList.SHORT_FORM, null),
                  +                new org.ccsds.moims.mo.mal.OperationField("objDetails", true, org.ccsds.moims.mo.com.archive.structures.ArchiveDetailsList.SHORT_FORM, null),
                  +                new org.ccsds.moims.mo.mal.OperationField("objBodies", true, null, null)}, 
                  +            "Updates an object (or set of objects), causes an ObjectUpdated event to be published by the archive.");
                  +
                  +    /**
                  +     * Operation number literal for operation DELETE.
                  +     */
                  +    public static final int _DELETE_OP_NUMBER = 6;
                  +
                  +    /**
                  +     * Operation number instance for operation DELETE.
                  +     */
                  +    private static final org.ccsds.moims.mo.mal.structures.UShort DELETE_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_DELETE_OP_NUMBER);
                  +
                  +    /**
                  +     * Operation instance for operation DELETE.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.MALRequestOperation DELETE_OP = new org.ccsds.moims.mo.mal.MALRequestOperation(SERVICE_KEY, 
                  +            DELETE_OP_NUMBER, 
                  +            new org.ccsds.moims.mo.mal.structures.Identifier("delete"), 
                  +            new org.ccsds.moims.mo.mal.structures.UShort(4), 
                  +            new org.ccsds.moims.mo.mal.OperationField[] {
                  +                new org.ccsds.moims.mo.mal.OperationField("objType", true, org.ccsds.moims.mo.com.structures.ObjectType.SHORT_FORM, "The first part of the request shall contain the type of object to match and is not permitted to contain the wildcard value.\nThe second part of the request shall contain the domain of the objects to match and is not permitted to contain the wildcard value.\nIf either the first or second part contain a wildcard value then an INVALID error shall be returned and no object deleted.\nThe third part of the request shall contain the list of object instance identifiers to match.\nIf the object instance identifier list contains the wildcard value '0' then all object instances shall be matched.\nIf any explicitly requested object cannot be matched then an UNKNOWN error shall be returned and nothing will be deleted.\nThe matched objects shall be deleted from the archive."),
                  +                new org.ccsds.moims.mo.mal.OperationField("domain", true, org.ccsds.moims.mo.mal.structures.IdentifierList.SHORT_FORM, null),
                  +                new org.ccsds.moims.mo.mal.OperationField("objInstIds", true, org.ccsds.moims.mo.mal.structures.LongList.SHORT_FORM, null)}, 
                  +            new org.ccsds.moims.mo.mal.OperationField[] {
                  +                new org.ccsds.moims.mo.mal.OperationField("deletedObjInstIds", true, org.ccsds.moims.mo.mal.structures.LongList.SHORT_FORM, "The response shall contain the set of object instance identifiers of the deleted objects.")}, 
                  +            "Deletes an object (or set of objects) and causes an ObjectDeleted event to be published by the archive.");
                  +
                  +    /**
                  +     * Area elements.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.structures.Element[] ARCHIVE_SERVICE_ELEMENTS = {};
                  +
                  +    /**
                  +     * The set of operations for this service.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.MALOperation[] OPERATIONS = new org.ccsds.moims.mo.mal.MALOperation[]{RETRIEVE_OP,
                  +        QUERY_OP,
                  +        COUNT_OP,
                  +        STORE_OP,
                  +        UPDATE_OP,
                  +        DELETE_OP};
                  +
                  +    /**
                  +     * Literal for object OBJECTSTORED.
                  +     */
                  +    @Deprecated
                  +    public static final int _OBJECTSTORED_OBJECT_NUMBER = 1;
                  +
                  +    /**
                  +     * Instance for object OBJECTSTORED.
                  +     */
                  +    @Deprecated
                  +    public static final org.ccsds.moims.mo.mal.structures.UShort OBJECTSTORED_OBJECT_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_OBJECTSTORED_OBJECT_NUMBER);
                  +
                  +    /**
                  +     * Object name constant.
                  +     */
                  +    @Deprecated
                  +    public static final org.ccsds.moims.mo.mal.structures.Identifier OBJECTSTORED_OBJECT_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("ObjectStored");
                  +
                  +    /**
                  +     * Object type constant.
                  +     */
                  +    @Deprecated
                  +    public static final org.ccsds.moims.mo.com.structures.ObjectType OBJECTSTORED_OBJECT_TYPE = new org.ccsds.moims.mo.com.structures.ObjectType(new org.ccsds.moims.mo.mal.structures.UShort(2), ARCHIVE_SERVICE_NUMBER, new org.ccsds.moims.mo.mal.structures.UOctet(1), OBJECTSTORED_OBJECT_NUMBER);
                  +
                  +    /**
                  +     * Object instance.
                  +     */
                  +    @Deprecated
                  +    public static org.ccsds.moims.mo.com.COMObject OBJECTSTORED_OBJECT = new org.ccsds.moims.mo.com.COMObject(OBJECTSTORED_OBJECT_TYPE, OBJECTSTORED_OBJECT_NAME, null, false, null, true, null, true);
                  +
                  +    /**
                  +     * Literal for object OBJECTUPDATED.
                  +     */
                  +    @Deprecated
                  +    public static final int _OBJECTUPDATED_OBJECT_NUMBER = 2;
                  +
                  +    /**
                  +     * Instance for object OBJECTUPDATED.
                  +     */
                  +    @Deprecated
                  +    public static final org.ccsds.moims.mo.mal.structures.UShort OBJECTUPDATED_OBJECT_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_OBJECTUPDATED_OBJECT_NUMBER);
                  +
                  +    /**
                  +     * Object name constant.
                  +     */
                  +    @Deprecated
                  +    public static final org.ccsds.moims.mo.mal.structures.Identifier OBJECTUPDATED_OBJECT_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("ObjectUpdated");
                  +
                  +    /**
                  +     * Object type constant.
                  +     */
                  +    @Deprecated
                  +    public static final org.ccsds.moims.mo.com.structures.ObjectType OBJECTUPDATED_OBJECT_TYPE = new org.ccsds.moims.mo.com.structures.ObjectType(new org.ccsds.moims.mo.mal.structures.UShort(2), ARCHIVE_SERVICE_NUMBER, new org.ccsds.moims.mo.mal.structures.UOctet(1), OBJECTUPDATED_OBJECT_NUMBER);
                  +
                  +    /**
                  +     * Object instance.
                  +     */
                  +    @Deprecated
                  +    public static org.ccsds.moims.mo.com.COMObject OBJECTUPDATED_OBJECT = new org.ccsds.moims.mo.com.COMObject(OBJECTUPDATED_OBJECT_TYPE, OBJECTUPDATED_OBJECT_NAME, null, false, null, true, null, true);
                  +
                  +    /**
                  +     * Literal for object OBJECTDELETED.
                  +     */
                  +    @Deprecated
                  +    public static final int _OBJECTDELETED_OBJECT_NUMBER = 3;
                  +
                  +    /**
                  +     * Instance for object OBJECTDELETED.
                  +     */
                  +    @Deprecated
                  +    public static final org.ccsds.moims.mo.mal.structures.UShort OBJECTDELETED_OBJECT_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_OBJECTDELETED_OBJECT_NUMBER);
                  +
                  +    /**
                  +     * Object name constant.
                  +     */
                  +    @Deprecated
                  +    public static final org.ccsds.moims.mo.mal.structures.Identifier OBJECTDELETED_OBJECT_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("ObjectDeleted");
                  +
                  +    /**
                  +     * Object type constant.
                  +     */
                  +    @Deprecated
                  +    public static final org.ccsds.moims.mo.com.structures.ObjectType OBJECTDELETED_OBJECT_TYPE = new org.ccsds.moims.mo.com.structures.ObjectType(new org.ccsds.moims.mo.mal.structures.UShort(2), ARCHIVE_SERVICE_NUMBER, new org.ccsds.moims.mo.mal.structures.UOctet(1), OBJECTDELETED_OBJECT_NUMBER);
                  +
                  +    /**
                  +     * Object instance.
                  +     */
                  +    @Deprecated
                  +    public static org.ccsds.moims.mo.com.COMObject OBJECTDELETED_OBJECT = new org.ccsds.moims.mo.com.COMObject(OBJECTDELETED_OBJECT_TYPE, OBJECTDELETED_OBJECT_NAME, null, false, null, true, null, true);
                  +
                  +    /**
                  +     * Object instance.
                  +     */
                  +    public static final org.ccsds.moims.mo.com.COMObject[] COM_OBJECTS = {
                  +        OBJECTSTORED_OBJECT,
                  +        OBJECTUPDATED_OBJECT,
                  +        OBJECTDELETED_OBJECT,};
                  +
                  +    /**
                  +     * Creates an instance of the Archive ServiceInfo.
                  +     * 
                  +     */
                  +    public ArchiveServiceInfo() {
                  +        super(SERVICE_KEY, ARCHIVE_SERVICE_NAME, ARCHIVE_SERVICE_ELEMENTS, OPERATIONS, COM_OBJECTS);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.MALArea getArea() {
                  +        return org.ccsds.moims.mo.com.COMHelper.COM_AREA;
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.MOErrorException generateMOError(int errorNumber,
                  +            Object extraInfo) {
                  +        switch (errorNumber) {
                  +            case 70000:
                  +                return new org.ccsds.moims.mo.com.InvalidException(extraInfo);
                  +            case 70001:
                  +                return new org.ccsds.moims.mo.com.DuplicateException(extraInfo);
                  +        }
                  +        return null;
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/consumer/ArchiveAdapter.java b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/consumer/ArchiveAdapter.java
                  new file mode 100644
                  index 00000000..cf66f1cd
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/consumer/ArchiveAdapter.java
                  @@ -0,0 +1,507 @@
                  +package org.ccsds.moims.mo.com.archive.consumer;
                  +
                  +/**
                  + * Consumer adapter for Archive service.
                  + */
                  +public abstract class ArchiveAdapter extends org.ccsds.moims.mo.mal.consumer.MALInteractionAdapter {
                  +
                  +    /**
                  +     * Called by the MAL when an INVOKE acknowledgement is received from a provider
                  +     * for the operation retrieve.
                  +     * 
                  +     * @param msgHeader msgHeader The header of the received message
                  +     * @param qosProperties qosProperties The QoS properties associated with the message
                  +     */
                  +    public void retrieveAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader,
                  +            java.util.Map qosProperties) {
                  +    }
                  +
                  +    /**
                  +     * Called by the MAL when an INVOKE response is received from a provider for
                  +     * the operation retrieve.
                  +     * 
                  +     * @param msgHeader msgHeader The header of the received message
                  +     * @param objDetails The response shall contain the set of matched objects.
                  +The first returned list shall contain the matched object instance identifiers and object details of the matched objects.
                  +The second returned list shall contain the object bodies ordered identically to the first list unless no body for the object is declared in the service specification, in which case a NULL replaces the complete list.
                  +There shall be an entry in each returned list for each matched object.
                  +When no objects have been matched only a response with NULL for each part of the response shall be returned.
                  +The ordering of the returned objects is not specified and implementation specific.
                  +If ordering of the returned objects is required then the query operation should be used instead.
                  +     * @param objBodies objBodies Argument number 1 as defined by the service operation
                  +     * @param qosProperties qosProperties The QoS properties associated with the message
                  +     */
                  +    public void retrieveResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader,
                  +            org.ccsds.moims.mo.com.archive.structures.ArchiveDetailsList objDetails,
                  +            org.ccsds.moims.mo.mal.structures.HeterogeneousList objBodies,
                  +            java.util.Map qosProperties) {
                  +    }
                  +
                  +    /**
                  +     * Called by the MAL when an INVOKE acknowledgement error is received from
                  +     * a provider for the operation retrieve.
                  +     * 
                  +     * @param msgHeader msgHeader The header of the received message
                  +     * @param error error The received error message
                  +     * @param qosProperties qosProperties The QoS properties associated with the message
                  +     */
                  +    public void retrieveAckErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader,
                  +            org.ccsds.moims.mo.mal.MOErrorException error,
                  +            java.util.Map qosProperties) {
                  +    }
                  +
                  +    /**
                  +     * Called by the MAL when an INVOKE response error is received from a provider
                  +     * for the operation retrieve.
                  +     * 
                  +     * @param msgHeader msgHeader The header of the received message
                  +     * @param error error The received error message
                  +     * @param qosProperties qosProperties The QoS properties associated with the message
                  +     */
                  +    public void retrieveResponseErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader,
                  +            org.ccsds.moims.mo.mal.MOErrorException error,
                  +            java.util.Map qosProperties) {
                  +    }
                  +
                  +    /**
                  +     * Called by the MAL when a PROGRESS acknowledgement is received from a provider
                  +     * for the operation query.
                  +     * 
                  +     * @param msgHeader msgHeader The header of the received message
                  +     * @param qosProperties qosProperties The QoS properties associated with the message
                  +     */
                  +    public void queryAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader,
                  +            java.util.Map qosProperties) {
                  +    }
                  +
                  +    /**
                  +     * Called by the MAL when a PROGRESS update is received from a provider for
                  +     * the operation query.
                  +     * 
                  +     * @param msgHeader msgHeader The header of the received message
                  +     * @param objType objType Argument number 0 as defined by the service operation
                  +     * @param domain domain Argument number 1 as defined by the service operation
                  +     * @param objDetails objDetails Argument number 2 as defined by the service operation
                  +     * @param objBodies objBodies Argument number 3 as defined by the service operation
                  +     * @param qosProperties qosProperties The QoS properties associated with the message
                  +     */
                  +    public void queryUpdateReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader,
                  +            org.ccsds.moims.mo.com.structures.ObjectType objType,
                  +            org.ccsds.moims.mo.mal.structures.IdentifierList domain,
                  +            org.ccsds.moims.mo.com.archive.structures.ArchiveDetailsList objDetails,
                  +            org.ccsds.moims.mo.mal.structures.HeterogeneousList objBodies,
                  +            java.util.Map qosProperties) {
                  +    }
                  +
                  +    /**
                  +     * Called by the MAL when a PROGRESS response is received from a provider
                  +     * for the operation query.
                  +     * 
                  +     * @param msgHeader msgHeader The header of the received message
                  +     * @param objType The updates and the responses shall contain the set of matched objects.
                  +If a wildcard was used in the ObjectType part of the request then the updates and response shall contain the ObjectType of each matched object.
                  +If there was not any wildcards in the ObjectType part of the request the ObjectType in the updates and response shall be replaced by a NULL.
                  +The first returned list shall contain the domain of the objects being returned.
                  +If multiple ObjectTypes or domains have been matched then multiple Update message may be returned.
                  +There shall be an entry in the second and third lists for each matched object.
                  +The second returned list shall contain the archive details stored for the matched objects.
                  +If the initial Boolean of the request was True the third returned list shall contain the bodies of the objects.
                  +If the initial Boolean of the request was NULL or False the third returned list shall be replaced by a NULL.
                  +The returned lists shall be sorted based on the sorting options specified in ArchiveQuery.
                  +Each domain/object type pair shall be sorted separately from other domain/object type pairs, there is no requirement for sorting to be applied across domain/object type pairs.
                  +When the field being sorted on contains a NULL value, or does not exist in the matched object (due to a containing composite being NULL), these entries shall be added to the end of the returned list in the order that they are matched.
                  +When no objects have been matched only a response with NULL for each part of the response shall be returned.
                  +     * @param domain domain Argument number 1 as defined by the service operation
                  +     * @param objDetails objDetails Argument number 2 as defined by the service operation
                  +     * @param objBodies objBodies Argument number 3 as defined by the service operation
                  +     * @param qosProperties qosProperties The QoS properties associated with the message
                  +     */
                  +    public void queryResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader,
                  +            org.ccsds.moims.mo.com.structures.ObjectType objType,
                  +            org.ccsds.moims.mo.mal.structures.IdentifierList domain,
                  +            org.ccsds.moims.mo.com.archive.structures.ArchiveDetailsList objDetails,
                  +            org.ccsds.moims.mo.mal.structures.HeterogeneousList objBodies,
                  +            java.util.Map qosProperties) {
                  +    }
                  +
                  +    /**
                  +     * Called by the MAL when a PROGRESS acknowledgement error is received from
                  +     * a provider for the operation query.
                  +     * 
                  +     * @param msgHeader msgHeader The header of the received message
                  +     * @param error error The received error message
                  +     * @param qosProperties qosProperties The QoS properties associated with the message
                  +     */
                  +    public void queryAckErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader,
                  +            org.ccsds.moims.mo.mal.MOErrorException error,
                  +            java.util.Map qosProperties) {
                  +    }
                  +
                  +    /**
                  +     * Called by the MAL when a PROGRESS update error is received from a provider
                  +     * for the operation query.
                  +     * 
                  +     * @param msgHeader msgHeader The header of the received message
                  +     * @param error error The received error message
                  +     * @param qosProperties qosProperties The QoS properties associated with the message
                  +     */
                  +    public void queryUpdateErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader,
                  +            org.ccsds.moims.mo.mal.MOErrorException error,
                  +            java.util.Map qosProperties) {
                  +    }
                  +
                  +    /**
                  +     * Called by the MAL when a PROGRESS response error is received from a provider
                  +     * for the operation query.
                  +     * 
                  +     * @param msgHeader msgHeader The header of the received message
                  +     * @param error error The received error message
                  +     * @param qosProperties qosProperties The QoS properties associated with the message
                  +     */
                  +    public void queryResponseErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader,
                  +            org.ccsds.moims.mo.mal.MOErrorException error,
                  +            java.util.Map qosProperties) {
                  +    }
                  +
                  +    /**
                  +     * Called by the MAL when an INVOKE acknowledgement is received from a provider
                  +     * for the operation count.
                  +     * 
                  +     * @param msgHeader msgHeader The header of the received message
                  +     * @param qosProperties qosProperties The QoS properties associated with the message
                  +     */
                  +    public void countAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader,
                  +            java.util.Map qosProperties) {
                  +    }
                  +
                  +    /**
                  +     * Called by the MAL when an INVOKE response is received from a provider for
                  +     * the operation count.
                  +     * 
                  +     * @param msgHeader msgHeader The header of the received message
                  +     * @param counts The response shall contain the count of matched objects.
                  +There shall be an entry in each returned list for each entry in the request list.
                  +The returned lists shall be ordered the same as the request query lists so that the response can be matched to the corresponding request.
                  +     * @param qosProperties qosProperties The QoS properties associated with the message
                  +     */
                  +    public void countResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader,
                  +            org.ccsds.moims.mo.mal.structures.LongList counts,
                  +            java.util.Map qosProperties) {
                  +    }
                  +
                  +    /**
                  +     * Called by the MAL when an INVOKE acknowledgement error is received from
                  +     * a provider for the operation count.
                  +     * 
                  +     * @param msgHeader msgHeader The header of the received message
                  +     * @param error error The received error message
                  +     * @param qosProperties qosProperties The QoS properties associated with the message
                  +     */
                  +    public void countAckErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader,
                  +            org.ccsds.moims.mo.mal.MOErrorException error,
                  +            java.util.Map qosProperties) {
                  +    }
                  +
                  +    /**
                  +     * Called by the MAL when an INVOKE response error is received from a provider
                  +     * for the operation count.
                  +     * 
                  +     * @param msgHeader msgHeader The header of the received message
                  +     * @param error error The received error message
                  +     * @param qosProperties qosProperties The QoS properties associated with the message
                  +     */
                  +    public void countResponseErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader,
                  +            org.ccsds.moims.mo.mal.MOErrorException error,
                  +            java.util.Map qosProperties) {
                  +    }
                  +
                  +    /**
                  +     * Called by the MAL when a REQUEST response is received from a provider for
                  +     * the operation store.
                  +     * 
                  +     * @param msgHeader msgHeader The header of the received message
                  +     * @param objInstIds The response shall contain the set of new object instance identifiers if the request supplied an initial TRUE Boolean value, otherwise it returns NULL.
                  +The returned list shall be ordered identically to the submitted list so that the returned object instance identifiers can be mapped to the correct objects.
                  +     * @param qosProperties qosProperties The QoS properties associated with the message
                  +     */
                  +    public void storeResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader,
                  +            org.ccsds.moims.mo.mal.structures.LongList objInstIds,
                  +            java.util.Map qosProperties) {
                  +    }
                  +
                  +    /**
                  +     * Called by the MAL when a REQUEST response error is received from a provider
                  +     * for the operation store.
                  +     * 
                  +     * @param msgHeader msgHeader The header of the received message
                  +     * @param error error The received error message
                  +     * @param qosProperties qosProperties The QoS properties associated with the message
                  +     */
                  +    public void storeErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader,
                  +            org.ccsds.moims.mo.mal.MOErrorException error,
                  +            java.util.Map qosProperties) {
                  +    }
                  +
                  +    /**
                  +     * Called by the MAL when a SUBMIT acknowledgement is received from a provider
                  +     * for the operation update.
                  +     * 
                  +     * @param msgHeader msgHeader The header of the received message
                  +     * @param qosProperties qosProperties The QoS properties associated with the message
                  +     */
                  +    public void updateAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader,
                  +            java.util.Map qosProperties) {
                  +    }
                  +
                  +    /**
                  +     * Called by the MAL when a SUBMIT acknowledgement error is received from
                  +     * a provider for the operation update.
                  +     * 
                  +     * @param msgHeader msgHeader The header of the received message
                  +     * @param error error The received error message
                  +     * @param qosProperties qosProperties The QoS properties associated with the message
                  +     */
                  +    public void updateErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader,
                  +            org.ccsds.moims.mo.mal.MOErrorException error,
                  +            java.util.Map qosProperties) {
                  +    }
                  +
                  +    /**
                  +     * Called by the MAL when a REQUEST response is received from a provider for
                  +     * the operation delete.
                  +     * 
                  +     * @param msgHeader msgHeader The header of the received message
                  +     * @param deletedObjInstIds The response shall contain the set of object instance identifiers of the deleted objects.
                  +     * @param qosProperties qosProperties The QoS properties associated with the message
                  +     */
                  +    public void deleteResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader,
                  +            org.ccsds.moims.mo.mal.structures.LongList deletedObjInstIds,
                  +            java.util.Map qosProperties) {
                  +    }
                  +
                  +    /**
                  +     * Called by the MAL when a REQUEST response error is received from a provider
                  +     * for the operation delete.
                  +     * 
                  +     * @param msgHeader msgHeader The header of the received message
                  +     * @param error error The received error message
                  +     * @param qosProperties qosProperties The QoS properties associated with the message
                  +     */
                  +    public void deleteErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader,
                  +            org.ccsds.moims.mo.mal.MOErrorException error,
                  +            java.util.Map qosProperties) {
                  +    }
                  +
                  +    @Override
                  +    public final void submitAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader,
                  +            java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException {
                  +        switch (msgHeader.getOperation().getValue()) {
                  +          case org.ccsds.moims.mo.com.archive.ArchiveServiceInfo._UPDATE_OP_NUMBER:
                  +            updateAckReceived(msgHeader, qosProperties);
                  +            break;
                  +          default:
                  +            throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue());
                  +        }
                  +    }
                  +
                  +    @Override
                  +    public final void submitErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader,
                  +            org.ccsds.moims.mo.mal.transport.MALErrorBody body,
                  +            java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException {
                  +        switch (msgHeader.getOperation().getValue()) {
                  +          case org.ccsds.moims.mo.com.archive.ArchiveServiceInfo._UPDATE_OP_NUMBER:
                  +            updateErrorReceived(msgHeader, body.getError(), qosProperties);
                  +            break;
                  +          default:
                  +            throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue());
                  +        }
                  +    }
                  +
                  +    @Override
                  +    public final void requestResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader,
                  +            org.ccsds.moims.mo.mal.transport.MALMessageBody body,
                  +            java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException {
                  +        switch (msgHeader.getOperation().getValue()) {
                  +          case org.ccsds.moims.mo.com.archive.ArchiveServiceInfo._STORE_OP_NUMBER:
                  +            storeResponseReceived(msgHeader,
                  +                (org.ccsds.moims.mo.mal.structures.LongList) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.LongList()), qosProperties);
                  +            break;
                  +          case org.ccsds.moims.mo.com.archive.ArchiveServiceInfo._DELETE_OP_NUMBER:
                  +            deleteResponseReceived(msgHeader,
                  +                (org.ccsds.moims.mo.mal.structures.LongList) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.LongList()), qosProperties);
                  +            break;
                  +          default:
                  +            throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue());
                  +        }
                  +    }
                  +
                  +    @Override
                  +    public final void requestErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader,
                  +            org.ccsds.moims.mo.mal.transport.MALErrorBody body,
                  +            java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException {
                  +        switch (msgHeader.getOperation().getValue()) {
                  +          case org.ccsds.moims.mo.com.archive.ArchiveServiceInfo._STORE_OP_NUMBER:
                  +            storeErrorReceived(msgHeader, body.getError(), qosProperties);
                  +            break;
                  +          case org.ccsds.moims.mo.com.archive.ArchiveServiceInfo._DELETE_OP_NUMBER:
                  +            deleteErrorReceived(msgHeader, body.getError(), qosProperties);
                  +            break;
                  +          default:
                  +            throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue());
                  +        }
                  +    }
                  +
                  +    @Override
                  +    public final void invokeAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader,
                  +            org.ccsds.moims.mo.mal.transport.MALMessageBody body,
                  +            java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException {
                  +        switch (msgHeader.getOperation().getValue()) {
                  +          case org.ccsds.moims.mo.com.archive.ArchiveServiceInfo._RETRIEVE_OP_NUMBER:
                  +            retrieveAckReceived(msgHeader, qosProperties);
                  +            break;
                  +          case org.ccsds.moims.mo.com.archive.ArchiveServiceInfo._COUNT_OP_NUMBER:
                  +            countAckReceived(msgHeader, qosProperties);
                  +            break;
                  +          default:
                  +            throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue());
                  +        }
                  +    }
                  +
                  +    @Override
                  +    public final void invokeAckErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader,
                  +            org.ccsds.moims.mo.mal.transport.MALErrorBody body,
                  +            java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException {
                  +        switch (msgHeader.getOperation().getValue()) {
                  +          case org.ccsds.moims.mo.com.archive.ArchiveServiceInfo._RETRIEVE_OP_NUMBER:
                  +            retrieveAckErrorReceived(msgHeader, body.getError(), qosProperties);
                  +            break;
                  +          case org.ccsds.moims.mo.com.archive.ArchiveServiceInfo._COUNT_OP_NUMBER:
                  +            countAckErrorReceived(msgHeader, body.getError(), qosProperties);
                  +            break;
                  +          default:
                  +            throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue());
                  +        }
                  +    }
                  +
                  +    @Override
                  +    public final void invokeResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader,
                  +            org.ccsds.moims.mo.mal.transport.MALMessageBody body,
                  +            java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException {
                  +        switch (msgHeader.getOperation().getValue()) {
                  +          case org.ccsds.moims.mo.com.archive.ArchiveServiceInfo._RETRIEVE_OP_NUMBER:
                  +            retrieveResponseReceived(msgHeader,
                  +                (org.ccsds.moims.mo.com.archive.structures.ArchiveDetailsList) body.getBodyElement(0, new org.ccsds.moims.mo.com.archive.structures.ArchiveDetailsList()),
                  +                (org.ccsds.moims.mo.mal.structures.HeterogeneousList) body.getBodyElement(1, null), qosProperties);
                  +            break;
                  +          case org.ccsds.moims.mo.com.archive.ArchiveServiceInfo._COUNT_OP_NUMBER:
                  +            countResponseReceived(msgHeader,
                  +                (org.ccsds.moims.mo.mal.structures.LongList) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.LongList()), qosProperties);
                  +            break;
                  +          default:
                  +            throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue());
                  +        }
                  +    }
                  +
                  +    @Override
                  +    public final void invokeResponseErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader,
                  +            org.ccsds.moims.mo.mal.transport.MALErrorBody body,
                  +            java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException {
                  +        switch (msgHeader.getOperation().getValue()) {
                  +          case org.ccsds.moims.mo.com.archive.ArchiveServiceInfo._RETRIEVE_OP_NUMBER:
                  +            retrieveResponseErrorReceived(msgHeader, body.getError(), qosProperties);
                  +            break;
                  +          case org.ccsds.moims.mo.com.archive.ArchiveServiceInfo._COUNT_OP_NUMBER:
                  +            countResponseErrorReceived(msgHeader, body.getError(), qosProperties);
                  +            break;
                  +          default:
                  +            throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue());
                  +        }
                  +    }
                  +
                  +    @Override
                  +    public final void progressAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader,
                  +            org.ccsds.moims.mo.mal.transport.MALMessageBody body,
                  +            java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException {
                  +        switch (msgHeader.getOperation().getValue()) {
                  +          case org.ccsds.moims.mo.com.archive.ArchiveServiceInfo._QUERY_OP_NUMBER:
                  +            queryAckReceived(msgHeader, qosProperties);
                  +            break;
                  +          default:
                  +            throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue());
                  +        }
                  +    }
                  +
                  +    @Override
                  +    public final void progressAckErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader,
                  +            org.ccsds.moims.mo.mal.transport.MALErrorBody body,
                  +            java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException {
                  +        switch (msgHeader.getOperation().getValue()) {
                  +          case org.ccsds.moims.mo.com.archive.ArchiveServiceInfo._QUERY_OP_NUMBER:
                  +            queryAckErrorReceived(msgHeader, body.getError(), qosProperties);
                  +            break;
                  +          default:
                  +            throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue());
                  +        }
                  +    }
                  +
                  +    @Override
                  +    public final void progressUpdateReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader,
                  +            org.ccsds.moims.mo.mal.transport.MALMessageBody body,
                  +            java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException {
                  +        switch (msgHeader.getOperation().getValue()) {
                  +          case org.ccsds.moims.mo.com.archive.ArchiveServiceInfo._QUERY_OP_NUMBER:
                  +            queryUpdateReceived(msgHeader,
                  +                (org.ccsds.moims.mo.com.structures.ObjectType) body.getBodyElement(0, new org.ccsds.moims.mo.com.structures.ObjectType()),
                  +                (org.ccsds.moims.mo.mal.structures.IdentifierList) body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.IdentifierList()),
                  +                (org.ccsds.moims.mo.com.archive.structures.ArchiveDetailsList) body.getBodyElement(2, new org.ccsds.moims.mo.com.archive.structures.ArchiveDetailsList()),
                  +                (org.ccsds.moims.mo.mal.structures.HeterogeneousList) body.getBodyElement(3, null), qosProperties);
                  +            break;
                  +          default:
                  +            throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue());
                  +        }
                  +    }
                  +
                  +    @Override
                  +    public final void progressUpdateErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader,
                  +            org.ccsds.moims.mo.mal.transport.MALErrorBody body,
                  +            java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException {
                  +        switch (msgHeader.getOperation().getValue()) {
                  +          case org.ccsds.moims.mo.com.archive.ArchiveServiceInfo._QUERY_OP_NUMBER:
                  +            queryUpdateErrorReceived(msgHeader, body.getError(), qosProperties);
                  +            break;
                  +          default:
                  +            throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue());
                  +        }
                  +    }
                  +
                  +    @Override
                  +    public final void progressResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader,
                  +            org.ccsds.moims.mo.mal.transport.MALMessageBody body,
                  +            java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException {
                  +        switch (msgHeader.getOperation().getValue()) {
                  +          case org.ccsds.moims.mo.com.archive.ArchiveServiceInfo._QUERY_OP_NUMBER:
                  +            queryResponseReceived(msgHeader,
                  +                (org.ccsds.moims.mo.com.structures.ObjectType) body.getBodyElement(0, new org.ccsds.moims.mo.com.structures.ObjectType()),
                  +                (org.ccsds.moims.mo.mal.structures.IdentifierList) body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.IdentifierList()),
                  +                (org.ccsds.moims.mo.com.archive.structures.ArchiveDetailsList) body.getBodyElement(2, new org.ccsds.moims.mo.com.archive.structures.ArchiveDetailsList()),
                  +                (org.ccsds.moims.mo.mal.structures.HeterogeneousList) body.getBodyElement(3, null), qosProperties);
                  +            break;
                  +          default:
                  +            throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue());
                  +        }
                  +    }
                  +
                  +    @Override
                  +    public final void progressResponseErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader,
                  +            org.ccsds.moims.mo.mal.transport.MALErrorBody body,
                  +            java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException {
                  +        switch (msgHeader.getOperation().getValue()) {
                  +          case org.ccsds.moims.mo.com.archive.ArchiveServiceInfo._QUERY_OP_NUMBER:
                  +            queryResponseErrorReceived(msgHeader, body.getError(), qosProperties);
                  +            break;
                  +          default:
                  +            throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue());
                  +        }
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/consumer/ArchiveStub.java b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/consumer/ArchiveStub.java
                  new file mode 100644
                  index 00000000..ad7f479b
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/consumer/ArchiveStub.java
                  @@ -0,0 +1,465 @@
                  +package org.ccsds.moims.mo.com.archive.consumer;
                  +
                  +/**
                  + * Consumer stub for Archive service.
                  + */
                  +public class ArchiveStub {
                  +
                  +    /**
                  +     * The consumer field.
                  +     */
                  +    private final org.ccsds.moims.mo.mal.consumer.MALConsumer consumer;
                  +
                  +    /**
                  +     * Wraps a MALconsumer connection with service specific methods that map from
                  +     * the high level service API to the generic MAL API.
                  +     * 
                  +     * @param consumer consumer The MALConsumer to use in this stub.
                  +     */
                  +    public ArchiveStub(org.ccsds.moims.mo.mal.consumer.MALConsumer consumer) {
                  +        this.consumer = consumer;
                  +    }
                  +
                  +    /**
                  +     * Returns the internal MAL consumer object used for sending of messages from
                  +     * this interface.
                  +     * 
                  +     * @return The MAL consumer object.
                  +     */
                  +    public org.ccsds.moims.mo.mal.consumer.MALConsumer getConsumer() {
                  +        return consumer;
                  +    }
                  +
                  +    /**
                  +     * Retrieves a set of objects identified by their object instance identifier.
                  +     * 
                  +     * @param objType The first part of the request shall contain the type of the object required.
                  +If any of the fields of the object type contains the wildcard value of '0' then an INVALID error shall be returned.
                  +The second part of the request shall contain the domain to match.
                  +If the domain contains the wildcard value of '*' then an INVALID error shall be returned.
                  +The third part of the request shall contain the list of object instance identifiers to match.
                  +If the object instance identifier list contains the wildcard value '0' then all object instances shall be matched.
                  +If any explicitly requested object cannot be matched then an UNKNOWN error shall be returned.
                  +     * @param domain domain Argument number 1 as defined by the service operation
                  +     * @param objInstIds objInstIds Argument number 2 as defined by the service operation
                  +     * @param adapter adapter Listener in charge of receiving the messages from the service provider
                  +     * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification.
                  +     * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception
                  +     */
                  +    public void retrieve(org.ccsds.moims.mo.com.structures.ObjectType objType,
                  +            org.ccsds.moims.mo.mal.structures.IdentifierList domain,
                  +            org.ccsds.moims.mo.mal.structures.LongList objInstIds,
                  +            org.ccsds.moims.mo.com.archive.consumer.ArchiveAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException {
                  +        consumer.invoke(org.ccsds.moims.mo.com.archive.ArchiveServiceInfo.RETRIEVE_OP, adapter, objType, domain, objInstIds);
                  +    }
                  +
                  +    /**
                  +     * Asynchronous version of method retrieve.
                  +     * 
                  +     * @param objType The first part of the request shall contain the type of the object required.
                  +If any of the fields of the object type contains the wildcard value of '0' then an INVALID error shall be returned.
                  +The second part of the request shall contain the domain to match.
                  +If the domain contains the wildcard value of '*' then an INVALID error shall be returned.
                  +The third part of the request shall contain the list of object instance identifiers to match.
                  +If the object instance identifier list contains the wildcard value '0' then all object instances shall be matched.
                  +If any explicitly requested object cannot be matched then an UNKNOWN error shall be returned.
                  +     * @param domain domain Argument number 1 as defined by the service operation
                  +     * @param objInstIds objInstIds Argument number 2 as defined by the service operation
                  +     * @param adapter adapter Listener in charge of receiving the messages from the service provider
                  +     * @return the MAL message sent to initiate the interaction
                  +     * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification.
                  +     * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception
                  +     */
                  +    public org.ccsds.moims.mo.mal.transport.MALMessage asyncRetrieve(org.ccsds.moims.mo.com.structures.ObjectType objType,
                  +            org.ccsds.moims.mo.mal.structures.IdentifierList domain,
                  +            org.ccsds.moims.mo.mal.structures.LongList objInstIds,
                  +            org.ccsds.moims.mo.com.archive.consumer.ArchiveAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException {
                  +        return consumer.asyncInvoke(org.ccsds.moims.mo.com.archive.ArchiveServiceInfo.RETRIEVE_OP, adapter, objType, domain, objInstIds);
                  +    }
                  +
                  +    /**
                  +     * Continues a previously started interaction.
                  +     * 
                  +     * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue
                  +     * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message
                  +     * @param transactionId transactionId Transaction identifier of the interaction to continue
                  +     * @param adapter adapter Listener in charge of receiving the messages from the service provider
                  +     * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification.
                  +     * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception
                  +     */
                  +    public void continueRetrieve(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage,
                  +            org.ccsds.moims.mo.mal.structures.Time initiationTimestamp,
                  +            Long transactionId,
                  +            org.ccsds.moims.mo.com.archive.consumer.ArchiveAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException {
                  +        consumer.continueInteraction(org.ccsds.moims.mo.com.archive.ArchiveServiceInfo.RETRIEVE_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter);
                  +    }
                  +
                  +    /**
                  +     * Retrieves a set of object instance identifiers, and optionally the object
                  +     * bodies, from a list of supplied queries. The PROGRESS interaction pattern
                  +     * is used as the returned set of data may be quite large and this allows
                  +     * it to be split over several MAL messages.
                  +     * 
                  +     * @param returnBody The first part of the request shall contain a Boolean that if set to TRUE requests that the body of the objects is returned otherwise only the ObjectType and ArchiveDetails shall be returned and the returned list of the bodies of the objects shall be replaced with a NULL.
                  +The second part of the request shall contain the type of the object required.
                  +Each part of the object type may contain the wildcard value of '0'.
                  +The third and fourth parts of the request shall contain the queries to evaluate.
                  +A single query shall be formed by the combination of an ArchiveQuery from the first list and a QueryFilter from the second list.
                  +The two lists shall be ordered identically so that the query and the filter parts can be matched together.
                  +If a query does not contain a QueryFilter part then that entry in the QueryFilter list shall be replaced with a NULL value.
                  +If the request does not contain any QueryFilters then the complete list may be replaced with a NULL.
                  +The size of the two lists must be the same unless the complete second list is replaced with a NULL otherwise an INVALID error shall be raised.
                  +For each query, the ArchiveQuery and the QueryFilter shall contain the COM object fields to filter on.
                  +The ArchiveQuery may contain the wildcard value of NULL on each of the fields.
                  +If an ArchiveQuery contains an end time but no start time then it shall match the single object that has a timestamp closest to, but not greater than, the end time field.
                  +The end time field may specify a time in the future.
                  +If the sortFieldName of the ArchiveQuery does not reference a defined field then an INVALID error shall be returned.
                  +Each query shall be evaluated separately from each other, the filter of one query will not affect the filter of another. This forms a logical OR operation.
                  +If the QueryFilter contains an error then an INVALID error shall be returned. The definition of erroneous values are filter specific and defined in the relevant filter structure specification.
                  +     * @param objType objType Argument number 1 as defined by the service operation
                  +     * @param archiveQuery archiveQuery Argument number 2 as defined by the service operation
                  +     * @param queryFilter queryFilter Argument number 3 as defined by the service operation
                  +     * @param adapter adapter Listener in charge of receiving the messages from the service provider
                  +     * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification.
                  +     * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception
                  +     */
                  +    public void query(Boolean returnBody,
                  +            org.ccsds.moims.mo.com.structures.ObjectType objType,
                  +            org.ccsds.moims.mo.com.archive.structures.ArchiveQueryList archiveQuery,
                  +            org.ccsds.moims.mo.com.archive.structures.QueryFilterList queryFilter,
                  +            org.ccsds.moims.mo.com.archive.consumer.ArchiveAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException {
                  +        consumer.progress(org.ccsds.moims.mo.com.archive.ArchiveServiceInfo.QUERY_OP, adapter, (returnBody == null) ? null : new org.ccsds.moims.mo.mal.structures.Union(returnBody), objType, archiveQuery, queryFilter);
                  +    }
                  +
                  +    /**
                  +     * Asynchronous version of method query.
                  +     * 
                  +     * @param returnBody The first part of the request shall contain a Boolean that if set to TRUE requests that the body of the objects is returned otherwise only the ObjectType and ArchiveDetails shall be returned and the returned list of the bodies of the objects shall be replaced with a NULL.
                  +The second part of the request shall contain the type of the object required.
                  +Each part of the object type may contain the wildcard value of '0'.
                  +The third and fourth parts of the request shall contain the queries to evaluate.
                  +A single query shall be formed by the combination of an ArchiveQuery from the first list and a QueryFilter from the second list.
                  +The two lists shall be ordered identically so that the query and the filter parts can be matched together.
                  +If a query does not contain a QueryFilter part then that entry in the QueryFilter list shall be replaced with a NULL value.
                  +If the request does not contain any QueryFilters then the complete list may be replaced with a NULL.
                  +The size of the two lists must be the same unless the complete second list is replaced with a NULL otherwise an INVALID error shall be raised.
                  +For each query, the ArchiveQuery and the QueryFilter shall contain the COM object fields to filter on.
                  +The ArchiveQuery may contain the wildcard value of NULL on each of the fields.
                  +If an ArchiveQuery contains an end time but no start time then it shall match the single object that has a timestamp closest to, but not greater than, the end time field.
                  +The end time field may specify a time in the future.
                  +If the sortFieldName of the ArchiveQuery does not reference a defined field then an INVALID error shall be returned.
                  +Each query shall be evaluated separately from each other, the filter of one query will not affect the filter of another. This forms a logical OR operation.
                  +If the QueryFilter contains an error then an INVALID error shall be returned. The definition of erroneous values are filter specific and defined in the relevant filter structure specification.
                  +     * @param objType objType Argument number 1 as defined by the service operation
                  +     * @param archiveQuery archiveQuery Argument number 2 as defined by the service operation
                  +     * @param queryFilter queryFilter Argument number 3 as defined by the service operation
                  +     * @param adapter adapter Listener in charge of receiving the messages from the service provider
                  +     * @return the MAL message sent to initiate the interaction
                  +     * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification.
                  +     * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception
                  +     */
                  +    public org.ccsds.moims.mo.mal.transport.MALMessage asyncQuery(Boolean returnBody,
                  +            org.ccsds.moims.mo.com.structures.ObjectType objType,
                  +            org.ccsds.moims.mo.com.archive.structures.ArchiveQueryList archiveQuery,
                  +            org.ccsds.moims.mo.com.archive.structures.QueryFilterList queryFilter,
                  +            org.ccsds.moims.mo.com.archive.consumer.ArchiveAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException {
                  +        return consumer.asyncProgress(org.ccsds.moims.mo.com.archive.ArchiveServiceInfo.QUERY_OP, adapter, (returnBody == null) ? null : new org.ccsds.moims.mo.mal.structures.Union(returnBody), objType, archiveQuery, queryFilter);
                  +    }
                  +
                  +    /**
                  +     * Continues a previously started interaction.
                  +     * 
                  +     * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue
                  +     * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message
                  +     * @param transactionId transactionId Transaction identifier of the interaction to continue
                  +     * @param adapter adapter Listener in charge of receiving the messages from the service provider
                  +     * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification.
                  +     * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception
                  +     */
                  +    public void continueQuery(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage,
                  +            org.ccsds.moims.mo.mal.structures.Time initiationTimestamp,
                  +            Long transactionId,
                  +            org.ccsds.moims.mo.com.archive.consumer.ArchiveAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException {
                  +        consumer.continueInteraction(org.ccsds.moims.mo.com.archive.ArchiveServiceInfo.QUERY_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter);
                  +    }
                  +
                  +    /**
                  +     * Counts the set of objects based on a supplied query.
                  +     * 
                  +     * @param objType The ObjectType, ArchiveQuery and QueryFilter parts of the request shall be populated exactly the same as for the query operation.
                  +     * @param archiveQuery archiveQuery Argument number 1 as defined by the service operation
                  +     * @param queryFilter queryFilter Argument number 2 as defined by the service operation
                  +     * @param adapter adapter Listener in charge of receiving the messages from the service provider
                  +     * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification.
                  +     * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception
                  +     */
                  +    public void count(org.ccsds.moims.mo.com.structures.ObjectType objType,
                  +            org.ccsds.moims.mo.com.archive.structures.ArchiveQueryList archiveQuery,
                  +            org.ccsds.moims.mo.com.archive.structures.QueryFilterList queryFilter,
                  +            org.ccsds.moims.mo.com.archive.consumer.ArchiveAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException {
                  +        consumer.invoke(org.ccsds.moims.mo.com.archive.ArchiveServiceInfo.COUNT_OP, adapter, objType, archiveQuery, queryFilter);
                  +    }
                  +
                  +    /**
                  +     * Asynchronous version of method count.
                  +     * 
                  +     * @param objType The ObjectType, ArchiveQuery and QueryFilter parts of the request shall be populated exactly the same as for the query operation.
                  +     * @param archiveQuery archiveQuery Argument number 1 as defined by the service operation
                  +     * @param queryFilter queryFilter Argument number 2 as defined by the service operation
                  +     * @param adapter adapter Listener in charge of receiving the messages from the service provider
                  +     * @return the MAL message sent to initiate the interaction
                  +     * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification.
                  +     * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception
                  +     */
                  +    public org.ccsds.moims.mo.mal.transport.MALMessage asyncCount(org.ccsds.moims.mo.com.structures.ObjectType objType,
                  +            org.ccsds.moims.mo.com.archive.structures.ArchiveQueryList archiveQuery,
                  +            org.ccsds.moims.mo.com.archive.structures.QueryFilterList queryFilter,
                  +            org.ccsds.moims.mo.com.archive.consumer.ArchiveAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException {
                  +        return consumer.asyncInvoke(org.ccsds.moims.mo.com.archive.ArchiveServiceInfo.COUNT_OP, adapter, objType, archiveQuery, queryFilter);
                  +    }
                  +
                  +    /**
                  +     * Continues a previously started interaction.
                  +     * 
                  +     * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue
                  +     * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message
                  +     * @param transactionId transactionId Transaction identifier of the interaction to continue
                  +     * @param adapter adapter Listener in charge of receiving the messages from the service provider
                  +     * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification.
                  +     * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception
                  +     */
                  +    public void continueCount(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage,
                  +            org.ccsds.moims.mo.mal.structures.Time initiationTimestamp,
                  +            Long transactionId,
                  +            org.ccsds.moims.mo.com.archive.consumer.ArchiveAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException {
                  +        consumer.continueInteraction(org.ccsds.moims.mo.com.archive.ArchiveServiceInfo.COUNT_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter);
                  +    }
                  +
                  +    /**
                  +     * Stores new objects in the archive and causes an ObjectStored event to be
                  +     * published by the archive.
                  +     * When new objects are being stored in an archive by a service provider the
                  +     * archive service provider is capable of allocating an unused object instance
                  +     * identifier for the objects being stored. The returned object instance identifier
                  +     * should be used by the service provider for identifying the object instances
                  +     * to its consumer to ensure that only a single object instance identifier
                  +     * is used for each object instance.
                  +     * 
                  +     * @param returnObjInstIds The first part of the request indicates whether the operation should return the object instance identifiers used, if TRUE it shall return them, otherwise it returns NULL.
                  +The second part of the request shall contain the type of object being stored.
                  +The third part of the request shall contain the domain of the objects being stored.
                  +The fourth part of the request shall contain the list of archive details to use, one for each object being stored.
                  +If the object instance identifier supplied in the archive details is set to 0 then the store operation shall allocate a new and unused object instance identifier.
                  +If the object instance identifier supplied in the archive details is not set to 0 and is currently used in the archive then a DUPLICATE error is returned and no objects from the request shall be stored.
                  +The fifth part of the request shall contain the list of objects to store.
                  +The fourth and fifth list must be the same size as there is only one entry in each for each object to be stored. If they differ in size an INVALID error is returned with the extra error information integer giving the index of the list entry without a matching entry in the other list.
                  +An INVALID error shall be returned if a wildcard value of '0' is used in the object type.
                  +An INVALID error shall be returned if a wildcard value of '*' is used in the domain identifier list.
                  +An INVALID error shall be returned if the values of '0', '*', or NULL are used in the network, timestamp or provider fields of the archive details except for the object instance identifier.
                  +The type of the body of the object should be checked against the declared type in the relevant service specification, if different an INVALID error is raised.
                  +If any error is returned then the store operation shall be rolled back and nothing is stored as a result of the operation.
                  +     * @param objType objType Argument number 1 as defined by the service operation
                  +     * @param domain domain Argument number 2 as defined by the service operation
                  +     * @param objDetails objDetails Argument number 3 as defined by the service operation
                  +     * @param objBodies objBodies Argument number 4 as defined by the service operation
                  +     * @return The return value of the interaction
                  +     * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification.
                  +     * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception
                  +     */
                  +    public org.ccsds.moims.mo.mal.structures.LongList store(Boolean returnObjInstIds,
                  +            org.ccsds.moims.mo.com.structures.ObjectType objType,
                  +            org.ccsds.moims.mo.mal.structures.IdentifierList domain,
                  +            org.ccsds.moims.mo.com.archive.structures.ArchiveDetailsList objDetails,
                  +            org.ccsds.moims.mo.mal.structures.HeterogeneousList objBodies) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException {
                  +        org.ccsds.moims.mo.mal.transport.MALMessageBody body = consumer.request(org.ccsds.moims.mo.com.archive.ArchiveServiceInfo.STORE_OP, (returnObjInstIds == null) ? null : new org.ccsds.moims.mo.mal.structures.Union(returnObjInstIds), objType, domain, objDetails, objBodies);
                  +        Object body0 = (Object) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.LongList());
                  +        return (org.ccsds.moims.mo.mal.structures.LongList) body0;
                  +    }
                  +
                  +    /**
                  +     * Asynchronous version of method store.
                  +     * 
                  +     * @param returnObjInstIds The first part of the request indicates whether the operation should return the object instance identifiers used, if TRUE it shall return them, otherwise it returns NULL.
                  +The second part of the request shall contain the type of object being stored.
                  +The third part of the request shall contain the domain of the objects being stored.
                  +The fourth part of the request shall contain the list of archive details to use, one for each object being stored.
                  +If the object instance identifier supplied in the archive details is set to 0 then the store operation shall allocate a new and unused object instance identifier.
                  +If the object instance identifier supplied in the archive details is not set to 0 and is currently used in the archive then a DUPLICATE error is returned and no objects from the request shall be stored.
                  +The fifth part of the request shall contain the list of objects to store.
                  +The fourth and fifth list must be the same size as there is only one entry in each for each object to be stored. If they differ in size an INVALID error is returned with the extra error information integer giving the index of the list entry without a matching entry in the other list.
                  +An INVALID error shall be returned if a wildcard value of '0' is used in the object type.
                  +An INVALID error shall be returned if a wildcard value of '*' is used in the domain identifier list.
                  +An INVALID error shall be returned if the values of '0', '*', or NULL are used in the network, timestamp or provider fields of the archive details except for the object instance identifier.
                  +The type of the body of the object should be checked against the declared type in the relevant service specification, if different an INVALID error is raised.
                  +If any error is returned then the store operation shall be rolled back and nothing is stored as a result of the operation.
                  +     * @param objType objType Argument number 1 as defined by the service operation
                  +     * @param domain domain Argument number 2 as defined by the service operation
                  +     * @param objDetails objDetails Argument number 3 as defined by the service operation
                  +     * @param objBodies objBodies Argument number 4 as defined by the service operation
                  +     * @param adapter adapter Listener in charge of receiving the messages from the service provider
                  +     * @return the MAL message sent to initiate the interaction
                  +     * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification.
                  +     * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception
                  +     */
                  +    public org.ccsds.moims.mo.mal.transport.MALMessage asyncStore(Boolean returnObjInstIds,
                  +            org.ccsds.moims.mo.com.structures.ObjectType objType,
                  +            org.ccsds.moims.mo.mal.structures.IdentifierList domain,
                  +            org.ccsds.moims.mo.com.archive.structures.ArchiveDetailsList objDetails,
                  +            org.ccsds.moims.mo.mal.structures.HeterogeneousList objBodies,
                  +            org.ccsds.moims.mo.com.archive.consumer.ArchiveAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException {
                  +        return consumer.asyncRequest(org.ccsds.moims.mo.com.archive.ArchiveServiceInfo.STORE_OP, adapter, (returnObjInstIds == null) ? null : new org.ccsds.moims.mo.mal.structures.Union(returnObjInstIds), objType, domain, objDetails, objBodies);
                  +    }
                  +
                  +    /**
                  +     * Continues a previously started interaction.
                  +     * 
                  +     * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue
                  +     * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message
                  +     * @param transactionId transactionId Transaction identifier of the interaction to continue
                  +     * @param adapter adapter Listener in charge of receiving the messages from the service provider
                  +     * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification.
                  +     * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception
                  +     */
                  +    public void continueStore(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage,
                  +            org.ccsds.moims.mo.mal.structures.Time initiationTimestamp,
                  +            Long transactionId,
                  +            org.ccsds.moims.mo.com.archive.consumer.ArchiveAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException {
                  +        consumer.continueInteraction(org.ccsds.moims.mo.com.archive.ArchiveServiceInfo.STORE_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter);
                  +    }
                  +
                  +    /**
                  +     * Updates an object (or set of objects), causes an ObjectUpdated event to
                  +     * be published by the archive.
                  +     * 
                  +     * @param objType The first part of the request shall contain the type of object being updated.
                  +The second part of the request shall contain the domain of the objects being updated.
                  +The third part of the request shall contain the list of ArchiveDetails.
                  +The object instance identifier contained in the ArchiveDetails, combined with the object type and domain from the request, shall be used to match objects.
                  +If requested object cannot be matched then an UNKNOWN error shall be returned and nothing will be updated.
                  +The remainder of the ArchiveDetails shall be used to update the matched objects.
                  +The fourth part of the request shall contain the list of objects to replace the matched objects with.
                  +No wildcard values shall be accepted in the object type, the domain, and the object instance identifier, an INVALID error is returned in this case and no objects are updated.
                  +     * @param domain domain Argument number 1 as defined by the service operation
                  +     * @param objDetails objDetails Argument number 2 as defined by the service operation
                  +     * @param objBodies objBodies Argument number 3 as defined by the service operation
                  +     * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification.
                  +     * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception
                  +     */
                  +    public void update(org.ccsds.moims.mo.com.structures.ObjectType objType,
                  +            org.ccsds.moims.mo.mal.structures.IdentifierList domain,
                  +            org.ccsds.moims.mo.com.archive.structures.ArchiveDetailsList objDetails,
                  +            org.ccsds.moims.mo.mal.structures.HeterogeneousList objBodies) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException {
                  +        consumer.submit(org.ccsds.moims.mo.com.archive.ArchiveServiceInfo.UPDATE_OP, objType, domain, objDetails, objBodies);
                  +    }
                  +
                  +    /**
                  +     * Asynchronous version of method update.
                  +     * 
                  +     * @param objType The first part of the request shall contain the type of object being updated.
                  +The second part of the request shall contain the domain of the objects being updated.
                  +The third part of the request shall contain the list of ArchiveDetails.
                  +The object instance identifier contained in the ArchiveDetails, combined with the object type and domain from the request, shall be used to match objects.
                  +If requested object cannot be matched then an UNKNOWN error shall be returned and nothing will be updated.
                  +The remainder of the ArchiveDetails shall be used to update the matched objects.
                  +The fourth part of the request shall contain the list of objects to replace the matched objects with.
                  +No wildcard values shall be accepted in the object type, the domain, and the object instance identifier, an INVALID error is returned in this case and no objects are updated.
                  +     * @param domain domain Argument number 1 as defined by the service operation
                  +     * @param objDetails objDetails Argument number 2 as defined by the service operation
                  +     * @param objBodies objBodies Argument number 3 as defined by the service operation
                  +     * @param adapter adapter Listener in charge of receiving the messages from the service provider
                  +     * @return the MAL message sent to initiate the interaction
                  +     * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification.
                  +     * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception
                  +     */
                  +    public org.ccsds.moims.mo.mal.transport.MALMessage asyncUpdate(org.ccsds.moims.mo.com.structures.ObjectType objType,
                  +            org.ccsds.moims.mo.mal.structures.IdentifierList domain,
                  +            org.ccsds.moims.mo.com.archive.structures.ArchiveDetailsList objDetails,
                  +            org.ccsds.moims.mo.mal.structures.HeterogeneousList objBodies,
                  +            org.ccsds.moims.mo.com.archive.consumer.ArchiveAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException {
                  +        return consumer.asyncSubmit(org.ccsds.moims.mo.com.archive.ArchiveServiceInfo.UPDATE_OP, adapter, objType, domain, objDetails, objBodies);
                  +    }
                  +
                  +    /**
                  +     * Continues a previously started interaction.
                  +     * 
                  +     * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue
                  +     * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message
                  +     * @param transactionId transactionId Transaction identifier of the interaction to continue
                  +     * @param adapter adapter Listener in charge of receiving the messages from the service provider
                  +     * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification.
                  +     * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception
                  +     */
                  +    public void continueUpdate(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage,
                  +            org.ccsds.moims.mo.mal.structures.Time initiationTimestamp,
                  +            Long transactionId,
                  +            org.ccsds.moims.mo.com.archive.consumer.ArchiveAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException {
                  +        consumer.continueInteraction(org.ccsds.moims.mo.com.archive.ArchiveServiceInfo.UPDATE_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter);
                  +    }
                  +
                  +    /**
                  +     * Deletes an object (or set of objects) and causes an ObjectDeleted event
                  +     * to be published by the archive.
                  +     * 
                  +     * @param objType The first part of the request shall contain the type of object to match and is not permitted to contain the wildcard value.
                  +The second part of the request shall contain the domain of the objects to match and is not permitted to contain the wildcard value.
                  +If either the first or second part contain a wildcard value then an INVALID error shall be returned and no object deleted.
                  +The third part of the request shall contain the list of object instance identifiers to match.
                  +If the object instance identifier list contains the wildcard value '0' then all object instances shall be matched.
                  +If any explicitly requested object cannot be matched then an UNKNOWN error shall be returned and nothing will be deleted.
                  +The matched objects shall be deleted from the archive.
                  +     * @param domain domain Argument number 1 as defined by the service operation
                  +     * @param objInstIds objInstIds Argument number 2 as defined by the service operation
                  +     * @return The return value of the interaction
                  +     * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification.
                  +     * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception
                  +     */
                  +    public org.ccsds.moims.mo.mal.structures.LongList delete(org.ccsds.moims.mo.com.structures.ObjectType objType,
                  +            org.ccsds.moims.mo.mal.structures.IdentifierList domain,
                  +            org.ccsds.moims.mo.mal.structures.LongList objInstIds) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException {
                  +        org.ccsds.moims.mo.mal.transport.MALMessageBody body = consumer.request(org.ccsds.moims.mo.com.archive.ArchiveServiceInfo.DELETE_OP, objType, domain, objInstIds);
                  +        Object body0 = (Object) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.LongList());
                  +        return (org.ccsds.moims.mo.mal.structures.LongList) body0;
                  +    }
                  +
                  +    /**
                  +     * Asynchronous version of method delete.
                  +     * 
                  +     * @param objType The first part of the request shall contain the type of object to match and is not permitted to contain the wildcard value.
                  +The second part of the request shall contain the domain of the objects to match and is not permitted to contain the wildcard value.
                  +If either the first or second part contain a wildcard value then an INVALID error shall be returned and no object deleted.
                  +The third part of the request shall contain the list of object instance identifiers to match.
                  +If the object instance identifier list contains the wildcard value '0' then all object instances shall be matched.
                  +If any explicitly requested object cannot be matched then an UNKNOWN error shall be returned and nothing will be deleted.
                  +The matched objects shall be deleted from the archive.
                  +     * @param domain domain Argument number 1 as defined by the service operation
                  +     * @param objInstIds objInstIds Argument number 2 as defined by the service operation
                  +     * @param adapter adapter Listener in charge of receiving the messages from the service provider
                  +     * @return the MAL message sent to initiate the interaction
                  +     * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification.
                  +     * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception
                  +     */
                  +    public org.ccsds.moims.mo.mal.transport.MALMessage asyncDelete(org.ccsds.moims.mo.com.structures.ObjectType objType,
                  +            org.ccsds.moims.mo.mal.structures.IdentifierList domain,
                  +            org.ccsds.moims.mo.mal.structures.LongList objInstIds,
                  +            org.ccsds.moims.mo.com.archive.consumer.ArchiveAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException {
                  +        return consumer.asyncRequest(org.ccsds.moims.mo.com.archive.ArchiveServiceInfo.DELETE_OP, adapter, objType, domain, objInstIds);
                  +    }
                  +
                  +    /**
                  +     * Continues a previously started interaction.
                  +     * 
                  +     * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue
                  +     * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message
                  +     * @param transactionId transactionId Transaction identifier of the interaction to continue
                  +     * @param adapter adapter Listener in charge of receiving the messages from the service provider
                  +     * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification.
                  +     * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception
                  +     */
                  +    public void continueDelete(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage,
                  +            org.ccsds.moims.mo.mal.structures.Time initiationTimestamp,
                  +            Long transactionId,
                  +            org.ccsds.moims.mo.com.archive.consumer.ArchiveAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException {
                  +        consumer.continueInteraction(org.ccsds.moims.mo.com.archive.ArchiveServiceInfo.DELETE_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter);
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/consumer/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/consumer/package-info.java
                  new file mode 100644
                  index 00000000..b4431193
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/consumer/package-info.java
                  @@ -0,0 +1,4 @@
                  +/**
                  + * Package containing the consumer stubs for the Archive service.
                  +*/
                  +package org.ccsds.moims.mo.com.archive.consumer;
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/package-info.java
                  new file mode 100644
                  index 00000000..bb5e4115
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/package-info.java
                  @@ -0,0 +1,16 @@
                  +/**
                  + * The Archive service provides a basic interface to a standard archiving
                  + * function. It follows the basic CRUD principles and allows simple querying
                  + * of the archive. It provides operations to add new objects to an archive,
                  + * delete objects from an archive, update existing objects in an archive,
                  + * and also query the content of the archive.
                  + * The query operation provides a basic querying ability, allowing a consumer
                  + * to filter on fields from the object headers (such as domain etc) and also
                  + * filter on the body of the object if it uses the MAL data type specification.
                  + * The query operation is extensible but the extensions would be outside this
                  + * standard.
                  + * Finally, a consumer of the archive can monitor it for changes by subscribing
                  + * for archive events from the event service. Any change to the archive is
                  + * published using the event service if it is supported by an implementation.
                  +*/
                  +package org.ccsds.moims.mo.com.archive;
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/provider/ArchiveHandler.java b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/provider/ArchiveHandler.java
                  new file mode 100644
                  index 00000000..f41b2b99
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/provider/ArchiveHandler.java
                  @@ -0,0 +1,165 @@
                  +package org.ccsds.moims.mo.com.archive.provider;
                  +
                  +/**
                  + * Interface that providers of the Archive service must implement to handle
                  + * the operations of that service.
                  + */
                  +public interface ArchiveHandler {
                  +
                  +    /**
                  +     * Implements the operation retrieve.
                  +     * 
                  +     * @param objType The first part of the request shall contain the type of the object required.
                  +If any of the fields of the object type contains the wildcard value of '0' then an INVALID error shall be returned.
                  +The second part of the request shall contain the domain to match.
                  +If the domain contains the wildcard value of '*' then an INVALID error shall be returned.
                  +The third part of the request shall contain the list of object instance identifiers to match.
                  +If the object instance identifier list contains the wildcard value '0' then all object instances shall be matched.
                  +If any explicitly requested object cannot be matched then an UNKNOWN error shall be returned.
                  +     * @param domain domain Argument number 1 as defined by the service operation
                  +     * @param objInstIds objInstIds Argument number 2 as defined by the service operation
                  +     * @param interaction The MAL object representing the interaction in the provider.
                  +     * @throws org.ccsds.moims.mo.com.InvalidException The request contains a wildcard value in either the object type field or the domain.
                  +     * @throws org.ccsds.moims.mo.mal.UnknownException One or more of the requested objects specified in the operation do not exist and therefore cannot be found.
                  +     * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification.
                  +     * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception
                  +     */
                  +    void retrieve(org.ccsds.moims.mo.com.structures.ObjectType objType,
                  +            org.ccsds.moims.mo.mal.structures.IdentifierList domain,
                  +            org.ccsds.moims.mo.mal.structures.LongList objInstIds,
                  +            org.ccsds.moims.mo.com.archive.provider.RetrieveInteraction interaction) throws org.ccsds.moims.mo.com.InvalidException, org.ccsds.moims.mo.mal.UnknownException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException;
                  +    /**
                  +     * Implements the operation query.
                  +     * 
                  +     * @param returnBody The first part of the request shall contain a Boolean that if set to TRUE requests that the body of the objects is returned otherwise only the ObjectType and ArchiveDetails shall be returned and the returned list of the bodies of the objects shall be replaced with a NULL.
                  +The second part of the request shall contain the type of the object required.
                  +Each part of the object type may contain the wildcard value of '0'.
                  +The third and fourth parts of the request shall contain the queries to evaluate.
                  +A single query shall be formed by the combination of an ArchiveQuery from the first list and a QueryFilter from the second list.
                  +The two lists shall be ordered identically so that the query and the filter parts can be matched together.
                  +If a query does not contain a QueryFilter part then that entry in the QueryFilter list shall be replaced with a NULL value.
                  +If the request does not contain any QueryFilters then the complete list may be replaced with a NULL.
                  +The size of the two lists must be the same unless the complete second list is replaced with a NULL otherwise an INVALID error shall be raised.
                  +For each query, the ArchiveQuery and the QueryFilter shall contain the COM object fields to filter on.
                  +The ArchiveQuery may contain the wildcard value of NULL on each of the fields.
                  +If an ArchiveQuery contains an end time but no start time then it shall match the single object that has a timestamp closest to, but not greater than, the end time field.
                  +The end time field may specify a time in the future.
                  +If the sortFieldName of the ArchiveQuery does not reference a defined field then an INVALID error shall be returned.
                  +Each query shall be evaluated separately from each other, the filter of one query will not affect the filter of another. This forms a logical OR operation.
                  +If the QueryFilter contains an error then an INVALID error shall be returned. The definition of erroneous values are filter specific and defined in the relevant filter structure specification.
                  +     * @param objType objType Argument number 1 as defined by the service operation
                  +     * @param archiveQuery archiveQuery Argument number 2 as defined by the service operation
                  +     * @param queryFilter queryFilter Argument number 3 as defined by the service operation
                  +     * @param interaction The MAL object representing the interaction in the provider.
                  +     * @throws org.ccsds.moims.mo.com.InvalidException One or more of the query filters supplied contains an invalid value.
                  +     * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification.
                  +     * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception
                  +     */
                  +    void query(Boolean returnBody,
                  +            org.ccsds.moims.mo.com.structures.ObjectType objType,
                  +            org.ccsds.moims.mo.com.archive.structures.ArchiveQueryList archiveQuery,
                  +            org.ccsds.moims.mo.com.archive.structures.QueryFilterList queryFilter,
                  +            org.ccsds.moims.mo.com.archive.provider.QueryInteraction interaction) throws org.ccsds.moims.mo.com.InvalidException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException;
                  +    /**
                  +     * Implements the operation count.
                  +     * 
                  +     * @param objType The ObjectType, ArchiveQuery and QueryFilter parts of the request shall be populated exactly the same as for the query operation.
                  +     * @param archiveQuery archiveQuery Argument number 1 as defined by the service operation
                  +     * @param queryFilter queryFilter Argument number 2 as defined by the service operation
                  +     * @param interaction The MAL object representing the interaction in the provider.
                  +     * @throws org.ccsds.moims.mo.com.InvalidException One or more of the query filters supplied contains an invalid value.
                  +     * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification.
                  +     * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception
                  +     */
                  +    void count(org.ccsds.moims.mo.com.structures.ObjectType objType,
                  +            org.ccsds.moims.mo.com.archive.structures.ArchiveQueryList archiveQuery,
                  +            org.ccsds.moims.mo.com.archive.structures.QueryFilterList queryFilter,
                  +            org.ccsds.moims.mo.com.archive.provider.CountInteraction interaction) throws org.ccsds.moims.mo.com.InvalidException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException;
                  +    /**
                  +     * Implements the operation store.
                  +     * 
                  +     * @param returnObjInstIds The first part of the request indicates whether the operation should return the object instance identifiers used, if TRUE it shall return them, otherwise it returns NULL.
                  +The second part of the request shall contain the type of object being stored.
                  +The third part of the request shall contain the domain of the objects being stored.
                  +The fourth part of the request shall contain the list of archive details to use, one for each object being stored.
                  +If the object instance identifier supplied in the archive details is set to 0 then the store operation shall allocate a new and unused object instance identifier.
                  +If the object instance identifier supplied in the archive details is not set to 0 and is currently used in the archive then a DUPLICATE error is returned and no objects from the request shall be stored.
                  +The fifth part of the request shall contain the list of objects to store.
                  +The fourth and fifth list must be the same size as there is only one entry in each for each object to be stored. If they differ in size an INVALID error is returned with the extra error information integer giving the index of the list entry without a matching entry in the other list.
                  +An INVALID error shall be returned if a wildcard value of '0' is used in the object type.
                  +An INVALID error shall be returned if a wildcard value of '*' is used in the domain identifier list.
                  +An INVALID error shall be returned if the values of '0', '*', or NULL are used in the network, timestamp or provider fields of the archive details except for the object instance identifier.
                  +The type of the body of the object should be checked against the declared type in the relevant service specification, if different an INVALID error is raised.
                  +If any error is returned then the store operation shall be rolled back and nothing is stored as a result of the operation.
                  +     * @param objType objType Argument number 1 as defined by the service operation
                  +     * @param domain domain Argument number 2 as defined by the service operation
                  +     * @param objDetails objDetails Argument number 3 as defined by the service operation
                  +     * @param objBodies objBodies Argument number 4 as defined by the service operation
                  +     * @param interaction The MAL object representing the interaction in the provider.
                  +     * @return The return value of the operation
                  +     * @throws org.ccsds.moims.mo.com.DuplicateException One or more of the objects being stored has supplied an object instance identifier that is already in use in the archive.
                  +     * @throws org.ccsds.moims.mo.com.InvalidException One or more of the objects being stored contains an invalid value.
                  +     * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification.
                  +     * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception
                  +     */
                  +    org.ccsds.moims.mo.mal.structures.LongList store(Boolean returnObjInstIds,
                  +            org.ccsds.moims.mo.com.structures.ObjectType objType,
                  +            org.ccsds.moims.mo.mal.structures.IdentifierList domain,
                  +            org.ccsds.moims.mo.com.archive.structures.ArchiveDetailsList objDetails,
                  +            org.ccsds.moims.mo.mal.structures.HeterogeneousList objBodies,
                  +            org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.com.DuplicateException, org.ccsds.moims.mo.com.InvalidException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException;
                  +    /**
                  +     * Implements the operation update.
                  +     * 
                  +     * @param objType The first part of the request shall contain the type of object being updated.
                  +The second part of the request shall contain the domain of the objects being updated.
                  +The third part of the request shall contain the list of ArchiveDetails.
                  +The object instance identifier contained in the ArchiveDetails, combined with the object type and domain from the request, shall be used to match objects.
                  +If requested object cannot be matched then an UNKNOWN error shall be returned and nothing will be updated.
                  +The remainder of the ArchiveDetails shall be used to update the matched objects.
                  +The fourth part of the request shall contain the list of objects to replace the matched objects with.
                  +No wildcard values shall be accepted in the object type, the domain, and the object instance identifier, an INVALID error is returned in this case and no objects are updated.
                  +     * @param domain domain Argument number 1 as defined by the service operation
                  +     * @param objDetails objDetails Argument number 2 as defined by the service operation
                  +     * @param objBodies objBodies Argument number 3 as defined by the service operation
                  +     * @param interaction The MAL object representing the interaction in the provider.
                  +     * @throws org.ccsds.moims.mo.mal.UnknownException One or more of the requested objects specified in the operation do not exist and therefore cannot be found.
                  +     * @throws org.ccsds.moims.mo.com.InvalidException One or more of the objects being updated contains a wildcard value in the object identifier fields.
                  +     * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification.
                  +     * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception
                  +     */
                  +    void update(org.ccsds.moims.mo.com.structures.ObjectType objType,
                  +            org.ccsds.moims.mo.mal.structures.IdentifierList domain,
                  +            org.ccsds.moims.mo.com.archive.structures.ArchiveDetailsList objDetails,
                  +            org.ccsds.moims.mo.mal.structures.HeterogeneousList objBodies,
                  +            org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mal.UnknownException, org.ccsds.moims.mo.com.InvalidException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException;
                  +    /**
                  +     * Implements the operation delete.
                  +     * 
                  +     * @param objType The first part of the request shall contain the type of object to match and is not permitted to contain the wildcard value.
                  +The second part of the request shall contain the domain of the objects to match and is not permitted to contain the wildcard value.
                  +If either the first or second part contain a wildcard value then an INVALID error shall be returned and no object deleted.
                  +The third part of the request shall contain the list of object instance identifiers to match.
                  +If the object instance identifier list contains the wildcard value '0' then all object instances shall be matched.
                  +If any explicitly requested object cannot be matched then an UNKNOWN error shall be returned and nothing will be deleted.
                  +The matched objects shall be deleted from the archive.
                  +     * @param domain domain Argument number 1 as defined by the service operation
                  +     * @param objInstIds objInstIds Argument number 2 as defined by the service operation
                  +     * @param interaction The MAL object representing the interaction in the provider.
                  +     * @return The return value of the operation
                  +     * @throws org.ccsds.moims.mo.mal.UnknownException One or more of the requested objects specified in the operation do not exist and therefore cannot be found.
                  +     * @throws org.ccsds.moims.mo.com.InvalidException The supplied object type or domain contains a wildcard value.
                  +     * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification.
                  +     * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception
                  +     */
                  +    org.ccsds.moims.mo.mal.structures.LongList delete(org.ccsds.moims.mo.com.structures.ObjectType objType,
                  +            org.ccsds.moims.mo.mal.structures.IdentifierList domain,
                  +            org.ccsds.moims.mo.mal.structures.LongList objInstIds,
                  +            org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mal.UnknownException, org.ccsds.moims.mo.com.InvalidException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException;
                  +    /**
                  +     * Sets the skeleton to be used for creation of publishers.
                  +     * 
                  +     * @param skeleton The skeleton to be used.
                  +     */
                  +    void setSkeleton(org.ccsds.moims.mo.com.archive.provider.ArchiveSkeleton skeleton);
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/provider/ArchiveInheritanceSkeleton.java b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/provider/ArchiveInheritanceSkeleton.java
                  new file mode 100644
                  index 00000000..bec36b75
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/provider/ArchiveInheritanceSkeleton.java
                  @@ -0,0 +1,158 @@
                  +package org.ccsds.moims.mo.com.archive.provider;
                  +
                  +/**
                  + * Provider Inheritance skeleton for ArchiveInheritanceSkeleton service.
                  + */
                  +public abstract class ArchiveInheritanceSkeleton implements org.ccsds.moims.mo.mal.provider.MALInteractionHandler, org.ccsds.moims.mo.com.archive.provider.ArchiveSkeleton, org.ccsds.moims.mo.com.archive.provider.ArchiveHandler {
                  +
                  +    /**
                  +     * The providerSet field.
                  +     */
                  +    private org.ccsds.moims.mo.mal.provider.MALProviderSet providerSet = new org.ccsds.moims.mo.mal.provider.MALProviderSet(org.ccsds.moims.mo.com.archive.ArchiveHelper.ARCHIVE_SERVICE);
                  +
                  +    /**
                  +     * Returns the connection object for this provider.
                  +     * 
                  +     * @return the connection object for this provider
                  +     * @throws java.io.IOException if the method was not implemented yet.
                  +     */
                  +    public org.ccsds.moims.mo.mal.helpertools.connections.ConnectionProvider getConnection() throws java.io.IOException {
                  +        throw new java.io.IOException("This method needs to be overridden!");
                  +    }
                  +
                  +    @Override
                  +    public void setSkeleton(org.ccsds.moims.mo.com.archive.provider.ArchiveSkeleton skeleton) {
                  +        // Not used in the inheritance pattern (the skeleton is 'this');
                  +    }
                  +
                  +    @Override
                  +    public void malInitialize(org.ccsds.moims.mo.mal.provider.MALProvider provider) throws org.ccsds.moims.mo.mal.MALException {
                  +        providerSet.addProvider(provider);
                  +    }
                  +
                  +    @Override
                  +    public void malFinalize(org.ccsds.moims.mo.mal.provider.MALProvider provider) throws org.ccsds.moims.mo.mal.MALException {
                  +        providerSet.removeProvider(provider);
                  +    }
                  +
                  +    @Override
                  +    public void handleSend(org.ccsds.moims.mo.mal.provider.MALInteraction interaction,
                  +            org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException {
                  +        int opNumber = interaction.getOperation().getNumber().getValue();
                  +        switch (opNumber) {
                  +          default:
                  +            throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException(
                  +                    org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber));
                  +        }
                  +    }
                  +
                  +    @Override
                  +    public void handleSubmit(org.ccsds.moims.mo.mal.provider.MALSubmit interaction,
                  +            org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException {
                  +        int opNumber = interaction.getOperation().getNumber().getValue();
                  +        try {
                  +        switch (opNumber) {
                  +          case org.ccsds.moims.mo.com.archive.ArchiveServiceInfo._UPDATE_OP_NUMBER:
                  +            update((org.ccsds.moims.mo.com.structures.ObjectType) body.getBodyElement(0, new org.ccsds.moims.mo.com.structures.ObjectType()),
                  +                (org.ccsds.moims.mo.mal.structures.IdentifierList) body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.IdentifierList()),
                  +                (org.ccsds.moims.mo.com.archive.structures.ArchiveDetailsList) body.getBodyElement(2, new org.ccsds.moims.mo.com.archive.structures.ArchiveDetailsList()),
                  +                (org.ccsds.moims.mo.mal.structures.HeterogeneousList) body.getBodyElement(3, null),
                  +                interaction);
                  +            interaction.sendAcknowledgement();
                  +            break;
                  +          default:
                  +            interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException(
                  +                    org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber));
                  +            throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException(
                  +                    org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber));
                  +        }
                  +        } catch (org.ccsds.moims.mo.mal.MOErrorException error) {
                  +          throw new org.ccsds.moims.mo.mal.MALInteractionException(error);
                  +        }
                  +    }
                  +
                  +    @Override
                  +    public void handleRequest(org.ccsds.moims.mo.mal.provider.MALRequest interaction,
                  +            org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException {
                  +        int opNumber = interaction.getOperation().getNumber().getValue();
                  +        try {
                  +        switch (opNumber) {
                  +          case org.ccsds.moims.mo.com.archive.ArchiveServiceInfo._STORE_OP_NUMBER:
                  +            interaction.sendResponse(store((body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.Union(Boolean.FALSE)) == null) ? null : ((org.ccsds.moims.mo.mal.structures.Union) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.Union(Boolean.FALSE))).getBooleanValue(),
                  +                (org.ccsds.moims.mo.com.structures.ObjectType) body.getBodyElement(1, new org.ccsds.moims.mo.com.structures.ObjectType()),
                  +                (org.ccsds.moims.mo.mal.structures.IdentifierList) body.getBodyElement(2, new org.ccsds.moims.mo.mal.structures.IdentifierList()),
                  +                (org.ccsds.moims.mo.com.archive.structures.ArchiveDetailsList) body.getBodyElement(3, new org.ccsds.moims.mo.com.archive.structures.ArchiveDetailsList()),
                  +                (org.ccsds.moims.mo.mal.structures.HeterogeneousList) body.getBodyElement(4, null),
                  +                interaction));
                  +            break;
                  +          case org.ccsds.moims.mo.com.archive.ArchiveServiceInfo._DELETE_OP_NUMBER:
                  +            interaction.sendResponse(delete((org.ccsds.moims.mo.com.structures.ObjectType) body.getBodyElement(0, new org.ccsds.moims.mo.com.structures.ObjectType()),
                  +                (org.ccsds.moims.mo.mal.structures.IdentifierList) body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.IdentifierList()),
                  +                (org.ccsds.moims.mo.mal.structures.LongList) body.getBodyElement(2, new org.ccsds.moims.mo.mal.structures.LongList()),
                  +                interaction));
                  +            break;
                  +          default:
                  +            interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException(
                  +                    org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber));
                  +            throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException(
                  +                    org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber));
                  +        }
                  +        } catch (org.ccsds.moims.mo.mal.MOErrorException error) {
                  +          throw new org.ccsds.moims.mo.mal.MALInteractionException(error);
                  +        }
                  +    }
                  +
                  +    @Override
                  +    public void handleInvoke(org.ccsds.moims.mo.mal.provider.MALInvoke interaction,
                  +            org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException {
                  +        int opNumber = interaction.getOperation().getNumber().getValue();
                  +        try {
                  +        switch (opNumber) {
                  +          case org.ccsds.moims.mo.com.archive.ArchiveServiceInfo._RETRIEVE_OP_NUMBER:
                  +            retrieve((org.ccsds.moims.mo.com.structures.ObjectType) body.getBodyElement(0, new org.ccsds.moims.mo.com.structures.ObjectType()),
                  +                (org.ccsds.moims.mo.mal.structures.IdentifierList) body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.IdentifierList()),
                  +                (org.ccsds.moims.mo.mal.structures.LongList) body.getBodyElement(2, new org.ccsds.moims.mo.mal.structures.LongList()),
                  +                new RetrieveInteraction(interaction));
                  +            break;
                  +          case org.ccsds.moims.mo.com.archive.ArchiveServiceInfo._COUNT_OP_NUMBER:
                  +            count((org.ccsds.moims.mo.com.structures.ObjectType) body.getBodyElement(0, new org.ccsds.moims.mo.com.structures.ObjectType()),
                  +                (org.ccsds.moims.mo.com.archive.structures.ArchiveQueryList) body.getBodyElement(1, new org.ccsds.moims.mo.com.archive.structures.ArchiveQueryList()),
                  +                (org.ccsds.moims.mo.com.archive.structures.QueryFilterList) body.getBodyElement(2, new org.ccsds.moims.mo.com.archive.structures.QueryFilterList()),
                  +                new CountInteraction(interaction));
                  +            break;
                  +          default:
                  +            interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException(
                  +                    org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber));
                  +            throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException(
                  +                    org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber));
                  +        }
                  +        } catch (org.ccsds.moims.mo.mal.MOErrorException error) {
                  +          throw new org.ccsds.moims.mo.mal.MALInteractionException(error);
                  +        }
                  +    }
                  +
                  +    @Override
                  +    public void handleProgress(org.ccsds.moims.mo.mal.provider.MALProgress interaction,
                  +            org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException {
                  +        int opNumber = interaction.getOperation().getNumber().getValue();
                  +        try {
                  +        switch (opNumber) {
                  +          case org.ccsds.moims.mo.com.archive.ArchiveServiceInfo._QUERY_OP_NUMBER:
                  +            query((body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.Union(Boolean.FALSE)) == null) ? null : ((org.ccsds.moims.mo.mal.structures.Union) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.Union(Boolean.FALSE))).getBooleanValue(),
                  +                (org.ccsds.moims.mo.com.structures.ObjectType) body.getBodyElement(1, new org.ccsds.moims.mo.com.structures.ObjectType()),
                  +                (org.ccsds.moims.mo.com.archive.structures.ArchiveQueryList) body.getBodyElement(2, new org.ccsds.moims.mo.com.archive.structures.ArchiveQueryList()),
                  +                (org.ccsds.moims.mo.com.archive.structures.QueryFilterList) body.getBodyElement(3, new org.ccsds.moims.mo.com.archive.structures.QueryFilterList()),
                  +                new QueryInteraction(interaction));
                  +            break;
                  +          default:
                  +            interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException(
                  +                    org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber));
                  +            throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException(
                  +                    org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber));
                  +        }
                  +        } catch (org.ccsds.moims.mo.mal.MOErrorException error) {
                  +          throw new org.ccsds.moims.mo.mal.MALInteractionException(error);
                  +        }
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/provider/ArchiveSkeleton.java b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/provider/ArchiveSkeleton.java
                  new file mode 100644
                  index 00000000..d49ae61c
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/provider/ArchiveSkeleton.java
                  @@ -0,0 +1,8 @@
                  +package org.ccsds.moims.mo.com.archive.provider;
                  +
                  +/**
                  + * The skeleton interface for the Archive service.
                  + */
                  +public interface ArchiveSkeleton {
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/provider/CountInteraction.java b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/provider/CountInteraction.java
                  new file mode 100644
                  index 00000000..88c740f3
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/provider/CountInteraction.java
                  @@ -0,0 +1,70 @@
                  +package org.ccsds.moims.mo.com.archive.provider;
                  +
                  +/**
                  + * Provider INVOKE interaction class for Archive::count operation.
                  + */
                  +public class CountInteraction {
                  +
                  +    /**
                  +     * The interaction field.
                  +     */
                  +    private org.ccsds.moims.mo.mal.provider.MALInvoke interaction;
                  +
                  +    /**
                  +     * Wraps the provided MAL interaction object with methods for sending responses
                  +     * to an INVOKE interaction from a provider.
                  +     * 
                  +     * @param interaction The MAL interaction action object to use.
                  +     */
                  +    public CountInteraction(org.ccsds.moims.mo.mal.provider.MALInvoke interaction) {
                  +        this.interaction = interaction;
                  +    }
                  +
                  +    /**
                  +     * Returns the MAL interaction object used for returning messages from the
                  +     * provider.
                  +     * 
                  +     * @return The MAL interaction object provided in the constructor
                  +     */
                  +    public org.ccsds.moims.mo.mal.provider.MALInvoke getInteraction() {
                  +        return interaction;
                  +    }
                  +
                  +    /**
                  +     * Sends a INVOKE acknowledge to the consumer.
                  +     * 
                  +     * @return Returns the MAL message created by the acknowledge
                  +     * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification.
                  +     * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception
                  +     */
                  +    public org.ccsds.moims.mo.mal.transport.MALMessage sendAcknowledgement() throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException {
                  +        return interaction.sendAcknowledgement((Object[]) null);
                  +    }
                  +
                  +    /**
                  +     * Sends a INVOKE response to the consumer.
                  +     * 
                  +     * @param counts The response shall contain the count of matched objects.
                  +There shall be an entry in each returned list for each entry in the request list.
                  +The returned lists shall be ordered the same as the request query lists so that the response can be matched to the corresponding request.
                  +     * @return Returns the MAL message created by the response
                  +     * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification.
                  +     * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception
                  +     */
                  +    public org.ccsds.moims.mo.mal.transport.MALMessage sendResponse(org.ccsds.moims.mo.mal.structures.LongList counts) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException {
                  +        return interaction.sendResponse(counts);
                  +    }
                  +
                  +    /**
                  +     * Sends an error to the consumer.
                  +     * 
                  +     * @param error The MAL error to send to the consumer.
                  +     * @return Returns the MAL message created by the error
                  +     * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification.
                  +     * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception
                  +     */
                  +    public org.ccsds.moims.mo.mal.transport.MALMessage sendError(org.ccsds.moims.mo.mal.MOErrorException error) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException {
                  +        return interaction.sendError(error);
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/provider/QueryInteraction.java b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/provider/QueryInteraction.java
                  new file mode 100644
                  index 00000000..b4d1f1a4
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/provider/QueryInteraction.java
                  @@ -0,0 +1,116 @@
                  +package org.ccsds.moims.mo.com.archive.provider;
                  +
                  +/**
                  + * Provider PROGRESS interaction class for Archive::query operation.
                  + */
                  +public class QueryInteraction {
                  +
                  +    /**
                  +     * The interaction field.
                  +     */
                  +    private org.ccsds.moims.mo.mal.provider.MALProgress interaction;
                  +
                  +    /**
                  +     * Wraps the provided MAL interaction object with methods for sending responses
                  +     * to an PROGRESS interaction from a provider.
                  +     * 
                  +     * @param interaction The MAL interaction action object to use.
                  +     */
                  +    public QueryInteraction(org.ccsds.moims.mo.mal.provider.MALProgress interaction) {
                  +        this.interaction = interaction;
                  +    }
                  +
                  +    /**
                  +     * Returns the MAL interaction object used for returning messages from the
                  +     * provider.
                  +     * 
                  +     * @return The MAL interaction object provided in the constructor
                  +     */
                  +    public org.ccsds.moims.mo.mal.provider.MALProgress getInteraction() {
                  +        return interaction;
                  +    }
                  +
                  +    /**
                  +     * Sends a PROGRESS acknowledge to the consumer.
                  +     * 
                  +     * @return Returns the MAL message created by the acknowledge
                  +     * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification.
                  +     * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception
                  +     */
                  +    public org.ccsds.moims.mo.mal.transport.MALMessage sendAcknowledgement() throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException {
                  +        return interaction.sendAcknowledgement((Object[]) null);
                  +    }
                  +
                  +    /**
                  +     * Sends a PROGRESS update to the consumer.
                  +     * 
                  +     * @param objType objType Argument number 0 as defined by the service operation
                  +     * @param domain domain Argument number 1 as defined by the service operation
                  +     * @param objDetails objDetails Argument number 2 as defined by the service operation
                  +     * @param objBodies objBodies Argument number 3 as defined by the service operation
                  +     * @return Returns the MAL message created by the update
                  +     * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification.
                  +     * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception
                  +     */
                  +    public org.ccsds.moims.mo.mal.transport.MALMessage sendUpdate(org.ccsds.moims.mo.com.structures.ObjectType objType,
                  +            org.ccsds.moims.mo.mal.structures.IdentifierList domain,
                  +            org.ccsds.moims.mo.com.archive.structures.ArchiveDetailsList objDetails,
                  +            org.ccsds.moims.mo.mal.structures.HeterogeneousList objBodies) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException {
                  +        return interaction.sendUpdate(objType, domain, objDetails, objBodies);
                  +    }
                  +
                  +    /**
                  +     * Sends a PROGRESS response to the consumer.
                  +     * 
                  +     * @param objType The updates and the responses shall contain the set of matched objects.
                  +If a wildcard was used in the ObjectType part of the request then the updates and response shall contain the ObjectType of each matched object.
                  +If there was not any wildcards in the ObjectType part of the request the ObjectType in the updates and response shall be replaced by a NULL.
                  +The first returned list shall contain the domain of the objects being returned.
                  +If multiple ObjectTypes or domains have been matched then multiple Update message may be returned.
                  +There shall be an entry in the second and third lists for each matched object.
                  +The second returned list shall contain the archive details stored for the matched objects.
                  +If the initial Boolean of the request was True the third returned list shall contain the bodies of the objects.
                  +If the initial Boolean of the request was NULL or False the third returned list shall be replaced by a NULL.
                  +The returned lists shall be sorted based on the sorting options specified in ArchiveQuery.
                  +Each domain/object type pair shall be sorted separately from other domain/object type pairs, there is no requirement for sorting to be applied across domain/object type pairs.
                  +When the field being sorted on contains a NULL value, or does not exist in the matched object (due to a containing composite being NULL), these entries shall be added to the end of the returned list in the order that they are matched.
                  +When no objects have been matched only a response with NULL for each part of the response shall be returned.
                  +     * @param domain domain Argument number 1 as defined by the service operation
                  +     * @param objDetails objDetails Argument number 2 as defined by the service operation
                  +     * @param objBodies objBodies Argument number 3 as defined by the service operation
                  +     * @return Returns the MAL message created by the response
                  +     * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification.
                  +     * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception
                  +     */
                  +    public org.ccsds.moims.mo.mal.transport.MALMessage sendResponse(org.ccsds.moims.mo.com.structures.ObjectType objType,
                  +            org.ccsds.moims.mo.mal.structures.IdentifierList domain,
                  +            org.ccsds.moims.mo.com.archive.structures.ArchiveDetailsList objDetails,
                  +            org.ccsds.moims.mo.mal.structures.HeterogeneousList objBodies) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException {
                  +        return interaction.sendResponse(objType, domain, objDetails, objBodies);
                  +    }
                  +
                  +    /**
                  +     * Sends an error to the consumer.
                  +     * 
                  +     * @param error error The MAL error to send to the consumer.
                  +     * @return Returns the MAL message created by the error
                  +     * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification.
                  +     * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception
                  +     */
                  +    public org.ccsds.moims.mo.mal.transport.MALMessage sendError(org.ccsds.moims.mo.mal.MOErrorException error) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException {
                  +        return interaction.sendError(error);
                  +    }
                  +
                  +    /**
                  +     * Sends an update error to the consumer.
                  +     * 
                  +     * @param error error The MAL error to send to the consumer.
                  +     * @return Returns the MAL message created by the error
                  +     * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification.
                  +     * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception
                  +     */
                  +    public org.ccsds.moims.mo.mal.transport.MALMessage sendUpdateError(org.ccsds.moims.mo.mal.MOErrorException error) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException {
                  +        return interaction.sendUpdateError(error);
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/provider/RetrieveInteraction.java b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/provider/RetrieveInteraction.java
                  new file mode 100644
                  index 00000000..bb2a73be
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/provider/RetrieveInteraction.java
                  @@ -0,0 +1,76 @@
                  +package org.ccsds.moims.mo.com.archive.provider;
                  +
                  +/**
                  + * Provider INVOKE interaction class for Archive::retrieve operation.
                  + */
                  +public class RetrieveInteraction {
                  +
                  +    /**
                  +     * The interaction field.
                  +     */
                  +    private org.ccsds.moims.mo.mal.provider.MALInvoke interaction;
                  +
                  +    /**
                  +     * Wraps the provided MAL interaction object with methods for sending responses
                  +     * to an INVOKE interaction from a provider.
                  +     * 
                  +     * @param interaction The MAL interaction action object to use.
                  +     */
                  +    public RetrieveInteraction(org.ccsds.moims.mo.mal.provider.MALInvoke interaction) {
                  +        this.interaction = interaction;
                  +    }
                  +
                  +    /**
                  +     * Returns the MAL interaction object used for returning messages from the
                  +     * provider.
                  +     * 
                  +     * @return The MAL interaction object provided in the constructor
                  +     */
                  +    public org.ccsds.moims.mo.mal.provider.MALInvoke getInteraction() {
                  +        return interaction;
                  +    }
                  +
                  +    /**
                  +     * Sends a INVOKE acknowledge to the consumer.
                  +     * 
                  +     * @return Returns the MAL message created by the acknowledge
                  +     * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification.
                  +     * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception
                  +     */
                  +    public org.ccsds.moims.mo.mal.transport.MALMessage sendAcknowledgement() throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException {
                  +        return interaction.sendAcknowledgement((Object[]) null);
                  +    }
                  +
                  +    /**
                  +     * Sends a INVOKE response to the consumer.
                  +     * 
                  +     * @param objDetails The response shall contain the set of matched objects.
                  +The first returned list shall contain the matched object instance identifiers and object details of the matched objects.
                  +The second returned list shall contain the object bodies ordered identically to the first list unless no body for the object is declared in the service specification, in which case a NULL replaces the complete list.
                  +There shall be an entry in each returned list for each matched object.
                  +When no objects have been matched only a response with NULL for each part of the response shall be returned.
                  +The ordering of the returned objects is not specified and implementation specific.
                  +If ordering of the returned objects is required then the query operation should be used instead.
                  +     * @param objBodies objBodies Argument number 1 as defined by the service operation
                  +     * @return Returns the MAL message created by the response
                  +     * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification.
                  +     * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception
                  +     */
                  +    public org.ccsds.moims.mo.mal.transport.MALMessage sendResponse(org.ccsds.moims.mo.com.archive.structures.ArchiveDetailsList objDetails,
                  +            org.ccsds.moims.mo.mal.structures.HeterogeneousList objBodies) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException {
                  +        return interaction.sendResponse(objDetails, objBodies);
                  +    }
                  +
                  +    /**
                  +     * Sends an error to the consumer.
                  +     * 
                  +     * @param error The MAL error to send to the consumer.
                  +     * @return Returns the MAL message created by the error
                  +     * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification.
                  +     * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception
                  +     */
                  +    public org.ccsds.moims.mo.mal.transport.MALMessage sendError(org.ccsds.moims.mo.mal.MOErrorException error) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException {
                  +        return interaction.sendError(error);
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/provider/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/provider/package-info.java
                  new file mode 100644
                  index 00000000..39e89f60
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/provider/package-info.java
                  @@ -0,0 +1,4 @@
                  +/**
                  + * Package containing the provider skeletons for the Archive service.
                  +*/
                  +package org.ccsds.moims.mo.com.archive.provider;
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/structures/ArchiveDetails.java b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/structures/ArchiveDetails.java
                  new file mode 100644
                  index 00000000..882c4433
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/structures/ArchiveDetails.java
                  @@ -0,0 +1,246 @@
                  +package org.ccsds.moims.mo.com.archive.structures;
                  +
                  +/**
                  + * The ArchiveDetails structure is used to hold information about a single
                  + * entry in an Archive.
                  + */
                  +public final class ArchiveDetails implements org.ccsds.moims.mo.mal.structures.Composite {
                  +
                  +    private static final long serialVersionUID = 562958560133121L;
                  +    /**
                  +     * The TypeId of this Element as a long.
                  +     */
                  +    public static final Long SHORT_FORM = 562958560133121L;
                  +    /**
                  +     * The TypeId of this Element.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM);
                  +
                  +    /**
                  +     * The object instance identifier of the archived object.
                  +     */
                  +    private Long instId;
                  +
                  +    /**
                  +     * The details of the Object.
                  +     */
                  +    private org.ccsds.moims.mo.com.structures.ObjectDetails details;
                  +
                  +    /**
                  +     * The network zone of the object.
                  +     */
                  +    private org.ccsds.moims.mo.mal.structures.Identifier network;
                  +
                  +    /**
                  +     * The time the object was created.
                  +     */
                  +    private org.ccsds.moims.mo.mal.structures.FineTime timestamp;
                  +
                  +    /**
                  +     * The component that created the object (a component may be anything from
                  +     * an onboard equipment to a software process on the ground).
                  +     */
                  +    private org.ccsds.moims.mo.mal.structures.URI provider;
                  +
                  +    /**
                  +     * Default constructor for ArchiveDetails.
                  +     * 
                  +     */
                  +    public ArchiveDetails() {
                  +    }
                  +
                  +    /**
                  +     * Constructor that initialises the values of the structure.
                  +     * 
                  +     * @param instId The object instance identifier of the archived object.
                  +     * @param details The details of the Object.
                  +     * @param network The network zone of the object.
                  +     * @param timestamp The time the object was created.
                  +     * @param provider The component that created the object (a component may be anything from an onboard equipment to a software process on the ground).
                  +     */
                  +    public ArchiveDetails(Long instId,
                  +            org.ccsds.moims.mo.com.structures.ObjectDetails details,
                  +            org.ccsds.moims.mo.mal.structures.Identifier network,
                  +            org.ccsds.moims.mo.mal.structures.FineTime timestamp,
                  +            org.ccsds.moims.mo.mal.structures.URI provider) {
                  +        this.instId = instId;
                  +        this.details = details;
                  +        this.network = network;
                  +        this.timestamp = timestamp;
                  +        this.provider = provider;
                  +    }
                  +
                  +    /**
                  +     * Constructor that initialises the non-nullable values of the structure.
                  +     * 
                  +     * @param instId The object instance identifier of the archived object.
                  +     * @param details The details of the Object.
                  +     */
                  +    public ArchiveDetails(Long instId,
                  +            org.ccsds.moims.mo.com.structures.ObjectDetails details) {
                  +        this.instId = instId;
                  +        this.details = details;
                  +        this.network = null;
                  +        this.timestamp = null;
                  +        this.provider = null;
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createElement() {
                  +        return new org.ccsds.moims.mo.com.archive.structures.ArchiveDetails();
                  +    }
                  +
                  +    /**
                  +     * Returns the field instId.
                  +     * 
                  +     * @return The field instId
                  +     */
                  +    public Long getInstId() {
                  +        return instId;
                  +    }
                  +
                  +    /**
                  +     * Returns the field details.
                  +     * 
                  +     * @return The field details
                  +     */
                  +    public org.ccsds.moims.mo.com.structures.ObjectDetails getDetails() {
                  +        return details;
                  +    }
                  +
                  +    /**
                  +     * Returns the field network.
                  +     * 
                  +     * @return The field network
                  +     */
                  +    public org.ccsds.moims.mo.mal.structures.Identifier getNetwork() {
                  +        return network;
                  +    }
                  +
                  +    /**
                  +     * Returns the field timestamp.
                  +     * 
                  +     * @return The field timestamp
                  +     */
                  +    public org.ccsds.moims.mo.mal.structures.FineTime getTimestamp() {
                  +        return timestamp;
                  +    }
                  +
                  +    /**
                  +     * Returns the field provider.
                  +     * 
                  +     * @return The field provider
                  +     */
                  +    public org.ccsds.moims.mo.mal.structures.URI getProvider() {
                  +        return provider;
                  +    }
                  +
                  +    @Override
                  +    public boolean equals(Object obj) {
                  +        if (obj instanceof ArchiveDetails) {
                  +            ArchiveDetails other = (ArchiveDetails) obj;
                  +            if (instId == null) {
                  +                if (other.instId != null) {
                  +                    return false;
                  +                }
                  +            } else {
                  +                if (! instId.equals(other.instId)) {
                  +                    return false;
                  +                }
                  +            }
                  +            if (details == null) {
                  +                if (other.details != null) {
                  +                    return false;
                  +                }
                  +            } else {
                  +                if (! details.equals(other.details)) {
                  +                    return false;
                  +                }
                  +            }
                  +            if (network == null) {
                  +                if (other.network != null) {
                  +                    return false;
                  +                }
                  +            } else {
                  +                if (! network.equals(other.network)) {
                  +                    return false;
                  +                }
                  +            }
                  +            if (timestamp == null) {
                  +                if (other.timestamp != null) {
                  +                    return false;
                  +                }
                  +            } else {
                  +                if (! timestamp.equals(other.timestamp)) {
                  +                    return false;
                  +                }
                  +            }
                  +            if (provider == null) {
                  +                if (other.provider != null) {
                  +                    return false;
                  +                }
                  +            } else {
                  +                if (! provider.equals(other.provider)) {
                  +                    return false;
                  +                }
                  +            }
                  +            return true;
                  +        }
                  +        return false;
                  +    }
                  +
                  +    @Override
                  +    public int hashCode() {
                  +        int hash = 7;
                  +        hash = 83 * hash + (instId != null ? instId.hashCode() : 0);
                  +        hash = 83 * hash + (details != null ? details.hashCode() : 0);
                  +        hash = 83 * hash + (network != null ? network.hashCode() : 0);
                  +        hash = 83 * hash + (timestamp != null ? timestamp.hashCode() : 0);
                  +        hash = 83 * hash + (provider != null ? provider.hashCode() : 0);
                  +        return hash;
                  +    }
                  +
                  +    @Override
                  +    public String toString() {
                  +        StringBuilder buf = new StringBuilder();
                  +        buf.append("(ArchiveDetails: ");
                  +        buf.append("instId=").append(instId);
                  +        buf.append(", details=").append(details);
                  +        buf.append(", network=").append(network);
                  +        buf.append(", timestamp=").append(timestamp);
                  +        buf.append(", provider=").append(provider);
                  +        buf.append(')');
                  +        return buf.toString();
                  +    }
                  +
                  +    @Override
                  +    public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        if (instId == null) {
                  +            throw new org.ccsds.moims.mo.mal.MALException("The field 'instId' cannot be null!");
                  +        }
                  +        if (details == null) {
                  +            throw new org.ccsds.moims.mo.mal.MALException("The field 'details' cannot be null!");
                  +        }
                  +        encoder.encodeLong(instId);
                  +        encoder.encodeElement(details);
                  +        encoder.encodeNullableIdentifier(network);
                  +        encoder.encodeNullableFineTime(timestamp);
                  +        encoder.encodeNullableURI(provider);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        instId = decoder.decodeLong();
                  +        details = (org.ccsds.moims.mo.com.structures.ObjectDetails) decoder.decodeElement(new org.ccsds.moims.mo.com.structures.ObjectDetails());
                  +        network = decoder.decodeNullableIdentifier();
                  +        timestamp = decoder.decodeNullableFineTime();
                  +        provider = decoder.decodeNullableURI();
                  +        return this;
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.TypeId getTypeId() {
                  +        return TYPE_ID;
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/structures/ArchiveDetailsList.java b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/structures/ArchiveDetailsList.java
                  new file mode 100644
                  index 00000000..2457fc63
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/structures/ArchiveDetailsList.java
                  @@ -0,0 +1,79 @@
                  +package org.ccsds.moims.mo.com.archive.structures;
                  +
                  +/**
                  + * List class for ArchiveDetails.
                  + */
                  +public final class ArchiveDetailsList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList {
                  +
                  +    private static final long serialVersionUID = 562958576910335L;
                  +    /**
                  +     * The TypeId of this Element as a long.
                  +     */
                  +    public static final Long SHORT_FORM = 562958576910335L;
                  +    /**
                  +     * The TypeId of this Element.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM);
                  +
                  +    /**
                  +     * Default constructor for ArchiveDetailsList.
                  +     * 
                  +     */
                  +    public ArchiveDetailsList() {
                  +    }
                  +
                  +    /**
                  +     * Constructor that initialises the capacity of the list.
                  +     * 
                  +     * @param initialCapacity The required initial capacity.
                  +     */
                  +    public ArchiveDetailsList(int initialCapacity) {
                  +        super(initialCapacity);
                  +    }
                  +
                  +    /**
                  +     * Constructor that uses an ArrayList for initialization.
                  +     * 
                  +     * @param elementList The ArrayList that is used for initialization.
                  +     */
                  +    public ArchiveDetailsList(java.util.ArrayList elementList) {
                  +        for(org.ccsds.moims.mo.com.archive.structures.ArchiveDetails element : elementList) {
                  +            this.add(element);
                  +        }
                  +    }
                  +
                  +    @Override
                  +    public boolean add(org.ccsds.moims.mo.com.archive.structures.ArchiveDetails element) {
                  +        if (element == null) {
                  +            throw new IllegalArgumentException("The added argument cannot be null!");
                  +        }
                  +        return super.add(element);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createElement() {
                  +        return new ArchiveDetailsList();
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createTypedElement() {
                  +        return new org.ccsds.moims.mo.com.archive.structures.ArchiveDetails();
                  +    }
                  +
                  +    @Override
                  +    public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        encoder.encodeHomogeneousList(this);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        decoder.decodeHomogeneousList(this);
                  +        return this;
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.TypeId getTypeId() {
                  +        return TYPE_ID;
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/structures/ArchiveQuery.java b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/structures/ArchiveQuery.java
                  new file mode 100644
                  index 00000000..5834a7cc
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/structures/ArchiveQuery.java
                  @@ -0,0 +1,386 @@
                  +package org.ccsds.moims.mo.com.archive.structures;
                  +
                  +/**
                  + * The ArchiveQuery structure is used to specify filters on the common parts
                  + * of an object in an archive.
                  + */
                  +public final class ArchiveQuery implements org.ccsds.moims.mo.mal.structures.Composite {
                  +
                  +    private static final long serialVersionUID = 562958560133122L;
                  +    /**
                  +     * The TypeId of this Element as a long.
                  +     */
                  +    public static final Long SHORT_FORM = 562958560133122L;
                  +    /**
                  +     * The TypeId of this Element.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM);
                  +
                  +    /**
                  +     * Only the objects whose domain matches the provided domain will be returned.
                  +     * The domain field supports the wildcard value of "*" only in the
                  +     * last part of the domain. If NULL then all domains shall be matched.
                  +     */
                  +    private org.ccsds.moims.mo.mal.structures.IdentifierList domain;
                  +
                  +    /**
                  +     * Optional network zone. Only the objects whose network zone matches the
                  +     * provided value will be returned. If NULL then all values will be matched.
                  +     */
                  +    private org.ccsds.moims.mo.mal.structures.Identifier network;
                  +
                  +    /**
                  +     * Optional provider. Only the objects whose provider URI matches the provided
                  +     * provider URI will be returned. If NULL then all values will be matched.
                  +     */
                  +    private org.ccsds.moims.mo.mal.structures.URI provider;
                  +
                  +    /**
                  +     * Object instance identifier of the related Object. Only the objects whose
                  +     * related Object matches the provided related Object will be returned unless
                  +     * the "0" wildcard value is supplied.
                  +     */
                  +    private Long related;
                  +
                  +    /**
                  +     * Optional source. Only the objects whose source matches the provided source
                  +     * will be returned. The fields of the ObjectId may contain the wildcard values
                  +     * ("0" for numeric fields, "*" for Identifier fields).
                  +     * If NULL then all values will be matched. .
                  +     */
                  +    private org.ccsds.moims.mo.com.structures.ObjectId source;
                  +
                  +    /**
                  +     * Optional start time. Only the objects whose timestamp is equal or greater
                  +     * than the provided start time will be returned. If NULL then no start time
                  +     * shall be applied.
                  +     */
                  +    private org.ccsds.moims.mo.mal.structures.FineTime startTime;
                  +
                  +    /**
                  +     * Optional end time. Only the objects whose timestamp is equal or less than
                  +     * the provided end time will be returned. If NULL then no end time will be
                  +     * applied.
                  +     */
                  +    private org.ccsds.moims.mo.mal.structures.FineTime endTime;
                  +
                  +    /**
                  +     * If set to TRUE then returned values shall be sorted in ascending order,
                  +     * if FALSE then in descending order. If NULL then no sorting shall be applied.
                  +     */
                  +    private Boolean sortOrder;
                  +
                  +    /**
                  +     * If the returned values are to be sorted because the sortOrder field is
                  +     * not NULL then this field may contain the name of the field in the object
                  +     * body (MAL::Composite) to sort against. If the object body is not a composite
                  +     * but an Attribute or Enumeration then to sort on the values an empty string
                  +     * of "" should be used. Enumerations are sorted on their ordinal. If this
                  +     * field is NULL then the objects shall be sorted on the COM object timestamp.
                  +     * The field follows the naming convention of CompositeFilter::fieldName.
                  +     * If the field points to a composite, list, abstract type (including Attribute)
                  +     * or Blob then no sorting shall be applied.
                  +     */
                  +    private String sortFieldName;
                  +
                  +    /**
                  +     * Default constructor for ArchiveQuery.
                  +     * 
                  +     */
                  +    public ArchiveQuery() {
                  +    }
                  +
                  +    /**
                  +     * Constructor that initialises the values of the structure.
                  +     * 
                  +     * @param domain Only the objects whose domain matches the provided domain will be returned. The domain field supports the wildcard value of '*' only in the last part of the domain. If NULL then all domains shall be matched.
                  +     * @param network Optional network zone. Only the objects whose network zone matches the provided value will be returned. If NULL then all values will be matched.
                  +     * @param provider Optional provider. Only the objects whose provider URI matches the provided provider URI will be returned. If NULL then all values will be matched.
                  +     * @param related Object instance identifier of the related Object. Only the objects whose related Object matches the provided related Object will be returned unless the '0' wildcard value is supplied.
                  +     * @param source Optional source. Only the objects whose source matches the provided source will be returned. The fields of the ObjectId may contain the wildcard values ('0' for numeric fields, '*' for Identifier fields). If NULL then all values will be matched. 
                  +     * @param startTime Optional start time. Only the objects whose timestamp is equal or greater than the provided start time will be returned. If NULL then no start time shall be applied.
                  +     * @param endTime Optional end time. Only the objects whose timestamp is equal or less than the provided end time will be returned. If NULL then no end time will be applied.
                  +     * @param sortOrder If set to TRUE then returned values shall be sorted in ascending order, if FALSE then in descending order. If NULL then no sorting shall be applied.
                  +     * @param sortFieldName If the returned values are to be sorted because the sortOrder field is not NULL then this field may contain the name of the field in the object body (MAL::Composite) to sort against. If the object body is not a composite but an Attribute or Enumeration then to sort on the values an empty string of "" should be used. Enumerations are sorted on their ordinal. If this field is NULL then the objects shall be sorted on the COM object timestamp. The field follows the naming convention of CompositeFilter::fieldName. If the field points to a composite, list, abstract type (including Attribute) or Blob then no sorting shall be applied.
                  +     */
                  +    public ArchiveQuery(org.ccsds.moims.mo.mal.structures.IdentifierList domain,
                  +            org.ccsds.moims.mo.mal.structures.Identifier network,
                  +            org.ccsds.moims.mo.mal.structures.URI provider,
                  +            Long related,
                  +            org.ccsds.moims.mo.com.structures.ObjectId source,
                  +            org.ccsds.moims.mo.mal.structures.FineTime startTime,
                  +            org.ccsds.moims.mo.mal.structures.FineTime endTime,
                  +            Boolean sortOrder,
                  +            String sortFieldName) {
                  +        this.domain = domain;
                  +        this.network = network;
                  +        this.provider = provider;
                  +        this.related = related;
                  +        this.source = source;
                  +        this.startTime = startTime;
                  +        this.endTime = endTime;
                  +        this.sortOrder = sortOrder;
                  +        this.sortFieldName = sortFieldName;
                  +    }
                  +
                  +    /**
                  +     * Constructor that initialises the non-nullable values of the structure.
                  +     * 
                  +     * @param related Object instance identifier of the related Object. Only the objects whose related Object matches the provided related Object will be returned unless the '0' wildcard value is supplied.
                  +     */
                  +    public ArchiveQuery(Long related) {
                  +        this.domain = null;
                  +        this.network = null;
                  +        this.provider = null;
                  +        this.related = related;
                  +        this.source = null;
                  +        this.startTime = null;
                  +        this.endTime = null;
                  +        this.sortOrder = null;
                  +        this.sortFieldName = null;
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createElement() {
                  +        return new org.ccsds.moims.mo.com.archive.structures.ArchiveQuery();
                  +    }
                  +
                  +    /**
                  +     * Returns the field domain.
                  +     * 
                  +     * @return The field domain
                  +     */
                  +    public org.ccsds.moims.mo.mal.structures.IdentifierList getDomain() {
                  +        return domain;
                  +    }
                  +
                  +    /**
                  +     * Returns the field network.
                  +     * 
                  +     * @return The field network
                  +     */
                  +    public org.ccsds.moims.mo.mal.structures.Identifier getNetwork() {
                  +        return network;
                  +    }
                  +
                  +    /**
                  +     * Returns the field provider.
                  +     * 
                  +     * @return The field provider
                  +     */
                  +    public org.ccsds.moims.mo.mal.structures.URI getProvider() {
                  +        return provider;
                  +    }
                  +
                  +    /**
                  +     * Returns the field related.
                  +     * 
                  +     * @return The field related
                  +     */
                  +    public Long getRelated() {
                  +        return related;
                  +    }
                  +
                  +    /**
                  +     * Returns the field source.
                  +     * 
                  +     * @return The field source
                  +     */
                  +    public org.ccsds.moims.mo.com.structures.ObjectId getSource() {
                  +        return source;
                  +    }
                  +
                  +    /**
                  +     * Returns the field startTime.
                  +     * 
                  +     * @return The field startTime
                  +     */
                  +    public org.ccsds.moims.mo.mal.structures.FineTime getStartTime() {
                  +        return startTime;
                  +    }
                  +
                  +    /**
                  +     * Returns the field endTime.
                  +     * 
                  +     * @return The field endTime
                  +     */
                  +    public org.ccsds.moims.mo.mal.structures.FineTime getEndTime() {
                  +        return endTime;
                  +    }
                  +
                  +    /**
                  +     * Returns the field sortOrder.
                  +     * 
                  +     * @return The field sortOrder
                  +     */
                  +    public Boolean getSortOrder() {
                  +        return sortOrder;
                  +    }
                  +
                  +    /**
                  +     * Returns the field sortFieldName.
                  +     * 
                  +     * @return The field sortFieldName
                  +     */
                  +    public String getSortFieldName() {
                  +        return sortFieldName;
                  +    }
                  +
                  +    @Override
                  +    public boolean equals(Object obj) {
                  +        if (obj instanceof ArchiveQuery) {
                  +            ArchiveQuery other = (ArchiveQuery) obj;
                  +            if (domain == null) {
                  +                if (other.domain != null) {
                  +                    return false;
                  +                }
                  +            } else {
                  +                if (! domain.equals(other.domain)) {
                  +                    return false;
                  +                }
                  +            }
                  +            if (network == null) {
                  +                if (other.network != null) {
                  +                    return false;
                  +                }
                  +            } else {
                  +                if (! network.equals(other.network)) {
                  +                    return false;
                  +                }
                  +            }
                  +            if (provider == null) {
                  +                if (other.provider != null) {
                  +                    return false;
                  +                }
                  +            } else {
                  +                if (! provider.equals(other.provider)) {
                  +                    return false;
                  +                }
                  +            }
                  +            if (related == null) {
                  +                if (other.related != null) {
                  +                    return false;
                  +                }
                  +            } else {
                  +                if (! related.equals(other.related)) {
                  +                    return false;
                  +                }
                  +            }
                  +            if (source == null) {
                  +                if (other.source != null) {
                  +                    return false;
                  +                }
                  +            } else {
                  +                if (! source.equals(other.source)) {
                  +                    return false;
                  +                }
                  +            }
                  +            if (startTime == null) {
                  +                if (other.startTime != null) {
                  +                    return false;
                  +                }
                  +            } else {
                  +                if (! startTime.equals(other.startTime)) {
                  +                    return false;
                  +                }
                  +            }
                  +            if (endTime == null) {
                  +                if (other.endTime != null) {
                  +                    return false;
                  +                }
                  +            } else {
                  +                if (! endTime.equals(other.endTime)) {
                  +                    return false;
                  +                }
                  +            }
                  +            if (sortOrder == null) {
                  +                if (other.sortOrder != null) {
                  +                    return false;
                  +                }
                  +            } else {
                  +                if (! sortOrder.equals(other.sortOrder)) {
                  +                    return false;
                  +                }
                  +            }
                  +            if (sortFieldName == null) {
                  +                if (other.sortFieldName != null) {
                  +                    return false;
                  +                }
                  +            } else {
                  +                if (! sortFieldName.equals(other.sortFieldName)) {
                  +                    return false;
                  +                }
                  +            }
                  +            return true;
                  +        }
                  +        return false;
                  +    }
                  +
                  +    @Override
                  +    public int hashCode() {
                  +        int hash = 7;
                  +        hash = 83 * hash + (domain != null ? domain.hashCode() : 0);
                  +        hash = 83 * hash + (network != null ? network.hashCode() : 0);
                  +        hash = 83 * hash + (provider != null ? provider.hashCode() : 0);
                  +        hash = 83 * hash + (related != null ? related.hashCode() : 0);
                  +        hash = 83 * hash + (source != null ? source.hashCode() : 0);
                  +        hash = 83 * hash + (startTime != null ? startTime.hashCode() : 0);
                  +        hash = 83 * hash + (endTime != null ? endTime.hashCode() : 0);
                  +        hash = 83 * hash + (sortOrder != null ? sortOrder.hashCode() : 0);
                  +        hash = 83 * hash + (sortFieldName != null ? sortFieldName.hashCode() : 0);
                  +        return hash;
                  +    }
                  +
                  +    @Override
                  +    public String toString() {
                  +        StringBuilder buf = new StringBuilder();
                  +        buf.append("(ArchiveQuery: ");
                  +        buf.append("domain=").append(domain);
                  +        buf.append(", network=").append(network);
                  +        buf.append(", provider=").append(provider);
                  +        buf.append(", related=").append(related);
                  +        buf.append(", source=").append(source);
                  +        buf.append(", startTime=").append(startTime);
                  +        buf.append(", endTime=").append(endTime);
                  +        buf.append(", sortOrder=").append(sortOrder);
                  +        buf.append(", sortFieldName=").append(sortFieldName);
                  +        buf.append(')');
                  +        return buf.toString();
                  +    }
                  +
                  +    @Override
                  +    public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        if (related == null) {
                  +            throw new org.ccsds.moims.mo.mal.MALException("The field 'related' cannot be null!");
                  +        }
                  +        encoder.encodeNullableElement(domain);
                  +        encoder.encodeNullableIdentifier(network);
                  +        encoder.encodeNullableURI(provider);
                  +        encoder.encodeLong(related);
                  +        encoder.encodeNullableElement(source);
                  +        encoder.encodeNullableFineTime(startTime);
                  +        encoder.encodeNullableFineTime(endTime);
                  +        encoder.encodeNullableBoolean(sortOrder);
                  +        encoder.encodeNullableString(sortFieldName);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        domain = (org.ccsds.moims.mo.mal.structures.IdentifierList) decoder.decodeNullableElement(new org.ccsds.moims.mo.mal.structures.IdentifierList());
                  +        network = decoder.decodeNullableIdentifier();
                  +        provider = decoder.decodeNullableURI();
                  +        related = decoder.decodeLong();
                  +        source = (org.ccsds.moims.mo.com.structures.ObjectId) decoder.decodeNullableElement(new org.ccsds.moims.mo.com.structures.ObjectId());
                  +        startTime = decoder.decodeNullableFineTime();
                  +        endTime = decoder.decodeNullableFineTime();
                  +        sortOrder = decoder.decodeNullableBoolean();
                  +        sortFieldName = decoder.decodeNullableString();
                  +        return this;
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.TypeId getTypeId() {
                  +        return TYPE_ID;
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/structures/ArchiveQueryList.java b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/structures/ArchiveQueryList.java
                  new file mode 100644
                  index 00000000..8ef89462
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/structures/ArchiveQueryList.java
                  @@ -0,0 +1,79 @@
                  +package org.ccsds.moims.mo.com.archive.structures;
                  +
                  +/**
                  + * List class for ArchiveQuery.
                  + */
                  +public final class ArchiveQueryList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList {
                  +
                  +    private static final long serialVersionUID = 562958576910334L;
                  +    /**
                  +     * The TypeId of this Element as a long.
                  +     */
                  +    public static final Long SHORT_FORM = 562958576910334L;
                  +    /**
                  +     * The TypeId of this Element.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM);
                  +
                  +    /**
                  +     * Default constructor for ArchiveQueryList.
                  +     * 
                  +     */
                  +    public ArchiveQueryList() {
                  +    }
                  +
                  +    /**
                  +     * Constructor that initialises the capacity of the list.
                  +     * 
                  +     * @param initialCapacity The required initial capacity.
                  +     */
                  +    public ArchiveQueryList(int initialCapacity) {
                  +        super(initialCapacity);
                  +    }
                  +
                  +    /**
                  +     * Constructor that uses an ArrayList for initialization.
                  +     * 
                  +     * @param elementList The ArrayList that is used for initialization.
                  +     */
                  +    public ArchiveQueryList(java.util.ArrayList elementList) {
                  +        for(org.ccsds.moims.mo.com.archive.structures.ArchiveQuery element : elementList) {
                  +            this.add(element);
                  +        }
                  +    }
                  +
                  +    @Override
                  +    public boolean add(org.ccsds.moims.mo.com.archive.structures.ArchiveQuery element) {
                  +        if (element == null) {
                  +            throw new IllegalArgumentException("The added argument cannot be null!");
                  +        }
                  +        return super.add(element);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createElement() {
                  +        return new ArchiveQueryList();
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createTypedElement() {
                  +        return new org.ccsds.moims.mo.com.archive.structures.ArchiveQuery();
                  +    }
                  +
                  +    @Override
                  +    public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        encoder.encodeHomogeneousList(this);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        decoder.decodeHomogeneousList(this);
                  +        return this;
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.TypeId getTypeId() {
                  +        return TYPE_ID;
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/structures/CompositeFilter.java b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/structures/CompositeFilter.java
                  new file mode 100644
                  index 00000000..05a9c5b1
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/structures/CompositeFilter.java
                  @@ -0,0 +1,198 @@
                  +package org.ccsds.moims.mo.com.archive.structures;
                  +
                  +/**
                  + * The CompositeFilter allows an archive query to specify a filter based on
                  + * the content of the body of an object if that body is specified using the
                  + * MAL data type specification.
                  + */
                  +public final class CompositeFilter implements org.ccsds.moims.mo.mal.structures.Composite {
                  +
                  +    private static final long serialVersionUID = 562958560133123L;
                  +    /**
                  +     * The TypeId of this Element as a long.
                  +     */
                  +    public static final Long SHORT_FORM = 562958560133123L;
                  +    /**
                  +     * The TypeId of this Element.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM);
                  +
                  +    /**
                  +     * The name of the field in the object body (MAL::Composite) to match against.
                  +     * It is specified by referring to the name of the field. If the field does
                  +     * not exist in the Composite then the filter shall evaluate to false. If
                  +     * the field is nested inside another Composite, it can be referenced by separating
                  +     * the field names by a "." character; for example the field "instId"
                  +     * or the source of an ArchiveDetails composite would be referenced using
                  +     * "details.source.key.instId". If the body is not a Composite but an Attribute
                  +     * or Enumeration then it can be referred to by using a blank ("") string
                  +     * value here. Accessing values from lists is not supported by this method.
                  +     */
                  +    private String fieldName;
                  +
                  +    /**
                  +     * The type of the filter to apply.
                  +     */
                  +    private org.ccsds.moims.mo.com.archive.structures.ExpressionOperator type;
                  +
                  +    /**
                  +     * The value to compare with. The type of the suppied value and the matched
                  +     * field mst be the same. Must not contain NULL for expression operators CONTAINS,
                  +     * ICONTAINS, GREATER, GREATER_OR_EQUAL, LESS, or LESS_OR_EQUAL otherwise
                  +     * an INVALID error should be returned. Must contain a UInteger ordinal value
                  +     * if the field being matched is an Enumeration. Blob fields can only be used
                  +     * with EQUAL/DIFFER. Must contain a String value if operator is CONTAINS
                  +     * or ICONTAINS otherwise an INVALID error should be returned.
                  +     */
                  +    private org.ccsds.moims.mo.mal.structures.Attribute fieldValue;
                  +
                  +    /**
                  +     * Default constructor for CompositeFilter.
                  +     * 
                  +     */
                  +    public CompositeFilter() {
                  +    }
                  +
                  +    /**
                  +     * Constructor that initialises the values of the structure.
                  +     * 
                  +     * @param fieldName The name of the field in the object body (MAL::Composite) to match against. It is specified by referring to the name of the field. If the field does not exist in the Composite then the filter shall evaluate to false. If the field is nested inside another Composite, it can be referenced by separating the field names by a '.' character; for example the field 'instId' or the source of an ArchiveDetails composite would be referenced using "details.source.key.instId". If the body is not a Composite but an Attribute or Enumeration then it can be referred to by using a blank ("") string value here. Accessing values from lists is not supported by this method.
                  +     * @param type The type of the filter to apply.
                  +     * @param fieldValue The value to compare with. The type of the suppied value and the matched field mst be the same. Must not contain NULL for expression operators CONTAINS, ICONTAINS, GREATER, GREATER_OR_EQUAL, LESS, or LESS_OR_EQUAL otherwise an INVALID error should be returned. Must contain a UInteger ordinal value if the field being matched is an Enumeration. Blob fields can only be used with EQUAL/DIFFER. Must contain a String value if operator is CONTAINS or ICONTAINS otherwise an INVALID error should be returned.
                  +     */
                  +    public CompositeFilter(String fieldName,
                  +            org.ccsds.moims.mo.com.archive.structures.ExpressionOperator type,
                  +            org.ccsds.moims.mo.mal.structures.Attribute fieldValue) {
                  +        this.fieldName = fieldName;
                  +        this.type = type;
                  +        this.fieldValue = fieldValue;
                  +    }
                  +
                  +    /**
                  +     * Constructor that initialises the non-nullable values of the structure.
                  +     * 
                  +     * @param fieldName The name of the field in the object body (MAL::Composite) to match against. It is specified by referring to the name of the field. If the field does not exist in the Composite then the filter shall evaluate to false. If the field is nested inside another Composite, it can be referenced by separating the field names by a '.' character; for example the field 'instId' or the source of an ArchiveDetails composite would be referenced using "details.source.key.instId". If the body is not a Composite but an Attribute or Enumeration then it can be referred to by using a blank ("") string value here. Accessing values from lists is not supported by this method.
                  +     * @param type The type of the filter to apply.
                  +     */
                  +    public CompositeFilter(String fieldName,
                  +            org.ccsds.moims.mo.com.archive.structures.ExpressionOperator type) {
                  +        this.fieldName = fieldName;
                  +        this.type = type;
                  +        this.fieldValue = null;
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createElement() {
                  +        return new org.ccsds.moims.mo.com.archive.structures.CompositeFilter();
                  +    }
                  +
                  +    /**
                  +     * Returns the field fieldName.
                  +     * 
                  +     * @return The field fieldName
                  +     */
                  +    public String getFieldName() {
                  +        return fieldName;
                  +    }
                  +
                  +    /**
                  +     * Returns the field type.
                  +     * 
                  +     * @return The field type
                  +     */
                  +    public org.ccsds.moims.mo.com.archive.structures.ExpressionOperator getType() {
                  +        return type;
                  +    }
                  +
                  +    /**
                  +     * Returns the field fieldValue.
                  +     * 
                  +     * @return The field fieldValue
                  +     */
                  +    public org.ccsds.moims.mo.mal.structures.Attribute getFieldValue() {
                  +        return fieldValue;
                  +    }
                  +
                  +    @Override
                  +    public boolean equals(Object obj) {
                  +        if (obj instanceof CompositeFilter) {
                  +            CompositeFilter other = (CompositeFilter) obj;
                  +            if (fieldName == null) {
                  +                if (other.fieldName != null) {
                  +                    return false;
                  +                }
                  +            } else {
                  +                if (! fieldName.equals(other.fieldName)) {
                  +                    return false;
                  +                }
                  +            }
                  +            if (type == null) {
                  +                if (other.type != null) {
                  +                    return false;
                  +                }
                  +            } else {
                  +                if (! type.equals(other.type)) {
                  +                    return false;
                  +                }
                  +            }
                  +            if (fieldValue == null) {
                  +                if (other.fieldValue != null) {
                  +                    return false;
                  +                }
                  +            } else {
                  +                if (! fieldValue.equals(other.fieldValue)) {
                  +                    return false;
                  +                }
                  +            }
                  +            return true;
                  +        }
                  +        return false;
                  +    }
                  +
                  +    @Override
                  +    public int hashCode() {
                  +        int hash = 7;
                  +        hash = 83 * hash + (fieldName != null ? fieldName.hashCode() : 0);
                  +        hash = 83 * hash + (type != null ? type.hashCode() : 0);
                  +        hash = 83 * hash + (fieldValue != null ? fieldValue.hashCode() : 0);
                  +        return hash;
                  +    }
                  +
                  +    @Override
                  +    public String toString() {
                  +        StringBuilder buf = new StringBuilder();
                  +        buf.append("(CompositeFilter: ");
                  +        buf.append("fieldName=").append(fieldName);
                  +        buf.append(", type=").append(type);
                  +        buf.append(", fieldValue=").append(fieldValue);
                  +        buf.append(')');
                  +        return buf.toString();
                  +    }
                  +
                  +    @Override
                  +    public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        if (fieldName == null) {
                  +            throw new org.ccsds.moims.mo.mal.MALException("The field 'fieldName' cannot be null!");
                  +        }
                  +        if (type == null) {
                  +            throw new org.ccsds.moims.mo.mal.MALException("The field 'type' cannot be null!");
                  +        }
                  +        encoder.encodeString(fieldName);
                  +        encoder.encodeElement(type);
                  +        encoder.encodeNullableAttribute(fieldValue);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        fieldName = decoder.decodeString();
                  +        type = (org.ccsds.moims.mo.com.archive.structures.ExpressionOperator) decoder.decodeElement(org.ccsds.moims.mo.com.archive.structures.ExpressionOperator.EQUAL);
                  +        fieldValue = (org.ccsds.moims.mo.mal.structures.Attribute) decoder.decodeNullableAttribute();
                  +        return this;
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.TypeId getTypeId() {
                  +        return TYPE_ID;
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/structures/CompositeFilterList.java b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/structures/CompositeFilterList.java
                  new file mode 100644
                  index 00000000..c162d841
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/structures/CompositeFilterList.java
                  @@ -0,0 +1,79 @@
                  +package org.ccsds.moims.mo.com.archive.structures;
                  +
                  +/**
                  + * List class for CompositeFilter.
                  + */
                  +public final class CompositeFilterList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList {
                  +
                  +    private static final long serialVersionUID = 562958576910333L;
                  +    /**
                  +     * The TypeId of this Element as a long.
                  +     */
                  +    public static final Long SHORT_FORM = 562958576910333L;
                  +    /**
                  +     * The TypeId of this Element.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM);
                  +
                  +    /**
                  +     * Default constructor for CompositeFilterList.
                  +     * 
                  +     */
                  +    public CompositeFilterList() {
                  +    }
                  +
                  +    /**
                  +     * Constructor that initialises the capacity of the list.
                  +     * 
                  +     * @param initialCapacity The required initial capacity.
                  +     */
                  +    public CompositeFilterList(int initialCapacity) {
                  +        super(initialCapacity);
                  +    }
                  +
                  +    /**
                  +     * Constructor that uses an ArrayList for initialization.
                  +     * 
                  +     * @param elementList The ArrayList that is used for initialization.
                  +     */
                  +    public CompositeFilterList(java.util.ArrayList elementList) {
                  +        for(org.ccsds.moims.mo.com.archive.structures.CompositeFilter element : elementList) {
                  +            this.add(element);
                  +        }
                  +    }
                  +
                  +    @Override
                  +    public boolean add(org.ccsds.moims.mo.com.archive.structures.CompositeFilter element) {
                  +        if (element == null) {
                  +            throw new IllegalArgumentException("The added argument cannot be null!");
                  +        }
                  +        return super.add(element);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createElement() {
                  +        return new CompositeFilterList();
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createTypedElement() {
                  +        return new org.ccsds.moims.mo.com.archive.structures.CompositeFilter();
                  +    }
                  +
                  +    @Override
                  +    public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        encoder.encodeHomogeneousList(this);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        decoder.decodeHomogeneousList(this);
                  +        return this;
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.TypeId getTypeId() {
                  +        return TYPE_ID;
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/structures/CompositeFilterSet.java b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/structures/CompositeFilterSet.java
                  new file mode 100644
                  index 00000000..ec00d1de
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/structures/CompositeFilterSet.java
                  @@ -0,0 +1,113 @@
                  +package org.ccsds.moims.mo.com.archive.structures;
                  +
                  +/**
                  + * Contains a list of CompositeFilters that are AND"d together to form
                  + * a more complex filter.
                  + */
                  +public final class CompositeFilterSet extends org.ccsds.moims.mo.com.archive.structures.QueryFilter {
                  +
                  +    private static final long serialVersionUID = 562958560133124L;
                  +    /**
                  +     * The TypeId of this Element as a long.
                  +     */
                  +    public static final Long SHORT_FORM = 562958560133124L;
                  +    /**
                  +     * The TypeId of this Element.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM);
                  +
                  +    /**
                  +     * The list of filters to apply.
                  +     */
                  +    private org.ccsds.moims.mo.com.archive.structures.CompositeFilterList filters;
                  +
                  +    /**
                  +     * Default constructor for CompositeFilterSet.
                  +     * 
                  +     */
                  +    public CompositeFilterSet() {
                  +    }
                  +
                  +    /**
                  +     * Constructor that initialises the values of the structure.
                  +     * 
                  +     * @param filters The list of filters to apply.
                  +     */
                  +    public CompositeFilterSet(org.ccsds.moims.mo.com.archive.structures.CompositeFilterList filters) {
                  +        this.filters = filters;
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createElement() {
                  +        return new org.ccsds.moims.mo.com.archive.structures.CompositeFilterSet();
                  +    }
                  +
                  +    /**
                  +     * Returns the field filters.
                  +     * 
                  +     * @return The field filters
                  +     */
                  +    public org.ccsds.moims.mo.com.archive.structures.CompositeFilterList getFilters() {
                  +        return filters;
                  +    }
                  +
                  +    @Override
                  +    public boolean equals(Object obj) {
                  +        if (obj instanceof CompositeFilterSet) {
                  +            if (! super.equals(obj)) {
                  +                return false;
                  +            }
                  +            CompositeFilterSet other = (CompositeFilterSet) obj;
                  +            if (filters == null) {
                  +                if (other.filters != null) {
                  +                    return false;
                  +                }
                  +            } else {
                  +                if (! filters.equals(other.filters)) {
                  +                    return false;
                  +                }
                  +            }
                  +            return true;
                  +        }
                  +        return false;
                  +    }
                  +
                  +    @Override
                  +    public int hashCode() {
                  +        int hash = super.hashCode();
                  +        hash = 83 * hash + (filters != null ? filters.hashCode() : 0);
                  +        return hash;
                  +    }
                  +
                  +    @Override
                  +    public String toString() {
                  +        StringBuilder buf = new StringBuilder();
                  +        buf.append("(CompositeFilterSet: ");
                  +        buf.append(super.toString());
                  +        buf.append(", filters=").append(filters);
                  +        buf.append(')');
                  +        return buf.toString();
                  +    }
                  +
                  +    @Override
                  +    public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        super.encode(encoder);
                  +        if (filters == null) {
                  +            throw new org.ccsds.moims.mo.mal.MALException("The field 'filters' cannot be null!");
                  +        }
                  +        encoder.encodeElement(filters);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        super.decode(decoder);
                  +        filters = (org.ccsds.moims.mo.com.archive.structures.CompositeFilterList) decoder.decodeElement(new org.ccsds.moims.mo.com.archive.structures.CompositeFilterList());
                  +        return this;
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.TypeId getTypeId() {
                  +        return TYPE_ID;
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/structures/CompositeFilterSetList.java b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/structures/CompositeFilterSetList.java
                  new file mode 100644
                  index 00000000..7ddf24d7
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/structures/CompositeFilterSetList.java
                  @@ -0,0 +1,79 @@
                  +package org.ccsds.moims.mo.com.archive.structures;
                  +
                  +/**
                  + * List class for CompositeFilterSet.
                  + */
                  +public final class CompositeFilterSetList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList {
                  +
                  +    private static final long serialVersionUID = 562958576910332L;
                  +    /**
                  +     * The TypeId of this Element as a long.
                  +     */
                  +    public static final Long SHORT_FORM = 562958576910332L;
                  +    /**
                  +     * The TypeId of this Element.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM);
                  +
                  +    /**
                  +     * Default constructor for CompositeFilterSetList.
                  +     * 
                  +     */
                  +    public CompositeFilterSetList() {
                  +    }
                  +
                  +    /**
                  +     * Constructor that initialises the capacity of the list.
                  +     * 
                  +     * @param initialCapacity The required initial capacity.
                  +     */
                  +    public CompositeFilterSetList(int initialCapacity) {
                  +        super(initialCapacity);
                  +    }
                  +
                  +    /**
                  +     * Constructor that uses an ArrayList for initialization.
                  +     * 
                  +     * @param elementList The ArrayList that is used for initialization.
                  +     */
                  +    public CompositeFilterSetList(java.util.ArrayList elementList) {
                  +        for(org.ccsds.moims.mo.com.archive.structures.CompositeFilterSet element : elementList) {
                  +            this.add(element);
                  +        }
                  +    }
                  +
                  +    @Override
                  +    public boolean add(org.ccsds.moims.mo.com.archive.structures.CompositeFilterSet element) {
                  +        if (element == null) {
                  +            throw new IllegalArgumentException("The added argument cannot be null!");
                  +        }
                  +        return super.add(element);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createElement() {
                  +        return new CompositeFilterSetList();
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createTypedElement() {
                  +        return new org.ccsds.moims.mo.com.archive.structures.CompositeFilterSet();
                  +    }
                  +
                  +    @Override
                  +    public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        encoder.encodeHomogeneousList(this);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        decoder.decodeHomogeneousList(this);
                  +        return this;
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.TypeId getTypeId() {
                  +        return TYPE_ID;
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/structures/ExpressionOperator.java b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/structures/ExpressionOperator.java
                  new file mode 100644
                  index 00000000..341fae92
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/structures/ExpressionOperator.java
                  @@ -0,0 +1,214 @@
                  +package org.ccsds.moims.mo.com.archive.structures;
                  +
                  +/**
                  + * Enumeration class for ExpressionOperator.
                  + */
                  +public final class ExpressionOperator extends org.ccsds.moims.mo.mal.structures.Enumeration {
                  +
                  +    private static final long serialVersionUID = 562958560133125L;
                  +    /**
                  +     * The TypeId of this Element as a long.
                  +     */
                  +    public static final Long SHORT_FORM = 562958560133125L;
                  +    /**
                  +     * The TypeId of this Element.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM);
                  +
                  +    /**
                  +     * Enumeration value for EQUAL.
                  +     */
                  +    public static final int EQUAL_VALUE = 1;
                  +
                  +    /**
                  +     * Enumeration singleton for value EQUAL.
                  +     */
                  +    public static final org.ccsds.moims.mo.com.archive.structures.ExpressionOperator EQUAL = new org.ccsds.moims.mo.com.archive.structures.ExpressionOperator(org.ccsds.moims.mo.com.archive.structures.ExpressionOperator.EQUAL_VALUE);
                  +
                  +    /**
                  +     * Enumeration value for DIFFER.
                  +     */
                  +    public static final int DIFFER_VALUE = 2;
                  +
                  +    /**
                  +     * Enumeration singleton for value DIFFER.
                  +     */
                  +    public static final org.ccsds.moims.mo.com.archive.structures.ExpressionOperator DIFFER = new org.ccsds.moims.mo.com.archive.structures.ExpressionOperator(org.ccsds.moims.mo.com.archive.structures.ExpressionOperator.DIFFER_VALUE);
                  +
                  +    /**
                  +     * Enumeration value for GREATER.
                  +     */
                  +    public static final int GREATER_VALUE = 3;
                  +
                  +    /**
                  +     * Enumeration singleton for value GREATER.
                  +     */
                  +    public static final org.ccsds.moims.mo.com.archive.structures.ExpressionOperator GREATER = new org.ccsds.moims.mo.com.archive.structures.ExpressionOperator(org.ccsds.moims.mo.com.archive.structures.ExpressionOperator.GREATER_VALUE);
                  +
                  +    /**
                  +     * Enumeration value for GREATER_OR_EQUAL.
                  +     */
                  +    public static final int GREATER_OR_EQUAL_VALUE = 4;
                  +
                  +    /**
                  +     * Enumeration singleton for value GREATER_OR_EQUAL.
                  +     */
                  +    public static final org.ccsds.moims.mo.com.archive.structures.ExpressionOperator GREATER_OR_EQUAL = new org.ccsds.moims.mo.com.archive.structures.ExpressionOperator(org.ccsds.moims.mo.com.archive.structures.ExpressionOperator.GREATER_OR_EQUAL_VALUE);
                  +
                  +    /**
                  +     * Enumeration value for LESS.
                  +     */
                  +    public static final int LESS_VALUE = 5;
                  +
                  +    /**
                  +     * Enumeration singleton for value LESS.
                  +     */
                  +    public static final org.ccsds.moims.mo.com.archive.structures.ExpressionOperator LESS = new org.ccsds.moims.mo.com.archive.structures.ExpressionOperator(org.ccsds.moims.mo.com.archive.structures.ExpressionOperator.LESS_VALUE);
                  +
                  +    /**
                  +     * Enumeration value for LESS_OR_EQUAL.
                  +     */
                  +    public static final int LESS_OR_EQUAL_VALUE = 6;
                  +
                  +    /**
                  +     * Enumeration singleton for value LESS_OR_EQUAL.
                  +     */
                  +    public static final org.ccsds.moims.mo.com.archive.structures.ExpressionOperator LESS_OR_EQUAL = new org.ccsds.moims.mo.com.archive.structures.ExpressionOperator(org.ccsds.moims.mo.com.archive.structures.ExpressionOperator.LESS_OR_EQUAL_VALUE);
                  +
                  +    /**
                  +     * Enumeration value for CONTAINS.
                  +     */
                  +    public static final int CONTAINS_VALUE = 7;
                  +
                  +    /**
                  +     * Enumeration singleton for value CONTAINS.
                  +     */
                  +    public static final org.ccsds.moims.mo.com.archive.structures.ExpressionOperator CONTAINS = new org.ccsds.moims.mo.com.archive.structures.ExpressionOperator(org.ccsds.moims.mo.com.archive.structures.ExpressionOperator.CONTAINS_VALUE);
                  +
                  +    /**
                  +     * Enumeration value for ICONTAINS.
                  +     */
                  +    public static final int ICONTAINS_VALUE = 8;
                  +
                  +    /**
                  +     * Enumeration singleton for value ICONTAINS.
                  +     */
                  +    public static final org.ccsds.moims.mo.com.archive.structures.ExpressionOperator ICONTAINS = new org.ccsds.moims.mo.com.archive.structures.ExpressionOperator(org.ccsds.moims.mo.com.archive.structures.ExpressionOperator.ICONTAINS_VALUE);
                  +
                  +    /**
                  +     * Set of enumeration instances.
                  +     */
                  +    private static final org.ccsds.moims.mo.com.archive.structures.ExpressionOperator[] _ENUMERATIONS = {
                  +        EQUAL, DIFFER, GREATER, GREATER_OR_EQUAL, LESS, LESS_OR_EQUAL, CONTAINS,
                  +        ICONTAINS};
                  +
                  +    /**
                  +     * The ExpressionOperator enumeration holds a set of possible expression operators.
                  +     */
                  +    public ExpressionOperator() {
                  +        super(-1);
                  +    }
                  +
                  +    /**
                  +     * The ExpressionOperator enumeration holds a set of possible expression operators.
                  +     * 
                  +     * @param value The value of the Enumeration.
                  +     */
                  +    public ExpressionOperator(int value) {
                  +        super(value);
                  +    }
                  +
                  +    @Override
                  +    public String toString() {
                  +        switch (getValue()) {
                  +            case EQUAL_VALUE:
                  +                return "EQUAL";
                  +            case DIFFER_VALUE:
                  +                return "DIFFER";
                  +            case GREATER_VALUE:
                  +                return "GREATER";
                  +            case GREATER_OR_EQUAL_VALUE:
                  +                return "GREATER_OR_EQUAL";
                  +            case LESS_VALUE:
                  +                return "LESS";
                  +            case LESS_OR_EQUAL_VALUE:
                  +                return "LESS_OR_EQUAL";
                  +            case CONTAINS_VALUE:
                  +                return "CONTAINS";
                  +            case ICONTAINS_VALUE:
                  +                return "ICONTAINS";
                  +            default:
                  +                throw new RuntimeException("Unknown ordinal!");
                  +        }
                  +    }
                  +
                  +    /**
                  +     * Returns the enumeration element represented by the supplied string, or
                  +     * null if not matched.
                  +     * 
                  +     * @param s s The string to search for.
                  +     * @return The matched enumeration element, or null if not matched.
                  +     */
                  +    public static org.ccsds.moims.mo.com.archive.structures.ExpressionOperator fromString(String s) {
                  +        switch (s) {
                  +            case "EQUAL":
                  +                return ExpressionOperator.EQUAL;
                  +            case "DIFFER":
                  +                return ExpressionOperator.DIFFER;
                  +            case "GREATER":
                  +                return ExpressionOperator.GREATER;
                  +            case "GREATER_OR_EQUAL":
                  +                return ExpressionOperator.GREATER_OR_EQUAL;
                  +            case "LESS":
                  +                return ExpressionOperator.LESS;
                  +            case "LESS_OR_EQUAL":
                  +                return ExpressionOperator.LESS_OR_EQUAL;
                  +            case "CONTAINS":
                  +                return ExpressionOperator.CONTAINS;
                  +            case "ICONTAINS":
                  +                return ExpressionOperator.ICONTAINS;
                  +            default:
                  +                throw new RuntimeException("Unknown Enumeration for the provided string: " + s);
                  +        }
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Enumeration fromValue(Integer value) {
                  +        switch (value) {
                  +            case EQUAL_VALUE:
                  +                return ExpressionOperator.EQUAL;
                  +            case DIFFER_VALUE:
                  +                return ExpressionOperator.DIFFER;
                  +            case GREATER_VALUE:
                  +                return ExpressionOperator.GREATER;
                  +            case GREATER_OR_EQUAL_VALUE:
                  +                return ExpressionOperator.GREATER_OR_EQUAL;
                  +            case LESS_VALUE:
                  +                return ExpressionOperator.LESS;
                  +            case LESS_OR_EQUAL_VALUE:
                  +                return ExpressionOperator.LESS_OR_EQUAL;
                  +            case CONTAINS_VALUE:
                  +                return ExpressionOperator.CONTAINS;
                  +            case ICONTAINS_VALUE:
                  +                return ExpressionOperator.ICONTAINS;
                  +            default:
                  +                throw new RuntimeException("Unknown Enumeration for the provided value: " + value);
                  +        }
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createElement() {
                  +        return _ENUMERATIONS[0];
                  +    }
                  +
                  +    @Override
                  +    public int getEnumSize() {
                  +        return 8;
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.TypeId getTypeId() {
                  +        return TYPE_ID;
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/structures/ExpressionOperatorList.java b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/structures/ExpressionOperatorList.java
                  new file mode 100644
                  index 00000000..25f5d413
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/structures/ExpressionOperatorList.java
                  @@ -0,0 +1,79 @@
                  +package org.ccsds.moims.mo.com.archive.structures;
                  +
                  +/**
                  + * List class for ExpressionOperator.
                  + */
                  +public final class ExpressionOperatorList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList {
                  +
                  +    private static final long serialVersionUID = 562958576910331L;
                  +    /**
                  +     * The TypeId of this Element as a long.
                  +     */
                  +    public static final Long SHORT_FORM = 562958576910331L;
                  +    /**
                  +     * The TypeId of this Element.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM);
                  +
                  +    /**
                  +     * Default constructor for ExpressionOperatorList.
                  +     * 
                  +     */
                  +    public ExpressionOperatorList() {
                  +    }
                  +
                  +    /**
                  +     * Constructor that initialises the capacity of the list.
                  +     * 
                  +     * @param initialCapacity The required initial capacity.
                  +     */
                  +    public ExpressionOperatorList(int initialCapacity) {
                  +        super(initialCapacity);
                  +    }
                  +
                  +    /**
                  +     * Constructor that uses an ArrayList for initialization.
                  +     * 
                  +     * @param elementList The ArrayList that is used for initialization.
                  +     */
                  +    public ExpressionOperatorList(java.util.ArrayList elementList) {
                  +        for(org.ccsds.moims.mo.com.archive.structures.ExpressionOperator element : elementList) {
                  +            this.add(element);
                  +        }
                  +    }
                  +
                  +    @Override
                  +    public boolean add(org.ccsds.moims.mo.com.archive.structures.ExpressionOperator element) {
                  +        if (element == null) {
                  +            throw new IllegalArgumentException("The added argument cannot be null!");
                  +        }
                  +        return super.add(element);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createElement() {
                  +        return new ExpressionOperatorList();
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element createTypedElement() {
                  +        return org.ccsds.moims.mo.com.archive.structures.ExpressionOperator.EQUAL;
                  +    }
                  +
                  +    @Override
                  +    public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        encoder.encodeHomogeneousList(this);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        decoder.decodeHomogeneousList(this);
                  +        return this;
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.TypeId getTypeId() {
                  +        return TYPE_ID;
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/structures/QueryFilter.java b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/structures/QueryFilter.java
                  new file mode 100644
                  index 00000000..8e0916b5
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/structures/QueryFilter.java
                  @@ -0,0 +1,46 @@
                  +package org.ccsds.moims.mo.com.archive.structures;
                  +
                  +/**
                  + * The base structure for archive filters.
                  + */
                  +public abstract class QueryFilter implements org.ccsds.moims.mo.mal.structures.Composite {
                  +
                  +    /**
                  +     * Default constructor for QueryFilter.
                  +     * 
                  +     */
                  +    public QueryFilter() {
                  +    }
                  +
                  +    @Override
                  +    public boolean equals(Object obj) {
                  +        if (obj instanceof QueryFilter) {
                  +            return true;
                  +        }
                  +        return false;
                  +    }
                  +
                  +    @Override
                  +    public int hashCode() {
                  +        int hash = 7;
                  +        return hash;
                  +    }
                  +
                  +    @Override
                  +    public String toString() {
                  +        StringBuilder buf = new StringBuilder();
                  +        buf.append("(QueryFilter: ");
                  +        buf.append(')');
                  +        return buf.toString();
                  +    }
                  +
                  +    @Override
                  +    public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException {
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException {
                  +        return this;
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/structures/QueryFilterList.java b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/structures/QueryFilterList.java
                  new file mode 100644
                  index 00000000..5f44e32d
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/structures/QueryFilterList.java
                  @@ -0,0 +1,23 @@
                  +package org.ccsds.moims.mo.com.archive.structures;
                  +
                  +/**
                  + * List class for QueryFilter.
                  + */
                  +public final class QueryFilterList extends org.ccsds.moims.mo.mal.structures.HeterogeneousList {
                  +
                  +    /**
                  +     * Default constructor for QueryFilterList.
                  +     * 
                  +     */
                  +    public QueryFilterList() {
                  +    }
                  +
                  +    @Override
                  +    public boolean add(org.ccsds.moims.mo.mal.structures.Element element) {
                  +        if (element != null && !(element instanceof QueryFilter)) {
                  +            throw new java.lang.ClassCastException("The added element does not extend the type: QueryFilter");
                  +        }
                  +        return super.add(element);
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/structures/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/structures/package-info.java
                  new file mode 100644
                  index 00000000..6fee2f6d
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/archive/structures/package-info.java
                  @@ -0,0 +1,4 @@
                  +/**
                  + * Package containing types defined in the Archive service.
                  +*/
                  +package org.ccsds.moims.mo.com.archive.structures;
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/event/EventHelper.java b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/event/EventHelper.java
                  new file mode 100644
                  index 00000000..8ac14e42
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/event/EventHelper.java
                  @@ -0,0 +1,17 @@
                  +package org.ccsds.moims.mo.com.event;
                  +
                  +/**
                  + * Helper class for Event service.
                  + */
                  +public class EventHelper {
                  +
                  +    /**
                  +     * Service singleton instance.
                  +     */
                  +    public static final org.ccsds.moims.mo.com.event.EventServiceInfo EVENT_SERVICE = new org.ccsds.moims.mo.com.event.EventServiceInfo();
                  +
                  +    private EventHelper() {
                  +        // Utility class; not meant to be instantiated.
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/event/EventServiceInfo.java b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/event/EventServiceInfo.java
                  new file mode 100644
                  index 00000000..f06e3796
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/event/EventServiceInfo.java
                  @@ -0,0 +1,96 @@
                  +package org.ccsds.moims.mo.com.event;
                  +
                  +/**
                  + * Helper class for Event service.
                  + */
                  +public class EventServiceInfo extends org.ccsds.moims.mo.com.COMService {
                  +
                  +    /**
                  +     * Service number literal.
                  +     */
                  +    public static final int _EVENT_SERVICE_NUMBER = 1;
                  +
                  +    /**
                  +     * Service number instance.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.structures.UShort EVENT_SERVICE_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_EVENT_SERVICE_NUMBER);
                  +
                  +    /**
                  +     * Service name constant.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.structures.Identifier EVENT_SERVICE_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("Event");
                  +
                  +    /**
                  +     * The service key of this service.
                  +     */
                  +    private static final org.ccsds.moims.mo.mal.ServiceKey SERVICE_KEY = new org.ccsds.moims.mo.mal.ServiceKey(
                  +            2, 1, EVENT_SERVICE_NUMBER);
                  +
                  +    /**
                  +     * Operation number literal for operation MONITOREVENT.
                  +     */
                  +    public static final int _MONITOREVENT_OP_NUMBER = 1;
                  +
                  +    /**
                  +     * Operation number instance for operation MONITOREVENT.
                  +     */
                  +    private static final org.ccsds.moims.mo.mal.structures.UShort MONITOREVENT_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_MONITOREVENT_OP_NUMBER);
                  +
                  +    /**
                  +     * Operation instance for operation MONITOREVENT.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.MALPubSubOperation MONITOREVENT_OP = new org.ccsds.moims.mo.mal.MALPubSubOperation(SERVICE_KEY, 
                  +            MONITOREVENT_OP_NUMBER, 
                  +            new org.ccsds.moims.mo.mal.structures.Identifier("monitorEvent"), 
                  +            new org.ccsds.moims.mo.mal.structures.UShort(1), 
                  +            new org.ccsds.moims.mo.mal.OperationField[] {
                  +                new org.ccsds.moims.mo.mal.OperationField("eventLinks", true, org.ccsds.moims.mo.com.structures.ObjectDetails.SHORT_FORM, "The MAL::EntityKey.firstSubKey shall contain the event object number as a base 10 string. For example, for an object number of '14' the key value would be '14' with no padding.\nThe MAL::EntityKey.secondSubKey shall contain the area, service, and version ObjectType fields as a MAL::Long populated as (in hex) 0xAAAASSSSVVXXXXXX where AAAA is the area (16 bits), SSSS is the service (16 bits), VV is the version (8 bits), and XXXXXX is unused and set to zero (24 bits). For example, for an area of '1', and a service of '2', and a version of '3' the field would contain (in hex) 0x0001000203000000.\nThe MAL::EntityKey.thirdSubKey shall contain the event object instance identifier.\nThe MAL::EntityKey.fourthSubKey shall contain the area, service, version and number fields of the event source ObjectType using same methodology as given for the second sub key but replacing the XXXXXX part with the number field.\nThe related and source links of the event shall populate the ObjectDetails part of the publish/notify message.\nThe body of the event shall populate the final part of the publish/notify message.\nThe timestamp of the Event shall be taken from the publish message.\nAn event in one domain may be generated by something in another domain therefore the domain of the event shall not be required to be the same domain as the source of the event."),
                  +                new org.ccsds.moims.mo.mal.OperationField("eventBody", true, null, null)}, 
                  +            "The monitorEvent operation allows a consumer to subscribe for events.");
                  +
                  +    /**
                  +     * Key names instance for MONITOREVENT operation of pubsub interaction pattern.
                  +     */
                  +    private static final org.ccsds.moims.mo.mal.structures.Identifier [] _MONITOREVENT_OP_KEY_NAMES = {};
                  +
                  +    /**
                  +     * Key names instance for MONITOREVENT operation of pubsub interaction pattern.
                  +     */
                  +    private static final org.ccsds.moims.mo.mal.structures.IdentifierList MONITOREVENT_OP_KEY_NAMES = new org.ccsds.moims.mo.mal.structures.IdentifierList(new java.util.ArrayList<>(java.util.Arrays.asList(_MONITOREVENT_OP_KEY_NAMES)));
                  +
                  +    /**
                  +     * Area elements.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.structures.Element[] EVENT_SERVICE_ELEMENTS = {};
                  +
                  +    /**
                  +     * The set of operations for this service.
                  +     */
                  +    public static final org.ccsds.moims.mo.mal.MALOperation[] OPERATIONS = new org.ccsds.moims.mo.mal.MALOperation[]{MONITOREVENT_OP};
                  +
                  +    /**
                  +     * Creates an instance of the Event ServiceInfo.
                  +     * 
                  +     */
                  +    public EventServiceInfo() {
                  +        super(SERVICE_KEY, EVENT_SERVICE_NAME, EVENT_SERVICE_ELEMENTS, OPERATIONS);
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.MALArea getArea() {
                  +        return org.ccsds.moims.mo.com.COMHelper.COM_AREA;
                  +    }
                  +
                  +    @Override
                  +    public org.ccsds.moims.mo.mal.MOErrorException generateMOError(int errorNumber,
                  +            Object extraInfo) {
                  +        switch (errorNumber) {
                  +            case 70000:
                  +                return new org.ccsds.moims.mo.com.InvalidException(extraInfo);
                  +            case 70001:
                  +                return new org.ccsds.moims.mo.com.DuplicateException(extraInfo);
                  +        }
                  +        return null;
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/event/consumer/EventAdapter.java b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/event/consumer/EventAdapter.java
                  new file mode 100644
                  index 00000000..d4a2c0e5
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/event/consumer/EventAdapter.java
                  @@ -0,0 +1,172 @@
                  +package org.ccsds.moims.mo.com.event.consumer;
                  +
                  +/**
                  + * Consumer adapter for Event service.
                  + */
                  +public abstract class EventAdapter extends org.ccsds.moims.mo.mal.consumer.MALInteractionAdapter {
                  +
                  +    /**
                  +     * Called by the MAL when a PubSub register acknowledgement is received from
                  +     * a broker for the operation monitorEvent.
                  +     * 
                  +     * @param msgHeader msgHeader The header of the received message
                  +     * @param qosProperties qosProperties The QoS properties associated with the message
                  +     */
                  +    public void monitorEventRegisterAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader,
                  +            java.util.Map qosProperties) {
                  +    }
                  +
                  +    /**
                  +     * Called by the MAL when a PubSub register acknowledgement error is received
                  +     * from a broker for the operation monitorEvent.
                  +     * 
                  +     * @param msgHeader msgHeader The header of the received message
                  +     * @param error error The received error message
                  +     * @param qosProperties qosProperties The QoS properties associated with the message
                  +     */
                  +    public void monitorEventRegisterErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader,
                  +            org.ccsds.moims.mo.mal.MOErrorException error,
                  +            java.util.Map qosProperties) {
                  +    }
                  +
                  +    /**
                  +     * Called by the MAL when a PubSub deregister acknowledgement is received
                  +     * from a broker for the operation monitorEvent.
                  +     * 
                  +     * @param msgHeader msgHeader The header of the received message
                  +     * @param qosProperties qosProperties The QoS properties associated with the message
                  +     */
                  +    public void monitorEventDeregisterAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader,
                  +            java.util.Map qosProperties) {
                  +    }
                  +
                  +    /**
                  +     * Called by the MAL when a PubSub update is received from a broker for the
                  +     * operation monitorEvent.
                  +     * 
                  +     * @param msgHeader msgHeader The header of the received message
                  +     * @param subscriptionId The subscriptionId of the subscription.
                  +     * @param updateHeader The Update header.
                  +     * @param keys The typed Subscription Key accessors for this update
                  +     * @param eventLinks The MAL::EntityKey.firstSubKey shall contain the event object number as a base 10 string. For example, for an object number of '14' the key value would be '14' with no padding.
                  +The MAL::EntityKey.secondSubKey shall contain the area, service, and version ObjectType fields as a MAL::Long populated as (in hex) 0xAAAASSSSVVXXXXXX where AAAA is the area (16 bits), SSSS is the service (16 bits), VV is the version (8 bits), and XXXXXX is unused and set to zero (24 bits). For example, for an area of '1', and a service of '2', and a version of '3' the field would contain (in hex) 0x0001000203000000.
                  +The MAL::EntityKey.thirdSubKey shall contain the event object instance identifier.
                  +The MAL::EntityKey.fourthSubKey shall contain the area, service, version and number fields of the event source ObjectType using same methodology as given for the second sub key but replacing the XXXXXX part with the number field.
                  +The related and source links of the event shall populate the ObjectDetails part of the publish/notify message.
                  +The body of the event shall populate the final part of the publish/notify message.
                  +The timestamp of the Event shall be taken from the publish message.
                  +An event in one domain may be generated by something in another domain therefore the domain of the event shall not be required to be the same domain as the source of the event.
                  +     * @param eventBody eventBody Argument number 3 as defined by the service operation
                  +     * @param qosProperties qosProperties The QoS properties associated with the message
                  +     */
                  +    public void monitorEventNotifyReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader,
                  +            org.ccsds.moims.mo.mal.structures.Identifier subscriptionId,
                  +            org.ccsds.moims.mo.mal.structures.UpdateHeader updateHeader,
                  +            MonitorEventSubscriptionKeys keys,
                  +            org.ccsds.moims.mo.com.structures.ObjectDetails eventLinks,
                  +            org.ccsds.moims.mo.mal.structures.Element eventBody,
                  +            java.util.Map qosProperties) {
                  +    }
                  +
                  +    /**
                  +     * Called by the MAL when a PubSub update error is received from a broker
                  +     * for the operation monitorEvent.
                  +     * 
                  +     * @param msgHeader msgHeader The header of the received message
                  +     * @param error error The received error message
                  +     * @param qosProperties qosProperties The QoS properties associated with the message
                  +     */
                  +    public void monitorEventNotifyErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader,
                  +            org.ccsds.moims.mo.mal.MOErrorException error,
                  +            java.util.Map qosProperties) {
                  +    }
                  +
                  +    @Override
                  +    public final void registerAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader,
                  +            java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException {
                  +        switch (msgHeader.getOperation().getValue()) {
                  +          case org.ccsds.moims.mo.com.event.EventServiceInfo._MONITOREVENT_OP_NUMBER:
                  +            monitorEventRegisterAckReceived(msgHeader, qosProperties);
                  +            break;
                  +          default:
                  +            throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue());
                  +        }
                  +    }
                  +
                  +    @Override
                  +    public final void registerErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader,
                  +            org.ccsds.moims.mo.mal.transport.MALErrorBody body,
                  +            java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException {
                  +        switch (msgHeader.getOperation().getValue()) {
                  +          case org.ccsds.moims.mo.com.event.EventServiceInfo._MONITOREVENT_OP_NUMBER:
                  +            monitorEventRegisterErrorReceived(msgHeader, body.getError(), qosProperties);
                  +            break;
                  +          default:
                  +            throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue());
                  +        }
                  +    }
                  +
                  +    @Override
                  +    public final void notifyReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader,
                  +            org.ccsds.moims.mo.mal.transport.MALNotifyBody body,
                  +            org.ccsds.moims.mo.mal.structures.IdentifierList selectedKeys,
                  +            java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException {
                  +        if ((org.ccsds.moims.mo.com.COMHelper.COM_AREA_NUMBER.equals(msgHeader.getServiceArea())) && (org.ccsds.moims.mo.com.event.EventServiceInfo.EVENT_SERVICE_NUMBER.equals(msgHeader.getService()))) {
                  +          switch (msgHeader.getOperation().getValue()) {
                  +            case org.ccsds.moims.mo.com.event.EventServiceInfo._MONITOREVENT_OP_NUMBER:
                  +              monitorEventNotifyReceived(msgHeader,
                  +                (org.ccsds.moims.mo.mal.structures.Identifier) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.Identifier()),
                  +                (org.ccsds.moims.mo.mal.structures.UpdateHeader) body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.UpdateHeader()),
                  +                new MonitorEventSubscriptionKeys((org.ccsds.moims.mo.mal.structures.UpdateHeader) body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.UpdateHeader()), selectedKeys),
                  +                (org.ccsds.moims.mo.com.structures.ObjectDetails) body.getBodyElement(2, new org.ccsds.moims.mo.com.structures.ObjectDetails()),
                  +                (org.ccsds.moims.mo.mal.structures.Element) body.getBodyElement(3, null), qosProperties);
                  +              break;
                  +            default:
                  +              throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue());
                  +          }
                  +        }
                  +        else {
                  +          notifyReceivedFromOtherService(msgHeader, body, qosProperties);
                  +        }
                  +    }
                  +
                  +    @Override
                  +    public final void notifyErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader,
                  +            org.ccsds.moims.mo.mal.transport.MALErrorBody body,
                  +            java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException {
                  +        switch (msgHeader.getOperation().getValue()) {
                  +          case org.ccsds.moims.mo.com.event.EventServiceInfo._MONITOREVENT_OP_NUMBER:
                  +            monitorEventNotifyErrorReceived(msgHeader, body.getError(), qosProperties);
                  +            break;
                  +          default:
                  +            throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue());
                  +        }
                  +    }
                  +
                  +    @Override
                  +    public final void deregisterAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader,
                  +            java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException {
                  +        switch (msgHeader.getOperation().getValue()) {
                  +          case org.ccsds.moims.mo.com.event.EventServiceInfo._MONITOREVENT_OP_NUMBER:
                  +            monitorEventDeregisterAckReceived(msgHeader, qosProperties);
                  +            break;
                  +          default:
                  +            throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue());
                  +        }
                  +    }
                  +
                  +    /**
                  +     * Called by the MAL when a PubSub update from another service is received
                  +     * from a broker.
                  +     * 
                  +     * @param msgHeader msgHeader The header of the received message
                  +     * @param body body The body of the received message
                  +     * @param qosProperties qosProperties The QoS properties associated with the message
                  +     * @throws org.ccsds.moims.mo.mal.MALException if an error is detected processing the message.
                  +     */
                  +    public void notifyReceivedFromOtherService(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader,
                  +            org.ccsds.moims.mo.mal.transport.MALNotifyBody body,
                  +            java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException {
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/event/consumer/EventStub.java b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/event/consumer/EventStub.java
                  new file mode 100644
                  index 00000000..73b812a7
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/event/consumer/EventStub.java
                  @@ -0,0 +1,85 @@
                  +package org.ccsds.moims.mo.com.event.consumer;
                  +
                  +/**
                  + * Consumer stub for Event service.
                  + */
                  +public class EventStub {
                  +
                  +    /**
                  +     * The consumer field.
                  +     */
                  +    private final org.ccsds.moims.mo.mal.consumer.MALConsumer consumer;
                  +
                  +    /**
                  +     * Wraps a MALconsumer connection with service specific methods that map from
                  +     * the high level service API to the generic MAL API.
                  +     * 
                  +     * @param consumer consumer The MALConsumer to use in this stub.
                  +     */
                  +    public EventStub(org.ccsds.moims.mo.mal.consumer.MALConsumer consumer) {
                  +        this.consumer = consumer;
                  +    }
                  +
                  +    /**
                  +     * Returns the internal MAL consumer object used for sending of messages from
                  +     * this interface.
                  +     * 
                  +     * @return The MAL consumer object.
                  +     */
                  +    public org.ccsds.moims.mo.mal.consumer.MALConsumer getConsumer() {
                  +        return consumer;
                  +    }
                  +
                  +    /**
                  +     * Register method for the monitorEvent PubSub interaction.
                  +     * 
                  +     * @param subscription subscription the subscription to register for
                  +     * @param adapter adapter Listener in charge of receiving the messages from the service provider
                  +     * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification.
                  +     * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception
                  +     */
                  +    public void monitorEventRegister(org.ccsds.moims.mo.mal.structures.Subscription subscription,
                  +            org.ccsds.moims.mo.com.event.consumer.EventAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException {
                  +        consumer.register(org.ccsds.moims.mo.com.event.EventServiceInfo.MONITOREVENT_OP, subscription, adapter);
                  +    }
                  +
                  +    /**
                  +     * Asynchronous version of method monitorEventRegister.
                  +     * 
                  +     * @param subscription subscription the subscription to register for
                  +     * @param adapter adapter Listener in charge of receiving the messages from the service provider
                  +     * @return the MAL message sent to initiate the interaction
                  +     * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification.
                  +     * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception
                  +     */
                  +    public org.ccsds.moims.mo.mal.transport.MALMessage asyncMonitorEventRegister(org.ccsds.moims.mo.mal.structures.Subscription subscription,
                  +            org.ccsds.moims.mo.com.event.consumer.EventAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException {
                  +        return consumer.asyncRegister(org.ccsds.moims.mo.com.event.EventServiceInfo.MONITOREVENT_OP, subscription, adapter);
                  +    }
                  +
                  +    /**
                  +     * Deregister method for the monitorEvent PubSub interaction.
                  +     * 
                  +     * @param identifierList identifierList the subscription identifiers to deregister
                  +     * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification.
                  +     * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception
                  +     */
                  +    public void monitorEventDeregister(org.ccsds.moims.mo.mal.structures.IdentifierList identifierList) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException {
                  +        consumer.deregister(org.ccsds.moims.mo.com.event.EventServiceInfo.MONITOREVENT_OP, identifierList);
                  +    }
                  +
                  +    /**
                  +     * Asynchronous version of method monitorEventDeregister.
                  +     * 
                  +     * @param identifierList identifierList the subscription identifiers to deregister
                  +     * @param adapter adapter Listener in charge of receiving the messages from the service provider
                  +     * @return the MAL message sent to initiate the interaction
                  +     * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification.
                  +     * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception
                  +     */
                  +    public org.ccsds.moims.mo.mal.transport.MALMessage asyncMonitorEventDeregister(org.ccsds.moims.mo.mal.structures.IdentifierList identifierList,
                  +            org.ccsds.moims.mo.com.event.consumer.EventAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException {
                  +        return consumer.asyncDeregister(org.ccsds.moims.mo.com.event.EventServiceInfo.MONITOREVENT_OP, identifierList, adapter);
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/event/consumer/MonitorEventSubscriptionKeys.java b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/event/consumer/MonitorEventSubscriptionKeys.java
                  new file mode 100644
                  index 00000000..7eb21acf
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/event/consumer/MonitorEventSubscriptionKeys.java
                  @@ -0,0 +1,68 @@
                  +package org.ccsds.moims.mo.com.event.consumer;
                  +
                  +/**
                  + * Typed accessors for the Subscription Keys of the monitorEvent PubSub operation.
                  + */
                  +public final class MonitorEventSubscriptionKeys {
                  +
                  +    /**
                  +     * The key values as received in the UpdateHeader.
                  +     */
                  +    private org.ccsds.moims.mo.mal.structures.NullableAttributeList keyValues;
                  +
                  +    /**
                  +     * The effective key names for the received key values.
                  +     */
                  +    private org.ccsds.moims.mo.mal.structures.IdentifierList keyNames;
                  +
                  +    /**
                  +     * The Subscription Key names defined by the operation, in order.
                  +     */
                  +    private static final org.ccsds.moims.mo.mal.structures.IdentifierList CANONICAL_KEY_NAMES = new org.ccsds.moims.mo.mal.structures.IdentifierList(new java.util.ArrayList<>(java.util.Arrays.asList()));
                  +
                  +    /**
                  +     * Creates an instance from the received UpdateHeader and the subscription
                  +     * selectedKeys.
                  +     * 
                  +     * @param updateHeader The UpdateHeader received in the NOTIFY message
                  +     * @param selectedKeys The selectedKeys of the subscription, or null if trimming was not enabled
                  +     */
                  +    public MonitorEventSubscriptionKeys(org.ccsds.moims.mo.mal.structures.UpdateHeader updateHeader,
                  +            org.ccsds.moims.mo.mal.structures.IdentifierList selectedKeys) {
                  +        this.keyValues = (updateHeader == null) ? null : updateHeader.getKeyValues();
                  +        this.keyNames = (selectedKeys != null) ? selectedKeys : CANONICAL_KEY_NAMES;
                  +    }
                  +
                  +    /**
                  +     * Returns the Subscription Key value with the given name, or null if it is
                  +     * not present (for example when it was trimmed away or is a custom key that
                  +     * is not part of this subscription).
                  +     * 
                  +     * @param name The Subscription Key name
                  +     * @return The key value, or null if not present
                  +     */
                  +    public org.ccsds.moims.mo.mal.structures.Attribute getByName(String name) {
                  +        return valueByName(name);
                  +    }
                  +
                  +    /**
                  +     * 
                  +     * @param name The Subscription Key name
                  +     */
                  +    private org.ccsds.moims.mo.mal.structures.Attribute valueByName(String name) {
                  +        if (keyNames == null || keyValues == null) {
                  +            return null;
                  +        }
                  +        for (int i = 0; i < keyNames.size(); i++) {
                  +            if (name.equals(keyNames.get(i).getValue())) {
                  +                if (i >= keyValues.size()) {
                  +                    return null;
                  +                }
                  +                org.ccsds.moims.mo.mal.structures.NullableAttribute na = keyValues.get(i);
                  +                return (na == null) ? null : na.getValue();
                  +            }
                  +        }
                  +        return null;
                  +    }
                  +
                  +}
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/event/consumer/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/event/consumer/package-info.java
                  new file mode 100644
                  index 00000000..3d25052c
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/event/consumer/package-info.java
                  @@ -0,0 +1,4 @@
                  +/**
                  + * Package containing the consumer stubs for the Event service.
                  +*/
                  +package org.ccsds.moims.mo.com.event.consumer;
                  diff --git a/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/event/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/event/package-info.java
                  new file mode 100644
                  index 00000000..3b75bc3f
                  --- /dev/null
                  +++ b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/event/package-info.java
                  @@ -0,0 +1,21 @@
                  +/**
                  + * An event is a specific object representing "something that happens
                  + * in the system at a given point in time". The event service provides
                  + * a generic mechanism for the distribution of events.
                  + * An event is a special type of COM object and is identified by the normal
                  + * object fields (domain, object type, and object instance identifier).
                  + * It may also contain:
                  + * 
                    + *
                  • a link to a source object (that caused the event to be generated)
                  • + *
                  • a link to a service specific related object
                  • + *
                  • a body that is specific to the event type and whose data structure + * is defined by the service that declares the event.
                  • + *
                  + * The event service only defines a single operation that supports the publishing + * of events and subscription of events generated by other components. + * Events are published with a MAL update type of DELETION. Events are something + * that happens at a given point in time, therefore they in themselves have + * no lifetime, they are created and deleted at the time instant in time. + * For efficiency purposes only the deletion update is used. +*/ +package org.ccsds.moims.mo.com.event; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/event/provider/EventHandler.java b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/event/provider/EventHandler.java new file mode 100644 index 00000000..b750bd3e --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/event/provider/EventHandler.java @@ -0,0 +1,15 @@ +package org.ccsds.moims.mo.com.event.provider; + +/** + * Interface that providers of the Event service must implement to handle + * the operations of that service. + */ +public interface EventHandler { + + /** + * Sets the skeleton to be used for creation of publishers. + * + * @param skeleton The skeleton to be used. + */ + void setSkeleton(org.ccsds.moims.mo.com.event.provider.EventSkeleton skeleton); +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/event/provider/EventInheritanceSkeleton.java b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/event/provider/EventInheritanceSkeleton.java new file mode 100644 index 00000000..051b615c --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/event/provider/EventInheritanceSkeleton.java @@ -0,0 +1,112 @@ +package org.ccsds.moims.mo.com.event.provider; + +/** + * Provider Inheritance skeleton for EventInheritanceSkeleton service. + */ +public abstract class EventInheritanceSkeleton implements org.ccsds.moims.mo.mal.provider.MALInteractionHandler, org.ccsds.moims.mo.com.event.provider.EventSkeleton, org.ccsds.moims.mo.com.event.provider.EventHandler { + + /** + * The providerSet field. + */ + private org.ccsds.moims.mo.mal.provider.MALProviderSet providerSet = new org.ccsds.moims.mo.mal.provider.MALProviderSet(org.ccsds.moims.mo.com.event.EventHelper.EVENT_SERVICE); + + /** + * Returns the connection object for this provider. + * + * @return the connection object for this provider + * @throws java.io.IOException if the method was not implemented yet. + */ + public org.ccsds.moims.mo.mal.helpertools.connections.ConnectionProvider getConnection() throws java.io.IOException { + throw new java.io.IOException("This method needs to be overridden!"); + } + + @Override + public void setSkeleton(org.ccsds.moims.mo.com.event.provider.EventSkeleton skeleton) { + // Not used in the inheritance pattern (the skeleton is 'this'); + } + + @Override + public void malInitialize(org.ccsds.moims.mo.mal.provider.MALProvider provider) throws org.ccsds.moims.mo.mal.MALException { + providerSet.addProvider(provider); + } + + @Override + public void malFinalize(org.ccsds.moims.mo.mal.provider.MALProvider provider) throws org.ccsds.moims.mo.mal.MALException { + providerSet.removeProvider(provider); + } + + @Override + public org.ccsds.moims.mo.com.event.provider.MonitorEventPublisher createMonitorEventPublisher(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.Identifier networkZone, + org.ccsds.moims.mo.mal.structures.SessionType sessionType, + org.ccsds.moims.mo.mal.structures.Identifier sessionName, + org.ccsds.moims.mo.mal.structures.QoSLevel qos, + java.util.Map qosProps, + org.ccsds.moims.mo.mal.structures.UInteger priority) throws org.ccsds.moims.mo.mal.MALException { + return new org.ccsds.moims.mo.com.event.provider.MonitorEventPublisher(providerSet.createPublisherSet(org.ccsds.moims.mo.com.event.EventServiceInfo.MONITOREVENT_OP, domain, sessionType, sessionName, qos, qosProps, null)); + } + + @Override + public void handleSend(org.ccsds.moims.mo.mal.provider.MALInteraction interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + switch (opNumber) { + default: + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } + + @Override + public void handleSubmit(org.ccsds.moims.mo.mal.provider.MALSubmit interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + switch (opNumber) { + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } + + @Override + public void handleRequest(org.ccsds.moims.mo.mal.provider.MALRequest interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + switch (opNumber) { + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } + + @Override + public void handleInvoke(org.ccsds.moims.mo.mal.provider.MALInvoke interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + switch (opNumber) { + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } + + @Override + public void handleProgress(org.ccsds.moims.mo.mal.provider.MALProgress interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + switch (opNumber) { + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/event/provider/EventSkeleton.java b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/event/provider/EventSkeleton.java new file mode 100644 index 00000000..8a1d3ab4 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/event/provider/EventSkeleton.java @@ -0,0 +1,29 @@ +package org.ccsds.moims.mo.com.event.provider; + +/** + * The skeleton interface for the Event service. + */ +public interface EventSkeleton { + + /** + * Creates a publisher object using the current registered provider set for + * the PubSub operation monitorEvent. + * + * @param domain The domain used for publishing + * @param networkZone ~The network zone used for publishing + * @param sessionType The session used for publishing + * @param sessionName The session name used for publishing + * @param qos The QoS used for publishing + * @param qosProps The QoS properties used for publishing + * @param priority The priority used for publishing + * @return The new publisher object. + * @throws org.ccsds.moims.mo.mal.MALException if a problem is detected during creation of the publisher + */ + org.ccsds.moims.mo.com.event.provider.MonitorEventPublisher createMonitorEventPublisher(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.Identifier networkZone, + org.ccsds.moims.mo.mal.structures.SessionType sessionType, + org.ccsds.moims.mo.mal.structures.Identifier sessionName, + org.ccsds.moims.mo.mal.structures.QoSLevel qos, + java.util.Map qosProps, + org.ccsds.moims.mo.mal.structures.UInteger priority) throws org.ccsds.moims.mo.mal.MALException; +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/event/provider/MonitorEventPublisher.java b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/event/provider/MonitorEventPublisher.java new file mode 100644 index 00000000..19824b32 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/event/provider/MonitorEventPublisher.java @@ -0,0 +1,124 @@ +package org.ccsds.moims.mo.com.event.provider; + +/** + * Publisher class for the monitorEvent operation. + */ +public final class MonitorEventPublisher { + + /** + * The publisherSet field. + */ + private org.ccsds.moims.mo.mal.provider.MALPublisherSet publisherSet; + + /** + * Creates an instance of this class using the supplied publisher set. + * + * @param publisherSet The set of broker connections to use when registering and publishing. + */ + public MonitorEventPublisher(org.ccsds.moims.mo.mal.provider.MALPublisherSet publisherSet) { + this.publisherSet = publisherSet; + } + + /** + * Registers this provider implementation to the set of broker connections. + * + * @param keyNames The key names to use in the method + * @param keyTypes The key types to use in the method + * @param listener The listener object to use for callback from the publisher + * @throws java.lang.IllegalArgumentException If any supplied argument is invalid + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void register(org.ccsds.moims.mo.mal.structures.IdentifierList keyNames, + org.ccsds.moims.mo.mal.structures.AttributeTypeList keyTypes, + org.ccsds.moims.mo.mal.provider.MALPublishInteractionListener listener) throws java.lang.IllegalArgumentException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + publisherSet.register(keyNames, keyTypes, listener); + } + + /** + * Registers this provider implementation to the set of broker connections + * with the default subscription keys. + * + * @param listener The listener object to use for callback from the publisher + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void registerWithDefaultKeys(org.ccsds.moims.mo.mal.provider.MALPublishInteractionListener listener) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + org.ccsds.moims.mo.mal.structures.IdentifierList keyNames = new org.ccsds.moims.mo.mal.structures.IdentifierList(); + org.ccsds.moims.mo.mal.structures.AttributeTypeList keyTypes = new org.ccsds.moims.mo.mal.structures.AttributeTypeList(); + publisherSet.register(keyNames, keyTypes, listener); + } + + /** + * Asynchronously registers this provider implementation to the set of broker + * connections. + * + * @param keyNames The key names to use in the method + * @param keyTypes The key types to use in the method + * @param listener The listener object to use for callback from the publisher + * @throws java.lang.IllegalArgumentException If any supplied argument is invalid + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void asyncRegister(org.ccsds.moims.mo.mal.structures.IdentifierList keyNames, + org.ccsds.moims.mo.mal.structures.AttributeTypeList keyTypes, + org.ccsds.moims.mo.mal.provider.MALPublishInteractionListener listener) throws java.lang.IllegalArgumentException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + publisherSet.asyncRegister(keyNames, keyTypes, listener); + } + + /** + * Publishes updates to the set of registered broker connections. + * + * @param updateHeader The headers of the updates being added + * @param eventLinks The MAL::EntityKey.firstSubKey shall contain the event object number as a base 10 string. For example, for an object number of '14' the key value would be '14' with no padding. +The MAL::EntityKey.secondSubKey shall contain the area, service, and version ObjectType fields as a MAL::Long populated as (in hex) 0xAAAASSSSVVXXXXXX where AAAA is the area (16 bits), SSSS is the service (16 bits), VV is the version (8 bits), and XXXXXX is unused and set to zero (24 bits). For example, for an area of '1', and a service of '2', and a version of '3' the field would contain (in hex) 0x0001000203000000. +The MAL::EntityKey.thirdSubKey shall contain the event object instance identifier. +The MAL::EntityKey.fourthSubKey shall contain the area, service, version and number fields of the event source ObjectType using same methodology as given for the second sub key but replacing the XXXXXX part with the number field. +The related and source links of the event shall populate the ObjectDetails part of the publish/notify message. +The body of the event shall populate the final part of the publish/notify message. +The timestamp of the Event shall be taken from the publish message. +An event in one domain may be generated by something in another domain therefore the domain of the event shall not be required to be the same domain as the source of the event. + * @param eventBody eventBody Argument number 1 as defined by the service operation + * @throws java.lang.IllegalArgumentException If any supplied argument is invalid + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void publish(org.ccsds.moims.mo.mal.structures.UpdateHeader updateHeader, + org.ccsds.moims.mo.com.structures.ObjectDetails eventLinks, + org.ccsds.moims.mo.mal.structures.Element eventBody) throws java.lang.IllegalArgumentException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + publisherSet.publish(updateHeader, eventLinks, eventBody); + } + + /** + * Deregisters this provider implementation from the set of broker connections. + * + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void deregister() throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + publisherSet.deregister(); + } + + /** + * Asynchronously deregisters this provider implementation from the set of + * broker connections. + * + * @param listener The listener object to use for callback from the publisher + * @throws java.lang.IllegalArgumentException If any supplied argument is invalid + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void asyncDeregister(org.ccsds.moims.mo.mal.provider.MALPublishInteractionListener listener) throws java.lang.IllegalArgumentException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + publisherSet.asyncDeregister(listener); + } + + /** + * Closes this publisher. + * + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void close() throws org.ccsds.moims.mo.mal.MALException { + publisherSet.close(); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/event/provider/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/event/provider/package-info.java new file mode 100644 index 00000000..11ba66de --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/event/provider/package-info.java @@ -0,0 +1,4 @@ +/** + * Package containing the provider skeletons for the Event service. +*/ +package org.ccsds.moims.mo.com.event.provider; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/package-info.java new file mode 100644 index 00000000..0a66aeb5 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/package-info.java @@ -0,0 +1,7 @@ +/** + * This section details the Common Object Model area; the structures used + * by the service are detailed in section 4. The area and structures are defined + * in terms of the MO Message Abstraction Layer (MAL), so it is possible to + * deploy them over any supported protocol and message transport. +*/ +package org.ccsds.moims.mo.com; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/structures/InstanceBooleanPair.java b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/structures/InstanceBooleanPair.java new file mode 100644 index 00000000..8925c79a --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/structures/InstanceBooleanPair.java @@ -0,0 +1,139 @@ +package org.ccsds.moims.mo.com.structures; + +/** + * Simple pair of an object instance identifier and a Boolean value. + */ +public final class InstanceBooleanPair implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 562949970198533L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 562949970198533L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * The object instance identifier. + */ + private Long id; + + /** + * An associated Boolean value. + */ + private Boolean value; + + /** + * Default constructor for InstanceBooleanPair. + * + */ + public InstanceBooleanPair() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param id The object instance identifier. + * @param value An associated Boolean value. + */ + public InstanceBooleanPair(Long id, + Boolean value) { + this.id = id; + this.value = value; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.com.structures.InstanceBooleanPair(); + } + + /** + * Returns the field id. + * + * @return The field id + */ + public Long getId() { + return id; + } + + /** + * Returns the field value. + * + * @return The field value + */ + public Boolean getValue() { + return value; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof InstanceBooleanPair) { + InstanceBooleanPair other = (InstanceBooleanPair) obj; + if (id == null) { + if (other.id != null) { + return false; + } + } else { + if (! id.equals(other.id)) { + return false; + } + } + if (value == null) { + if (other.value != null) { + return false; + } + } else { + if (! value.equals(other.value)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (id != null ? id.hashCode() : 0); + hash = 83 * hash + (value != null ? value.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(InstanceBooleanPair: "); + buf.append("id=").append(id); + buf.append(", value=").append(value); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (id == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'id' cannot be null!"); + } + if (value == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'value' cannot be null!"); + } + encoder.encodeLong(id); + encoder.encodeBoolean(value); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + id = decoder.decodeLong(); + value = decoder.decodeBoolean(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/structures/InstanceBooleanPairList.java b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/structures/InstanceBooleanPairList.java new file mode 100644 index 00000000..549110c0 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/structures/InstanceBooleanPairList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.com.structures; + +/** + * List class for InstanceBooleanPair. + */ +public final class InstanceBooleanPairList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 562949986975739L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 562949986975739L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for InstanceBooleanPairList. + * + */ + public InstanceBooleanPairList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public InstanceBooleanPairList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public InstanceBooleanPairList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.com.structures.InstanceBooleanPair element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.com.structures.InstanceBooleanPair element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new InstanceBooleanPairList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.com.structures.InstanceBooleanPair(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/structures/ObjectDetails.java b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/structures/ObjectDetails.java new file mode 100644 index 00000000..16095e29 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/structures/ObjectDetails.java @@ -0,0 +1,138 @@ +package org.ccsds.moims.mo.com.structures; + +/** + * The ObjectDetails type is used to hold the extra information associated + * with an object instance, namely the related and source links. + */ +public final class ObjectDetails implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 562949970198532L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 562949970198532L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Contains the object instance identifier of a related object (e.g. the ActionDefinition + * that an Action uses). This is service specific. The ObjectType of the related + * object is specified in the service specification. The related object must + * exist in the same domain as this object. + */ + private Long related; + + /** + * An object which is at the origin of the object creation (e.g. the procedure + * from which an action was triggered). + */ + private org.ccsds.moims.mo.com.structures.ObjectId source; + + /** + * Default constructor for ObjectDetails. + * + */ + public ObjectDetails() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param related Contains the object instance identifier of a related object (e.g. the ActionDefinition that an Action uses). This is service specific. The ObjectType of the related object is specified in the service specification. The related object must exist in the same domain as this object. + * @param source An object which is at the origin of the object creation (e.g. the procedure from which an action was triggered). + */ + public ObjectDetails(Long related, + org.ccsds.moims.mo.com.structures.ObjectId source) { + this.related = related; + this.source = source; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.com.structures.ObjectDetails(); + } + + /** + * Returns the field related. + * + * @return The field related + */ + public Long getRelated() { + return related; + } + + /** + * Returns the field source. + * + * @return The field source + */ + public org.ccsds.moims.mo.com.structures.ObjectId getSource() { + return source; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ObjectDetails) { + ObjectDetails other = (ObjectDetails) obj; + if (related == null) { + if (other.related != null) { + return false; + } + } else { + if (! related.equals(other.related)) { + return false; + } + } + if (source == null) { + if (other.source != null) { + return false; + } + } else { + if (! source.equals(other.source)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (related != null ? related.hashCode() : 0); + hash = 83 * hash + (source != null ? source.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(ObjectDetails: "); + buf.append("related=").append(related); + buf.append(", source=").append(source); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeNullableLong(related); + encoder.encodeNullableElement(source); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + related = decoder.decodeNullableLong(); + source = (org.ccsds.moims.mo.com.structures.ObjectId) decoder.decodeNullableElement(new org.ccsds.moims.mo.com.structures.ObjectId()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/structures/ObjectDetailsList.java b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/structures/ObjectDetailsList.java new file mode 100644 index 00000000..b3152e5d --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/structures/ObjectDetailsList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.com.structures; + +/** + * List class for ObjectDetails. + */ +public final class ObjectDetailsList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 562949986975740L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 562949986975740L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for ObjectDetailsList. + * + */ + public ObjectDetailsList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public ObjectDetailsList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public ObjectDetailsList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.com.structures.ObjectDetails element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.com.structures.ObjectDetails element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new ObjectDetailsList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.com.structures.ObjectDetails(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/structures/ObjectId.java b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/structures/ObjectId.java new file mode 100644 index 00000000..84996943 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/structures/ObjectId.java @@ -0,0 +1,140 @@ +package org.ccsds.moims.mo.com.structures; + +/** + * The ObjectId structure combines an object type and an object key such that + * it identifies the instance and type of an object for a specific domain. + */ +public final class ObjectId implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 562949970198531L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 562949970198531L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * The fully qualified unique identifier of the type. + */ + private org.ccsds.moims.mo.com.structures.ObjectType type; + + /** + * The combination of the object domain and object instance identifier. + */ + private org.ccsds.moims.mo.com.structures.ObjectKey key; + + /** + * Default constructor for ObjectId. + * + */ + public ObjectId() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param type The fully qualified unique identifier of the type. + * @param key The combination of the object domain and object instance identifier. + */ + public ObjectId(org.ccsds.moims.mo.com.structures.ObjectType type, + org.ccsds.moims.mo.com.structures.ObjectKey key) { + this.type = type; + this.key = key; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.com.structures.ObjectId(); + } + + /** + * Returns the field type. + * + * @return The field type + */ + public org.ccsds.moims.mo.com.structures.ObjectType getType() { + return type; + } + + /** + * Returns the field key. + * + * @return The field key + */ + public org.ccsds.moims.mo.com.structures.ObjectKey getKey() { + return key; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ObjectId) { + ObjectId other = (ObjectId) obj; + if (type == null) { + if (other.type != null) { + return false; + } + } else { + if (! type.equals(other.type)) { + return false; + } + } + if (key == null) { + if (other.key != null) { + return false; + } + } else { + if (! key.equals(other.key)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (type != null ? type.hashCode() : 0); + hash = 83 * hash + (key != null ? key.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(ObjectId: "); + buf.append("type=").append(type); + buf.append(", key=").append(key); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (type == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'type' cannot be null!"); + } + if (key == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'key' cannot be null!"); + } + encoder.encodeElement(type); + encoder.encodeElement(key); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + type = (org.ccsds.moims.mo.com.structures.ObjectType) decoder.decodeElement(new org.ccsds.moims.mo.com.structures.ObjectType()); + key = (org.ccsds.moims.mo.com.structures.ObjectKey) decoder.decodeElement(new org.ccsds.moims.mo.com.structures.ObjectKey()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/structures/ObjectIdList.java b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/structures/ObjectIdList.java new file mode 100644 index 00000000..1bd6fbae --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/structures/ObjectIdList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.com.structures; + +/** + * List class for ObjectId. + */ +public final class ObjectIdList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 562949986975741L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 562949986975741L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for ObjectIdList. + * + */ + public ObjectIdList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public ObjectIdList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public ObjectIdList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.com.structures.ObjectId element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.com.structures.ObjectId element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new ObjectIdList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.com.structures.ObjectId(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/structures/ObjectKey.java b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/structures/ObjectKey.java new file mode 100644 index 00000000..4c929f57 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/structures/ObjectKey.java @@ -0,0 +1,141 @@ +package org.ccsds.moims.mo.com.structures; + +/** + * The ObjectKey structure combines a domain and an object instance identifier + * such that it identifies the instance of an object for a specific domain. + */ +public final class ObjectKey implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 562949970198530L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 562949970198530L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * The domain of the object instance. + */ + private org.ccsds.moims.mo.mal.structures.IdentifierList domain; + + /** + * The unique identifier of the object instance. Must not be "0" + * for values as this is the wildcard. + */ + private Long instId; + + /** + * Default constructor for ObjectKey. + * + */ + public ObjectKey() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param domain The domain of the object instance. + * @param instId The unique identifier of the object instance. Must not be '0' for values as this is the wildcard. + */ + public ObjectKey(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + Long instId) { + this.domain = domain; + this.instId = instId; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.com.structures.ObjectKey(); + } + + /** + * Returns the field domain. + * + * @return The field domain + */ + public org.ccsds.moims.mo.mal.structures.IdentifierList getDomain() { + return domain; + } + + /** + * Returns the field instId. + * + * @return The field instId + */ + public Long getInstId() { + return instId; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ObjectKey) { + ObjectKey other = (ObjectKey) obj; + if (domain == null) { + if (other.domain != null) { + return false; + } + } else { + if (! domain.equals(other.domain)) { + return false; + } + } + if (instId == null) { + if (other.instId != null) { + return false; + } + } else { + if (! instId.equals(other.instId)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (domain != null ? domain.hashCode() : 0); + hash = 83 * hash + (instId != null ? instId.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(ObjectKey: "); + buf.append("domain=").append(domain); + buf.append(", instId=").append(instId); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (domain == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'domain' cannot be null!"); + } + if (instId == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'instId' cannot be null!"); + } + encoder.encodeElement(domain); + encoder.encodeLong(instId); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + domain = (org.ccsds.moims.mo.mal.structures.IdentifierList) decoder.decodeElement(new org.ccsds.moims.mo.mal.structures.IdentifierList()); + instId = decoder.decodeLong(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/structures/ObjectKeyList.java b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/structures/ObjectKeyList.java new file mode 100644 index 00000000..b552e918 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/structures/ObjectKeyList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.com.structures; + +/** + * List class for ObjectKey. + */ +public final class ObjectKeyList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 562949986975742L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 562949986975742L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for ObjectKeyList. + * + */ + public ObjectKeyList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public ObjectKeyList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public ObjectKeyList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.com.structures.ObjectKey element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.com.structures.ObjectKey element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new ObjectKeyList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.com.structures.ObjectKey(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/structures/ObjectType.java b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/structures/ObjectType.java new file mode 100644 index 00000000..503449d6 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/structures/ObjectType.java @@ -0,0 +1,213 @@ +package org.ccsds.moims.mo.com.structures; + +/** + * The ObjectType structure uniquely identifies the type of an object. It + * is the combination of the area number, service number, area version, and + * service object type number. The combined parts are able to fit inside a + * MAL::Long (for implementations that prefer to index on a single numeric + * field rather than a structure). + */ +public final class ObjectType implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 562949970198529L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 562949970198529L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Area Number where the object type is defined. Must not be "0" + * for values as this is the wildcard. + */ + private org.ccsds.moims.mo.mal.structures.UShort area; + + /** + * Service Number of the service where the object type is defined. Must not + * be "0" for values as this is the wildcard. + */ + private org.ccsds.moims.mo.mal.structures.UShort service; + + /** + * Area Version of the service where the object type is defined. Must not + * be "0" for values as this is the wildcard. + */ + private org.ccsds.moims.mo.mal.structures.UOctet version; + + /** + * The service specific object number. Must not be "0" for values + * as this is the wildcard. + */ + private org.ccsds.moims.mo.mal.structures.UShort number; + + /** + * Default constructor for ObjectType. + * + */ + public ObjectType() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param area Area Number where the object type is defined. Must not be '0' for values as this is the wildcard. + * @param service Service Number of the service where the object type is defined. Must not be '0' for values as this is the wildcard. + * @param version Area Version of the service where the object type is defined. Must not be '0' for values as this is the wildcard. + * @param number The service specific object number. Must not be '0' for values as this is the wildcard. + */ + public ObjectType(org.ccsds.moims.mo.mal.structures.UShort area, + org.ccsds.moims.mo.mal.structures.UShort service, + org.ccsds.moims.mo.mal.structures.UOctet version, + org.ccsds.moims.mo.mal.structures.UShort number) { + this.area = area; + this.service = service; + this.version = version; + this.number = number; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.com.structures.ObjectType(); + } + + /** + * Returns the field area. + * + * @return The field area + */ + public org.ccsds.moims.mo.mal.structures.UShort getArea() { + return area; + } + + /** + * Returns the field service. + * + * @return The field service + */ + public org.ccsds.moims.mo.mal.structures.UShort getService() { + return service; + } + + /** + * Returns the field version. + * + * @return The field version + */ + public org.ccsds.moims.mo.mal.structures.UOctet getVersion() { + return version; + } + + /** + * Returns the field number. + * + * @return The field number + */ + public org.ccsds.moims.mo.mal.structures.UShort getNumber() { + return number; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ObjectType) { + ObjectType other = (ObjectType) obj; + if (area == null) { + if (other.area != null) { + return false; + } + } else { + if (! area.equals(other.area)) { + return false; + } + } + if (service == null) { + if (other.service != null) { + return false; + } + } else { + if (! service.equals(other.service)) { + return false; + } + } + if (version == null) { + if (other.version != null) { + return false; + } + } else { + if (! version.equals(other.version)) { + return false; + } + } + if (number == null) { + if (other.number != null) { + return false; + } + } else { + if (! number.equals(other.number)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (area != null ? area.hashCode() : 0); + hash = 83 * hash + (service != null ? service.hashCode() : 0); + hash = 83 * hash + (version != null ? version.hashCode() : 0); + hash = 83 * hash + (number != null ? number.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(ObjectType: "); + buf.append("area=").append(area); + buf.append(", service=").append(service); + buf.append(", version=").append(version); + buf.append(", number=").append(number); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (area == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'area' cannot be null!"); + } + if (service == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'service' cannot be null!"); + } + if (version == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'version' cannot be null!"); + } + if (number == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'number' cannot be null!"); + } + encoder.encodeUShort(area); + encoder.encodeUShort(service); + encoder.encodeUOctet(version); + encoder.encodeUShort(number); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + area = decoder.decodeUShort(); + service = decoder.decodeUShort(); + version = decoder.decodeUOctet(); + number = decoder.decodeUShort(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/structures/ObjectTypeList.java b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/structures/ObjectTypeList.java new file mode 100644 index 00000000..3f27d5fa --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/structures/ObjectTypeList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.com.structures; + +/** + * List class for ObjectType. + */ +public final class ObjectTypeList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 562949986975743L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 562949986975743L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for ObjectTypeList. + * + */ + public ObjectTypeList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public ObjectTypeList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public ObjectTypeList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.com.structures.ObjectType element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.com.structures.ObjectType element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new ObjectTypeList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.com.structures.ObjectType(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/structures/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/structures/package-info.java new file mode 100644 index 00000000..64f1cf7c --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area002-v001-com/org/ccsds/moims/mo/com/structures/package-info.java @@ -0,0 +1,4 @@ +/** + * Package containing types defined in the COM area. +*/ +package org.ccsds.moims.mo.com.structures; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/CommonElementFactory.java b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/CommonElementFactory.java new file mode 100644 index 00000000..a9a67cc5 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/CommonElementFactory.java @@ -0,0 +1,100 @@ +package org.ccsds.moims.mo.common; + +/** + * Creates the Elements of the Common area, without holding an instance of + * each of them, so that the class of a type is only loaded once a message + * carries that type. + */ +public final class CommonElementFactory implements org.ccsds.moims.mo.mal.AreaElementFactory { + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement(int serviceNumber, + int typeNumber) { + switch (serviceNumber) { + case 0: return createAreaElement(typeNumber); + case 1: return createDirectoryElement(typeNumber); + case 2: return createLoginElement(typeNumber); + case 5: return createConfigurationElement(typeNumber); + default: return null; + } + } + + @Override + public int getAreaNumber() { + return 3; + } + + @Override + public int getAreaVersion() { + return 1; + } + + /** + * Creates an Element declared by the area itself. + * + * @param typeNumber The typeNumber field. + */ + private static org.ccsds.moims.mo.mal.structures.Element createAreaElement(int typeNumber) { + switch (typeNumber) { + case -1: return new org.ccsds.moims.mo.common.structures.ServiceKeyList(); + case 1: return new org.ccsds.moims.mo.common.structures.ServiceKey(); + default: return null; + } + } + + /** + * Creates an Element declared by the Directory service. + * + * @param typeNumber The typeNumber field. + */ + private static org.ccsds.moims.mo.mal.structures.Element createDirectoryElement(int typeNumber) { + switch (typeNumber) { + case -7: return new org.ccsds.moims.mo.common.directory.structures.ServiceFilterList(); + case -6: return new org.ccsds.moims.mo.common.directory.structures.PublishDetailsList(); + case -5: return new org.ccsds.moims.mo.common.directory.structures.ProviderSummaryList(); + case -4: return new org.ccsds.moims.mo.common.directory.structures.AddressDetailsList(); + case -2: return new org.ccsds.moims.mo.common.directory.structures.ServiceCapabilityList(); + case -1: return new org.ccsds.moims.mo.common.directory.structures.ProviderDetailsList(); + case 1: return new org.ccsds.moims.mo.common.directory.structures.ProviderDetails(); + case 2: return new org.ccsds.moims.mo.common.directory.structures.ServiceCapability(); + case 4: return new org.ccsds.moims.mo.common.directory.structures.AddressDetails(); + case 5: return new org.ccsds.moims.mo.common.directory.structures.ProviderSummary(); + case 6: return new org.ccsds.moims.mo.common.directory.structures.PublishDetails(); + case 7: return new org.ccsds.moims.mo.common.directory.structures.ServiceFilter(); + default: return null; + } + } + + /** + * Creates an Element declared by the Login service. + * + * @param typeNumber The typeNumber field. + */ + private static org.ccsds.moims.mo.mal.structures.Element createLoginElement(int typeNumber) { + switch (typeNumber) { + case -1: return new org.ccsds.moims.mo.common.login.structures.ProfileList(); + case 1: return new org.ccsds.moims.mo.common.login.structures.Profile(); + default: return null; + } + } + + /** + * Creates an Element declared by the Configuration service. + * + * @param typeNumber The typeNumber field. + */ + private static org.ccsds.moims.mo.mal.structures.Element createConfigurationElement(int typeNumber) { + switch (typeNumber) { + case -4: return new org.ccsds.moims.mo.common.configuration.structures.ConfigurationTypeList(); + case -3: return new org.ccsds.moims.mo.common.configuration.structures.ServiceConfigurationIdentifierList(); + case -2: return new org.ccsds.moims.mo.common.configuration.structures.ConfigurationObjectDetailsList(); + case -1: return new org.ccsds.moims.mo.common.configuration.structures.ConfigurationObjectSetList(); + case 1: return new org.ccsds.moims.mo.common.configuration.structures.ConfigurationObjectSet(); + case 2: return new org.ccsds.moims.mo.common.configuration.structures.ConfigurationObjectDetails(); + case 3: return new org.ccsds.moims.mo.common.configuration.structures.ServiceConfigurationIdentifier(); + case 4: return new org.ccsds.moims.mo.common.configuration.structures.ConfigurationType(); + default: return null; + } + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/CommonHelper.java b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/CommonHelper.java new file mode 100644 index 00000000..85e586ce --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/CommonHelper.java @@ -0,0 +1,55 @@ +package org.ccsds.moims.mo.common; + +/** + * Helper class for Common area. + */ +public class CommonHelper { + + /** + * Area number literal. + */ + public static final int _COMMON_AREA_NUMBER = 3; + + /** + * Area number instance. + */ + public static final org.ccsds.moims.mo.mal.structures.UShort COMMON_AREA_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_COMMON_AREA_NUMBER); + + /** + * Area name constant. + */ + public static final org.ccsds.moims.mo.mal.structures.Identifier COMMON_AREA_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("Common"); + + /** + * Area version literal. + */ + public static final short _COMMON_AREA_VERSION = 1; + + /** + * Area version instance. + */ + public static final org.ccsds.moims.mo.mal.structures.UOctet COMMON_AREA_VERSION = new org.ccsds.moims.mo.mal.structures.UOctet(_COMMON_AREA_VERSION); + + /** + * Area Elements. + */ + public static final org.ccsds.moims.mo.mal.structures.Element[] COMMON_AREA_ELEMENTS = {}; + + /** + * Services in this Area. + */ + public static final org.ccsds.moims.mo.mal.ServiceInfo[] COMMON_AREA_SERVICES = { + org.ccsds.moims.mo.common.directory.DirectoryHelper.DIRECTORY_SERVICE, + org.ccsds.moims.mo.common.login.LoginHelper.LOGIN_SERVICE, + org.ccsds.moims.mo.common.configuration.ConfigurationHelper.CONFIGURATION_SERVICE,}; + + /** + * Area singleton instance. + */ + public static final org.ccsds.moims.mo.mal.MALArea COMMON_AREA = new org.ccsds.moims.mo.mal.MALArea(COMMON_AREA_NUMBER, COMMON_AREA_NAME, COMMON_AREA_VERSION, COMMON_AREA_ELEMENTS, COMMON_AREA_SERVICES, new CommonElementFactory()); + + private CommonHelper() { + // Utility class; not meant to be instantiated. + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/configuration/ConfigurationHelper.java b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/configuration/ConfigurationHelper.java new file mode 100644 index 00000000..9b774a14 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/configuration/ConfigurationHelper.java @@ -0,0 +1,17 @@ +package org.ccsds.moims.mo.common.configuration; + +/** + * Helper class for Configuration service. + */ +public class ConfigurationHelper { + + /** + * Service singleton instance. + */ + public static final org.ccsds.moims.mo.common.configuration.ConfigurationServiceInfo CONFIGURATION_SERVICE = new org.ccsds.moims.mo.common.configuration.ConfigurationServiceInfo(); + + private ConfigurationHelper() { + // Utility class; not meant to be instantiated. + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/configuration/ConfigurationServiceInfo.java b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/configuration/ConfigurationServiceInfo.java new file mode 100644 index 00000000..058bb5b4 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/configuration/ConfigurationServiceInfo.java @@ -0,0 +1,543 @@ +package org.ccsds.moims.mo.common.configuration; + +/** + * Helper class for Configuration service. + */ +public class ConfigurationServiceInfo extends org.ccsds.moims.mo.com.COMService { + + /** + * Service number literal. + */ + public static final int _CONFIGURATION_SERVICE_NUMBER = 5; + + /** + * Service number instance. + */ + public static final org.ccsds.moims.mo.mal.structures.UShort CONFIGURATION_SERVICE_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_CONFIGURATION_SERVICE_NUMBER); + + /** + * Service name constant. + */ + public static final org.ccsds.moims.mo.mal.structures.Identifier CONFIGURATION_SERVICE_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("Configuration"); + + /** + * The service key of this service. + */ + private static final org.ccsds.moims.mo.mal.ServiceKey SERVICE_KEY = new org.ccsds.moims.mo.mal.ServiceKey( + 3, 1, CONFIGURATION_SERVICE_NUMBER); + + /** + * Operation number literal for operation ACTIVATE. + */ + public static final int _ACTIVATE_OP_NUMBER = 1; + + /** + * Operation number instance for operation ACTIVATE. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort ACTIVATE_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_ACTIVATE_OP_NUMBER); + + /** + * Operation instance for operation ACTIVATE. + */ + public static final org.ccsds.moims.mo.mal.MALInvokeOperation ACTIVATE_OP = new org.ccsds.moims.mo.mal.MALInvokeOperation(SERVICE_KEY, + ACTIVATE_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("activate"), + new org.ccsds.moims.mo.mal.structures.UShort(1), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("serviceProvider", true, org.ccsds.moims.mo.com.structures.ObjectKey.SHORT_FORM, "The serviceProvider field shall contain the domain and object instance identifier of the ServiceProvider COM object being (re)configured.\nIf the service provider referenced by the serviceProvider field is not known an UNKNOWN error shall be returned."), + new org.ccsds.moims.mo.mal.OperationField("configObjId", true, org.ccsds.moims.mo.com.structures.ObjectId.SHORT_FORM, "The configObjId field shall hold the COM object identifier that identifies the configuration to activate.\nThe configObjId field shall reference either a ProviderConfiguration or ServiceConfiguration object.\nAn UNKNOWN error shall be returned if the object instance identifier held in the configObjId field does not match an existing configuration.\nAn INVALID error shall be returned if the object instance identifier held in the configObjId field does not reference either a ProviderConfiguration or ServiceConfiguration object.\nIf the object instance identifier held in the configObjId field does not reference a valid configuration for the service provider an INVALID error shall be returned. A valid configuration is one that is returned from the list operation for the matched service provider.")}, + new org.ccsds.moims.mo.mal.OperationField[] {}, + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("activationResult", true, org.ccsds.moims.mo.mal.structures.Attribute.BOOLEAN_SHORT_FORM, "The service provider that implements the selected service shall, after the reception of the ConfigurationSwitch event, reconfigure itself and publish a ConfigurationSwitched COM event.\nIf the operation fails the previous configuration shall remain active.\nIn the case of a provider configuration, where multiple service configurations are being switched, the provider must switch all configurations successfully or roll back to the previous configuration. No partial reconfiguration is supported.\nIf a provider level configuration is successful, and a COM archive is being used, then the service provider that implements the selected service shall store in the COM archive a new ProviderConfigurationLink COM object that links its ServiceProvider object to the new activated ProviderConfiguration COM object.\nThe response message shall be sent when the configuration is either made active or fails.\nIf the activation was successful then the activationResult field shall be set to TRUE, otherwise FALSE for failure."), + new org.ccsds.moims.mo.mal.OperationField("previousConfig", true, org.ccsds.moims.mo.com.structures.ObjectIdList.SHORT_FORM, "The previousConfig field shall point to the previously active configuration or NULL if no configuration was previously active or the activationResult was FALSE for failure.\nIf a service configuration was requested, configObjId field shall referenced a ServiceConfiguration, the response shall contain a list of a single item of the previous ServiceConfiguration COM object.\nIf a provider configuration was requested, configObjId field shall referenced a ProviderConfiguration, the response shall contain a list of the previous ProviderConfiguration COM object followed by the list of previous ServiceConfiguration objects active for that provider.")}, + "The activate operation instructs a service provider to make a specific configuration active. The operation returns once the new configuration is active or when the activation attempt has failed for some reason.\nThe requested configuration must have either already been added to the configuration service provider using the add operation or alternatively known to the configuration service by another implementation specific mechanism.\nNOTE - The service is reconfigured for all service consumers not just the calling consumer."); + + /** + * Operation number literal for operation LIST. + */ + public static final int _LIST_OP_NUMBER = 2; + + /** + * Operation number instance for operation LIST. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort LIST_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_LIST_OP_NUMBER); + + /** + * Operation instance for operation LIST. + */ + public static final org.ccsds.moims.mo.mal.MALRequestOperation LIST_OP = new org.ccsds.moims.mo.mal.MALRequestOperation(SERVICE_KEY, + LIST_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("list"), + new org.ccsds.moims.mo.mal.structures.UShort(2), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("configurationType", true, org.ccsds.moims.mo.common.configuration.structures.ConfigurationType.SHORT_FORM, "The configurationType argument shall hold the type of configuration to be listed."), + new org.ccsds.moims.mo.mal.OperationField("domain", true, org.ccsds.moims.mo.mal.structures.IdentifierList.SHORT_FORM, "The domain request argument shall contain the domain of the configuration objects to return.\nThe domain field supports the wildcard value of '*' only in the last part of the domain, otherwise an INVALID error shall be returned. See section 3.5.6.5.g in R[2]."), + new org.ccsds.moims.mo.mal.OperationField("serviceKey", true, org.ccsds.moims.mo.common.structures.ServiceKey.SHORT_FORM, "If the request configuration type is SERVICE, then an optional filter may be supplied in the serviceKey field where the ServiceKey composite holds the service area, service, and version values to match on.\nThe filter shall be applied with a logical AND for each field of the service key.\nWildcard values of '0' are not accepted in the serviceKey fields, an INVALID error shall be returned in this case.\nFor other types of configuration the serviceKey field shall be ignored and may be set to NULL in the request.")}, + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("objInstIds", true, org.ccsds.moims.mo.com.structures.ObjectIdList.SHORT_FORM, "The operation shall return the list of matched configuration objects known to the configuration service provider.\nIf no configurations matched then an empty list shall be returned.")}, + "The list operation returns list of configurations known to the configuration service provider for a certain configuration type in a specific domain.\nTo appear in the response from the list operation a configuration must have either been added to the configuration service provider using the add operation or alternatively known to the configuration service by another implementation specific mechanism."); + + /** + * Operation number literal for operation GETCURRENT. + */ + public static final int _GETCURRENT_OP_NUMBER = 3; + + /** + * Operation number instance for operation GETCURRENT. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort GETCURRENT_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_GETCURRENT_OP_NUMBER); + + /** + * Operation instance for operation GETCURRENT. + */ + public static final org.ccsds.moims.mo.mal.MALRequestOperation GETCURRENT_OP = new org.ccsds.moims.mo.mal.MALRequestOperation(SERVICE_KEY, + GETCURRENT_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("getCurrent"), + new org.ccsds.moims.mo.mal.structures.UShort(2), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("serviceProvider", true, org.ccsds.moims.mo.com.structures.ObjectKey.SHORT_FORM, "The serviceProvider field shall contain the domain and object instance identifier of the ServiceProvider COM object being queried."), + new org.ccsds.moims.mo.mal.OperationField("serviceKey", true, org.ccsds.moims.mo.common.structures.ServiceKey.SHORT_FORM, "If the serviceKey field is not NULL, then the operation shall return the configuration of the selected service, as specified in the field.\nFor retrieval of the provider level configuration the serviceKey field shall be set to NULL in the request.\nAn UNKNOWN error shall be returned if the combination of service provider and service filter fields don't match an existing service provider, service key or configuration.\nNo wildcards are supported, an INVALID error must be returned in this case.")}, + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("objInstId", true, org.ccsds.moims.mo.com.structures.ObjectIdList.SHORT_FORM, "If a service configuration was requested, serviceKey was not NULL, the response shall contain a list of a single item of the matched ServiceConfiguration COM object.\nIf a provider configuration was requested, serviceKey was NULL, the response shall contain a list of the matched ProviderConfiguration COM object followed by the list of active ServiceConfiguration objects active for that provider.")}, + "The getCurrent operation returns the currently selected configuration of a service provider, either of the complete provider (ProviderConfiguration) or a specific service (ServiceConfiguration) of that provider, as far as the Configuration Service provider is concerned.\nThis means that if the provider of a specific service has modified their configuration by some other means, and this has not been stored using the storeCurrent operation, then this operation will return the unmodified configuration.\nIf a provider level configuration is required by this operation, and service configurations different to the ones in the provider configuration have been activated by the activate operation, then this operation will return the ProviderConfiguration followed by the list of modified ServiceConfigurations.\nThe current configuration of a service provider is most likely the configuration that was last activated using the activate operation, however implementations of the configuration service may have other means (outside the scope of this service) of selecting the current configuration of a service provider.\nThe operation can also be used to determine the initial configuration of a service provider before it has been activated, it is therefore a useful operation to call by a service provider during start-up to determine its initial configuration. If this is the case a ConfigurationSwitched event should be published."); + + /** + * Operation number literal for operation EXPORTXML. + */ + public static final int _EXPORTXML_OP_NUMBER = 4; + + /** + * Operation number instance for operation EXPORTXML. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort EXPORTXML_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_EXPORTXML_OP_NUMBER); + + /** + * Operation instance for operation EXPORTXML. + */ + public static final org.ccsds.moims.mo.mal.MALRequestOperation EXPORTXML_OP = new org.ccsds.moims.mo.mal.MALRequestOperation(SERVICE_KEY, + EXPORTXML_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("exportXML"), + new org.ccsds.moims.mo.mal.structures.UShort(3), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("confObjId", true, org.ccsds.moims.mo.com.structures.ObjectId.SHORT_FORM, "If the implementation of the configuration service is not using a COM archive then an UNSUPPORTED_OPERATION error shall be returned.\nThe confObjId argument shall contain the type, domain and COM object instance identifier of the configuration object to return the XML representation of.\nAn UNKNOWN error shall be returned if the confObjId field does not match an existing COM object.\nAn INVALID error shall be returned if the confObjId does not refer to either a ProviderConfiguration or a ServiceConfiguration object.\nAn INVALID error shall be returned if the confObjId refers to either a hard-coded or a non-COM configuration."), + new org.ccsds.moims.mo.mal.OperationField("returnComplete", true, org.ccsds.moims.mo.mal.structures.Attribute.BOOLEAN_SHORT_FORM, "The returnComplete Boolean shall be set to True if the returned XML is to be in the complete standardised format, otherwise it will be in the compact standardised format.")}, + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("xmlConfiguration", true, org.ccsds.moims.mo.mal.structures.File.SHORT_FORM, "The returned File object shall contain the configuration XML.\nThe Configuration object shall not be deleted from the COM Archive.")}, + "The exportXML operation returns the actual Configuration information in the XML format from the configuration object stored in the Archive.\nThe returned XML is in the standardised format and one of two levels of detail, compact or complete, can be selected. Compact contains just the COM object instance identifiers with the respective domains and object types whereas complete augments the compact with the additional set of values inside the respective service objects. \nThe XML standardised format is the XML representation of the referenced COM objects as defined by the XML encoding given in R[4]. Example XML documents can be found in an annex at the end of this specification.\nIf the implementation of the configuration service is not using a COM archive then an error is returned.\nIt should be noted that this operation only supports COM configurations."); + + /** + * Operation number literal for operation ADD. + */ + public static final int _ADD_OP_NUMBER = 5; + + /** + * Operation number instance for operation ADD. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort ADD_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_ADD_OP_NUMBER); + + /** + * Operation instance for operation ADD. + */ + public static final org.ccsds.moims.mo.mal.MALSubmitOperation ADD_OP = new org.ccsds.moims.mo.mal.MALSubmitOperation(SERVICE_KEY, + ADD_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("add"), + new org.ccsds.moims.mo.mal.structures.UShort(4), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("serviceProvider", true, org.ccsds.moims.mo.com.structures.ObjectKey.SHORT_FORM, "If the implementation of the configuration service is not using a COM archive then an UNSUPPORTED_OPERATION error shall be returned.\nThe first argument shall contain the domain and object identifier of the ServiceProvider COM object which the configurations are being added to."), + new org.ccsds.moims.mo.mal.OperationField("configObjIds", true, org.ccsds.moims.mo.com.structures.ObjectIdList.SHORT_FORM, "The second argument shall contain a list of service and/or provider configurations to add to the list of configurations available for the specific service provider.\nIf either the service provider or the configuration objects are unknown then an UNKNOWN error shall be returned.\nIf any of the supplied configuration objects are not provider or service configuration objects then an INVALID error shall be returned.\nIf an error is raised then no new configurations shall be added as a result of this operation call.")}, + "The add operation makes a new Configuration available on the Configuration Service. The Configuration must already exist in the COM archive to be added to the Configuration Service.\nIf the implementation of the configuration service is not using a COM archive then an error is returned.\nThis operation can be used to add COM, non-COM and hard-coded configurations."); + + /** + * Operation number literal for operation REMOVE. + */ + public static final int _REMOVE_OP_NUMBER = 6; + + /** + * Operation number instance for operation REMOVE. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort REMOVE_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_REMOVE_OP_NUMBER); + + /** + * Operation instance for operation REMOVE. + */ + public static final org.ccsds.moims.mo.mal.MALSubmitOperation REMOVE_OP = new org.ccsds.moims.mo.mal.MALSubmitOperation(SERVICE_KEY, + REMOVE_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("remove"), + new org.ccsds.moims.mo.mal.structures.UShort(4), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("serviceProvider", true, org.ccsds.moims.mo.com.structures.ObjectKey.SHORT_FORM, "If the implementation of the configuration service is not using a COM archive then an UNSUPPORTED_OPERATION error shall be returned.\nThe first argument shall contain the domain and object identifier of the ServiceProvider COM object which the configurations are being removed from."), + new org.ccsds.moims.mo.mal.OperationField("configObjIds", true, org.ccsds.moims.mo.com.structures.ObjectIdList.SHORT_FORM, "The second argument shall contain a list of service and/or provider configurations to remove from the list of configurations available for the specific service provider.\nIf either the service provider or a provided object identifier does not match an existing configuration object then this operation shall fail with an UNKNOWN error.\nIf any of the supplied configuration objects are not provider or service configuration objects then an INVALID error shall be returned.\nIf an error is raised then no configurations shall be removed as a result of this operation call.\nMatched configuration objects shall not be removed from the COM archive only the list of configuration objects in the provider.")}, + "The remove operation, removes a provider configuration from the list of configurations available for that provider in the configuration service. The operation does not remove the configuration objects from the COM archive, merely removes the objects from the configuration service provider.\nIf the implementation of the configuration service is not using a COM archive then an error is returned.\nThis operation can be used to remove COM, non-COM, and hard-coded configurations from a provider."); + + /** + * Operation number literal for operation STORECURRENT. + */ + public static final int _STORECURRENT_OP_NUMBER = 7; + + /** + * Operation number instance for operation STORECURRENT. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort STORECURRENT_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_STORECURRENT_OP_NUMBER); + + /** + * Operation instance for operation STORECURRENT. + */ + public static final org.ccsds.moims.mo.mal.MALInvokeOperation STORECURRENT_OP = new org.ccsds.moims.mo.mal.MALInvokeOperation(SERVICE_KEY, + STORECURRENT_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("storeCurrent"), + new org.ccsds.moims.mo.mal.structures.UShort(5), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("serviceProvider", true, org.ccsds.moims.mo.com.structures.ObjectKey.SHORT_FORM, "If the implementation of the configuration service is not using a COM archive then an UNSUPPORTED_OPERATION error shall be returned.\nThe serviceProvider field shall contain the domain and object instance identifier of the ServiceProvider COM object that must store its current configuration.\nIf the service provider is not known an UNKNOWN error shall be returned."), + new org.ccsds.moims.mo.mal.OperationField("serviceKey", true, org.ccsds.moims.mo.common.structures.ServiceKey.SHORT_FORM, "If the serviceKey field is not NULL then only the specified service of the provider shall be stored.\nWildcard values of '0' are not accepted in the serviceKey fields, an INVALID error shall be returned in this case.\nIf the serviceKey field is not NULL and the referenced service is not supported by the service provider an UNKNOWN error shall be returned.\nThe operation shall publish a ConfigurationStore event containing the selected configuration to be stored.\nThe service provider that implements the selected service shall, after the reception of the event, store its current Configuration in the COM Archive.\nOnce the relevant service provider has finished storing its configuration it shall publish a ConfigurationStored event with the stored configuration's ObjectId as its body.\nIf the request is for a hard-coded configuration then the relevant service provider must fail the store request by returning a NULL as a response."), + new org.ccsds.moims.mo.mal.OperationField("autoAdd", true, org.ccsds.moims.mo.mal.structures.Attribute.BOOLEAN_SHORT_FORM, "If the autoAdd field is set to TRUE then, once the stored event has been published, and if it indicates success, the configuration service provider shall add the new configuration to the list of available configurations for the selected service provider. In effect call the add operation.")}, + new org.ccsds.moims.mo.mal.OperationField[] {}, + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("objInstId", true, org.ccsds.moims.mo.com.structures.ObjectId.SHORT_FORM, "The response shall contain the object identifier of the new configuration object if successful or NULL if not.")}, + "The storeCurrent operation requests the creation of a new Configuration object containing the current Configuration of a specific Service or Provider configuration and stores the new Configuration object in the COM archive. Optionally the configuration can be added to the list of available configurations.\nThe actual service provider is responsible for the creation of the new Configuration objects in the COM archive as it is the provider that contains the configuration being stored.\nThis operation's expected use is for storing a configuration that has been modified \"on line\" in the service provider. For instance, a need to modify the thresholds of the parameter checks on ground can arise during operations. Before being \"officialised\", the new thresholds are usually implemented locally and tested. If the modifications are deemed correct then the configuration may be stored in the archive and becomes a new official configuration of the relevant service. This configuration can then be used by other providers of the same service via the add and activate operations.\nIf the implementation of the configuration service is not using a COM archive then an error is returned.\nThis operation can be used to request the store of both COM and non-COM configurations. It does not make sense to support hard-coded configurations as by definition they are fixed in nature."); + + /** + * Operation number literal for operation IMPORTXML. + */ + public static final int _IMPORTXML_OP_NUMBER = 8; + + /** + * Operation number instance for operation IMPORTXML. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort IMPORTXML_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_IMPORTXML_OP_NUMBER); + + /** + * Operation instance for operation IMPORTXML. + */ + public static final org.ccsds.moims.mo.mal.MALRequestOperation IMPORTXML_OP = new org.ccsds.moims.mo.mal.MALRequestOperation(SERVICE_KEY, + IMPORTXML_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("importXML"), + new org.ccsds.moims.mo.mal.structures.UShort(6), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("xmlFile", true, org.ccsds.moims.mo.mal.structures.File.SHORT_FORM, "If the implementation of the configuration service is not using a COM archive then an UNSUPPORTED_OPERATION error shall be returned.\nThe supplied file contained in the xmlFile argument shall be read and converted to COM objects.\nIf there is a problem converting the XML then an INVALID error shall be returned.\nFor every object present within the XML file that does not exist in the COM Archive, the Configuration service shall create a new object with the same content and store the object in the COM Archive.\nIf the object already exists in the COM Archive, nothing shall be created.\nIf the object already exists in the COM Archive but contains a different content a DUPLICATE error shall be raised.\nThe newly generated Configuration object shall always reference existing objects in the Archive.\nThe newly generated Configuration object should be checked for consistency. An INVALID error shall be raised if the configuration is not valid.\nIf an error is raised then no objects shall be stored in the COM archive and operation shall end.")}, + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("objInstId", true, org.ccsds.moims.mo.com.structures.ObjectId.SHORT_FORM, "The return response shall contain in the objInstId field the object identifier of the new configuration object.")}, + "The importXML generates a new Configuration object from a XML File and stores the Configuration in the COM archive. Afterwards, the configuration can be added to the list of available configurations using the add operation.\nThe operation is only for importing XML configurations that use the standardised format defined by the Configuration service.\nIf the implementation of the configuration service is not using a COM archive then an error is returned.\nThe importXML can only be used to import COM based configurations."); + + /** + * Area elements. + */ + public static final org.ccsds.moims.mo.mal.structures.Element[] CONFIGURATION_SERVICE_ELEMENTS = {}; + + /** + * The set of operations for this service. + */ + public static final org.ccsds.moims.mo.mal.MALOperation[] OPERATIONS = new org.ccsds.moims.mo.mal.MALOperation[]{ACTIVATE_OP, + LIST_OP, + GETCURRENT_OP, + EXPORTXML_OP, + ADD_OP, + REMOVE_OP, + STORECURRENT_OP, + IMPORTXML_OP}; + + /** + * Literal for object SERVICECONFIGURATION. + */ + @Deprecated + public static final int _SERVICECONFIGURATION_OBJECT_NUMBER = 1; + + /** + * Instance for object SERVICECONFIGURATION. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.UShort SERVICECONFIGURATION_OBJECT_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_SERVICECONFIGURATION_OBJECT_NUMBER); + + /** + * Object name constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.Identifier SERVICECONFIGURATION_OBJECT_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("ServiceConfiguration"); + + /** + * Object type constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.com.structures.ObjectType SERVICECONFIGURATION_OBJECT_TYPE = new org.ccsds.moims.mo.com.structures.ObjectType(new org.ccsds.moims.mo.mal.structures.UShort(3), CONFIGURATION_SERVICE_NUMBER, new org.ccsds.moims.mo.mal.structures.UOctet(1), SERVICECONFIGURATION_OBJECT_NUMBER); + + /** + * Object instance. + */ + @Deprecated + public static org.ccsds.moims.mo.com.COMObject SERVICECONFIGURATION_OBJECT = new org.ccsds.moims.mo.com.COMObject(SERVICECONFIGURATION_OBJECT_TYPE, SERVICECONFIGURATION_OBJECT_NAME, org.ccsds.moims.mo.common.configuration.structures.ServiceConfigurationIdentifier.SHORT_FORM, true, org.ccsds.moims.mo.common.configuration.ConfigurationServiceInfo.CONFIGURATIONOBJECTS_OBJECT_TYPE, true, null, false); + + /** + * Literal for object PROVIDERCONFIGURATION. + */ + @Deprecated + public static final int _PROVIDERCONFIGURATION_OBJECT_NUMBER = 2; + + /** + * Instance for object PROVIDERCONFIGURATION. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.UShort PROVIDERCONFIGURATION_OBJECT_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_PROVIDERCONFIGURATION_OBJECT_NUMBER); + + /** + * Object name constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.Identifier PROVIDERCONFIGURATION_OBJECT_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("ProviderConfiguration"); + + /** + * Object type constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.com.structures.ObjectType PROVIDERCONFIGURATION_OBJECT_TYPE = new org.ccsds.moims.mo.com.structures.ObjectType(new org.ccsds.moims.mo.mal.structures.UShort(3), CONFIGURATION_SERVICE_NUMBER, new org.ccsds.moims.mo.mal.structures.UOctet(1), PROVIDERCONFIGURATION_OBJECT_NUMBER); + + /** + * Object instance. + */ + @Deprecated + public static org.ccsds.moims.mo.com.COMObject PROVIDERCONFIGURATION_OBJECT = new org.ccsds.moims.mo.com.COMObject(PROVIDERCONFIGURATION_OBJECT_TYPE, PROVIDERCONFIGURATION_OBJECT_NAME, org.ccsds.moims.mo.mal.structures.Attribute.IDENTIFIER_SHORT_FORM, true, org.ccsds.moims.mo.common.configuration.ConfigurationServiceInfo.CONFIGURATIONOBJECTS_OBJECT_TYPE, true, null, false); + + /** + * Literal for object CONFIGURATIONOBJECTS. + */ + @Deprecated + public static final int _CONFIGURATIONOBJECTS_OBJECT_NUMBER = 3; + + /** + * Instance for object CONFIGURATIONOBJECTS. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.UShort CONFIGURATIONOBJECTS_OBJECT_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_CONFIGURATIONOBJECTS_OBJECT_NUMBER); + + /** + * Object name constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.Identifier CONFIGURATIONOBJECTS_OBJECT_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("ConfigurationObjects"); + + /** + * Object type constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.com.structures.ObjectType CONFIGURATIONOBJECTS_OBJECT_TYPE = new org.ccsds.moims.mo.com.structures.ObjectType(new org.ccsds.moims.mo.mal.structures.UShort(3), CONFIGURATION_SERVICE_NUMBER, new org.ccsds.moims.mo.mal.structures.UOctet(1), CONFIGURATIONOBJECTS_OBJECT_NUMBER); + + /** + * Object instance. + */ + @Deprecated + public static org.ccsds.moims.mo.com.COMObject CONFIGURATIONOBJECTS_OBJECT = new org.ccsds.moims.mo.com.COMObject(CONFIGURATIONOBJECTS_OBJECT_TYPE, CONFIGURATIONOBJECTS_OBJECT_NAME, org.ccsds.moims.mo.common.configuration.structures.ConfigurationObjectDetails.SHORT_FORM, false, null, true, null, false); + + /** + * Literal for object CONFIGURATIONFILE. + */ + @Deprecated + public static final int _CONFIGURATIONFILE_OBJECT_NUMBER = 4; + + /** + * Instance for object CONFIGURATIONFILE. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.UShort CONFIGURATIONFILE_OBJECT_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_CONFIGURATIONFILE_OBJECT_NUMBER); + + /** + * Object name constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.Identifier CONFIGURATIONFILE_OBJECT_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("ConfigurationFile"); + + /** + * Object type constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.com.structures.ObjectType CONFIGURATIONFILE_OBJECT_TYPE = new org.ccsds.moims.mo.com.structures.ObjectType(new org.ccsds.moims.mo.mal.structures.UShort(3), CONFIGURATION_SERVICE_NUMBER, new org.ccsds.moims.mo.mal.structures.UOctet(1), CONFIGURATIONFILE_OBJECT_NUMBER); + + /** + * Object instance. + */ + @Deprecated + public static org.ccsds.moims.mo.com.COMObject CONFIGURATIONFILE_OBJECT = new org.ccsds.moims.mo.com.COMObject(CONFIGURATIONFILE_OBJECT_TYPE, CONFIGURATIONFILE_OBJECT_NAME, org.ccsds.moims.mo.mal.structures.File.SHORT_FORM, false, null, true, null, false); + + /** + * Literal for object PROVIDERCONFIGURATIONLINK. + */ + @Deprecated + public static final int _PROVIDERCONFIGURATIONLINK_OBJECT_NUMBER = 5; + + /** + * Instance for object PROVIDERCONFIGURATIONLINK. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.UShort PROVIDERCONFIGURATIONLINK_OBJECT_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_PROVIDERCONFIGURATIONLINK_OBJECT_NUMBER); + + /** + * Object name constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.Identifier PROVIDERCONFIGURATIONLINK_OBJECT_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("ProviderConfigurationLink"); + + /** + * Object type constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.com.structures.ObjectType PROVIDERCONFIGURATIONLINK_OBJECT_TYPE = new org.ccsds.moims.mo.com.structures.ObjectType(new org.ccsds.moims.mo.mal.structures.UShort(3), CONFIGURATION_SERVICE_NUMBER, new org.ccsds.moims.mo.mal.structures.UOctet(1), PROVIDERCONFIGURATIONLINK_OBJECT_NUMBER); + + /** + * Object instance. + */ + @Deprecated + public static org.ccsds.moims.mo.com.COMObject PROVIDERCONFIGURATIONLINK_OBJECT = new org.ccsds.moims.mo.com.COMObject(PROVIDERCONFIGURATIONLINK_OBJECT_TYPE, PROVIDERCONFIGURATIONLINK_OBJECT_NAME, null, true, org.ccsds.moims.mo.common.directory.DirectoryServiceInfo.SERVICEPROVIDER_OBJECT_TYPE, true, org.ccsds.moims.mo.common.configuration.ConfigurationServiceInfo.PROVIDERCONFIGURATION_OBJECT_TYPE, false); + + /** + * Literal for object CONFIGURATIONSWITCH. + */ + @Deprecated + public static final int _CONFIGURATIONSWITCH_OBJECT_NUMBER = 6; + + /** + * Instance for object CONFIGURATIONSWITCH. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.UShort CONFIGURATIONSWITCH_OBJECT_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_CONFIGURATIONSWITCH_OBJECT_NUMBER); + + /** + * Object name constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.Identifier CONFIGURATIONSWITCH_OBJECT_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("ConfigurationSwitch"); + + /** + * Object type constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.com.structures.ObjectType CONFIGURATIONSWITCH_OBJECT_TYPE = new org.ccsds.moims.mo.com.structures.ObjectType(new org.ccsds.moims.mo.mal.structures.UShort(3), CONFIGURATION_SERVICE_NUMBER, new org.ccsds.moims.mo.mal.structures.UOctet(1), CONFIGURATIONSWITCH_OBJECT_NUMBER); + + /** + * Object instance. + */ + @Deprecated + public static org.ccsds.moims.mo.com.COMObject CONFIGURATIONSWITCH_OBJECT = new org.ccsds.moims.mo.com.COMObject(CONFIGURATIONSWITCH_OBJECT_TYPE, CONFIGURATIONSWITCH_OBJECT_NAME, org.ccsds.moims.mo.com.structures.ObjectId.SHORT_FORM, true, org.ccsds.moims.mo.common.directory.DirectoryServiceInfo.SERVICEPROVIDER_OBJECT_TYPE, true, null, true); + + /** + * Literal for object CONFIGURATIONSWITCHED. + */ + @Deprecated + public static final int _CONFIGURATIONSWITCHED_OBJECT_NUMBER = 7; + + /** + * Instance for object CONFIGURATIONSWITCHED. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.UShort CONFIGURATIONSWITCHED_OBJECT_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_CONFIGURATIONSWITCHED_OBJECT_NUMBER); + + /** + * Object name constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.Identifier CONFIGURATIONSWITCHED_OBJECT_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("ConfigurationSwitched"); + + /** + * Object type constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.com.structures.ObjectType CONFIGURATIONSWITCHED_OBJECT_TYPE = new org.ccsds.moims.mo.com.structures.ObjectType(new org.ccsds.moims.mo.mal.structures.UShort(3), CONFIGURATION_SERVICE_NUMBER, new org.ccsds.moims.mo.mal.structures.UOctet(1), CONFIGURATIONSWITCHED_OBJECT_NUMBER); + + /** + * Object instance. + */ + @Deprecated + public static org.ccsds.moims.mo.com.COMObject CONFIGURATIONSWITCHED_OBJECT = new org.ccsds.moims.mo.com.COMObject(CONFIGURATIONSWITCHED_OBJECT_TYPE, CONFIGURATIONSWITCHED_OBJECT_NAME, org.ccsds.moims.mo.mal.structures.Attribute.BOOLEAN_SHORT_FORM, true, org.ccsds.moims.mo.common.configuration.ConfigurationServiceInfo.CONFIGURATIONSWITCH_OBJECT_TYPE, true, null, true); + + /** + * Literal for object CONFIGURATIONSTORE. + */ + @Deprecated + public static final int _CONFIGURATIONSTORE_OBJECT_NUMBER = 8; + + /** + * Instance for object CONFIGURATIONSTORE. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.UShort CONFIGURATIONSTORE_OBJECT_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_CONFIGURATIONSTORE_OBJECT_NUMBER); + + /** + * Object name constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.Identifier CONFIGURATIONSTORE_OBJECT_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("ConfigurationStore"); + + /** + * Object type constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.com.structures.ObjectType CONFIGURATIONSTORE_OBJECT_TYPE = new org.ccsds.moims.mo.com.structures.ObjectType(new org.ccsds.moims.mo.mal.structures.UShort(3), CONFIGURATION_SERVICE_NUMBER, new org.ccsds.moims.mo.mal.structures.UOctet(1), CONFIGURATIONSTORE_OBJECT_NUMBER); + + /** + * Object instance. + */ + @Deprecated + public static org.ccsds.moims.mo.com.COMObject CONFIGURATIONSTORE_OBJECT = new org.ccsds.moims.mo.com.COMObject(CONFIGURATIONSTORE_OBJECT_TYPE, CONFIGURATIONSTORE_OBJECT_NAME, org.ccsds.moims.mo.common.structures.ServiceKey.SHORT_FORM, true, org.ccsds.moims.mo.common.directory.DirectoryServiceInfo.SERVICEPROVIDER_OBJECT_TYPE, true, null, true); + + /** + * Literal for object CONFIGURATIONSTORED. + */ + @Deprecated + public static final int _CONFIGURATIONSTORED_OBJECT_NUMBER = 9; + + /** + * Instance for object CONFIGURATIONSTORED. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.UShort CONFIGURATIONSTORED_OBJECT_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_CONFIGURATIONSTORED_OBJECT_NUMBER); + + /** + * Object name constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.Identifier CONFIGURATIONSTORED_OBJECT_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("ConfigurationStored"); + + /** + * Object type constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.com.structures.ObjectType CONFIGURATIONSTORED_OBJECT_TYPE = new org.ccsds.moims.mo.com.structures.ObjectType(new org.ccsds.moims.mo.mal.structures.UShort(3), CONFIGURATION_SERVICE_NUMBER, new org.ccsds.moims.mo.mal.structures.UOctet(1), CONFIGURATIONSTORED_OBJECT_NUMBER); + + /** + * Object instance. + */ + @Deprecated + public static org.ccsds.moims.mo.com.COMObject CONFIGURATIONSTORED_OBJECT = new org.ccsds.moims.mo.com.COMObject(CONFIGURATIONSTORED_OBJECT_TYPE, CONFIGURATIONSTORED_OBJECT_NAME, org.ccsds.moims.mo.com.structures.ObjectId.SHORT_FORM, true, org.ccsds.moims.mo.common.configuration.ConfigurationServiceInfo.CONFIGURATIONSTORE_OBJECT_TYPE, false, null, true); + + /** + * Object instance. + */ + public static final org.ccsds.moims.mo.com.COMObject[] COM_OBJECTS = { + SERVICECONFIGURATION_OBJECT, + PROVIDERCONFIGURATION_OBJECT, + CONFIGURATIONOBJECTS_OBJECT, + CONFIGURATIONFILE_OBJECT, + PROVIDERCONFIGURATIONLINK_OBJECT, + CONFIGURATIONSWITCH_OBJECT, + CONFIGURATIONSWITCHED_OBJECT, + CONFIGURATIONSTORE_OBJECT, + CONFIGURATIONSTORED_OBJECT,}; + + /** + * Creates an instance of the Configuration ServiceInfo. + * + */ + public ConfigurationServiceInfo() { + super(SERVICE_KEY, CONFIGURATION_SERVICE_NAME, CONFIGURATION_SERVICE_ELEMENTS, OPERATIONS, COM_OBJECTS); + } + + @Override + public org.ccsds.moims.mo.mal.MALArea getArea() { + return org.ccsds.moims.mo.common.CommonHelper.COMMON_AREA; + } + + @Override + public org.ccsds.moims.mo.mal.MOErrorException generateMOError(int errorNumber, + Object extraInfo) { + switch (errorNumber) { + } + return null; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/configuration/consumer/ConfigurationAdapter.java b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/configuration/consumer/ConfigurationAdapter.java new file mode 100644 index 00000000..f54704a3 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/configuration/consumer/ConfigurationAdapter.java @@ -0,0 +1,418 @@ +package org.ccsds.moims.mo.common.configuration.consumer; + +/** + * Consumer adapter for Configuration service. + */ +public abstract class ConfigurationAdapter extends org.ccsds.moims.mo.mal.consumer.MALInteractionAdapter { + + /** + * Called by the MAL when an INVOKE acknowledgement is received from a provider + * for the operation activate. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void activateAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when an INVOKE response is received from a provider for + * the operation activate. + * + * @param msgHeader msgHeader The header of the received message + * @param activationResult The service provider that implements the selected service shall, after the reception of the ConfigurationSwitch event, reconfigure itself and publish a ConfigurationSwitched COM event. +If the operation fails the previous configuration shall remain active. +In the case of a provider configuration, where multiple service configurations are being switched, the provider must switch all configurations successfully or roll back to the previous configuration. No partial reconfiguration is supported. +If a provider level configuration is successful, and a COM archive is being used, then the service provider that implements the selected service shall store in the COM archive a new ProviderConfigurationLink COM object that links its ServiceProvider object to the new activated ProviderConfiguration COM object. +The response message shall be sent when the configuration is either made active or fails. +If the activation was successful then the activationResult field shall be set to TRUE, otherwise FALSE for failure. + * @param previousConfig The previousConfig field shall point to the previously active configuration or NULL if no configuration was previously active or the activationResult was FALSE for failure. +If a service configuration was requested, configObjId field shall referenced a ServiceConfiguration, the response shall contain a list of a single item of the previous ServiceConfiguration COM object. +If a provider configuration was requested, configObjId field shall referenced a ProviderConfiguration, the response shall contain a list of the previous ProviderConfiguration COM object followed by the list of previous ServiceConfiguration objects active for that provider. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void activateResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + Boolean activationResult, + org.ccsds.moims.mo.com.structures.ObjectIdList previousConfig, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when an INVOKE acknowledgement error is received from + * a provider for the operation activate. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void activateAckErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when an INVOKE response error is received from a provider + * for the operation activate. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void activateResponseErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response is received from a provider for + * the operation list. + * + * @param msgHeader msgHeader The header of the received message + * @param objInstIds The operation shall return the list of matched configuration objects known to the configuration service provider. +If no configurations matched then an empty list shall be returned. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void listResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.com.structures.ObjectIdList objInstIds, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response error is received from a provider + * for the operation list. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void listErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response is received from a provider for + * the operation getCurrent. + * + * @param msgHeader msgHeader The header of the received message + * @param objInstId If a service configuration was requested, serviceKey was not NULL, the response shall contain a list of a single item of the matched ServiceConfiguration COM object. +If a provider configuration was requested, serviceKey was NULL, the response shall contain a list of the matched ProviderConfiguration COM object followed by the list of active ServiceConfiguration objects active for that provider. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void getCurrentResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.com.structures.ObjectIdList objInstId, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response error is received from a provider + * for the operation getCurrent. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void getCurrentErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response is received from a provider for + * the operation exportXML. + * + * @param msgHeader msgHeader The header of the received message + * @param xmlConfiguration The returned File object shall contain the configuration XML. +The Configuration object shall not be deleted from the COM Archive. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void exportXMLResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.structures.File xmlConfiguration, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response error is received from a provider + * for the operation exportXML. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void exportXMLErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a SUBMIT acknowledgement is received from a provider + * for the operation add. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void addAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a SUBMIT acknowledgement error is received from + * a provider for the operation add. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void addErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a SUBMIT acknowledgement is received from a provider + * for the operation remove. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void removeAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a SUBMIT acknowledgement error is received from + * a provider for the operation remove. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void removeErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when an INVOKE acknowledgement is received from a provider + * for the operation storeCurrent. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void storeCurrentAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when an INVOKE response is received from a provider for + * the operation storeCurrent. + * + * @param msgHeader msgHeader The header of the received message + * @param objInstId The response shall contain the object identifier of the new configuration object if successful or NULL if not. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void storeCurrentResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.com.structures.ObjectId objInstId, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when an INVOKE acknowledgement error is received from + * a provider for the operation storeCurrent. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void storeCurrentAckErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when an INVOKE response error is received from a provider + * for the operation storeCurrent. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void storeCurrentResponseErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response is received from a provider for + * the operation importXML. + * + * @param msgHeader msgHeader The header of the received message + * @param objInstId The return response shall contain in the objInstId field the object identifier of the new configuration object. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void importXMLResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.com.structures.ObjectId objInstId, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response error is received from a provider + * for the operation importXML. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void importXMLErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + @Override + public final void submitAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.common.configuration.ConfigurationServiceInfo._ADD_OP_NUMBER: + addAckReceived(msgHeader, qosProperties); + break; + case org.ccsds.moims.mo.common.configuration.ConfigurationServiceInfo._REMOVE_OP_NUMBER: + removeAckReceived(msgHeader, qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void submitErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALErrorBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.common.configuration.ConfigurationServiceInfo._ADD_OP_NUMBER: + addErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.common.configuration.ConfigurationServiceInfo._REMOVE_OP_NUMBER: + removeErrorReceived(msgHeader, body.getError(), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void requestResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALMessageBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.common.configuration.ConfigurationServiceInfo._LIST_OP_NUMBER: + listResponseReceived(msgHeader, + (org.ccsds.moims.mo.com.structures.ObjectIdList) body.getBodyElement(0, new org.ccsds.moims.mo.com.structures.ObjectIdList()), qosProperties); + break; + case org.ccsds.moims.mo.common.configuration.ConfigurationServiceInfo._GETCURRENT_OP_NUMBER: + getCurrentResponseReceived(msgHeader, + (org.ccsds.moims.mo.com.structures.ObjectIdList) body.getBodyElement(0, new org.ccsds.moims.mo.com.structures.ObjectIdList()), qosProperties); + break; + case org.ccsds.moims.mo.common.configuration.ConfigurationServiceInfo._EXPORTXML_OP_NUMBER: + exportXMLResponseReceived(msgHeader, + (org.ccsds.moims.mo.mal.structures.File) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.File()), qosProperties); + break; + case org.ccsds.moims.mo.common.configuration.ConfigurationServiceInfo._IMPORTXML_OP_NUMBER: + importXMLResponseReceived(msgHeader, + (org.ccsds.moims.mo.com.structures.ObjectId) body.getBodyElement(0, new org.ccsds.moims.mo.com.structures.ObjectId()), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void requestErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALErrorBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.common.configuration.ConfigurationServiceInfo._LIST_OP_NUMBER: + listErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.common.configuration.ConfigurationServiceInfo._GETCURRENT_OP_NUMBER: + getCurrentErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.common.configuration.ConfigurationServiceInfo._EXPORTXML_OP_NUMBER: + exportXMLErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.common.configuration.ConfigurationServiceInfo._IMPORTXML_OP_NUMBER: + importXMLErrorReceived(msgHeader, body.getError(), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void invokeAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALMessageBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.common.configuration.ConfigurationServiceInfo._ACTIVATE_OP_NUMBER: + activateAckReceived(msgHeader, qosProperties); + break; + case org.ccsds.moims.mo.common.configuration.ConfigurationServiceInfo._STORECURRENT_OP_NUMBER: + storeCurrentAckReceived(msgHeader, qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void invokeAckErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALErrorBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.common.configuration.ConfigurationServiceInfo._ACTIVATE_OP_NUMBER: + activateAckErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.common.configuration.ConfigurationServiceInfo._STORECURRENT_OP_NUMBER: + storeCurrentAckErrorReceived(msgHeader, body.getError(), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void invokeResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALMessageBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.common.configuration.ConfigurationServiceInfo._ACTIVATE_OP_NUMBER: + activateResponseReceived(msgHeader, + (body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.Union(Boolean.FALSE)) == null) ? null : ((org.ccsds.moims.mo.mal.structures.Union) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.Union(Boolean.FALSE))).getBooleanValue(), + (org.ccsds.moims.mo.com.structures.ObjectIdList) body.getBodyElement(1, new org.ccsds.moims.mo.com.structures.ObjectIdList()), qosProperties); + break; + case org.ccsds.moims.mo.common.configuration.ConfigurationServiceInfo._STORECURRENT_OP_NUMBER: + storeCurrentResponseReceived(msgHeader, + (org.ccsds.moims.mo.com.structures.ObjectId) body.getBodyElement(0, new org.ccsds.moims.mo.com.structures.ObjectId()), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void invokeResponseErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALErrorBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.common.configuration.ConfigurationServiceInfo._ACTIVATE_OP_NUMBER: + activateResponseErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.common.configuration.ConfigurationServiceInfo._STORECURRENT_OP_NUMBER: + storeCurrentResponseErrorReceived(msgHeader, body.getError(), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/configuration/consumer/ConfigurationStub.java b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/configuration/consumer/ConfigurationStub.java new file mode 100644 index 00000000..257dc3cc --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/configuration/consumer/ConfigurationStub.java @@ -0,0 +1,585 @@ +package org.ccsds.moims.mo.common.configuration.consumer; + +/** + * Consumer stub for Configuration service. + */ +public class ConfigurationStub { + + /** + * The consumer field. + */ + private final org.ccsds.moims.mo.mal.consumer.MALConsumer consumer; + + /** + * Wraps a MALconsumer connection with service specific methods that map from + * the high level service API to the generic MAL API. + * + * @param consumer consumer The MALConsumer to use in this stub. + */ + public ConfigurationStub(org.ccsds.moims.mo.mal.consumer.MALConsumer consumer) { + this.consumer = consumer; + } + + /** + * Returns the internal MAL consumer object used for sending of messages from + * this interface. + * + * @return The MAL consumer object. + */ + public org.ccsds.moims.mo.mal.consumer.MALConsumer getConsumer() { + return consumer; + } + + /** + * The activate operation instructs a service provider to make a specific + * configuration active. The operation returns once the new configuration + * is active or when the activation attempt has failed for some reason. + * The requested configuration must have either already been added to the + * configuration service provider using the add operation or alternatively + * known to the configuration service by another implementation specific mechanism. + * NOTE - The service is reconfigured for all service consumers not just the + * calling consumer. + * + * @param serviceProvider The serviceProvider field shall contain the domain and object instance identifier of the ServiceProvider COM object being (re)configured. +If the service provider referenced by the serviceProvider field is not known an UNKNOWN error shall be returned. + * @param configObjId The configObjId field shall hold the COM object identifier that identifies the configuration to activate. +The configObjId field shall reference either a ProviderConfiguration or ServiceConfiguration object. +An UNKNOWN error shall be returned if the object instance identifier held in the configObjId field does not match an existing configuration. +An INVALID error shall be returned if the object instance identifier held in the configObjId field does not reference either a ProviderConfiguration or ServiceConfiguration object. +If the object instance identifier held in the configObjId field does not reference a valid configuration for the service provider an INVALID error shall be returned. A valid configuration is one that is returned from the list operation for the matched service provider. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void activate(org.ccsds.moims.mo.com.structures.ObjectKey serviceProvider, + org.ccsds.moims.mo.com.structures.ObjectId configObjId, + org.ccsds.moims.mo.common.configuration.consumer.ConfigurationAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.invoke(org.ccsds.moims.mo.common.configuration.ConfigurationServiceInfo.ACTIVATE_OP, adapter, serviceProvider, configObjId); + } + + /** + * Asynchronous version of method activate. + * + * @param serviceProvider The serviceProvider field shall contain the domain and object instance identifier of the ServiceProvider COM object being (re)configured. +If the service provider referenced by the serviceProvider field is not known an UNKNOWN error shall be returned. + * @param configObjId The configObjId field shall hold the COM object identifier that identifies the configuration to activate. +The configObjId field shall reference either a ProviderConfiguration or ServiceConfiguration object. +An UNKNOWN error shall be returned if the object instance identifier held in the configObjId field does not match an existing configuration. +An INVALID error shall be returned if the object instance identifier held in the configObjId field does not reference either a ProviderConfiguration or ServiceConfiguration object. +If the object instance identifier held in the configObjId field does not reference a valid configuration for the service provider an INVALID error shall be returned. A valid configuration is one that is returned from the list operation for the matched service provider. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncActivate(org.ccsds.moims.mo.com.structures.ObjectKey serviceProvider, + org.ccsds.moims.mo.com.structures.ObjectId configObjId, + org.ccsds.moims.mo.common.configuration.consumer.ConfigurationAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncInvoke(org.ccsds.moims.mo.common.configuration.ConfigurationServiceInfo.ACTIVATE_OP, adapter, serviceProvider, configObjId); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueActivate(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.common.configuration.consumer.ConfigurationAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.common.configuration.ConfigurationServiceInfo.ACTIVATE_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The list operation returns list of configurations known to the configuration + * service provider for a certain configuration type in a specific domain. + * To appear in the response from the list operation a configuration must + * have either been added to the configuration service provider using the + * add operation or alternatively known to the configuration service by another + * implementation specific mechanism. + * + * @param configurationType The configurationType argument shall hold the type of configuration to be listed. + * @param domain The domain request argument shall contain the domain of the configuration objects to return. +The domain field supports the wildcard value of '*' only in the last part of the domain, otherwise an INVALID error shall be returned. See section 3.5.6.5.g in R[2]. + * @param serviceKey If the request configuration type is SERVICE, then an optional filter may be supplied in the serviceKey field where the ServiceKey composite holds the service area, service, and version values to match on. +The filter shall be applied with a logical AND for each field of the service key. +Wildcard values of '0' are not accepted in the serviceKey fields, an INVALID error shall be returned in this case. +For other types of configuration the serviceKey field shall be ignored and may be set to NULL in the request. + * @return The return value of the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.com.structures.ObjectIdList list(org.ccsds.moims.mo.common.configuration.structures.ConfigurationType configurationType, + org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.common.structures.ServiceKey serviceKey) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + org.ccsds.moims.mo.mal.transport.MALMessageBody body = consumer.request(org.ccsds.moims.mo.common.configuration.ConfigurationServiceInfo.LIST_OP, configurationType, domain, serviceKey); + Object body0 = (Object) body.getBodyElement(0, new org.ccsds.moims.mo.com.structures.ObjectIdList()); + return (org.ccsds.moims.mo.com.structures.ObjectIdList) body0; + } + + /** + * Asynchronous version of method list. + * + * @param configurationType The configurationType argument shall hold the type of configuration to be listed. + * @param domain The domain request argument shall contain the domain of the configuration objects to return. +The domain field supports the wildcard value of '*' only in the last part of the domain, otherwise an INVALID error shall be returned. See section 3.5.6.5.g in R[2]. + * @param serviceKey If the request configuration type is SERVICE, then an optional filter may be supplied in the serviceKey field where the ServiceKey composite holds the service area, service, and version values to match on. +The filter shall be applied with a logical AND for each field of the service key. +Wildcard values of '0' are not accepted in the serviceKey fields, an INVALID error shall be returned in this case. +For other types of configuration the serviceKey field shall be ignored and may be set to NULL in the request. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncList(org.ccsds.moims.mo.common.configuration.structures.ConfigurationType configurationType, + org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.common.structures.ServiceKey serviceKey, + org.ccsds.moims.mo.common.configuration.consumer.ConfigurationAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncRequest(org.ccsds.moims.mo.common.configuration.ConfigurationServiceInfo.LIST_OP, adapter, configurationType, domain, serviceKey); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueList(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.common.configuration.consumer.ConfigurationAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.common.configuration.ConfigurationServiceInfo.LIST_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The getCurrent operation returns the currently selected configuration of + * a service provider, either of the complete provider (ProviderConfiguration) + * or a specific service (ServiceConfiguration) of that provider, as far as + * the Configuration Service provider is concerned. + * This means that if the provider of a specific service has modified their + * configuration by some other means, and this has not been stored using the + * storeCurrent operation, then this operation will return the unmodified + * configuration. + * If a provider level configuration is required by this operation, and service + * configurations different to the ones in the provider configuration have + * been activated by the activate operation, then this operation will return + * the ProviderConfiguration followed by the list of modified ServiceConfigurations. + * The current configuration of a service provider is most likely the configuration + * that was last activated using the activate operation, however implementations + * of the configuration service may have other means (outside the scope of + * this service) of selecting the current configuration of a service provider. + * The operation can also be used to determine the initial configuration of + * a service provider before it has been activated, it is therefore a useful + * operation to call by a service provider during start-up to determine its + * initial configuration. If this is the case a ConfigurationSwitched event + * should be published. + * + * @param serviceProvider The serviceProvider field shall contain the domain and object instance identifier of the ServiceProvider COM object being queried. + * @param serviceKey If the serviceKey field is not NULL, then the operation shall return the configuration of the selected service, as specified in the field. +For retrieval of the provider level configuration the serviceKey field shall be set to NULL in the request. +An UNKNOWN error shall be returned if the combination of service provider and service filter fields don't match an existing service provider, service key or configuration. +No wildcards are supported, an INVALID error must be returned in this case. + * @return The return value of the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.com.structures.ObjectIdList getCurrent(org.ccsds.moims.mo.com.structures.ObjectKey serviceProvider, + org.ccsds.moims.mo.common.structures.ServiceKey serviceKey) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + org.ccsds.moims.mo.mal.transport.MALMessageBody body = consumer.request(org.ccsds.moims.mo.common.configuration.ConfigurationServiceInfo.GETCURRENT_OP, serviceProvider, serviceKey); + Object body0 = (Object) body.getBodyElement(0, new org.ccsds.moims.mo.com.structures.ObjectIdList()); + return (org.ccsds.moims.mo.com.structures.ObjectIdList) body0; + } + + /** + * Asynchronous version of method getCurrent. + * + * @param serviceProvider The serviceProvider field shall contain the domain and object instance identifier of the ServiceProvider COM object being queried. + * @param serviceKey If the serviceKey field is not NULL, then the operation shall return the configuration of the selected service, as specified in the field. +For retrieval of the provider level configuration the serviceKey field shall be set to NULL in the request. +An UNKNOWN error shall be returned if the combination of service provider and service filter fields don't match an existing service provider, service key or configuration. +No wildcards are supported, an INVALID error must be returned in this case. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncGetCurrent(org.ccsds.moims.mo.com.structures.ObjectKey serviceProvider, + org.ccsds.moims.mo.common.structures.ServiceKey serviceKey, + org.ccsds.moims.mo.common.configuration.consumer.ConfigurationAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncRequest(org.ccsds.moims.mo.common.configuration.ConfigurationServiceInfo.GETCURRENT_OP, adapter, serviceProvider, serviceKey); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueGetCurrent(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.common.configuration.consumer.ConfigurationAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.common.configuration.ConfigurationServiceInfo.GETCURRENT_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The exportXML operation returns the actual Configuration information in + * the XML format from the configuration object stored in the Archive. + * The returned XML is in the standardised format and one of two levels of + * detail, compact or complete, can be selected. Compact contains just the + * COM object instance identifiers with the respective domains and object + * types whereas complete augments the compact with the additional set of + * values inside the respective service objects. + * The XML standardised format is the XML representation of the referenced + * COM objects as defined by the XML encoding given in R[4]. Example XML documents + * can be found in an annex at the end of this specification. + * If the implementation of the configuration service is not using a COM archive + * then an error is returned. + * It should be noted that this operation only supports COM configurations. + * + * @param confObjId If the implementation of the configuration service is not using a COM archive then an UNSUPPORTED_OPERATION error shall be returned. +The confObjId argument shall contain the type, domain and COM object instance identifier of the configuration object to return the XML representation of. +An UNKNOWN error shall be returned if the confObjId field does not match an existing COM object. +An INVALID error shall be returned if the confObjId does not refer to either a ProviderConfiguration or a ServiceConfiguration object. +An INVALID error shall be returned if the confObjId refers to either a hard-coded or a non-COM configuration. + * @param returnComplete The returnComplete Boolean shall be set to True if the returned XML is to be in the complete standardised format, otherwise it will be in the compact standardised format. + * @return The return value of the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.structures.File exportXML(org.ccsds.moims.mo.com.structures.ObjectId confObjId, + Boolean returnComplete) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + org.ccsds.moims.mo.mal.transport.MALMessageBody body = consumer.request(org.ccsds.moims.mo.common.configuration.ConfigurationServiceInfo.EXPORTXML_OP, confObjId, (returnComplete == null) ? null : new org.ccsds.moims.mo.mal.structures.Union(returnComplete)); + Object body0 = (Object) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.File()); + return (org.ccsds.moims.mo.mal.structures.File) body0; + } + + /** + * Asynchronous version of method exportXML. + * + * @param confObjId If the implementation of the configuration service is not using a COM archive then an UNSUPPORTED_OPERATION error shall be returned. +The confObjId argument shall contain the type, domain and COM object instance identifier of the configuration object to return the XML representation of. +An UNKNOWN error shall be returned if the confObjId field does not match an existing COM object. +An INVALID error shall be returned if the confObjId does not refer to either a ProviderConfiguration or a ServiceConfiguration object. +An INVALID error shall be returned if the confObjId refers to either a hard-coded or a non-COM configuration. + * @param returnComplete The returnComplete Boolean shall be set to True if the returned XML is to be in the complete standardised format, otherwise it will be in the compact standardised format. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncExportXML(org.ccsds.moims.mo.com.structures.ObjectId confObjId, + Boolean returnComplete, + org.ccsds.moims.mo.common.configuration.consumer.ConfigurationAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncRequest(org.ccsds.moims.mo.common.configuration.ConfigurationServiceInfo.EXPORTXML_OP, adapter, confObjId, (returnComplete == null) ? null : new org.ccsds.moims.mo.mal.structures.Union(returnComplete)); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueExportXML(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.common.configuration.consumer.ConfigurationAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.common.configuration.ConfigurationServiceInfo.EXPORTXML_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The add operation makes a new Configuration available on the Configuration + * Service. The Configuration must already exist in the COM archive to be + * added to the Configuration Service. + * If the implementation of the configuration service is not using a COM archive + * then an error is returned. + * This operation can be used to add COM, non-COM and hard-coded configurations. + * + * @param serviceProvider If the implementation of the configuration service is not using a COM archive then an UNSUPPORTED_OPERATION error shall be returned. +The first argument shall contain the domain and object identifier of the ServiceProvider COM object which the configurations are being added to. + * @param configObjIds The second argument shall contain a list of service and/or provider configurations to add to the list of configurations available for the specific service provider. +If either the service provider or the configuration objects are unknown then an UNKNOWN error shall be returned. +If any of the supplied configuration objects are not provider or service configuration objects then an INVALID error shall be returned. +If an error is raised then no new configurations shall be added as a result of this operation call. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void add(org.ccsds.moims.mo.com.structures.ObjectKey serviceProvider, + org.ccsds.moims.mo.com.structures.ObjectIdList configObjIds) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.submit(org.ccsds.moims.mo.common.configuration.ConfigurationServiceInfo.ADD_OP, serviceProvider, configObjIds); + } + + /** + * Asynchronous version of method add. + * + * @param serviceProvider If the implementation of the configuration service is not using a COM archive then an UNSUPPORTED_OPERATION error shall be returned. +The first argument shall contain the domain and object identifier of the ServiceProvider COM object which the configurations are being added to. + * @param configObjIds The second argument shall contain a list of service and/or provider configurations to add to the list of configurations available for the specific service provider. +If either the service provider or the configuration objects are unknown then an UNKNOWN error shall be returned. +If any of the supplied configuration objects are not provider or service configuration objects then an INVALID error shall be returned. +If an error is raised then no new configurations shall be added as a result of this operation call. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncAdd(org.ccsds.moims.mo.com.structures.ObjectKey serviceProvider, + org.ccsds.moims.mo.com.structures.ObjectIdList configObjIds, + org.ccsds.moims.mo.common.configuration.consumer.ConfigurationAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncSubmit(org.ccsds.moims.mo.common.configuration.ConfigurationServiceInfo.ADD_OP, adapter, serviceProvider, configObjIds); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueAdd(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.common.configuration.consumer.ConfigurationAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.common.configuration.ConfigurationServiceInfo.ADD_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The remove operation, removes a provider configuration from the list of + * configurations available for that provider in the configuration service. + * The operation does not remove the configuration objects from the COM archive, + * merely removes the objects from the configuration service provider. + * If the implementation of the configuration service is not using a COM archive + * then an error is returned. + * This operation can be used to remove COM, non-COM, and hard-coded configurations + * from a provider. + * + * @param serviceProvider If the implementation of the configuration service is not using a COM archive then an UNSUPPORTED_OPERATION error shall be returned. +The first argument shall contain the domain and object identifier of the ServiceProvider COM object which the configurations are being removed from. + * @param configObjIds The second argument shall contain a list of service and/or provider configurations to remove from the list of configurations available for the specific service provider. +If either the service provider or a provided object identifier does not match an existing configuration object then this operation shall fail with an UNKNOWN error. +If any of the supplied configuration objects are not provider or service configuration objects then an INVALID error shall be returned. +If an error is raised then no configurations shall be removed as a result of this operation call. +Matched configuration objects shall not be removed from the COM archive only the list of configuration objects in the provider. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void remove(org.ccsds.moims.mo.com.structures.ObjectKey serviceProvider, + org.ccsds.moims.mo.com.structures.ObjectIdList configObjIds) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.submit(org.ccsds.moims.mo.common.configuration.ConfigurationServiceInfo.REMOVE_OP, serviceProvider, configObjIds); + } + + /** + * Asynchronous version of method remove. + * + * @param serviceProvider If the implementation of the configuration service is not using a COM archive then an UNSUPPORTED_OPERATION error shall be returned. +The first argument shall contain the domain and object identifier of the ServiceProvider COM object which the configurations are being removed from. + * @param configObjIds The second argument shall contain a list of service and/or provider configurations to remove from the list of configurations available for the specific service provider. +If either the service provider or a provided object identifier does not match an existing configuration object then this operation shall fail with an UNKNOWN error. +If any of the supplied configuration objects are not provider or service configuration objects then an INVALID error shall be returned. +If an error is raised then no configurations shall be removed as a result of this operation call. +Matched configuration objects shall not be removed from the COM archive only the list of configuration objects in the provider. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncRemove(org.ccsds.moims.mo.com.structures.ObjectKey serviceProvider, + org.ccsds.moims.mo.com.structures.ObjectIdList configObjIds, + org.ccsds.moims.mo.common.configuration.consumer.ConfigurationAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncSubmit(org.ccsds.moims.mo.common.configuration.ConfigurationServiceInfo.REMOVE_OP, adapter, serviceProvider, configObjIds); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueRemove(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.common.configuration.consumer.ConfigurationAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.common.configuration.ConfigurationServiceInfo.REMOVE_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The storeCurrent operation requests the creation of a new Configuration + * object containing the current Configuration of a specific Service or Provider + * configuration and stores the new Configuration object in the COM archive. + * Optionally the configuration can be added to the list of available configurations. + * The actual service provider is responsible for the creation of the new + * Configuration objects in the COM archive as it is the provider that contains + * the configuration being stored. + * This operation"s expected use is for storing a configuration that + * has been modified "on line" in the service provider. For instance, a need + * to modify the thresholds of the parameter checks on ground can arise during + * operations. Before being "officialised", the new thresholds are usually + * implemented locally and tested. If the modifications are deemed correct + * then the configuration may be stored in the archive and becomes a new official + * configuration of the relevant service. This configuration can then be used + * by other providers of the same service via the add and activate operations. + * If the implementation of the configuration service is not using a COM archive + * then an error is returned. + * This operation can be used to request the store of both COM and non-COM + * configurations. It does not make sense to support hard-coded configurations + * as by definition they are fixed in nature. + * + * @param serviceProvider If the implementation of the configuration service is not using a COM archive then an UNSUPPORTED_OPERATION error shall be returned. +The serviceProvider field shall contain the domain and object instance identifier of the ServiceProvider COM object that must store its current configuration. +If the service provider is not known an UNKNOWN error shall be returned. + * @param serviceKey If the serviceKey field is not NULL then only the specified service of the provider shall be stored. +Wildcard values of '0' are not accepted in the serviceKey fields, an INVALID error shall be returned in this case. +If the serviceKey field is not NULL and the referenced service is not supported by the service provider an UNKNOWN error shall be returned. +The operation shall publish a ConfigurationStore event containing the selected configuration to be stored. +The service provider that implements the selected service shall, after the reception of the event, store its current Configuration in the COM Archive. +Once the relevant service provider has finished storing its configuration it shall publish a ConfigurationStored event with the stored configuration's ObjectId as its body. +If the request is for a hard-coded configuration then the relevant service provider must fail the store request by returning a NULL as a response. + * @param autoAdd If the autoAdd field is set to TRUE then, once the stored event has been published, and if it indicates success, the configuration service provider shall add the new configuration to the list of available configurations for the selected service provider. In effect call the add operation. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void storeCurrent(org.ccsds.moims.mo.com.structures.ObjectKey serviceProvider, + org.ccsds.moims.mo.common.structures.ServiceKey serviceKey, + Boolean autoAdd, + org.ccsds.moims.mo.common.configuration.consumer.ConfigurationAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.invoke(org.ccsds.moims.mo.common.configuration.ConfigurationServiceInfo.STORECURRENT_OP, adapter, serviceProvider, serviceKey, (autoAdd == null) ? null : new org.ccsds.moims.mo.mal.structures.Union(autoAdd)); + } + + /** + * Asynchronous version of method storeCurrent. + * + * @param serviceProvider If the implementation of the configuration service is not using a COM archive then an UNSUPPORTED_OPERATION error shall be returned. +The serviceProvider field shall contain the domain and object instance identifier of the ServiceProvider COM object that must store its current configuration. +If the service provider is not known an UNKNOWN error shall be returned. + * @param serviceKey If the serviceKey field is not NULL then only the specified service of the provider shall be stored. +Wildcard values of '0' are not accepted in the serviceKey fields, an INVALID error shall be returned in this case. +If the serviceKey field is not NULL and the referenced service is not supported by the service provider an UNKNOWN error shall be returned. +The operation shall publish a ConfigurationStore event containing the selected configuration to be stored. +The service provider that implements the selected service shall, after the reception of the event, store its current Configuration in the COM Archive. +Once the relevant service provider has finished storing its configuration it shall publish a ConfigurationStored event with the stored configuration's ObjectId as its body. +If the request is for a hard-coded configuration then the relevant service provider must fail the store request by returning a NULL as a response. + * @param autoAdd If the autoAdd field is set to TRUE then, once the stored event has been published, and if it indicates success, the configuration service provider shall add the new configuration to the list of available configurations for the selected service provider. In effect call the add operation. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncStoreCurrent(org.ccsds.moims.mo.com.structures.ObjectKey serviceProvider, + org.ccsds.moims.mo.common.structures.ServiceKey serviceKey, + Boolean autoAdd, + org.ccsds.moims.mo.common.configuration.consumer.ConfigurationAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncInvoke(org.ccsds.moims.mo.common.configuration.ConfigurationServiceInfo.STORECURRENT_OP, adapter, serviceProvider, serviceKey, (autoAdd == null) ? null : new org.ccsds.moims.mo.mal.structures.Union(autoAdd)); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueStoreCurrent(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.common.configuration.consumer.ConfigurationAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.common.configuration.ConfigurationServiceInfo.STORECURRENT_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The importXML generates a new Configuration object from a XML File and + * stores the Configuration in the COM archive. Afterwards, the configuration + * can be added to the list of available configurations using the add operation. + * The operation is only for importing XML configurations that use the standardised + * format defined by the Configuration service. + * If the implementation of the configuration service is not using a COM archive + * then an error is returned. + * The importXML can only be used to import COM based configurations. + * + * @param xmlFile If the implementation of the configuration service is not using a COM archive then an UNSUPPORTED_OPERATION error shall be returned. +The supplied file contained in the xmlFile argument shall be read and converted to COM objects. +If there is a problem converting the XML then an INVALID error shall be returned. +For every object present within the XML file that does not exist in the COM Archive, the Configuration service shall create a new object with the same content and store the object in the COM Archive. +If the object already exists in the COM Archive, nothing shall be created. +If the object already exists in the COM Archive but contains a different content a DUPLICATE error shall be raised. +The newly generated Configuration object shall always reference existing objects in the Archive. +The newly generated Configuration object should be checked for consistency. An INVALID error shall be raised if the configuration is not valid. +If an error is raised then no objects shall be stored in the COM archive and operation shall end. + * @return The return value of the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.com.structures.ObjectId importXML(org.ccsds.moims.mo.mal.structures.File xmlFile) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + org.ccsds.moims.mo.mal.transport.MALMessageBody body = consumer.request(org.ccsds.moims.mo.common.configuration.ConfigurationServiceInfo.IMPORTXML_OP, xmlFile); + Object body0 = (Object) body.getBodyElement(0, new org.ccsds.moims.mo.com.structures.ObjectId()); + return (org.ccsds.moims.mo.com.structures.ObjectId) body0; + } + + /** + * Asynchronous version of method importXML. + * + * @param xmlFile If the implementation of the configuration service is not using a COM archive then an UNSUPPORTED_OPERATION error shall be returned. +The supplied file contained in the xmlFile argument shall be read and converted to COM objects. +If there is a problem converting the XML then an INVALID error shall be returned. +For every object present within the XML file that does not exist in the COM Archive, the Configuration service shall create a new object with the same content and store the object in the COM Archive. +If the object already exists in the COM Archive, nothing shall be created. +If the object already exists in the COM Archive but contains a different content a DUPLICATE error shall be raised. +The newly generated Configuration object shall always reference existing objects in the Archive. +The newly generated Configuration object should be checked for consistency. An INVALID error shall be raised if the configuration is not valid. +If an error is raised then no objects shall be stored in the COM archive and operation shall end. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncImportXML(org.ccsds.moims.mo.mal.structures.File xmlFile, + org.ccsds.moims.mo.common.configuration.consumer.ConfigurationAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncRequest(org.ccsds.moims.mo.common.configuration.ConfigurationServiceInfo.IMPORTXML_OP, adapter, xmlFile); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueImportXML(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.common.configuration.consumer.ConfigurationAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.common.configuration.ConfigurationServiceInfo.IMPORTXML_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/configuration/consumer/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/configuration/consumer/package-info.java new file mode 100644 index 00000000..d49a3bde --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/configuration/consumer/package-info.java @@ -0,0 +1,4 @@ +/** + * Package containing the consumer stubs for the Configuration service. +*/ +package org.ccsds.moims.mo.common.configuration.consumer; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/configuration/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/configuration/package-info.java new file mode 100644 index 00000000..ff05de99 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/configuration/package-info.java @@ -0,0 +1,19 @@ +/** + * The Configuration service allows a service consumer to activate pre-defined + * configurations of a service provider. + * The service uses a COM object to represent the different configurations + * allowed by a service provider; a service consumer selects one configuration + * to activate using the Configuration service activate operation. + * The contents of a configuration for a service provider is deployment specific + * however the management of these configurations, and the selection of a + * configuration for current use, is the purpose of this service. + * Implementations of this service may also use bespoke methods for configuration + * representation (such as hard-coded configuration) which is outside the + * scope of this specification, however, the status and management of these + * configurations can still be managed with this service. + * NOTE: This service uses the COM Event service to distribute changes in + * state, therefore participating service providers should ensure they are + * all using the same shared COM Event service if they wish to receive Configuration + * service events. +*/ +package org.ccsds.moims.mo.common.configuration; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/configuration/provider/ActivateInteraction.java b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/configuration/provider/ActivateInteraction.java new file mode 100644 index 00000000..89522cd9 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/configuration/provider/ActivateInteraction.java @@ -0,0 +1,77 @@ +package org.ccsds.moims.mo.common.configuration.provider; + +/** + * Provider INVOKE interaction class for Configuration::activate operation. + */ +public class ActivateInteraction { + + /** + * The interaction field. + */ + private org.ccsds.moims.mo.mal.provider.MALInvoke interaction; + + /** + * Wraps the provided MAL interaction object with methods for sending responses + * to an INVOKE interaction from a provider. + * + * @param interaction The MAL interaction action object to use. + */ + public ActivateInteraction(org.ccsds.moims.mo.mal.provider.MALInvoke interaction) { + this.interaction = interaction; + } + + /** + * Returns the MAL interaction object used for returning messages from the + * provider. + * + * @return The MAL interaction object provided in the constructor + */ + public org.ccsds.moims.mo.mal.provider.MALInvoke getInteraction() { + return interaction; + } + + /** + * Sends a INVOKE acknowledge to the consumer. + * + * @return Returns the MAL message created by the acknowledge + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage sendAcknowledgement() throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return interaction.sendAcknowledgement((Object[]) null); + } + + /** + * Sends a INVOKE response to the consumer. + * + * @param activationResult The service provider that implements the selected service shall, after the reception of the ConfigurationSwitch event, reconfigure itself and publish a ConfigurationSwitched COM event. +If the operation fails the previous configuration shall remain active. +In the case of a provider configuration, where multiple service configurations are being switched, the provider must switch all configurations successfully or roll back to the previous configuration. No partial reconfiguration is supported. +If a provider level configuration is successful, and a COM archive is being used, then the service provider that implements the selected service shall store in the COM archive a new ProviderConfigurationLink COM object that links its ServiceProvider object to the new activated ProviderConfiguration COM object. +The response message shall be sent when the configuration is either made active or fails. +If the activation was successful then the activationResult field shall be set to TRUE, otherwise FALSE for failure. + * @param previousConfig The previousConfig field shall point to the previously active configuration or NULL if no configuration was previously active or the activationResult was FALSE for failure. +If a service configuration was requested, configObjId field shall referenced a ServiceConfiguration, the response shall contain a list of a single item of the previous ServiceConfiguration COM object. +If a provider configuration was requested, configObjId field shall referenced a ProviderConfiguration, the response shall contain a list of the previous ProviderConfiguration COM object followed by the list of previous ServiceConfiguration objects active for that provider. + * @return Returns the MAL message created by the response + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage sendResponse(Boolean activationResult, + org.ccsds.moims.mo.com.structures.ObjectIdList previousConfig) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return interaction.sendResponse((activationResult == null) ? null : new org.ccsds.moims.mo.mal.structures.Union(activationResult), previousConfig); + } + + /** + * Sends an error to the consumer. + * + * @param error The MAL error to send to the consumer. + * @return Returns the MAL message created by the error + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage sendError(org.ccsds.moims.mo.mal.MOErrorException error) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return interaction.sendError(error); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/configuration/provider/ConfigurationHandler.java b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/configuration/provider/ConfigurationHandler.java new file mode 100644 index 00000000..d1f7f00e --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/configuration/provider/ConfigurationHandler.java @@ -0,0 +1,178 @@ +package org.ccsds.moims.mo.common.configuration.provider; + +/** + * Interface that providers of the Configuration service must implement to + * handle the operations of that service. + */ +public interface ConfigurationHandler { + + /** + * Implements the operation activate. + * + * @param serviceProvider The serviceProvider field shall contain the domain and object instance identifier of the ServiceProvider COM object being (re)configured. +If the service provider referenced by the serviceProvider field is not known an UNKNOWN error shall be returned. + * @param configObjId The configObjId field shall hold the COM object identifier that identifies the configuration to activate. +The configObjId field shall reference either a ProviderConfiguration or ServiceConfiguration object. +An UNKNOWN error shall be returned if the object instance identifier held in the configObjId field does not match an existing configuration. +An INVALID error shall be returned if the object instance identifier held in the configObjId field does not reference either a ProviderConfiguration or ServiceConfiguration object. +If the object instance identifier held in the configObjId field does not reference a valid configuration for the service provider an INVALID error shall be returned. A valid configuration is one that is returned from the list operation for the matched service provider. + * @param interaction The MAL object representing the interaction in the provider. + * @throws org.ccsds.moims.mo.mal.UnknownException Requested configuration is unknown. + * @throws org.ccsds.moims.mo.com.InvalidException Requested configuration is invalid. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + void activate(org.ccsds.moims.mo.com.structures.ObjectKey serviceProvider, + org.ccsds.moims.mo.com.structures.ObjectId configObjId, + org.ccsds.moims.mo.common.configuration.provider.ActivateInteraction interaction) throws org.ccsds.moims.mo.mal.UnknownException, org.ccsds.moims.mo.com.InvalidException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation list. + * + * @param configurationType The configurationType argument shall hold the type of configuration to be listed. + * @param domain The domain request argument shall contain the domain of the configuration objects to return. +The domain field supports the wildcard value of '*' only in the last part of the domain, otherwise an INVALID error shall be returned. See section 3.5.6.5.g in R[2]. + * @param serviceKey If the request configuration type is SERVICE, then an optional filter may be supplied in the serviceKey field where the ServiceKey composite holds the service area, service, and version values to match on. +The filter shall be applied with a logical AND for each field of the service key. +Wildcard values of '0' are not accepted in the serviceKey fields, an INVALID error shall be returned in this case. +For other types of configuration the serviceKey field shall be ignored and may be set to NULL in the request. + * @param interaction The MAL object representing the interaction in the provider. + * @return The return value of the operation + * @throws org.ccsds.moims.mo.com.InvalidException Requested configuration is not a valid configuration object type or wildcard values were specified in the service key filter. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + org.ccsds.moims.mo.com.structures.ObjectIdList list(org.ccsds.moims.mo.common.configuration.structures.ConfigurationType configurationType, + org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.common.structures.ServiceKey serviceKey, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.com.InvalidException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation getCurrent. + * + * @param serviceProvider The serviceProvider field shall contain the domain and object instance identifier of the ServiceProvider COM object being queried. + * @param serviceKey If the serviceKey field is not NULL, then the operation shall return the configuration of the selected service, as specified in the field. +For retrieval of the provider level configuration the serviceKey field shall be set to NULL in the request. +An UNKNOWN error shall be returned if the combination of service provider and service filter fields don't match an existing service provider, service key or configuration. +No wildcards are supported, an INVALID error must be returned in this case. + * @param interaction The MAL object representing the interaction in the provider. + * @return The return value of the operation + * @throws org.ccsds.moims.mo.com.InvalidException The request contained one or more wildcards. + * @throws org.ccsds.moims.mo.mal.UnknownException Requested service provider and service key combination is unknown. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + org.ccsds.moims.mo.com.structures.ObjectIdList getCurrent(org.ccsds.moims.mo.com.structures.ObjectKey serviceProvider, + org.ccsds.moims.mo.common.structures.ServiceKey serviceKey, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.com.InvalidException, org.ccsds.moims.mo.mal.UnknownException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation exportXML. + * + * @param confObjId If the implementation of the configuration service is not using a COM archive then an UNSUPPORTED_OPERATION error shall be returned. +The confObjId argument shall contain the type, domain and COM object instance identifier of the configuration object to return the XML representation of. +An UNKNOWN error shall be returned if the confObjId field does not match an existing COM object. +An INVALID error shall be returned if the confObjId does not refer to either a ProviderConfiguration or a ServiceConfiguration object. +An INVALID error shall be returned if the confObjId refers to either a hard-coded or a non-COM configuration. + * @param returnComplete The returnComplete Boolean shall be set to True if the returned XML is to be in the complete standardised format, otherwise it will be in the compact standardised format. + * @param interaction The MAL object representing the interaction in the provider. + * @return The return value of the operation + * @throws org.ccsds.moims.mo.com.InvalidException Requested configuration is not a valid configuration object type. + * @throws org.ccsds.moims.mo.mal.UnknownException Requested object is unknown. + * @throws org.ccsds.moims.mo.mal.UnsupportedOperationException The operation requires the use of a COM archive + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + org.ccsds.moims.mo.mal.structures.File exportXML(org.ccsds.moims.mo.com.structures.ObjectId confObjId, + Boolean returnComplete, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.com.InvalidException, org.ccsds.moims.mo.mal.UnknownException, org.ccsds.moims.mo.mal.UnsupportedOperationException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation add. + * + * @param serviceProvider If the implementation of the configuration service is not using a COM archive then an UNSUPPORTED_OPERATION error shall be returned. +The first argument shall contain the domain and object identifier of the ServiceProvider COM object which the configurations are being added to. + * @param configObjIds The second argument shall contain a list of service and/or provider configurations to add to the list of configurations available for the specific service provider. +If either the service provider or the configuration objects are unknown then an UNKNOWN error shall be returned. +If any of the supplied configuration objects are not provider or service configuration objects then an INVALID error shall be returned. +If an error is raised then no new configurations shall be added as a result of this operation call. + * @param interaction The MAL object representing the interaction in the provider. + * @throws org.ccsds.moims.mo.com.InvalidException One of the supplied configuration object instance identifiers is either not a Service or a Provider configuration object. + * @throws org.ccsds.moims.mo.mal.UnsupportedOperationException The operation requires the use of a COM archive + * @throws org.ccsds.moims.mo.mal.UnknownException One of the supplied service or configuration object instance identifiers is unknown. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + void add(org.ccsds.moims.mo.com.structures.ObjectKey serviceProvider, + org.ccsds.moims.mo.com.structures.ObjectIdList configObjIds, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.com.InvalidException, org.ccsds.moims.mo.mal.UnsupportedOperationException, org.ccsds.moims.mo.mal.UnknownException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation remove. + * + * @param serviceProvider If the implementation of the configuration service is not using a COM archive then an UNSUPPORTED_OPERATION error shall be returned. +The first argument shall contain the domain and object identifier of the ServiceProvider COM object which the configurations are being removed from. + * @param configObjIds The second argument shall contain a list of service and/or provider configurations to remove from the list of configurations available for the specific service provider. +If either the service provider or a provided object identifier does not match an existing configuration object then this operation shall fail with an UNKNOWN error. +If any of the supplied configuration objects are not provider or service configuration objects then an INVALID error shall be returned. +If an error is raised then no configurations shall be removed as a result of this operation call. +Matched configuration objects shall not be removed from the COM archive only the list of configuration objects in the provider. + * @param interaction The MAL object representing the interaction in the provider. + * @throws org.ccsds.moims.mo.mal.UnknownException Either the service provider or one of the supplied configuration object instance identifiers is unknown. + * @throws org.ccsds.moims.mo.com.InvalidException One of the supplied configuration object instance identifiers is either not a Service or a Provider configuration object. + * @throws org.ccsds.moims.mo.mal.UnsupportedOperationException The operation requires the use of a COM archive + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + void remove(org.ccsds.moims.mo.com.structures.ObjectKey serviceProvider, + org.ccsds.moims.mo.com.structures.ObjectIdList configObjIds, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mal.UnknownException, org.ccsds.moims.mo.com.InvalidException, org.ccsds.moims.mo.mal.UnsupportedOperationException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation storeCurrent. + * + * @param serviceProvider If the implementation of the configuration service is not using a COM archive then an UNSUPPORTED_OPERATION error shall be returned. +The serviceProvider field shall contain the domain and object instance identifier of the ServiceProvider COM object that must store its current configuration. +If the service provider is not known an UNKNOWN error shall be returned. + * @param serviceKey If the serviceKey field is not NULL then only the specified service of the provider shall be stored. +Wildcard values of '0' are not accepted in the serviceKey fields, an INVALID error shall be returned in this case. +If the serviceKey field is not NULL and the referenced service is not supported by the service provider an UNKNOWN error shall be returned. +The operation shall publish a ConfigurationStore event containing the selected configuration to be stored. +The service provider that implements the selected service shall, after the reception of the event, store its current Configuration in the COM Archive. +Once the relevant service provider has finished storing its configuration it shall publish a ConfigurationStored event with the stored configuration's ObjectId as its body. +If the request is for a hard-coded configuration then the relevant service provider must fail the store request by returning a NULL as a response. + * @param autoAdd If the autoAdd field is set to TRUE then, once the stored event has been published, and if it indicates success, the configuration service provider shall add the new configuration to the list of available configurations for the selected service provider. In effect call the add operation. + * @param interaction The MAL object representing the interaction in the provider. + * @throws org.ccsds.moims.mo.com.InvalidException Not a valid Service or Provider object + * @throws org.ccsds.moims.mo.mal.UnsupportedOperationException The operation requires the use of a COM archive + * @throws org.ccsds.moims.mo.mal.UnknownException The service provider referenced is not known or the referenced service is not known by the provider. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + void storeCurrent(org.ccsds.moims.mo.com.structures.ObjectKey serviceProvider, + org.ccsds.moims.mo.common.structures.ServiceKey serviceKey, + Boolean autoAdd, + org.ccsds.moims.mo.common.configuration.provider.StoreCurrentInteraction interaction) throws org.ccsds.moims.mo.com.InvalidException, org.ccsds.moims.mo.mal.UnsupportedOperationException, org.ccsds.moims.mo.mal.UnknownException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation importXML. + * + * @param xmlFile If the implementation of the configuration service is not using a COM archive then an UNSUPPORTED_OPERATION error shall be returned. +The supplied file contained in the xmlFile argument shall be read and converted to COM objects. +If there is a problem converting the XML then an INVALID error shall be returned. +For every object present within the XML file that does not exist in the COM Archive, the Configuration service shall create a new object with the same content and store the object in the COM Archive. +If the object already exists in the COM Archive, nothing shall be created. +If the object already exists in the COM Archive but contains a different content a DUPLICATE error shall be raised. +The newly generated Configuration object shall always reference existing objects in the Archive. +The newly generated Configuration object should be checked for consistency. An INVALID error shall be raised if the configuration is not valid. +If an error is raised then no objects shall be stored in the COM archive and operation shall end. + * @param interaction The MAL object representing the interaction in the provider. + * @return The return value of the operation + * @throws org.ccsds.moims.mo.mal.UnsupportedOperationException The operation requires the use of a COM archive + * @throws org.ccsds.moims.mo.com.DuplicateException The supplied XML contains a duplicate object definition that is different to the one held in the COM Archive. + * @throws org.ccsds.moims.mo.com.InvalidException The supplied XML was not valid. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + org.ccsds.moims.mo.com.structures.ObjectId importXML(org.ccsds.moims.mo.mal.structures.File xmlFile, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mal.UnsupportedOperationException, org.ccsds.moims.mo.com.DuplicateException, org.ccsds.moims.mo.com.InvalidException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Sets the skeleton to be used for creation of publishers. + * + * @param skeleton The skeleton to be used. + */ + void setSkeleton(org.ccsds.moims.mo.common.configuration.provider.ConfigurationSkeleton skeleton); +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/configuration/provider/ConfigurationInheritanceSkeleton.java b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/configuration/provider/ConfigurationInheritanceSkeleton.java new file mode 100644 index 00000000..20849810 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/configuration/provider/ConfigurationInheritanceSkeleton.java @@ -0,0 +1,156 @@ +package org.ccsds.moims.mo.common.configuration.provider; + +/** + * Provider Inheritance skeleton for ConfigurationInheritanceSkeleton service. + */ +public abstract class ConfigurationInheritanceSkeleton implements org.ccsds.moims.mo.mal.provider.MALInteractionHandler, org.ccsds.moims.mo.common.configuration.provider.ConfigurationSkeleton, org.ccsds.moims.mo.common.configuration.provider.ConfigurationHandler { + + /** + * The providerSet field. + */ + private org.ccsds.moims.mo.mal.provider.MALProviderSet providerSet = new org.ccsds.moims.mo.mal.provider.MALProviderSet(org.ccsds.moims.mo.common.configuration.ConfigurationHelper.CONFIGURATION_SERVICE); + + /** + * Returns the connection object for this provider. + * + * @return the connection object for this provider + * @throws java.io.IOException if the method was not implemented yet. + */ + public org.ccsds.moims.mo.mal.helpertools.connections.ConnectionProvider getConnection() throws java.io.IOException { + throw new java.io.IOException("This method needs to be overridden!"); + } + + @Override + public void setSkeleton(org.ccsds.moims.mo.common.configuration.provider.ConfigurationSkeleton skeleton) { + // Not used in the inheritance pattern (the skeleton is 'this'); + } + + @Override + public void malInitialize(org.ccsds.moims.mo.mal.provider.MALProvider provider) throws org.ccsds.moims.mo.mal.MALException { + providerSet.addProvider(provider); + } + + @Override + public void malFinalize(org.ccsds.moims.mo.mal.provider.MALProvider provider) throws org.ccsds.moims.mo.mal.MALException { + providerSet.removeProvider(provider); + } + + @Override + public void handleSend(org.ccsds.moims.mo.mal.provider.MALInteraction interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + switch (opNumber) { + default: + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } + + @Override + public void handleSubmit(org.ccsds.moims.mo.mal.provider.MALSubmit interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + try { + switch (opNumber) { + case org.ccsds.moims.mo.common.configuration.ConfigurationServiceInfo._ADD_OP_NUMBER: + add((org.ccsds.moims.mo.com.structures.ObjectKey) body.getBodyElement(0, new org.ccsds.moims.mo.com.structures.ObjectKey()), + (org.ccsds.moims.mo.com.structures.ObjectIdList) body.getBodyElement(1, new org.ccsds.moims.mo.com.structures.ObjectIdList()), + interaction); + interaction.sendAcknowledgement(); + break; + case org.ccsds.moims.mo.common.configuration.ConfigurationServiceInfo._REMOVE_OP_NUMBER: + remove((org.ccsds.moims.mo.com.structures.ObjectKey) body.getBodyElement(0, new org.ccsds.moims.mo.com.structures.ObjectKey()), + (org.ccsds.moims.mo.com.structures.ObjectIdList) body.getBodyElement(1, new org.ccsds.moims.mo.com.structures.ObjectIdList()), + interaction); + interaction.sendAcknowledgement(); + break; + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } catch (org.ccsds.moims.mo.mal.MOErrorException error) { + throw new org.ccsds.moims.mo.mal.MALInteractionException(error); + } + } + + @Override + public void handleRequest(org.ccsds.moims.mo.mal.provider.MALRequest interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + try { + switch (opNumber) { + case org.ccsds.moims.mo.common.configuration.ConfigurationServiceInfo._LIST_OP_NUMBER: + interaction.sendResponse(list((org.ccsds.moims.mo.common.configuration.structures.ConfigurationType) body.getBodyElement(0, org.ccsds.moims.mo.common.configuration.structures.ConfigurationType.PROVIDER), + (org.ccsds.moims.mo.mal.structures.IdentifierList) body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.IdentifierList()), + (org.ccsds.moims.mo.common.structures.ServiceKey) body.getBodyElement(2, new org.ccsds.moims.mo.common.structures.ServiceKey()), + interaction)); + break; + case org.ccsds.moims.mo.common.configuration.ConfigurationServiceInfo._GETCURRENT_OP_NUMBER: + interaction.sendResponse(getCurrent((org.ccsds.moims.mo.com.structures.ObjectKey) body.getBodyElement(0, new org.ccsds.moims.mo.com.structures.ObjectKey()), + (org.ccsds.moims.mo.common.structures.ServiceKey) body.getBodyElement(1, new org.ccsds.moims.mo.common.structures.ServiceKey()), + interaction)); + break; + case org.ccsds.moims.mo.common.configuration.ConfigurationServiceInfo._EXPORTXML_OP_NUMBER: + interaction.sendResponse(exportXML((org.ccsds.moims.mo.com.structures.ObjectId) body.getBodyElement(0, new org.ccsds.moims.mo.com.structures.ObjectId()), + (body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.Union(Boolean.FALSE)) == null) ? null : ((org.ccsds.moims.mo.mal.structures.Union) body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.Union(Boolean.FALSE))).getBooleanValue(), + interaction)); + break; + case org.ccsds.moims.mo.common.configuration.ConfigurationServiceInfo._IMPORTXML_OP_NUMBER: + interaction.sendResponse(importXML((org.ccsds.moims.mo.mal.structures.File) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.File()), + interaction)); + break; + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } catch (org.ccsds.moims.mo.mal.MOErrorException error) { + throw new org.ccsds.moims.mo.mal.MALInteractionException(error); + } + } + + @Override + public void handleInvoke(org.ccsds.moims.mo.mal.provider.MALInvoke interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + try { + switch (opNumber) { + case org.ccsds.moims.mo.common.configuration.ConfigurationServiceInfo._ACTIVATE_OP_NUMBER: + activate((org.ccsds.moims.mo.com.structures.ObjectKey) body.getBodyElement(0, new org.ccsds.moims.mo.com.structures.ObjectKey()), + (org.ccsds.moims.mo.com.structures.ObjectId) body.getBodyElement(1, new org.ccsds.moims.mo.com.structures.ObjectId()), + new ActivateInteraction(interaction)); + break; + case org.ccsds.moims.mo.common.configuration.ConfigurationServiceInfo._STORECURRENT_OP_NUMBER: + storeCurrent((org.ccsds.moims.mo.com.structures.ObjectKey) body.getBodyElement(0, new org.ccsds.moims.mo.com.structures.ObjectKey()), + (org.ccsds.moims.mo.common.structures.ServiceKey) body.getBodyElement(1, new org.ccsds.moims.mo.common.structures.ServiceKey()), + (body.getBodyElement(2, new org.ccsds.moims.mo.mal.structures.Union(Boolean.FALSE)) == null) ? null : ((org.ccsds.moims.mo.mal.structures.Union) body.getBodyElement(2, new org.ccsds.moims.mo.mal.structures.Union(Boolean.FALSE))).getBooleanValue(), + new StoreCurrentInteraction(interaction)); + break; + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } catch (org.ccsds.moims.mo.mal.MOErrorException error) { + throw new org.ccsds.moims.mo.mal.MALInteractionException(error); + } + } + + @Override + public void handleProgress(org.ccsds.moims.mo.mal.provider.MALProgress interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + switch (opNumber) { + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/configuration/provider/ConfigurationSkeleton.java b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/configuration/provider/ConfigurationSkeleton.java new file mode 100644 index 00000000..aea17693 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/configuration/provider/ConfigurationSkeleton.java @@ -0,0 +1,8 @@ +package org.ccsds.moims.mo.common.configuration.provider; + +/** + * The skeleton interface for the Configuration service. + */ +public interface ConfigurationSkeleton { + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/configuration/provider/StoreCurrentInteraction.java b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/configuration/provider/StoreCurrentInteraction.java new file mode 100644 index 00000000..3286ee7c --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/configuration/provider/StoreCurrentInteraction.java @@ -0,0 +1,68 @@ +package org.ccsds.moims.mo.common.configuration.provider; + +/** + * Provider INVOKE interaction class for Configuration::storeCurrent operation. + */ +public class StoreCurrentInteraction { + + /** + * The interaction field. + */ + private org.ccsds.moims.mo.mal.provider.MALInvoke interaction; + + /** + * Wraps the provided MAL interaction object with methods for sending responses + * to an INVOKE interaction from a provider. + * + * @param interaction The MAL interaction action object to use. + */ + public StoreCurrentInteraction(org.ccsds.moims.mo.mal.provider.MALInvoke interaction) { + this.interaction = interaction; + } + + /** + * Returns the MAL interaction object used for returning messages from the + * provider. + * + * @return The MAL interaction object provided in the constructor + */ + public org.ccsds.moims.mo.mal.provider.MALInvoke getInteraction() { + return interaction; + } + + /** + * Sends a INVOKE acknowledge to the consumer. + * + * @return Returns the MAL message created by the acknowledge + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage sendAcknowledgement() throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return interaction.sendAcknowledgement((Object[]) null); + } + + /** + * Sends a INVOKE response to the consumer. + * + * @param objInstId The response shall contain the object identifier of the new configuration object if successful or NULL if not. + * @return Returns the MAL message created by the response + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage sendResponse(org.ccsds.moims.mo.com.structures.ObjectId objInstId) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return interaction.sendResponse(objInstId); + } + + /** + * Sends an error to the consumer. + * + * @param error The MAL error to send to the consumer. + * @return Returns the MAL message created by the error + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage sendError(org.ccsds.moims.mo.mal.MOErrorException error) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return interaction.sendError(error); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/configuration/provider/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/configuration/provider/package-info.java new file mode 100644 index 00000000..45d88a5a --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/configuration/provider/package-info.java @@ -0,0 +1,4 @@ +/** + * Package containing the provider skeletons for the Configuration service. +*/ +package org.ccsds.moims.mo.common.configuration.provider; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/configuration/structures/ConfigurationObjectDetails.java b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/configuration/structures/ConfigurationObjectDetails.java new file mode 100644 index 00000000..14887e59 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/configuration/structures/ConfigurationObjectDetails.java @@ -0,0 +1,108 @@ +package org.ccsds.moims.mo.common.configuration.structures; + +/** + * The ConfigurationObjectDetails composite holds a zero to many ConfigurationObjectSet + * structures. It allows a configuration to reference COM objects from more + * than one domain or of more than one COM object type. + */ +public final class ConfigurationObjectDetails implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 844446421745666L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 844446421745666L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * The list of configuration objects. + */ + private org.ccsds.moims.mo.common.configuration.structures.ConfigurationObjectSetList configObjects; + + /** + * Default constructor for ConfigurationObjectDetails. + * + */ + public ConfigurationObjectDetails() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param configObjects The list of configuration objects. + */ + public ConfigurationObjectDetails(org.ccsds.moims.mo.common.configuration.structures.ConfigurationObjectSetList configObjects) { + this.configObjects = configObjects; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.common.configuration.structures.ConfigurationObjectDetails(); + } + + /** + * Returns the field configObjects. + * + * @return The field configObjects + */ + public org.ccsds.moims.mo.common.configuration.structures.ConfigurationObjectSetList getConfigObjects() { + return configObjects; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ConfigurationObjectDetails) { + ConfigurationObjectDetails other = (ConfigurationObjectDetails) obj; + if (configObjects == null) { + if (other.configObjects != null) { + return false; + } + } else { + if (! configObjects.equals(other.configObjects)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (configObjects != null ? configObjects.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(ConfigurationObjectDetails: "); + buf.append("configObjects=").append(configObjects); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (configObjects == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'configObjects' cannot be null!"); + } + encoder.encodeElement(configObjects); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + configObjects = (org.ccsds.moims.mo.common.configuration.structures.ConfigurationObjectSetList) decoder.decodeElement(new org.ccsds.moims.mo.common.configuration.structures.ConfigurationObjectSetList()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/configuration/structures/ConfigurationObjectDetailsList.java b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/configuration/structures/ConfigurationObjectDetailsList.java new file mode 100644 index 00000000..fa45e35f --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/configuration/structures/ConfigurationObjectDetailsList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.common.configuration.structures; + +/** + * List class for ConfigurationObjectDetails. + */ +public final class ConfigurationObjectDetailsList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 844446438522878L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 844446438522878L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for ConfigurationObjectDetailsList. + * + */ + public ConfigurationObjectDetailsList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public ConfigurationObjectDetailsList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public ConfigurationObjectDetailsList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.common.configuration.structures.ConfigurationObjectDetails element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.common.configuration.structures.ConfigurationObjectDetails element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new ConfigurationObjectDetailsList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.common.configuration.structures.ConfigurationObjectDetails(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/configuration/structures/ConfigurationObjectSet.java b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/configuration/structures/ConfigurationObjectSet.java new file mode 100644 index 00000000..930a48c2 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/configuration/structures/ConfigurationObjectSet.java @@ -0,0 +1,173 @@ +package org.ccsds.moims.mo.common.configuration.structures; + +/** + * The configuration object set holds a set of object identifiers for a single + * COM object type in a single domain. + */ +public final class ConfigurationObjectSet implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 844446421745665L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 844446421745665L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * The COM object type of the configuration objects. + */ + private org.ccsds.moims.mo.com.structures.ObjectType objType; + + /** + * The domain of the configuration objects. + */ + private org.ccsds.moims.mo.mal.structures.IdentifierList domain; + + /** + * The set of COM object identifiers that form this configuration set. + */ + private org.ccsds.moims.mo.mal.structures.LongList objInstIds; + + /** + * Default constructor for ConfigurationObjectSet. + * + */ + public ConfigurationObjectSet() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param objType The COM object type of the configuration objects. + * @param domain The domain of the configuration objects. + * @param objInstIds The set of COM object identifiers that form this configuration set. + */ + public ConfigurationObjectSet(org.ccsds.moims.mo.com.structures.ObjectType objType, + org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.LongList objInstIds) { + this.objType = objType; + this.domain = domain; + this.objInstIds = objInstIds; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.common.configuration.structures.ConfigurationObjectSet(); + } + + /** + * Returns the field objType. + * + * @return The field objType + */ + public org.ccsds.moims.mo.com.structures.ObjectType getObjType() { + return objType; + } + + /** + * Returns the field domain. + * + * @return The field domain + */ + public org.ccsds.moims.mo.mal.structures.IdentifierList getDomain() { + return domain; + } + + /** + * Returns the field objInstIds. + * + * @return The field objInstIds + */ + public org.ccsds.moims.mo.mal.structures.LongList getObjInstIds() { + return objInstIds; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ConfigurationObjectSet) { + ConfigurationObjectSet other = (ConfigurationObjectSet) obj; + if (objType == null) { + if (other.objType != null) { + return false; + } + } else { + if (! objType.equals(other.objType)) { + return false; + } + } + if (domain == null) { + if (other.domain != null) { + return false; + } + } else { + if (! domain.equals(other.domain)) { + return false; + } + } + if (objInstIds == null) { + if (other.objInstIds != null) { + return false; + } + } else { + if (! objInstIds.equals(other.objInstIds)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (objType != null ? objType.hashCode() : 0); + hash = 83 * hash + (domain != null ? domain.hashCode() : 0); + hash = 83 * hash + (objInstIds != null ? objInstIds.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(ConfigurationObjectSet: "); + buf.append("objType=").append(objType); + buf.append(", domain=").append(domain); + buf.append(", objInstIds=").append(objInstIds); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (objType == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'objType' cannot be null!"); + } + if (domain == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'domain' cannot be null!"); + } + if (objInstIds == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'objInstIds' cannot be null!"); + } + encoder.encodeElement(objType); + encoder.encodeElement(domain); + encoder.encodeElement(objInstIds); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + objType = (org.ccsds.moims.mo.com.structures.ObjectType) decoder.decodeElement(new org.ccsds.moims.mo.com.structures.ObjectType()); + domain = (org.ccsds.moims.mo.mal.structures.IdentifierList) decoder.decodeElement(new org.ccsds.moims.mo.mal.structures.IdentifierList()); + objInstIds = (org.ccsds.moims.mo.mal.structures.LongList) decoder.decodeElement(new org.ccsds.moims.mo.mal.structures.LongList()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/configuration/structures/ConfigurationObjectSetList.java b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/configuration/structures/ConfigurationObjectSetList.java new file mode 100644 index 00000000..0a2d52de --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/configuration/structures/ConfigurationObjectSetList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.common.configuration.structures; + +/** + * List class for ConfigurationObjectSet. + */ +public final class ConfigurationObjectSetList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 844446438522879L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 844446438522879L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for ConfigurationObjectSetList. + * + */ + public ConfigurationObjectSetList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public ConfigurationObjectSetList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public ConfigurationObjectSetList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.common.configuration.structures.ConfigurationObjectSet element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.common.configuration.structures.ConfigurationObjectSet element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new ConfigurationObjectSetList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.common.configuration.structures.ConfigurationObjectSet(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/configuration/structures/ConfigurationType.java b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/configuration/structures/ConfigurationType.java new file mode 100644 index 00000000..2a8f17ae --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/configuration/structures/ConfigurationType.java @@ -0,0 +1,117 @@ +package org.ccsds.moims.mo.common.configuration.structures; + +/** + * Enumeration class for ConfigurationType. + */ +public final class ConfigurationType extends org.ccsds.moims.mo.mal.structures.Enumeration { + + private static final long serialVersionUID = 844446421745668L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 844446421745668L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Enumeration value for PROVIDER. + */ + public static final int PROVIDER_VALUE = 1; + + /** + * Enumeration singleton for value PROVIDER. + */ + public static final org.ccsds.moims.mo.common.configuration.structures.ConfigurationType PROVIDER = new org.ccsds.moims.mo.common.configuration.structures.ConfigurationType(org.ccsds.moims.mo.common.configuration.structures.ConfigurationType.PROVIDER_VALUE); + + /** + * Enumeration value for SERVICE. + */ + public static final int SERVICE_VALUE = 2; + + /** + * Enumeration singleton for value SERVICE. + */ + public static final org.ccsds.moims.mo.common.configuration.structures.ConfigurationType SERVICE = new org.ccsds.moims.mo.common.configuration.structures.ConfigurationType(org.ccsds.moims.mo.common.configuration.structures.ConfigurationType.SERVICE_VALUE); + + /** + * Set of enumeration instances. + */ + private static final org.ccsds.moims.mo.common.configuration.structures.ConfigurationType[] _ENUMERATIONS = { + PROVIDER, SERVICE}; + + /** + * The configuration type enumeration holds the possible types of a configuration. + */ + public ConfigurationType() { + super(-1); + } + + /** + * The configuration type enumeration holds the possible types of a configuration. + * + * @param value The value of the Enumeration. + */ + public ConfigurationType(int value) { + super(value); + } + + @Override + public String toString() { + switch (getValue()) { + case PROVIDER_VALUE: + return "PROVIDER"; + case SERVICE_VALUE: + return "SERVICE"; + default: + throw new RuntimeException("Unknown ordinal!"); + } + } + + /** + * Returns the enumeration element represented by the supplied string, or + * null if not matched. + * + * @param s s The string to search for. + * @return The matched enumeration element, or null if not matched. + */ + public static org.ccsds.moims.mo.common.configuration.structures.ConfigurationType fromString(String s) { + switch (s) { + case "PROVIDER": + return ConfigurationType.PROVIDER; + case "SERVICE": + return ConfigurationType.SERVICE; + default: + throw new RuntimeException("Unknown Enumeration for the provided string: " + s); + } + } + + @Override + public org.ccsds.moims.mo.mal.structures.Enumeration fromValue(Integer value) { + switch (value) { + case PROVIDER_VALUE: + return ConfigurationType.PROVIDER; + case SERVICE_VALUE: + return ConfigurationType.SERVICE; + default: + throw new RuntimeException("Unknown Enumeration for the provided value: " + value); + } + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return _ENUMERATIONS[0]; + } + + @Override + public int getEnumSize() { + return 2; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/configuration/structures/ConfigurationTypeList.java b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/configuration/structures/ConfigurationTypeList.java new file mode 100644 index 00000000..db28ae05 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/configuration/structures/ConfigurationTypeList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.common.configuration.structures; + +/** + * List class for ConfigurationType. + */ +public final class ConfigurationTypeList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 844446438522876L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 844446438522876L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for ConfigurationTypeList. + * + */ + public ConfigurationTypeList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public ConfigurationTypeList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public ConfigurationTypeList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.common.configuration.structures.ConfigurationType element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.common.configuration.structures.ConfigurationType element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new ConfigurationTypeList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return org.ccsds.moims.mo.common.configuration.structures.ConfigurationType.PROVIDER; + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/configuration/structures/ServiceConfigurationIdentifier.java b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/configuration/structures/ServiceConfigurationIdentifier.java new file mode 100644 index 00000000..c7f9a515 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/configuration/structures/ServiceConfigurationIdentifier.java @@ -0,0 +1,140 @@ +package org.ccsds.moims.mo.common.configuration.structures; + +/** + * The ServiceConfigurationIdentifier structure holds the name and service + * key of a service configuration object. + */ +public final class ServiceConfigurationIdentifier implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 844446421745667L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 844446421745667L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * The configName field. + */ + private org.ccsds.moims.mo.mal.structures.Identifier configName; + + /** + * The serviceKey field. + */ + private org.ccsds.moims.mo.common.structures.ServiceKey serviceKey; + + /** + * Default constructor for ServiceConfigurationIdentifier. + * + */ + public ServiceConfigurationIdentifier() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param configName The configName field. + * @param serviceKey The serviceKey field. + */ + public ServiceConfigurationIdentifier(org.ccsds.moims.mo.mal.structures.Identifier configName, + org.ccsds.moims.mo.common.structures.ServiceKey serviceKey) { + this.configName = configName; + this.serviceKey = serviceKey; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.common.configuration.structures.ServiceConfigurationIdentifier(); + } + + /** + * Returns the field configName. + * + * @return The field configName + */ + public org.ccsds.moims.mo.mal.structures.Identifier getConfigName() { + return configName; + } + + /** + * Returns the field serviceKey. + * + * @return The field serviceKey + */ + public org.ccsds.moims.mo.common.structures.ServiceKey getServiceKey() { + return serviceKey; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ServiceConfigurationIdentifier) { + ServiceConfigurationIdentifier other = (ServiceConfigurationIdentifier) obj; + if (configName == null) { + if (other.configName != null) { + return false; + } + } else { + if (! configName.equals(other.configName)) { + return false; + } + } + if (serviceKey == null) { + if (other.serviceKey != null) { + return false; + } + } else { + if (! serviceKey.equals(other.serviceKey)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (configName != null ? configName.hashCode() : 0); + hash = 83 * hash + (serviceKey != null ? serviceKey.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(ServiceConfigurationIdentifier: "); + buf.append("configName=").append(configName); + buf.append(", serviceKey=").append(serviceKey); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (configName == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'configName' cannot be null!"); + } + if (serviceKey == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'serviceKey' cannot be null!"); + } + encoder.encodeIdentifier(configName); + encoder.encodeElement(serviceKey); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + configName = decoder.decodeIdentifier(); + serviceKey = (org.ccsds.moims.mo.common.structures.ServiceKey) decoder.decodeElement(new org.ccsds.moims.mo.common.structures.ServiceKey()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/configuration/structures/ServiceConfigurationIdentifierList.java b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/configuration/structures/ServiceConfigurationIdentifierList.java new file mode 100644 index 00000000..2b76b8be --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/configuration/structures/ServiceConfigurationIdentifierList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.common.configuration.structures; + +/** + * List class for ServiceConfigurationIdentifier. + */ +public final class ServiceConfigurationIdentifierList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 844446438522877L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 844446438522877L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for ServiceConfigurationIdentifierList. + * + */ + public ServiceConfigurationIdentifierList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public ServiceConfigurationIdentifierList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public ServiceConfigurationIdentifierList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.common.configuration.structures.ServiceConfigurationIdentifier element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.common.configuration.structures.ServiceConfigurationIdentifier element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new ServiceConfigurationIdentifierList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.common.configuration.structures.ServiceConfigurationIdentifier(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/configuration/structures/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/configuration/structures/package-info.java new file mode 100644 index 00000000..ebe808e3 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/configuration/structures/package-info.java @@ -0,0 +1,4 @@ +/** + * Package containing types defined in the Configuration service. +*/ +package org.ccsds.moims.mo.common.configuration.structures; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/DirectoryHelper.java b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/DirectoryHelper.java new file mode 100644 index 00000000..448febab --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/DirectoryHelper.java @@ -0,0 +1,17 @@ +package org.ccsds.moims.mo.common.directory; + +/** + * Helper class for Directory service. + */ +public class DirectoryHelper { + + /** + * Service singleton instance. + */ + public static final org.ccsds.moims.mo.common.directory.DirectoryServiceInfo DIRECTORY_SERVICE = new org.ccsds.moims.mo.common.directory.DirectoryServiceInfo(); + + private DirectoryHelper() { + // Utility class; not meant to be instantiated. + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/DirectoryServiceInfo.java b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/DirectoryServiceInfo.java new file mode 100644 index 00000000..1d012434 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/DirectoryServiceInfo.java @@ -0,0 +1,221 @@ +package org.ccsds.moims.mo.common.directory; + +/** + * Helper class for Directory service. + */ +public class DirectoryServiceInfo extends org.ccsds.moims.mo.com.COMService { + + /** + * Service number literal. + */ + public static final int _DIRECTORY_SERVICE_NUMBER = 1; + + /** + * Service number instance. + */ + public static final org.ccsds.moims.mo.mal.structures.UShort DIRECTORY_SERVICE_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_DIRECTORY_SERVICE_NUMBER); + + /** + * Service name constant. + */ + public static final org.ccsds.moims.mo.mal.structures.Identifier DIRECTORY_SERVICE_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("Directory"); + + /** + * The service key of this service. + */ + private static final org.ccsds.moims.mo.mal.ServiceKey SERVICE_KEY = new org.ccsds.moims.mo.mal.ServiceKey( + 3, 1, DIRECTORY_SERVICE_NUMBER); + + /** + * Operation number literal for operation LOOKUPPROVIDER. + */ + public static final int _LOOKUPPROVIDER_OP_NUMBER = 1; + + /** + * Operation number instance for operation LOOKUPPROVIDER. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort LOOKUPPROVIDER_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_LOOKUPPROVIDER_OP_NUMBER); + + /** + * Operation instance for operation LOOKUPPROVIDER. + */ + public static final org.ccsds.moims.mo.mal.MALRequestOperation LOOKUPPROVIDER_OP = new org.ccsds.moims.mo.mal.MALRequestOperation(SERVICE_KEY, + LOOKUPPROVIDER_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("lookupProvider"), + new org.ccsds.moims.mo.mal.structures.UShort(1), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("filter", true, org.ccsds.moims.mo.common.directory.structures.ServiceFilter.SHORT_FORM, "The filter field shall define the lookup query and be used to match details previously published using the publishProvider operation, the specifics of the ServiceFilter fields are defined in the following requirements.\nIf the serviceProviderId field is NULL then all service provider identifiers shall be matched.\nIf the final identifier of the domain field of the filter is the wildcard '*', then all sub-domains shall be searched for matches. See R[2] section 3.5.6.5.g.\nIf the wildcard is used in any other part of the domain other than the final one then an INVALID error shall be returned.\nIf the domain field is NULL then all domains shall be matched.\nIf the network field is NULL then all networks shall be matched.\nIf the sessionType field is NULL then all session types shall be matched.\nIf the sessionName field is NULL then all session names shall be matched.\nThe serviceKey field shall be used to match against ServiceKey fields held in the PublishDetails used to publish a specific provider.\nIf the serviceKey field is NULL then all areas, services and versions shall be matched.\nIf the area field is the wildcard '0' then all areas names shall be matched.\nIf the service field is the wildcard '0' then all services shall be matched.\nIf the version field is the wildcard '0' then all area versions shall be matched.\nIf the requiredCapabilitySets field is NULL or an empty list then all service capability sets shall be matched.")}, + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("matchingProviders", true, org.ccsds.moims.mo.common.directory.structures.ProviderSummaryList.SHORT_FORM, "The operation shall return a list of service providers that match the filter.\nIf no service providers match the supplied filter then an empty list shall be returned.")}, + "The lookup operation allows a service consumer to query the directory service to return a list of service providers that match the requested criteria. If no match is found, then an empty list is returned.\n\nNOTE: The various filters that may be specified as part of this operation are combined using AND logic."); + + /** + * Operation number literal for operation PUBLISHPROVIDER. + */ + public static final int _PUBLISHPROVIDER_OP_NUMBER = 2; + + /** + * Operation number instance for operation PUBLISHPROVIDER. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort PUBLISHPROVIDER_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_PUBLISHPROVIDER_OP_NUMBER); + + /** + * Operation instance for operation PUBLISHPROVIDER. + */ + public static final org.ccsds.moims.mo.mal.MALRequestOperation PUBLISHPROVIDER_OP = new org.ccsds.moims.mo.mal.MALRequestOperation(SERVICE_KEY, + PUBLISHPROVIDER_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("publishProvider"), + new org.ccsds.moims.mo.mal.structures.UShort(2), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("newProviderDetails", true, org.ccsds.moims.mo.common.directory.structures.PublishDetails.SHORT_FORM, "The newProviderDetails field shall hold the provider details of the service to be added or updated in the directory service.\nIf any of the fields of the newProviderDetails domain/sessionName/network fields are either empty or contain the wildcard '*' an INVALID error shall be returned.\nIf the providerId field of the PublishDetails structure is empty or contains the wildcard '*' an INVALID error shall be returned.\nFor each contained ServiceKey structure if the area/service/version fields contain '0' then an INVALID error shall be returned.\nFor each contained supportedCapabilitySets list if the list is empty or contains '0' then an INVALID error shall be returned.\nIf the supportedLevels list is empty or the priorityLevels field is '0' for each contained AddressDetails structure found either within the ProviderDetails or the inner ServiceCapability structures then an INVALID error shall be returned.\nIf an error is being returned then no changes shall be made.")}, + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("providerObjId", true, org.ccsds.moims.mo.mal.structures.Attribute.LONG_SHORT_FORM, "If the providerId field of the PublishDetails structure matches an existing ServiceProvider COM object, the operation shall update the existing details of that provider.\nIf the providerId field of the PublishDetails structure does not match an existing ServiceProvider COM object, then the operation shall create a new ServiceProvider COM object to represent the new service provider.\nA new ProviderCapabilities COM object shall be created to store the capabilities of the provider.\nThe created objects should be stored in the COM archive by the directory service provider.\nThe operation shall return the COM object instance identifiers of the ServiceProvider and ProviderCapabilities COM objects representing the provider."), + new org.ccsds.moims.mo.mal.OperationField("capabilitiesObjId", true, org.ccsds.moims.mo.mal.structures.Attribute.LONG_SHORT_FORM, null)}, + "The publishProvider operation adds a new or updates an existing entry in the list of service providers held in the directory service."); + + /** + * Operation number literal for operation WITHDRAWPROVIDER. + */ + public static final int _WITHDRAWPROVIDER_OP_NUMBER = 3; + + /** + * Operation number instance for operation WITHDRAWPROVIDER. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort WITHDRAWPROVIDER_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_WITHDRAWPROVIDER_OP_NUMBER); + + /** + * Operation instance for operation WITHDRAWPROVIDER. + */ + public static final org.ccsds.moims.mo.mal.MALSubmitOperation WITHDRAWPROVIDER_OP = new org.ccsds.moims.mo.mal.MALSubmitOperation(SERVICE_KEY, + WITHDRAWPROVIDER_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("withdrawProvider"), + new org.ccsds.moims.mo.mal.structures.UShort(2), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("providerObjId", true, org.ccsds.moims.mo.mal.structures.Attribute.LONG_SHORT_FORM, "The providerObjId field shall hold the object instance identifier for the ServiceProvider COM object to remove from the directory service.\nIf the supplied identifier is '0' an INVALID error shall be returned.\nIf the supplied identifier does not match an existing ServiceProvider COM object then an UNKNOWN error shall be returned.\nIf an error is being returned then no changes shall be made.\nThe matched provider shall be removed from the directory service.")}, + "The withdrawProvider operation removes an existing entry from the list of service providers held in the directory service. If no match is found for the withdraw request, then nothing is changed."); + + /** + * Operation number literal for operation GETSERVICEXML. + */ + public static final int _GETSERVICEXML_OP_NUMBER = 4; + + /** + * Operation number instance for operation GETSERVICEXML. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort GETSERVICEXML_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_GETSERVICEXML_OP_NUMBER); + + /** + * Operation instance for operation GETSERVICEXML. + */ + public static final org.ccsds.moims.mo.mal.MALRequestOperation GETSERVICEXML_OP = new org.ccsds.moims.mo.mal.MALRequestOperation(SERVICE_KEY, + GETSERVICEXML_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("getServiceXML"), + new org.ccsds.moims.mo.mal.structures.UShort(3), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("providerObjId", true, org.ccsds.moims.mo.mal.structures.Attribute.LONG_SHORT_FORM, "The providerObjId field shall hold the COM object instance identifier for the ServiceProvider to obtain the service XML for.\nIf the supplied instance identifier is '0' an INVALID error shall be returned.\nIf the supplied identifier does not match an existing ServiceProvider COM object then an UNKNOWN error shall be returned.")}, + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("xmlFiles", true, org.ccsds.moims.mo.mal.structures.FileList.SHORT_FORM, "The list of XML files supplied during the publishProvider operation for the matched provider shall be returned.\nIf no XML files were supplied by the provider then an empty list shall be returned.")}, + "The getServiceXML operation returns the list of XML files that were submitted by the service provider by the publishProvider operation.\nIf no files were supplied then this operation returns an empty list."); + + /** + * Area elements. + */ + public static final org.ccsds.moims.mo.mal.structures.Element[] DIRECTORY_SERVICE_ELEMENTS = {}; + + /** + * The set of operations for this service. + */ + public static final org.ccsds.moims.mo.mal.MALOperation[] OPERATIONS = new org.ccsds.moims.mo.mal.MALOperation[]{LOOKUPPROVIDER_OP, + PUBLISHPROVIDER_OP, + WITHDRAWPROVIDER_OP, + GETSERVICEXML_OP}; + + /** + * Literal for object SERVICEPROVIDER. + */ + @Deprecated + public static final int _SERVICEPROVIDER_OBJECT_NUMBER = 1; + + /** + * Instance for object SERVICEPROVIDER. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.UShort SERVICEPROVIDER_OBJECT_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_SERVICEPROVIDER_OBJECT_NUMBER); + + /** + * Object name constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.Identifier SERVICEPROVIDER_OBJECT_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("ServiceProvider"); + + /** + * Object type constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.com.structures.ObjectType SERVICEPROVIDER_OBJECT_TYPE = new org.ccsds.moims.mo.com.structures.ObjectType(new org.ccsds.moims.mo.mal.structures.UShort(3), DIRECTORY_SERVICE_NUMBER, new org.ccsds.moims.mo.mal.structures.UOctet(1), SERVICEPROVIDER_OBJECT_NUMBER); + + /** + * Object instance. + */ + @Deprecated + public static org.ccsds.moims.mo.com.COMObject SERVICEPROVIDER_OBJECT = new org.ccsds.moims.mo.com.COMObject(SERVICEPROVIDER_OBJECT_TYPE, SERVICEPROVIDER_OBJECT_NAME, org.ccsds.moims.mo.mal.structures.Attribute.IDENTIFIER_SHORT_FORM, false, null, false, null, false); + + /** + * Literal for object PROVIDERCAPABILITIES. + */ + @Deprecated + public static final int _PROVIDERCAPABILITIES_OBJECT_NUMBER = 2; + + /** + * Instance for object PROVIDERCAPABILITIES. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.UShort PROVIDERCAPABILITIES_OBJECT_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_PROVIDERCAPABILITIES_OBJECT_NUMBER); + + /** + * Object name constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.Identifier PROVIDERCAPABILITIES_OBJECT_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("ProviderCapabilities"); + + /** + * Object type constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.com.structures.ObjectType PROVIDERCAPABILITIES_OBJECT_TYPE = new org.ccsds.moims.mo.com.structures.ObjectType(new org.ccsds.moims.mo.mal.structures.UShort(3), DIRECTORY_SERVICE_NUMBER, new org.ccsds.moims.mo.mal.structures.UOctet(1), PROVIDERCAPABILITIES_OBJECT_NUMBER); + + /** + * Object instance. + */ + @Deprecated + public static org.ccsds.moims.mo.com.COMObject PROVIDERCAPABILITIES_OBJECT = new org.ccsds.moims.mo.com.COMObject(PROVIDERCAPABILITIES_OBJECT_TYPE, PROVIDERCAPABILITIES_OBJECT_NAME, org.ccsds.moims.mo.common.directory.structures.ProviderDetails.SHORT_FORM, true, org.ccsds.moims.mo.common.directory.DirectoryServiceInfo.SERVICEPROVIDER_OBJECT_TYPE, false, null, false); + + /** + * Object instance. + */ + public static final org.ccsds.moims.mo.com.COMObject[] COM_OBJECTS = { + SERVICEPROVIDER_OBJECT, + PROVIDERCAPABILITIES_OBJECT,}; + + /** + * Creates an instance of the Directory ServiceInfo. + * + */ + public DirectoryServiceInfo() { + super(SERVICE_KEY, DIRECTORY_SERVICE_NAME, DIRECTORY_SERVICE_ELEMENTS, OPERATIONS, COM_OBJECTS); + } + + @Override + public org.ccsds.moims.mo.mal.MALArea getArea() { + return org.ccsds.moims.mo.common.CommonHelper.COMMON_AREA; + } + + @Override + public org.ccsds.moims.mo.mal.MOErrorException generateMOError(int errorNumber, + Object extraInfo) { + switch (errorNumber) { + } + return null; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/body/PublishProviderResponse.java b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/body/PublishProviderResponse.java new file mode 100644 index 00000000..b8a97fe2 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/body/PublishProviderResponse.java @@ -0,0 +1,71 @@ +package org.ccsds.moims.mo.common.directory.body; + +/** + * Multi body return class for PublishProviderResponse. + */ +public final class PublishProviderResponse { + + /** + * providerObjId: If the providerId field of the PublishDetails structure + * matches an existing ServiceProvider COM object, the operation shall update + * the existing details of that provider. + * If the providerId field of the PublishDetails structure does not match + * an existing ServiceProvider COM object, then the operation shall create + * a new ServiceProvider COM object to represent the new service provider. + * A new ProviderCapabilities COM object shall be created to store the capabilities + * of the provider. + * The created objects should be stored in the COM archive by the directory + * service provider. + * The operation shall return the COM object instance identifiers of the ServiceProvider + * and ProviderCapabilities COM objects representing the provider. + */ + private Long providerObjId; + + /** + * capabilitiesObjId: capabilitiesObjId Argument number 1 as defined by the + * service operation. + */ + private Long capabilitiesObjId; + + /** + * Default constructor for PublishProviderResponse. + * + */ + public PublishProviderResponse() { + } + + /** + * Constructs an instance of this type using provided values. + * + * @param providerObjId If the providerId field of the PublishDetails structure matches an existing ServiceProvider COM object, the operation shall update the existing details of that provider. +If the providerId field of the PublishDetails structure does not match an existing ServiceProvider COM object, then the operation shall create a new ServiceProvider COM object to represent the new service provider. +A new ProviderCapabilities COM object shall be created to store the capabilities of the provider. +The created objects should be stored in the COM archive by the directory service provider. +The operation shall return the COM object instance identifiers of the ServiceProvider and ProviderCapabilities COM objects representing the provider. + * @param capabilitiesObjId capabilitiesObjId Argument number 1 as defined by the service operation + */ + public PublishProviderResponse(Long providerObjId, + Long capabilitiesObjId) { + this.providerObjId = providerObjId; + this.capabilitiesObjId = capabilitiesObjId; + } + + /** + * Returns the field providerObjId. + * + * @return The field providerObjId + */ + public Long getProviderObjId() { + return providerObjId; + } + + /** + * Returns the field capabilitiesObjId. + * + * @return The field capabilitiesObjId + */ + public Long getCapabilitiesObjId() { + return capabilitiesObjId; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/body/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/body/package-info.java new file mode 100644 index 00000000..e23beb5d --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/body/package-info.java @@ -0,0 +1,4 @@ +/** + * Package containing the types for holding compound messages. +*/ +package org.ccsds.moims.mo.common.directory.body; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/consumer/DirectoryAdapter.java b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/consumer/DirectoryAdapter.java new file mode 100644 index 00000000..bbf76dd2 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/consumer/DirectoryAdapter.java @@ -0,0 +1,185 @@ +package org.ccsds.moims.mo.common.directory.consumer; + +/** + * Consumer adapter for Directory service. + */ +public abstract class DirectoryAdapter extends org.ccsds.moims.mo.mal.consumer.MALInteractionAdapter { + + /** + * Called by the MAL when a REQUEST response is received from a provider for + * the operation lookupProvider. + * + * @param msgHeader msgHeader The header of the received message + * @param matchingProviders The operation shall return a list of service providers that match the filter. +If no service providers match the supplied filter then an empty list shall be returned. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void lookupProviderResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.common.directory.structures.ProviderSummaryList matchingProviders, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response error is received from a provider + * for the operation lookupProvider. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void lookupProviderErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response is received from a provider for + * the operation publishProvider. + * + * @param msgHeader msgHeader The header of the received message + * @param providerObjId If the providerId field of the PublishDetails structure matches an existing ServiceProvider COM object, the operation shall update the existing details of that provider. +If the providerId field of the PublishDetails structure does not match an existing ServiceProvider COM object, then the operation shall create a new ServiceProvider COM object to represent the new service provider. +A new ProviderCapabilities COM object shall be created to store the capabilities of the provider. +The created objects should be stored in the COM archive by the directory service provider. +The operation shall return the COM object instance identifiers of the ServiceProvider and ProviderCapabilities COM objects representing the provider. + * @param capabilitiesObjId capabilitiesObjId Argument number 1 as defined by the service operation + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void publishProviderResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + Long providerObjId, + Long capabilitiesObjId, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response error is received from a provider + * for the operation publishProvider. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void publishProviderErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a SUBMIT acknowledgement is received from a provider + * for the operation withdrawProvider. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void withdrawProviderAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a SUBMIT acknowledgement error is received from + * a provider for the operation withdrawProvider. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void withdrawProviderErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response is received from a provider for + * the operation getServiceXML. + * + * @param msgHeader msgHeader The header of the received message + * @param xmlFiles The list of XML files supplied during the publishProvider operation for the matched provider shall be returned. +If no XML files were supplied by the provider then an empty list shall be returned. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void getServiceXMLResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.structures.FileList xmlFiles, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response error is received from a provider + * for the operation getServiceXML. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void getServiceXMLErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + @Override + public final void submitAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.common.directory.DirectoryServiceInfo._WITHDRAWPROVIDER_OP_NUMBER: + withdrawProviderAckReceived(msgHeader, qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void submitErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALErrorBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.common.directory.DirectoryServiceInfo._WITHDRAWPROVIDER_OP_NUMBER: + withdrawProviderErrorReceived(msgHeader, body.getError(), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void requestResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALMessageBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.common.directory.DirectoryServiceInfo._LOOKUPPROVIDER_OP_NUMBER: + lookupProviderResponseReceived(msgHeader, + (org.ccsds.moims.mo.common.directory.structures.ProviderSummaryList) body.getBodyElement(0, new org.ccsds.moims.mo.common.directory.structures.ProviderSummaryList()), qosProperties); + break; + case org.ccsds.moims.mo.common.directory.DirectoryServiceInfo._PUBLISHPROVIDER_OP_NUMBER: + publishProviderResponseReceived(msgHeader, + (body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.Union(Long.MAX_VALUE)) == null) ? null : ((org.ccsds.moims.mo.mal.structures.Union) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.Union(Long.MAX_VALUE))).getLongValue(), + (body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.Union(Long.MAX_VALUE)) == null) ? null : ((org.ccsds.moims.mo.mal.structures.Union) body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.Union(Long.MAX_VALUE))).getLongValue(), qosProperties); + break; + case org.ccsds.moims.mo.common.directory.DirectoryServiceInfo._GETSERVICEXML_OP_NUMBER: + getServiceXMLResponseReceived(msgHeader, + (org.ccsds.moims.mo.mal.structures.FileList) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.FileList()), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void requestErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALErrorBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.common.directory.DirectoryServiceInfo._LOOKUPPROVIDER_OP_NUMBER: + lookupProviderErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.common.directory.DirectoryServiceInfo._PUBLISHPROVIDER_OP_NUMBER: + publishProviderErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.common.directory.DirectoryServiceInfo._GETSERVICEXML_OP_NUMBER: + getServiceXMLErrorReceived(msgHeader, body.getError(), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/consumer/DirectoryStub.java b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/consumer/DirectoryStub.java new file mode 100644 index 00000000..f3c6f773 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/consumer/DirectoryStub.java @@ -0,0 +1,271 @@ +package org.ccsds.moims.mo.common.directory.consumer; + +/** + * Consumer stub for Directory service. + */ +public class DirectoryStub { + + /** + * The consumer field. + */ + private final org.ccsds.moims.mo.mal.consumer.MALConsumer consumer; + + /** + * Wraps a MALconsumer connection with service specific methods that map from + * the high level service API to the generic MAL API. + * + * @param consumer consumer The MALConsumer to use in this stub. + */ + public DirectoryStub(org.ccsds.moims.mo.mal.consumer.MALConsumer consumer) { + this.consumer = consumer; + } + + /** + * Returns the internal MAL consumer object used for sending of messages from + * this interface. + * + * @return The MAL consumer object. + */ + public org.ccsds.moims.mo.mal.consumer.MALConsumer getConsumer() { + return consumer; + } + + /** + * The lookup operation allows a service consumer to query the directory service + * to return a list of service providers that match the requested criteria. + * If no match is found, then an empty list is returned. + * + * NOTE: The various filters that may be specified as part of this operation + * are combined using AND logic. + * + * @param filter The filter field shall define the lookup query and be used to match details previously published using the publishProvider operation, the specifics of the ServiceFilter fields are defined in the following requirements. +If the serviceProviderId field is NULL then all service provider identifiers shall be matched. +If the final identifier of the domain field of the filter is the wildcard '*', then all sub-domains shall be searched for matches. See R[2] section 3.5.6.5.g. +If the wildcard is used in any other part of the domain other than the final one then an INVALID error shall be returned. +If the domain field is NULL then all domains shall be matched. +If the network field is NULL then all networks shall be matched. +If the sessionType field is NULL then all session types shall be matched. +If the sessionName field is NULL then all session names shall be matched. +The serviceKey field shall be used to match against ServiceKey fields held in the PublishDetails used to publish a specific provider. +If the serviceKey field is NULL then all areas, services and versions shall be matched. +If the area field is the wildcard '0' then all areas names shall be matched. +If the service field is the wildcard '0' then all services shall be matched. +If the version field is the wildcard '0' then all area versions shall be matched. +If the requiredCapabilitySets field is NULL or an empty list then all service capability sets shall be matched. + * @return The return value of the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.common.directory.structures.ProviderSummaryList lookupProvider(org.ccsds.moims.mo.common.directory.structures.ServiceFilter filter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + org.ccsds.moims.mo.mal.transport.MALMessageBody body = consumer.request(org.ccsds.moims.mo.common.directory.DirectoryServiceInfo.LOOKUPPROVIDER_OP, filter); + Object body0 = (Object) body.getBodyElement(0, new org.ccsds.moims.mo.common.directory.structures.ProviderSummaryList()); + return (org.ccsds.moims.mo.common.directory.structures.ProviderSummaryList) body0; + } + + /** + * Asynchronous version of method lookupProvider. + * + * @param filter The filter field shall define the lookup query and be used to match details previously published using the publishProvider operation, the specifics of the ServiceFilter fields are defined in the following requirements. +If the serviceProviderId field is NULL then all service provider identifiers shall be matched. +If the final identifier of the domain field of the filter is the wildcard '*', then all sub-domains shall be searched for matches. See R[2] section 3.5.6.5.g. +If the wildcard is used in any other part of the domain other than the final one then an INVALID error shall be returned. +If the domain field is NULL then all domains shall be matched. +If the network field is NULL then all networks shall be matched. +If the sessionType field is NULL then all session types shall be matched. +If the sessionName field is NULL then all session names shall be matched. +The serviceKey field shall be used to match against ServiceKey fields held in the PublishDetails used to publish a specific provider. +If the serviceKey field is NULL then all areas, services and versions shall be matched. +If the area field is the wildcard '0' then all areas names shall be matched. +If the service field is the wildcard '0' then all services shall be matched. +If the version field is the wildcard '0' then all area versions shall be matched. +If the requiredCapabilitySets field is NULL or an empty list then all service capability sets shall be matched. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncLookupProvider(org.ccsds.moims.mo.common.directory.structures.ServiceFilter filter, + org.ccsds.moims.mo.common.directory.consumer.DirectoryAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncRequest(org.ccsds.moims.mo.common.directory.DirectoryServiceInfo.LOOKUPPROVIDER_OP, adapter, filter); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueLookupProvider(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.common.directory.consumer.DirectoryAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.common.directory.DirectoryServiceInfo.LOOKUPPROVIDER_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The publishProvider operation adds a new or updates an existing entry in + * the list of service providers held in the directory service. + * + * @param newProviderDetails The newProviderDetails field shall hold the provider details of the service to be added or updated in the directory service. +If any of the fields of the newProviderDetails domain/sessionName/network fields are either empty or contain the wildcard '*' an INVALID error shall be returned. +If the providerId field of the PublishDetails structure is empty or contains the wildcard '*' an INVALID error shall be returned. +For each contained ServiceKey structure if the area/service/version fields contain '0' then an INVALID error shall be returned. +For each contained supportedCapabilitySets list if the list is empty or contains '0' then an INVALID error shall be returned. +If the supportedLevels list is empty or the priorityLevels field is '0' for each contained AddressDetails structure found either within the ProviderDetails or the inner ServiceCapability structures then an INVALID error shall be returned. +If an error is being returned then no changes shall be made. + * @return The return value of the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.common.directory.body.PublishProviderResponse publishProvider(org.ccsds.moims.mo.common.directory.structures.PublishDetails newProviderDetails) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + org.ccsds.moims.mo.mal.transport.MALMessageBody body = consumer.request(org.ccsds.moims.mo.common.directory.DirectoryServiceInfo.PUBLISHPROVIDER_OP, newProviderDetails); + Object body0 = (Object) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.Union(Long.MAX_VALUE)); + Object body1 = (Object) body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.Union(Long.MAX_VALUE)); + return new org.ccsds.moims.mo.common.directory.body.PublishProviderResponse((body0 == null) ? null : ((org.ccsds.moims.mo.mal.structures.Union) body0).getLongValue(), (body1 == null) ? null : ((org.ccsds.moims.mo.mal.structures.Union) body1).getLongValue()); + } + + /** + * Asynchronous version of method publishProvider. + * + * @param newProviderDetails The newProviderDetails field shall hold the provider details of the service to be added or updated in the directory service. +If any of the fields of the newProviderDetails domain/sessionName/network fields are either empty or contain the wildcard '*' an INVALID error shall be returned. +If the providerId field of the PublishDetails structure is empty or contains the wildcard '*' an INVALID error shall be returned. +For each contained ServiceKey structure if the area/service/version fields contain '0' then an INVALID error shall be returned. +For each contained supportedCapabilitySets list if the list is empty or contains '0' then an INVALID error shall be returned. +If the supportedLevels list is empty or the priorityLevels field is '0' for each contained AddressDetails structure found either within the ProviderDetails or the inner ServiceCapability structures then an INVALID error shall be returned. +If an error is being returned then no changes shall be made. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncPublishProvider(org.ccsds.moims.mo.common.directory.structures.PublishDetails newProviderDetails, + org.ccsds.moims.mo.common.directory.consumer.DirectoryAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncRequest(org.ccsds.moims.mo.common.directory.DirectoryServiceInfo.PUBLISHPROVIDER_OP, adapter, newProviderDetails); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continuePublishProvider(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.common.directory.consumer.DirectoryAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.common.directory.DirectoryServiceInfo.PUBLISHPROVIDER_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The withdrawProvider operation removes an existing entry from the list + * of service providers held in the directory service. If no match is found + * for the withdraw request, then nothing is changed. + * + * @param providerObjId The providerObjId field shall hold the object instance identifier for the ServiceProvider COM object to remove from the directory service. +If the supplied identifier is '0' an INVALID error shall be returned. +If the supplied identifier does not match an existing ServiceProvider COM object then an UNKNOWN error shall be returned. +If an error is being returned then no changes shall be made. +The matched provider shall be removed from the directory service. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void withdrawProvider(Long providerObjId) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.submit(org.ccsds.moims.mo.common.directory.DirectoryServiceInfo.WITHDRAWPROVIDER_OP, (providerObjId == null) ? null : new org.ccsds.moims.mo.mal.structures.Union(providerObjId)); + } + + /** + * Asynchronous version of method withdrawProvider. + * + * @param providerObjId The providerObjId field shall hold the object instance identifier for the ServiceProvider COM object to remove from the directory service. +If the supplied identifier is '0' an INVALID error shall be returned. +If the supplied identifier does not match an existing ServiceProvider COM object then an UNKNOWN error shall be returned. +If an error is being returned then no changes shall be made. +The matched provider shall be removed from the directory service. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncWithdrawProvider(Long providerObjId, + org.ccsds.moims.mo.common.directory.consumer.DirectoryAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncSubmit(org.ccsds.moims.mo.common.directory.DirectoryServiceInfo.WITHDRAWPROVIDER_OP, adapter, (providerObjId == null) ? null : new org.ccsds.moims.mo.mal.structures.Union(providerObjId)); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueWithdrawProvider(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.common.directory.consumer.DirectoryAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.common.directory.DirectoryServiceInfo.WITHDRAWPROVIDER_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The getServiceXML operation returns the list of XML files that were submitted + * by the service provider by the publishProvider operation. + * If no files were supplied then this operation returns an empty list. + * + * @param providerObjId The providerObjId field shall hold the COM object instance identifier for the ServiceProvider to obtain the service XML for. +If the supplied instance identifier is '0' an INVALID error shall be returned. +If the supplied identifier does not match an existing ServiceProvider COM object then an UNKNOWN error shall be returned. + * @return The return value of the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.structures.FileList getServiceXML(Long providerObjId) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + org.ccsds.moims.mo.mal.transport.MALMessageBody body = consumer.request(org.ccsds.moims.mo.common.directory.DirectoryServiceInfo.GETSERVICEXML_OP, (providerObjId == null) ? null : new org.ccsds.moims.mo.mal.structures.Union(providerObjId)); + Object body0 = (Object) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.FileList()); + return (org.ccsds.moims.mo.mal.structures.FileList) body0; + } + + /** + * Asynchronous version of method getServiceXML. + * + * @param providerObjId The providerObjId field shall hold the COM object instance identifier for the ServiceProvider to obtain the service XML for. +If the supplied instance identifier is '0' an INVALID error shall be returned. +If the supplied identifier does not match an existing ServiceProvider COM object then an UNKNOWN error shall be returned. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncGetServiceXML(Long providerObjId, + org.ccsds.moims.mo.common.directory.consumer.DirectoryAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncRequest(org.ccsds.moims.mo.common.directory.DirectoryServiceInfo.GETSERVICEXML_OP, adapter, (providerObjId == null) ? null : new org.ccsds.moims.mo.mal.structures.Union(providerObjId)); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueGetServiceXML(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.common.directory.consumer.DirectoryAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.common.directory.DirectoryServiceInfo.GETSERVICEXML_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/consumer/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/consumer/package-info.java new file mode 100644 index 00000000..0d970084 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/consumer/package-info.java @@ -0,0 +1,4 @@ +/** + * Package containing the consumer stubs for the Directory service. +*/ +package org.ccsds.moims.mo.common.directory.consumer; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/package-info.java new file mode 100644 index 00000000..31379eba --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/package-info.java @@ -0,0 +1,17 @@ +/** + * The Directory service allows service providers to publish information about + * which services they provide and consumers to discover service provider + * address and capability information. + * Service provider information is made available using the Directory service + * publishProvider operation and removed using the withdrawProvider operation. + * The lookupProvider operation provides the ability for consumers to query + * the directory service based on a filter such as required service capability. + * Finally, a provider may supply its set of service specification XML files + * when publishing its capabilities. This allows consumers that are able to + * process MO service XML files obtain the files for further processing. It + * is expected that this would be used to either ensure that no modifications + * have been made by a provider to a standard service or, in the case of a + * consumer that is able to dynamically interact with new service specifications, + * obtain the service specification to allow interaction with that new service. +*/ +package org.ccsds.moims.mo.common.directory; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/provider/DirectoryHandler.java b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/provider/DirectoryHandler.java new file mode 100644 index 00000000..242573ba --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/provider/DirectoryHandler.java @@ -0,0 +1,89 @@ +package org.ccsds.moims.mo.common.directory.provider; + +/** + * Interface that providers of the Directory service must implement to handle + * the operations of that service. + */ +public interface DirectoryHandler { + + /** + * Implements the operation lookupProvider. + * + * @param filter The filter field shall define the lookup query and be used to match details previously published using the publishProvider operation, the specifics of the ServiceFilter fields are defined in the following requirements. +If the serviceProviderId field is NULL then all service provider identifiers shall be matched. +If the final identifier of the domain field of the filter is the wildcard '*', then all sub-domains shall be searched for matches. See R[2] section 3.5.6.5.g. +If the wildcard is used in any other part of the domain other than the final one then an INVALID error shall be returned. +If the domain field is NULL then all domains shall be matched. +If the network field is NULL then all networks shall be matched. +If the sessionType field is NULL then all session types shall be matched. +If the sessionName field is NULL then all session names shall be matched. +The serviceKey field shall be used to match against ServiceKey fields held in the PublishDetails used to publish a specific provider. +If the serviceKey field is NULL then all areas, services and versions shall be matched. +If the area field is the wildcard '0' then all areas names shall be matched. +If the service field is the wildcard '0' then all services shall be matched. +If the version field is the wildcard '0' then all area versions shall be matched. +If the requiredCapabilitySets field is NULL or an empty list then all service capability sets shall be matched. + * @param interaction The MAL object representing the interaction in the provider. + * @return The return value of the operation + * @throws org.ccsds.moims.mo.com.InvalidException Invalid domain filter value. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + org.ccsds.moims.mo.common.directory.structures.ProviderSummaryList lookupProvider(org.ccsds.moims.mo.common.directory.structures.ServiceFilter filter, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.com.InvalidException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation publishProvider. + * + * @param newProviderDetails The newProviderDetails field shall hold the provider details of the service to be added or updated in the directory service. +If any of the fields of the newProviderDetails domain/sessionName/network fields are either empty or contain the wildcard '*' an INVALID error shall be returned. +If the providerId field of the PublishDetails structure is empty or contains the wildcard '*' an INVALID error shall be returned. +For each contained ServiceKey structure if the area/service/version fields contain '0' then an INVALID error shall be returned. +For each contained supportedCapabilitySets list if the list is empty or contains '0' then an INVALID error shall be returned. +If the supportedLevels list is empty or the priorityLevels field is '0' for each contained AddressDetails structure found either within the ProviderDetails or the inner ServiceCapability structures then an INVALID error shall be returned. +If an error is being returned then no changes shall be made. + * @param interaction The MAL object representing the interaction in the provider. + * @return The return value of the operation + * @throws org.ccsds.moims.mo.com.InvalidException Submitted values are invalid. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + org.ccsds.moims.mo.common.directory.body.PublishProviderResponse publishProvider(org.ccsds.moims.mo.common.directory.structures.PublishDetails newProviderDetails, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.com.InvalidException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation withdrawProvider. + * + * @param providerObjId The providerObjId field shall hold the object instance identifier for the ServiceProvider COM object to remove from the directory service. +If the supplied identifier is '0' an INVALID error shall be returned. +If the supplied identifier does not match an existing ServiceProvider COM object then an UNKNOWN error shall be returned. +If an error is being returned then no changes shall be made. +The matched provider shall be removed from the directory service. + * @param interaction The MAL object representing the interaction in the provider. + * @throws org.ccsds.moims.mo.mal.UnknownException Provider to withdraw was not found. + * @throws org.ccsds.moims.mo.com.InvalidException Submitted values are invalid. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + void withdrawProvider(Long providerObjId, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mal.UnknownException, org.ccsds.moims.mo.com.InvalidException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation getServiceXML. + * + * @param providerObjId The providerObjId field shall hold the COM object instance identifier for the ServiceProvider to obtain the service XML for. +If the supplied instance identifier is '0' an INVALID error shall be returned. +If the supplied identifier does not match an existing ServiceProvider COM object then an UNKNOWN error shall be returned. + * @param interaction The MAL object representing the interaction in the provider. + * @return The return value of the operation + * @throws org.ccsds.moims.mo.com.InvalidException Submitted values are invalid. + * @throws org.ccsds.moims.mo.mal.UnknownException Provider was not found. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + org.ccsds.moims.mo.mal.structures.FileList getServiceXML(Long providerObjId, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.com.InvalidException, org.ccsds.moims.mo.mal.UnknownException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Sets the skeleton to be used for creation of publishers. + * + * @param skeleton The skeleton to be used. + */ + void setSkeleton(org.ccsds.moims.mo.common.directory.provider.DirectorySkeleton skeleton); +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/provider/DirectoryInheritanceSkeleton.java b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/provider/DirectoryInheritanceSkeleton.java new file mode 100644 index 00000000..31d0a240 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/provider/DirectoryInheritanceSkeleton.java @@ -0,0 +1,130 @@ +package org.ccsds.moims.mo.common.directory.provider; + +/** + * Provider Inheritance skeleton for DirectoryInheritanceSkeleton service. + */ +public abstract class DirectoryInheritanceSkeleton implements org.ccsds.moims.mo.mal.provider.MALInteractionHandler, org.ccsds.moims.mo.common.directory.provider.DirectorySkeleton, org.ccsds.moims.mo.common.directory.provider.DirectoryHandler { + + /** + * The providerSet field. + */ + private org.ccsds.moims.mo.mal.provider.MALProviderSet providerSet = new org.ccsds.moims.mo.mal.provider.MALProviderSet(org.ccsds.moims.mo.common.directory.DirectoryHelper.DIRECTORY_SERVICE); + + /** + * Returns the connection object for this provider. + * + * @return the connection object for this provider + * @throws java.io.IOException if the method was not implemented yet. + */ + public org.ccsds.moims.mo.mal.helpertools.connections.ConnectionProvider getConnection() throws java.io.IOException { + throw new java.io.IOException("This method needs to be overridden!"); + } + + @Override + public void setSkeleton(org.ccsds.moims.mo.common.directory.provider.DirectorySkeleton skeleton) { + // Not used in the inheritance pattern (the skeleton is 'this'); + } + + @Override + public void malInitialize(org.ccsds.moims.mo.mal.provider.MALProvider provider) throws org.ccsds.moims.mo.mal.MALException { + providerSet.addProvider(provider); + } + + @Override + public void malFinalize(org.ccsds.moims.mo.mal.provider.MALProvider provider) throws org.ccsds.moims.mo.mal.MALException { + providerSet.removeProvider(provider); + } + + @Override + public void handleSend(org.ccsds.moims.mo.mal.provider.MALInteraction interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + switch (opNumber) { + default: + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } + + @Override + public void handleSubmit(org.ccsds.moims.mo.mal.provider.MALSubmit interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + try { + switch (opNumber) { + case org.ccsds.moims.mo.common.directory.DirectoryServiceInfo._WITHDRAWPROVIDER_OP_NUMBER: + withdrawProvider((body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.Union(Long.MAX_VALUE)) == null) ? null : ((org.ccsds.moims.mo.mal.structures.Union) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.Union(Long.MAX_VALUE))).getLongValue(), + interaction); + interaction.sendAcknowledgement(); + break; + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } catch (org.ccsds.moims.mo.mal.MOErrorException error) { + throw new org.ccsds.moims.mo.mal.MALInteractionException(error); + } + } + + @Override + public void handleRequest(org.ccsds.moims.mo.mal.provider.MALRequest interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + try { + switch (opNumber) { + case org.ccsds.moims.mo.common.directory.DirectoryServiceInfo._LOOKUPPROVIDER_OP_NUMBER: + interaction.sendResponse(lookupProvider((org.ccsds.moims.mo.common.directory.structures.ServiceFilter) body.getBodyElement(0, new org.ccsds.moims.mo.common.directory.structures.ServiceFilter()), + interaction)); + break; + case org.ccsds.moims.mo.common.directory.DirectoryServiceInfo._PUBLISHPROVIDER_OP_NUMBER: + org.ccsds.moims.mo.common.directory.body.PublishProviderResponse publishProviderRt = publishProvider((org.ccsds.moims.mo.common.directory.structures.PublishDetails) body.getBodyElement(0, new org.ccsds.moims.mo.common.directory.structures.PublishDetails()), + interaction); + interaction.sendResponse( + (publishProviderRt.getProviderObjId() == null) ? null : new org.ccsds.moims.mo.mal.structures.Union(publishProviderRt.getProviderObjId()), + (publishProviderRt.getCapabilitiesObjId() == null) ? null : new org.ccsds.moims.mo.mal.structures.Union(publishProviderRt.getCapabilitiesObjId()) + ); + break; + case org.ccsds.moims.mo.common.directory.DirectoryServiceInfo._GETSERVICEXML_OP_NUMBER: + interaction.sendResponse(getServiceXML((body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.Union(Long.MAX_VALUE)) == null) ? null : ((org.ccsds.moims.mo.mal.structures.Union) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.Union(Long.MAX_VALUE))).getLongValue(), + interaction)); + break; + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } catch (org.ccsds.moims.mo.mal.MOErrorException error) { + throw new org.ccsds.moims.mo.mal.MALInteractionException(error); + } + } + + @Override + public void handleInvoke(org.ccsds.moims.mo.mal.provider.MALInvoke interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + switch (opNumber) { + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } + + @Override + public void handleProgress(org.ccsds.moims.mo.mal.provider.MALProgress interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + switch (opNumber) { + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/provider/DirectorySkeleton.java b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/provider/DirectorySkeleton.java new file mode 100644 index 00000000..74ac9484 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/provider/DirectorySkeleton.java @@ -0,0 +1,8 @@ +package org.ccsds.moims.mo.common.directory.provider; + +/** + * The skeleton interface for the Directory service. + */ +public interface DirectorySkeleton { + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/provider/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/provider/package-info.java new file mode 100644 index 00000000..43ac7f38 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/provider/package-info.java @@ -0,0 +1,4 @@ +/** + * Package containing the provider skeletons for the Directory service. +*/ +package org.ccsds.moims.mo.common.directory.provider; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/structures/AddressDetails.java b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/structures/AddressDetails.java new file mode 100644 index 00000000..42fe1b71 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/structures/AddressDetails.java @@ -0,0 +1,285 @@ +package org.ccsds.moims.mo.common.directory.structures; + +/** + * The AddressDetails structure holds all information required by the Directory + * service about a service providers URI and attributes relating to QoS. + */ +public final class AddressDetails implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 844429241876484L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 844429241876484L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * The set of possible QoS levels this service can provide. + */ + private org.ccsds.moims.mo.mal.structures.QoSLevelList supportedLevels; + + /** + * Any QoS properties relevant to this address URIs and the specified transport. + */ + private org.ccsds.moims.mo.mal.structures.NamedValueList QoSproperties; + + /** + * The number of QoS priority levels that this provider supports. + */ + private org.ccsds.moims.mo.mal.structures.UInteger priorityLevels; + + /** + * The Service URI that identifies the physical location of this service. + * NULL if represents a shared data provider (Broker). + */ + private org.ccsds.moims.mo.mal.structures.URI serviceURI; + + /** + * The broker URI that identifies the physical location of the publish and + * subscribe interface. NULL if service does not use publish and subscribe + * operations or if a shared broker is to be used. + */ + private org.ccsds.moims.mo.mal.structures.URI brokerURI; + + /** + * The object instance identifier of a ServiceProvider COM object that is + * the shared broker used by this provider. + */ + private Long brokerProviderObjInstId; + + /** + * Default constructor for AddressDetails. + * + */ + public AddressDetails() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param supportedLevels The set of possible QoS levels this service can provide. + * @param QoSproperties Any QoS properties relevant to this address URIs and the specified transport. + * @param priorityLevels The number of QoS priority levels that this provider supports. + * @param serviceURI The Service URI that identifies the physical location of this service. NULL if represents a shared data provider (Broker). + * @param brokerURI The broker URI that identifies the physical location of the publish and subscribe interface. NULL if service does not use publish and subscribe operations or if a shared broker is to be used. + * @param brokerProviderObjInstId The object instance identifier of a ServiceProvider COM object that is the shared broker used by this provider. + */ + public AddressDetails(org.ccsds.moims.mo.mal.structures.QoSLevelList supportedLevels, + org.ccsds.moims.mo.mal.structures.NamedValueList QoSproperties, + org.ccsds.moims.mo.mal.structures.UInteger priorityLevels, + org.ccsds.moims.mo.mal.structures.URI serviceURI, + org.ccsds.moims.mo.mal.structures.URI brokerURI, + Long brokerProviderObjInstId) { + this.supportedLevels = supportedLevels; + this.QoSproperties = QoSproperties; + this.priorityLevels = priorityLevels; + this.serviceURI = serviceURI; + this.brokerURI = brokerURI; + this.brokerProviderObjInstId = brokerProviderObjInstId; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param supportedLevels The set of possible QoS levels this service can provide. + * @param QoSproperties Any QoS properties relevant to this address URIs and the specified transport. + * @param priorityLevels The number of QoS priority levels that this provider supports. + */ + public AddressDetails(org.ccsds.moims.mo.mal.structures.QoSLevelList supportedLevels, + org.ccsds.moims.mo.mal.structures.NamedValueList QoSproperties, + org.ccsds.moims.mo.mal.structures.UInteger priorityLevels) { + this.supportedLevels = supportedLevels; + this.QoSproperties = QoSproperties; + this.priorityLevels = priorityLevels; + this.serviceURI = null; + this.brokerURI = null; + this.brokerProviderObjInstId = null; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.common.directory.structures.AddressDetails(); + } + + /** + * Returns the field supportedLevels. + * + * @return The field supportedLevels + */ + public org.ccsds.moims.mo.mal.structures.QoSLevelList getSupportedLevels() { + return supportedLevels; + } + + /** + * Returns the field QoSproperties. + * + * @return The field QoSproperties + */ + public org.ccsds.moims.mo.mal.structures.NamedValueList getQoSproperties() { + return QoSproperties; + } + + /** + * Returns the field priorityLevels. + * + * @return The field priorityLevels + */ + public org.ccsds.moims.mo.mal.structures.UInteger getPriorityLevels() { + return priorityLevels; + } + + /** + * Returns the field serviceURI. + * + * @return The field serviceURI + */ + public org.ccsds.moims.mo.mal.structures.URI getServiceURI() { + return serviceURI; + } + + /** + * Returns the field brokerURI. + * + * @return The field brokerURI + */ + public org.ccsds.moims.mo.mal.structures.URI getBrokerURI() { + return brokerURI; + } + + /** + * Returns the field brokerProviderObjInstId. + * + * @return The field brokerProviderObjInstId + */ + public Long getBrokerProviderObjInstId() { + return brokerProviderObjInstId; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof AddressDetails) { + AddressDetails other = (AddressDetails) obj; + if (supportedLevels == null) { + if (other.supportedLevels != null) { + return false; + } + } else { + if (! supportedLevels.equals(other.supportedLevels)) { + return false; + } + } + if (QoSproperties == null) { + if (other.QoSproperties != null) { + return false; + } + } else { + if (! QoSproperties.equals(other.QoSproperties)) { + return false; + } + } + if (priorityLevels == null) { + if (other.priorityLevels != null) { + return false; + } + } else { + if (! priorityLevels.equals(other.priorityLevels)) { + return false; + } + } + if (serviceURI == null) { + if (other.serviceURI != null) { + return false; + } + } else { + if (! serviceURI.equals(other.serviceURI)) { + return false; + } + } + if (brokerURI == null) { + if (other.brokerURI != null) { + return false; + } + } else { + if (! brokerURI.equals(other.brokerURI)) { + return false; + } + } + if (brokerProviderObjInstId == null) { + if (other.brokerProviderObjInstId != null) { + return false; + } + } else { + if (! brokerProviderObjInstId.equals(other.brokerProviderObjInstId)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (supportedLevels != null ? supportedLevels.hashCode() : 0); + hash = 83 * hash + (QoSproperties != null ? QoSproperties.hashCode() : 0); + hash = 83 * hash + (priorityLevels != null ? priorityLevels.hashCode() : 0); + hash = 83 * hash + (serviceURI != null ? serviceURI.hashCode() : 0); + hash = 83 * hash + (brokerURI != null ? brokerURI.hashCode() : 0); + hash = 83 * hash + (brokerProviderObjInstId != null ? brokerProviderObjInstId.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(AddressDetails: "); + buf.append("supportedLevels=").append(supportedLevels); + buf.append(", QoSproperties=").append(QoSproperties); + buf.append(", priorityLevels=").append(priorityLevels); + buf.append(", serviceURI=").append(serviceURI); + buf.append(", brokerURI=").append(brokerURI); + buf.append(", brokerProviderObjInstId=").append(brokerProviderObjInstId); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (supportedLevels == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'supportedLevels' cannot be null!"); + } + if (QoSproperties == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'QoSproperties' cannot be null!"); + } + if (priorityLevels == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'priorityLevels' cannot be null!"); + } + encoder.encodeElement(supportedLevels); + encoder.encodeElement(QoSproperties); + encoder.encodeUInteger(priorityLevels); + encoder.encodeNullableURI(serviceURI); + encoder.encodeNullableURI(brokerURI); + encoder.encodeNullableLong(brokerProviderObjInstId); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + supportedLevels = (org.ccsds.moims.mo.mal.structures.QoSLevelList) decoder.decodeElement(new org.ccsds.moims.mo.mal.structures.QoSLevelList()); + QoSproperties = (org.ccsds.moims.mo.mal.structures.NamedValueList) decoder.decodeElement(new org.ccsds.moims.mo.mal.structures.NamedValueList()); + priorityLevels = decoder.decodeUInteger(); + serviceURI = decoder.decodeNullableURI(); + brokerURI = decoder.decodeNullableURI(); + brokerProviderObjInstId = decoder.decodeNullableLong(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/structures/AddressDetailsList.java b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/structures/AddressDetailsList.java new file mode 100644 index 00000000..5e6200dc --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/structures/AddressDetailsList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.common.directory.structures; + +/** + * List class for AddressDetails. + */ +public final class AddressDetailsList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 844429258653692L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 844429258653692L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for AddressDetailsList. + * + */ + public AddressDetailsList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public AddressDetailsList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public AddressDetailsList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.common.directory.structures.AddressDetails element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.common.directory.structures.AddressDetails element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new AddressDetailsList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.common.directory.structures.AddressDetails(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/structures/ProviderDetails.java b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/structures/ProviderDetails.java new file mode 100644 index 00000000..a9cc9ee5 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/structures/ProviderDetails.java @@ -0,0 +1,146 @@ +package org.ccsds.moims.mo.common.directory.structures; + +/** + * The ProviderDetails structure holds information about a provider of a service + * and its capabilities. The structure contains a list of AddressDetails structures + * which should be used when the individual services listed by the provider + * do not supply address information. A provider may support more than one + * transport technology and therefore can be reached using more than one address. + */ +public final class ProviderDetails implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 844429241876481L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 844429241876481L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * The service capabilities supported by this service provider. + */ + private org.ccsds.moims.mo.common.directory.structures.ServiceCapabilityList serviceCapabilities; + + /** + * List of addresses for all services of this service provider unless service + * specific addresses are supplied in the serviceCapabilities field. If all + * address information is supplied in the serviceCapabilities field this list + * should be zero length. + */ + private org.ccsds.moims.mo.common.directory.structures.AddressDetailsList providerAddresses; + + /** + * Default constructor for ProviderDetails. + * + */ + public ProviderDetails() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param serviceCapabilities The service capabilities supported by this service provider + * @param providerAddresses List of addresses for all services of this service provider unless service specific addresses are supplied in the serviceCapabilities field. If all address information is supplied in the serviceCapabilities field this list should be zero length. + */ + public ProviderDetails(org.ccsds.moims.mo.common.directory.structures.ServiceCapabilityList serviceCapabilities, + org.ccsds.moims.mo.common.directory.structures.AddressDetailsList providerAddresses) { + this.serviceCapabilities = serviceCapabilities; + this.providerAddresses = providerAddresses; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.common.directory.structures.ProviderDetails(); + } + + /** + * Returns the field serviceCapabilities. + * + * @return The field serviceCapabilities + */ + public org.ccsds.moims.mo.common.directory.structures.ServiceCapabilityList getServiceCapabilities() { + return serviceCapabilities; + } + + /** + * Returns the field providerAddresses. + * + * @return The field providerAddresses + */ + public org.ccsds.moims.mo.common.directory.structures.AddressDetailsList getProviderAddresses() { + return providerAddresses; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ProviderDetails) { + ProviderDetails other = (ProviderDetails) obj; + if (serviceCapabilities == null) { + if (other.serviceCapabilities != null) { + return false; + } + } else { + if (! serviceCapabilities.equals(other.serviceCapabilities)) { + return false; + } + } + if (providerAddresses == null) { + if (other.providerAddresses != null) { + return false; + } + } else { + if (! providerAddresses.equals(other.providerAddresses)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (serviceCapabilities != null ? serviceCapabilities.hashCode() : 0); + hash = 83 * hash + (providerAddresses != null ? providerAddresses.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(ProviderDetails: "); + buf.append("serviceCapabilities=").append(serviceCapabilities); + buf.append(", providerAddresses=").append(providerAddresses); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (serviceCapabilities == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'serviceCapabilities' cannot be null!"); + } + if (providerAddresses == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'providerAddresses' cannot be null!"); + } + encoder.encodeElement(serviceCapabilities); + encoder.encodeElement(providerAddresses); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + serviceCapabilities = (org.ccsds.moims.mo.common.directory.structures.ServiceCapabilityList) decoder.decodeElement(new org.ccsds.moims.mo.common.directory.structures.ServiceCapabilityList()); + providerAddresses = (org.ccsds.moims.mo.common.directory.structures.AddressDetailsList) decoder.decodeElement(new org.ccsds.moims.mo.common.directory.structures.AddressDetailsList()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/structures/ProviderDetailsList.java b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/structures/ProviderDetailsList.java new file mode 100644 index 00000000..5597081f --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/structures/ProviderDetailsList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.common.directory.structures; + +/** + * List class for ProviderDetails. + */ +public final class ProviderDetailsList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 844429258653695L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 844429258653695L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for ProviderDetailsList. + * + */ + public ProviderDetailsList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public ProviderDetailsList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public ProviderDetailsList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.common.directory.structures.ProviderDetails element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.common.directory.structures.ProviderDetails element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new ProviderDetailsList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.common.directory.structures.ProviderDetails(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/structures/ProviderSummary.java b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/structures/ProviderSummary.java new file mode 100644 index 00000000..0b8cd769 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/structures/ProviderSummary.java @@ -0,0 +1,173 @@ +package org.ccsds.moims.mo.common.directory.structures; + +/** + * The ProviderSummary structure holds information about a provider of a service + * and its capabilities. + */ +public final class ProviderSummary implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 844429241876485L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 844429241876485L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * The COM object key of this service provider. + */ + private org.ccsds.moims.mo.com.structures.ObjectKey providerKey; + + /** + * The id of this service provider. + */ + private org.ccsds.moims.mo.mal.structures.Identifier providerId; + + /** + * The service capabilities supported by this provider. + */ + private org.ccsds.moims.mo.common.directory.structures.ProviderDetails providerDetails; + + /** + * Default constructor for ProviderSummary. + * + */ + public ProviderSummary() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param providerKey The COM object key of this service provider + * @param providerId The id of this service provider. + * @param providerDetails The service capabilities supported by this provider + */ + public ProviderSummary(org.ccsds.moims.mo.com.structures.ObjectKey providerKey, + org.ccsds.moims.mo.mal.structures.Identifier providerId, + org.ccsds.moims.mo.common.directory.structures.ProviderDetails providerDetails) { + this.providerKey = providerKey; + this.providerId = providerId; + this.providerDetails = providerDetails; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.common.directory.structures.ProviderSummary(); + } + + /** + * Returns the field providerKey. + * + * @return The field providerKey + */ + public org.ccsds.moims.mo.com.structures.ObjectKey getProviderKey() { + return providerKey; + } + + /** + * Returns the field providerId. + * + * @return The field providerId + */ + public org.ccsds.moims.mo.mal.structures.Identifier getProviderId() { + return providerId; + } + + /** + * Returns the field providerDetails. + * + * @return The field providerDetails + */ + public org.ccsds.moims.mo.common.directory.structures.ProviderDetails getProviderDetails() { + return providerDetails; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ProviderSummary) { + ProviderSummary other = (ProviderSummary) obj; + if (providerKey == null) { + if (other.providerKey != null) { + return false; + } + } else { + if (! providerKey.equals(other.providerKey)) { + return false; + } + } + if (providerId == null) { + if (other.providerId != null) { + return false; + } + } else { + if (! providerId.equals(other.providerId)) { + return false; + } + } + if (providerDetails == null) { + if (other.providerDetails != null) { + return false; + } + } else { + if (! providerDetails.equals(other.providerDetails)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (providerKey != null ? providerKey.hashCode() : 0); + hash = 83 * hash + (providerId != null ? providerId.hashCode() : 0); + hash = 83 * hash + (providerDetails != null ? providerDetails.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(ProviderSummary: "); + buf.append("providerKey=").append(providerKey); + buf.append(", providerId=").append(providerId); + buf.append(", providerDetails=").append(providerDetails); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (providerKey == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'providerKey' cannot be null!"); + } + if (providerId == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'providerId' cannot be null!"); + } + if (providerDetails == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'providerDetails' cannot be null!"); + } + encoder.encodeElement(providerKey); + encoder.encodeIdentifier(providerId); + encoder.encodeElement(providerDetails); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + providerKey = (org.ccsds.moims.mo.com.structures.ObjectKey) decoder.decodeElement(new org.ccsds.moims.mo.com.structures.ObjectKey()); + providerId = decoder.decodeIdentifier(); + providerDetails = (org.ccsds.moims.mo.common.directory.structures.ProviderDetails) decoder.decodeElement(new org.ccsds.moims.mo.common.directory.structures.ProviderDetails()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/structures/ProviderSummaryList.java b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/structures/ProviderSummaryList.java new file mode 100644 index 00000000..2ce6a55b --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/structures/ProviderSummaryList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.common.directory.structures; + +/** + * List class for ProviderSummary. + */ +public final class ProviderSummaryList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 844429258653691L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 844429258653691L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for ProviderSummaryList. + * + */ + public ProviderSummaryList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public ProviderSummaryList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public ProviderSummaryList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.common.directory.structures.ProviderSummary element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.common.directory.structures.ProviderSummary element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new ProviderSummaryList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.common.directory.structures.ProviderSummary(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/structures/PublishDetails.java b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/structures/PublishDetails.java new file mode 100644 index 00000000..0bb55f67 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/structures/PublishDetails.java @@ -0,0 +1,324 @@ +package org.ccsds.moims.mo.common.directory.structures; + +/** + * The PublishDetails structure holds all the required information to publish + * new service provider details. + */ +public final class PublishDetails implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 844429241876486L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 844429241876486L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * The unique service provider id; allows multiple service providers of the + * same service type to coexist in the directory service. + */ + private org.ccsds.moims.mo.mal.structures.Identifier providerId; + + /** + * The domain of the provider. + */ + private org.ccsds.moims.mo.mal.structures.IdentifierList domain; + + /** + * The type of session of the provider. + */ + private org.ccsds.moims.mo.mal.structures.SessionType sessionType; + + /** + * If this is part of a replay session, this field holds the session name + * of the source session. NULL otherwise. + */ + private org.ccsds.moims.mo.mal.structures.Identifier sourceSessionName; + + /** + * The network of the provider. + */ + private org.ccsds.moims.mo.mal.structures.Identifier network; + + /** + * The new service provider details. + */ + private org.ccsds.moims.mo.common.directory.structures.ProviderDetails providerDetails; + + /** + * The optional XML files to associate with this provider. + */ + private org.ccsds.moims.mo.mal.structures.FileList serviceXML; + + /** + * Default constructor for PublishDetails. + * + */ + public PublishDetails() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param providerId The unique service provider id; allows multiple service providers of the same service type to coexist in the directory service. + * @param domain The domain of the provider. + * @param sessionType The type of session of the provider. + * @param sourceSessionName If this is part of a replay session, this field holds the session name of the source session. NULL otherwise + * @param network The network of the provider. + * @param providerDetails The new service provider details. + * @param serviceXML The optional XML files to associate with this provider. + */ + public PublishDetails(org.ccsds.moims.mo.mal.structures.Identifier providerId, + org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.SessionType sessionType, + org.ccsds.moims.mo.mal.structures.Identifier sourceSessionName, + org.ccsds.moims.mo.mal.structures.Identifier network, + org.ccsds.moims.mo.common.directory.structures.ProviderDetails providerDetails, + org.ccsds.moims.mo.mal.structures.FileList serviceXML) { + this.providerId = providerId; + this.domain = domain; + this.sessionType = sessionType; + this.sourceSessionName = sourceSessionName; + this.network = network; + this.providerDetails = providerDetails; + this.serviceXML = serviceXML; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param providerId The unique service provider id; allows multiple service providers of the same service type to coexist in the directory service. + * @param domain The domain of the provider. + * @param sessionType The type of session of the provider. + * @param network The network of the provider. + * @param providerDetails The new service provider details. + */ + public PublishDetails(org.ccsds.moims.mo.mal.structures.Identifier providerId, + org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.SessionType sessionType, + org.ccsds.moims.mo.mal.structures.Identifier network, + org.ccsds.moims.mo.common.directory.structures.ProviderDetails providerDetails) { + this.providerId = providerId; + this.domain = domain; + this.sessionType = sessionType; + this.sourceSessionName = null; + this.network = network; + this.providerDetails = providerDetails; + this.serviceXML = null; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.common.directory.structures.PublishDetails(); + } + + /** + * Returns the field providerId. + * + * @return The field providerId + */ + public org.ccsds.moims.mo.mal.structures.Identifier getProviderId() { + return providerId; + } + + /** + * Returns the field domain. + * + * @return The field domain + */ + public org.ccsds.moims.mo.mal.structures.IdentifierList getDomain() { + return domain; + } + + /** + * Returns the field sessionType. + * + * @return The field sessionType + */ + public org.ccsds.moims.mo.mal.structures.SessionType getSessionType() { + return sessionType; + } + + /** + * Returns the field sourceSessionName. + * + * @return The field sourceSessionName + */ + public org.ccsds.moims.mo.mal.structures.Identifier getSourceSessionName() { + return sourceSessionName; + } + + /** + * Returns the field network. + * + * @return The field network + */ + public org.ccsds.moims.mo.mal.structures.Identifier getNetwork() { + return network; + } + + /** + * Returns the field providerDetails. + * + * @return The field providerDetails + */ + public org.ccsds.moims.mo.common.directory.structures.ProviderDetails getProviderDetails() { + return providerDetails; + } + + /** + * Returns the field serviceXML. + * + * @return The field serviceXML + */ + public org.ccsds.moims.mo.mal.structures.FileList getServiceXML() { + return serviceXML; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof PublishDetails) { + PublishDetails other = (PublishDetails) obj; + if (providerId == null) { + if (other.providerId != null) { + return false; + } + } else { + if (! providerId.equals(other.providerId)) { + return false; + } + } + if (domain == null) { + if (other.domain != null) { + return false; + } + } else { + if (! domain.equals(other.domain)) { + return false; + } + } + if (sessionType == null) { + if (other.sessionType != null) { + return false; + } + } else { + if (! sessionType.equals(other.sessionType)) { + return false; + } + } + if (sourceSessionName == null) { + if (other.sourceSessionName != null) { + return false; + } + } else { + if (! sourceSessionName.equals(other.sourceSessionName)) { + return false; + } + } + if (network == null) { + if (other.network != null) { + return false; + } + } else { + if (! network.equals(other.network)) { + return false; + } + } + if (providerDetails == null) { + if (other.providerDetails != null) { + return false; + } + } else { + if (! providerDetails.equals(other.providerDetails)) { + return false; + } + } + if (serviceXML == null) { + if (other.serviceXML != null) { + return false; + } + } else { + if (! serviceXML.equals(other.serviceXML)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (providerId != null ? providerId.hashCode() : 0); + hash = 83 * hash + (domain != null ? domain.hashCode() : 0); + hash = 83 * hash + (sessionType != null ? sessionType.hashCode() : 0); + hash = 83 * hash + (sourceSessionName != null ? sourceSessionName.hashCode() : 0); + hash = 83 * hash + (network != null ? network.hashCode() : 0); + hash = 83 * hash + (providerDetails != null ? providerDetails.hashCode() : 0); + hash = 83 * hash + (serviceXML != null ? serviceXML.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(PublishDetails: "); + buf.append("providerId=").append(providerId); + buf.append(", domain=").append(domain); + buf.append(", sessionType=").append(sessionType); + buf.append(", sourceSessionName=").append(sourceSessionName); + buf.append(", network=").append(network); + buf.append(", providerDetails=").append(providerDetails); + buf.append(", serviceXML=").append(serviceXML); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (providerId == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'providerId' cannot be null!"); + } + if (domain == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'domain' cannot be null!"); + } + if (sessionType == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'sessionType' cannot be null!"); + } + if (network == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'network' cannot be null!"); + } + if (providerDetails == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'providerDetails' cannot be null!"); + } + encoder.encodeIdentifier(providerId); + encoder.encodeElement(domain); + encoder.encodeElement(sessionType); + encoder.encodeNullableIdentifier(sourceSessionName); + encoder.encodeIdentifier(network); + encoder.encodeElement(providerDetails); + encoder.encodeNullableElement(serviceXML); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + providerId = decoder.decodeIdentifier(); + domain = (org.ccsds.moims.mo.mal.structures.IdentifierList) decoder.decodeElement(new org.ccsds.moims.mo.mal.structures.IdentifierList()); + sessionType = (org.ccsds.moims.mo.mal.structures.SessionType) decoder.decodeElement(org.ccsds.moims.mo.mal.structures.SessionType.LIVE); + sourceSessionName = decoder.decodeNullableIdentifier(); + network = decoder.decodeIdentifier(); + providerDetails = (org.ccsds.moims.mo.common.directory.structures.ProviderDetails) decoder.decodeElement(new org.ccsds.moims.mo.common.directory.structures.ProviderDetails()); + serviceXML = (org.ccsds.moims.mo.mal.structures.FileList) decoder.decodeNullableElement(new org.ccsds.moims.mo.mal.structures.FileList()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/structures/PublishDetailsList.java b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/structures/PublishDetailsList.java new file mode 100644 index 00000000..0821fcf8 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/structures/PublishDetailsList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.common.directory.structures; + +/** + * List class for PublishDetails. + */ +public final class PublishDetailsList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 844429258653690L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 844429258653690L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for PublishDetailsList. + * + */ + public PublishDetailsList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public PublishDetailsList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public PublishDetailsList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.common.directory.structures.PublishDetails element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.common.directory.structures.PublishDetails element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new PublishDetailsList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.common.directory.structures.PublishDetails(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/structures/ServiceCapability.java b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/structures/ServiceCapability.java new file mode 100644 index 00000000..c351f302 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/structures/ServiceCapability.java @@ -0,0 +1,213 @@ +package org.ccsds.moims.mo.common.directory.structures; + +/** + * The ServiceCapability structure holds information about a service and the + * capabilities offered by a provider. + */ +public final class ServiceCapability implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 844429241876482L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 844429241876482L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * The area, service, and version fields. + */ + private org.ccsds.moims.mo.common.structures.ServiceKey serviceKey; + + /** + * The supported capability set numbers for this service provider. If NULL + * then all capability sets supported. + */ + private org.ccsds.moims.mo.mal.structures.UShortList supportedCapabilitySets; + + /** + * Allows the passing of deployment specific service properties. + */ + private org.ccsds.moims.mo.mal.structures.NamedValueList serviceProperties; + + /** + * Optional set of address details for this specific service which shall be + * used instead of the provider ones when accessing this service. If all address + * information is supplied in the containing ProviderDetails structure field + * this list should be replaced with a NULL. + */ + private org.ccsds.moims.mo.common.directory.structures.AddressDetailsList serviceAddresses; + + /** + * Default constructor for ServiceCapability. + * + */ + public ServiceCapability() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param serviceKey The area, service, and version fields. + * @param supportedCapabilitySets The supported capability set numbers for this service provider. If NULL then all capability sets supported. + * @param serviceProperties Allows the passing of deployment specific service properties. + * @param serviceAddresses Optional set of address details for this specific service which shall be used instead of the provider ones when accessing this service. If all address information is supplied in the containing ProviderDetails structure field this list should be replaced with a NULL. + */ + public ServiceCapability(org.ccsds.moims.mo.common.structures.ServiceKey serviceKey, + org.ccsds.moims.mo.mal.structures.UShortList supportedCapabilitySets, + org.ccsds.moims.mo.mal.structures.NamedValueList serviceProperties, + org.ccsds.moims.mo.common.directory.structures.AddressDetailsList serviceAddresses) { + this.serviceKey = serviceKey; + this.supportedCapabilitySets = supportedCapabilitySets; + this.serviceProperties = serviceProperties; + this.serviceAddresses = serviceAddresses; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param serviceKey The area, service, and version fields. + */ + public ServiceCapability(org.ccsds.moims.mo.common.structures.ServiceKey serviceKey) { + this.serviceKey = serviceKey; + this.supportedCapabilitySets = null; + this.serviceProperties = null; + this.serviceAddresses = null; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.common.directory.structures.ServiceCapability(); + } + + /** + * Returns the field serviceKey. + * + * @return The field serviceKey + */ + public org.ccsds.moims.mo.common.structures.ServiceKey getServiceKey() { + return serviceKey; + } + + /** + * Returns the field supportedCapabilitySets. + * + * @return The field supportedCapabilitySets + */ + public org.ccsds.moims.mo.mal.structures.UShortList getSupportedCapabilitySets() { + return supportedCapabilitySets; + } + + /** + * Returns the field serviceProperties. + * + * @return The field serviceProperties + */ + public org.ccsds.moims.mo.mal.structures.NamedValueList getServiceProperties() { + return serviceProperties; + } + + /** + * Returns the field serviceAddresses. + * + * @return The field serviceAddresses + */ + public org.ccsds.moims.mo.common.directory.structures.AddressDetailsList getServiceAddresses() { + return serviceAddresses; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ServiceCapability) { + ServiceCapability other = (ServiceCapability) obj; + if (serviceKey == null) { + if (other.serviceKey != null) { + return false; + } + } else { + if (! serviceKey.equals(other.serviceKey)) { + return false; + } + } + if (supportedCapabilitySets == null) { + if (other.supportedCapabilitySets != null) { + return false; + } + } else { + if (! supportedCapabilitySets.equals(other.supportedCapabilitySets)) { + return false; + } + } + if (serviceProperties == null) { + if (other.serviceProperties != null) { + return false; + } + } else { + if (! serviceProperties.equals(other.serviceProperties)) { + return false; + } + } + if (serviceAddresses == null) { + if (other.serviceAddresses != null) { + return false; + } + } else { + if (! serviceAddresses.equals(other.serviceAddresses)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (serviceKey != null ? serviceKey.hashCode() : 0); + hash = 83 * hash + (supportedCapabilitySets != null ? supportedCapabilitySets.hashCode() : 0); + hash = 83 * hash + (serviceProperties != null ? serviceProperties.hashCode() : 0); + hash = 83 * hash + (serviceAddresses != null ? serviceAddresses.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(ServiceCapability: "); + buf.append("serviceKey=").append(serviceKey); + buf.append(", supportedCapabilitySets=").append(supportedCapabilitySets); + buf.append(", serviceProperties=").append(serviceProperties); + buf.append(", serviceAddresses=").append(serviceAddresses); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (serviceKey == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'serviceKey' cannot be null!"); + } + encoder.encodeElement(serviceKey); + encoder.encodeNullableElement(supportedCapabilitySets); + encoder.encodeNullableElement(serviceProperties); + encoder.encodeNullableElement(serviceAddresses); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + serviceKey = (org.ccsds.moims.mo.common.structures.ServiceKey) decoder.decodeElement(new org.ccsds.moims.mo.common.structures.ServiceKey()); + supportedCapabilitySets = (org.ccsds.moims.mo.mal.structures.UShortList) decoder.decodeNullableElement(new org.ccsds.moims.mo.mal.structures.UShortList()); + serviceProperties = (org.ccsds.moims.mo.mal.structures.NamedValueList) decoder.decodeNullableElement(new org.ccsds.moims.mo.mal.structures.NamedValueList()); + serviceAddresses = (org.ccsds.moims.mo.common.directory.structures.AddressDetailsList) decoder.decodeNullableElement(new org.ccsds.moims.mo.common.directory.structures.AddressDetailsList()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/structures/ServiceCapabilityList.java b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/structures/ServiceCapabilityList.java new file mode 100644 index 00000000..33a3fdf3 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/structures/ServiceCapabilityList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.common.directory.structures; + +/** + * List class for ServiceCapability. + */ +public final class ServiceCapabilityList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 844429258653694L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 844429258653694L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for ServiceCapabilityList. + * + */ + public ServiceCapabilityList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public ServiceCapabilityList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public ServiceCapabilityList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.common.directory.structures.ServiceCapability element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.common.directory.structures.ServiceCapability element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new ServiceCapabilityList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.common.directory.structures.ServiceCapability(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/structures/ServiceFilter.java b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/structures/ServiceFilter.java new file mode 100644 index 00000000..578b2721 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/structures/ServiceFilter.java @@ -0,0 +1,285 @@ +package org.ccsds.moims.mo.common.directory.structures; + +/** + * The ServiceFilter structure holds all information required by the Directory + * service for service lookup operation. The field filters are AND"d + * together. + */ +public final class ServiceFilter implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 844429241876487L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 844429241876487L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * The required service provider. Can be NULL in which case matches all values. + */ + private org.ccsds.moims.mo.mal.structures.Identifier serviceProviderId; + + /** + * The domain to query. Can be NULL in which case matches all values. + */ + private org.ccsds.moims.mo.mal.structures.IdentifierList domain; + + /** + * The network to match. Can be NULL in which case matches all values. + */ + private org.ccsds.moims.mo.mal.structures.Identifier network; + + /** + * The session type to match. Can be NULL in which case matches all values. + */ + private org.ccsds.moims.mo.mal.structures.SessionType sessionType; + + /** + * The session name to match. Can be NULL in which case matches all values. + */ + private org.ccsds.moims.mo.mal.structures.Identifier sessionName; + + /** + * The service to filter on, values can be NULL which matches all values. + */ + private org.ccsds.moims.mo.common.structures.ServiceKey serviceKey; + + /** + * List of required capability sets. If NULL then matches any. + */ + private org.ccsds.moims.mo.mal.structures.UShortList requiredCapabilitySets; + + /** + * Default constructor for ServiceFilter. + * + */ + public ServiceFilter() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param serviceProviderId The required service provider. Can be NULL in which case matches all values. + * @param domain The domain to query. Can be NULL in which case matches all values. + * @param network The network to match. Can be NULL in which case matches all values. + * @param sessionType The session type to match. Can be NULL in which case matches all values. + * @param sessionName The session name to match. Can be NULL in which case matches all values. + * @param serviceKey The service to filter on, values can be NULL which matches all values. + * @param requiredCapabilitySets List of required capability sets. If NULL then matches any. + */ + public ServiceFilter(org.ccsds.moims.mo.mal.structures.Identifier serviceProviderId, + org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.Identifier network, + org.ccsds.moims.mo.mal.structures.SessionType sessionType, + org.ccsds.moims.mo.mal.structures.Identifier sessionName, + org.ccsds.moims.mo.common.structures.ServiceKey serviceKey, + org.ccsds.moims.mo.mal.structures.UShortList requiredCapabilitySets) { + this.serviceProviderId = serviceProviderId; + this.domain = domain; + this.network = network; + this.sessionType = sessionType; + this.sessionName = sessionName; + this.serviceKey = serviceKey; + this.requiredCapabilitySets = requiredCapabilitySets; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.common.directory.structures.ServiceFilter(); + } + + /** + * Returns the field serviceProviderId. + * + * @return The field serviceProviderId + */ + public org.ccsds.moims.mo.mal.structures.Identifier getServiceProviderId() { + return serviceProviderId; + } + + /** + * Returns the field domain. + * + * @return The field domain + */ + public org.ccsds.moims.mo.mal.structures.IdentifierList getDomain() { + return domain; + } + + /** + * Returns the field network. + * + * @return The field network + */ + public org.ccsds.moims.mo.mal.structures.Identifier getNetwork() { + return network; + } + + /** + * Returns the field sessionType. + * + * @return The field sessionType + */ + public org.ccsds.moims.mo.mal.structures.SessionType getSessionType() { + return sessionType; + } + + /** + * Returns the field sessionName. + * + * @return The field sessionName + */ + public org.ccsds.moims.mo.mal.structures.Identifier getSessionName() { + return sessionName; + } + + /** + * Returns the field serviceKey. + * + * @return The field serviceKey + */ + public org.ccsds.moims.mo.common.structures.ServiceKey getServiceKey() { + return serviceKey; + } + + /** + * Returns the field requiredCapabilitySets. + * + * @return The field requiredCapabilitySets + */ + public org.ccsds.moims.mo.mal.structures.UShortList getRequiredCapabilitySets() { + return requiredCapabilitySets; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ServiceFilter) { + ServiceFilter other = (ServiceFilter) obj; + if (serviceProviderId == null) { + if (other.serviceProviderId != null) { + return false; + } + } else { + if (! serviceProviderId.equals(other.serviceProviderId)) { + return false; + } + } + if (domain == null) { + if (other.domain != null) { + return false; + } + } else { + if (! domain.equals(other.domain)) { + return false; + } + } + if (network == null) { + if (other.network != null) { + return false; + } + } else { + if (! network.equals(other.network)) { + return false; + } + } + if (sessionType == null) { + if (other.sessionType != null) { + return false; + } + } else { + if (! sessionType.equals(other.sessionType)) { + return false; + } + } + if (sessionName == null) { + if (other.sessionName != null) { + return false; + } + } else { + if (! sessionName.equals(other.sessionName)) { + return false; + } + } + if (serviceKey == null) { + if (other.serviceKey != null) { + return false; + } + } else { + if (! serviceKey.equals(other.serviceKey)) { + return false; + } + } + if (requiredCapabilitySets == null) { + if (other.requiredCapabilitySets != null) { + return false; + } + } else { + if (! requiredCapabilitySets.equals(other.requiredCapabilitySets)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (serviceProviderId != null ? serviceProviderId.hashCode() : 0); + hash = 83 * hash + (domain != null ? domain.hashCode() : 0); + hash = 83 * hash + (network != null ? network.hashCode() : 0); + hash = 83 * hash + (sessionType != null ? sessionType.hashCode() : 0); + hash = 83 * hash + (sessionName != null ? sessionName.hashCode() : 0); + hash = 83 * hash + (serviceKey != null ? serviceKey.hashCode() : 0); + hash = 83 * hash + (requiredCapabilitySets != null ? requiredCapabilitySets.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(ServiceFilter: "); + buf.append("serviceProviderId=").append(serviceProviderId); + buf.append(", domain=").append(domain); + buf.append(", network=").append(network); + buf.append(", sessionType=").append(sessionType); + buf.append(", sessionName=").append(sessionName); + buf.append(", serviceKey=").append(serviceKey); + buf.append(", requiredCapabilitySets=").append(requiredCapabilitySets); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeNullableIdentifier(serviceProviderId); + encoder.encodeNullableElement(domain); + encoder.encodeNullableIdentifier(network); + encoder.encodeNullableElement(sessionType); + encoder.encodeNullableIdentifier(sessionName); + encoder.encodeNullableElement(serviceKey); + encoder.encodeNullableElement(requiredCapabilitySets); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + serviceProviderId = decoder.decodeNullableIdentifier(); + domain = (org.ccsds.moims.mo.mal.structures.IdentifierList) decoder.decodeNullableElement(new org.ccsds.moims.mo.mal.structures.IdentifierList()); + network = decoder.decodeNullableIdentifier(); + sessionType = (org.ccsds.moims.mo.mal.structures.SessionType) decoder.decodeNullableElement(org.ccsds.moims.mo.mal.structures.SessionType.LIVE); + sessionName = decoder.decodeNullableIdentifier(); + serviceKey = (org.ccsds.moims.mo.common.structures.ServiceKey) decoder.decodeNullableElement(new org.ccsds.moims.mo.common.structures.ServiceKey()); + requiredCapabilitySets = (org.ccsds.moims.mo.mal.structures.UShortList) decoder.decodeNullableElement(new org.ccsds.moims.mo.mal.structures.UShortList()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/structures/ServiceFilterList.java b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/structures/ServiceFilterList.java new file mode 100644 index 00000000..01897f9f --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/structures/ServiceFilterList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.common.directory.structures; + +/** + * List class for ServiceFilter. + */ +public final class ServiceFilterList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 844429258653689L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 844429258653689L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for ServiceFilterList. + * + */ + public ServiceFilterList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public ServiceFilterList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public ServiceFilterList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.common.directory.structures.ServiceFilter element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.common.directory.structures.ServiceFilter element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new ServiceFilterList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.common.directory.structures.ServiceFilter(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/structures/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/structures/package-info.java new file mode 100644 index 00000000..084eb9b7 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/directory/structures/package-info.java @@ -0,0 +1,4 @@ +/** + * Package containing types defined in the Directory service. +*/ +package org.ccsds.moims.mo.common.directory.structures; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/login/LoginHelper.java b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/login/LoginHelper.java new file mode 100644 index 00000000..fad39dc5 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/login/LoginHelper.java @@ -0,0 +1,17 @@ +package org.ccsds.moims.mo.common.login; + +/** + * Helper class for Login service. + */ +public class LoginHelper { + + /** + * Service singleton instance. + */ + public static final org.ccsds.moims.mo.common.login.LoginServiceInfo LOGIN_SERVICE = new org.ccsds.moims.mo.common.login.LoginServiceInfo(); + + private LoginHelper() { + // Utility class; not meant to be instantiated. + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/login/LoginServiceInfo.java b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/login/LoginServiceInfo.java new file mode 100644 index 00000000..1f613558 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/login/LoginServiceInfo.java @@ -0,0 +1,286 @@ +package org.ccsds.moims.mo.common.login; + +/** + * Helper class for Login service. + */ +public class LoginServiceInfo extends org.ccsds.moims.mo.com.COMService { + + /** + * Service number literal. + */ + public static final int _LOGIN_SERVICE_NUMBER = 2; + + /** + * Service number instance. + */ + public static final org.ccsds.moims.mo.mal.structures.UShort LOGIN_SERVICE_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_LOGIN_SERVICE_NUMBER); + + /** + * Service name constant. + */ + public static final org.ccsds.moims.mo.mal.structures.Identifier LOGIN_SERVICE_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("Login"); + + /** + * The service key of this service. + */ + private static final org.ccsds.moims.mo.mal.ServiceKey SERVICE_KEY = new org.ccsds.moims.mo.mal.ServiceKey( + 3, 1, LOGIN_SERVICE_NUMBER); + + /** + * Operation number literal for operation LOGIN. + */ + public static final int _LOGIN_OP_NUMBER = 1; + + /** + * Operation number instance for operation LOGIN. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort LOGIN_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_LOGIN_OP_NUMBER); + + /** + * Operation instance for operation LOGIN. + */ + public static final org.ccsds.moims.mo.mal.MALRequestOperation LOGIN_OP = new org.ccsds.moims.mo.mal.MALRequestOperation(SERVICE_KEY, + LOGIN_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("login"), + new org.ccsds.moims.mo.mal.structures.UShort(1), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("userDetails", true, org.ccsds.moims.mo.common.login.structures.Profile.SHORT_FORM, "The authenticationId field of the REQUEST message must be NULL otherwise an INVALID error shall be returned.\nThe authenticationId field shall be checked before applying all other tests here.\nThe userDetails field shall contain the details of the new user and role combination.\nIf the username field of the supplied Profile structure is either the wildcard '*' or empty an INVALID error shall be returned.\nIf roles are required by the system and the role field of the supplied Profile structure is NULL then an INVALID error shall be returned.\nIf roles are not used by the system the role field of the supplied Profile structure shall be ignored and may be set to NULL.\nAn UNKNOWN error shall be returned if the username, password and role combination are not correct for the system i.e. unknown user/role or incorrect password.\nA DUPLICATE error shall be returned if the username and role combination is currently in use.\nA TOO_MANY error shall be returned if the username or role are already used and exceed (deployment dependent) maximum number of concurrent logins/roles.\nIf the login is successful the provider shall create a new LoginInstance COM object and store it in the COM archive.\nThe related link of the new LoginInstance COM object shall be set to the requested LoginRole COM object.\nA LoginEvent COM event shall be generated at this point."), + new org.ccsds.moims.mo.mal.OperationField("password", true, org.ccsds.moims.mo.mal.structures.Attribute.STRING_SHORT_FORM, null)}, + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("authId", true, org.ccsds.moims.mo.mal.structures.Attribute.BLOB_SHORT_FORM, "The returned authId field shall be used as the authenticationId field in future MAL messages by the consumer MAL for authentication. The token is specific to the user and role in use."), + new org.ccsds.moims.mo.mal.OperationField("objInstId", true, org.ccsds.moims.mo.mal.structures.Attribute.LONG_SHORT_FORM, "The returned objInstId field shall contain the LoginInstance COM object instance identifier that was created by the login operation.")}, + "The login operation allows a user to log in to the system. A user can log in more than once by using a different role; however, a specific deployment may place limits on the number of users that may use a specific role, and in that case will fail the login operation with the TOO_MANY error."); + + /** + * Operation number literal for operation LOGOUT. + */ + public static final int _LOGOUT_OP_NUMBER = 2; + + /** + * Operation number instance for operation LOGOUT. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort LOGOUT_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_LOGOUT_OP_NUMBER); + + /** + * Operation instance for operation LOGOUT. + */ + public static final org.ccsds.moims.mo.mal.MALSubmitOperation LOGOUT_OP = new org.ccsds.moims.mo.mal.MALSubmitOperation(SERVICE_KEY, + LOGOUT_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("logout"), + new org.ccsds.moims.mo.mal.structures.UShort(1), + new org.ccsds.moims.mo.mal.OperationField[] {}, + "The logout operation allows a user to log out from the system. No information is passed in the message as the MAL authentication Id is enough to identify the login."); + + /** + * Operation number literal for operation LISTROLES. + */ + public static final int _LISTROLES_OP_NUMBER = 3; + + /** + * Operation number instance for operation LISTROLES. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort LISTROLES_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_LISTROLES_OP_NUMBER); + + /** + * Operation instance for operation LISTROLES. + */ + public static final org.ccsds.moims.mo.mal.MALRequestOperation LISTROLES_OP = new org.ccsds.moims.mo.mal.MALRequestOperation(SERVICE_KEY, + LISTROLES_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("listRoles"), + new org.ccsds.moims.mo.mal.structures.UShort(2), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("username", true, org.ccsds.moims.mo.mal.structures.Attribute.IDENTIFIER_SHORT_FORM, "The username field shall hold the details of the user.\nIf the username field is either the wildcard '*', NULL or empty an INVALID error shall be returned."), + new org.ccsds.moims.mo.mal.OperationField("password", true, org.ccsds.moims.mo.mal.structures.Attribute.STRING_SHORT_FORM, "An UNKNOWN error shall be returned if the username and password combination are not correct for the system i.e. unknown user or incorrect password.")}, + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("permittedRoles", true, org.ccsds.moims.mo.mal.structures.LongList.SHORT_FORM, "The operation shall return a list of LoginRole object instance identifiers that are permitted for the user or NULL if roles are not used by the system.")}, + "The listRoles operation returns the list of available roles for a specific user. This operation is expected to be called before a user logs in so that the software can provide a list of possible roles.\nIt should be noted that this operation requires both a username and password field before returning any information, this is to ensure that it does not provide a security attack vector by allowing the discovery of valid usernames without first knowing the correct password."); + + /** + * Operation number literal for operation HANDOVER. + */ + public static final int _HANDOVER_OP_NUMBER = 4; + + /** + * Operation number instance for operation HANDOVER. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort HANDOVER_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_HANDOVER_OP_NUMBER); + + /** + * Operation instance for operation HANDOVER. + */ + public static final org.ccsds.moims.mo.mal.MALRequestOperation HANDOVER_OP = new org.ccsds.moims.mo.mal.MALRequestOperation(SERVICE_KEY, + HANDOVER_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("handover"), + new org.ccsds.moims.mo.mal.structures.UShort(3), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("newUserDetails", true, org.ccsds.moims.mo.common.login.structures.Profile.SHORT_FORM, "The newUserDetails field shall contain the details of the new user and role combination.\nIf the username field of the supplied Profile structure is either NULL, the wildcard '*', or empty an INVALID error shall be returned.\nIf roles are required by the system and the role field of the supplied Profile structure is NULL then an INVALID error shall be returned.\nThe role field of the supplied Profile structure may be NULL if roles are not used by the system.\nAn UNKNOWN error shall be returned if the username, password and role combination are not correct for the system i.e. unknown user/role or incorrect password.\nA DUPLICATE error shall be returned if the username and role combination is currently in use.\nA TOO_MANY error shall be returned if the username or role are already used and exceed the permitted maximum usage value (deployment dependent).\nThe DUPLICATE and TOO_MANY checks shall take into account the fact that current operator/role combination will be logged out after the handover operation completes.\nIf the handover is successful the provider shall create a new LoginInstance COM object and store it in the COM archive.\nThe related link of the new LoginInstance COM object shall be set to the requested LoginRole COM object.\nIf an error is raised then the handover operation shall fail and the original login remain active.\nThe source link of the new LoginInstance COM object shall be set to the LoginInstance COM object that represents the previous login.\nIf the handover operation is successful a LogoutEvent COM event shall be generated for the previous login and a LoginEvent COM event shall be generated for the new login."), + new org.ccsds.moims.mo.mal.OperationField("newUserPassword", true, org.ccsds.moims.mo.mal.structures.Attribute.STRING_SHORT_FORM, null)}, + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("newAuthId", true, org.ccsds.moims.mo.mal.structures.Attribute.BLOB_SHORT_FORM, "The returned newAuthId field shall be used as the authenticationId field in future MAL messages by the consumer MAL for authentication. The token is specific to the new user and role in use."), + new org.ccsds.moims.mo.mal.OperationField("newLoginInstId", true, org.ccsds.moims.mo.mal.structures.Attribute.LONG_SHORT_FORM, "The returned newLoginInstId field shall contain the new LoginInstance COM object instance identifier that was created by the operation.")}, + "The handover operation allows an existing login to be transferred to a new user. Two cases are expected here, the first is where the operation is used to change the user's current role, and the second is where an operations context is handed over to another user."); + + /** + * Area elements. + */ + public static final org.ccsds.moims.mo.mal.structures.Element[] LOGIN_SERVICE_ELEMENTS = {}; + + /** + * The set of operations for this service. + */ + public static final org.ccsds.moims.mo.mal.MALOperation[] OPERATIONS = new org.ccsds.moims.mo.mal.MALOperation[]{LOGIN_OP, + LOGOUT_OP, + LISTROLES_OP, + HANDOVER_OP}; + + /** + * Literal for object LOGINROLE. + */ + @Deprecated + public static final int _LOGINROLE_OBJECT_NUMBER = 1; + + /** + * Instance for object LOGINROLE. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.UShort LOGINROLE_OBJECT_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_LOGINROLE_OBJECT_NUMBER); + + /** + * Object name constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.Identifier LOGINROLE_OBJECT_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("LoginRole"); + + /** + * Object type constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.com.structures.ObjectType LOGINROLE_OBJECT_TYPE = new org.ccsds.moims.mo.com.structures.ObjectType(new org.ccsds.moims.mo.mal.structures.UShort(3), LOGIN_SERVICE_NUMBER, new org.ccsds.moims.mo.mal.structures.UOctet(1), LOGINROLE_OBJECT_NUMBER); + + /** + * Object instance. + */ + @Deprecated + public static org.ccsds.moims.mo.com.COMObject LOGINROLE_OBJECT = new org.ccsds.moims.mo.com.COMObject(LOGINROLE_OBJECT_TYPE, LOGINROLE_OBJECT_NAME, org.ccsds.moims.mo.mal.structures.Attribute.IDENTIFIER_SHORT_FORM, false, null, false, null, false); + + /** + * Literal for object LOGININSTANCE. + */ + @Deprecated + public static final int _LOGININSTANCE_OBJECT_NUMBER = 2; + + /** + * Instance for object LOGININSTANCE. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.UShort LOGININSTANCE_OBJECT_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_LOGININSTANCE_OBJECT_NUMBER); + + /** + * Object name constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.Identifier LOGININSTANCE_OBJECT_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("LoginInstance"); + + /** + * Object type constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.com.structures.ObjectType LOGININSTANCE_OBJECT_TYPE = new org.ccsds.moims.mo.com.structures.ObjectType(new org.ccsds.moims.mo.mal.structures.UShort(3), LOGIN_SERVICE_NUMBER, new org.ccsds.moims.mo.mal.structures.UOctet(1), LOGININSTANCE_OBJECT_NUMBER); + + /** + * Object instance. + */ + @Deprecated + public static org.ccsds.moims.mo.com.COMObject LOGININSTANCE_OBJECT = new org.ccsds.moims.mo.com.COMObject(LOGININSTANCE_OBJECT_TYPE, LOGININSTANCE_OBJECT_NAME, org.ccsds.moims.mo.common.login.structures.Profile.SHORT_FORM, true, org.ccsds.moims.mo.common.login.LoginServiceInfo.LOGINROLE_OBJECT_TYPE, true, org.ccsds.moims.mo.common.login.LoginServiceInfo.LOGININSTANCE_OBJECT_TYPE, false); + + /** + * Literal for object LOGINEVENT. + */ + @Deprecated + public static final int _LOGINEVENT_OBJECT_NUMBER = 3; + + /** + * Instance for object LOGINEVENT. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.UShort LOGINEVENT_OBJECT_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_LOGINEVENT_OBJECT_NUMBER); + + /** + * Object name constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.Identifier LOGINEVENT_OBJECT_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("LoginEvent"); + + /** + * Object type constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.com.structures.ObjectType LOGINEVENT_OBJECT_TYPE = new org.ccsds.moims.mo.com.structures.ObjectType(new org.ccsds.moims.mo.mal.structures.UShort(3), LOGIN_SERVICE_NUMBER, new org.ccsds.moims.mo.mal.structures.UOctet(1), LOGINEVENT_OBJECT_NUMBER); + + /** + * Object instance. + */ + @Deprecated + public static org.ccsds.moims.mo.com.COMObject LOGINEVENT_OBJECT = new org.ccsds.moims.mo.com.COMObject(LOGINEVENT_OBJECT_TYPE, LOGINEVENT_OBJECT_NAME, null, true, org.ccsds.moims.mo.common.login.LoginServiceInfo.LOGININSTANCE_OBJECT_TYPE, false, null, true); + + /** + * Literal for object LOGOUTEVENT. + */ + @Deprecated + public static final int _LOGOUTEVENT_OBJECT_NUMBER = 4; + + /** + * Instance for object LOGOUTEVENT. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.UShort LOGOUTEVENT_OBJECT_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_LOGOUTEVENT_OBJECT_NUMBER); + + /** + * Object name constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.Identifier LOGOUTEVENT_OBJECT_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("LogoutEvent"); + + /** + * Object type constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.com.structures.ObjectType LOGOUTEVENT_OBJECT_TYPE = new org.ccsds.moims.mo.com.structures.ObjectType(new org.ccsds.moims.mo.mal.structures.UShort(3), LOGIN_SERVICE_NUMBER, new org.ccsds.moims.mo.mal.structures.UOctet(1), LOGOUTEVENT_OBJECT_NUMBER); + + /** + * Object instance. + */ + @Deprecated + public static org.ccsds.moims.mo.com.COMObject LOGOUTEVENT_OBJECT = new org.ccsds.moims.mo.com.COMObject(LOGOUTEVENT_OBJECT_TYPE, LOGOUTEVENT_OBJECT_NAME, null, true, org.ccsds.moims.mo.common.login.LoginServiceInfo.LOGININSTANCE_OBJECT_TYPE, true, org.ccsds.moims.mo.common.login.LoginServiceInfo.LOGINEVENT_OBJECT_TYPE, true); + + /** + * Object instance. + */ + public static final org.ccsds.moims.mo.com.COMObject[] COM_OBJECTS = { + LOGINROLE_OBJECT, + LOGININSTANCE_OBJECT, + LOGINEVENT_OBJECT, + LOGOUTEVENT_OBJECT,}; + + /** + * Creates an instance of the Login ServiceInfo. + * + */ + public LoginServiceInfo() { + super(SERVICE_KEY, LOGIN_SERVICE_NAME, LOGIN_SERVICE_ELEMENTS, OPERATIONS, COM_OBJECTS); + } + + @Override + public org.ccsds.moims.mo.mal.MALArea getArea() { + return org.ccsds.moims.mo.common.CommonHelper.COMMON_AREA; + } + + @Override + public org.ccsds.moims.mo.mal.MOErrorException generateMOError(int errorNumber, + Object extraInfo) { + switch (errorNumber) { + } + return null; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/login/body/HandoverResponse.java b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/login/body/HandoverResponse.java new file mode 100644 index 00000000..2c6954da --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/login/body/HandoverResponse.java @@ -0,0 +1,58 @@ +package org.ccsds.moims.mo.common.login.body; + +/** + * Multi body return class for HandoverResponse. + */ +public final class HandoverResponse { + + /** + * newAuthId: The returned newAuthId field shall be used as the authenticationId + * field in future MAL messages by the consumer MAL for authentication. The + * token is specific to the new user and role in use. + */ + private org.ccsds.moims.mo.mal.structures.Blob newAuthId; + + /** + * newLoginInstId: The returned newLoginInstId field shall contain the new + * LoginInstance COM object instance identifier that was created by the operation. + */ + private Long newLoginInstId; + + /** + * Default constructor for HandoverResponse. + * + */ + public HandoverResponse() { + } + + /** + * Constructs an instance of this type using provided values. + * + * @param newAuthId The returned newAuthId field shall be used as the authenticationId field in future MAL messages by the consumer MAL for authentication. The token is specific to the new user and role in use. + * @param newLoginInstId The returned newLoginInstId field shall contain the new LoginInstance COM object instance identifier that was created by the operation. + */ + public HandoverResponse(org.ccsds.moims.mo.mal.structures.Blob newAuthId, + Long newLoginInstId) { + this.newAuthId = newAuthId; + this.newLoginInstId = newLoginInstId; + } + + /** + * Returns the field newAuthId. + * + * @return The field newAuthId + */ + public org.ccsds.moims.mo.mal.structures.Blob getNewAuthId() { + return newAuthId; + } + + /** + * Returns the field newLoginInstId. + * + * @return The field newLoginInstId + */ + public Long getNewLoginInstId() { + return newLoginInstId; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/login/body/LoginResponse.java b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/login/body/LoginResponse.java new file mode 100644 index 00000000..683d255a --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/login/body/LoginResponse.java @@ -0,0 +1,58 @@ +package org.ccsds.moims.mo.common.login.body; + +/** + * Multi body return class for LoginResponse. + */ +public final class LoginResponse { + + /** + * authId: The returned authId field shall be used as the authenticationId + * field in future MAL messages by the consumer MAL for authentication. The + * token is specific to the user and role in use. + */ + private org.ccsds.moims.mo.mal.structures.Blob authId; + + /** + * objInstId: The returned objInstId field shall contain the LoginInstance + * COM object instance identifier that was created by the login operation. + */ + private Long objInstId; + + /** + * Default constructor for LoginResponse. + * + */ + public LoginResponse() { + } + + /** + * Constructs an instance of this type using provided values. + * + * @param authId The returned authId field shall be used as the authenticationId field in future MAL messages by the consumer MAL for authentication. The token is specific to the user and role in use. + * @param objInstId The returned objInstId field shall contain the LoginInstance COM object instance identifier that was created by the login operation. + */ + public LoginResponse(org.ccsds.moims.mo.mal.structures.Blob authId, + Long objInstId) { + this.authId = authId; + this.objInstId = objInstId; + } + + /** + * Returns the field authId. + * + * @return The field authId + */ + public org.ccsds.moims.mo.mal.structures.Blob getAuthId() { + return authId; + } + + /** + * Returns the field objInstId. + * + * @return The field objInstId + */ + public Long getObjInstId() { + return objInstId; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/login/body/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/login/body/package-info.java new file mode 100644 index 00000000..4c2ab4e8 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/login/body/package-info.java @@ -0,0 +1,4 @@ +/** + * Package containing the types for holding compound messages. +*/ +package org.ccsds.moims.mo.common.login.body; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/login/consumer/LoginAdapter.java b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/login/consumer/LoginAdapter.java new file mode 100644 index 00000000..c171369d --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/login/consumer/LoginAdapter.java @@ -0,0 +1,182 @@ +package org.ccsds.moims.mo.common.login.consumer; + +/** + * Consumer adapter for Login service. + */ +public abstract class LoginAdapter extends org.ccsds.moims.mo.mal.consumer.MALInteractionAdapter { + + /** + * Called by the MAL when a REQUEST response is received from a provider for + * the operation login. + * + * @param msgHeader msgHeader The header of the received message + * @param authId The returned authId field shall be used as the authenticationId field in future MAL messages by the consumer MAL for authentication. The token is specific to the user and role in use. + * @param objInstId The returned objInstId field shall contain the LoginInstance COM object instance identifier that was created by the login operation. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void loginResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.structures.Blob authId, + Long objInstId, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response error is received from a provider + * for the operation login. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void loginErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a SUBMIT acknowledgement is received from a provider + * for the operation logout. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void logoutAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a SUBMIT acknowledgement error is received from + * a provider for the operation logout. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void logoutErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response is received from a provider for + * the operation listRoles. + * + * @param msgHeader msgHeader The header of the received message + * @param permittedRoles The operation shall return a list of LoginRole object instance identifiers that are permitted for the user or NULL if roles are not used by the system. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void listRolesResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.structures.LongList permittedRoles, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response error is received from a provider + * for the operation listRoles. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void listRolesErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response is received from a provider for + * the operation handover. + * + * @param msgHeader msgHeader The header of the received message + * @param newAuthId The returned newAuthId field shall be used as the authenticationId field in future MAL messages by the consumer MAL for authentication. The token is specific to the new user and role in use. + * @param newLoginInstId The returned newLoginInstId field shall contain the new LoginInstance COM object instance identifier that was created by the operation. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void handoverResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.structures.Blob newAuthId, + Long newLoginInstId, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response error is received from a provider + * for the operation handover. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void handoverErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + @Override + public final void submitAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.common.login.LoginServiceInfo._LOGOUT_OP_NUMBER: + logoutAckReceived(msgHeader, qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void submitErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALErrorBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.common.login.LoginServiceInfo._LOGOUT_OP_NUMBER: + logoutErrorReceived(msgHeader, body.getError(), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void requestResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALMessageBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.common.login.LoginServiceInfo._LOGIN_OP_NUMBER: + loginResponseReceived(msgHeader, + (org.ccsds.moims.mo.mal.structures.Blob) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.Blob()), + (body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.Union(Long.MAX_VALUE)) == null) ? null : ((org.ccsds.moims.mo.mal.structures.Union) body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.Union(Long.MAX_VALUE))).getLongValue(), qosProperties); + break; + case org.ccsds.moims.mo.common.login.LoginServiceInfo._LISTROLES_OP_NUMBER: + listRolesResponseReceived(msgHeader, + (org.ccsds.moims.mo.mal.structures.LongList) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.LongList()), qosProperties); + break; + case org.ccsds.moims.mo.common.login.LoginServiceInfo._HANDOVER_OP_NUMBER: + handoverResponseReceived(msgHeader, + (org.ccsds.moims.mo.mal.structures.Blob) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.Blob()), + (body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.Union(Long.MAX_VALUE)) == null) ? null : ((org.ccsds.moims.mo.mal.structures.Union) body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.Union(Long.MAX_VALUE))).getLongValue(), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void requestErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALErrorBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.common.login.LoginServiceInfo._LOGIN_OP_NUMBER: + loginErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.common.login.LoginServiceInfo._LISTROLES_OP_NUMBER: + listRolesErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.common.login.LoginServiceInfo._HANDOVER_OP_NUMBER: + handoverErrorReceived(msgHeader, body.getError(), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/login/consumer/LoginStub.java b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/login/consumer/LoginStub.java new file mode 100644 index 00000000..b655333b --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/login/consumer/LoginStub.java @@ -0,0 +1,283 @@ +package org.ccsds.moims.mo.common.login.consumer; + +/** + * Consumer stub for Login service. + */ +public class LoginStub { + + /** + * The consumer field. + */ + private final org.ccsds.moims.mo.mal.consumer.MALConsumer consumer; + + /** + * Wraps a MALconsumer connection with service specific methods that map from + * the high level service API to the generic MAL API. + * + * @param consumer consumer The MALConsumer to use in this stub. + */ + public LoginStub(org.ccsds.moims.mo.mal.consumer.MALConsumer consumer) { + this.consumer = consumer; + } + + /** + * Returns the internal MAL consumer object used for sending of messages from + * this interface. + * + * @return The MAL consumer object. + */ + public org.ccsds.moims.mo.mal.consumer.MALConsumer getConsumer() { + return consumer; + } + + /** + * The login operation allows a user to log in to the system. A user can log + * in more than once by using a different role; however, a specific deployment + * may place limits on the number of users that may use a specific role, and + * in that case will fail the login operation with the TOO_MANY error. + * + * @param userDetails The authenticationId field of the REQUEST message must be NULL otherwise an INVALID error shall be returned. +The authenticationId field shall be checked before applying all other tests here. +The userDetails field shall contain the details of the new user and role combination. +If the username field of the supplied Profile structure is either the wildcard '*' or empty an INVALID error shall be returned. +If roles are required by the system and the role field of the supplied Profile structure is NULL then an INVALID error shall be returned. +If roles are not used by the system the role field of the supplied Profile structure shall be ignored and may be set to NULL. +An UNKNOWN error shall be returned if the username, password and role combination are not correct for the system i.e. unknown user/role or incorrect password. +A DUPLICATE error shall be returned if the username and role combination is currently in use. +A TOO_MANY error shall be returned if the username or role are already used and exceed (deployment dependent) maximum number of concurrent logins/roles. +If the login is successful the provider shall create a new LoginInstance COM object and store it in the COM archive. +The related link of the new LoginInstance COM object shall be set to the requested LoginRole COM object. +A LoginEvent COM event shall be generated at this point. + * @param password password Argument number 1 as defined by the service operation + * @return The return value of the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.common.login.body.LoginResponse login(org.ccsds.moims.mo.common.login.structures.Profile userDetails, + String password) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + org.ccsds.moims.mo.mal.transport.MALMessageBody body = consumer.request(org.ccsds.moims.mo.common.login.LoginServiceInfo.LOGIN_OP, userDetails, (password == null) ? null : new org.ccsds.moims.mo.mal.structures.Union(password)); + Object body0 = (Object) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.Blob()); + Object body1 = (Object) body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.Union(Long.MAX_VALUE)); + return new org.ccsds.moims.mo.common.login.body.LoginResponse((org.ccsds.moims.mo.mal.structures.Blob) body0, (body1 == null) ? null : ((org.ccsds.moims.mo.mal.structures.Union) body1).getLongValue()); + } + + /** + * Asynchronous version of method login. + * + * @param userDetails The authenticationId field of the REQUEST message must be NULL otherwise an INVALID error shall be returned. +The authenticationId field shall be checked before applying all other tests here. +The userDetails field shall contain the details of the new user and role combination. +If the username field of the supplied Profile structure is either the wildcard '*' or empty an INVALID error shall be returned. +If roles are required by the system and the role field of the supplied Profile structure is NULL then an INVALID error shall be returned. +If roles are not used by the system the role field of the supplied Profile structure shall be ignored and may be set to NULL. +An UNKNOWN error shall be returned if the username, password and role combination are not correct for the system i.e. unknown user/role or incorrect password. +A DUPLICATE error shall be returned if the username and role combination is currently in use. +A TOO_MANY error shall be returned if the username or role are already used and exceed (deployment dependent) maximum number of concurrent logins/roles. +If the login is successful the provider shall create a new LoginInstance COM object and store it in the COM archive. +The related link of the new LoginInstance COM object shall be set to the requested LoginRole COM object. +A LoginEvent COM event shall be generated at this point. + * @param password password Argument number 1 as defined by the service operation + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncLogin(org.ccsds.moims.mo.common.login.structures.Profile userDetails, + String password, + org.ccsds.moims.mo.common.login.consumer.LoginAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncRequest(org.ccsds.moims.mo.common.login.LoginServiceInfo.LOGIN_OP, adapter, userDetails, (password == null) ? null : new org.ccsds.moims.mo.mal.structures.Union(password)); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueLogin(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.common.login.consumer.LoginAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.common.login.LoginServiceInfo.LOGIN_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The logout operation allows a user to log out from the system. No information + * is passed in the message as the MAL authentication Id is enough to identify + * the login. + * + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void logout() throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.submit(org.ccsds.moims.mo.common.login.LoginServiceInfo.LOGOUT_OP, (Object[]) null); + } + + /** + * Asynchronous version of method logout. + * + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncLogout(org.ccsds.moims.mo.common.login.consumer.LoginAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncSubmit(org.ccsds.moims.mo.common.login.LoginServiceInfo.LOGOUT_OP, adapter, (Object[]) null); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueLogout(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.common.login.consumer.LoginAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.common.login.LoginServiceInfo.LOGOUT_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The listRoles operation returns the list of available roles for a specific + * user. This operation is expected to be called before a user logs in so + * that the software can provide a list of possible roles. + * It should be noted that this operation requires both a username and password + * field before returning any information, this is to ensure that it does + * not provide a security attack vector by allowing the discovery of valid + * usernames without first knowing the correct password. + * + * @param username The username field shall hold the details of the user. +If the username field is either the wildcard '*', NULL or empty an INVALID error shall be returned. + * @param password An UNKNOWN error shall be returned if the username and password combination are not correct for the system i.e. unknown user or incorrect password. + * @return The return value of the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.structures.LongList listRoles(org.ccsds.moims.mo.mal.structures.Identifier username, + String password) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + org.ccsds.moims.mo.mal.transport.MALMessageBody body = consumer.request(org.ccsds.moims.mo.common.login.LoginServiceInfo.LISTROLES_OP, username, (password == null) ? null : new org.ccsds.moims.mo.mal.structures.Union(password)); + Object body0 = (Object) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.LongList()); + return (org.ccsds.moims.mo.mal.structures.LongList) body0; + } + + /** + * Asynchronous version of method listRoles. + * + * @param username The username field shall hold the details of the user. +If the username field is either the wildcard '*', NULL or empty an INVALID error shall be returned. + * @param password An UNKNOWN error shall be returned if the username and password combination are not correct for the system i.e. unknown user or incorrect password. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncListRoles(org.ccsds.moims.mo.mal.structures.Identifier username, + String password, + org.ccsds.moims.mo.common.login.consumer.LoginAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncRequest(org.ccsds.moims.mo.common.login.LoginServiceInfo.LISTROLES_OP, adapter, username, (password == null) ? null : new org.ccsds.moims.mo.mal.structures.Union(password)); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueListRoles(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.common.login.consumer.LoginAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.common.login.LoginServiceInfo.LISTROLES_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The handover operation allows an existing login to be transferred to a + * new user. Two cases are expected here, the first is where the operation + * is used to change the user"s current role, and the second is where + * an operations context is handed over to another user. + * + * @param newUserDetails The newUserDetails field shall contain the details of the new user and role combination. +If the username field of the supplied Profile structure is either NULL, the wildcard '*', or empty an INVALID error shall be returned. +If roles are required by the system and the role field of the supplied Profile structure is NULL then an INVALID error shall be returned. +The role field of the supplied Profile structure may be NULL if roles are not used by the system. +An UNKNOWN error shall be returned if the username, password and role combination are not correct for the system i.e. unknown user/role or incorrect password. +A DUPLICATE error shall be returned if the username and role combination is currently in use. +A TOO_MANY error shall be returned if the username or role are already used and exceed the permitted maximum usage value (deployment dependent). +The DUPLICATE and TOO_MANY checks shall take into account the fact that current operator/role combination will be logged out after the handover operation completes. +If the handover is successful the provider shall create a new LoginInstance COM object and store it in the COM archive. +The related link of the new LoginInstance COM object shall be set to the requested LoginRole COM object. +If an error is raised then the handover operation shall fail and the original login remain active. +The source link of the new LoginInstance COM object shall be set to the LoginInstance COM object that represents the previous login. +If the handover operation is successful a LogoutEvent COM event shall be generated for the previous login and a LoginEvent COM event shall be generated for the new login. + * @param newUserPassword newUserPassword Argument number 1 as defined by the service operation + * @return The return value of the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.common.login.body.HandoverResponse handover(org.ccsds.moims.mo.common.login.structures.Profile newUserDetails, + String newUserPassword) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + org.ccsds.moims.mo.mal.transport.MALMessageBody body = consumer.request(org.ccsds.moims.mo.common.login.LoginServiceInfo.HANDOVER_OP, newUserDetails, (newUserPassword == null) ? null : new org.ccsds.moims.mo.mal.structures.Union(newUserPassword)); + Object body0 = (Object) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.Blob()); + Object body1 = (Object) body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.Union(Long.MAX_VALUE)); + return new org.ccsds.moims.mo.common.login.body.HandoverResponse((org.ccsds.moims.mo.mal.structures.Blob) body0, (body1 == null) ? null : ((org.ccsds.moims.mo.mal.structures.Union) body1).getLongValue()); + } + + /** + * Asynchronous version of method handover. + * + * @param newUserDetails The newUserDetails field shall contain the details of the new user and role combination. +If the username field of the supplied Profile structure is either NULL, the wildcard '*', or empty an INVALID error shall be returned. +If roles are required by the system and the role field of the supplied Profile structure is NULL then an INVALID error shall be returned. +The role field of the supplied Profile structure may be NULL if roles are not used by the system. +An UNKNOWN error shall be returned if the username, password and role combination are not correct for the system i.e. unknown user/role or incorrect password. +A DUPLICATE error shall be returned if the username and role combination is currently in use. +A TOO_MANY error shall be returned if the username or role are already used and exceed the permitted maximum usage value (deployment dependent). +The DUPLICATE and TOO_MANY checks shall take into account the fact that current operator/role combination will be logged out after the handover operation completes. +If the handover is successful the provider shall create a new LoginInstance COM object and store it in the COM archive. +The related link of the new LoginInstance COM object shall be set to the requested LoginRole COM object. +If an error is raised then the handover operation shall fail and the original login remain active. +The source link of the new LoginInstance COM object shall be set to the LoginInstance COM object that represents the previous login. +If the handover operation is successful a LogoutEvent COM event shall be generated for the previous login and a LoginEvent COM event shall be generated for the new login. + * @param newUserPassword newUserPassword Argument number 1 as defined by the service operation + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncHandover(org.ccsds.moims.mo.common.login.structures.Profile newUserDetails, + String newUserPassword, + org.ccsds.moims.mo.common.login.consumer.LoginAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncRequest(org.ccsds.moims.mo.common.login.LoginServiceInfo.HANDOVER_OP, adapter, newUserDetails, (newUserPassword == null) ? null : new org.ccsds.moims.mo.mal.structures.Union(newUserPassword)); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueHandover(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.common.login.consumer.LoginAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.common.login.LoginServiceInfo.HANDOVER_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/login/consumer/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/login/consumer/package-info.java new file mode 100644 index 00000000..e286df7a --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/login/consumer/package-info.java @@ -0,0 +1,4 @@ +/** + * Package containing the consumer stubs for the Login service. +*/ +package org.ccsds.moims.mo.common.login.consumer; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/login/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/login/package-info.java new file mode 100644 index 00000000..7d0afa1f --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/login/package-info.java @@ -0,0 +1,29 @@ +/** + * The Login service defines the primary mechanism for the submission of authentication + * credentials to a deployment specific security system. It supports operations + * to allow a user to login, logout, report available roles, and also handover + * the login to another user. + * The service is closely tied to the Access Control aspect of the MAL where + * the returned authentication identifiers are used in the MAL message header + * to authenticate and authorise message via Access Control. + * The login service supports the concept of roles, where users may log in + * with a specific role; the meaning of each role is mission-specific, however + * it is expected that a specific role allocates the user privileges to invoke + * operations on mission operation services. + * The use of login roles is optional but if they are used then the role details + * are held in the COM archive and the COM archive operations are used to + * manage the role definitions. The responsibility for maintenance of the + * login roles is outside the scope of this specification as it is a deployment + * issue to define the possible roles and associate users to those roles. + * The form in which the password is sent to the Login service provider must + * be agreed upon beforehand and is dependent on the security system deployed. + * For example, most security implementations do not recommend the use of + * plain text passwords but rather some encrypted version of the password. + * For this reason the contents of the messages sent between the login service + * consumer and provider during authentication handshaking are implementation-specific. + * The authentication and authorisation concept of the MO services is covered + * in section 3.6 of the Reference Model (R2). + * The Reference Model (R2) also provides sequence diagrams for security and + * login in sections 5.2 and 5.3. +*/ +package org.ccsds.moims.mo.common.login; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/login/provider/LoginHandler.java b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/login/provider/LoginHandler.java new file mode 100644 index 00000000..b9bb2204 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/login/provider/LoginHandler.java @@ -0,0 +1,96 @@ +package org.ccsds.moims.mo.common.login.provider; + +/** + * Interface that providers of the Login service must implement to handle + * the operations of that service. + */ +public interface LoginHandler { + + /** + * Implements the operation login. + * + * @param userDetails The authenticationId field of the REQUEST message must be NULL otherwise an INVALID error shall be returned. +The authenticationId field shall be checked before applying all other tests here. +The userDetails field shall contain the details of the new user and role combination. +If the username field of the supplied Profile structure is either the wildcard '*' or empty an INVALID error shall be returned. +If roles are required by the system and the role field of the supplied Profile structure is NULL then an INVALID error shall be returned. +If roles are not used by the system the role field of the supplied Profile structure shall be ignored and may be set to NULL. +An UNKNOWN error shall be returned if the username, password and role combination are not correct for the system i.e. unknown user/role or incorrect password. +A DUPLICATE error shall be returned if the username and role combination is currently in use. +A TOO_MANY error shall be returned if the username or role are already used and exceed (deployment dependent) maximum number of concurrent logins/roles. +If the login is successful the provider shall create a new LoginInstance COM object and store it in the COM archive. +The related link of the new LoginInstance COM object shall be set to the requested LoginRole COM object. +A LoginEvent COM event shall be generated at this point. + * @param password password Argument number 1 as defined by the service operation + * @param interaction The MAL object representing the interaction in the provider. + * @return The return value of the operation + * @throws org.ccsds.moims.mo.com.DuplicateException Username/role combination currently in use. + * @throws org.ccsds.moims.mo.com.InvalidException Submitted profile contains invalid values. No further information is provided as it may compromise security. + * @throws org.ccsds.moims.mo.mal.TooManyException Role concurrent session limit count exceeded. + * @throws org.ccsds.moims.mo.mal.UnknownException Unknown username/role/password combination. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + org.ccsds.moims.mo.common.login.body.LoginResponse login(org.ccsds.moims.mo.common.login.structures.Profile userDetails, + String password, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.com.DuplicateException, org.ccsds.moims.mo.com.InvalidException, org.ccsds.moims.mo.mal.TooManyException, org.ccsds.moims.mo.mal.UnknownException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation logout. + * + * @param interaction The MAL object representing the interaction in the provider. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + void logout(org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation listRoles. + * + * @param username The username field shall hold the details of the user. +If the username field is either the wildcard '*', NULL or empty an INVALID error shall be returned. + * @param password An UNKNOWN error shall be returned if the username and password combination are not correct for the system i.e. unknown user or incorrect password. + * @param interaction The MAL object representing the interaction in the provider. + * @return The return value of the operation + * @throws org.ccsds.moims.mo.mal.UnknownException Unknown username/password combination. + * @throws org.ccsds.moims.mo.com.InvalidException Submitted profile contains invalid values. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + org.ccsds.moims.mo.mal.structures.LongList listRoles(org.ccsds.moims.mo.mal.structures.Identifier username, + String password, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mal.UnknownException, org.ccsds.moims.mo.com.InvalidException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation handover. + * + * @param newUserDetails The newUserDetails field shall contain the details of the new user and role combination. +If the username field of the supplied Profile structure is either NULL, the wildcard '*', or empty an INVALID error shall be returned. +If roles are required by the system and the role field of the supplied Profile structure is NULL then an INVALID error shall be returned. +The role field of the supplied Profile structure may be NULL if roles are not used by the system. +An UNKNOWN error shall be returned if the username, password and role combination are not correct for the system i.e. unknown user/role or incorrect password. +A DUPLICATE error shall be returned if the username and role combination is currently in use. +A TOO_MANY error shall be returned if the username or role are already used and exceed the permitted maximum usage value (deployment dependent). +The DUPLICATE and TOO_MANY checks shall take into account the fact that current operator/role combination will be logged out after the handover operation completes. +If the handover is successful the provider shall create a new LoginInstance COM object and store it in the COM archive. +The related link of the new LoginInstance COM object shall be set to the requested LoginRole COM object. +If an error is raised then the handover operation shall fail and the original login remain active. +The source link of the new LoginInstance COM object shall be set to the LoginInstance COM object that represents the previous login. +If the handover operation is successful a LogoutEvent COM event shall be generated for the previous login and a LoginEvent COM event shall be generated for the new login. + * @param newUserPassword newUserPassword Argument number 1 as defined by the service operation + * @param interaction The MAL object representing the interaction in the provider. + * @return The return value of the operation + * @throws org.ccsds.moims.mo.mal.UnknownException Unknown username/role/password combination. + * @throws org.ccsds.moims.mo.com.InvalidException Submitted profile contains invalid values. + * @throws org.ccsds.moims.mo.mal.TooManyException Role concurrent session limit count exceeded. + * @throws org.ccsds.moims.mo.com.DuplicateException Username/role combination currently in use. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + org.ccsds.moims.mo.common.login.body.HandoverResponse handover(org.ccsds.moims.mo.common.login.structures.Profile newUserDetails, + String newUserPassword, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mal.UnknownException, org.ccsds.moims.mo.com.InvalidException, org.ccsds.moims.mo.mal.TooManyException, org.ccsds.moims.mo.com.DuplicateException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Sets the skeleton to be used for creation of publishers. + * + * @param skeleton The skeleton to be used. + */ + void setSkeleton(org.ccsds.moims.mo.common.login.provider.LoginSkeleton skeleton); +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/login/provider/LoginInheritanceSkeleton.java b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/login/provider/LoginInheritanceSkeleton.java new file mode 100644 index 00000000..28b76f27 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/login/provider/LoginInheritanceSkeleton.java @@ -0,0 +1,132 @@ +package org.ccsds.moims.mo.common.login.provider; + +/** + * Provider Inheritance skeleton for LoginInheritanceSkeleton service. + */ +public abstract class LoginInheritanceSkeleton implements org.ccsds.moims.mo.mal.provider.MALInteractionHandler, org.ccsds.moims.mo.common.login.provider.LoginSkeleton, org.ccsds.moims.mo.common.login.provider.LoginHandler { + + /** + * The providerSet field. + */ + private org.ccsds.moims.mo.mal.provider.MALProviderSet providerSet = new org.ccsds.moims.mo.mal.provider.MALProviderSet(org.ccsds.moims.mo.common.login.LoginHelper.LOGIN_SERVICE); + + /** + * Returns the connection object for this provider. + * + * @return the connection object for this provider + * @throws java.io.IOException if the method was not implemented yet. + */ + public org.ccsds.moims.mo.mal.helpertools.connections.ConnectionProvider getConnection() throws java.io.IOException { + throw new java.io.IOException("This method needs to be overridden!"); + } + + @Override + public void setSkeleton(org.ccsds.moims.mo.common.login.provider.LoginSkeleton skeleton) { + // Not used in the inheritance pattern (the skeleton is 'this'); + } + + @Override + public void malInitialize(org.ccsds.moims.mo.mal.provider.MALProvider provider) throws org.ccsds.moims.mo.mal.MALException { + providerSet.addProvider(provider); + } + + @Override + public void malFinalize(org.ccsds.moims.mo.mal.provider.MALProvider provider) throws org.ccsds.moims.mo.mal.MALException { + providerSet.removeProvider(provider); + } + + @Override + public void handleSend(org.ccsds.moims.mo.mal.provider.MALInteraction interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + switch (opNumber) { + default: + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } + + @Override + public void handleSubmit(org.ccsds.moims.mo.mal.provider.MALSubmit interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + switch (opNumber) { + case org.ccsds.moims.mo.common.login.LoginServiceInfo._LOGOUT_OP_NUMBER: + logout(interaction); + interaction.sendAcknowledgement(); + break; + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } + + @Override + public void handleRequest(org.ccsds.moims.mo.mal.provider.MALRequest interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + try { + switch (opNumber) { + case org.ccsds.moims.mo.common.login.LoginServiceInfo._LOGIN_OP_NUMBER: + org.ccsds.moims.mo.common.login.body.LoginResponse loginRt = login((org.ccsds.moims.mo.common.login.structures.Profile) body.getBodyElement(0, new org.ccsds.moims.mo.common.login.structures.Profile()), + (body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.Union("")) == null) ? null : ((org.ccsds.moims.mo.mal.structures.Union) body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.Union(""))).getStringValue(), + interaction); + interaction.sendResponse( + loginRt.getAuthId(), + (loginRt.getObjInstId() == null) ? null : new org.ccsds.moims.mo.mal.structures.Union(loginRt.getObjInstId()) + ); + break; + case org.ccsds.moims.mo.common.login.LoginServiceInfo._LISTROLES_OP_NUMBER: + interaction.sendResponse(listRoles((org.ccsds.moims.mo.mal.structures.Identifier) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.Identifier()), + (body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.Union("")) == null) ? null : ((org.ccsds.moims.mo.mal.structures.Union) body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.Union(""))).getStringValue(), + interaction)); + break; + case org.ccsds.moims.mo.common.login.LoginServiceInfo._HANDOVER_OP_NUMBER: + org.ccsds.moims.mo.common.login.body.HandoverResponse handoverRt = handover((org.ccsds.moims.mo.common.login.structures.Profile) body.getBodyElement(0, new org.ccsds.moims.mo.common.login.structures.Profile()), + (body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.Union("")) == null) ? null : ((org.ccsds.moims.mo.mal.structures.Union) body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.Union(""))).getStringValue(), + interaction); + interaction.sendResponse( + handoverRt.getNewAuthId(), + (handoverRt.getNewLoginInstId() == null) ? null : new org.ccsds.moims.mo.mal.structures.Union(handoverRt.getNewLoginInstId()) + ); + break; + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } catch (org.ccsds.moims.mo.mal.MOErrorException error) { + throw new org.ccsds.moims.mo.mal.MALInteractionException(error); + } + } + + @Override + public void handleInvoke(org.ccsds.moims.mo.mal.provider.MALInvoke interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + switch (opNumber) { + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } + + @Override + public void handleProgress(org.ccsds.moims.mo.mal.provider.MALProgress interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + switch (opNumber) { + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/login/provider/LoginSkeleton.java b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/login/provider/LoginSkeleton.java new file mode 100644 index 00000000..019ddc67 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/login/provider/LoginSkeleton.java @@ -0,0 +1,8 @@ +package org.ccsds.moims.mo.common.login.provider; + +/** + * The skeleton interface for the Login service. + */ +public interface LoginSkeleton { + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/login/provider/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/login/provider/package-info.java new file mode 100644 index 00000000..90378544 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/login/provider/package-info.java @@ -0,0 +1,4 @@ +/** + * Package containing the provider skeletons for the Login service. +*/ +package org.ccsds.moims.mo.common.login.provider; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/login/structures/Profile.java b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/login/structures/Profile.java new file mode 100644 index 00000000..5fcf5b2b --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/login/structures/Profile.java @@ -0,0 +1,147 @@ +package org.ccsds.moims.mo.common.login.structures; + +/** + * The Profile structure contains details of the user who is logging on to + * take a specified role. + */ +public final class Profile implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 844433536843777L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 844433536843777L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * The name of the user. + */ + private org.ccsds.moims.mo.mal.structures.Identifier username; + + /** + * The optional object instance identifier of the role required by the user. + */ + private Long role; + + /** + * Default constructor for Profile. + * + */ + public Profile() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param username The name of the user. + * @param role The optional object instance identifier of the role required by the user. + */ + public Profile(org.ccsds.moims.mo.mal.structures.Identifier username, + Long role) { + this.username = username; + this.role = role; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param username The name of the user. + */ + public Profile(org.ccsds.moims.mo.mal.structures.Identifier username) { + this.username = username; + this.role = null; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.common.login.structures.Profile(); + } + + /** + * Returns the field username. + * + * @return The field username + */ + public org.ccsds.moims.mo.mal.structures.Identifier getUsername() { + return username; + } + + /** + * Returns the field role. + * + * @return The field role + */ + public Long getRole() { + return role; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Profile) { + Profile other = (Profile) obj; + if (username == null) { + if (other.username != null) { + return false; + } + } else { + if (! username.equals(other.username)) { + return false; + } + } + if (role == null) { + if (other.role != null) { + return false; + } + } else { + if (! role.equals(other.role)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (username != null ? username.hashCode() : 0); + hash = 83 * hash + (role != null ? role.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(Profile: "); + buf.append("username=").append(username); + buf.append(", role=").append(role); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (username == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'username' cannot be null!"); + } + encoder.encodeIdentifier(username); + encoder.encodeNullableLong(role); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + username = decoder.decodeIdentifier(); + role = decoder.decodeNullableLong(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/login/structures/ProfileList.java b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/login/structures/ProfileList.java new file mode 100644 index 00000000..8e591c24 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/login/structures/ProfileList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.common.login.structures; + +/** + * List class for Profile. + */ +public final class ProfileList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 844433553620991L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 844433553620991L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for ProfileList. + * + */ + public ProfileList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public ProfileList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public ProfileList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.common.login.structures.Profile element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.common.login.structures.Profile element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new ProfileList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.common.login.structures.Profile(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/login/structures/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/login/structures/package-info.java new file mode 100644 index 00000000..7e40f5c4 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/login/structures/package-info.java @@ -0,0 +1,4 @@ +/** + * Package containing types defined in the Login service. +*/ +package org.ccsds.moims.mo.common.login.structures; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/package-info.java new file mode 100644 index 00000000..e6768c64 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/package-info.java @@ -0,0 +1,15 @@ +/** + * This section details the Common Services; the structures used by the services + * and operations are detailed in section 4. The services and structures are + * defined in terms of the MO Message Abstraction Layer (MAL) which is defined + * in reference [2], so it is possible to deploy them over any supported protocol + * and message transport. + * The services defined here are also specified in terms of the COM which + * is defined in reference [3]. + * To aid comprehension several tables are included for each service and operation + * definition. The table formats are the same as those used for the specification + * of the MO COM Services in reference [3]. The formats are fully described + * in reference [2] in section 2 and in reference [3] section 2, for COM usage. + * All service specifications in this document are part of the Common Area. +*/ +package org.ccsds.moims.mo.common; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/structures/ServiceKey.java b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/structures/ServiceKey.java new file mode 100644 index 00000000..599517a8 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/structures/ServiceKey.java @@ -0,0 +1,173 @@ +package org.ccsds.moims.mo.common.structures; + +/** + * The ServiceKey structure. + */ +public final class ServiceKey implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 844424946909185L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 844424946909185L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * The area of this service taken from the numeric Area identifier of the + * service specification. + */ + private org.ccsds.moims.mo.mal.structures.UShort keyArea; + + /** + * The service taken from the numeric Service identifier of the service specification. + */ + private org.ccsds.moims.mo.mal.structures.UShort keyService; + + /** + * The version of this service taken from the Area Version of the area specification. + */ + private org.ccsds.moims.mo.mal.structures.UOctet keyAreaVersion; + + /** + * Default constructor for ServiceKey. + * + */ + public ServiceKey() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param keyArea The area of this service taken from the numeric Area identifier of the service specification. + * @param keyService The service taken from the numeric Service identifier of the service specification. + * @param keyAreaVersion The version of this service taken from the Area Version of the area specification. + */ + public ServiceKey(org.ccsds.moims.mo.mal.structures.UShort keyArea, + org.ccsds.moims.mo.mal.structures.UShort keyService, + org.ccsds.moims.mo.mal.structures.UOctet keyAreaVersion) { + this.keyArea = keyArea; + this.keyService = keyService; + this.keyAreaVersion = keyAreaVersion; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.common.structures.ServiceKey(); + } + + /** + * Returns the field keyArea. + * + * @return The field keyArea + */ + public org.ccsds.moims.mo.mal.structures.UShort getKeyArea() { + return keyArea; + } + + /** + * Returns the field keyService. + * + * @return The field keyService + */ + public org.ccsds.moims.mo.mal.structures.UShort getKeyService() { + return keyService; + } + + /** + * Returns the field keyAreaVersion. + * + * @return The field keyAreaVersion + */ + public org.ccsds.moims.mo.mal.structures.UOctet getKeyAreaVersion() { + return keyAreaVersion; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ServiceKey) { + ServiceKey other = (ServiceKey) obj; + if (keyArea == null) { + if (other.keyArea != null) { + return false; + } + } else { + if (! keyArea.equals(other.keyArea)) { + return false; + } + } + if (keyService == null) { + if (other.keyService != null) { + return false; + } + } else { + if (! keyService.equals(other.keyService)) { + return false; + } + } + if (keyAreaVersion == null) { + if (other.keyAreaVersion != null) { + return false; + } + } else { + if (! keyAreaVersion.equals(other.keyAreaVersion)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (keyArea != null ? keyArea.hashCode() : 0); + hash = 83 * hash + (keyService != null ? keyService.hashCode() : 0); + hash = 83 * hash + (keyAreaVersion != null ? keyAreaVersion.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(ServiceKey: "); + buf.append("keyArea=").append(keyArea); + buf.append(", keyService=").append(keyService); + buf.append(", keyAreaVersion=").append(keyAreaVersion); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (keyArea == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'keyArea' cannot be null!"); + } + if (keyService == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'keyService' cannot be null!"); + } + if (keyAreaVersion == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'keyAreaVersion' cannot be null!"); + } + encoder.encodeUShort(keyArea); + encoder.encodeUShort(keyService); + encoder.encodeUOctet(keyAreaVersion); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + keyArea = decoder.decodeUShort(); + keyService = decoder.decodeUShort(); + keyAreaVersion = decoder.decodeUOctet(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/structures/ServiceKeyList.java b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/structures/ServiceKeyList.java new file mode 100644 index 00000000..e76eed04 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/structures/ServiceKeyList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.common.structures; + +/** + * List class for ServiceKey. + */ +public final class ServiceKeyList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 844424963686399L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 844424963686399L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for ServiceKeyList. + * + */ + public ServiceKeyList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public ServiceKeyList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public ServiceKeyList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.common.structures.ServiceKey element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.common.structures.ServiceKey element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new ServiceKeyList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.common.structures.ServiceKey(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/structures/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/structures/package-info.java new file mode 100644 index 00000000..6f2399f3 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area003-v001-common/org/ccsds/moims/mo/common/structures/package-info.java @@ -0,0 +1,4 @@ +/** + * Package containing types defined in the Common area. +*/ +package org.ccsds.moims.mo.common.structures; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/MCElementFactory.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/MCElementFactory.java new file mode 100644 index 00000000..8a626caf --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/MCElementFactory.java @@ -0,0 +1,246 @@ +package org.ccsds.moims.mo.mc; + +/** + * Creates the Elements of the MC area, without holding an instance of each + * of them, so that the class of a type is only loaded once a message carries + * that type. + */ +public final class MCElementFactory implements org.ccsds.moims.mo.mal.AreaElementFactory { + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement(int serviceNumber, + int typeNumber) { + switch (serviceNumber) { + case 0: return createAreaElement(typeNumber); + case 1: return createActionElement(typeNumber); + case 2: return createParameterElement(typeNumber); + case 3: return createAlertElement(typeNumber); + case 4: return createCheckElement(typeNumber); + case 5: return createStatisticElement(typeNumber); + case 6: return createAggregationElement(typeNumber); + case 7: return createConversionElement(typeNumber); + case 8: return createGroupElement(typeNumber); + default: return null; + } + } + + @Override + public int getAreaNumber() { + return 4; + } + + @Override + public int getAreaVersion() { + return 1; + } + + /** + * Creates an Element declared by the area itself. + * + * @param typeNumber The typeNumber field. + */ + private static org.ccsds.moims.mo.mal.structures.Element createAreaElement(int typeNumber) { + switch (typeNumber) { + case -7: return new org.ccsds.moims.mo.mc.structures.ObjectInstancePairList(); + case -6: return new org.ccsds.moims.mo.mc.structures.SeverityList(); + case -4: return new org.ccsds.moims.mo.mc.structures.ParameterExpressionList(); + case -3: return new org.ccsds.moims.mo.mc.structures.ConditionalConversionList(); + case -2: return new org.ccsds.moims.mo.mc.structures.AttributeValueList(); + case -1: return new org.ccsds.moims.mo.mc.structures.ArgumentDefinitionDetailsList(); + case 1: return new org.ccsds.moims.mo.mc.structures.ArgumentDefinitionDetails(); + case 2: return new org.ccsds.moims.mo.mc.structures.AttributeValue(); + case 3: return new org.ccsds.moims.mo.mc.structures.ConditionalConversion(); + case 4: return new org.ccsds.moims.mo.mc.structures.ParameterExpression(); + case 6: return new org.ccsds.moims.mo.mc.structures.Severity(); + case 7: return new org.ccsds.moims.mo.mc.structures.ObjectInstancePair(); + default: return null; + } + } + + /** + * Creates an Element declared by the Action service. + * + * @param typeNumber The typeNumber field. + */ + private static org.ccsds.moims.mo.mal.structures.Element createActionElement(int typeNumber) { + switch (typeNumber) { + case -4: return new org.ccsds.moims.mo.mc.action.structures.ActionCategoryList(); + case -3: return new org.ccsds.moims.mo.mc.action.structures.ActionCreationRequestList(); + case -2: return new org.ccsds.moims.mo.mc.action.structures.ActionInstanceDetailsList(); + case -1: return new org.ccsds.moims.mo.mc.action.structures.ActionDefinitionDetailsList(); + case 1: return new org.ccsds.moims.mo.mc.action.structures.ActionDefinitionDetails(); + case 2: return new org.ccsds.moims.mo.mc.action.structures.ActionInstanceDetails(); + case 3: return new org.ccsds.moims.mo.mc.action.structures.ActionCreationRequest(); + case 4: return new org.ccsds.moims.mo.mc.action.structures.ActionCategory(); + default: return null; + } + } + + /** + * Creates an Element declared by the Parameter service. + * + * @param typeNumber The typeNumber field. + */ + private static org.ccsds.moims.mo.mal.structures.Element createParameterElement(int typeNumber) { + switch (typeNumber) { + case -7: return new org.ccsds.moims.mo.mc.parameter.structures.ParameterValueDetailsList(); + case -6: return new org.ccsds.moims.mo.mc.parameter.structures.ParameterRawValueList(); + case -5: return new org.ccsds.moims.mo.mc.parameter.structures.ParameterCreationRequestList(); + case -4: return new org.ccsds.moims.mo.mc.parameter.structures.ValidityStateList(); + case -3: return new org.ccsds.moims.mo.mc.parameter.structures.ParameterConversionList(); + case -2: return new org.ccsds.moims.mo.mc.parameter.structures.ParameterValueList(); + case -1: return new org.ccsds.moims.mo.mc.parameter.structures.ParameterDefinitionDetailsList(); + case 1: return new org.ccsds.moims.mo.mc.parameter.structures.ParameterDefinitionDetails(); + case 2: return new org.ccsds.moims.mo.mc.parameter.structures.ParameterValue(); + case 3: return new org.ccsds.moims.mo.mc.parameter.structures.ParameterConversion(); + case 4: return new org.ccsds.moims.mo.mc.parameter.structures.ValidityState(); + case 5: return new org.ccsds.moims.mo.mc.parameter.structures.ParameterCreationRequest(); + case 6: return new org.ccsds.moims.mo.mc.parameter.structures.ParameterRawValue(); + case 7: return new org.ccsds.moims.mo.mc.parameter.structures.ParameterValueDetails(); + default: return null; + } + } + + /** + * Creates an Element declared by the Alert service. + * + * @param typeNumber The typeNumber field. + */ + private static org.ccsds.moims.mo.mal.structures.Element createAlertElement(int typeNumber) { + switch (typeNumber) { + case -3: return new org.ccsds.moims.mo.mc.alert.structures.AlertCreationRequestList(); + case -2: return new org.ccsds.moims.mo.mc.alert.structures.AlertEventDetailsList(); + case -1: return new org.ccsds.moims.mo.mc.alert.structures.AlertDefinitionDetailsList(); + case 1: return new org.ccsds.moims.mo.mc.alert.structures.AlertDefinitionDetails(); + case 2: return new org.ccsds.moims.mo.mc.alert.structures.AlertEventDetails(); + case 3: return new org.ccsds.moims.mo.mc.alert.structures.AlertCreationRequest(); + default: return null; + } + } + + /** + * Creates an Element declared by the Check service. + * + * @param typeNumber The typeNumber field. + */ + private static org.ccsds.moims.mo.mal.structures.Element createCheckElement(int typeNumber) { + switch (typeNumber) { + case -13: return new org.ccsds.moims.mo.mc.check.structures.CheckTypedInstanceList(); + case -12: return new org.ccsds.moims.mo.mc.check.structures.CompoundCheckDefinitionList(); + case -11: return new org.ccsds.moims.mo.mc.check.structures.LimitCheckDefinitionList(); + case -10: return new org.ccsds.moims.mo.mc.check.structures.DeltaCheckDefinitionList(); + case -9: return new org.ccsds.moims.mo.mc.check.structures.ReferenceCheckDefinitionList(); + case -8: return new org.ccsds.moims.mo.mc.check.structures.ConstantCheckDefinitionList(); + case -7: return new org.ccsds.moims.mo.mc.check.structures.ReferenceValueList(); + case -6: return new org.ccsds.moims.mo.mc.check.structures.CheckStateList(); + case -5: return new org.ccsds.moims.mo.mc.check.structures.CheckResultFilterList(); + case -4: return new org.ccsds.moims.mo.mc.check.structures.CheckResultSummaryList(); + case -3: return new org.ccsds.moims.mo.mc.check.structures.CheckLinkSummaryList(); + case -2: return new org.ccsds.moims.mo.mc.check.structures.CheckResultList(); + case -1: return new org.ccsds.moims.mo.mc.check.structures.CheckLinkDetailsList(); + case 1: return new org.ccsds.moims.mo.mc.check.structures.CheckLinkDetails(); + case 2: return new org.ccsds.moims.mo.mc.check.structures.CheckResult(); + case 3: return new org.ccsds.moims.mo.mc.check.structures.CheckLinkSummary(); + case 4: return new org.ccsds.moims.mo.mc.check.structures.CheckResultSummary(); + case 5: return new org.ccsds.moims.mo.mc.check.structures.CheckResultFilter(); + case 6: return new org.ccsds.moims.mo.mc.check.structures.CheckState(); + case 7: return new org.ccsds.moims.mo.mc.check.structures.ReferenceValue(); + case 8: return new org.ccsds.moims.mo.mc.check.structures.ConstantCheckDefinition(); + case 9: return new org.ccsds.moims.mo.mc.check.structures.ReferenceCheckDefinition(); + case 10: return new org.ccsds.moims.mo.mc.check.structures.DeltaCheckDefinition(); + case 11: return new org.ccsds.moims.mo.mc.check.structures.LimitCheckDefinition(); + case 12: return new org.ccsds.moims.mo.mc.check.structures.CompoundCheckDefinition(); + case 13: return new org.ccsds.moims.mo.mc.check.structures.CheckTypedInstance(); + default: return null; + } + } + + /** + * Creates an Element declared by the Statistic service. + * + * @param typeNumber The typeNumber field. + */ + private static org.ccsds.moims.mo.mal.structures.Element createStatisticElement(int typeNumber) { + switch (typeNumber) { + case -6: return new org.ccsds.moims.mo.mc.statistic.structures.StatisticEvaluationReportList(); + case -5: return new org.ccsds.moims.mo.mc.statistic.structures.StatisticLinkSummaryList(); + case -4: return new org.ccsds.moims.mo.mc.statistic.structures.StatisticCreationRequestList(); + case -3: return new org.ccsds.moims.mo.mc.statistic.structures.StatisticValueList(); + case -2: return new org.ccsds.moims.mo.mc.statistic.structures.StatisticLinkDetailsList(); + case -1: return new org.ccsds.moims.mo.mc.statistic.structures.StatisticFunctionDetailsList(); + case 1: return new org.ccsds.moims.mo.mc.statistic.structures.StatisticFunctionDetails(); + case 2: return new org.ccsds.moims.mo.mc.statistic.structures.StatisticLinkDetails(); + case 3: return new org.ccsds.moims.mo.mc.statistic.structures.StatisticValue(); + case 4: return new org.ccsds.moims.mo.mc.statistic.structures.StatisticCreationRequest(); + case 5: return new org.ccsds.moims.mo.mc.statistic.structures.StatisticLinkSummary(); + case 6: return new org.ccsds.moims.mo.mc.statistic.structures.StatisticEvaluationReport(); + default: return null; + } + } + + /** + * Creates an Element declared by the Aggregation service. + * + * @param typeNumber The typeNumber field. + */ + private static org.ccsds.moims.mo.mal.structures.Element createAggregationElement(int typeNumber) { + switch (typeNumber) { + case -11: return new org.ccsds.moims.mo.mc.aggregation.structures.AggregationValueDetailsList(); + case -10: return new org.ccsds.moims.mo.mc.aggregation.structures.AggregationCreationRequestList(); + case -9: return new org.ccsds.moims.mo.mc.aggregation.structures.GenerationModeList(); + case -8: return new org.ccsds.moims.mo.mc.aggregation.structures.ThresholdTypeList(); + case -7: return new org.ccsds.moims.mo.mc.aggregation.structures.AggregationCategoryList(); + case -6: return new org.ccsds.moims.mo.mc.aggregation.structures.ThresholdFilterList(); + case -5: return new org.ccsds.moims.mo.mc.aggregation.structures.AggregationParameterValueList(); + case -4: return new org.ccsds.moims.mo.mc.aggregation.structures.AggregationSetValueList(); + case -3: return new org.ccsds.moims.mo.mc.aggregation.structures.AggregationValueList(); + case -2: return new org.ccsds.moims.mo.mc.aggregation.structures.AggregationParameterSetList(); + case -1: return new org.ccsds.moims.mo.mc.aggregation.structures.AggregationDefinitionDetailsList(); + case 1: return new org.ccsds.moims.mo.mc.aggregation.structures.AggregationDefinitionDetails(); + case 2: return new org.ccsds.moims.mo.mc.aggregation.structures.AggregationParameterSet(); + case 3: return new org.ccsds.moims.mo.mc.aggregation.structures.AggregationValue(); + case 4: return new org.ccsds.moims.mo.mc.aggregation.structures.AggregationSetValue(); + case 5: return new org.ccsds.moims.mo.mc.aggregation.structures.AggregationParameterValue(); + case 6: return new org.ccsds.moims.mo.mc.aggregation.structures.ThresholdFilter(); + case 7: return new org.ccsds.moims.mo.mc.aggregation.structures.AggregationCategory(); + case 8: return new org.ccsds.moims.mo.mc.aggregation.structures.ThresholdType(); + case 9: return new org.ccsds.moims.mo.mc.aggregation.structures.GenerationMode(); + case 10: return new org.ccsds.moims.mo.mc.aggregation.structures.AggregationCreationRequest(); + case 11: return new org.ccsds.moims.mo.mc.aggregation.structures.AggregationValueDetails(); + default: return null; + } + } + + /** + * Creates an Element declared by the Conversion service. + * + * @param typeNumber The typeNumber field. + */ + private static org.ccsds.moims.mo.mal.structures.Element createConversionElement(int typeNumber) { + switch (typeNumber) { + case -4: return new org.ccsds.moims.mo.mc.conversion.structures.RangeConversionDetailsList(); + case -3: return new org.ccsds.moims.mo.mc.conversion.structures.PolyConversionDetailsList(); + case -2: return new org.ccsds.moims.mo.mc.conversion.structures.LineConversionDetailsList(); + case -1: return new org.ccsds.moims.mo.mc.conversion.structures.DiscreteConversionDetailsList(); + case 1: return new org.ccsds.moims.mo.mc.conversion.structures.DiscreteConversionDetails(); + case 2: return new org.ccsds.moims.mo.mc.conversion.structures.LineConversionDetails(); + case 3: return new org.ccsds.moims.mo.mc.conversion.structures.PolyConversionDetails(); + case 4: return new org.ccsds.moims.mo.mc.conversion.structures.RangeConversionDetails(); + default: return null; + } + } + + /** + * Creates an Element declared by the Group service. + * + * @param typeNumber The typeNumber field. + */ + private static org.ccsds.moims.mo.mal.structures.Element createGroupElement(int typeNumber) { + switch (typeNumber) { + case -1: return new org.ccsds.moims.mo.mc.group.structures.GroupDetailsList(); + case 1: return new org.ccsds.moims.mo.mc.group.structures.GroupDetails(); + default: return null; + } + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/MCHelper.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/MCHelper.java new file mode 100644 index 00000000..2c62327a --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/MCHelper.java @@ -0,0 +1,80 @@ +package org.ccsds.moims.mo.mc; + +/** + * Helper class for MC area. + */ +public class MCHelper { + + /** + * Area number literal. + */ + public static final int _MC_AREA_NUMBER = 4; + + /** + * Area number instance. + */ + public static final org.ccsds.moims.mo.mal.structures.UShort MC_AREA_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_MC_AREA_NUMBER); + + /** + * Area name constant. + */ + public static final org.ccsds.moims.mo.mal.structures.Identifier MC_AREA_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("MC"); + + /** + * Area version literal. + */ + public static final short _MC_AREA_VERSION = 1; + + /** + * Area version instance. + */ + public static final org.ccsds.moims.mo.mal.structures.UOctet MC_AREA_VERSION = new org.ccsds.moims.mo.mal.structures.UOctet(_MC_AREA_VERSION); + + /** + * Area Elements. + */ + public static final org.ccsds.moims.mo.mal.structures.Element[] MC_AREA_ELEMENTS = {}; + + /** + * Services in this Area. + */ + public static final org.ccsds.moims.mo.mal.ServiceInfo[] MC_AREA_SERVICES = { + org.ccsds.moims.mo.mc.action.ActionHelper.ACTION_SERVICE, + org.ccsds.moims.mo.mc.parameter.ParameterHelper.PARAMETER_SERVICE, + org.ccsds.moims.mo.mc.alert.AlertHelper.ALERT_SERVICE, + org.ccsds.moims.mo.mc.check.CheckHelper.CHECK_SERVICE, + org.ccsds.moims.mo.mc.statistic.StatisticHelper.STATISTIC_SERVICE, + org.ccsds.moims.mo.mc.aggregation.AggregationHelper.AGGREGATION_SERVICE, + org.ccsds.moims.mo.mc.conversion.ConversionHelper.CONVERSION_SERVICE, + org.ccsds.moims.mo.mc.group.GroupHelper.GROUP_SERVICE,}; + + /** + * Area singleton instance. + */ + public static final org.ccsds.moims.mo.mal.MALArea MC_AREA = new org.ccsds.moims.mo.mal.MALArea(MC_AREA_NUMBER, MC_AREA_NAME, MC_AREA_VERSION, MC_AREA_ELEMENTS, MC_AREA_SERVICES, new MCElementFactory()); + + /** + * Error literal for error READONLY. + */ + public static final long _READONLY_ERROR_NUMBER = 70020; + + /** + * Error instance for error READONLY. + */ + public static final org.ccsds.moims.mo.mal.structures.UInteger READONLY_ERROR_NUMBER = new org.ccsds.moims.mo.mal.structures.UInteger(_READONLY_ERROR_NUMBER); + + /** + * Error literal for error REFERENCED. + */ + public static final long _REFERENCED_ERROR_NUMBER = 70021; + + /** + * Error instance for error REFERENCED. + */ + public static final org.ccsds.moims.mo.mal.structures.UInteger REFERENCED_ERROR_NUMBER = new org.ccsds.moims.mo.mal.structures.UInteger(_REFERENCED_ERROR_NUMBER); + + private MCHelper() { + // Utility class; not meant to be instantiated. + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/ReadonlyException.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/ReadonlyException.java new file mode 100644 index 00000000..212da585 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/ReadonlyException.java @@ -0,0 +1,27 @@ +package org.ccsds.moims.mo.mc; + +/** + * The ReadonlyException exception. Operation specific. + */ +public final class ReadonlyException extends org.ccsds.moims.mo.mal.MOErrorException { + + private static final String MO_ERROR_NAME = "READONLY"; + + /** + * Constructs a new ReadonlyException exception. + * + */ + public ReadonlyException() { + super(MO_ERROR_NAME, MCHelper.READONLY_ERROR_NUMBER, ""); + } + + /** + * Constructs a new ReadonlyException exception. + * + * @param extraInformation The extraInformation of the exception. + */ + public ReadonlyException(Object extraInformation) { + super(MO_ERROR_NAME, MCHelper.READONLY_ERROR_NUMBER, extraInformation); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/ReferencedException.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/ReferencedException.java new file mode 100644 index 00000000..50c6e94c --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/ReferencedException.java @@ -0,0 +1,27 @@ +package org.ccsds.moims.mo.mc; + +/** + * The ReferencedException exception. Operation specific. + */ +public final class ReferencedException extends org.ccsds.moims.mo.mal.MOErrorException { + + private static final String MO_ERROR_NAME = "REFERENCED"; + + /** + * Constructs a new ReferencedException exception. + * + */ + public ReferencedException() { + super(MO_ERROR_NAME, MCHelper.REFERENCED_ERROR_NUMBER, ""); + } + + /** + * Constructs a new ReferencedException exception. + * + * @param extraInformation The extraInformation of the exception. + */ + public ReferencedException(Object extraInformation) { + super(MO_ERROR_NAME, MCHelper.REFERENCED_ERROR_NUMBER, extraInformation); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/action/ActionHelper.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/action/ActionHelper.java new file mode 100644 index 00000000..f7d4a2ea --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/action/ActionHelper.java @@ -0,0 +1,17 @@ +package org.ccsds.moims.mo.mc.action; + +/** + * Helper class for Action service. + */ +public class ActionHelper { + + /** + * Service singleton instance. + */ + public static final org.ccsds.moims.mo.mc.action.ActionServiceInfo ACTION_SERVICE = new org.ccsds.moims.mo.mc.action.ActionServiceInfo(); + + private ActionHelper() { + // Utility class; not meant to be instantiated. + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/action/ActionServiceInfo.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/action/ActionServiceInfo.java new file mode 100644 index 00000000..ed377da8 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/action/ActionServiceInfo.java @@ -0,0 +1,334 @@ +package org.ccsds.moims.mo.mc.action; + +/** + * Helper class for Action service. + */ +public class ActionServiceInfo extends org.ccsds.moims.mo.com.COMService { + + /** + * Service number literal. + */ + public static final int _ACTION_SERVICE_NUMBER = 1; + + /** + * Service number instance. + */ + public static final org.ccsds.moims.mo.mal.structures.UShort ACTION_SERVICE_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_ACTION_SERVICE_NUMBER); + + /** + * Service name constant. + */ + public static final org.ccsds.moims.mo.mal.structures.Identifier ACTION_SERVICE_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("Action"); + + /** + * The service key of this service. + */ + private static final org.ccsds.moims.mo.mal.ServiceKey SERVICE_KEY = new org.ccsds.moims.mo.mal.ServiceKey( + 4, 1, ACTION_SERVICE_NUMBER); + + /** + * Operation number literal for operation SUBMITACTION. + */ + public static final int _SUBMITACTION_OP_NUMBER = 1; + + /** + * Operation number instance for operation SUBMITACTION. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort SUBMITACTION_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_SUBMITACTION_OP_NUMBER); + + /** + * Operation instance for operation SUBMITACTION. + */ + public static final org.ccsds.moims.mo.mal.MALSubmitOperation SUBMITACTION_OP = new org.ccsds.moims.mo.mal.MALSubmitOperation(SERVICE_KEY, + SUBMITACTION_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("submitAction"), + new org.ccsds.moims.mo.mal.structures.UShort(1), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("actionInstId", true, org.ccsds.moims.mo.mal.structures.Attribute.LONG_SHORT_FORM, "The actionInstId field of the submission shall contain the object instance identifier of the ActionInstance to be used for activity tracking events."), + new org.ccsds.moims.mo.mal.OperationField("actionDetails", true, org.ccsds.moims.mo.mc.action.structures.ActionInstanceDetails.SHORT_FORM, "The actionDetails part of the submission shall contain the argument values and related information of the action instance to be executed.\nIf the defInstId of the supplied actionDetails field does not match a known ActionDefinition object then an UNKNOWN error shall be returned.\nThe size of the argumentValues list of the ActionInstanceDetails structure shall be compared to the size of the argument list in the matched ActionDefinition object and an INVALID error shall be returned if they are not the same.\nIf the ActionInstanceDetails structure contains an argumentIds field value then this shall be compared to the same field in the matched ActionDefinition object and must be the same size and contain the same values, an INVALID error shall be returned if this is not the case.\nIf the ActionInstanceDetails structure contains an isRawValue field value then the size of this list shall be compared to the size of the argument list in the matched ActionDefinition object and an INVALID error shall be returned if they are not the same.\nIf the supplied argument values do not match the attribute type specified in the action definition then an INVALID error shall be returned.\nA service provider may apply some deployment specific checks to the action instance and can return an INVALID error if they fail.\nIf an error is raised then no action shall be executed.\nThe SUBMIT acknowledgement shall be returned once the action has been accepted for execution but before execution starts.")}, + "The submitAction operation allows a consumer to submit an action to a provider for remote execution."); + + /** + * Operation number literal for operation PRECHECKACTION. + */ + public static final int _PRECHECKACTION_OP_NUMBER = 2; + + /** + * Operation number instance for operation PRECHECKACTION. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort PRECHECKACTION_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_PRECHECKACTION_OP_NUMBER); + + /** + * Operation instance for operation PRECHECKACTION. + */ + public static final org.ccsds.moims.mo.mal.MALRequestOperation PRECHECKACTION_OP = new org.ccsds.moims.mo.mal.MALRequestOperation(SERVICE_KEY, + PRECHECKACTION_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("preCheckAction"), + new org.ccsds.moims.mo.mal.structures.UShort(1), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("actionDetails", true, org.ccsds.moims.mo.mc.action.structures.ActionInstanceDetails.SHORT_FORM, "The actionDetails part of the submission shall contain the argument values and related information of the action instance to be executed.\nIf the ActionInstanceDetails structure contains an argumentIds field value then this shall be compared to the same field in the matched ActionDefinition object and must be the same size and contain the same values, an INVALID error shall be returned if this is not the case.\nIf the supplied argument values do not match the attribute type specified in the action definition then an INVALID error shall be returned.\nA service provider may apply some deployment specific checks to the action instance and can return an INVALID error if they fail.")}, + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("accepted", true, org.ccsds.moims.mo.mal.structures.Attribute.BOOLEAN_SHORT_FORM, "The returned Boolean shall be set to TRUE if the action would be accepted successfully; otherwise the operation shall return FALSE.")}, + "The preCheckAction operation allows a consumer to check that an action would be successfully accepted for execution without actually submitting the action. The operation is expected to be provided by local action proxies rather than the remote system to allow for quick local checks before sending the action over long and slow space links."); + + /** + * Operation number literal for operation LISTDEFINITION. + */ + public static final int _LISTDEFINITION_OP_NUMBER = 3; + + /** + * Operation number instance for operation LISTDEFINITION. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort LISTDEFINITION_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_LISTDEFINITION_OP_NUMBER); + + /** + * Operation instance for operation LISTDEFINITION. + */ + public static final org.ccsds.moims.mo.mal.MALRequestOperation LISTDEFINITION_OP = new org.ccsds.moims.mo.mal.MALRequestOperation(SERVICE_KEY, + LISTDEFINITION_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("listDefinition"), + new org.ccsds.moims.mo.mal.structures.UShort(2), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("actionNames", true, org.ccsds.moims.mo.mal.structures.IdentifierList.SHORT_FORM, "The actionNames field shall contain a list of action names to retrieve the ActionIdentity and ActionDefinition object instance identifiers for.\nThe request may contain the wildcard value of '*' to return all supported ActionIdentity and ActionDefinition objects.\nThe wildcard value should be checked for first, if found no other checks of supplied identifiers shall be made.\nIf a provided identifier does not include a wildcard and does not match an existing ActionIdentity object then this operation shall fail with an UNKNOWN error.")}, + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("actionInstIds", true, org.ccsds.moims.mo.mc.structures.ObjectInstancePairList.SHORT_FORM, "The response shall contain a list of matching ActionIdentity and ActionDefinition object instance identifiers.\nThe returned list shall maintain the same order as the submitted list unless the wildcard value was included in the request.")}, + "The listDefinition operation allows a consumer to request the object instance identifiers of the latest ActionIdentity and ActionDefinition objects for the supported actions of the provider."); + + /** + * Operation number literal for operation ADDACTION. + */ + public static final int _ADDACTION_OP_NUMBER = 4; + + /** + * Operation number instance for operation ADDACTION. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort ADDACTION_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_ADDACTION_OP_NUMBER); + + /** + * Operation instance for operation ADDACTION. + */ + public static final org.ccsds.moims.mo.mal.MALRequestOperation ADDACTION_OP = new org.ccsds.moims.mo.mal.MALRequestOperation(SERVICE_KEY, + ADDACTION_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("addAction"), + new org.ccsds.moims.mo.mal.structures.UShort(3), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("actionDefDetails", true, org.ccsds.moims.mo.mc.action.structures.ActionCreationRequestList.SHORT_FORM, "The actionDefDetails field shall hold the name and definitions to be added.\nThe name field must not be the wildcard '*', or empty (an INVALID error shall be returned in this case).\nThe supplied name must be unique among all ActionIdentity objects for the domain of the provider otherwise a DUPLICATE error shall be raised.\nIf an error is raised then no new identities and definitions shall be added as a result of this operation call.\nIf the supplied name matches an existing, but removed, ActionIdentity then that ActionIdentity shall be reused otherwise a new ActionIdentity shall be created.\nThe provider shall create a new ActionDefinition object and store it, and any new ActionIdentity objects, in the COM archive.")}, + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("newObjInstIds", true, org.ccsds.moims.mo.mc.structures.ObjectInstancePairList.SHORT_FORM, "The response shall contain the list of object instance identifiers for the ActionIdentity and new ActionDefinition objects.\nThe returned list shall maintain the same order as the submitted definitions.")}, + "The addAction operation allows a consumer to define one or more actions that do not currently exist. The new ActionIdentity and ActionDefinition objects are expected to be stored in the COM archive by the provider of the action service."); + + /** + * Operation number literal for operation UPDATEDEFINITION. + */ + public static final int _UPDATEDEFINITION_OP_NUMBER = 5; + + /** + * Operation number instance for operation UPDATEDEFINITION. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort UPDATEDEFINITION_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_UPDATEDEFINITION_OP_NUMBER); + + /** + * Operation instance for operation UPDATEDEFINITION. + */ + public static final org.ccsds.moims.mo.mal.MALRequestOperation UPDATEDEFINITION_OP = new org.ccsds.moims.mo.mal.MALRequestOperation(SERVICE_KEY, + UPDATEDEFINITION_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("updateDefinition"), + new org.ccsds.moims.mo.mal.structures.UShort(3), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("actionObjInstIds", true, org.ccsds.moims.mo.mal.structures.LongList.SHORT_FORM, "The actionObjInstIds field shall contain the list of object instance identifiers of the ActionIdentity objects to be updated.\nThe supplied object instance identifiers shall match existing identity objects, an UNKNOWN error shall be raised if this is not the case.\nIf the actionObjInstIds list contains either NULL or '0' an INVALID error shall be raised."), + new org.ccsds.moims.mo.mal.OperationField("actionDefDetails", true, org.ccsds.moims.mo.mc.action.structures.ActionDefinitionDetailsList.SHORT_FORM, "The actionDefDetails field shall contain the replacement ActionDefinitionDetails.\nThe two lists shall be ordered the same.\nThe number of entries in the two lists shall be the same size otherwise an INVALID error shall be returned.\nIf an error is raised then no definitions shall be modified as a result of this operation call.\nThe provider shall create a new ActionDefinition object and store it in the COM archive.\nThe new ActionDefinition object shall be the current ActionDefinition used for the specific ActionIdentity.")}, + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("newDefInstIds", true, org.ccsds.moims.mo.mal.structures.LongList.SHORT_FORM, "The response shall contain the list of object instance identifiers for the new ActionDefinition objects.\nThe returned list shall maintain the same order as the submitted definitions.")}, + "The updateDefinition operation allows a consumer to update a definition for one or more actions.\nThis differs from deleting an existing action and adding a new definition with the same name in the fact that the ActionIdentity object is not changed between the two definitions.\nThe replacement definition should be stored in the COM archive by the service provider. The operation does not remove the previous ActionDefinition object from the COM archive, merely removes the object from the provider. This permits existing, and completed, ActionInstance objects to continue to reference the correct ActionIdentity and ActionDefinition objects in the COM archive."); + + /** + * Operation number literal for operation REMOVEACTION. + */ + public static final int _REMOVEACTION_OP_NUMBER = 6; + + /** + * Operation number instance for operation REMOVEACTION. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort REMOVEACTION_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_REMOVEACTION_OP_NUMBER); + + /** + * Operation instance for operation REMOVEACTION. + */ + public static final org.ccsds.moims.mo.mal.MALSubmitOperation REMOVEACTION_OP = new org.ccsds.moims.mo.mal.MALSubmitOperation(SERVICE_KEY, + REMOVEACTION_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("removeAction"), + new org.ccsds.moims.mo.mal.structures.UShort(3), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("actionInstIds", true, org.ccsds.moims.mo.mal.structures.LongList.SHORT_FORM, "The actionInstIds field shall hold the object instance identifiers of the ActionIdentity objects to be removed from the provider.\nThe wildcard value of '0' in the list of object instance identifiers shall be supported and matches all actions of the provider.\nThe wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made.\nIf a provided ActionIdentity object instance identifier does not include a wildcard and does not match an existing ActionIdentity object then this operation shall fail with an UNKNOWN error.\nIf a matched definition is still being used by an executing action instance then this operation shall not fail because of this reason.\nMatched ActionIdentity objects shall not be removed from the COM archive only the list of ActionIdentity objects in the provider.\nRemoved ActionIdentity object shall not be allowed to be referenced by new action instances.\nIf an error is raised then no actions shall be removed as a result of this operation call.")}, + "The removeAction operation allows a consumer to remove one or more actions from the list of actions supported by the action provider.\nThe operation does not remove the ActionIdentity or ActionDefinition object from the COM archive, merely removes the objects from the provider. This permits existing, and completed, ActionInstance objects to continue to reference the correct ActionIdentity and ActionDefinition objects in the COM archive."); + + /** + * Area elements. + */ + public static final org.ccsds.moims.mo.mal.structures.Element[] ACTION_SERVICE_ELEMENTS = {}; + + /** + * The set of operations for this service. + */ + public static final org.ccsds.moims.mo.mal.MALOperation[] OPERATIONS = new org.ccsds.moims.mo.mal.MALOperation[]{SUBMITACTION_OP, + PRECHECKACTION_OP, + LISTDEFINITION_OP, + ADDACTION_OP, + UPDATEDEFINITION_OP, + REMOVEACTION_OP}; + + /** + * Literal for object ACTIONIDENTITY. + */ + @Deprecated + public static final int _ACTIONIDENTITY_OBJECT_NUMBER = 1; + + /** + * Instance for object ACTIONIDENTITY. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.UShort ACTIONIDENTITY_OBJECT_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_ACTIONIDENTITY_OBJECT_NUMBER); + + /** + * Object name constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.Identifier ACTIONIDENTITY_OBJECT_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("ActionIdentity"); + + /** + * Object type constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.com.structures.ObjectType ACTIONIDENTITY_OBJECT_TYPE = new org.ccsds.moims.mo.com.structures.ObjectType(new org.ccsds.moims.mo.mal.structures.UShort(4), ACTION_SERVICE_NUMBER, new org.ccsds.moims.mo.mal.structures.UOctet(1), ACTIONIDENTITY_OBJECT_NUMBER); + + /** + * Object instance. + */ + @Deprecated + public static org.ccsds.moims.mo.com.COMObject ACTIONIDENTITY_OBJECT = new org.ccsds.moims.mo.com.COMObject(ACTIONIDENTITY_OBJECT_TYPE, ACTIONIDENTITY_OBJECT_NAME, org.ccsds.moims.mo.mal.structures.Attribute.IDENTIFIER_SHORT_FORM, false, null, true, null, false); + + /** + * Literal for object ACTIONDEFINITION. + */ + @Deprecated + public static final int _ACTIONDEFINITION_OBJECT_NUMBER = 2; + + /** + * Instance for object ACTIONDEFINITION. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.UShort ACTIONDEFINITION_OBJECT_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_ACTIONDEFINITION_OBJECT_NUMBER); + + /** + * Object name constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.Identifier ACTIONDEFINITION_OBJECT_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("ActionDefinition"); + + /** + * Object type constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.com.structures.ObjectType ACTIONDEFINITION_OBJECT_TYPE = new org.ccsds.moims.mo.com.structures.ObjectType(new org.ccsds.moims.mo.mal.structures.UShort(4), ACTION_SERVICE_NUMBER, new org.ccsds.moims.mo.mal.structures.UOctet(1), ACTIONDEFINITION_OBJECT_NUMBER); + + /** + * Object instance. + */ + @Deprecated + public static org.ccsds.moims.mo.com.COMObject ACTIONDEFINITION_OBJECT = new org.ccsds.moims.mo.com.COMObject(ACTIONDEFINITION_OBJECT_TYPE, ACTIONDEFINITION_OBJECT_NAME, org.ccsds.moims.mo.mc.action.structures.ActionDefinitionDetails.SHORT_FORM, true, org.ccsds.moims.mo.mc.action.ActionServiceInfo.ACTIONIDENTITY_OBJECT_TYPE, true, null, false); + + /** + * Literal for object ACTIONINSTANCE. + */ + @Deprecated + public static final int _ACTIONINSTANCE_OBJECT_NUMBER = 3; + + /** + * Instance for object ACTIONINSTANCE. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.UShort ACTIONINSTANCE_OBJECT_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_ACTIONINSTANCE_OBJECT_NUMBER); + + /** + * Object name constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.Identifier ACTIONINSTANCE_OBJECT_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("ActionInstance"); + + /** + * Object type constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.com.structures.ObjectType ACTIONINSTANCE_OBJECT_TYPE = new org.ccsds.moims.mo.com.structures.ObjectType(new org.ccsds.moims.mo.mal.structures.UShort(4), ACTION_SERVICE_NUMBER, new org.ccsds.moims.mo.mal.structures.UOctet(1), ACTIONINSTANCE_OBJECT_NUMBER); + + /** + * Object instance. + */ + @Deprecated + public static org.ccsds.moims.mo.com.COMObject ACTIONINSTANCE_OBJECT = new org.ccsds.moims.mo.com.COMObject(ACTIONINSTANCE_OBJECT_TYPE, ACTIONINSTANCE_OBJECT_NAME, org.ccsds.moims.mo.mc.action.structures.ActionInstanceDetails.SHORT_FORM, true, org.ccsds.moims.mo.mc.action.ActionServiceInfo.ACTIONDEFINITION_OBJECT_TYPE, true, null, false); + + /** + * Literal for object ACTIONFAILURE. + */ + @Deprecated + public static final int _ACTIONFAILURE_OBJECT_NUMBER = 6; + + /** + * Instance for object ACTIONFAILURE. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.UShort ACTIONFAILURE_OBJECT_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_ACTIONFAILURE_OBJECT_NUMBER); + + /** + * Object name constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.Identifier ACTIONFAILURE_OBJECT_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("ActionFailure"); + + /** + * Object type constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.com.structures.ObjectType ACTIONFAILURE_OBJECT_TYPE = new org.ccsds.moims.mo.com.structures.ObjectType(new org.ccsds.moims.mo.mal.structures.UShort(4), ACTION_SERVICE_NUMBER, new org.ccsds.moims.mo.mal.structures.UOctet(1), ACTIONFAILURE_OBJECT_NUMBER); + + /** + * Object instance. + */ + @Deprecated + public static org.ccsds.moims.mo.com.COMObject ACTIONFAILURE_OBJECT = new org.ccsds.moims.mo.com.COMObject(ACTIONFAILURE_OBJECT_TYPE, ACTIONFAILURE_OBJECT_NAME, org.ccsds.moims.mo.mal.structures.Attribute.UINTEGER_SHORT_FORM, true, org.ccsds.moims.mo.mc.action.ActionServiceInfo.ACTIONINSTANCE_OBJECT_TYPE, true, org.ccsds.moims.mo.com.activitytracking.ActivityTrackingServiceInfo.EXECUTION_OBJECT_TYPE, true); + + /** + * Object instance. + */ + public static final org.ccsds.moims.mo.com.COMObject[] COM_OBJECTS = { + ACTIONIDENTITY_OBJECT, + ACTIONDEFINITION_OBJECT, + ACTIONINSTANCE_OBJECT, + ACTIONFAILURE_OBJECT,}; + + /** + * Creates an instance of the Action ServiceInfo. + * + */ + public ActionServiceInfo() { + super(SERVICE_KEY, ACTION_SERVICE_NAME, ACTION_SERVICE_ELEMENTS, OPERATIONS, COM_OBJECTS); + } + + @Override + public org.ccsds.moims.mo.mal.MALArea getArea() { + return org.ccsds.moims.mo.mc.MCHelper.MC_AREA; + } + + @Override + public org.ccsds.moims.mo.mal.MOErrorException generateMOError(int errorNumber, + Object extraInfo) { + switch (errorNumber) { + case 70020: + return new org.ccsds.moims.mo.mc.ReadonlyException(extraInfo); + case 70021: + return new org.ccsds.moims.mo.mc.ReferencedException(extraInfo); + } + return null; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/action/consumer/ActionAdapter.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/action/consumer/ActionAdapter.java new file mode 100644 index 00000000..a186b279 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/action/consumer/ActionAdapter.java @@ -0,0 +1,242 @@ +package org.ccsds.moims.mo.mc.action.consumer; + +/** + * Consumer adapter for Action service. + */ +public abstract class ActionAdapter extends org.ccsds.moims.mo.mal.consumer.MALInteractionAdapter { + + /** + * Called by the MAL when a SUBMIT acknowledgement is received from a provider + * for the operation submitAction. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void submitActionAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a SUBMIT acknowledgement error is received from + * a provider for the operation submitAction. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void submitActionErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response is received from a provider for + * the operation preCheckAction. + * + * @param msgHeader msgHeader The header of the received message + * @param accepted The returned Boolean shall be set to TRUE if the action would be accepted successfully; otherwise the operation shall return FALSE. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void preCheckActionResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + Boolean accepted, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response error is received from a provider + * for the operation preCheckAction. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void preCheckActionErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response is received from a provider for + * the operation listDefinition. + * + * @param msgHeader msgHeader The header of the received message + * @param actionInstIds The response shall contain a list of matching ActionIdentity and ActionDefinition object instance identifiers. +The returned list shall maintain the same order as the submitted list unless the wildcard value was included in the request. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void listDefinitionResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mc.structures.ObjectInstancePairList actionInstIds, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response error is received from a provider + * for the operation listDefinition. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void listDefinitionErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response is received from a provider for + * the operation addAction. + * + * @param msgHeader msgHeader The header of the received message + * @param newObjInstIds The response shall contain the list of object instance identifiers for the ActionIdentity and new ActionDefinition objects. +The returned list shall maintain the same order as the submitted definitions. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void addActionResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mc.structures.ObjectInstancePairList newObjInstIds, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response error is received from a provider + * for the operation addAction. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void addActionErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response is received from a provider for + * the operation updateDefinition. + * + * @param msgHeader msgHeader The header of the received message + * @param newDefInstIds The response shall contain the list of object instance identifiers for the new ActionDefinition objects. +The returned list shall maintain the same order as the submitted definitions. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void updateDefinitionResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.structures.LongList newDefInstIds, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response error is received from a provider + * for the operation updateDefinition. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void updateDefinitionErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a SUBMIT acknowledgement is received from a provider + * for the operation removeAction. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void removeActionAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a SUBMIT acknowledgement error is received from + * a provider for the operation removeAction. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void removeActionErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + @Override + public final void submitAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mc.action.ActionServiceInfo._SUBMITACTION_OP_NUMBER: + submitActionAckReceived(msgHeader, qosProperties); + break; + case org.ccsds.moims.mo.mc.action.ActionServiceInfo._REMOVEACTION_OP_NUMBER: + removeActionAckReceived(msgHeader, qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void submitErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALErrorBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mc.action.ActionServiceInfo._SUBMITACTION_OP_NUMBER: + submitActionErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mc.action.ActionServiceInfo._REMOVEACTION_OP_NUMBER: + removeActionErrorReceived(msgHeader, body.getError(), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void requestResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALMessageBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mc.action.ActionServiceInfo._PRECHECKACTION_OP_NUMBER: + preCheckActionResponseReceived(msgHeader, + (body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.Union(Boolean.FALSE)) == null) ? null : ((org.ccsds.moims.mo.mal.structures.Union) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.Union(Boolean.FALSE))).getBooleanValue(), qosProperties); + break; + case org.ccsds.moims.mo.mc.action.ActionServiceInfo._LISTDEFINITION_OP_NUMBER: + listDefinitionResponseReceived(msgHeader, + (org.ccsds.moims.mo.mc.structures.ObjectInstancePairList) body.getBodyElement(0, new org.ccsds.moims.mo.mc.structures.ObjectInstancePairList()), qosProperties); + break; + case org.ccsds.moims.mo.mc.action.ActionServiceInfo._ADDACTION_OP_NUMBER: + addActionResponseReceived(msgHeader, + (org.ccsds.moims.mo.mc.structures.ObjectInstancePairList) body.getBodyElement(0, new org.ccsds.moims.mo.mc.structures.ObjectInstancePairList()), qosProperties); + break; + case org.ccsds.moims.mo.mc.action.ActionServiceInfo._UPDATEDEFINITION_OP_NUMBER: + updateDefinitionResponseReceived(msgHeader, + (org.ccsds.moims.mo.mal.structures.LongList) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.LongList()), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void requestErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALErrorBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mc.action.ActionServiceInfo._PRECHECKACTION_OP_NUMBER: + preCheckActionErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mc.action.ActionServiceInfo._LISTDEFINITION_OP_NUMBER: + listDefinitionErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mc.action.ActionServiceInfo._ADDACTION_OP_NUMBER: + addActionErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mc.action.ActionServiceInfo._UPDATEDEFINITION_OP_NUMBER: + updateDefinitionErrorReceived(msgHeader, body.getError(), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/action/consumer/ActionStub.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/action/consumer/ActionStub.java new file mode 100644 index 00000000..770c9d98 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/action/consumer/ActionStub.java @@ -0,0 +1,397 @@ +package org.ccsds.moims.mo.mc.action.consumer; + +/** + * Consumer stub for Action service. + */ +public class ActionStub { + + /** + * The consumer field. + */ + private final org.ccsds.moims.mo.mal.consumer.MALConsumer consumer; + + /** + * Wraps a MALconsumer connection with service specific methods that map from + * the high level service API to the generic MAL API. + * + * @param consumer consumer The MALConsumer to use in this stub. + */ + public ActionStub(org.ccsds.moims.mo.mal.consumer.MALConsumer consumer) { + this.consumer = consumer; + } + + /** + * Returns the internal MAL consumer object used for sending of messages from + * this interface. + * + * @return The MAL consumer object. + */ + public org.ccsds.moims.mo.mal.consumer.MALConsumer getConsumer() { + return consumer; + } + + /** + * The submitAction operation allows a consumer to submit an action to a provider + * for remote execution. + * + * @param actionInstId The actionInstId field of the submission shall contain the object instance identifier of the ActionInstance to be used for activity tracking events. + * @param actionDetails The actionDetails part of the submission shall contain the argument values and related information of the action instance to be executed. +If the defInstId of the supplied actionDetails field does not match a known ActionDefinition object then an UNKNOWN error shall be returned. +The size of the argumentValues list of the ActionInstanceDetails structure shall be compared to the size of the argument list in the matched ActionDefinition object and an INVALID error shall be returned if they are not the same. +If the ActionInstanceDetails structure contains an argumentIds field value then this shall be compared to the same field in the matched ActionDefinition object and must be the same size and contain the same values, an INVALID error shall be returned if this is not the case. +If the ActionInstanceDetails structure contains an isRawValue field value then the size of this list shall be compared to the size of the argument list in the matched ActionDefinition object and an INVALID error shall be returned if they are not the same. +If the supplied argument values do not match the attribute type specified in the action definition then an INVALID error shall be returned. +A service provider may apply some deployment specific checks to the action instance and can return an INVALID error if they fail. +If an error is raised then no action shall be executed. +The SUBMIT acknowledgement shall be returned once the action has been accepted for execution but before execution starts. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void submitAction(Long actionInstId, + org.ccsds.moims.mo.mc.action.structures.ActionInstanceDetails actionDetails) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.submit(org.ccsds.moims.mo.mc.action.ActionServiceInfo.SUBMITACTION_OP, (actionInstId == null) ? null : new org.ccsds.moims.mo.mal.structures.Union(actionInstId), actionDetails); + } + + /** + * Asynchronous version of method submitAction. + * + * @param actionInstId The actionInstId field of the submission shall contain the object instance identifier of the ActionInstance to be used for activity tracking events. + * @param actionDetails The actionDetails part of the submission shall contain the argument values and related information of the action instance to be executed. +If the defInstId of the supplied actionDetails field does not match a known ActionDefinition object then an UNKNOWN error shall be returned. +The size of the argumentValues list of the ActionInstanceDetails structure shall be compared to the size of the argument list in the matched ActionDefinition object and an INVALID error shall be returned if they are not the same. +If the ActionInstanceDetails structure contains an argumentIds field value then this shall be compared to the same field in the matched ActionDefinition object and must be the same size and contain the same values, an INVALID error shall be returned if this is not the case. +If the ActionInstanceDetails structure contains an isRawValue field value then the size of this list shall be compared to the size of the argument list in the matched ActionDefinition object and an INVALID error shall be returned if they are not the same. +If the supplied argument values do not match the attribute type specified in the action definition then an INVALID error shall be returned. +A service provider may apply some deployment specific checks to the action instance and can return an INVALID error if they fail. +If an error is raised then no action shall be executed. +The SUBMIT acknowledgement shall be returned once the action has been accepted for execution but before execution starts. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncSubmitAction(Long actionInstId, + org.ccsds.moims.mo.mc.action.structures.ActionInstanceDetails actionDetails, + org.ccsds.moims.mo.mc.action.consumer.ActionAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncSubmit(org.ccsds.moims.mo.mc.action.ActionServiceInfo.SUBMITACTION_OP, adapter, (actionInstId == null) ? null : new org.ccsds.moims.mo.mal.structures.Union(actionInstId), actionDetails); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueSubmitAction(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mc.action.consumer.ActionAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mc.action.ActionServiceInfo.SUBMITACTION_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The preCheckAction operation allows a consumer to check that an action + * would be successfully accepted for execution without actually submitting + * the action. The operation is expected to be provided by local action proxies + * rather than the remote system to allow for quick local checks before sending + * the action over long and slow space links. + * + * @param actionDetails The actionDetails part of the submission shall contain the argument values and related information of the action instance to be executed. +If the ActionInstanceDetails structure contains an argumentIds field value then this shall be compared to the same field in the matched ActionDefinition object and must be the same size and contain the same values, an INVALID error shall be returned if this is not the case. +If the supplied argument values do not match the attribute type specified in the action definition then an INVALID error shall be returned. +A service provider may apply some deployment specific checks to the action instance and can return an INVALID error if they fail. + * @return The return value of the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public Boolean preCheckAction(org.ccsds.moims.mo.mc.action.structures.ActionInstanceDetails actionDetails) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + org.ccsds.moims.mo.mal.transport.MALMessageBody body = consumer.request(org.ccsds.moims.mo.mc.action.ActionServiceInfo.PRECHECKACTION_OP, actionDetails); + Object body0 = (Object) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.Union(Boolean.FALSE)); + return (body0 == null) ? null : ((org.ccsds.moims.mo.mal.structures.Union) body0).getBooleanValue(); + } + + /** + * Asynchronous version of method preCheckAction. + * + * @param actionDetails The actionDetails part of the submission shall contain the argument values and related information of the action instance to be executed. +If the ActionInstanceDetails structure contains an argumentIds field value then this shall be compared to the same field in the matched ActionDefinition object and must be the same size and contain the same values, an INVALID error shall be returned if this is not the case. +If the supplied argument values do not match the attribute type specified in the action definition then an INVALID error shall be returned. +A service provider may apply some deployment specific checks to the action instance and can return an INVALID error if they fail. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncPreCheckAction(org.ccsds.moims.mo.mc.action.structures.ActionInstanceDetails actionDetails, + org.ccsds.moims.mo.mc.action.consumer.ActionAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncRequest(org.ccsds.moims.mo.mc.action.ActionServiceInfo.PRECHECKACTION_OP, adapter, actionDetails); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continuePreCheckAction(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mc.action.consumer.ActionAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mc.action.ActionServiceInfo.PRECHECKACTION_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The listDefinition operation allows a consumer to request the object instance + * identifiers of the latest ActionIdentity and ActionDefinition objects for + * the supported actions of the provider. + * + * @param actionNames The actionNames field shall contain a list of action names to retrieve the ActionIdentity and ActionDefinition object instance identifiers for. +The request may contain the wildcard value of '*' to return all supported ActionIdentity and ActionDefinition objects. +The wildcard value should be checked for first, if found no other checks of supplied identifiers shall be made. +If a provided identifier does not include a wildcard and does not match an existing ActionIdentity object then this operation shall fail with an UNKNOWN error. + * @return The return value of the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mc.structures.ObjectInstancePairList listDefinition(org.ccsds.moims.mo.mal.structures.IdentifierList actionNames) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + org.ccsds.moims.mo.mal.transport.MALMessageBody body = consumer.request(org.ccsds.moims.mo.mc.action.ActionServiceInfo.LISTDEFINITION_OP, actionNames); + Object body0 = (Object) body.getBodyElement(0, new org.ccsds.moims.mo.mc.structures.ObjectInstancePairList()); + return (org.ccsds.moims.mo.mc.structures.ObjectInstancePairList) body0; + } + + /** + * Asynchronous version of method listDefinition. + * + * @param actionNames The actionNames field shall contain a list of action names to retrieve the ActionIdentity and ActionDefinition object instance identifiers for. +The request may contain the wildcard value of '*' to return all supported ActionIdentity and ActionDefinition objects. +The wildcard value should be checked for first, if found no other checks of supplied identifiers shall be made. +If a provided identifier does not include a wildcard and does not match an existing ActionIdentity object then this operation shall fail with an UNKNOWN error. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncListDefinition(org.ccsds.moims.mo.mal.structures.IdentifierList actionNames, + org.ccsds.moims.mo.mc.action.consumer.ActionAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncRequest(org.ccsds.moims.mo.mc.action.ActionServiceInfo.LISTDEFINITION_OP, adapter, actionNames); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueListDefinition(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mc.action.consumer.ActionAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mc.action.ActionServiceInfo.LISTDEFINITION_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The addAction operation allows a consumer to define one or more actions + * that do not currently exist. The new ActionIdentity and ActionDefinition + * objects are expected to be stored in the COM archive by the provider of + * the action service. + * + * @param actionDefDetails The actionDefDetails field shall hold the name and definitions to be added. +The name field must not be the wildcard '*', or empty (an INVALID error shall be returned in this case). +The supplied name must be unique among all ActionIdentity objects for the domain of the provider otherwise a DUPLICATE error shall be raised. +If an error is raised then no new identities and definitions shall be added as a result of this operation call. +If the supplied name matches an existing, but removed, ActionIdentity then that ActionIdentity shall be reused otherwise a new ActionIdentity shall be created. +The provider shall create a new ActionDefinition object and store it, and any new ActionIdentity objects, in the COM archive. + * @return The return value of the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mc.structures.ObjectInstancePairList addAction(org.ccsds.moims.mo.mc.action.structures.ActionCreationRequestList actionDefDetails) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + org.ccsds.moims.mo.mal.transport.MALMessageBody body = consumer.request(org.ccsds.moims.mo.mc.action.ActionServiceInfo.ADDACTION_OP, actionDefDetails); + Object body0 = (Object) body.getBodyElement(0, new org.ccsds.moims.mo.mc.structures.ObjectInstancePairList()); + return (org.ccsds.moims.mo.mc.structures.ObjectInstancePairList) body0; + } + + /** + * Asynchronous version of method addAction. + * + * @param actionDefDetails The actionDefDetails field shall hold the name and definitions to be added. +The name field must not be the wildcard '*', or empty (an INVALID error shall be returned in this case). +The supplied name must be unique among all ActionIdentity objects for the domain of the provider otherwise a DUPLICATE error shall be raised. +If an error is raised then no new identities and definitions shall be added as a result of this operation call. +If the supplied name matches an existing, but removed, ActionIdentity then that ActionIdentity shall be reused otherwise a new ActionIdentity shall be created. +The provider shall create a new ActionDefinition object and store it, and any new ActionIdentity objects, in the COM archive. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncAddAction(org.ccsds.moims.mo.mc.action.structures.ActionCreationRequestList actionDefDetails, + org.ccsds.moims.mo.mc.action.consumer.ActionAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncRequest(org.ccsds.moims.mo.mc.action.ActionServiceInfo.ADDACTION_OP, adapter, actionDefDetails); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueAddAction(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mc.action.consumer.ActionAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mc.action.ActionServiceInfo.ADDACTION_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The updateDefinition operation allows a consumer to update a definition + * for one or more actions. + * This differs from deleting an existing action and adding a new definition + * with the same name in the fact that the ActionIdentity object is not changed + * between the two definitions. + * The replacement definition should be stored in the COM archive by the service + * provider. The operation does not remove the previous ActionDefinition object + * from the COM archive, merely removes the object from the provider. This + * permits existing, and completed, ActionInstance objects to continue to + * reference the correct ActionIdentity and ActionDefinition objects in the + * COM archive. + * + * @param actionObjInstIds The actionObjInstIds field shall contain the list of object instance identifiers of the ActionIdentity objects to be updated. +The supplied object instance identifiers shall match existing identity objects, an UNKNOWN error shall be raised if this is not the case. +If the actionObjInstIds list contains either NULL or '0' an INVALID error shall be raised. + * @param actionDefDetails The actionDefDetails field shall contain the replacement ActionDefinitionDetails. +The two lists shall be ordered the same. +The number of entries in the two lists shall be the same size otherwise an INVALID error shall be returned. +If an error is raised then no definitions shall be modified as a result of this operation call. +The provider shall create a new ActionDefinition object and store it in the COM archive. +The new ActionDefinition object shall be the current ActionDefinition used for the specific ActionIdentity. + * @return The return value of the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.structures.LongList updateDefinition(org.ccsds.moims.mo.mal.structures.LongList actionObjInstIds, + org.ccsds.moims.mo.mc.action.structures.ActionDefinitionDetailsList actionDefDetails) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + org.ccsds.moims.mo.mal.transport.MALMessageBody body = consumer.request(org.ccsds.moims.mo.mc.action.ActionServiceInfo.UPDATEDEFINITION_OP, actionObjInstIds, actionDefDetails); + Object body0 = (Object) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.LongList()); + return (org.ccsds.moims.mo.mal.structures.LongList) body0; + } + + /** + * Asynchronous version of method updateDefinition. + * + * @param actionObjInstIds The actionObjInstIds field shall contain the list of object instance identifiers of the ActionIdentity objects to be updated. +The supplied object instance identifiers shall match existing identity objects, an UNKNOWN error shall be raised if this is not the case. +If the actionObjInstIds list contains either NULL or '0' an INVALID error shall be raised. + * @param actionDefDetails The actionDefDetails field shall contain the replacement ActionDefinitionDetails. +The two lists shall be ordered the same. +The number of entries in the two lists shall be the same size otherwise an INVALID error shall be returned. +If an error is raised then no definitions shall be modified as a result of this operation call. +The provider shall create a new ActionDefinition object and store it in the COM archive. +The new ActionDefinition object shall be the current ActionDefinition used for the specific ActionIdentity. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncUpdateDefinition(org.ccsds.moims.mo.mal.structures.LongList actionObjInstIds, + org.ccsds.moims.mo.mc.action.structures.ActionDefinitionDetailsList actionDefDetails, + org.ccsds.moims.mo.mc.action.consumer.ActionAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncRequest(org.ccsds.moims.mo.mc.action.ActionServiceInfo.UPDATEDEFINITION_OP, adapter, actionObjInstIds, actionDefDetails); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueUpdateDefinition(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mc.action.consumer.ActionAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mc.action.ActionServiceInfo.UPDATEDEFINITION_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The removeAction operation allows a consumer to remove one or more actions + * from the list of actions supported by the action provider. + * The operation does not remove the ActionIdentity or ActionDefinition object + * from the COM archive, merely removes the objects from the provider. This + * permits existing, and completed, ActionInstance objects to continue to + * reference the correct ActionIdentity and ActionDefinition objects in the + * COM archive. + * + * @param actionInstIds The actionInstIds field shall hold the object instance identifiers of the ActionIdentity objects to be removed from the provider. +The wildcard value of '0' in the list of object instance identifiers shall be supported and matches all actions of the provider. +The wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made. +If a provided ActionIdentity object instance identifier does not include a wildcard and does not match an existing ActionIdentity object then this operation shall fail with an UNKNOWN error. +If a matched definition is still being used by an executing action instance then this operation shall not fail because of this reason. +Matched ActionIdentity objects shall not be removed from the COM archive only the list of ActionIdentity objects in the provider. +Removed ActionIdentity object shall not be allowed to be referenced by new action instances. +If an error is raised then no actions shall be removed as a result of this operation call. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void removeAction(org.ccsds.moims.mo.mal.structures.LongList actionInstIds) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.submit(org.ccsds.moims.mo.mc.action.ActionServiceInfo.REMOVEACTION_OP, actionInstIds); + } + + /** + * Asynchronous version of method removeAction. + * + * @param actionInstIds The actionInstIds field shall hold the object instance identifiers of the ActionIdentity objects to be removed from the provider. +The wildcard value of '0' in the list of object instance identifiers shall be supported and matches all actions of the provider. +The wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made. +If a provided ActionIdentity object instance identifier does not include a wildcard and does not match an existing ActionIdentity object then this operation shall fail with an UNKNOWN error. +If a matched definition is still being used by an executing action instance then this operation shall not fail because of this reason. +Matched ActionIdentity objects shall not be removed from the COM archive only the list of ActionIdentity objects in the provider. +Removed ActionIdentity object shall not be allowed to be referenced by new action instances. +If an error is raised then no actions shall be removed as a result of this operation call. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncRemoveAction(org.ccsds.moims.mo.mal.structures.LongList actionInstIds, + org.ccsds.moims.mo.mc.action.consumer.ActionAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncSubmit(org.ccsds.moims.mo.mc.action.ActionServiceInfo.REMOVEACTION_OP, adapter, actionInstIds); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueRemoveAction(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mc.action.consumer.ActionAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mc.action.ActionServiceInfo.REMOVEACTION_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/action/consumer/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/action/consumer/package-info.java new file mode 100644 index 00000000..07ec24a1 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/action/consumer/package-info.java @@ -0,0 +1,4 @@ +/** + * Package containing the consumer stubs for the Action service. +*/ +package org.ccsds.moims.mo.mc.action.consumer; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/action/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/action/package-info.java new file mode 100644 index 00000000..687e1ace --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/action/package-info.java @@ -0,0 +1,50 @@ +/** + * The action service allows consumers to submit an action for execution and + * to subsequently monitor the execution progress of these actions via the + * COM activity tracking pattern. The progress of the action is split into + * two parts, firstly transfer from the consumer to the provider, and secondly + * execution in the provider. + * An action is submitted to the provider using the submitAction operation, + * the progress of which can be monitored using the COM activity tracking + * pattern, which completes when the action has been delivered to the provider. + * The action is then executed in the provider which can also be monitored + * using the activity tracking pattern. The submitAction operation takes the + * object instance identifier of the submitted action and uses that to populate + * the source fields of the activity tracking events. Coordination may be + * required between action service consumers to ensure the action object instance + * identifiers are unique. How this is done is outside the scope of this specification + * however a good approach is the use of a central COM archive as that can + * provide the unique instance identifiers. + * The nominal sequence of action submission and execution monitoring are + * shown in Figure 3-1: + * insert sequence diag here + * The consumer is responsible for creating and archiving the action instance + * object and then using the submitAction operation to submit it to the action + * provider for execution. The action provider reports, using the COM ActivityTracking + * service, both the execution progress of the submitAction operation and + * also the execution of the action itself. Once the supplied action instance + * details have been checked and execution of the action started by the submitAction + * operation, that operation finishes, whilst the execution of the action + * possibly continues (depends on the actual action). The final interaction + * in the sequence shows the execution events of the executing action instance, + * the "*" at the start of that line indicates zero to many events + * being published. + * If the execution of an action fails with an error, the action service provider + * can publish an ActionFailure COM event to hold the error code being reported + * by the failure. If no error code is required to be reported then there + * is no need to publish the event as the normal COM ActivityTracking event + * contains a success indication. + * The service also includes an operation, preCheckAction, which checks that + * an action would be accepted for execution without actually submitting it + * for execution. It is expected to be provided by local action proxies, rather + * than the remote system, to allow for localised checking of things such + * as link state, argument values, action safety, before sending the action + * over long and slow space links. + * The action service defines three types of objects, the first type is the + * ActionIdentity object that holds the name of an action. The second type + * is the ActionDefinition object that holds the description of an action + * with the list of required/optional arguments. The third type is the ActionInstance + * object that holds details of a specific action instance namely a value + * for each of the arguments of the action. +*/ +package org.ccsds.moims.mo.mc.action; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/action/provider/ActionHandler.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/action/provider/ActionHandler.java new file mode 100644 index 00000000..efddc0e2 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/action/provider/ActionHandler.java @@ -0,0 +1,128 @@ +package org.ccsds.moims.mo.mc.action.provider; + +/** + * Interface that providers of the Action service must implement to handle + * the operations of that service. + */ +public interface ActionHandler { + + /** + * Implements the operation submitAction. + * + * @param actionInstId The actionInstId field of the submission shall contain the object instance identifier of the ActionInstance to be used for activity tracking events. + * @param actionDetails The actionDetails part of the submission shall contain the argument values and related information of the action instance to be executed. +If the defInstId of the supplied actionDetails field does not match a known ActionDefinition object then an UNKNOWN error shall be returned. +The size of the argumentValues list of the ActionInstanceDetails structure shall be compared to the size of the argument list in the matched ActionDefinition object and an INVALID error shall be returned if they are not the same. +If the ActionInstanceDetails structure contains an argumentIds field value then this shall be compared to the same field in the matched ActionDefinition object and must be the same size and contain the same values, an INVALID error shall be returned if this is not the case. +If the ActionInstanceDetails structure contains an isRawValue field value then the size of this list shall be compared to the size of the argument list in the matched ActionDefinition object and an INVALID error shall be returned if they are not the same. +If the supplied argument values do not match the attribute type specified in the action definition then an INVALID error shall be returned. +A service provider may apply some deployment specific checks to the action instance and can return an INVALID error if they fail. +If an error is raised then no action shall be executed. +The SUBMIT acknowledgement shall be returned once the action has been accepted for execution but before execution starts. + * @param interaction The MAL object representing the interaction in the provider. + * @throws org.ccsds.moims.mo.com.InvalidException The list sizes held in the ActionInstanceDetails do not match the argument definitions or it contains one or more invalid argument values. +If the two lists are not the same length then the extra information field shall contain the first index of the element in the largest list which does not have corresponding element in the other list. + * @throws org.ccsds.moims.mo.mal.UnknownException Submitted action definition is unknown. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + void submitAction(Long actionInstId, + org.ccsds.moims.mo.mc.action.structures.ActionInstanceDetails actionDetails, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.com.InvalidException, org.ccsds.moims.mo.mal.UnknownException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation preCheckAction. + * + * @param actionDetails The actionDetails part of the submission shall contain the argument values and related information of the action instance to be executed. +If the ActionInstanceDetails structure contains an argumentIds field value then this shall be compared to the same field in the matched ActionDefinition object and must be the same size and contain the same values, an INVALID error shall be returned if this is not the case. +If the supplied argument values do not match the attribute type specified in the action definition then an INVALID error shall be returned. +A service provider may apply some deployment specific checks to the action instance and can return an INVALID error if they fail. + * @param interaction The MAL object representing the interaction in the provider. + * @return The return value of the operation + * @throws org.ccsds.moims.mo.com.InvalidException The argument list contains one or more invalid arguments. + * @throws org.ccsds.moims.mo.mal.UnknownException Submitted action definition is unknown. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + Boolean preCheckAction(org.ccsds.moims.mo.mc.action.structures.ActionInstanceDetails actionDetails, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.com.InvalidException, org.ccsds.moims.mo.mal.UnknownException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation listDefinition. + * + * @param actionNames The actionNames field shall contain a list of action names to retrieve the ActionIdentity and ActionDefinition object instance identifiers for. +The request may contain the wildcard value of '*' to return all supported ActionIdentity and ActionDefinition objects. +The wildcard value should be checked for first, if found no other checks of supplied identifiers shall be made. +If a provided identifier does not include a wildcard and does not match an existing ActionIdentity object then this operation shall fail with an UNKNOWN error. + * @param interaction The MAL object representing the interaction in the provider. + * @return The return value of the operation + * @throws org.ccsds.moims.mo.mal.UnknownException One of the supplied identifiers is unknown. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + org.ccsds.moims.mo.mc.structures.ObjectInstancePairList listDefinition(org.ccsds.moims.mo.mal.structures.IdentifierList actionNames, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mal.UnknownException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation addAction. + * + * @param actionDefDetails The actionDefDetails field shall hold the name and definitions to be added. +The name field must not be the wildcard '*', or empty (an INVALID error shall be returned in this case). +The supplied name must be unique among all ActionIdentity objects for the domain of the provider otherwise a DUPLICATE error shall be raised. +If an error is raised then no new identities and definitions shall be added as a result of this operation call. +If the supplied name matches an existing, but removed, ActionIdentity then that ActionIdentity shall be reused otherwise a new ActionIdentity shall be created. +The provider shall create a new ActionDefinition object and store it, and any new ActionIdentity objects, in the COM archive. + * @param interaction The MAL object representing the interaction in the provider. + * @return The return value of the operation + * @throws org.ccsds.moims.mo.com.InvalidException One of the supplied ActionIdentity objects contains an invalid action name. + * @throws org.ccsds.moims.mo.com.DuplicateException One or more of the ActionIdentity objects being added has supplied an action name that is already in use in the domain. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + org.ccsds.moims.mo.mc.structures.ObjectInstancePairList addAction(org.ccsds.moims.mo.mc.action.structures.ActionCreationRequestList actionDefDetails, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.com.InvalidException, org.ccsds.moims.mo.com.DuplicateException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation updateDefinition. + * + * @param actionObjInstIds The actionObjInstIds field shall contain the list of object instance identifiers of the ActionIdentity objects to be updated. +The supplied object instance identifiers shall match existing identity objects, an UNKNOWN error shall be raised if this is not the case. +If the actionObjInstIds list contains either NULL or '0' an INVALID error shall be raised. + * @param actionDefDetails The actionDefDetails field shall contain the replacement ActionDefinitionDetails. +The two lists shall be ordered the same. +The number of entries in the two lists shall be the same size otherwise an INVALID error shall be returned. +If an error is raised then no definitions shall be modified as a result of this operation call. +The provider shall create a new ActionDefinition object and store it in the COM archive. +The new ActionDefinition object shall be the current ActionDefinition used for the specific ActionIdentity. + * @param interaction The MAL object representing the interaction in the provider. + * @return The return value of the operation + * @throws org.ccsds.moims.mo.com.InvalidException The supplied object instance identifiers list contains either a NULL or '0' or the two supplied lists are not the same length. +If the two lists are not the same length then the extra information field shall contain the first index of the element in the largest list which does not have corresponding element in the other list. + * @throws org.ccsds.moims.mo.mal.UnknownException One of the supplied ActionIdentity object instance identifiers is unknown. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + org.ccsds.moims.mo.mal.structures.LongList updateDefinition(org.ccsds.moims.mo.mal.structures.LongList actionObjInstIds, + org.ccsds.moims.mo.mc.action.structures.ActionDefinitionDetailsList actionDefDetails, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.com.InvalidException, org.ccsds.moims.mo.mal.UnknownException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation removeAction. + * + * @param actionInstIds The actionInstIds field shall hold the object instance identifiers of the ActionIdentity objects to be removed from the provider. +The wildcard value of '0' in the list of object instance identifiers shall be supported and matches all actions of the provider. +The wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made. +If a provided ActionIdentity object instance identifier does not include a wildcard and does not match an existing ActionIdentity object then this operation shall fail with an UNKNOWN error. +If a matched definition is still being used by an executing action instance then this operation shall not fail because of this reason. +Matched ActionIdentity objects shall not be removed from the COM archive only the list of ActionIdentity objects in the provider. +Removed ActionIdentity object shall not be allowed to be referenced by new action instances. +If an error is raised then no actions shall be removed as a result of this operation call. + * @param interaction The MAL object representing the interaction in the provider. + * @throws org.ccsds.moims.mo.mal.UnknownException One of the supplied ActionIdentity object instance identifiers is unknown. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + void removeAction(org.ccsds.moims.mo.mal.structures.LongList actionInstIds, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mal.UnknownException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Sets the skeleton to be used for creation of publishers. + * + * @param skeleton The skeleton to be used. + */ + void setSkeleton(org.ccsds.moims.mo.mc.action.provider.ActionSkeleton skeleton); +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/action/provider/ActionInheritanceSkeleton.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/action/provider/ActionInheritanceSkeleton.java new file mode 100644 index 00000000..093dd96c --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/action/provider/ActionInheritanceSkeleton.java @@ -0,0 +1,138 @@ +package org.ccsds.moims.mo.mc.action.provider; + +/** + * Provider Inheritance skeleton for ActionInheritanceSkeleton service. + */ +public abstract class ActionInheritanceSkeleton implements org.ccsds.moims.mo.mal.provider.MALInteractionHandler, org.ccsds.moims.mo.mc.action.provider.ActionSkeleton, org.ccsds.moims.mo.mc.action.provider.ActionHandler { + + /** + * The providerSet field. + */ + private org.ccsds.moims.mo.mal.provider.MALProviderSet providerSet = new org.ccsds.moims.mo.mal.provider.MALProviderSet(org.ccsds.moims.mo.mc.action.ActionHelper.ACTION_SERVICE); + + /** + * Returns the connection object for this provider. + * + * @return the connection object for this provider + * @throws java.io.IOException if the method was not implemented yet. + */ + public org.ccsds.moims.mo.mal.helpertools.connections.ConnectionProvider getConnection() throws java.io.IOException { + throw new java.io.IOException("This method needs to be overridden!"); + } + + @Override + public void setSkeleton(org.ccsds.moims.mo.mc.action.provider.ActionSkeleton skeleton) { + // Not used in the inheritance pattern (the skeleton is 'this'); + } + + @Override + public void malInitialize(org.ccsds.moims.mo.mal.provider.MALProvider provider) throws org.ccsds.moims.mo.mal.MALException { + providerSet.addProvider(provider); + } + + @Override + public void malFinalize(org.ccsds.moims.mo.mal.provider.MALProvider provider) throws org.ccsds.moims.mo.mal.MALException { + providerSet.removeProvider(provider); + } + + @Override + public void handleSend(org.ccsds.moims.mo.mal.provider.MALInteraction interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + switch (opNumber) { + default: + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } + + @Override + public void handleSubmit(org.ccsds.moims.mo.mal.provider.MALSubmit interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + try { + switch (opNumber) { + case org.ccsds.moims.mo.mc.action.ActionServiceInfo._SUBMITACTION_OP_NUMBER: + submitAction((body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.Union(Long.MAX_VALUE)) == null) ? null : ((org.ccsds.moims.mo.mal.structures.Union) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.Union(Long.MAX_VALUE))).getLongValue(), + (org.ccsds.moims.mo.mc.action.structures.ActionInstanceDetails) body.getBodyElement(1, new org.ccsds.moims.mo.mc.action.structures.ActionInstanceDetails()), + interaction); + interaction.sendAcknowledgement(); + break; + case org.ccsds.moims.mo.mc.action.ActionServiceInfo._REMOVEACTION_OP_NUMBER: + removeAction((org.ccsds.moims.mo.mal.structures.LongList) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.LongList()), + interaction); + interaction.sendAcknowledgement(); + break; + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } catch (org.ccsds.moims.mo.mal.MOErrorException error) { + throw new org.ccsds.moims.mo.mal.MALInteractionException(error); + } + } + + @Override + public void handleRequest(org.ccsds.moims.mo.mal.provider.MALRequest interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + try { + switch (opNumber) { + case org.ccsds.moims.mo.mc.action.ActionServiceInfo._PRECHECKACTION_OP_NUMBER: + Boolean preCheckActionRt = preCheckAction((org.ccsds.moims.mo.mc.action.structures.ActionInstanceDetails) body.getBodyElement(0, new org.ccsds.moims.mo.mc.action.structures.ActionInstanceDetails()), + interaction); + interaction.sendResponse((preCheckActionRt == null) ? null : new org.ccsds.moims.mo.mal.structures.Union(preCheckActionRt)); + break; + case org.ccsds.moims.mo.mc.action.ActionServiceInfo._LISTDEFINITION_OP_NUMBER: + interaction.sendResponse(listDefinition((org.ccsds.moims.mo.mal.structures.IdentifierList) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.IdentifierList()), + interaction)); + break; + case org.ccsds.moims.mo.mc.action.ActionServiceInfo._ADDACTION_OP_NUMBER: + interaction.sendResponse(addAction((org.ccsds.moims.mo.mc.action.structures.ActionCreationRequestList) body.getBodyElement(0, new org.ccsds.moims.mo.mc.action.structures.ActionCreationRequestList()), + interaction)); + break; + case org.ccsds.moims.mo.mc.action.ActionServiceInfo._UPDATEDEFINITION_OP_NUMBER: + interaction.sendResponse(updateDefinition((org.ccsds.moims.mo.mal.structures.LongList) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.LongList()), + (org.ccsds.moims.mo.mc.action.structures.ActionDefinitionDetailsList) body.getBodyElement(1, new org.ccsds.moims.mo.mc.action.structures.ActionDefinitionDetailsList()), + interaction)); + break; + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } catch (org.ccsds.moims.mo.mal.MOErrorException error) { + throw new org.ccsds.moims.mo.mal.MALInteractionException(error); + } + } + + @Override + public void handleInvoke(org.ccsds.moims.mo.mal.provider.MALInvoke interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + switch (opNumber) { + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } + + @Override + public void handleProgress(org.ccsds.moims.mo.mal.provider.MALProgress interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + switch (opNumber) { + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/action/provider/ActionSkeleton.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/action/provider/ActionSkeleton.java new file mode 100644 index 00000000..bda25fd5 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/action/provider/ActionSkeleton.java @@ -0,0 +1,8 @@ +package org.ccsds.moims.mo.mc.action.provider; + +/** + * The skeleton interface for the Action service. + */ +public interface ActionSkeleton { + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/action/provider/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/action/provider/package-info.java new file mode 100644 index 00000000..2e83766e --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/action/provider/package-info.java @@ -0,0 +1,4 @@ +/** + * Package containing the provider skeletons for the Action service. +*/ +package org.ccsds.moims.mo.mc.action.provider; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/action/structures/ActionCategory.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/action/structures/ActionCategory.java new file mode 100644 index 00000000..8436b9f1 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/action/structures/ActionCategory.java @@ -0,0 +1,134 @@ +package org.ccsds.moims.mo.mc.action.structures; + +/** + * Enumeration class for ActionCategory. + */ +public final class ActionCategory extends org.ccsds.moims.mo.mal.structures.Enumeration { + + private static final long serialVersionUID = 1125904218587140L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125904218587140L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Enumeration value for DEFAULT. + */ + public static final int DEFAULT_VALUE = 1; + + /** + * Enumeration singleton for value DEFAULT. + */ + public static final org.ccsds.moims.mo.mc.action.structures.ActionCategory DEFAULT = new org.ccsds.moims.mo.mc.action.structures.ActionCategory(org.ccsds.moims.mo.mc.action.structures.ActionCategory.DEFAULT_VALUE); + + /** + * Enumeration value for HIPRIORITY. + */ + public static final int HIPRIORITY_VALUE = 2; + + /** + * Enumeration singleton for value HIPRIORITY. + */ + public static final org.ccsds.moims.mo.mc.action.structures.ActionCategory HIPRIORITY = new org.ccsds.moims.mo.mc.action.structures.ActionCategory(org.ccsds.moims.mo.mc.action.structures.ActionCategory.HIPRIORITY_VALUE); + + /** + * Enumeration value for CRITICAL. + */ + public static final int CRITICAL_VALUE = 3; + + /** + * Enumeration singleton for value CRITICAL. + */ + public static final org.ccsds.moims.mo.mc.action.structures.ActionCategory CRITICAL = new org.ccsds.moims.mo.mc.action.structures.ActionCategory(org.ccsds.moims.mo.mc.action.structures.ActionCategory.CRITICAL_VALUE); + + /** + * Set of enumeration instances. + */ + private static final org.ccsds.moims.mo.mc.action.structures.ActionCategory[] _ENUMERATIONS = { + DEFAULT, HIPRIORITY, CRITICAL}; + + /** + * Contains the default Action category values. It is implementation specific what the meaning of the values are in a particular context. + */ + public ActionCategory() { + super(-1); + } + + /** + * Contains the default Action category values. It is implementation specific + * what the meaning of the values are in a particular context. + * + * @param value The value of the Enumeration. + */ + public ActionCategory(int value) { + super(value); + } + + @Override + public String toString() { + switch (getValue()) { + case DEFAULT_VALUE: + return "DEFAULT"; + case HIPRIORITY_VALUE: + return "HIPRIORITY"; + case CRITICAL_VALUE: + return "CRITICAL"; + default: + throw new RuntimeException("Unknown ordinal!"); + } + } + + /** + * Returns the enumeration element represented by the supplied string, or + * null if not matched. + * + * @param s s The string to search for. + * @return The matched enumeration element, or null if not matched. + */ + public static org.ccsds.moims.mo.mc.action.structures.ActionCategory fromString(String s) { + switch (s) { + case "DEFAULT": + return ActionCategory.DEFAULT; + case "HIPRIORITY": + return ActionCategory.HIPRIORITY; + case "CRITICAL": + return ActionCategory.CRITICAL; + default: + throw new RuntimeException("Unknown Enumeration for the provided string: " + s); + } + } + + @Override + public org.ccsds.moims.mo.mal.structures.Enumeration fromValue(Integer value) { + switch (value) { + case DEFAULT_VALUE: + return ActionCategory.DEFAULT; + case HIPRIORITY_VALUE: + return ActionCategory.HIPRIORITY; + case CRITICAL_VALUE: + return ActionCategory.CRITICAL; + default: + throw new RuntimeException("Unknown Enumeration for the provided value: " + value); + } + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return _ENUMERATIONS[0]; + } + + @Override + public int getEnumSize() { + return 3; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/action/structures/ActionCategoryList.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/action/structures/ActionCategoryList.java new file mode 100644 index 00000000..16c9c69f --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/action/structures/ActionCategoryList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mc.action.structures; + +/** + * List class for ActionCategory. + */ +public final class ActionCategoryList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1125904235364348L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125904235364348L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for ActionCategoryList. + * + */ + public ActionCategoryList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public ActionCategoryList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public ActionCategoryList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mc.action.structures.ActionCategory element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mc.action.structures.ActionCategory element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new ActionCategoryList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return org.ccsds.moims.mo.mc.action.structures.ActionCategory.DEFAULT; + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/action/structures/ActionCreationRequest.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/action/structures/ActionCreationRequest.java new file mode 100644 index 00000000..36076610 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/action/structures/ActionCreationRequest.java @@ -0,0 +1,140 @@ +package org.ccsds.moims.mo.mc.action.structures; + +/** + * The ActionCreationRequest contains all the fields required when creating + * a new action in a provider. + */ +public final class ActionCreationRequest implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1125904218587139L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125904218587139L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * The name of the action. Must not be empty or the wildcard value. + */ + private org.ccsds.moims.mo.mal.structures.Identifier name; + + /** + * The action definition details. + */ + private org.ccsds.moims.mo.mc.action.structures.ActionDefinitionDetails actionDefDetails; + + /** + * Default constructor for ActionCreationRequest. + * + */ + public ActionCreationRequest() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param name The name of the action. Must not be empty or the wildcard value. + * @param actionDefDetails The action definition details. + */ + public ActionCreationRequest(org.ccsds.moims.mo.mal.structures.Identifier name, + org.ccsds.moims.mo.mc.action.structures.ActionDefinitionDetails actionDefDetails) { + this.name = name; + this.actionDefDetails = actionDefDetails; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mc.action.structures.ActionCreationRequest(); + } + + /** + * Returns the field name. + * + * @return The field name + */ + public org.ccsds.moims.mo.mal.structures.Identifier getName() { + return name; + } + + /** + * Returns the field actionDefDetails. + * + * @return The field actionDefDetails + */ + public org.ccsds.moims.mo.mc.action.structures.ActionDefinitionDetails getActionDefDetails() { + return actionDefDetails; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ActionCreationRequest) { + ActionCreationRequest other = (ActionCreationRequest) obj; + if (name == null) { + if (other.name != null) { + return false; + } + } else { + if (! name.equals(other.name)) { + return false; + } + } + if (actionDefDetails == null) { + if (other.actionDefDetails != null) { + return false; + } + } else { + if (! actionDefDetails.equals(other.actionDefDetails)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (name != null ? name.hashCode() : 0); + hash = 83 * hash + (actionDefDetails != null ? actionDefDetails.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(ActionCreationRequest: "); + buf.append("name=").append(name); + buf.append(", actionDefDetails=").append(actionDefDetails); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (name == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'name' cannot be null!"); + } + if (actionDefDetails == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'actionDefDetails' cannot be null!"); + } + encoder.encodeIdentifier(name); + encoder.encodeElement(actionDefDetails); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + name = decoder.decodeIdentifier(); + actionDefDetails = (org.ccsds.moims.mo.mc.action.structures.ActionDefinitionDetails) decoder.decodeElement(new org.ccsds.moims.mo.mc.action.structures.ActionDefinitionDetails()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/action/structures/ActionCreationRequestList.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/action/structures/ActionCreationRequestList.java new file mode 100644 index 00000000..da379692 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/action/structures/ActionCreationRequestList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mc.action.structures; + +/** + * List class for ActionCreationRequest. + */ +public final class ActionCreationRequestList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1125904235364349L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125904235364349L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for ActionCreationRequestList. + * + */ + public ActionCreationRequestList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public ActionCreationRequestList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public ActionCreationRequestList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mc.action.structures.ActionCreationRequest element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mc.action.structures.ActionCreationRequest element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new ActionCreationRequestList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mc.action.structures.ActionCreationRequest(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/action/structures/ActionDefinitionDetails.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/action/structures/ActionDefinitionDetails.java new file mode 100644 index 00000000..5b818bfd --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/action/structures/ActionDefinitionDetails.java @@ -0,0 +1,223 @@ +package org.ccsds.moims.mo.mc.action.structures; + +/** + * The ActionDefinitionDetails structure holds the definition information + * of an action. + */ +public final class ActionDefinitionDetails implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1125904218587137L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125904218587137L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * The description of the action. + */ + private String description; + + /** + * Category of the action. Value taken from ActionCategory enumeration, although + * the use of a UOctet allows deployment specific extension. Extensions must + * use values greater than 127. + */ + private org.ccsds.moims.mo.mal.structures.UOctet category; + + /** + * Total number of steps that will be reported if PROGRESS reporting is selected + * in the sent Action. 0 if PROGRESS reporting is not used. + */ + private org.ccsds.moims.mo.mal.structures.UShort progressStepCount; + + /** + * The list of argument definitions. If no arguments are defined, then the + * complete list is replaced with a NULL. + */ + private org.ccsds.moims.mo.mc.structures.ArgumentDefinitionDetailsList arguments; + + /** + * Default constructor for ActionDefinitionDetails. + * + */ + public ActionDefinitionDetails() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param description The description of the action. + * @param category Category of the action. Value taken from ActionCategory enumeration, although the use of a UOctet allows deployment specific extension. Extensions must use values greater than 127. + * @param progressStepCount Total number of steps that will be reported if PROGRESS reporting is selected in the sent Action. 0 if PROGRESS reporting is not used. + * @param arguments The list of argument definitions. If no arguments are defined, then the complete list is replaced with a NULL. + */ + public ActionDefinitionDetails(String description, + org.ccsds.moims.mo.mal.structures.UOctet category, + org.ccsds.moims.mo.mal.structures.UShort progressStepCount, + org.ccsds.moims.mo.mc.structures.ArgumentDefinitionDetailsList arguments) { + this.description = description; + this.category = category; + this.progressStepCount = progressStepCount; + this.arguments = arguments; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param description The description of the action. + * @param category Category of the action. Value taken from ActionCategory enumeration, although the use of a UOctet allows deployment specific extension. Extensions must use values greater than 127. + * @param progressStepCount Total number of steps that will be reported if PROGRESS reporting is selected in the sent Action. 0 if PROGRESS reporting is not used. + */ + public ActionDefinitionDetails(String description, + org.ccsds.moims.mo.mal.structures.UOctet category, + org.ccsds.moims.mo.mal.structures.UShort progressStepCount) { + this.description = description; + this.category = category; + this.progressStepCount = progressStepCount; + this.arguments = null; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mc.action.structures.ActionDefinitionDetails(); + } + + /** + * Returns the field description. + * + * @return The field description + */ + public String getDescription() { + return description; + } + + /** + * Returns the field category. + * + * @return The field category + */ + public org.ccsds.moims.mo.mal.structures.UOctet getCategory() { + return category; + } + + /** + * Returns the field progressStepCount. + * + * @return The field progressStepCount + */ + public org.ccsds.moims.mo.mal.structures.UShort getProgressStepCount() { + return progressStepCount; + } + + /** + * Returns the field arguments. + * + * @return The field arguments + */ + public org.ccsds.moims.mo.mc.structures.ArgumentDefinitionDetailsList getArguments() { + return arguments; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ActionDefinitionDetails) { + ActionDefinitionDetails other = (ActionDefinitionDetails) obj; + if (description == null) { + if (other.description != null) { + return false; + } + } else { + if (! description.equals(other.description)) { + return false; + } + } + if (category == null) { + if (other.category != null) { + return false; + } + } else { + if (! category.equals(other.category)) { + return false; + } + } + if (progressStepCount == null) { + if (other.progressStepCount != null) { + return false; + } + } else { + if (! progressStepCount.equals(other.progressStepCount)) { + return false; + } + } + if (arguments == null) { + if (other.arguments != null) { + return false; + } + } else { + if (! arguments.equals(other.arguments)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (description != null ? description.hashCode() : 0); + hash = 83 * hash + (category != null ? category.hashCode() : 0); + hash = 83 * hash + (progressStepCount != null ? progressStepCount.hashCode() : 0); + hash = 83 * hash + (arguments != null ? arguments.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(ActionDefinitionDetails: "); + buf.append("description=").append(description); + buf.append(", category=").append(category); + buf.append(", progressStepCount=").append(progressStepCount); + buf.append(", arguments=").append(arguments); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (description == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'description' cannot be null!"); + } + if (category == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'category' cannot be null!"); + } + if (progressStepCount == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'progressStepCount' cannot be null!"); + } + encoder.encodeString(description); + encoder.encodeUOctet(category); + encoder.encodeUShort(progressStepCount); + encoder.encodeNullableElement(arguments); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + description = decoder.decodeString(); + category = decoder.decodeUOctet(); + progressStepCount = decoder.decodeUShort(); + arguments = (org.ccsds.moims.mo.mc.structures.ArgumentDefinitionDetailsList) decoder.decodeNullableElement(new org.ccsds.moims.mo.mc.structures.ArgumentDefinitionDetailsList()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/action/structures/ActionDefinitionDetailsList.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/action/structures/ActionDefinitionDetailsList.java new file mode 100644 index 00000000..d37c2cfc --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/action/structures/ActionDefinitionDetailsList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mc.action.structures; + +/** + * List class for ActionDefinitionDetails. + */ +public final class ActionDefinitionDetailsList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1125904235364351L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125904235364351L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for ActionDefinitionDetailsList. + * + */ + public ActionDefinitionDetailsList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public ActionDefinitionDetailsList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public ActionDefinitionDetailsList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mc.action.structures.ActionDefinitionDetails element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mc.action.structures.ActionDefinitionDetails element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new ActionDefinitionDetailsList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mc.action.structures.ActionDefinitionDetails(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/action/structures/ActionInstanceDetails.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/action/structures/ActionInstanceDetails.java new file mode 100644 index 00000000..d919e72b --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/action/structures/ActionInstanceDetails.java @@ -0,0 +1,331 @@ +package org.ccsds.moims.mo.mc.action.structures; + +/** + * The ActionInstanceDetails structure holds the information required for + * an instance of an Action such as the argument values to use. + */ +public final class ActionInstanceDetails implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1125904218587138L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125904218587138L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * The object instance identifier of the ActionDefinition to be used. + */ + private Long defInstId; + + /** + * If TRUE, then an activity event of type Execution is required for the STARTED + * stage. + */ + private Boolean stageStartedRequired; + + /** + * If TRUE, then activity events of type Execution are required for the PROGRESS + * stages. + */ + private Boolean stageProgressRequired; + + /** + * If TRUE, then an activity event of type Execution is required for the COMPLETION + * stage. + */ + private Boolean stageCompletedRequired; + + /** + * List containing the values of the arguments. The ordering of the list matches + * that of the definition. If a value for a particular entry is not being + * supplied, then its position is filled with a NULL value. If no arguments + * are defined, then the complete list is replaced with a NULL. + */ + private org.ccsds.moims.mo.mc.structures.AttributeValueList argumentValues; + + /** + * Optional list of argument definition identifiers. Allows the provider to + * verify that the correct arguments are being supplied. The ordering of the + * list matches that of the argument list of the action definition. + */ + private org.ccsds.moims.mo.mal.structures.IdentifierList argumentIds; + + /** + * Optional list of Booleans that determine whether the supplied argument + * values are raw or converted. If the Boolean for a particular value is TRUE + * or NULL then that value is assumed to be raw. If the complete isRawValue + * list is NULL then all arguments are assumed to be raw values. + * The ordering of the list matches that of the argument list of the action + * definition. + */ + private org.ccsds.moims.mo.mal.structures.BooleanList isRawValue; + + /** + * Default constructor for ActionInstanceDetails. + * + */ + public ActionInstanceDetails() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param defInstId The object instance identifier of the ActionDefinition to be used. + * @param stageStartedRequired If TRUE, then an activity event of type Execution is required for the STARTED stage. + * @param stageProgressRequired If TRUE, then activity events of type Execution are required for the PROGRESS stages. + * @param stageCompletedRequired If TRUE, then an activity event of type Execution is required for the COMPLETION stage. + * @param argumentValues List containing the values of the arguments. The ordering of the list matches that of the definition. If a value for a particular entry is not being supplied, then its position is filled with a NULL value. If no arguments are defined, then the complete list is replaced with a NULL. + * @param argumentIds Optional list of argument definition identifiers. Allows the provider to verify that the correct arguments are being supplied. The ordering of the list matches that of the argument list of the action definition. + * @param isRawValue Optional list of Booleans that determine whether the supplied argument values are raw or converted. If the Boolean for a particular value is TRUE or NULL then that value is assumed to be raw. If the complete isRawValue list is NULL then all arguments are assumed to be raw values. +The ordering of the list matches that of the argument list of the action definition. + */ + public ActionInstanceDetails(Long defInstId, + Boolean stageStartedRequired, + Boolean stageProgressRequired, + Boolean stageCompletedRequired, + org.ccsds.moims.mo.mc.structures.AttributeValueList argumentValues, + org.ccsds.moims.mo.mal.structures.IdentifierList argumentIds, + org.ccsds.moims.mo.mal.structures.BooleanList isRawValue) { + this.defInstId = defInstId; + this.stageStartedRequired = stageStartedRequired; + this.stageProgressRequired = stageProgressRequired; + this.stageCompletedRequired = stageCompletedRequired; + this.argumentValues = argumentValues; + this.argumentIds = argumentIds; + this.isRawValue = isRawValue; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param defInstId The object instance identifier of the ActionDefinition to be used. + * @param stageStartedRequired If TRUE, then an activity event of type Execution is required for the STARTED stage. + * @param stageProgressRequired If TRUE, then activity events of type Execution are required for the PROGRESS stages. + * @param stageCompletedRequired If TRUE, then an activity event of type Execution is required for the COMPLETION stage. + */ + public ActionInstanceDetails(Long defInstId, + Boolean stageStartedRequired, + Boolean stageProgressRequired, + Boolean stageCompletedRequired) { + this.defInstId = defInstId; + this.stageStartedRequired = stageStartedRequired; + this.stageProgressRequired = stageProgressRequired; + this.stageCompletedRequired = stageCompletedRequired; + this.argumentValues = null; + this.argumentIds = null; + this.isRawValue = null; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mc.action.structures.ActionInstanceDetails(); + } + + /** + * Returns the field defInstId. + * + * @return The field defInstId + */ + public Long getDefInstId() { + return defInstId; + } + + /** + * Returns the field stageStartedRequired. + * + * @return The field stageStartedRequired + */ + public Boolean getStageStartedRequired() { + return stageStartedRequired; + } + + /** + * Returns the field stageProgressRequired. + * + * @return The field stageProgressRequired + */ + public Boolean getStageProgressRequired() { + return stageProgressRequired; + } + + /** + * Returns the field stageCompletedRequired. + * + * @return The field stageCompletedRequired + */ + public Boolean getStageCompletedRequired() { + return stageCompletedRequired; + } + + /** + * Returns the field argumentValues. + * + * @return The field argumentValues + */ + public org.ccsds.moims.mo.mc.structures.AttributeValueList getArgumentValues() { + return argumentValues; + } + + /** + * Returns the field argumentIds. + * + * @return The field argumentIds + */ + public org.ccsds.moims.mo.mal.structures.IdentifierList getArgumentIds() { + return argumentIds; + } + + /** + * Returns the field isRawValue. + * + * @return The field isRawValue + */ + public org.ccsds.moims.mo.mal.structures.BooleanList getIsRawValue() { + return isRawValue; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ActionInstanceDetails) { + ActionInstanceDetails other = (ActionInstanceDetails) obj; + if (defInstId == null) { + if (other.defInstId != null) { + return false; + } + } else { + if (! defInstId.equals(other.defInstId)) { + return false; + } + } + if (stageStartedRequired == null) { + if (other.stageStartedRequired != null) { + return false; + } + } else { + if (! stageStartedRequired.equals(other.stageStartedRequired)) { + return false; + } + } + if (stageProgressRequired == null) { + if (other.stageProgressRequired != null) { + return false; + } + } else { + if (! stageProgressRequired.equals(other.stageProgressRequired)) { + return false; + } + } + if (stageCompletedRequired == null) { + if (other.stageCompletedRequired != null) { + return false; + } + } else { + if (! stageCompletedRequired.equals(other.stageCompletedRequired)) { + return false; + } + } + if (argumentValues == null) { + if (other.argumentValues != null) { + return false; + } + } else { + if (! argumentValues.equals(other.argumentValues)) { + return false; + } + } + if (argumentIds == null) { + if (other.argumentIds != null) { + return false; + } + } else { + if (! argumentIds.equals(other.argumentIds)) { + return false; + } + } + if (isRawValue == null) { + if (other.isRawValue != null) { + return false; + } + } else { + if (! isRawValue.equals(other.isRawValue)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (defInstId != null ? defInstId.hashCode() : 0); + hash = 83 * hash + (stageStartedRequired != null ? stageStartedRequired.hashCode() : 0); + hash = 83 * hash + (stageProgressRequired != null ? stageProgressRequired.hashCode() : 0); + hash = 83 * hash + (stageCompletedRequired != null ? stageCompletedRequired.hashCode() : 0); + hash = 83 * hash + (argumentValues != null ? argumentValues.hashCode() : 0); + hash = 83 * hash + (argumentIds != null ? argumentIds.hashCode() : 0); + hash = 83 * hash + (isRawValue != null ? isRawValue.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(ActionInstanceDetails: "); + buf.append("defInstId=").append(defInstId); + buf.append(", stageStartedRequired=").append(stageStartedRequired); + buf.append(", stageProgressRequired=").append(stageProgressRequired); + buf.append(", stageCompletedRequired=").append(stageCompletedRequired); + buf.append(", argumentValues=").append(argumentValues); + buf.append(", argumentIds=").append(argumentIds); + buf.append(", isRawValue=").append(isRawValue); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (defInstId == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'defInstId' cannot be null!"); + } + if (stageStartedRequired == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'stageStartedRequired' cannot be null!"); + } + if (stageProgressRequired == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'stageProgressRequired' cannot be null!"); + } + if (stageCompletedRequired == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'stageCompletedRequired' cannot be null!"); + } + encoder.encodeLong(defInstId); + encoder.encodeBoolean(stageStartedRequired); + encoder.encodeBoolean(stageProgressRequired); + encoder.encodeBoolean(stageCompletedRequired); + encoder.encodeNullableElement(argumentValues); + encoder.encodeNullableElement(argumentIds); + encoder.encodeNullableElement(isRawValue); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + defInstId = decoder.decodeLong(); + stageStartedRequired = decoder.decodeBoolean(); + stageProgressRequired = decoder.decodeBoolean(); + stageCompletedRequired = decoder.decodeBoolean(); + argumentValues = (org.ccsds.moims.mo.mc.structures.AttributeValueList) decoder.decodeNullableElement(new org.ccsds.moims.mo.mc.structures.AttributeValueList()); + argumentIds = (org.ccsds.moims.mo.mal.structures.IdentifierList) decoder.decodeNullableElement(new org.ccsds.moims.mo.mal.structures.IdentifierList()); + isRawValue = (org.ccsds.moims.mo.mal.structures.BooleanList) decoder.decodeNullableElement(new org.ccsds.moims.mo.mal.structures.BooleanList()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/action/structures/ActionInstanceDetailsList.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/action/structures/ActionInstanceDetailsList.java new file mode 100644 index 00000000..55622313 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/action/structures/ActionInstanceDetailsList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mc.action.structures; + +/** + * List class for ActionInstanceDetails. + */ +public final class ActionInstanceDetailsList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1125904235364350L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125904235364350L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for ActionInstanceDetailsList. + * + */ + public ActionInstanceDetailsList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public ActionInstanceDetailsList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public ActionInstanceDetailsList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mc.action.structures.ActionInstanceDetails element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mc.action.structures.ActionInstanceDetails element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new ActionInstanceDetailsList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mc.action.structures.ActionInstanceDetails(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/action/structures/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/action/structures/package-info.java new file mode 100644 index 00000000..d6371af4 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/action/structures/package-info.java @@ -0,0 +1,4 @@ +/** + * Package containing types defined in the Action service. +*/ +package org.ccsds.moims.mo.mc.action.structures; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/AggregationHelper.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/AggregationHelper.java new file mode 100644 index 00000000..4c2088cc --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/AggregationHelper.java @@ -0,0 +1,17 @@ +package org.ccsds.moims.mo.mc.aggregation; + +/** + * Helper class for Aggregation service. + */ +public class AggregationHelper { + + /** + * Service singleton instance. + */ + public static final org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo AGGREGATION_SERVICE = new org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo(); + + private AggregationHelper() { + // Utility class; not meant to be instantiated. + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/AggregationServiceInfo.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/AggregationServiceInfo.java new file mode 100644 index 00000000..0d1b7623 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/AggregationServiceInfo.java @@ -0,0 +1,361 @@ +package org.ccsds.moims.mo.mc.aggregation; + +/** + * Helper class for Aggregation service. + */ +public class AggregationServiceInfo extends org.ccsds.moims.mo.com.COMService { + + /** + * Service number literal. + */ + public static final int _AGGREGATION_SERVICE_NUMBER = 6; + + /** + * Service number instance. + */ + public static final org.ccsds.moims.mo.mal.structures.UShort AGGREGATION_SERVICE_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_AGGREGATION_SERVICE_NUMBER); + + /** + * Service name constant. + */ + public static final org.ccsds.moims.mo.mal.structures.Identifier AGGREGATION_SERVICE_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("Aggregation"); + + /** + * The service key of this service. + */ + private static final org.ccsds.moims.mo.mal.ServiceKey SERVICE_KEY = new org.ccsds.moims.mo.mal.ServiceKey( + 4, 1, AGGREGATION_SERVICE_NUMBER); + + /** + * Operation number literal for operation MONITORVALUE. + */ + public static final int _MONITORVALUE_OP_NUMBER = 1; + + /** + * Operation number instance for operation MONITORVALUE. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort MONITORVALUE_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_MONITORVALUE_OP_NUMBER); + + /** + * Operation instance for operation MONITORVALUE. + */ + public static final org.ccsds.moims.mo.mal.MALPubSubOperation MONITORVALUE_OP = new org.ccsds.moims.mo.mal.MALPubSubOperation(SERVICE_KEY, + MONITORVALUE_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("monitorValue"), + new org.ccsds.moims.mo.mal.structures.UShort(1), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("objId", true, org.ccsds.moims.mo.com.structures.ObjectId.SHORT_FORM, "The MAL EntityKey.firstSubKey shall contain the aggregation name.\nThe MAL EntityKey.secondSubKey shall contain the AggregationIdentity object instance identifier.\nThe MAL EntityKey.thirdSubKey shall contain the AggregationDefinition object instance identifier.\nThe MAL EntityKey.fourthSubKey shall contain the new AggregationValueInstance object instance identifier.\nThe timestamp of the AggregationValueInstance report shall be taken from the publish message.\nThe publish message shall include the ObjectId of the source link of the report.\nIf no source link is needed then the ObjectId shall be replaced with a NULL."), + new org.ccsds.moims.mo.mal.OperationField("newValue", true, org.ccsds.moims.mo.mc.aggregation.structures.AggregationValue.SHORT_FORM, "The second part of the publish message shall be the AggregationValue.")}, + "The monitorValue operation allows a consumer to subscribe for aggregation value reports."); + + /** + * Key names instance for MONITORVALUE operation of pubsub interaction pattern. + */ + private static final org.ccsds.moims.mo.mal.structures.Identifier [] _MONITORVALUE_OP_KEY_NAMES = {}; + + /** + * Key names instance for MONITORVALUE operation of pubsub interaction pattern. + */ + private static final org.ccsds.moims.mo.mal.structures.IdentifierList MONITORVALUE_OP_KEY_NAMES = new org.ccsds.moims.mo.mal.structures.IdentifierList(new java.util.ArrayList<>(java.util.Arrays.asList(_MONITORVALUE_OP_KEY_NAMES))); + + /** + * Operation number literal for operation GETVALUE. + */ + public static final int _GETVALUE_OP_NUMBER = 2; + + /** + * Operation number instance for operation GETVALUE. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort GETVALUE_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_GETVALUE_OP_NUMBER); + + /** + * Operation instance for operation GETVALUE. + */ + public static final org.ccsds.moims.mo.mal.MALRequestOperation GETVALUE_OP = new org.ccsds.moims.mo.mal.MALRequestOperation(SERVICE_KEY, + GETVALUE_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("getValue"), + new org.ccsds.moims.mo.mal.structures.UShort(2), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("aggInstIds", true, org.ccsds.moims.mo.mal.structures.LongList.SHORT_FORM, "The aggInstIds field shall provide the list of AggregationIdentity object instance identifiers.\nThe wildcard value of '0' shall be supported and matches all aggregations of the provider.\nThe wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made.\nIf a requested aggregation is unknown then an UNKNOWN error shall be returned.\nThe filter shall not be applied for the getValue operation.\nIf an aggregation is being reported periodically, using the operation shall not reset the reportInterval or filteredTimeout timer.")}, + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("aggValDetails", true, org.ccsds.moims.mo.mc.aggregation.structures.AggregationValueDetailsList.SHORT_FORM, "The response shall contain a list of returned AggregationIdentity and AggregationDefinition object instance identifier pairs and a matching list of AggregationValues.\nThe new value shall not be published via the monitorValue operation.")}, + "The getValue operation returns the latest received value for a requested aggregation."); + + /** + * Operation number literal for operation ENABLEGENERATION. + */ + public static final int _ENABLEGENERATION_OP_NUMBER = 3; + + /** + * Operation number instance for operation ENABLEGENERATION. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort ENABLEGENERATION_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_ENABLEGENERATION_OP_NUMBER); + + /** + * Operation instance for operation ENABLEGENERATION. + */ + public static final org.ccsds.moims.mo.mal.MALRequestOperation ENABLEGENERATION_OP = new org.ccsds.moims.mo.mal.MALRequestOperation(SERVICE_KEY, + ENABLEGENERATION_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("enableGeneration"), + new org.ccsds.moims.mo.mal.structures.UShort(3), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("isGroupIds", true, org.ccsds.moims.mo.mal.structures.Attribute.BOOLEAN_SHORT_FORM, "If the isGroupIds field is TRUE then the enableInstances field shall contain GroupIdentity object instance identifiers, otherwise the field contains AggregationIdentity object instance identifiers.\nThe AggregationIdentity objects referenced, either directly or indirectly via groups, by the enableInstances field shall be the AggregationIdentity objects to match.\nThe id of the enableInstances field shall support the wildcard value of '0' and matches all AggregationIdentity objects of the provider.\nThe service provider shall check for the wildcard value in the list of object instance identifiers in the enableInstances field first and if found no other checks of supplied object instance identifiers shall be made.\nIf the enableInstances field contains a value of TRUE then reports of matching AggregationIdentity objects shall be generated, a value of FALSE requests that reports will not be generated.\nNo error shall be raised if the enableInstances Boolean value supplied is the same as the current generationEnabled field of the definition for a matched AggregationIdentity object i.e. enabling an already enabled aggregation will not result in an error.\nIf a requested AggregationIdentity or GroupIdentity object is unknown then an UNKNOWN error shall be returned.\nIf a requested Group, or the Group objects referenced by that Group, does not contain AggregationIdentity objects then an INVALID error shall be returned.\nIf an error is raised then no modifications shall be made as a result of this operation call.\nThe provider shall create and store a new AggregationDefinition object in the COM archive if the generationEnabled field is changed.\nIf a new AggregationDefinition object is created then that new object shall be the current AggregationDefinition used for the specific AggregationIdentity."), + new org.ccsds.moims.mo.mal.OperationField("enableInstances", true, org.ccsds.moims.mo.com.structures.InstanceBooleanPairList.SHORT_FORM, "If the generation of reports is being enabled, and the aggregation is defined as being periodic, then the provider shall generate a report immediately and start the report interval from that report.")}, + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("newObjInstIds", true, org.ccsds.moims.mo.mal.structures.LongList.SHORT_FORM, "The response shall contain the list of object instance identifiers for the new AggregationDefinition objects.")}, + "The enableGeneration operation allows a consumer to control whether reports for specific aggregations are generated or not. The operation allows the consumer to select the aggregations directly or indirectly using groups. This affects all types of aggregations, periodic, filtered and ad-hoc."); + + /** + * Operation number literal for operation ENABLEFILTER. + */ + public static final int _ENABLEFILTER_OP_NUMBER = 4; + + /** + * Operation number instance for operation ENABLEFILTER. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort ENABLEFILTER_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_ENABLEFILTER_OP_NUMBER); + + /** + * Operation instance for operation ENABLEFILTER. + */ + public static final org.ccsds.moims.mo.mal.MALSubmitOperation ENABLEFILTER_OP = new org.ccsds.moims.mo.mal.MALSubmitOperation(SERVICE_KEY, + ENABLEFILTER_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("enableFilter"), + new org.ccsds.moims.mo.mal.structures.UShort(3), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("isGroupIds", true, org.ccsds.moims.mo.mal.structures.Attribute.BOOLEAN_SHORT_FORM, "If the isGroupIds field is TRUE then the enableInstances field shall contain GroupIdentity object instance identifiers, otherwise the field contains AggregationIdentity object instance identifiers.\nThe AggregationIdentity objects referenced, either directly or indirectly via groups, by the enableInstances field shall be the AggregationIdentity objects to match.\nThe id of the enableInstances field shall support the wildcard value of '0' and matches all AggregationIdentity objects of the provider.\nThe service provider shall check for the wildcard value in the list of object instance identifiers in the enableInstances field first and if found no other checks of supplied object instance identifiers shall be made.\nIf the enableInstances field contains a value of TRUE then reports of matching AggregationIdentity objects shall be filtered, a value of FALSE requests that reports will not be filtered.\nNo error shall be raised if the enableInstances Boolean value supplied is the same as the current filterEnabled field of the definition for a matched AggregationIdentity object i.e. filtering an already filtered aggregation will not result in an error.\nIf a requested AggregationIdentity or GroupIdentity object is unknown then an UNKNOWN error shall be returned.\nIf a requested Group, or the Group objects referenced by that Group, does not contain AggregationIdentity objects then an INVALID error shall be returned.\nIf an error is raised then no modifications shall be made as a result of this operation call.\nThe provider shall create and store a new AggregationDefinition object in the COM archive if the filterEnabled field is changed.\nIf a new AggregationDefinition object is created then that new object shall be the current AggregationDefinition used for the specific AggregationIdentity."), + new org.ccsds.moims.mo.mal.OperationField("enableInstances", true, org.ccsds.moims.mo.com.structures.InstanceBooleanPairList.SHORT_FORM, null)}, + "The enableFilter operation allows a consumer to control whether reports for specific aggregations are filtered or not. The operation allows the consumer to select the aggregations directly or indirectly using groups. This affects both periodic and ad-hoc aggregations."); + + /** + * Operation number literal for operation LISTDEFINITION. + */ + public static final int _LISTDEFINITION_OP_NUMBER = 5; + + /** + * Operation number instance for operation LISTDEFINITION. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort LISTDEFINITION_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_LISTDEFINITION_OP_NUMBER); + + /** + * Operation instance for operation LISTDEFINITION. + */ + public static final org.ccsds.moims.mo.mal.MALRequestOperation LISTDEFINITION_OP = new org.ccsds.moims.mo.mal.MALRequestOperation(SERVICE_KEY, + LISTDEFINITION_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("listDefinition"), + new org.ccsds.moims.mo.mal.structures.UShort(4), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("aggNames", true, org.ccsds.moims.mo.mal.structures.IdentifierList.SHORT_FORM, "The aggNames field shall contain a list of aggregation names to retrieve the AggregationIdentity and AggregationDefinition object instance identifiers for.\nThe aggNames field may contain the wildcard value of '*' to return all supported AggregationIdentity and AggregationDefinition objects.\nThe wildcard value should be checked for first, if found no other checks of supplied identifiers shall be made.\nIf a provided identifier does not include a wildcard and does not match an existing AggregationIdentity object then this operation shall fail with an UNKNOWN error.")}, + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("objInstIds", true, org.ccsds.moims.mo.mc.structures.ObjectInstancePairList.SHORT_FORM, "The response shall contain a list of matching AggregationIdentity and AggregationDefinition object instance identifiers.\nThe returned list shall maintain the same order as the submitted list unless the wildcard value was included in the request.")}, + "The listDefinition operation allows a consumer to request the latest object instance identifiers of the AggregationIdentity and AggregationDefinition objects for the supported aggregations of the provider."); + + /** + * Operation number literal for operation ADDAGGREGATION. + */ + public static final int _ADDAGGREGATION_OP_NUMBER = 6; + + /** + * Operation number instance for operation ADDAGGREGATION. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort ADDAGGREGATION_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_ADDAGGREGATION_OP_NUMBER); + + /** + * Operation instance for operation ADDAGGREGATION. + */ + public static final org.ccsds.moims.mo.mal.MALRequestOperation ADDAGGREGATION_OP = new org.ccsds.moims.mo.mal.MALRequestOperation(SERVICE_KEY, + ADDAGGREGATION_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("addAggregation"), + new org.ccsds.moims.mo.mal.structures.UShort(5), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("aggDefDetails", true, org.ccsds.moims.mo.mc.aggregation.structures.AggregationCreationRequestList.SHORT_FORM, "The aggDefDetails field shall hold the name and the AggregationDefinitionDetails to be added.\nThe name field must not be the wildcard '*', or empty (an INVALID error shall be returned in this case).\nIf the supplied reportInterval or sampleInterval values are not supported by the provider then an INVALID error shall be returned.\nThe supplied name must be unique among all AggregationIdentity objects for the domain of the provider otherwise a DUPLICATE error shall be raised.\nIf an error is raised then no new identities and definitions shall be added as a result of this operation call.\nIf the supplied name matches an existing, but removed, AggregationIdentity then that AggregationIdentity shall be reused otherwise a new AggregationIdentity shall be created.\nThe provider shall create a new AggregationDefinition object and store it, and any new AggregationIdentity objects, in the COM archive.")}, + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("newObjInstIds", true, org.ccsds.moims.mo.mc.structures.ObjectInstancePairList.SHORT_FORM, "The response shall contain the list of object instance identifiers for the AggregationIdentity and new AggregationDefinition objects.\nThe returned list shall maintain the same order as the submitted definitions.")}, + "The addAggregation operation allows a consumer to define one or more aggregations that do not currently exist.\nThe new AggregationIdentity and AggregationDefinition objects are expected to be stored in the COM archive by the provider of the aggregation service."); + + /** + * Operation number literal for operation UPDATEDEFINITION. + */ + public static final int _UPDATEDEFINITION_OP_NUMBER = 7; + + /** + * Operation number instance for operation UPDATEDEFINITION. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort UPDATEDEFINITION_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_UPDATEDEFINITION_OP_NUMBER); + + /** + * Operation instance for operation UPDATEDEFINITION. + */ + public static final org.ccsds.moims.mo.mal.MALRequestOperation UPDATEDEFINITION_OP = new org.ccsds.moims.mo.mal.MALRequestOperation(SERVICE_KEY, + UPDATEDEFINITION_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("updateDefinition"), + new org.ccsds.moims.mo.mal.structures.UShort(5), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("aggInstIds", true, org.ccsds.moims.mo.mal.structures.LongList.SHORT_FORM, "The aggInstIds field shall contain the object instance identifiers of the AggregationIdentity objects to be updated.\nThe supplied object instance identifiers shall match existing identity objects, an UNKNOWN error shall be raised if this is not the case.\nIf the aggInstIds list contains either NULL or '0' an INVALID error shall be raised."), + new org.ccsds.moims.mo.mal.OperationField("aggDefDetails", true, org.ccsds.moims.mo.mc.aggregation.structures.AggregationDefinitionDetailsList.SHORT_FORM, "The aggDefDetails field shall contain the replacement AggregationDefinitionDetails.\nThe two lists shall be ordered the same.\nThe number of entries in the two lists shall be the same size otherwise an INVALID error shall be returned.\nIf the supplied reportInterval or sampleInterval values are not supported by the provider then an INVALID error shall be returned.\nIf an error is raised then no definitions shall be updated as a result of this operation call.\nThe provider shall create a new AggregationDefinition object and store it in the COM archive.\nThe new AggregationDefinition object shall be the current AggregationDefinition used for the specific AggregationIdentity.")}, + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("newObjInstIds", true, org.ccsds.moims.mo.mal.structures.LongList.SHORT_FORM, "The response shall contain the list of object instance identifiers for the new AggregationDefinition objects.\nThe returned list shall maintain the same order as the submitted definitions.")}, + "The updateDefinition operation allows a consumer to update a definition for one or more aggregations.\nThis differs from deleting an existing aggregation and adding a new definition with the same aggregation name in the fact that the AggregationIdentity object is not changed between the two definitions.\nThe replacement definition should be stored in the COM archive by the service provider. The operation does not remove the previous object from the COM archive, merely removes the object from the provider."); + + /** + * Operation number literal for operation REMOVEAGGREGATION. + */ + public static final int _REMOVEAGGREGATION_OP_NUMBER = 8; + + /** + * Operation number instance for operation REMOVEAGGREGATION. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort REMOVEAGGREGATION_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_REMOVEAGGREGATION_OP_NUMBER); + + /** + * Operation instance for operation REMOVEAGGREGATION. + */ + public static final org.ccsds.moims.mo.mal.MALSubmitOperation REMOVEAGGREGATION_OP = new org.ccsds.moims.mo.mal.MALSubmitOperation(SERVICE_KEY, + REMOVEAGGREGATION_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("removeAggregation"), + new org.ccsds.moims.mo.mal.structures.UShort(5), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("aggInstIds", true, org.ccsds.moims.mo.mal.structures.LongList.SHORT_FORM, "The aggInstIds field shall hold the object instance identifiers of the AggregationIdentity objects to be removed from the provider.\nThe list may contain the wildcard value of '0'.\nThe wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made.\nIf a provided AggregationIdentity object instance identifier does not include a wildcard and does not match an existing aggregation then this operation shall fail with an UNKNOWN error.\nMatched AggregationIdentity and AggregationDefinition objects shall not be removed from the COM archive only the list of AggregationIdentity and AggregationDefinition objects in the provider.\nIf an error is raised then no aggregations shall be removed as a result of this operation call.\nIf the operation succeeds then the provider shall not publish aggregation values for the deleted AggregationIdentity objects anymore.")}, + "The removeAggregation operation allows a consumer to remove one or more aggregations from the list of aggregations supported by the aggregation provider.\nThe operation does not remove the AggregationIdentity or AggregationDefinition objects from the COM archive, merely removes the objects from the provider. This permits existing AggregationValueInstance objects to continue to reference the correct AggregationDefinition object in the COM archive."); + + /** + * Area elements. + */ + public static final org.ccsds.moims.mo.mal.structures.Element[] AGGREGATION_SERVICE_ELEMENTS = {}; + + /** + * The set of operations for this service. + */ + public static final org.ccsds.moims.mo.mal.MALOperation[] OPERATIONS = new org.ccsds.moims.mo.mal.MALOperation[]{MONITORVALUE_OP, + GETVALUE_OP, + ENABLEGENERATION_OP, + ENABLEFILTER_OP, + LISTDEFINITION_OP, + ADDAGGREGATION_OP, + UPDATEDEFINITION_OP, + REMOVEAGGREGATION_OP}; + + /** + * Literal for object AGGREGATIONIDENTITY. + */ + @Deprecated + public static final int _AGGREGATIONIDENTITY_OBJECT_NUMBER = 1; + + /** + * Instance for object AGGREGATIONIDENTITY. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.UShort AGGREGATIONIDENTITY_OBJECT_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_AGGREGATIONIDENTITY_OBJECT_NUMBER); + + /** + * Object name constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.Identifier AGGREGATIONIDENTITY_OBJECT_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("AggregationIdentity"); + + /** + * Object type constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.com.structures.ObjectType AGGREGATIONIDENTITY_OBJECT_TYPE = new org.ccsds.moims.mo.com.structures.ObjectType(new org.ccsds.moims.mo.mal.structures.UShort(4), AGGREGATION_SERVICE_NUMBER, new org.ccsds.moims.mo.mal.structures.UOctet(1), AGGREGATIONIDENTITY_OBJECT_NUMBER); + + /** + * Object instance. + */ + @Deprecated + public static org.ccsds.moims.mo.com.COMObject AGGREGATIONIDENTITY_OBJECT = new org.ccsds.moims.mo.com.COMObject(AGGREGATIONIDENTITY_OBJECT_TYPE, AGGREGATIONIDENTITY_OBJECT_NAME, org.ccsds.moims.mo.mal.structures.Attribute.IDENTIFIER_SHORT_FORM, false, null, true, null, false); + + /** + * Literal for object AGGREGATIONDEFINITION. + */ + @Deprecated + public static final int _AGGREGATIONDEFINITION_OBJECT_NUMBER = 2; + + /** + * Instance for object AGGREGATIONDEFINITION. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.UShort AGGREGATIONDEFINITION_OBJECT_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_AGGREGATIONDEFINITION_OBJECT_NUMBER); + + /** + * Object name constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.Identifier AGGREGATIONDEFINITION_OBJECT_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("AggregationDefinition"); + + /** + * Object type constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.com.structures.ObjectType AGGREGATIONDEFINITION_OBJECT_TYPE = new org.ccsds.moims.mo.com.structures.ObjectType(new org.ccsds.moims.mo.mal.structures.UShort(4), AGGREGATION_SERVICE_NUMBER, new org.ccsds.moims.mo.mal.structures.UOctet(1), AGGREGATIONDEFINITION_OBJECT_NUMBER); + + /** + * Object instance. + */ + @Deprecated + public static org.ccsds.moims.mo.com.COMObject AGGREGATIONDEFINITION_OBJECT = new org.ccsds.moims.mo.com.COMObject(AGGREGATIONDEFINITION_OBJECT_TYPE, AGGREGATIONDEFINITION_OBJECT_NAME, org.ccsds.moims.mo.mc.aggregation.structures.AggregationDefinitionDetails.SHORT_FORM, true, org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo.AGGREGATIONIDENTITY_OBJECT_TYPE, true, null, false); + + /** + * Literal for object AGGREGATIONVALUEINSTANCE. + */ + @Deprecated + public static final int _AGGREGATIONVALUEINSTANCE_OBJECT_NUMBER = 3; + + /** + * Instance for object AGGREGATIONVALUEINSTANCE. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.UShort AGGREGATIONVALUEINSTANCE_OBJECT_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_AGGREGATIONVALUEINSTANCE_OBJECT_NUMBER); + + /** + * Object name constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.Identifier AGGREGATIONVALUEINSTANCE_OBJECT_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("AggregationValueInstance"); + + /** + * Object type constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.com.structures.ObjectType AGGREGATIONVALUEINSTANCE_OBJECT_TYPE = new org.ccsds.moims.mo.com.structures.ObjectType(new org.ccsds.moims.mo.mal.structures.UShort(4), AGGREGATION_SERVICE_NUMBER, new org.ccsds.moims.mo.mal.structures.UOctet(1), AGGREGATIONVALUEINSTANCE_OBJECT_NUMBER); + + /** + * Object instance. + */ + @Deprecated + public static org.ccsds.moims.mo.com.COMObject AGGREGATIONVALUEINSTANCE_OBJECT = new org.ccsds.moims.mo.com.COMObject(AGGREGATIONVALUEINSTANCE_OBJECT_TYPE, AGGREGATIONVALUEINSTANCE_OBJECT_NAME, org.ccsds.moims.mo.mc.aggregation.structures.AggregationValue.SHORT_FORM, true, org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo.AGGREGATIONDEFINITION_OBJECT_TYPE, true, null, false); + + /** + * Object instance. + */ + public static final org.ccsds.moims.mo.com.COMObject[] COM_OBJECTS = { + AGGREGATIONIDENTITY_OBJECT, + AGGREGATIONDEFINITION_OBJECT, + AGGREGATIONVALUEINSTANCE_OBJECT,}; + + /** + * Creates an instance of the Aggregation ServiceInfo. + * + */ + public AggregationServiceInfo() { + super(SERVICE_KEY, AGGREGATION_SERVICE_NAME, AGGREGATION_SERVICE_ELEMENTS, OPERATIONS, COM_OBJECTS); + } + + @Override + public org.ccsds.moims.mo.mal.MALArea getArea() { + return org.ccsds.moims.mo.mc.MCHelper.MC_AREA; + } + + @Override + public org.ccsds.moims.mo.mal.MOErrorException generateMOError(int errorNumber, + Object extraInfo) { + switch (errorNumber) { + case 70020: + return new org.ccsds.moims.mo.mc.ReadonlyException(extraInfo); + case 70021: + return new org.ccsds.moims.mo.mc.ReferencedException(extraInfo); + } + return null; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/consumer/AggregationAdapter.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/consumer/AggregationAdapter.java new file mode 100644 index 00000000..66008202 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/consumer/AggregationAdapter.java @@ -0,0 +1,439 @@ +package org.ccsds.moims.mo.mc.aggregation.consumer; + +/** + * Consumer adapter for Aggregation service. + */ +public abstract class AggregationAdapter extends org.ccsds.moims.mo.mal.consumer.MALInteractionAdapter { + + /** + * Called by the MAL when a PubSub register acknowledgement is received from + * a broker for the operation monitorValue. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void monitorValueRegisterAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PubSub register acknowledgement error is received + * from a broker for the operation monitorValue. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void monitorValueRegisterErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PubSub deregister acknowledgement is received + * from a broker for the operation monitorValue. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void monitorValueDeregisterAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PubSub update is received from a broker for the + * operation monitorValue. + * + * @param msgHeader msgHeader The header of the received message + * @param subscriptionId The subscriptionId of the subscription. + * @param updateHeader The Update header. + * @param keys The typed Subscription Key accessors for this update + * @param objId The MAL EntityKey.firstSubKey shall contain the aggregation name. +The MAL EntityKey.secondSubKey shall contain the AggregationIdentity object instance identifier. +The MAL EntityKey.thirdSubKey shall contain the AggregationDefinition object instance identifier. +The MAL EntityKey.fourthSubKey shall contain the new AggregationValueInstance object instance identifier. +The timestamp of the AggregationValueInstance report shall be taken from the publish message. +The publish message shall include the ObjectId of the source link of the report. +If no source link is needed then the ObjectId shall be replaced with a NULL. + * @param newValue The second part of the publish message shall be the AggregationValue. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void monitorValueNotifyReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.structures.Identifier subscriptionId, + org.ccsds.moims.mo.mal.structures.UpdateHeader updateHeader, + MonitorValueSubscriptionKeys keys, + org.ccsds.moims.mo.com.structures.ObjectId objId, + org.ccsds.moims.mo.mc.aggregation.structures.AggregationValue newValue, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PubSub update error is received from a broker + * for the operation monitorValue. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void monitorValueNotifyErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response is received from a provider for + * the operation getValue. + * + * @param msgHeader msgHeader The header of the received message + * @param aggValDetails The response shall contain a list of returned AggregationIdentity and AggregationDefinition object instance identifier pairs and a matching list of AggregationValues. +The new value shall not be published via the monitorValue operation. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void getValueResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mc.aggregation.structures.AggregationValueDetailsList aggValDetails, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response error is received from a provider + * for the operation getValue. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void getValueErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response is received from a provider for + * the operation enableGeneration. + * + * @param msgHeader msgHeader The header of the received message + * @param newObjInstIds The response shall contain the list of object instance identifiers for the new AggregationDefinition objects. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void enableGenerationResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.structures.LongList newObjInstIds, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response error is received from a provider + * for the operation enableGeneration. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void enableGenerationErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a SUBMIT acknowledgement is received from a provider + * for the operation enableFilter. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void enableFilterAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a SUBMIT acknowledgement error is received from + * a provider for the operation enableFilter. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void enableFilterErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response is received from a provider for + * the operation listDefinition. + * + * @param msgHeader msgHeader The header of the received message + * @param objInstIds The response shall contain a list of matching AggregationIdentity and AggregationDefinition object instance identifiers. +The returned list shall maintain the same order as the submitted list unless the wildcard value was included in the request. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void listDefinitionResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mc.structures.ObjectInstancePairList objInstIds, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response error is received from a provider + * for the operation listDefinition. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void listDefinitionErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response is received from a provider for + * the operation addAggregation. + * + * @param msgHeader msgHeader The header of the received message + * @param newObjInstIds The response shall contain the list of object instance identifiers for the AggregationIdentity and new AggregationDefinition objects. +The returned list shall maintain the same order as the submitted definitions. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void addAggregationResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mc.structures.ObjectInstancePairList newObjInstIds, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response error is received from a provider + * for the operation addAggregation. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void addAggregationErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response is received from a provider for + * the operation updateDefinition. + * + * @param msgHeader msgHeader The header of the received message + * @param newObjInstIds The response shall contain the list of object instance identifiers for the new AggregationDefinition objects. +The returned list shall maintain the same order as the submitted definitions. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void updateDefinitionResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.structures.LongList newObjInstIds, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response error is received from a provider + * for the operation updateDefinition. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void updateDefinitionErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a SUBMIT acknowledgement is received from a provider + * for the operation removeAggregation. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void removeAggregationAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a SUBMIT acknowledgement error is received from + * a provider for the operation removeAggregation. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void removeAggregationErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + @Override + public final void submitAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo._ENABLEFILTER_OP_NUMBER: + enableFilterAckReceived(msgHeader, qosProperties); + break; + case org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo._REMOVEAGGREGATION_OP_NUMBER: + removeAggregationAckReceived(msgHeader, qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void submitErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALErrorBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo._ENABLEFILTER_OP_NUMBER: + enableFilterErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo._REMOVEAGGREGATION_OP_NUMBER: + removeAggregationErrorReceived(msgHeader, body.getError(), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void requestResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALMessageBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo._GETVALUE_OP_NUMBER: + getValueResponseReceived(msgHeader, + (org.ccsds.moims.mo.mc.aggregation.structures.AggregationValueDetailsList) body.getBodyElement(0, new org.ccsds.moims.mo.mc.aggregation.structures.AggregationValueDetailsList()), qosProperties); + break; + case org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo._ENABLEGENERATION_OP_NUMBER: + enableGenerationResponseReceived(msgHeader, + (org.ccsds.moims.mo.mal.structures.LongList) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.LongList()), qosProperties); + break; + case org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo._LISTDEFINITION_OP_NUMBER: + listDefinitionResponseReceived(msgHeader, + (org.ccsds.moims.mo.mc.structures.ObjectInstancePairList) body.getBodyElement(0, new org.ccsds.moims.mo.mc.structures.ObjectInstancePairList()), qosProperties); + break; + case org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo._ADDAGGREGATION_OP_NUMBER: + addAggregationResponseReceived(msgHeader, + (org.ccsds.moims.mo.mc.structures.ObjectInstancePairList) body.getBodyElement(0, new org.ccsds.moims.mo.mc.structures.ObjectInstancePairList()), qosProperties); + break; + case org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo._UPDATEDEFINITION_OP_NUMBER: + updateDefinitionResponseReceived(msgHeader, + (org.ccsds.moims.mo.mal.structures.LongList) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.LongList()), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void requestErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALErrorBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo._GETVALUE_OP_NUMBER: + getValueErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo._ENABLEGENERATION_OP_NUMBER: + enableGenerationErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo._LISTDEFINITION_OP_NUMBER: + listDefinitionErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo._ADDAGGREGATION_OP_NUMBER: + addAggregationErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo._UPDATEDEFINITION_OP_NUMBER: + updateDefinitionErrorReceived(msgHeader, body.getError(), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void registerAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo._MONITORVALUE_OP_NUMBER: + monitorValueRegisterAckReceived(msgHeader, qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void registerErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALErrorBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo._MONITORVALUE_OP_NUMBER: + monitorValueRegisterErrorReceived(msgHeader, body.getError(), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void notifyReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALNotifyBody body, + org.ccsds.moims.mo.mal.structures.IdentifierList selectedKeys, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + if ((org.ccsds.moims.mo.mc.MCHelper.MC_AREA_NUMBER.equals(msgHeader.getServiceArea())) && (org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo.AGGREGATION_SERVICE_NUMBER.equals(msgHeader.getService()))) { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo._MONITORVALUE_OP_NUMBER: + monitorValueNotifyReceived(msgHeader, + (org.ccsds.moims.mo.mal.structures.Identifier) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.Identifier()), + (org.ccsds.moims.mo.mal.structures.UpdateHeader) body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.UpdateHeader()), + new MonitorValueSubscriptionKeys((org.ccsds.moims.mo.mal.structures.UpdateHeader) body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.UpdateHeader()), selectedKeys), + (org.ccsds.moims.mo.com.structures.ObjectId) body.getBodyElement(2, new org.ccsds.moims.mo.com.structures.ObjectId()), + (org.ccsds.moims.mo.mc.aggregation.structures.AggregationValue) body.getBodyElement(3, new org.ccsds.moims.mo.mc.aggregation.structures.AggregationValue()), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + else { + notifyReceivedFromOtherService(msgHeader, body, qosProperties); + } + } + + @Override + public final void notifyErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALErrorBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo._MONITORVALUE_OP_NUMBER: + monitorValueNotifyErrorReceived(msgHeader, body.getError(), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void deregisterAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo._MONITORVALUE_OP_NUMBER: + monitorValueDeregisterAckReceived(msgHeader, qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + /** + * Called by the MAL when a PubSub update from another service is received + * from a broker. + * + * @param msgHeader msgHeader The header of the received message + * @param body body The body of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + * @throws org.ccsds.moims.mo.mal.MALException if an error is detected processing the message. + */ + public void notifyReceivedFromOtherService(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALNotifyBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/consumer/AggregationStub.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/consumer/AggregationStub.java new file mode 100644 index 00000000..fad6e45b --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/consumer/AggregationStub.java @@ -0,0 +1,527 @@ +package org.ccsds.moims.mo.mc.aggregation.consumer; + +/** + * Consumer stub for Aggregation service. + */ +public class AggregationStub { + + /** + * The consumer field. + */ + private final org.ccsds.moims.mo.mal.consumer.MALConsumer consumer; + + /** + * Wraps a MALconsumer connection with service specific methods that map from + * the high level service API to the generic MAL API. + * + * @param consumer consumer The MALConsumer to use in this stub. + */ + public AggregationStub(org.ccsds.moims.mo.mal.consumer.MALConsumer consumer) { + this.consumer = consumer; + } + + /** + * Returns the internal MAL consumer object used for sending of messages from + * this interface. + * + * @return The MAL consumer object. + */ + public org.ccsds.moims.mo.mal.consumer.MALConsumer getConsumer() { + return consumer; + } + + /** + * Register method for the monitorValue PubSub interaction. + * + * @param subscription subscription the subscription to register for + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void monitorValueRegister(org.ccsds.moims.mo.mal.structures.Subscription subscription, + org.ccsds.moims.mo.mc.aggregation.consumer.AggregationAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.register(org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo.MONITORVALUE_OP, subscription, adapter); + } + + /** + * Asynchronous version of method monitorValueRegister. + * + * @param subscription subscription the subscription to register for + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncMonitorValueRegister(org.ccsds.moims.mo.mal.structures.Subscription subscription, + org.ccsds.moims.mo.mc.aggregation.consumer.AggregationAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncRegister(org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo.MONITORVALUE_OP, subscription, adapter); + } + + /** + * Deregister method for the monitorValue PubSub interaction. + * + * @param identifierList identifierList the subscription identifiers to deregister + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void monitorValueDeregister(org.ccsds.moims.mo.mal.structures.IdentifierList identifierList) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.deregister(org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo.MONITORVALUE_OP, identifierList); + } + + /** + * Asynchronous version of method monitorValueDeregister. + * + * @param identifierList identifierList the subscription identifiers to deregister + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncMonitorValueDeregister(org.ccsds.moims.mo.mal.structures.IdentifierList identifierList, + org.ccsds.moims.mo.mc.aggregation.consumer.AggregationAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncDeregister(org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo.MONITORVALUE_OP, identifierList, adapter); + } + + /** + * The getValue operation returns the latest received value for a requested + * aggregation. + * + * @param aggInstIds The aggInstIds field shall provide the list of AggregationIdentity object instance identifiers. +The wildcard value of '0' shall be supported and matches all aggregations of the provider. +The wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made. +If a requested aggregation is unknown then an UNKNOWN error shall be returned. +The filter shall not be applied for the getValue operation. +If an aggregation is being reported periodically, using the operation shall not reset the reportInterval or filteredTimeout timer. + * @return The return value of the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mc.aggregation.structures.AggregationValueDetailsList getValue(org.ccsds.moims.mo.mal.structures.LongList aggInstIds) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + org.ccsds.moims.mo.mal.transport.MALMessageBody body = consumer.request(org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo.GETVALUE_OP, aggInstIds); + Object body0 = (Object) body.getBodyElement(0, new org.ccsds.moims.mo.mc.aggregation.structures.AggregationValueDetailsList()); + return (org.ccsds.moims.mo.mc.aggregation.structures.AggregationValueDetailsList) body0; + } + + /** + * Asynchronous version of method getValue. + * + * @param aggInstIds The aggInstIds field shall provide the list of AggregationIdentity object instance identifiers. +The wildcard value of '0' shall be supported and matches all aggregations of the provider. +The wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made. +If a requested aggregation is unknown then an UNKNOWN error shall be returned. +The filter shall not be applied for the getValue operation. +If an aggregation is being reported periodically, using the operation shall not reset the reportInterval or filteredTimeout timer. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncGetValue(org.ccsds.moims.mo.mal.structures.LongList aggInstIds, + org.ccsds.moims.mo.mc.aggregation.consumer.AggregationAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncRequest(org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo.GETVALUE_OP, adapter, aggInstIds); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueGetValue(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mc.aggregation.consumer.AggregationAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo.GETVALUE_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The enableGeneration operation allows a consumer to control whether reports + * for specific aggregations are generated or not. The operation allows the + * consumer to select the aggregations directly or indirectly using groups. + * This affects all types of aggregations, periodic, filtered and ad-hoc. + * + * @param isGroupIds If the isGroupIds field is TRUE then the enableInstances field shall contain GroupIdentity object instance identifiers, otherwise the field contains AggregationIdentity object instance identifiers. +The AggregationIdentity objects referenced, either directly or indirectly via groups, by the enableInstances field shall be the AggregationIdentity objects to match. +The id of the enableInstances field shall support the wildcard value of '0' and matches all AggregationIdentity objects of the provider. +The service provider shall check for the wildcard value in the list of object instance identifiers in the enableInstances field first and if found no other checks of supplied object instance identifiers shall be made. +If the enableInstances field contains a value of TRUE then reports of matching AggregationIdentity objects shall be generated, a value of FALSE requests that reports will not be generated. +No error shall be raised if the enableInstances Boolean value supplied is the same as the current generationEnabled field of the definition for a matched AggregationIdentity object i.e. enabling an already enabled aggregation will not result in an error. +If a requested AggregationIdentity or GroupIdentity object is unknown then an UNKNOWN error shall be returned. +If a requested Group, or the Group objects referenced by that Group, does not contain AggregationIdentity objects then an INVALID error shall be returned. +If an error is raised then no modifications shall be made as a result of this operation call. +The provider shall create and store a new AggregationDefinition object in the COM archive if the generationEnabled field is changed. +If a new AggregationDefinition object is created then that new object shall be the current AggregationDefinition used for the specific AggregationIdentity. + * @param enableInstances If the generation of reports is being enabled, and the aggregation is defined as being periodic, then the provider shall generate a report immediately and start the report interval from that report. + * @return The return value of the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.structures.LongList enableGeneration(Boolean isGroupIds, + org.ccsds.moims.mo.com.structures.InstanceBooleanPairList enableInstances) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + org.ccsds.moims.mo.mal.transport.MALMessageBody body = consumer.request(org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo.ENABLEGENERATION_OP, (isGroupIds == null) ? null : new org.ccsds.moims.mo.mal.structures.Union(isGroupIds), enableInstances); + Object body0 = (Object) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.LongList()); + return (org.ccsds.moims.mo.mal.structures.LongList) body0; + } + + /** + * Asynchronous version of method enableGeneration. + * + * @param isGroupIds If the isGroupIds field is TRUE then the enableInstances field shall contain GroupIdentity object instance identifiers, otherwise the field contains AggregationIdentity object instance identifiers. +The AggregationIdentity objects referenced, either directly or indirectly via groups, by the enableInstances field shall be the AggregationIdentity objects to match. +The id of the enableInstances field shall support the wildcard value of '0' and matches all AggregationIdentity objects of the provider. +The service provider shall check for the wildcard value in the list of object instance identifiers in the enableInstances field first and if found no other checks of supplied object instance identifiers shall be made. +If the enableInstances field contains a value of TRUE then reports of matching AggregationIdentity objects shall be generated, a value of FALSE requests that reports will not be generated. +No error shall be raised if the enableInstances Boolean value supplied is the same as the current generationEnabled field of the definition for a matched AggregationIdentity object i.e. enabling an already enabled aggregation will not result in an error. +If a requested AggregationIdentity or GroupIdentity object is unknown then an UNKNOWN error shall be returned. +If a requested Group, or the Group objects referenced by that Group, does not contain AggregationIdentity objects then an INVALID error shall be returned. +If an error is raised then no modifications shall be made as a result of this operation call. +The provider shall create and store a new AggregationDefinition object in the COM archive if the generationEnabled field is changed. +If a new AggregationDefinition object is created then that new object shall be the current AggregationDefinition used for the specific AggregationIdentity. + * @param enableInstances If the generation of reports is being enabled, and the aggregation is defined as being periodic, then the provider shall generate a report immediately and start the report interval from that report. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncEnableGeneration(Boolean isGroupIds, + org.ccsds.moims.mo.com.structures.InstanceBooleanPairList enableInstances, + org.ccsds.moims.mo.mc.aggregation.consumer.AggregationAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncRequest(org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo.ENABLEGENERATION_OP, adapter, (isGroupIds == null) ? null : new org.ccsds.moims.mo.mal.structures.Union(isGroupIds), enableInstances); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueEnableGeneration(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mc.aggregation.consumer.AggregationAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo.ENABLEGENERATION_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The enableFilter operation allows a consumer to control whether reports + * for specific aggregations are filtered or not. The operation allows the + * consumer to select the aggregations directly or indirectly using groups. + * This affects both periodic and ad-hoc aggregations. + * + * @param isGroupIds If the isGroupIds field is TRUE then the enableInstances field shall contain GroupIdentity object instance identifiers, otherwise the field contains AggregationIdentity object instance identifiers. +The AggregationIdentity objects referenced, either directly or indirectly via groups, by the enableInstances field shall be the AggregationIdentity objects to match. +The id of the enableInstances field shall support the wildcard value of '0' and matches all AggregationIdentity objects of the provider. +The service provider shall check for the wildcard value in the list of object instance identifiers in the enableInstances field first and if found no other checks of supplied object instance identifiers shall be made. +If the enableInstances field contains a value of TRUE then reports of matching AggregationIdentity objects shall be filtered, a value of FALSE requests that reports will not be filtered. +No error shall be raised if the enableInstances Boolean value supplied is the same as the current filterEnabled field of the definition for a matched AggregationIdentity object i.e. filtering an already filtered aggregation will not result in an error. +If a requested AggregationIdentity or GroupIdentity object is unknown then an UNKNOWN error shall be returned. +If a requested Group, or the Group objects referenced by that Group, does not contain AggregationIdentity objects then an INVALID error shall be returned. +If an error is raised then no modifications shall be made as a result of this operation call. +The provider shall create and store a new AggregationDefinition object in the COM archive if the filterEnabled field is changed. +If a new AggregationDefinition object is created then that new object shall be the current AggregationDefinition used for the specific AggregationIdentity. + * @param enableInstances enableInstances Argument number 1 as defined by the service operation + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void enableFilter(Boolean isGroupIds, + org.ccsds.moims.mo.com.structures.InstanceBooleanPairList enableInstances) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.submit(org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo.ENABLEFILTER_OP, (isGroupIds == null) ? null : new org.ccsds.moims.mo.mal.structures.Union(isGroupIds), enableInstances); + } + + /** + * Asynchronous version of method enableFilter. + * + * @param isGroupIds If the isGroupIds field is TRUE then the enableInstances field shall contain GroupIdentity object instance identifiers, otherwise the field contains AggregationIdentity object instance identifiers. +The AggregationIdentity objects referenced, either directly or indirectly via groups, by the enableInstances field shall be the AggregationIdentity objects to match. +The id of the enableInstances field shall support the wildcard value of '0' and matches all AggregationIdentity objects of the provider. +The service provider shall check for the wildcard value in the list of object instance identifiers in the enableInstances field first and if found no other checks of supplied object instance identifiers shall be made. +If the enableInstances field contains a value of TRUE then reports of matching AggregationIdentity objects shall be filtered, a value of FALSE requests that reports will not be filtered. +No error shall be raised if the enableInstances Boolean value supplied is the same as the current filterEnabled field of the definition for a matched AggregationIdentity object i.e. filtering an already filtered aggregation will not result in an error. +If a requested AggregationIdentity or GroupIdentity object is unknown then an UNKNOWN error shall be returned. +If a requested Group, or the Group objects referenced by that Group, does not contain AggregationIdentity objects then an INVALID error shall be returned. +If an error is raised then no modifications shall be made as a result of this operation call. +The provider shall create and store a new AggregationDefinition object in the COM archive if the filterEnabled field is changed. +If a new AggregationDefinition object is created then that new object shall be the current AggregationDefinition used for the specific AggregationIdentity. + * @param enableInstances enableInstances Argument number 1 as defined by the service operation + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncEnableFilter(Boolean isGroupIds, + org.ccsds.moims.mo.com.structures.InstanceBooleanPairList enableInstances, + org.ccsds.moims.mo.mc.aggregation.consumer.AggregationAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncSubmit(org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo.ENABLEFILTER_OP, adapter, (isGroupIds == null) ? null : new org.ccsds.moims.mo.mal.structures.Union(isGroupIds), enableInstances); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueEnableFilter(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mc.aggregation.consumer.AggregationAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo.ENABLEFILTER_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The listDefinition operation allows a consumer to request the latest object + * instance identifiers of the AggregationIdentity and AggregationDefinition + * objects for the supported aggregations of the provider. + * + * @param aggNames The aggNames field shall contain a list of aggregation names to retrieve the AggregationIdentity and AggregationDefinition object instance identifiers for. +The aggNames field may contain the wildcard value of '*' to return all supported AggregationIdentity and AggregationDefinition objects. +The wildcard value should be checked for first, if found no other checks of supplied identifiers shall be made. +If a provided identifier does not include a wildcard and does not match an existing AggregationIdentity object then this operation shall fail with an UNKNOWN error. + * @return The return value of the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mc.structures.ObjectInstancePairList listDefinition(org.ccsds.moims.mo.mal.structures.IdentifierList aggNames) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + org.ccsds.moims.mo.mal.transport.MALMessageBody body = consumer.request(org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo.LISTDEFINITION_OP, aggNames); + Object body0 = (Object) body.getBodyElement(0, new org.ccsds.moims.mo.mc.structures.ObjectInstancePairList()); + return (org.ccsds.moims.mo.mc.structures.ObjectInstancePairList) body0; + } + + /** + * Asynchronous version of method listDefinition. + * + * @param aggNames The aggNames field shall contain a list of aggregation names to retrieve the AggregationIdentity and AggregationDefinition object instance identifiers for. +The aggNames field may contain the wildcard value of '*' to return all supported AggregationIdentity and AggregationDefinition objects. +The wildcard value should be checked for first, if found no other checks of supplied identifiers shall be made. +If a provided identifier does not include a wildcard and does not match an existing AggregationIdentity object then this operation shall fail with an UNKNOWN error. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncListDefinition(org.ccsds.moims.mo.mal.structures.IdentifierList aggNames, + org.ccsds.moims.mo.mc.aggregation.consumer.AggregationAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncRequest(org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo.LISTDEFINITION_OP, adapter, aggNames); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueListDefinition(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mc.aggregation.consumer.AggregationAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo.LISTDEFINITION_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The addAggregation operation allows a consumer to define one or more aggregations + * that do not currently exist. + * The new AggregationIdentity and AggregationDefinition objects are expected + * to be stored in the COM archive by the provider of the aggregation service. + * + * @param aggDefDetails The aggDefDetails field shall hold the name and the AggregationDefinitionDetails to be added. +The name field must not be the wildcard '*', or empty (an INVALID error shall be returned in this case). +If the supplied reportInterval or sampleInterval values are not supported by the provider then an INVALID error shall be returned. +The supplied name must be unique among all AggregationIdentity objects for the domain of the provider otherwise a DUPLICATE error shall be raised. +If an error is raised then no new identities and definitions shall be added as a result of this operation call. +If the supplied name matches an existing, but removed, AggregationIdentity then that AggregationIdentity shall be reused otherwise a new AggregationIdentity shall be created. +The provider shall create a new AggregationDefinition object and store it, and any new AggregationIdentity objects, in the COM archive. + * @return The return value of the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mc.structures.ObjectInstancePairList addAggregation(org.ccsds.moims.mo.mc.aggregation.structures.AggregationCreationRequestList aggDefDetails) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + org.ccsds.moims.mo.mal.transport.MALMessageBody body = consumer.request(org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo.ADDAGGREGATION_OP, aggDefDetails); + Object body0 = (Object) body.getBodyElement(0, new org.ccsds.moims.mo.mc.structures.ObjectInstancePairList()); + return (org.ccsds.moims.mo.mc.structures.ObjectInstancePairList) body0; + } + + /** + * Asynchronous version of method addAggregation. + * + * @param aggDefDetails The aggDefDetails field shall hold the name and the AggregationDefinitionDetails to be added. +The name field must not be the wildcard '*', or empty (an INVALID error shall be returned in this case). +If the supplied reportInterval or sampleInterval values are not supported by the provider then an INVALID error shall be returned. +The supplied name must be unique among all AggregationIdentity objects for the domain of the provider otherwise a DUPLICATE error shall be raised. +If an error is raised then no new identities and definitions shall be added as a result of this operation call. +If the supplied name matches an existing, but removed, AggregationIdentity then that AggregationIdentity shall be reused otherwise a new AggregationIdentity shall be created. +The provider shall create a new AggregationDefinition object and store it, and any new AggregationIdentity objects, in the COM archive. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncAddAggregation(org.ccsds.moims.mo.mc.aggregation.structures.AggregationCreationRequestList aggDefDetails, + org.ccsds.moims.mo.mc.aggregation.consumer.AggregationAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncRequest(org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo.ADDAGGREGATION_OP, adapter, aggDefDetails); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueAddAggregation(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mc.aggregation.consumer.AggregationAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo.ADDAGGREGATION_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The updateDefinition operation allows a consumer to update a definition + * for one or more aggregations. + * This differs from deleting an existing aggregation and adding a new definition + * with the same aggregation name in the fact that the AggregationIdentity + * object is not changed between the two definitions. + * The replacement definition should be stored in the COM archive by the service + * provider. The operation does not remove the previous object from the COM + * archive, merely removes the object from the provider. + * + * @param aggInstIds The aggInstIds field shall contain the object instance identifiers of the AggregationIdentity objects to be updated. +The supplied object instance identifiers shall match existing identity objects, an UNKNOWN error shall be raised if this is not the case. +If the aggInstIds list contains either NULL or '0' an INVALID error shall be raised. + * @param aggDefDetails The aggDefDetails field shall contain the replacement AggregationDefinitionDetails. +The two lists shall be ordered the same. +The number of entries in the two lists shall be the same size otherwise an INVALID error shall be returned. +If the supplied reportInterval or sampleInterval values are not supported by the provider then an INVALID error shall be returned. +If an error is raised then no definitions shall be updated as a result of this operation call. +The provider shall create a new AggregationDefinition object and store it in the COM archive. +The new AggregationDefinition object shall be the current AggregationDefinition used for the specific AggregationIdentity. + * @return The return value of the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.structures.LongList updateDefinition(org.ccsds.moims.mo.mal.structures.LongList aggInstIds, + org.ccsds.moims.mo.mc.aggregation.structures.AggregationDefinitionDetailsList aggDefDetails) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + org.ccsds.moims.mo.mal.transport.MALMessageBody body = consumer.request(org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo.UPDATEDEFINITION_OP, aggInstIds, aggDefDetails); + Object body0 = (Object) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.LongList()); + return (org.ccsds.moims.mo.mal.structures.LongList) body0; + } + + /** + * Asynchronous version of method updateDefinition. + * + * @param aggInstIds The aggInstIds field shall contain the object instance identifiers of the AggregationIdentity objects to be updated. +The supplied object instance identifiers shall match existing identity objects, an UNKNOWN error shall be raised if this is not the case. +If the aggInstIds list contains either NULL or '0' an INVALID error shall be raised. + * @param aggDefDetails The aggDefDetails field shall contain the replacement AggregationDefinitionDetails. +The two lists shall be ordered the same. +The number of entries in the two lists shall be the same size otherwise an INVALID error shall be returned. +If the supplied reportInterval or sampleInterval values are not supported by the provider then an INVALID error shall be returned. +If an error is raised then no definitions shall be updated as a result of this operation call. +The provider shall create a new AggregationDefinition object and store it in the COM archive. +The new AggregationDefinition object shall be the current AggregationDefinition used for the specific AggregationIdentity. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncUpdateDefinition(org.ccsds.moims.mo.mal.structures.LongList aggInstIds, + org.ccsds.moims.mo.mc.aggregation.structures.AggregationDefinitionDetailsList aggDefDetails, + org.ccsds.moims.mo.mc.aggregation.consumer.AggregationAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncRequest(org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo.UPDATEDEFINITION_OP, adapter, aggInstIds, aggDefDetails); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueUpdateDefinition(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mc.aggregation.consumer.AggregationAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo.UPDATEDEFINITION_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The removeAggregation operation allows a consumer to remove one or more + * aggregations from the list of aggregations supported by the aggregation + * provider. + * The operation does not remove the AggregationIdentity or AggregationDefinition + * objects from the COM archive, merely removes the objects from the provider. + * This permits existing AggregationValueInstance objects to continue to reference + * the correct AggregationDefinition object in the COM archive. + * + * @param aggInstIds The aggInstIds field shall hold the object instance identifiers of the AggregationIdentity objects to be removed from the provider. +The list may contain the wildcard value of '0'. +The wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made. +If a provided AggregationIdentity object instance identifier does not include a wildcard and does not match an existing aggregation then this operation shall fail with an UNKNOWN error. +Matched AggregationIdentity and AggregationDefinition objects shall not be removed from the COM archive only the list of AggregationIdentity and AggregationDefinition objects in the provider. +If an error is raised then no aggregations shall be removed as a result of this operation call. +If the operation succeeds then the provider shall not publish aggregation values for the deleted AggregationIdentity objects anymore. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void removeAggregation(org.ccsds.moims.mo.mal.structures.LongList aggInstIds) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.submit(org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo.REMOVEAGGREGATION_OP, aggInstIds); + } + + /** + * Asynchronous version of method removeAggregation. + * + * @param aggInstIds The aggInstIds field shall hold the object instance identifiers of the AggregationIdentity objects to be removed from the provider. +The list may contain the wildcard value of '0'. +The wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made. +If a provided AggregationIdentity object instance identifier does not include a wildcard and does not match an existing aggregation then this operation shall fail with an UNKNOWN error. +Matched AggregationIdentity and AggregationDefinition objects shall not be removed from the COM archive only the list of AggregationIdentity and AggregationDefinition objects in the provider. +If an error is raised then no aggregations shall be removed as a result of this operation call. +If the operation succeeds then the provider shall not publish aggregation values for the deleted AggregationIdentity objects anymore. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncRemoveAggregation(org.ccsds.moims.mo.mal.structures.LongList aggInstIds, + org.ccsds.moims.mo.mc.aggregation.consumer.AggregationAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncSubmit(org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo.REMOVEAGGREGATION_OP, adapter, aggInstIds); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueRemoveAggregation(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mc.aggregation.consumer.AggregationAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo.REMOVEAGGREGATION_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/consumer/MonitorValueSubscriptionKeys.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/consumer/MonitorValueSubscriptionKeys.java new file mode 100644 index 00000000..be526b0d --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/consumer/MonitorValueSubscriptionKeys.java @@ -0,0 +1,68 @@ +package org.ccsds.moims.mo.mc.aggregation.consumer; + +/** + * Typed accessors for the Subscription Keys of the monitorValue PubSub operation. + */ +public final class MonitorValueSubscriptionKeys { + + /** + * The key values as received in the UpdateHeader. + */ + private org.ccsds.moims.mo.mal.structures.NullableAttributeList keyValues; + + /** + * The effective key names for the received key values. + */ + private org.ccsds.moims.mo.mal.structures.IdentifierList keyNames; + + /** + * The Subscription Key names defined by the operation, in order. + */ + private static final org.ccsds.moims.mo.mal.structures.IdentifierList CANONICAL_KEY_NAMES = new org.ccsds.moims.mo.mal.structures.IdentifierList(new java.util.ArrayList<>(java.util.Arrays.asList())); + + /** + * Creates an instance from the received UpdateHeader and the subscription + * selectedKeys. + * + * @param updateHeader The UpdateHeader received in the NOTIFY message + * @param selectedKeys The selectedKeys of the subscription, or null if trimming was not enabled + */ + public MonitorValueSubscriptionKeys(org.ccsds.moims.mo.mal.structures.UpdateHeader updateHeader, + org.ccsds.moims.mo.mal.structures.IdentifierList selectedKeys) { + this.keyValues = (updateHeader == null) ? null : updateHeader.getKeyValues(); + this.keyNames = (selectedKeys != null) ? selectedKeys : CANONICAL_KEY_NAMES; + } + + /** + * Returns the Subscription Key value with the given name, or null if it is + * not present (for example when it was trimmed away or is a custom key that + * is not part of this subscription). + * + * @param name The Subscription Key name + * @return The key value, or null if not present + */ + public org.ccsds.moims.mo.mal.structures.Attribute getByName(String name) { + return valueByName(name); + } + + /** + * + * @param name The Subscription Key name + */ + private org.ccsds.moims.mo.mal.structures.Attribute valueByName(String name) { + if (keyNames == null || keyValues == null) { + return null; + } + for (int i = 0; i < keyNames.size(); i++) { + if (name.equals(keyNames.get(i).getValue())) { + if (i >= keyValues.size()) { + return null; + } + org.ccsds.moims.mo.mal.structures.NullableAttribute na = keyValues.get(i); + return (na == null) ? null : na.getValue(); + } + } + return null; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/consumer/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/consumer/package-info.java new file mode 100644 index 00000000..1ead61ae --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/consumer/package-info.java @@ -0,0 +1,4 @@ +/** + * Package containing the consumer stubs for the Aggregation service. +*/ +package org.ccsds.moims.mo.mc.aggregation.consumer; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/package-info.java new file mode 100644 index 00000000..0988112a --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/package-info.java @@ -0,0 +1,45 @@ +/** + * The aggregation service allows the user to acquire several parameter values + * in a single request. + * Aggregations are generated either periodically, on an ad-hoc basis, or + * after a configurable timeout when being filtered. Periodic is where they + * are generated at a specific generation interval; in this case the periodicity + * is an aspect of the aggregation rather than the contained parameters. Ad-hoc + * is when the aggregation generation is triggered by some other deployment-specific + * mechanism. + * Filtering is where an aggregation is only generated when the change in + * the value of the filtered parameters exceeds a specified threshold or a + * timeout is passed. Filtering can be applied to both periodic and ad-hoc + * aggregations. + * As there may be a large amount of time between reports of an aggregation + * when filtering is applied, the filtering concept also has a maximum reporting + * interval. If a report of the aggregation has not passed the filter in the + * maximum reporting interval a report is generated regardless. This allows + * there to be regular reports of an aggregation sent regardless of filtering. + * It should be noted that applying a filter with a maximum reporting interval + * to an ad-hoc aggregation will cause the aggregation to generate reports + * in a periodic way if the maximum reporting interval is left to expire. + * This is expected behaviour. + * There are a number of intervals defined in the structures of the service, + * the diagram in Figure 3-12 illustrates the use of these: + * insert timing diagram + * The diagram shows a single report of an aggregation being generated which + * contains two parameter sets. Each set of parameter values in the aggregation + * report contains two optional durations, delta time and interval time. + *
                    + *
                  • The timestamp of the first value of the first set (T1) is defined + * as the timestamp of the aggregation report plus the delta time of the first + * set.
                  • + *
                  • The timestamp of the second value of the first set (T2) is defined + * as the timestamp of the first parameter (T1) plus the interval time of + * the set.
                  • + *
                  • The timestamp of the first value of the second set (T3) is defined + * as the timestamp of the last value of the previous set (T2) plus the delta + * time of the second set.
                  • + *
                  • The timestamp of the second value of the second set (T4) is defined + * as the timestamp of the first parameter (T3) plus the interval time of + * the set.
                  • + *
                  + * The COM archive is used to hold the definitions of the aggregations. +*/ +package org.ccsds.moims.mo.mc.aggregation; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/provider/AggregationHandler.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/provider/AggregationHandler.java new file mode 100644 index 00000000..be6b38dd --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/provider/AggregationHandler.java @@ -0,0 +1,156 @@ +package org.ccsds.moims.mo.mc.aggregation.provider; + +/** + * Interface that providers of the Aggregation service must implement to handle + * the operations of that service. + */ +public interface AggregationHandler { + + /** + * Implements the operation getValue. + * + * @param aggInstIds The aggInstIds field shall provide the list of AggregationIdentity object instance identifiers. +The wildcard value of '0' shall be supported and matches all aggregations of the provider. +The wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made. +If a requested aggregation is unknown then an UNKNOWN error shall be returned. +The filter shall not be applied for the getValue operation. +If an aggregation is being reported periodically, using the operation shall not reset the reportInterval or filteredTimeout timer. + * @param interaction The MAL object representing the interaction in the provider. + * @return The return value of the operation + * @throws org.ccsds.moims.mo.mal.UnknownException One or more of the requested aggregations is unknown. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + org.ccsds.moims.mo.mc.aggregation.structures.AggregationValueDetailsList getValue(org.ccsds.moims.mo.mal.structures.LongList aggInstIds, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mal.UnknownException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation enableGeneration. + * + * @param isGroupIds If the isGroupIds field is TRUE then the enableInstances field shall contain GroupIdentity object instance identifiers, otherwise the field contains AggregationIdentity object instance identifiers. +The AggregationIdentity objects referenced, either directly or indirectly via groups, by the enableInstances field shall be the AggregationIdentity objects to match. +The id of the enableInstances field shall support the wildcard value of '0' and matches all AggregationIdentity objects of the provider. +The service provider shall check for the wildcard value in the list of object instance identifiers in the enableInstances field first and if found no other checks of supplied object instance identifiers shall be made. +If the enableInstances field contains a value of TRUE then reports of matching AggregationIdentity objects shall be generated, a value of FALSE requests that reports will not be generated. +No error shall be raised if the enableInstances Boolean value supplied is the same as the current generationEnabled field of the definition for a matched AggregationIdentity object i.e. enabling an already enabled aggregation will not result in an error. +If a requested AggregationIdentity or GroupIdentity object is unknown then an UNKNOWN error shall be returned. +If a requested Group, or the Group objects referenced by that Group, does not contain AggregationIdentity objects then an INVALID error shall be returned. +If an error is raised then no modifications shall be made as a result of this operation call. +The provider shall create and store a new AggregationDefinition object in the COM archive if the generationEnabled field is changed. +If a new AggregationDefinition object is created then that new object shall be the current AggregationDefinition used for the specific AggregationIdentity. + * @param enableInstances If the generation of reports is being enabled, and the aggregation is defined as being periodic, then the provider shall generate a report immediately and start the report interval from that report. + * @param interaction The MAL object representing the interaction in the provider. + * @return The return value of the operation + * @throws org.ccsds.moims.mo.mal.UnknownException One or more of the requested aggregations or groups is unknown. + * @throws org.ccsds.moims.mo.com.InvalidException One of the supplied groups is either not a group of groups or a group of AggregationIdentity objects. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + org.ccsds.moims.mo.mal.structures.LongList enableGeneration(Boolean isGroupIds, + org.ccsds.moims.mo.com.structures.InstanceBooleanPairList enableInstances, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mal.UnknownException, org.ccsds.moims.mo.com.InvalidException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation enableFilter. + * + * @param isGroupIds If the isGroupIds field is TRUE then the enableInstances field shall contain GroupIdentity object instance identifiers, otherwise the field contains AggregationIdentity object instance identifiers. +The AggregationIdentity objects referenced, either directly or indirectly via groups, by the enableInstances field shall be the AggregationIdentity objects to match. +The id of the enableInstances field shall support the wildcard value of '0' and matches all AggregationIdentity objects of the provider. +The service provider shall check for the wildcard value in the list of object instance identifiers in the enableInstances field first and if found no other checks of supplied object instance identifiers shall be made. +If the enableInstances field contains a value of TRUE then reports of matching AggregationIdentity objects shall be filtered, a value of FALSE requests that reports will not be filtered. +No error shall be raised if the enableInstances Boolean value supplied is the same as the current filterEnabled field of the definition for a matched AggregationIdentity object i.e. filtering an already filtered aggregation will not result in an error. +If a requested AggregationIdentity or GroupIdentity object is unknown then an UNKNOWN error shall be returned. +If a requested Group, or the Group objects referenced by that Group, does not contain AggregationIdentity objects then an INVALID error shall be returned. +If an error is raised then no modifications shall be made as a result of this operation call. +The provider shall create and store a new AggregationDefinition object in the COM archive if the filterEnabled field is changed. +If a new AggregationDefinition object is created then that new object shall be the current AggregationDefinition used for the specific AggregationIdentity. + * @param enableInstances enableInstances Argument number 1 as defined by the service operation + * @param interaction The MAL object representing the interaction in the provider. + * @throws org.ccsds.moims.mo.com.InvalidException One of the supplied groups is either not a group of groups or a group of AggregationIdentity objects. + * @throws org.ccsds.moims.mo.mal.UnknownException One or more of the requested aggregations or groups is unknown. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + void enableFilter(Boolean isGroupIds, + org.ccsds.moims.mo.com.structures.InstanceBooleanPairList enableInstances, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.com.InvalidException, org.ccsds.moims.mo.mal.UnknownException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation listDefinition. + * + * @param aggNames The aggNames field shall contain a list of aggregation names to retrieve the AggregationIdentity and AggregationDefinition object instance identifiers for. +The aggNames field may contain the wildcard value of '*' to return all supported AggregationIdentity and AggregationDefinition objects. +The wildcard value should be checked for first, if found no other checks of supplied identifiers shall be made. +If a provided identifier does not include a wildcard and does not match an existing AggregationIdentity object then this operation shall fail with an UNKNOWN error. + * @param interaction The MAL object representing the interaction in the provider. + * @return The return value of the operation + * @throws org.ccsds.moims.mo.mal.UnknownException One of the supplied identifiers is unknown. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + org.ccsds.moims.mo.mc.structures.ObjectInstancePairList listDefinition(org.ccsds.moims.mo.mal.structures.IdentifierList aggNames, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mal.UnknownException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation addAggregation. + * + * @param aggDefDetails The aggDefDetails field shall hold the name and the AggregationDefinitionDetails to be added. +The name field must not be the wildcard '*', or empty (an INVALID error shall be returned in this case). +If the supplied reportInterval or sampleInterval values are not supported by the provider then an INVALID error shall be returned. +The supplied name must be unique among all AggregationIdentity objects for the domain of the provider otherwise a DUPLICATE error shall be raised. +If an error is raised then no new identities and definitions shall be added as a result of this operation call. +If the supplied name matches an existing, but removed, AggregationIdentity then that AggregationIdentity shall be reused otherwise a new AggregationIdentity shall be created. +The provider shall create a new AggregationDefinition object and store it, and any new AggregationIdentity objects, in the COM archive. + * @param interaction The MAL object representing the interaction in the provider. + * @return The return value of the operation + * @throws org.ccsds.moims.mo.com.DuplicateException One or more of the aggregation objects being added has supplied an aggregation name that is already in use in the domain. + * @throws org.ccsds.moims.mo.com.InvalidException One of the supplied aggregation objects contains an invalid name or a supplied interval is not supported by the provider. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + org.ccsds.moims.mo.mc.structures.ObjectInstancePairList addAggregation(org.ccsds.moims.mo.mc.aggregation.structures.AggregationCreationRequestList aggDefDetails, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.com.DuplicateException, org.ccsds.moims.mo.com.InvalidException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation updateDefinition. + * + * @param aggInstIds The aggInstIds field shall contain the object instance identifiers of the AggregationIdentity objects to be updated. +The supplied object instance identifiers shall match existing identity objects, an UNKNOWN error shall be raised if this is not the case. +If the aggInstIds list contains either NULL or '0' an INVALID error shall be raised. + * @param aggDefDetails The aggDefDetails field shall contain the replacement AggregationDefinitionDetails. +The two lists shall be ordered the same. +The number of entries in the two lists shall be the same size otherwise an INVALID error shall be returned. +If the supplied reportInterval or sampleInterval values are not supported by the provider then an INVALID error shall be returned. +If an error is raised then no definitions shall be updated as a result of this operation call. +The provider shall create a new AggregationDefinition object and store it in the COM archive. +The new AggregationDefinition object shall be the current AggregationDefinition used for the specific AggregationIdentity. + * @param interaction The MAL object representing the interaction in the provider. + * @return The return value of the operation + * @throws org.ccsds.moims.mo.mal.UnknownException One of the supplied AggregationIdentity object instance identifiers is unknown. + * @throws org.ccsds.moims.mo.com.InvalidException The supplied object instance identifiers list contains either a NULL or '0' or the two supplied lists are not the same length or a supplied interval is not supported by the provider. +If the two lists are not the same length then the extra information field shall contain the first index of the element in the largest list which does not have corresponding element in the other list. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + org.ccsds.moims.mo.mal.structures.LongList updateDefinition(org.ccsds.moims.mo.mal.structures.LongList aggInstIds, + org.ccsds.moims.mo.mc.aggregation.structures.AggregationDefinitionDetailsList aggDefDetails, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mal.UnknownException, org.ccsds.moims.mo.com.InvalidException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation removeAggregation. + * + * @param aggInstIds The aggInstIds field shall hold the object instance identifiers of the AggregationIdentity objects to be removed from the provider. +The list may contain the wildcard value of '0'. +The wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made. +If a provided AggregationIdentity object instance identifier does not include a wildcard and does not match an existing aggregation then this operation shall fail with an UNKNOWN error. +Matched AggregationIdentity and AggregationDefinition objects shall not be removed from the COM archive only the list of AggregationIdentity and AggregationDefinition objects in the provider. +If an error is raised then no aggregations shall be removed as a result of this operation call. +If the operation succeeds then the provider shall not publish aggregation values for the deleted AggregationIdentity objects anymore. + * @param interaction The MAL object representing the interaction in the provider. + * @throws org.ccsds.moims.mo.mal.UnknownException One of the supplied AggregationIdentity object instance identifiers is unknown. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + void removeAggregation(org.ccsds.moims.mo.mal.structures.LongList aggInstIds, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mal.UnknownException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Sets the skeleton to be used for creation of publishers. + * + * @param skeleton The skeleton to be used. + */ + void setSkeleton(org.ccsds.moims.mo.mc.aggregation.provider.AggregationSkeleton skeleton); +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/provider/AggregationInheritanceSkeleton.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/provider/AggregationInheritanceSkeleton.java new file mode 100644 index 00000000..6a7bce59 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/provider/AggregationInheritanceSkeleton.java @@ -0,0 +1,153 @@ +package org.ccsds.moims.mo.mc.aggregation.provider; + +/** + * Provider Inheritance skeleton for AggregationInheritanceSkeleton service. + */ +public abstract class AggregationInheritanceSkeleton implements org.ccsds.moims.mo.mal.provider.MALInteractionHandler, org.ccsds.moims.mo.mc.aggregation.provider.AggregationSkeleton, org.ccsds.moims.mo.mc.aggregation.provider.AggregationHandler { + + /** + * The providerSet field. + */ + private org.ccsds.moims.mo.mal.provider.MALProviderSet providerSet = new org.ccsds.moims.mo.mal.provider.MALProviderSet(org.ccsds.moims.mo.mc.aggregation.AggregationHelper.AGGREGATION_SERVICE); + + /** + * Returns the connection object for this provider. + * + * @return the connection object for this provider + * @throws java.io.IOException if the method was not implemented yet. + */ + public org.ccsds.moims.mo.mal.helpertools.connections.ConnectionProvider getConnection() throws java.io.IOException { + throw new java.io.IOException("This method needs to be overridden!"); + } + + @Override + public void setSkeleton(org.ccsds.moims.mo.mc.aggregation.provider.AggregationSkeleton skeleton) { + // Not used in the inheritance pattern (the skeleton is 'this'); + } + + @Override + public void malInitialize(org.ccsds.moims.mo.mal.provider.MALProvider provider) throws org.ccsds.moims.mo.mal.MALException { + providerSet.addProvider(provider); + } + + @Override + public void malFinalize(org.ccsds.moims.mo.mal.provider.MALProvider provider) throws org.ccsds.moims.mo.mal.MALException { + providerSet.removeProvider(provider); + } + + @Override + public org.ccsds.moims.mo.mc.aggregation.provider.MonitorValuePublisher createMonitorValuePublisher(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.Identifier networkZone, + org.ccsds.moims.mo.mal.structures.SessionType sessionType, + org.ccsds.moims.mo.mal.structures.Identifier sessionName, + org.ccsds.moims.mo.mal.structures.QoSLevel qos, + java.util.Map qosProps, + org.ccsds.moims.mo.mal.structures.UInteger priority) throws org.ccsds.moims.mo.mal.MALException { + return new org.ccsds.moims.mo.mc.aggregation.provider.MonitorValuePublisher(providerSet.createPublisherSet(org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo.MONITORVALUE_OP, domain, sessionType, sessionName, qos, qosProps, null)); + } + + @Override + public void handleSend(org.ccsds.moims.mo.mal.provider.MALInteraction interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + switch (opNumber) { + default: + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } + + @Override + public void handleSubmit(org.ccsds.moims.mo.mal.provider.MALSubmit interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + try { + switch (opNumber) { + case org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo._ENABLEFILTER_OP_NUMBER: + enableFilter((body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.Union(Boolean.FALSE)) == null) ? null : ((org.ccsds.moims.mo.mal.structures.Union) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.Union(Boolean.FALSE))).getBooleanValue(), + (org.ccsds.moims.mo.com.structures.InstanceBooleanPairList) body.getBodyElement(1, new org.ccsds.moims.mo.com.structures.InstanceBooleanPairList()), + interaction); + interaction.sendAcknowledgement(); + break; + case org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo._REMOVEAGGREGATION_OP_NUMBER: + removeAggregation((org.ccsds.moims.mo.mal.structures.LongList) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.LongList()), + interaction); + interaction.sendAcknowledgement(); + break; + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } catch (org.ccsds.moims.mo.mal.MOErrorException error) { + throw new org.ccsds.moims.mo.mal.MALInteractionException(error); + } + } + + @Override + public void handleRequest(org.ccsds.moims.mo.mal.provider.MALRequest interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + try { + switch (opNumber) { + case org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo._GETVALUE_OP_NUMBER: + interaction.sendResponse(getValue((org.ccsds.moims.mo.mal.structures.LongList) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.LongList()), + interaction)); + break; + case org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo._ENABLEGENERATION_OP_NUMBER: + interaction.sendResponse(enableGeneration((body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.Union(Boolean.FALSE)) == null) ? null : ((org.ccsds.moims.mo.mal.structures.Union) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.Union(Boolean.FALSE))).getBooleanValue(), + (org.ccsds.moims.mo.com.structures.InstanceBooleanPairList) body.getBodyElement(1, new org.ccsds.moims.mo.com.structures.InstanceBooleanPairList()), + interaction)); + break; + case org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo._LISTDEFINITION_OP_NUMBER: + interaction.sendResponse(listDefinition((org.ccsds.moims.mo.mal.structures.IdentifierList) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.IdentifierList()), + interaction)); + break; + case org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo._ADDAGGREGATION_OP_NUMBER: + interaction.sendResponse(addAggregation((org.ccsds.moims.mo.mc.aggregation.structures.AggregationCreationRequestList) body.getBodyElement(0, new org.ccsds.moims.mo.mc.aggregation.structures.AggregationCreationRequestList()), + interaction)); + break; + case org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo._UPDATEDEFINITION_OP_NUMBER: + interaction.sendResponse(updateDefinition((org.ccsds.moims.mo.mal.structures.LongList) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.LongList()), + (org.ccsds.moims.mo.mc.aggregation.structures.AggregationDefinitionDetailsList) body.getBodyElement(1, new org.ccsds.moims.mo.mc.aggregation.structures.AggregationDefinitionDetailsList()), + interaction)); + break; + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } catch (org.ccsds.moims.mo.mal.MOErrorException error) { + throw new org.ccsds.moims.mo.mal.MALInteractionException(error); + } + } + + @Override + public void handleInvoke(org.ccsds.moims.mo.mal.provider.MALInvoke interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + switch (opNumber) { + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } + + @Override + public void handleProgress(org.ccsds.moims.mo.mal.provider.MALProgress interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + switch (opNumber) { + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/provider/AggregationSkeleton.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/provider/AggregationSkeleton.java new file mode 100644 index 00000000..36098cb2 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/provider/AggregationSkeleton.java @@ -0,0 +1,29 @@ +package org.ccsds.moims.mo.mc.aggregation.provider; + +/** + * The skeleton interface for the Aggregation service. + */ +public interface AggregationSkeleton { + + /** + * Creates a publisher object using the current registered provider set for + * the PubSub operation monitorValue. + * + * @param domain The domain used for publishing + * @param networkZone ~The network zone used for publishing + * @param sessionType The session used for publishing + * @param sessionName The session name used for publishing + * @param qos The QoS used for publishing + * @param qosProps The QoS properties used for publishing + * @param priority The priority used for publishing + * @return The new publisher object. + * @throws org.ccsds.moims.mo.mal.MALException if a problem is detected during creation of the publisher + */ + org.ccsds.moims.mo.mc.aggregation.provider.MonitorValuePublisher createMonitorValuePublisher(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.Identifier networkZone, + org.ccsds.moims.mo.mal.structures.SessionType sessionType, + org.ccsds.moims.mo.mal.structures.Identifier sessionName, + org.ccsds.moims.mo.mal.structures.QoSLevel qos, + java.util.Map qosProps, + org.ccsds.moims.mo.mal.structures.UInteger priority) throws org.ccsds.moims.mo.mal.MALException; +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/provider/MonitorValuePublisher.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/provider/MonitorValuePublisher.java new file mode 100644 index 00000000..56c70b23 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/provider/MonitorValuePublisher.java @@ -0,0 +1,123 @@ +package org.ccsds.moims.mo.mc.aggregation.provider; + +/** + * Publisher class for the monitorValue operation. + */ +public final class MonitorValuePublisher { + + /** + * The publisherSet field. + */ + private org.ccsds.moims.mo.mal.provider.MALPublisherSet publisherSet; + + /** + * Creates an instance of this class using the supplied publisher set. + * + * @param publisherSet The set of broker connections to use when registering and publishing. + */ + public MonitorValuePublisher(org.ccsds.moims.mo.mal.provider.MALPublisherSet publisherSet) { + this.publisherSet = publisherSet; + } + + /** + * Registers this provider implementation to the set of broker connections. + * + * @param keyNames The key names to use in the method + * @param keyTypes The key types to use in the method + * @param listener The listener object to use for callback from the publisher + * @throws java.lang.IllegalArgumentException If any supplied argument is invalid + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void register(org.ccsds.moims.mo.mal.structures.IdentifierList keyNames, + org.ccsds.moims.mo.mal.structures.AttributeTypeList keyTypes, + org.ccsds.moims.mo.mal.provider.MALPublishInteractionListener listener) throws java.lang.IllegalArgumentException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + publisherSet.register(keyNames, keyTypes, listener); + } + + /** + * Registers this provider implementation to the set of broker connections + * with the default subscription keys. + * + * @param listener The listener object to use for callback from the publisher + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void registerWithDefaultKeys(org.ccsds.moims.mo.mal.provider.MALPublishInteractionListener listener) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + org.ccsds.moims.mo.mal.structures.IdentifierList keyNames = new org.ccsds.moims.mo.mal.structures.IdentifierList(); + org.ccsds.moims.mo.mal.structures.AttributeTypeList keyTypes = new org.ccsds.moims.mo.mal.structures.AttributeTypeList(); + publisherSet.register(keyNames, keyTypes, listener); + } + + /** + * Asynchronously registers this provider implementation to the set of broker + * connections. + * + * @param keyNames The key names to use in the method + * @param keyTypes The key types to use in the method + * @param listener The listener object to use for callback from the publisher + * @throws java.lang.IllegalArgumentException If any supplied argument is invalid + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void asyncRegister(org.ccsds.moims.mo.mal.structures.IdentifierList keyNames, + org.ccsds.moims.mo.mal.structures.AttributeTypeList keyTypes, + org.ccsds.moims.mo.mal.provider.MALPublishInteractionListener listener) throws java.lang.IllegalArgumentException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + publisherSet.asyncRegister(keyNames, keyTypes, listener); + } + + /** + * Publishes updates to the set of registered broker connections. + * + * @param updateHeader The headers of the updates being added + * @param objId The MAL EntityKey.firstSubKey shall contain the aggregation name. +The MAL EntityKey.secondSubKey shall contain the AggregationIdentity object instance identifier. +The MAL EntityKey.thirdSubKey shall contain the AggregationDefinition object instance identifier. +The MAL EntityKey.fourthSubKey shall contain the new AggregationValueInstance object instance identifier. +The timestamp of the AggregationValueInstance report shall be taken from the publish message. +The publish message shall include the ObjectId of the source link of the report. +If no source link is needed then the ObjectId shall be replaced with a NULL. + * @param newValue The second part of the publish message shall be the AggregationValue. + * @throws java.lang.IllegalArgumentException If any supplied argument is invalid + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void publish(org.ccsds.moims.mo.mal.structures.UpdateHeader updateHeader, + org.ccsds.moims.mo.com.structures.ObjectId objId, + org.ccsds.moims.mo.mc.aggregation.structures.AggregationValue newValue) throws java.lang.IllegalArgumentException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + publisherSet.publish(updateHeader, objId, newValue); + } + + /** + * Deregisters this provider implementation from the set of broker connections. + * + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void deregister() throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + publisherSet.deregister(); + } + + /** + * Asynchronously deregisters this provider implementation from the set of + * broker connections. + * + * @param listener The listener object to use for callback from the publisher + * @throws java.lang.IllegalArgumentException If any supplied argument is invalid + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void asyncDeregister(org.ccsds.moims.mo.mal.provider.MALPublishInteractionListener listener) throws java.lang.IllegalArgumentException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + publisherSet.asyncDeregister(listener); + } + + /** + * Closes this publisher. + * + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void close() throws org.ccsds.moims.mo.mal.MALException { + publisherSet.close(); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/provider/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/provider/package-info.java new file mode 100644 index 00000000..8285fad9 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/provider/package-info.java @@ -0,0 +1,4 @@ +/** + * Package containing the provider skeletons for the Aggregation service. +*/ +package org.ccsds.moims.mo.mc.aggregation.provider; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/AggregationCategory.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/AggregationCategory.java new file mode 100644 index 00000000..97fd79ba --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/AggregationCategory.java @@ -0,0 +1,118 @@ +package org.ccsds.moims.mo.mc.aggregation.structures; + +/** + * Enumeration class for AggregationCategory. + */ +public final class AggregationCategory extends org.ccsds.moims.mo.mal.structures.Enumeration { + + private static final long serialVersionUID = 1125925693423623L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125925693423623L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Enumeration value for GENERAL. + */ + public static final int GENERAL_VALUE = 1; + + /** + * Enumeration singleton for value GENERAL. + */ + public static final org.ccsds.moims.mo.mc.aggregation.structures.AggregationCategory GENERAL = new org.ccsds.moims.mo.mc.aggregation.structures.AggregationCategory(org.ccsds.moims.mo.mc.aggregation.structures.AggregationCategory.GENERAL_VALUE); + + /** + * Enumeration value for DIAGNOSTIC. + */ + public static final int DIAGNOSTIC_VALUE = 2; + + /** + * Enumeration singleton for value DIAGNOSTIC. + */ + public static final org.ccsds.moims.mo.mc.aggregation.structures.AggregationCategory DIAGNOSTIC = new org.ccsds.moims.mo.mc.aggregation.structures.AggregationCategory(org.ccsds.moims.mo.mc.aggregation.structures.AggregationCategory.DIAGNOSTIC_VALUE); + + /** + * Set of enumeration instances. + */ + private static final org.ccsds.moims.mo.mc.aggregation.structures.AggregationCategory[] _ENUMERATIONS = { + GENERAL, DIAGNOSTIC}; + + /** + * AggregationCategory is an enumeration definition holding the categories of aggregations. + */ + public AggregationCategory() { + super(-1); + } + + /** + * AggregationCategory is an enumeration definition holding the categories + * of aggregations. + * + * @param value The value of the Enumeration. + */ + public AggregationCategory(int value) { + super(value); + } + + @Override + public String toString() { + switch (getValue()) { + case GENERAL_VALUE: + return "GENERAL"; + case DIAGNOSTIC_VALUE: + return "DIAGNOSTIC"; + default: + throw new RuntimeException("Unknown ordinal!"); + } + } + + /** + * Returns the enumeration element represented by the supplied string, or + * null if not matched. + * + * @param s s The string to search for. + * @return The matched enumeration element, or null if not matched. + */ + public static org.ccsds.moims.mo.mc.aggregation.structures.AggregationCategory fromString(String s) { + switch (s) { + case "GENERAL": + return AggregationCategory.GENERAL; + case "DIAGNOSTIC": + return AggregationCategory.DIAGNOSTIC; + default: + throw new RuntimeException("Unknown Enumeration for the provided string: " + s); + } + } + + @Override + public org.ccsds.moims.mo.mal.structures.Enumeration fromValue(Integer value) { + switch (value) { + case GENERAL_VALUE: + return AggregationCategory.GENERAL; + case DIAGNOSTIC_VALUE: + return AggregationCategory.DIAGNOSTIC; + default: + throw new RuntimeException("Unknown Enumeration for the provided value: " + value); + } + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return _ENUMERATIONS[0]; + } + + @Override + public int getEnumSize() { + return 2; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/AggregationCategoryList.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/AggregationCategoryList.java new file mode 100644 index 00000000..eed2b730 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/AggregationCategoryList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mc.aggregation.structures; + +/** + * List class for AggregationCategory. + */ +public final class AggregationCategoryList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1125925710200825L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125925710200825L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for AggregationCategoryList. + * + */ + public AggregationCategoryList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public AggregationCategoryList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public AggregationCategoryList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mc.aggregation.structures.AggregationCategory element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mc.aggregation.structures.AggregationCategory element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new AggregationCategoryList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return org.ccsds.moims.mo.mc.aggregation.structures.AggregationCategory.GENERAL; + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/AggregationCreationRequest.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/AggregationCreationRequest.java new file mode 100644 index 00000000..07ee0f2f --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/AggregationCreationRequest.java @@ -0,0 +1,140 @@ +package org.ccsds.moims.mo.mc.aggregation.structures; + +/** + * The AggregationCreationRequest contains all the fields required when creating + * a new aggregation in a provider. + */ +public final class AggregationCreationRequest implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1125925693423626L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125925693423626L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * The name of the aggregation. Must not be empty or the wildcard value. + */ + private org.ccsds.moims.mo.mal.structures.Identifier name; + + /** + * The aggregation definition details. + */ + private org.ccsds.moims.mo.mc.aggregation.structures.AggregationDefinitionDetails aggDefDetails; + + /** + * Default constructor for AggregationCreationRequest. + * + */ + public AggregationCreationRequest() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param name The name of the aggregation. Must not be empty or the wildcard value. + * @param aggDefDetails The aggregation definition details. + */ + public AggregationCreationRequest(org.ccsds.moims.mo.mal.structures.Identifier name, + org.ccsds.moims.mo.mc.aggregation.structures.AggregationDefinitionDetails aggDefDetails) { + this.name = name; + this.aggDefDetails = aggDefDetails; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mc.aggregation.structures.AggregationCreationRequest(); + } + + /** + * Returns the field name. + * + * @return The field name + */ + public org.ccsds.moims.mo.mal.structures.Identifier getName() { + return name; + } + + /** + * Returns the field aggDefDetails. + * + * @return The field aggDefDetails + */ + public org.ccsds.moims.mo.mc.aggregation.structures.AggregationDefinitionDetails getAggDefDetails() { + return aggDefDetails; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof AggregationCreationRequest) { + AggregationCreationRequest other = (AggregationCreationRequest) obj; + if (name == null) { + if (other.name != null) { + return false; + } + } else { + if (! name.equals(other.name)) { + return false; + } + } + if (aggDefDetails == null) { + if (other.aggDefDetails != null) { + return false; + } + } else { + if (! aggDefDetails.equals(other.aggDefDetails)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (name != null ? name.hashCode() : 0); + hash = 83 * hash + (aggDefDetails != null ? aggDefDetails.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(AggregationCreationRequest: "); + buf.append("name=").append(name); + buf.append(", aggDefDetails=").append(aggDefDetails); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (name == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'name' cannot be null!"); + } + if (aggDefDetails == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'aggDefDetails' cannot be null!"); + } + encoder.encodeIdentifier(name); + encoder.encodeElement(aggDefDetails); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + name = decoder.decodeIdentifier(); + aggDefDetails = (org.ccsds.moims.mo.mc.aggregation.structures.AggregationDefinitionDetails) decoder.decodeElement(new org.ccsds.moims.mo.mc.aggregation.structures.AggregationDefinitionDetails()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/AggregationCreationRequestList.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/AggregationCreationRequestList.java new file mode 100644 index 00000000..b836e061 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/AggregationCreationRequestList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mc.aggregation.structures; + +/** + * List class for AggregationCreationRequest. + */ +public final class AggregationCreationRequestList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1125925710200822L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125925710200822L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for AggregationCreationRequestList. + * + */ + public AggregationCreationRequestList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public AggregationCreationRequestList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public AggregationCreationRequestList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mc.aggregation.structures.AggregationCreationRequest element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mc.aggregation.structures.AggregationCreationRequest element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new AggregationCreationRequestList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mc.aggregation.structures.AggregationCreationRequest(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/AggregationDefinitionDetails.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/AggregationDefinitionDetails.java new file mode 100644 index 00000000..94d9a5c0 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/AggregationDefinitionDetails.java @@ -0,0 +1,378 @@ +package org.ccsds.moims.mo.mc.aggregation.structures; + +/** + * The AggregationDefinitionDetails structure holds definition details of + * an aggregation. + */ +public final class AggregationDefinitionDetails implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1125925693423617L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125925693423617L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * The description of the parameter. May be empty. + */ + private String description; + + /** + * Category of the aggregation. Value taken from AggregationCategory enumeration, + * although the use of a UOctet allows deployment specific extension. Extensions + * must use values greater than 127. + */ + private org.ccsds.moims.mo.mal.structures.UOctet category; + + /** + * The interval between periodic reports on this aggregation. If this aggregation + * is not periodic, this field must be "0". + */ + private org.ccsds.moims.mo.mal.structures.Duration reportInterval; + + /** + * If TRUE reports will include all values regardless of whether changed, + * if FALSE values unchanged from previous report are replaced with a NULL. + */ + private Boolean sendUnchanged; + + /** + * If TRUE reports will include the ParameterDefinition object instance identifier + * in the AggregationParameterValue, if FALSE it will be set to NULL. + */ + private Boolean sendDefinitions; + + /** + * Controls whether reports for this aggregation are to be filtered. + */ + private Boolean filterEnabled; + + /** + * The maximum duration between filtered reports. If this value is exceeded, + * then a report is sent regardless of filtered thresholds. Ignored if not + * filtered. + */ + private org.ccsds.moims.mo.mal.structures.Duration filteredTimeout; + + /** + * Controls whether reports for this aggregation are to be generated. + */ + private Boolean generationEnabled; + + /** + * List containing the parameter sets which define the aggregation. + */ + private org.ccsds.moims.mo.mc.aggregation.structures.AggregationParameterSetList parameterSets; + + /** + * Default constructor for AggregationDefinitionDetails. + * + */ + public AggregationDefinitionDetails() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param description The description of the parameter. May be empty. + * @param category Category of the aggregation. Value taken from AggregationCategory enumeration, although the use of a UOctet allows deployment specific extension. Extensions must use values greater than 127. + * @param reportInterval The interval between periodic reports on this aggregation. If this aggregation is not periodic, this field must be '0'. + * @param sendUnchanged If TRUE reports will include all values regardless of whether changed, if FALSE values unchanged from previous report are replaced with a NULL. + * @param sendDefinitions If TRUE reports will include the ParameterDefinition object instance identifier in the AggregationParameterValue, if FALSE it will be set to NULL. + * @param filterEnabled Controls whether reports for this aggregation are to be filtered. + * @param filteredTimeout The maximum duration between filtered reports. If this value is exceeded, then a report is sent regardless of filtered thresholds. Ignored if not filtered. + * @param generationEnabled Controls whether reports for this aggregation are to be generated. + * @param parameterSets List containing the parameter sets which define the aggregation. + */ + public AggregationDefinitionDetails(String description, + org.ccsds.moims.mo.mal.structures.UOctet category, + org.ccsds.moims.mo.mal.structures.Duration reportInterval, + Boolean sendUnchanged, + Boolean sendDefinitions, + Boolean filterEnabled, + org.ccsds.moims.mo.mal.structures.Duration filteredTimeout, + Boolean generationEnabled, + org.ccsds.moims.mo.mc.aggregation.structures.AggregationParameterSetList parameterSets) { + this.description = description; + this.category = category; + this.reportInterval = reportInterval; + this.sendUnchanged = sendUnchanged; + this.sendDefinitions = sendDefinitions; + this.filterEnabled = filterEnabled; + this.filteredTimeout = filteredTimeout; + this.generationEnabled = generationEnabled; + this.parameterSets = parameterSets; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mc.aggregation.structures.AggregationDefinitionDetails(); + } + + /** + * Returns the field description. + * + * @return The field description + */ + public String getDescription() { + return description; + } + + /** + * Returns the field category. + * + * @return The field category + */ + public org.ccsds.moims.mo.mal.structures.UOctet getCategory() { + return category; + } + + /** + * Returns the field reportInterval. + * + * @return The field reportInterval + */ + public org.ccsds.moims.mo.mal.structures.Duration getReportInterval() { + return reportInterval; + } + + /** + * Returns the field sendUnchanged. + * + * @return The field sendUnchanged + */ + public Boolean getSendUnchanged() { + return sendUnchanged; + } + + /** + * Returns the field sendDefinitions. + * + * @return The field sendDefinitions + */ + public Boolean getSendDefinitions() { + return sendDefinitions; + } + + /** + * Returns the field filterEnabled. + * + * @return The field filterEnabled + */ + public Boolean getFilterEnabled() { + return filterEnabled; + } + + /** + * Returns the field filteredTimeout. + * + * @return The field filteredTimeout + */ + public org.ccsds.moims.mo.mal.structures.Duration getFilteredTimeout() { + return filteredTimeout; + } + + /** + * Returns the field generationEnabled. + * + * @return The field generationEnabled + */ + public Boolean getGenerationEnabled() { + return generationEnabled; + } + + /** + * Returns the field parameterSets. + * + * @return The field parameterSets + */ + public org.ccsds.moims.mo.mc.aggregation.structures.AggregationParameterSetList getParameterSets() { + return parameterSets; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof AggregationDefinitionDetails) { + AggregationDefinitionDetails other = (AggregationDefinitionDetails) obj; + if (description == null) { + if (other.description != null) { + return false; + } + } else { + if (! description.equals(other.description)) { + return false; + } + } + if (category == null) { + if (other.category != null) { + return false; + } + } else { + if (! category.equals(other.category)) { + return false; + } + } + if (reportInterval == null) { + if (other.reportInterval != null) { + return false; + } + } else { + if (! reportInterval.equals(other.reportInterval)) { + return false; + } + } + if (sendUnchanged == null) { + if (other.sendUnchanged != null) { + return false; + } + } else { + if (! sendUnchanged.equals(other.sendUnchanged)) { + return false; + } + } + if (sendDefinitions == null) { + if (other.sendDefinitions != null) { + return false; + } + } else { + if (! sendDefinitions.equals(other.sendDefinitions)) { + return false; + } + } + if (filterEnabled == null) { + if (other.filterEnabled != null) { + return false; + } + } else { + if (! filterEnabled.equals(other.filterEnabled)) { + return false; + } + } + if (filteredTimeout == null) { + if (other.filteredTimeout != null) { + return false; + } + } else { + if (! filteredTimeout.equals(other.filteredTimeout)) { + return false; + } + } + if (generationEnabled == null) { + if (other.generationEnabled != null) { + return false; + } + } else { + if (! generationEnabled.equals(other.generationEnabled)) { + return false; + } + } + if (parameterSets == null) { + if (other.parameterSets != null) { + return false; + } + } else { + if (! parameterSets.equals(other.parameterSets)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (description != null ? description.hashCode() : 0); + hash = 83 * hash + (category != null ? category.hashCode() : 0); + hash = 83 * hash + (reportInterval != null ? reportInterval.hashCode() : 0); + hash = 83 * hash + (sendUnchanged != null ? sendUnchanged.hashCode() : 0); + hash = 83 * hash + (sendDefinitions != null ? sendDefinitions.hashCode() : 0); + hash = 83 * hash + (filterEnabled != null ? filterEnabled.hashCode() : 0); + hash = 83 * hash + (filteredTimeout != null ? filteredTimeout.hashCode() : 0); + hash = 83 * hash + (generationEnabled != null ? generationEnabled.hashCode() : 0); + hash = 83 * hash + (parameterSets != null ? parameterSets.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(AggregationDefinitionDetails: "); + buf.append("description=").append(description); + buf.append(", category=").append(category); + buf.append(", reportInterval=").append(reportInterval); + buf.append(", sendUnchanged=").append(sendUnchanged); + buf.append(", sendDefinitions=").append(sendDefinitions); + buf.append(", filterEnabled=").append(filterEnabled); + buf.append(", filteredTimeout=").append(filteredTimeout); + buf.append(", generationEnabled=").append(generationEnabled); + buf.append(", parameterSets=").append(parameterSets); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (description == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'description' cannot be null!"); + } + if (category == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'category' cannot be null!"); + } + if (reportInterval == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'reportInterval' cannot be null!"); + } + if (sendUnchanged == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'sendUnchanged' cannot be null!"); + } + if (sendDefinitions == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'sendDefinitions' cannot be null!"); + } + if (filterEnabled == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'filterEnabled' cannot be null!"); + } + if (filteredTimeout == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'filteredTimeout' cannot be null!"); + } + if (generationEnabled == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'generationEnabled' cannot be null!"); + } + if (parameterSets == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'parameterSets' cannot be null!"); + } + encoder.encodeString(description); + encoder.encodeUOctet(category); + encoder.encodeDuration(reportInterval); + encoder.encodeBoolean(sendUnchanged); + encoder.encodeBoolean(sendDefinitions); + encoder.encodeBoolean(filterEnabled); + encoder.encodeDuration(filteredTimeout); + encoder.encodeBoolean(generationEnabled); + encoder.encodeElement(parameterSets); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + description = decoder.decodeString(); + category = decoder.decodeUOctet(); + reportInterval = decoder.decodeDuration(); + sendUnchanged = decoder.decodeBoolean(); + sendDefinitions = decoder.decodeBoolean(); + filterEnabled = decoder.decodeBoolean(); + filteredTimeout = decoder.decodeDuration(); + generationEnabled = decoder.decodeBoolean(); + parameterSets = (org.ccsds.moims.mo.mc.aggregation.structures.AggregationParameterSetList) decoder.decodeElement(new org.ccsds.moims.mo.mc.aggregation.structures.AggregationParameterSetList()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/AggregationDefinitionDetailsList.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/AggregationDefinitionDetailsList.java new file mode 100644 index 00000000..185edffc --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/AggregationDefinitionDetailsList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mc.aggregation.structures; + +/** + * List class for AggregationDefinitionDetails. + */ +public final class AggregationDefinitionDetailsList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1125925710200831L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125925710200831L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for AggregationDefinitionDetailsList. + * + */ + public AggregationDefinitionDetailsList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public AggregationDefinitionDetailsList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public AggregationDefinitionDetailsList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mc.aggregation.structures.AggregationDefinitionDetails element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mc.aggregation.structures.AggregationDefinitionDetails element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new AggregationDefinitionDetailsList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mc.aggregation.structures.AggregationDefinitionDetails(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/AggregationParameterSet.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/AggregationParameterSet.java new file mode 100644 index 00000000..25493b72 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/AggregationParameterSet.java @@ -0,0 +1,220 @@ +package org.ccsds.moims.mo.mc.aggregation.structures; + +/** + * The AggregationParameterSet structure holds the identifier and optional + * filter for a parameter, or set of parameters, in an aggregation. + */ +public final class AggregationParameterSet implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1125925693423618L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125925693423618L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * The domain of the parameters being referenced in this set of parameters, + * NULL if the same domain as the aggregation. + */ + private org.ccsds.moims.mo.mal.structures.IdentifierList domain; + + /** + * The list of object instance identifiers of the ParameterIdentity objects + * being included in the aggregation. + */ + private org.ccsds.moims.mo.mal.structures.LongList parameters; + + /** + * The interval between samples of the parameters in the set. If "0" + * then just a single sample of the parameters is required per aggregation + * report. + */ + private org.ccsds.moims.mo.mal.structures.Duration sampleInterval; + + /** + * If the AggregationParameterSet contains a single parameter then this field + * contains the filter to apply for filtered reports when filters are applied. + * NULL if no filter required or this set contains more than one parameter. + */ + private org.ccsds.moims.mo.mc.aggregation.structures.ThresholdFilter reportFilter; + + /** + * Default constructor for AggregationParameterSet. + * + */ + public AggregationParameterSet() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param domain The domain of the parameters being referenced in this set of parameters, NULL if the same domain as the aggregation. + * @param parameters The list of object instance identifiers of the ParameterIdentity objects being included in the aggregation. + * @param sampleInterval The interval between samples of the parameters in the set. If '0' then just a single sample of the parameters is required per aggregation report. + * @param reportFilter If the AggregationParameterSet contains a single parameter then this field contains the filter to apply for filtered reports when filters are applied. NULL if no filter required or this set contains more than one parameter. + */ + public AggregationParameterSet(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.LongList parameters, + org.ccsds.moims.mo.mal.structures.Duration sampleInterval, + org.ccsds.moims.mo.mc.aggregation.structures.ThresholdFilter reportFilter) { + this.domain = domain; + this.parameters = parameters; + this.sampleInterval = sampleInterval; + this.reportFilter = reportFilter; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param parameters The list of object instance identifiers of the ParameterIdentity objects being included in the aggregation. + * @param sampleInterval The interval between samples of the parameters in the set. If '0' then just a single sample of the parameters is required per aggregation report. + */ + public AggregationParameterSet(org.ccsds.moims.mo.mal.structures.LongList parameters, + org.ccsds.moims.mo.mal.structures.Duration sampleInterval) { + this.domain = null; + this.parameters = parameters; + this.sampleInterval = sampleInterval; + this.reportFilter = null; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mc.aggregation.structures.AggregationParameterSet(); + } + + /** + * Returns the field domain. + * + * @return The field domain + */ + public org.ccsds.moims.mo.mal.structures.IdentifierList getDomain() { + return domain; + } + + /** + * Returns the field parameters. + * + * @return The field parameters + */ + public org.ccsds.moims.mo.mal.structures.LongList getParameters() { + return parameters; + } + + /** + * Returns the field sampleInterval. + * + * @return The field sampleInterval + */ + public org.ccsds.moims.mo.mal.structures.Duration getSampleInterval() { + return sampleInterval; + } + + /** + * Returns the field reportFilter. + * + * @return The field reportFilter + */ + public org.ccsds.moims.mo.mc.aggregation.structures.ThresholdFilter getReportFilter() { + return reportFilter; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof AggregationParameterSet) { + AggregationParameterSet other = (AggregationParameterSet) obj; + if (domain == null) { + if (other.domain != null) { + return false; + } + } else { + if (! domain.equals(other.domain)) { + return false; + } + } + if (parameters == null) { + if (other.parameters != null) { + return false; + } + } else { + if (! parameters.equals(other.parameters)) { + return false; + } + } + if (sampleInterval == null) { + if (other.sampleInterval != null) { + return false; + } + } else { + if (! sampleInterval.equals(other.sampleInterval)) { + return false; + } + } + if (reportFilter == null) { + if (other.reportFilter != null) { + return false; + } + } else { + if (! reportFilter.equals(other.reportFilter)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (domain != null ? domain.hashCode() : 0); + hash = 83 * hash + (parameters != null ? parameters.hashCode() : 0); + hash = 83 * hash + (sampleInterval != null ? sampleInterval.hashCode() : 0); + hash = 83 * hash + (reportFilter != null ? reportFilter.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(AggregationParameterSet: "); + buf.append("domain=").append(domain); + buf.append(", parameters=").append(parameters); + buf.append(", sampleInterval=").append(sampleInterval); + buf.append(", reportFilter=").append(reportFilter); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (parameters == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'parameters' cannot be null!"); + } + if (sampleInterval == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'sampleInterval' cannot be null!"); + } + encoder.encodeNullableElement(domain); + encoder.encodeElement(parameters); + encoder.encodeDuration(sampleInterval); + encoder.encodeNullableElement(reportFilter); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + domain = (org.ccsds.moims.mo.mal.structures.IdentifierList) decoder.decodeNullableElement(new org.ccsds.moims.mo.mal.structures.IdentifierList()); + parameters = (org.ccsds.moims.mo.mal.structures.LongList) decoder.decodeElement(new org.ccsds.moims.mo.mal.structures.LongList()); + sampleInterval = decoder.decodeDuration(); + reportFilter = (org.ccsds.moims.mo.mc.aggregation.structures.ThresholdFilter) decoder.decodeNullableElement(new org.ccsds.moims.mo.mc.aggregation.structures.ThresholdFilter()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/AggregationParameterSetList.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/AggregationParameterSetList.java new file mode 100644 index 00000000..ce1b13c3 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/AggregationParameterSetList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mc.aggregation.structures; + +/** + * List class for AggregationParameterSet. + */ +public final class AggregationParameterSetList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1125925710200830L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125925710200830L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for AggregationParameterSetList. + * + */ + public AggregationParameterSetList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public AggregationParameterSetList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public AggregationParameterSetList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mc.aggregation.structures.AggregationParameterSet element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mc.aggregation.structures.AggregationParameterSet element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new AggregationParameterSetList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mc.aggregation.structures.AggregationParameterSet(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/AggregationParameterValue.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/AggregationParameterValue.java new file mode 100644 index 00000000..f1c3f09d --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/AggregationParameterValue.java @@ -0,0 +1,148 @@ +package org.ccsds.moims.mo.mc.aggregation.structures; + +/** + * The structure holds a single parameter value with its definition instance + * identifier. + */ +public final class AggregationParameterValue implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1125925693423621L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125925693423621L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * The parameter value. + */ + private org.ccsds.moims.mo.mc.parameter.structures.ParameterValue value; + + /** + * The object instance identifier of the ParameterDefinition. NULL if sendDefinitions + * in the AggregationDefinitionDetails is FALSE. + */ + private Long paramDefInstId; + + /** + * Default constructor for AggregationParameterValue. + * + */ + public AggregationParameterValue() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param value The parameter value. + * @param paramDefInstId The object instance identifier of the ParameterDefinition. NULL if sendDefinitions in the AggregationDefinitionDetails is FALSE. + */ + public AggregationParameterValue(org.ccsds.moims.mo.mc.parameter.structures.ParameterValue value, + Long paramDefInstId) { + this.value = value; + this.paramDefInstId = paramDefInstId; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param value The parameter value. + */ + public AggregationParameterValue(org.ccsds.moims.mo.mc.parameter.structures.ParameterValue value) { + this.value = value; + this.paramDefInstId = null; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mc.aggregation.structures.AggregationParameterValue(); + } + + /** + * Returns the field value. + * + * @return The field value + */ + public org.ccsds.moims.mo.mc.parameter.structures.ParameterValue getValue() { + return value; + } + + /** + * Returns the field paramDefInstId. + * + * @return The field paramDefInstId + */ + public Long getParamDefInstId() { + return paramDefInstId; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof AggregationParameterValue) { + AggregationParameterValue other = (AggregationParameterValue) obj; + if (value == null) { + if (other.value != null) { + return false; + } + } else { + if (! value.equals(other.value)) { + return false; + } + } + if (paramDefInstId == null) { + if (other.paramDefInstId != null) { + return false; + } + } else { + if (! paramDefInstId.equals(other.paramDefInstId)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (value != null ? value.hashCode() : 0); + hash = 83 * hash + (paramDefInstId != null ? paramDefInstId.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(AggregationParameterValue: "); + buf.append("value=").append(value); + buf.append(", paramDefInstId=").append(paramDefInstId); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (value == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'value' cannot be null!"); + } + encoder.encodeElement(value); + encoder.encodeNullableLong(paramDefInstId); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + value = (org.ccsds.moims.mo.mc.parameter.structures.ParameterValue) decoder.decodeElement(new org.ccsds.moims.mo.mc.parameter.structures.ParameterValue()); + paramDefInstId = decoder.decodeNullableLong(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/AggregationParameterValueList.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/AggregationParameterValueList.java new file mode 100644 index 00000000..c9bf19f4 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/AggregationParameterValueList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mc.aggregation.structures; + +/** + * List class for AggregationParameterValue. + */ +public final class AggregationParameterValueList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1125925710200827L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125925710200827L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for AggregationParameterValueList. + * + */ + public AggregationParameterValueList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public AggregationParameterValueList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public AggregationParameterValueList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mc.aggregation.structures.AggregationParameterValue element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mc.aggregation.structures.AggregationParameterValue element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new AggregationParameterValueList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mc.aggregation.structures.AggregationParameterValue(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/AggregationSetValue.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/AggregationSetValue.java new file mode 100644 index 00000000..49c2c2dd --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/AggregationSetValue.java @@ -0,0 +1,191 @@ +package org.ccsds.moims.mo.mc.aggregation.structures; + +/** + * The AggregationSetValue structure holds the values for one set of parameter + * values. If the definition sendUnchanged field is set to FALSE parameter + * values that are unchanged since the previous report are replaced by a NULL + * in this list. The parameter values must be held in the same order as that + * defined in the matching AggregationDefinitionDetails. + */ +public final class AggregationSetValue implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1125925693423620L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125925693423620L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Optional delta time, from the timestamp of the aggregation for the first + * parameter set of the aggregation or the last value of the previous parameter + * set otherwise, for the first parameter sample of this set. If NULL, then + * the first sample time is the same as the aggregation timestamp for the + * first parameter set of the aggregation or the last value of the previous + * parameter set otherwise. + */ + private org.ccsds.moims.mo.mal.structures.Duration deltaTime; + + /** + * Optional delta time between samples in this set. If NULL, then all samples + * in this set are given the same time. This is usually driven by the sampleInterval + * in the aggregation set definition. + */ + private org.ccsds.moims.mo.mal.structures.Duration intervalTime; + + /** + * List containing values of the parameters which are part of the aggregation. + * The ordering of the list entries shall match that of the definition of + * the aggregation. If there are more values than contained in the definition + * then it is assumed that the parameters cycle as a complete parameter set. + */ + private org.ccsds.moims.mo.mc.aggregation.structures.AggregationParameterValueList values; + + /** + * Default constructor for AggregationSetValue. + * + */ + public AggregationSetValue() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param deltaTime Optional delta time, from the timestamp of the aggregation for the first parameter set of the aggregation or the last value of the previous parameter set otherwise, for the first parameter sample of this set. If NULL, then the first sample time is the same as the aggregation timestamp for the first parameter set of the aggregation or the last value of the previous parameter set otherwise. + * @param intervalTime Optional delta time between samples in this set. If NULL, then all samples in this set are given the same time. This is usually driven by the sampleInterval in the aggregation set definition. + * @param values List containing values of the parameters which are part of the aggregation. The ordering of the list entries shall match that of the definition of the aggregation. If there are more values than contained in the definition then it is assumed that the parameters cycle as a complete parameter set. + */ + public AggregationSetValue(org.ccsds.moims.mo.mal.structures.Duration deltaTime, + org.ccsds.moims.mo.mal.structures.Duration intervalTime, + org.ccsds.moims.mo.mc.aggregation.structures.AggregationParameterValueList values) { + this.deltaTime = deltaTime; + this.intervalTime = intervalTime; + this.values = values; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param values List containing values of the parameters which are part of the aggregation. The ordering of the list entries shall match that of the definition of the aggregation. If there are more values than contained in the definition then it is assumed that the parameters cycle as a complete parameter set. + */ + public AggregationSetValue(org.ccsds.moims.mo.mc.aggregation.structures.AggregationParameterValueList values) { + this.deltaTime = null; + this.intervalTime = null; + this.values = values; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mc.aggregation.structures.AggregationSetValue(); + } + + /** + * Returns the field deltaTime. + * + * @return The field deltaTime + */ + public org.ccsds.moims.mo.mal.structures.Duration getDeltaTime() { + return deltaTime; + } + + /** + * Returns the field intervalTime. + * + * @return The field intervalTime + */ + public org.ccsds.moims.mo.mal.structures.Duration getIntervalTime() { + return intervalTime; + } + + /** + * Returns the field values. + * + * @return The field values + */ + public org.ccsds.moims.mo.mc.aggregation.structures.AggregationParameterValueList getValues() { + return values; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof AggregationSetValue) { + AggregationSetValue other = (AggregationSetValue) obj; + if (deltaTime == null) { + if (other.deltaTime != null) { + return false; + } + } else { + if (! deltaTime.equals(other.deltaTime)) { + return false; + } + } + if (intervalTime == null) { + if (other.intervalTime != null) { + return false; + } + } else { + if (! intervalTime.equals(other.intervalTime)) { + return false; + } + } + if (values == null) { + if (other.values != null) { + return false; + } + } else { + if (! values.equals(other.values)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (deltaTime != null ? deltaTime.hashCode() : 0); + hash = 83 * hash + (intervalTime != null ? intervalTime.hashCode() : 0); + hash = 83 * hash + (values != null ? values.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(AggregationSetValue: "); + buf.append("deltaTime=").append(deltaTime); + buf.append(", intervalTime=").append(intervalTime); + buf.append(", values=").append(values); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (values == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'values' cannot be null!"); + } + encoder.encodeNullableDuration(deltaTime); + encoder.encodeNullableDuration(intervalTime); + encoder.encodeElement(values); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + deltaTime = decoder.decodeNullableDuration(); + intervalTime = decoder.decodeNullableDuration(); + values = (org.ccsds.moims.mo.mc.aggregation.structures.AggregationParameterValueList) decoder.decodeElement(new org.ccsds.moims.mo.mc.aggregation.structures.AggregationParameterValueList()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/AggregationSetValueList.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/AggregationSetValueList.java new file mode 100644 index 00000000..3abf63a0 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/AggregationSetValueList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mc.aggregation.structures; + +/** + * List class for AggregationSetValue. + */ +public final class AggregationSetValueList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1125925710200828L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125925710200828L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for AggregationSetValueList. + * + */ + public AggregationSetValueList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public AggregationSetValueList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public AggregationSetValueList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mc.aggregation.structures.AggregationSetValue element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mc.aggregation.structures.AggregationSetValue element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new AggregationSetValueList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mc.aggregation.structures.AggregationSetValue(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/AggregationValue.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/AggregationValue.java new file mode 100644 index 00000000..a795e5ef --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/AggregationValue.java @@ -0,0 +1,177 @@ +package org.ccsds.moims.mo.mc.aggregation.structures; + +/** + * The AggregationValue structure holds the values for one or more sets of + * parameter values. The value sets must be held in the same order as that + * defined in the matching AggregationDefinitionDetails. + */ +public final class AggregationValue implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1125925693423619L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125925693423619L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Reason for the aggregation being generated. + */ + private org.ccsds.moims.mo.mc.aggregation.structures.GenerationMode generationMode; + + /** + * If a filter is enabled when the aggregation value is generated then this + * value shall be set to TRUE, else FALSE. + */ + private Boolean filtered; + + /** + * The parameterSetValues list holds the sets of values of the aggregation. + * The sets must be held in the same order as that defined in the aggregation + * definition. + */ + private org.ccsds.moims.mo.mc.aggregation.structures.AggregationSetValueList parameterSetValues; + + /** + * Default constructor for AggregationValue. + * + */ + public AggregationValue() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param generationMode Reason for the aggregation being generated. + * @param filtered If a filter is enabled when the aggregation value is generated then this value shall be set to TRUE, else FALSE. + * @param parameterSetValues The parameterSetValues list holds the sets of values of the aggregation. The sets must be held in the same order as that defined in the aggregation definition. + */ + public AggregationValue(org.ccsds.moims.mo.mc.aggregation.structures.GenerationMode generationMode, + Boolean filtered, + org.ccsds.moims.mo.mc.aggregation.structures.AggregationSetValueList parameterSetValues) { + this.generationMode = generationMode; + this.filtered = filtered; + this.parameterSetValues = parameterSetValues; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mc.aggregation.structures.AggregationValue(); + } + + /** + * Returns the field generationMode. + * + * @return The field generationMode + */ + public org.ccsds.moims.mo.mc.aggregation.structures.GenerationMode getGenerationMode() { + return generationMode; + } + + /** + * Returns the field filtered. + * + * @return The field filtered + */ + public Boolean getFiltered() { + return filtered; + } + + /** + * Returns the field parameterSetValues. + * + * @return The field parameterSetValues + */ + public org.ccsds.moims.mo.mc.aggregation.structures.AggregationSetValueList getParameterSetValues() { + return parameterSetValues; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof AggregationValue) { + AggregationValue other = (AggregationValue) obj; + if (generationMode == null) { + if (other.generationMode != null) { + return false; + } + } else { + if (! generationMode.equals(other.generationMode)) { + return false; + } + } + if (filtered == null) { + if (other.filtered != null) { + return false; + } + } else { + if (! filtered.equals(other.filtered)) { + return false; + } + } + if (parameterSetValues == null) { + if (other.parameterSetValues != null) { + return false; + } + } else { + if (! parameterSetValues.equals(other.parameterSetValues)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (generationMode != null ? generationMode.hashCode() : 0); + hash = 83 * hash + (filtered != null ? filtered.hashCode() : 0); + hash = 83 * hash + (parameterSetValues != null ? parameterSetValues.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(AggregationValue: "); + buf.append("generationMode=").append(generationMode); + buf.append(", filtered=").append(filtered); + buf.append(", parameterSetValues=").append(parameterSetValues); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (generationMode == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'generationMode' cannot be null!"); + } + if (filtered == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'filtered' cannot be null!"); + } + if (parameterSetValues == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'parameterSetValues' cannot be null!"); + } + encoder.encodeElement(generationMode); + encoder.encodeBoolean(filtered); + encoder.encodeElement(parameterSetValues); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + generationMode = (org.ccsds.moims.mo.mc.aggregation.structures.GenerationMode) decoder.decodeElement(org.ccsds.moims.mo.mc.aggregation.structures.GenerationMode.ADHOC); + filtered = decoder.decodeBoolean(); + parameterSetValues = (org.ccsds.moims.mo.mc.aggregation.structures.AggregationSetValueList) decoder.decodeElement(new org.ccsds.moims.mo.mc.aggregation.structures.AggregationSetValueList()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/AggregationValueDetails.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/AggregationValueDetails.java new file mode 100644 index 00000000..1ab4ed44 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/AggregationValueDetails.java @@ -0,0 +1,207 @@ +package org.ccsds.moims.mo.mc.aggregation.structures; + +/** + * This structure holds a specific time stamped value of the aggregation. + * . + */ +public final class AggregationValueDetails implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1125925693423627L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125925693423627L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * The AggregationIdentity object instance identifier. + */ + private Long aggId; + + /** + * The AggregationDefinition object instance identifier. + */ + private Long defId; + + /** + * The timestamp of the value. Use for the calculation of the individual parameter + * value timestamps. + */ + private org.ccsds.moims.mo.mal.structures.Time timestamp; + + /** + * The aggregation value. + */ + private org.ccsds.moims.mo.mc.aggregation.structures.AggregationValue value; + + /** + * Default constructor for AggregationValueDetails. + * + */ + public AggregationValueDetails() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param aggId The AggregationIdentity object instance identifier. + * @param defId The AggregationDefinition object instance identifier. + * @param timestamp The timestamp of the value. Use for the calculation of the individual parameter value timestamps. + * @param value The aggregation value. + */ + public AggregationValueDetails(Long aggId, + Long defId, + org.ccsds.moims.mo.mal.structures.Time timestamp, + org.ccsds.moims.mo.mc.aggregation.structures.AggregationValue value) { + this.aggId = aggId; + this.defId = defId; + this.timestamp = timestamp; + this.value = value; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mc.aggregation.structures.AggregationValueDetails(); + } + + /** + * Returns the field aggId. + * + * @return The field aggId + */ + public Long getAggId() { + return aggId; + } + + /** + * Returns the field defId. + * + * @return The field defId + */ + public Long getDefId() { + return defId; + } + + /** + * Returns the field timestamp. + * + * @return The field timestamp + */ + public org.ccsds.moims.mo.mal.structures.Time getTimestamp() { + return timestamp; + } + + /** + * Returns the field value. + * + * @return The field value + */ + public org.ccsds.moims.mo.mc.aggregation.structures.AggregationValue getValue() { + return value; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof AggregationValueDetails) { + AggregationValueDetails other = (AggregationValueDetails) obj; + if (aggId == null) { + if (other.aggId != null) { + return false; + } + } else { + if (! aggId.equals(other.aggId)) { + return false; + } + } + if (defId == null) { + if (other.defId != null) { + return false; + } + } else { + if (! defId.equals(other.defId)) { + return false; + } + } + if (timestamp == null) { + if (other.timestamp != null) { + return false; + } + } else { + if (! timestamp.equals(other.timestamp)) { + return false; + } + } + if (value == null) { + if (other.value != null) { + return false; + } + } else { + if (! value.equals(other.value)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (aggId != null ? aggId.hashCode() : 0); + hash = 83 * hash + (defId != null ? defId.hashCode() : 0); + hash = 83 * hash + (timestamp != null ? timestamp.hashCode() : 0); + hash = 83 * hash + (value != null ? value.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(AggregationValueDetails: "); + buf.append("aggId=").append(aggId); + buf.append(", defId=").append(defId); + buf.append(", timestamp=").append(timestamp); + buf.append(", value=").append(value); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (aggId == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'aggId' cannot be null!"); + } + if (defId == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'defId' cannot be null!"); + } + if (timestamp == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'timestamp' cannot be null!"); + } + if (value == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'value' cannot be null!"); + } + encoder.encodeLong(aggId); + encoder.encodeLong(defId); + encoder.encodeTime(timestamp); + encoder.encodeElement(value); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + aggId = decoder.decodeLong(); + defId = decoder.decodeLong(); + timestamp = decoder.decodeTime(); + value = (org.ccsds.moims.mo.mc.aggregation.structures.AggregationValue) decoder.decodeElement(new org.ccsds.moims.mo.mc.aggregation.structures.AggregationValue()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/AggregationValueDetailsList.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/AggregationValueDetailsList.java new file mode 100644 index 00000000..47fbca95 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/AggregationValueDetailsList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mc.aggregation.structures; + +/** + * List class for AggregationValueDetails. + */ +public final class AggregationValueDetailsList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1125925710200821L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125925710200821L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for AggregationValueDetailsList. + * + */ + public AggregationValueDetailsList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public AggregationValueDetailsList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public AggregationValueDetailsList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mc.aggregation.structures.AggregationValueDetails element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mc.aggregation.structures.AggregationValueDetails element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new AggregationValueDetailsList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mc.aggregation.structures.AggregationValueDetails(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/AggregationValueList.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/AggregationValueList.java new file mode 100644 index 00000000..cb1d7cb9 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/AggregationValueList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mc.aggregation.structures; + +/** + * List class for AggregationValue. + */ +public final class AggregationValueList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1125925710200829L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125925710200829L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for AggregationValueList. + * + */ + public AggregationValueList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public AggregationValueList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public AggregationValueList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mc.aggregation.structures.AggregationValue element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mc.aggregation.structures.AggregationValue element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new AggregationValueList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mc.aggregation.structures.AggregationValue(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/GenerationMode.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/GenerationMode.java new file mode 100644 index 00000000..48d3ae05 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/GenerationMode.java @@ -0,0 +1,134 @@ +package org.ccsds.moims.mo.mc.aggregation.structures; + +/** + * Enumeration class for GenerationMode. + */ +public final class GenerationMode extends org.ccsds.moims.mo.mal.structures.Enumeration { + + private static final long serialVersionUID = 1125925693423625L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125925693423625L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Enumeration value for ADHOC. + */ + public static final int ADHOC_VALUE = 1; + + /** + * Enumeration singleton for value ADHOC. + */ + public static final org.ccsds.moims.mo.mc.aggregation.structures.GenerationMode ADHOC = new org.ccsds.moims.mo.mc.aggregation.structures.GenerationMode(org.ccsds.moims.mo.mc.aggregation.structures.GenerationMode.ADHOC_VALUE); + + /** + * Enumeration value for PERIODIC. + */ + public static final int PERIODIC_VALUE = 2; + + /** + * Enumeration singleton for value PERIODIC. + */ + public static final org.ccsds.moims.mo.mc.aggregation.structures.GenerationMode PERIODIC = new org.ccsds.moims.mo.mc.aggregation.structures.GenerationMode(org.ccsds.moims.mo.mc.aggregation.structures.GenerationMode.PERIODIC_VALUE); + + /** + * Enumeration value for FILTERED_TIMEOUT. + */ + public static final int FILTERED_TIMEOUT_VALUE = 3; + + /** + * Enumeration singleton for value FILTERED_TIMEOUT. + */ + public static final org.ccsds.moims.mo.mc.aggregation.structures.GenerationMode FILTERED_TIMEOUT = new org.ccsds.moims.mo.mc.aggregation.structures.GenerationMode(org.ccsds.moims.mo.mc.aggregation.structures.GenerationMode.FILTERED_TIMEOUT_VALUE); + + /** + * Set of enumeration instances. + */ + private static final org.ccsds.moims.mo.mc.aggregation.structures.GenerationMode[] _ENUMERATIONS = { + ADHOC, PERIODIC, FILTERED_TIMEOUT}; + + /** + * GenerationMode is an enumeration definition holding the reasons for the aggregation to be generated. + */ + public GenerationMode() { + super(-1); + } + + /** + * GenerationMode is an enumeration definition holding the reasons for the + * aggregation to be generated. + * + * @param value The value of the Enumeration. + */ + public GenerationMode(int value) { + super(value); + } + + @Override + public String toString() { + switch (getValue()) { + case ADHOC_VALUE: + return "ADHOC"; + case PERIODIC_VALUE: + return "PERIODIC"; + case FILTERED_TIMEOUT_VALUE: + return "FILTERED_TIMEOUT"; + default: + throw new RuntimeException("Unknown ordinal!"); + } + } + + /** + * Returns the enumeration element represented by the supplied string, or + * null if not matched. + * + * @param s s The string to search for. + * @return The matched enumeration element, or null if not matched. + */ + public static org.ccsds.moims.mo.mc.aggregation.structures.GenerationMode fromString(String s) { + switch (s) { + case "ADHOC": + return GenerationMode.ADHOC; + case "PERIODIC": + return GenerationMode.PERIODIC; + case "FILTERED_TIMEOUT": + return GenerationMode.FILTERED_TIMEOUT; + default: + throw new RuntimeException("Unknown Enumeration for the provided string: " + s); + } + } + + @Override + public org.ccsds.moims.mo.mal.structures.Enumeration fromValue(Integer value) { + switch (value) { + case ADHOC_VALUE: + return GenerationMode.ADHOC; + case PERIODIC_VALUE: + return GenerationMode.PERIODIC; + case FILTERED_TIMEOUT_VALUE: + return GenerationMode.FILTERED_TIMEOUT; + default: + throw new RuntimeException("Unknown Enumeration for the provided value: " + value); + } + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return _ENUMERATIONS[0]; + } + + @Override + public int getEnumSize() { + return 3; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/GenerationModeList.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/GenerationModeList.java new file mode 100644 index 00000000..36f7c9cd --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/GenerationModeList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mc.aggregation.structures; + +/** + * List class for GenerationMode. + */ +public final class GenerationModeList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1125925710200823L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125925710200823L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for GenerationModeList. + * + */ + public GenerationModeList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public GenerationModeList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public GenerationModeList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mc.aggregation.structures.GenerationMode element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mc.aggregation.structures.GenerationMode element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new GenerationModeList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return org.ccsds.moims.mo.mc.aggregation.structures.GenerationMode.ADHOC; + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/ThresholdFilter.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/ThresholdFilter.java new file mode 100644 index 00000000..92fd5073 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/ThresholdFilter.java @@ -0,0 +1,174 @@ +package org.ccsds.moims.mo.mc.aggregation.structures; + +/** + * The ThresholdFilter structure holds the filter for a parameter. + */ +public final class ThresholdFilter implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1125925693423622L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125925693423622L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * The type of filter to apply for filtered periodic reports when filters + * are applied. + */ + private org.ccsds.moims.mo.mc.aggregation.structures.ThresholdType thresholdType; + + /** + * Threshold value to apply. + */ + private org.ccsds.moims.mo.mal.structures.Attribute thresholdValue; + + /** + * If true, and the relevant Parameter has a conversion, then use the converted + * value for the threshold comparison, otherwise use the raw value. + */ + private Boolean useConverted; + + /** + * Default constructor for ThresholdFilter. + * + */ + public ThresholdFilter() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param thresholdType The type of filter to apply for filtered periodic reports when filters are applied. + * @param thresholdValue Threshold value to apply. + * @param useConverted If true, and the relevant Parameter has a conversion, then use the converted value for the threshold comparison, otherwise use the raw value. + */ + public ThresholdFilter(org.ccsds.moims.mo.mc.aggregation.structures.ThresholdType thresholdType, + org.ccsds.moims.mo.mal.structures.Attribute thresholdValue, + Boolean useConverted) { + this.thresholdType = thresholdType; + this.thresholdValue = thresholdValue; + this.useConverted = useConverted; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mc.aggregation.structures.ThresholdFilter(); + } + + /** + * Returns the field thresholdType. + * + * @return The field thresholdType + */ + public org.ccsds.moims.mo.mc.aggregation.structures.ThresholdType getThresholdType() { + return thresholdType; + } + + /** + * Returns the field thresholdValue. + * + * @return The field thresholdValue + */ + public org.ccsds.moims.mo.mal.structures.Attribute getThresholdValue() { + return thresholdValue; + } + + /** + * Returns the field useConverted. + * + * @return The field useConverted + */ + public Boolean getUseConverted() { + return useConverted; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ThresholdFilter) { + ThresholdFilter other = (ThresholdFilter) obj; + if (thresholdType == null) { + if (other.thresholdType != null) { + return false; + } + } else { + if (! thresholdType.equals(other.thresholdType)) { + return false; + } + } + if (thresholdValue == null) { + if (other.thresholdValue != null) { + return false; + } + } else { + if (! thresholdValue.equals(other.thresholdValue)) { + return false; + } + } + if (useConverted == null) { + if (other.useConverted != null) { + return false; + } + } else { + if (! useConverted.equals(other.useConverted)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (thresholdType != null ? thresholdType.hashCode() : 0); + hash = 83 * hash + (thresholdValue != null ? thresholdValue.hashCode() : 0); + hash = 83 * hash + (useConverted != null ? useConverted.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(ThresholdFilter: "); + buf.append("thresholdType=").append(thresholdType); + buf.append(", thresholdValue=").append(thresholdValue); + buf.append(", useConverted=").append(useConverted); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (thresholdType == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'thresholdType' cannot be null!"); + } + if (thresholdValue == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'thresholdValue' cannot be null!"); + } + if (useConverted == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'useConverted' cannot be null!"); + } + encoder.encodeElement(thresholdType); + encoder.encodeAttribute(thresholdValue); + encoder.encodeBoolean(useConverted); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + thresholdType = (org.ccsds.moims.mo.mc.aggregation.structures.ThresholdType) decoder.decodeElement(org.ccsds.moims.mo.mc.aggregation.structures.ThresholdType.PERCENTAGE); + thresholdValue = (org.ccsds.moims.mo.mal.structures.Attribute) decoder.decodeAttribute(); + useConverted = decoder.decodeBoolean(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/ThresholdFilterList.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/ThresholdFilterList.java new file mode 100644 index 00000000..24a6d564 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/ThresholdFilterList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mc.aggregation.structures; + +/** + * List class for ThresholdFilter. + */ +public final class ThresholdFilterList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1125925710200826L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125925710200826L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for ThresholdFilterList. + * + */ + public ThresholdFilterList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public ThresholdFilterList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public ThresholdFilterList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mc.aggregation.structures.ThresholdFilter element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mc.aggregation.structures.ThresholdFilter element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new ThresholdFilterList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mc.aggregation.structures.ThresholdFilter(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/ThresholdType.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/ThresholdType.java new file mode 100644 index 00000000..d6242202 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/ThresholdType.java @@ -0,0 +1,118 @@ +package org.ccsds.moims.mo.mc.aggregation.structures; + +/** + * Enumeration class for ThresholdType. + */ +public final class ThresholdType extends org.ccsds.moims.mo.mal.structures.Enumeration { + + private static final long serialVersionUID = 1125925693423624L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125925693423624L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Enumeration value for PERCENTAGE. + */ + public static final int PERCENTAGE_VALUE = 1; + + /** + * Enumeration singleton for value PERCENTAGE. + */ + public static final org.ccsds.moims.mo.mc.aggregation.structures.ThresholdType PERCENTAGE = new org.ccsds.moims.mo.mc.aggregation.structures.ThresholdType(org.ccsds.moims.mo.mc.aggregation.structures.ThresholdType.PERCENTAGE_VALUE); + + /** + * Enumeration value for DELTA. + */ + public static final int DELTA_VALUE = 2; + + /** + * Enumeration singleton for value DELTA. + */ + public static final org.ccsds.moims.mo.mc.aggregation.structures.ThresholdType DELTA = new org.ccsds.moims.mo.mc.aggregation.structures.ThresholdType(org.ccsds.moims.mo.mc.aggregation.structures.ThresholdType.DELTA_VALUE); + + /** + * Set of enumeration instances. + */ + private static final org.ccsds.moims.mo.mc.aggregation.structures.ThresholdType[] _ENUMERATIONS = { + PERCENTAGE, DELTA}; + + /** + * ThresholdType is an enumeration definition holding the types of filtering thresholds. + */ + public ThresholdType() { + super(-1); + } + + /** + * ThresholdType is an enumeration definition holding the types of filtering + * thresholds. + * + * @param value The value of the Enumeration. + */ + public ThresholdType(int value) { + super(value); + } + + @Override + public String toString() { + switch (getValue()) { + case PERCENTAGE_VALUE: + return "PERCENTAGE"; + case DELTA_VALUE: + return "DELTA"; + default: + throw new RuntimeException("Unknown ordinal!"); + } + } + + /** + * Returns the enumeration element represented by the supplied string, or + * null if not matched. + * + * @param s s The string to search for. + * @return The matched enumeration element, or null if not matched. + */ + public static org.ccsds.moims.mo.mc.aggregation.structures.ThresholdType fromString(String s) { + switch (s) { + case "PERCENTAGE": + return ThresholdType.PERCENTAGE; + case "DELTA": + return ThresholdType.DELTA; + default: + throw new RuntimeException("Unknown Enumeration for the provided string: " + s); + } + } + + @Override + public org.ccsds.moims.mo.mal.structures.Enumeration fromValue(Integer value) { + switch (value) { + case PERCENTAGE_VALUE: + return ThresholdType.PERCENTAGE; + case DELTA_VALUE: + return ThresholdType.DELTA; + default: + throw new RuntimeException("Unknown Enumeration for the provided value: " + value); + } + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return _ENUMERATIONS[0]; + } + + @Override + public int getEnumSize() { + return 2; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/ThresholdTypeList.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/ThresholdTypeList.java new file mode 100644 index 00000000..83df55fc --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/ThresholdTypeList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mc.aggregation.structures; + +/** + * List class for ThresholdType. + */ +public final class ThresholdTypeList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1125925710200824L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125925710200824L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for ThresholdTypeList. + * + */ + public ThresholdTypeList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public ThresholdTypeList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public ThresholdTypeList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mc.aggregation.structures.ThresholdType element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mc.aggregation.structures.ThresholdType element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new ThresholdTypeList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return org.ccsds.moims.mo.mc.aggregation.structures.ThresholdType.PERCENTAGE; + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/package-info.java new file mode 100644 index 00000000..1d6b5457 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/aggregation/structures/package-info.java @@ -0,0 +1,4 @@ +/** + * Package containing types defined in the Aggregation service. +*/ +package org.ccsds.moims.mo.mc.aggregation.structures; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/alert/AlertHelper.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/alert/AlertHelper.java new file mode 100644 index 00000000..76b35fc6 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/alert/AlertHelper.java @@ -0,0 +1,17 @@ +package org.ccsds.moims.mo.mc.alert; + +/** + * Helper class for Alert service. + */ +public class AlertHelper { + + /** + * Service singleton instance. + */ + public static final org.ccsds.moims.mo.mc.alert.AlertServiceInfo ALERT_SERVICE = new org.ccsds.moims.mo.mc.alert.AlertServiceInfo(); + + private AlertHelper() { + // Utility class; not meant to be instantiated. + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/alert/AlertServiceInfo.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/alert/AlertServiceInfo.java new file mode 100644 index 00000000..0cfbca1f --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/alert/AlertServiceInfo.java @@ -0,0 +1,281 @@ +package org.ccsds.moims.mo.mc.alert; + +/** + * Helper class for Alert service. + */ +public class AlertServiceInfo extends org.ccsds.moims.mo.com.COMService { + + /** + * Service number literal. + */ + public static final int _ALERT_SERVICE_NUMBER = 3; + + /** + * Service number instance. + */ + public static final org.ccsds.moims.mo.mal.structures.UShort ALERT_SERVICE_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_ALERT_SERVICE_NUMBER); + + /** + * Service name constant. + */ + public static final org.ccsds.moims.mo.mal.structures.Identifier ALERT_SERVICE_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("Alert"); + + /** + * The service key of this service. + */ + private static final org.ccsds.moims.mo.mal.ServiceKey SERVICE_KEY = new org.ccsds.moims.mo.mal.ServiceKey( + 4, 1, ALERT_SERVICE_NUMBER); + + /** + * Operation number literal for operation ENABLEGENERATION. + */ + public static final int _ENABLEGENERATION_OP_NUMBER = 1; + + /** + * Operation number instance for operation ENABLEGENERATION. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort ENABLEGENERATION_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_ENABLEGENERATION_OP_NUMBER); + + /** + * Operation instance for operation ENABLEGENERATION. + */ + public static final org.ccsds.moims.mo.mal.MALRequestOperation ENABLEGENERATION_OP = new org.ccsds.moims.mo.mal.MALRequestOperation(SERVICE_KEY, + ENABLEGENERATION_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("enableGeneration"), + new org.ccsds.moims.mo.mal.structures.UShort(1), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("isGroupIds", true, org.ccsds.moims.mo.mal.structures.Attribute.BOOLEAN_SHORT_FORM, "If the isGroupIds field is TRUE then the enableInstances field shall contain GroupIdentity object instance identifiers, otherwise the field contains AlertIdentity object instance identifiers.\nThe AlertIdentity objects referenced, either directly or indirectly via groups, by the enableInstances field shall be the AlertIdentity objects to match.\nThe id of the enableInstances field shall support the wildcard value of '0' and matches all AlertIdentity objects of the provider.\nThe service provider shall check for the wildcard value in the list of object instance identifiers in the enableInstances field first and if found no other checks of supplied object instance identifiers shall be made.\nIf the enableInstances field contains a value of TRUE then instances of matching AlertIdentity objects shall be generated, a value of FALSE requests that instances will not be generated.\nNo error shall be raised if the enableInstances Boolean value supplied is the same as the current generationEnabled field for an alert object i.e. enabling an already enabled alert will not result in an error.\nIf a requested AlertIdentity or GroupIdentity object is unknown then an UNKNOWN error shall be returned.\nIf a requested Group, or the Group objects referenced by that Group, does not contain AlertIdentity objects then an INVALID error shall be returned.\nIf an error is raised then no modifications shall be made as a result of this operation call.\nThe provider shall create and store a new AlertDefinition object in the COM archive if the generationEnabled field is changed.\nIf a new AlertDefinition object is created then that new object shall be the current AlertDefinition used for the specific AlertIdentity."), + new org.ccsds.moims.mo.mal.OperationField("enableInstances", true, org.ccsds.moims.mo.com.structures.InstanceBooleanPairList.SHORT_FORM, null)}, + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("newObjInstIds", true, org.ccsds.moims.mo.mal.structures.LongList.SHORT_FORM, "The response shall contain the list of object instance identifiers for the new AlertDefinition objects.")}, + "The enableGeneration operation allows a consumer to control whether updates for specific alerts are generated or not. The operation allows the consumer to select the alerts directly or indirectly using groups."); + + /** + * Operation number literal for operation LISTDEFINITION. + */ + public static final int _LISTDEFINITION_OP_NUMBER = 2; + + /** + * Operation number instance for operation LISTDEFINITION. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort LISTDEFINITION_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_LISTDEFINITION_OP_NUMBER); + + /** + * Operation instance for operation LISTDEFINITION. + */ + public static final org.ccsds.moims.mo.mal.MALRequestOperation LISTDEFINITION_OP = new org.ccsds.moims.mo.mal.MALRequestOperation(SERVICE_KEY, + LISTDEFINITION_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("listDefinition"), + new org.ccsds.moims.mo.mal.structures.UShort(2), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("alertNames", true, org.ccsds.moims.mo.mal.structures.IdentifierList.SHORT_FORM, "The alertNames field shall contain a list of alert names to retrieve the AlertIdentity and AlertDefinition object instance identifiers for.\nThe alertNames field may contain the wildcard value of '*' to return all supported AlertIdentity and AlertDefinition objects.\nThe wildcard value should be checked for first, if found no other checks of supplied identifiers shall be made.\nIf a provided identifier does not include a wildcard and does not match an existing AlertIdentity object then this operation shall fail with an UNKNOWN error.")}, + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("alertObjInstIds", true, org.ccsds.moims.mo.mc.structures.ObjectInstancePairList.SHORT_FORM, "The response shall contain a list of matching AlertIdentity and AlertDefinition object instance identifiers.\nThe returned list shall maintain the same order as the submitted list unless the wildcard value was included in the request.")}, + "The listDefinition operation allows a consumer to request the latest object instance identifiers of the AlertIdentity and AlertDefinition objects for the supported alerts of the provider."); + + /** + * Operation number literal for operation ADDALERT. + */ + public static final int _ADDALERT_OP_NUMBER = 3; + + /** + * Operation number instance for operation ADDALERT. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort ADDALERT_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_ADDALERT_OP_NUMBER); + + /** + * Operation instance for operation ADDALERT. + */ + public static final org.ccsds.moims.mo.mal.MALRequestOperation ADDALERT_OP = new org.ccsds.moims.mo.mal.MALRequestOperation(SERVICE_KEY, + ADDALERT_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("addAlert"), + new org.ccsds.moims.mo.mal.structures.UShort(3), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("alertDefDetails", true, org.ccsds.moims.mo.mc.alert.structures.AlertCreationRequestList.SHORT_FORM, "The alertDefDetails field shall hold the name and the AlertDefinitionDetails to be added.\nThe name field must not be the wildcard '*', or empty (an INVALID error shall be returned in this case).\nThe supplied name must be unique among all AlertIdentity objects for the domain of the provider otherwise a DUPLICATE error shall be raised.\nIf an error is raised then no new identities and definitions shall be added as a result of this operation call.\nIf the supplied name matches an existing, but removed, AlertIdentity then that AlertIdentity shall be reused otherwise a new AlertIdentity shall be created.\nThe provider shall create a new AlertDefinition object and store it, and any new AlertIdentity objects, in the COM archive.")}, + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("newObjInstIds", true, org.ccsds.moims.mo.mc.structures.ObjectInstancePairList.SHORT_FORM, "The response shall contain the list of object instance identifiers for the AlertIdentity and new AlertDefinition objects.\nThe returned list shall maintain the same order as the submitted definitions.")}, + "The addAlert operation allows a consumer to define one or more alerts that do not currently exist.\nThe new AlertIdentity and AlertDefinition objects are expected to be stored in the COM archive by the provider of the alert service."); + + /** + * Operation number literal for operation UPDATEDEFINITION. + */ + public static final int _UPDATEDEFINITION_OP_NUMBER = 4; + + /** + * Operation number instance for operation UPDATEDEFINITION. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort UPDATEDEFINITION_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_UPDATEDEFINITION_OP_NUMBER); + + /** + * Operation instance for operation UPDATEDEFINITION. + */ + public static final org.ccsds.moims.mo.mal.MALRequestOperation UPDATEDEFINITION_OP = new org.ccsds.moims.mo.mal.MALRequestOperation(SERVICE_KEY, + UPDATEDEFINITION_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("updateDefinition"), + new org.ccsds.moims.mo.mal.structures.UShort(3), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("alertObjInstIds", true, org.ccsds.moims.mo.mal.structures.LongList.SHORT_FORM, "The alertObjInstIds field shall contain the object instance identifiers of the AlertIdentity objects to be updated.\nThe supplied object instance identifiers shall match existing identity objects, an UNKNOWN error shall be raised if this is not the case.\nIf the alertObjInstIds list contains either NULL or '0' an INVALID error shall be raised."), + new org.ccsds.moims.mo.mal.OperationField("alertDefDetails", true, org.ccsds.moims.mo.mc.alert.structures.AlertDefinitionDetailsList.SHORT_FORM, "The alertDefDetails field shall contain the replacement AlertDefinitionDetails.\nThe two lists shall be ordered the same.\nThe number of entries in the two lists shall be the same size otherwise an INVALID error shall be returned.\nIf an error is raised then no definitions shall be updated as a result of this operation call.\nThe provider shall create a new AlertDefinition object and store it in the COM archive.\nThe new AlertDefinition object shall be the current AlertDefinition used for the specific AlertIdentity.")}, + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("newObjInstIds", true, org.ccsds.moims.mo.mal.structures.LongList.SHORT_FORM, "The response shall contain the list of object instance identifiers for the new AlertDefinition objects.\nThe returned list shall maintain the same order as the submitted definitions.")}, + "The updateDefinition operation allows a consumer to update a definition for one or more alerts.\nThis differs from deleting an existing alert and adding a new definition with the same alert name in the fact that the AlertIdentity object is not changed between the two definitions.\nThe replacement definition should be stored in the COM archive by the service provider. The operation does not remove the previous object from the COM archive, merely removes the object from the provider."); + + /** + * Operation number literal for operation REMOVEALERT. + */ + public static final int _REMOVEALERT_OP_NUMBER = 5; + + /** + * Operation number instance for operation REMOVEALERT. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort REMOVEALERT_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_REMOVEALERT_OP_NUMBER); + + /** + * Operation instance for operation REMOVEALERT. + */ + public static final org.ccsds.moims.mo.mal.MALSubmitOperation REMOVEALERT_OP = new org.ccsds.moims.mo.mal.MALSubmitOperation(SERVICE_KEY, + REMOVEALERT_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("removeAlert"), + new org.ccsds.moims.mo.mal.structures.UShort(3), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("alertInstIds", true, org.ccsds.moims.mo.mal.structures.LongList.SHORT_FORM, "The alertInstIds field shall hold the object instance identifiers of the AlertIdentity objects to be removed from the provider.\nThe list may contain the wildcard value of '0'.\nThe wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made.\nIf a provided AlertIdentity object instance identifier does not include a wildcard and does not match an existing AlertIdentity object then this operation shall fail with an UNKNOWN error.\nMatched AlertIdentity objects shall not be removed from the COM archive only the list of AlertIdentity objects in the provider.\nIf an error is raised then no alerts shall be removed as a result of this operation call.\nIf the operation succeeds then the provider shall not publish AlertEvent events for the deleted AlertIdentity objects anymore.")}, + "The removeAlert operation allows a consumer to remove one or more definitions from the list of alerts supported by the alert provider.\nThe operation does not remove the AlertIdentity or AlertDefinition objects from the COM archive, merely removes the objects from the provider. This permits existing AlertEvent objects to continue to reference the correct AlertDefinition object in the COM archive."); + + /** + * Area elements. + */ + public static final org.ccsds.moims.mo.mal.structures.Element[] ALERT_SERVICE_ELEMENTS = {}; + + /** + * The set of operations for this service. + */ + public static final org.ccsds.moims.mo.mal.MALOperation[] OPERATIONS = new org.ccsds.moims.mo.mal.MALOperation[]{ENABLEGENERATION_OP, + LISTDEFINITION_OP, + ADDALERT_OP, + UPDATEDEFINITION_OP, + REMOVEALERT_OP}; + + /** + * Literal for object ALERTIDENTITY. + */ + @Deprecated + public static final int _ALERTIDENTITY_OBJECT_NUMBER = 1; + + /** + * Instance for object ALERTIDENTITY. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.UShort ALERTIDENTITY_OBJECT_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_ALERTIDENTITY_OBJECT_NUMBER); + + /** + * Object name constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.Identifier ALERTIDENTITY_OBJECT_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("AlertIdentity"); + + /** + * Object type constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.com.structures.ObjectType ALERTIDENTITY_OBJECT_TYPE = new org.ccsds.moims.mo.com.structures.ObjectType(new org.ccsds.moims.mo.mal.structures.UShort(4), ALERT_SERVICE_NUMBER, new org.ccsds.moims.mo.mal.structures.UOctet(1), ALERTIDENTITY_OBJECT_NUMBER); + + /** + * Object instance. + */ + @Deprecated + public static org.ccsds.moims.mo.com.COMObject ALERTIDENTITY_OBJECT = new org.ccsds.moims.mo.com.COMObject(ALERTIDENTITY_OBJECT_TYPE, ALERTIDENTITY_OBJECT_NAME, org.ccsds.moims.mo.mal.structures.Attribute.IDENTIFIER_SHORT_FORM, false, null, true, null, false); + + /** + * Literal for object ALERTDEFINITION. + */ + @Deprecated + public static final int _ALERTDEFINITION_OBJECT_NUMBER = 2; + + /** + * Instance for object ALERTDEFINITION. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.UShort ALERTDEFINITION_OBJECT_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_ALERTDEFINITION_OBJECT_NUMBER); + + /** + * Object name constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.Identifier ALERTDEFINITION_OBJECT_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("AlertDefinition"); + + /** + * Object type constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.com.structures.ObjectType ALERTDEFINITION_OBJECT_TYPE = new org.ccsds.moims.mo.com.structures.ObjectType(new org.ccsds.moims.mo.mal.structures.UShort(4), ALERT_SERVICE_NUMBER, new org.ccsds.moims.mo.mal.structures.UOctet(1), ALERTDEFINITION_OBJECT_NUMBER); + + /** + * Object instance. + */ + @Deprecated + public static org.ccsds.moims.mo.com.COMObject ALERTDEFINITION_OBJECT = new org.ccsds.moims.mo.com.COMObject(ALERTDEFINITION_OBJECT_TYPE, ALERTDEFINITION_OBJECT_NAME, org.ccsds.moims.mo.mc.alert.structures.AlertDefinitionDetails.SHORT_FORM, true, org.ccsds.moims.mo.mc.alert.AlertServiceInfo.ALERTIDENTITY_OBJECT_TYPE, true, null, false); + + /** + * Literal for object ALERTEVENT. + */ + @Deprecated + public static final int _ALERTEVENT_OBJECT_NUMBER = 3; + + /** + * Instance for object ALERTEVENT. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.UShort ALERTEVENT_OBJECT_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_ALERTEVENT_OBJECT_NUMBER); + + /** + * Object name constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.Identifier ALERTEVENT_OBJECT_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("AlertEvent"); + + /** + * Object type constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.com.structures.ObjectType ALERTEVENT_OBJECT_TYPE = new org.ccsds.moims.mo.com.structures.ObjectType(new org.ccsds.moims.mo.mal.structures.UShort(4), ALERT_SERVICE_NUMBER, new org.ccsds.moims.mo.mal.structures.UOctet(1), ALERTEVENT_OBJECT_NUMBER); + + /** + * Object instance. + */ + @Deprecated + public static org.ccsds.moims.mo.com.COMObject ALERTEVENT_OBJECT = new org.ccsds.moims.mo.com.COMObject(ALERTEVENT_OBJECT_TYPE, ALERTEVENT_OBJECT_NAME, org.ccsds.moims.mo.mc.alert.structures.AlertEventDetails.SHORT_FORM, true, org.ccsds.moims.mo.mc.alert.AlertServiceInfo.ALERTDEFINITION_OBJECT_TYPE, true, null, true); + + /** + * Object instance. + */ + public static final org.ccsds.moims.mo.com.COMObject[] COM_OBJECTS = { + ALERTIDENTITY_OBJECT, + ALERTDEFINITION_OBJECT, + ALERTEVENT_OBJECT,}; + + /** + * Creates an instance of the Alert ServiceInfo. + * + */ + public AlertServiceInfo() { + super(SERVICE_KEY, ALERT_SERVICE_NAME, ALERT_SERVICE_ELEMENTS, OPERATIONS, COM_OBJECTS); + } + + @Override + public org.ccsds.moims.mo.mal.MALArea getArea() { + return org.ccsds.moims.mo.mc.MCHelper.MC_AREA; + } + + @Override + public org.ccsds.moims.mo.mal.MOErrorException generateMOError(int errorNumber, + Object extraInfo) { + switch (errorNumber) { + case 70020: + return new org.ccsds.moims.mo.mc.ReadonlyException(extraInfo); + case 70021: + return new org.ccsds.moims.mo.mc.ReferencedException(extraInfo); + } + return null; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/alert/consumer/AlertAdapter.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/alert/consumer/AlertAdapter.java new file mode 100644 index 00000000..6050fa59 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/alert/consumer/AlertAdapter.java @@ -0,0 +1,212 @@ +package org.ccsds.moims.mo.mc.alert.consumer; + +/** + * Consumer adapter for Alert service. + */ +public abstract class AlertAdapter extends org.ccsds.moims.mo.mal.consumer.MALInteractionAdapter { + + /** + * Called by the MAL when a REQUEST response is received from a provider for + * the operation enableGeneration. + * + * @param msgHeader msgHeader The header of the received message + * @param newObjInstIds The response shall contain the list of object instance identifiers for the new AlertDefinition objects. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void enableGenerationResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.structures.LongList newObjInstIds, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response error is received from a provider + * for the operation enableGeneration. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void enableGenerationErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response is received from a provider for + * the operation listDefinition. + * + * @param msgHeader msgHeader The header of the received message + * @param alertObjInstIds The response shall contain a list of matching AlertIdentity and AlertDefinition object instance identifiers. +The returned list shall maintain the same order as the submitted list unless the wildcard value was included in the request. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void listDefinitionResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mc.structures.ObjectInstancePairList alertObjInstIds, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response error is received from a provider + * for the operation listDefinition. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void listDefinitionErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response is received from a provider for + * the operation addAlert. + * + * @param msgHeader msgHeader The header of the received message + * @param newObjInstIds The response shall contain the list of object instance identifiers for the AlertIdentity and new AlertDefinition objects. +The returned list shall maintain the same order as the submitted definitions. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void addAlertResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mc.structures.ObjectInstancePairList newObjInstIds, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response error is received from a provider + * for the operation addAlert. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void addAlertErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response is received from a provider for + * the operation updateDefinition. + * + * @param msgHeader msgHeader The header of the received message + * @param newObjInstIds The response shall contain the list of object instance identifiers for the new AlertDefinition objects. +The returned list shall maintain the same order as the submitted definitions. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void updateDefinitionResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.structures.LongList newObjInstIds, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response error is received from a provider + * for the operation updateDefinition. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void updateDefinitionErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a SUBMIT acknowledgement is received from a provider + * for the operation removeAlert. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void removeAlertAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a SUBMIT acknowledgement error is received from + * a provider for the operation removeAlert. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void removeAlertErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + @Override + public final void submitAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mc.alert.AlertServiceInfo._REMOVEALERT_OP_NUMBER: + removeAlertAckReceived(msgHeader, qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void submitErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALErrorBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mc.alert.AlertServiceInfo._REMOVEALERT_OP_NUMBER: + removeAlertErrorReceived(msgHeader, body.getError(), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void requestResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALMessageBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mc.alert.AlertServiceInfo._ENABLEGENERATION_OP_NUMBER: + enableGenerationResponseReceived(msgHeader, + (org.ccsds.moims.mo.mal.structures.LongList) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.LongList()), qosProperties); + break; + case org.ccsds.moims.mo.mc.alert.AlertServiceInfo._LISTDEFINITION_OP_NUMBER: + listDefinitionResponseReceived(msgHeader, + (org.ccsds.moims.mo.mc.structures.ObjectInstancePairList) body.getBodyElement(0, new org.ccsds.moims.mo.mc.structures.ObjectInstancePairList()), qosProperties); + break; + case org.ccsds.moims.mo.mc.alert.AlertServiceInfo._ADDALERT_OP_NUMBER: + addAlertResponseReceived(msgHeader, + (org.ccsds.moims.mo.mc.structures.ObjectInstancePairList) body.getBodyElement(0, new org.ccsds.moims.mo.mc.structures.ObjectInstancePairList()), qosProperties); + break; + case org.ccsds.moims.mo.mc.alert.AlertServiceInfo._UPDATEDEFINITION_OP_NUMBER: + updateDefinitionResponseReceived(msgHeader, + (org.ccsds.moims.mo.mal.structures.LongList) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.LongList()), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void requestErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALErrorBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mc.alert.AlertServiceInfo._ENABLEGENERATION_OP_NUMBER: + enableGenerationErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mc.alert.AlertServiceInfo._LISTDEFINITION_OP_NUMBER: + listDefinitionErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mc.alert.AlertServiceInfo._ADDALERT_OP_NUMBER: + addAlertErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mc.alert.AlertServiceInfo._UPDATEDEFINITION_OP_NUMBER: + updateDefinitionErrorReceived(msgHeader, body.getError(), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/alert/consumer/AlertStub.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/alert/consumer/AlertStub.java new file mode 100644 index 00000000..68d38389 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/alert/consumer/AlertStub.java @@ -0,0 +1,344 @@ +package org.ccsds.moims.mo.mc.alert.consumer; + +/** + * Consumer stub for Alert service. + */ +public class AlertStub { + + /** + * The consumer field. + */ + private final org.ccsds.moims.mo.mal.consumer.MALConsumer consumer; + + /** + * Wraps a MALconsumer connection with service specific methods that map from + * the high level service API to the generic MAL API. + * + * @param consumer consumer The MALConsumer to use in this stub. + */ + public AlertStub(org.ccsds.moims.mo.mal.consumer.MALConsumer consumer) { + this.consumer = consumer; + } + + /** + * Returns the internal MAL consumer object used for sending of messages from + * this interface. + * + * @return The MAL consumer object. + */ + public org.ccsds.moims.mo.mal.consumer.MALConsumer getConsumer() { + return consumer; + } + + /** + * The enableGeneration operation allows a consumer to control whether updates + * for specific alerts are generated or not. The operation allows the consumer + * to select the alerts directly or indirectly using groups. + * + * @param isGroupIds If the isGroupIds field is TRUE then the enableInstances field shall contain GroupIdentity object instance identifiers, otherwise the field contains AlertIdentity object instance identifiers. +The AlertIdentity objects referenced, either directly or indirectly via groups, by the enableInstances field shall be the AlertIdentity objects to match. +The id of the enableInstances field shall support the wildcard value of '0' and matches all AlertIdentity objects of the provider. +The service provider shall check for the wildcard value in the list of object instance identifiers in the enableInstances field first and if found no other checks of supplied object instance identifiers shall be made. +If the enableInstances field contains a value of TRUE then instances of matching AlertIdentity objects shall be generated, a value of FALSE requests that instances will not be generated. +No error shall be raised if the enableInstances Boolean value supplied is the same as the current generationEnabled field for an alert object i.e. enabling an already enabled alert will not result in an error. +If a requested AlertIdentity or GroupIdentity object is unknown then an UNKNOWN error shall be returned. +If a requested Group, or the Group objects referenced by that Group, does not contain AlertIdentity objects then an INVALID error shall be returned. +If an error is raised then no modifications shall be made as a result of this operation call. +The provider shall create and store a new AlertDefinition object in the COM archive if the generationEnabled field is changed. +If a new AlertDefinition object is created then that new object shall be the current AlertDefinition used for the specific AlertIdentity. + * @param enableInstances enableInstances Argument number 1 as defined by the service operation + * @return The return value of the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.structures.LongList enableGeneration(Boolean isGroupIds, + org.ccsds.moims.mo.com.structures.InstanceBooleanPairList enableInstances) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + org.ccsds.moims.mo.mal.transport.MALMessageBody body = consumer.request(org.ccsds.moims.mo.mc.alert.AlertServiceInfo.ENABLEGENERATION_OP, (isGroupIds == null) ? null : new org.ccsds.moims.mo.mal.structures.Union(isGroupIds), enableInstances); + Object body0 = (Object) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.LongList()); + return (org.ccsds.moims.mo.mal.structures.LongList) body0; + } + + /** + * Asynchronous version of method enableGeneration. + * + * @param isGroupIds If the isGroupIds field is TRUE then the enableInstances field shall contain GroupIdentity object instance identifiers, otherwise the field contains AlertIdentity object instance identifiers. +The AlertIdentity objects referenced, either directly or indirectly via groups, by the enableInstances field shall be the AlertIdentity objects to match. +The id of the enableInstances field shall support the wildcard value of '0' and matches all AlertIdentity objects of the provider. +The service provider shall check for the wildcard value in the list of object instance identifiers in the enableInstances field first and if found no other checks of supplied object instance identifiers shall be made. +If the enableInstances field contains a value of TRUE then instances of matching AlertIdentity objects shall be generated, a value of FALSE requests that instances will not be generated. +No error shall be raised if the enableInstances Boolean value supplied is the same as the current generationEnabled field for an alert object i.e. enabling an already enabled alert will not result in an error. +If a requested AlertIdentity or GroupIdentity object is unknown then an UNKNOWN error shall be returned. +If a requested Group, or the Group objects referenced by that Group, does not contain AlertIdentity objects then an INVALID error shall be returned. +If an error is raised then no modifications shall be made as a result of this operation call. +The provider shall create and store a new AlertDefinition object in the COM archive if the generationEnabled field is changed. +If a new AlertDefinition object is created then that new object shall be the current AlertDefinition used for the specific AlertIdentity. + * @param enableInstances enableInstances Argument number 1 as defined by the service operation + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncEnableGeneration(Boolean isGroupIds, + org.ccsds.moims.mo.com.structures.InstanceBooleanPairList enableInstances, + org.ccsds.moims.mo.mc.alert.consumer.AlertAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncRequest(org.ccsds.moims.mo.mc.alert.AlertServiceInfo.ENABLEGENERATION_OP, adapter, (isGroupIds == null) ? null : new org.ccsds.moims.mo.mal.structures.Union(isGroupIds), enableInstances); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueEnableGeneration(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mc.alert.consumer.AlertAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mc.alert.AlertServiceInfo.ENABLEGENERATION_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The listDefinition operation allows a consumer to request the latest object + * instance identifiers of the AlertIdentity and AlertDefinition objects for + * the supported alerts of the provider. + * + * @param alertNames The alertNames field shall contain a list of alert names to retrieve the AlertIdentity and AlertDefinition object instance identifiers for. +The alertNames field may contain the wildcard value of '*' to return all supported AlertIdentity and AlertDefinition objects. +The wildcard value should be checked for first, if found no other checks of supplied identifiers shall be made. +If a provided identifier does not include a wildcard and does not match an existing AlertIdentity object then this operation shall fail with an UNKNOWN error. + * @return The return value of the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mc.structures.ObjectInstancePairList listDefinition(org.ccsds.moims.mo.mal.structures.IdentifierList alertNames) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + org.ccsds.moims.mo.mal.transport.MALMessageBody body = consumer.request(org.ccsds.moims.mo.mc.alert.AlertServiceInfo.LISTDEFINITION_OP, alertNames); + Object body0 = (Object) body.getBodyElement(0, new org.ccsds.moims.mo.mc.structures.ObjectInstancePairList()); + return (org.ccsds.moims.mo.mc.structures.ObjectInstancePairList) body0; + } + + /** + * Asynchronous version of method listDefinition. + * + * @param alertNames The alertNames field shall contain a list of alert names to retrieve the AlertIdentity and AlertDefinition object instance identifiers for. +The alertNames field may contain the wildcard value of '*' to return all supported AlertIdentity and AlertDefinition objects. +The wildcard value should be checked for first, if found no other checks of supplied identifiers shall be made. +If a provided identifier does not include a wildcard and does not match an existing AlertIdentity object then this operation shall fail with an UNKNOWN error. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncListDefinition(org.ccsds.moims.mo.mal.structures.IdentifierList alertNames, + org.ccsds.moims.mo.mc.alert.consumer.AlertAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncRequest(org.ccsds.moims.mo.mc.alert.AlertServiceInfo.LISTDEFINITION_OP, adapter, alertNames); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueListDefinition(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mc.alert.consumer.AlertAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mc.alert.AlertServiceInfo.LISTDEFINITION_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The addAlert operation allows a consumer to define one or more alerts that + * do not currently exist. + * The new AlertIdentity and AlertDefinition objects are expected to be stored + * in the COM archive by the provider of the alert service. + * + * @param alertDefDetails The alertDefDetails field shall hold the name and the AlertDefinitionDetails to be added. +The name field must not be the wildcard '*', or empty (an INVALID error shall be returned in this case). +The supplied name must be unique among all AlertIdentity objects for the domain of the provider otherwise a DUPLICATE error shall be raised. +If an error is raised then no new identities and definitions shall be added as a result of this operation call. +If the supplied name matches an existing, but removed, AlertIdentity then that AlertIdentity shall be reused otherwise a new AlertIdentity shall be created. +The provider shall create a new AlertDefinition object and store it, and any new AlertIdentity objects, in the COM archive. + * @return The return value of the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mc.structures.ObjectInstancePairList addAlert(org.ccsds.moims.mo.mc.alert.structures.AlertCreationRequestList alertDefDetails) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + org.ccsds.moims.mo.mal.transport.MALMessageBody body = consumer.request(org.ccsds.moims.mo.mc.alert.AlertServiceInfo.ADDALERT_OP, alertDefDetails); + Object body0 = (Object) body.getBodyElement(0, new org.ccsds.moims.mo.mc.structures.ObjectInstancePairList()); + return (org.ccsds.moims.mo.mc.structures.ObjectInstancePairList) body0; + } + + /** + * Asynchronous version of method addAlert. + * + * @param alertDefDetails The alertDefDetails field shall hold the name and the AlertDefinitionDetails to be added. +The name field must not be the wildcard '*', or empty (an INVALID error shall be returned in this case). +The supplied name must be unique among all AlertIdentity objects for the domain of the provider otherwise a DUPLICATE error shall be raised. +If an error is raised then no new identities and definitions shall be added as a result of this operation call. +If the supplied name matches an existing, but removed, AlertIdentity then that AlertIdentity shall be reused otherwise a new AlertIdentity shall be created. +The provider shall create a new AlertDefinition object and store it, and any new AlertIdentity objects, in the COM archive. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncAddAlert(org.ccsds.moims.mo.mc.alert.structures.AlertCreationRequestList alertDefDetails, + org.ccsds.moims.mo.mc.alert.consumer.AlertAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncRequest(org.ccsds.moims.mo.mc.alert.AlertServiceInfo.ADDALERT_OP, adapter, alertDefDetails); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueAddAlert(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mc.alert.consumer.AlertAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mc.alert.AlertServiceInfo.ADDALERT_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The updateDefinition operation allows a consumer to update a definition + * for one or more alerts. + * This differs from deleting an existing alert and adding a new definition + * with the same alert name in the fact that the AlertIdentity object is not + * changed between the two definitions. + * The replacement definition should be stored in the COM archive by the service + * provider. The operation does not remove the previous object from the COM + * archive, merely removes the object from the provider. + * + * @param alertObjInstIds The alertObjInstIds field shall contain the object instance identifiers of the AlertIdentity objects to be updated. +The supplied object instance identifiers shall match existing identity objects, an UNKNOWN error shall be raised if this is not the case. +If the alertObjInstIds list contains either NULL or '0' an INVALID error shall be raised. + * @param alertDefDetails The alertDefDetails field shall contain the replacement AlertDefinitionDetails. +The two lists shall be ordered the same. +The number of entries in the two lists shall be the same size otherwise an INVALID error shall be returned. +If an error is raised then no definitions shall be updated as a result of this operation call. +The provider shall create a new AlertDefinition object and store it in the COM archive. +The new AlertDefinition object shall be the current AlertDefinition used for the specific AlertIdentity. + * @return The return value of the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.structures.LongList updateDefinition(org.ccsds.moims.mo.mal.structures.LongList alertObjInstIds, + org.ccsds.moims.mo.mc.alert.structures.AlertDefinitionDetailsList alertDefDetails) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + org.ccsds.moims.mo.mal.transport.MALMessageBody body = consumer.request(org.ccsds.moims.mo.mc.alert.AlertServiceInfo.UPDATEDEFINITION_OP, alertObjInstIds, alertDefDetails); + Object body0 = (Object) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.LongList()); + return (org.ccsds.moims.mo.mal.structures.LongList) body0; + } + + /** + * Asynchronous version of method updateDefinition. + * + * @param alertObjInstIds The alertObjInstIds field shall contain the object instance identifiers of the AlertIdentity objects to be updated. +The supplied object instance identifiers shall match existing identity objects, an UNKNOWN error shall be raised if this is not the case. +If the alertObjInstIds list contains either NULL or '0' an INVALID error shall be raised. + * @param alertDefDetails The alertDefDetails field shall contain the replacement AlertDefinitionDetails. +The two lists shall be ordered the same. +The number of entries in the two lists shall be the same size otherwise an INVALID error shall be returned. +If an error is raised then no definitions shall be updated as a result of this operation call. +The provider shall create a new AlertDefinition object and store it in the COM archive. +The new AlertDefinition object shall be the current AlertDefinition used for the specific AlertIdentity. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncUpdateDefinition(org.ccsds.moims.mo.mal.structures.LongList alertObjInstIds, + org.ccsds.moims.mo.mc.alert.structures.AlertDefinitionDetailsList alertDefDetails, + org.ccsds.moims.mo.mc.alert.consumer.AlertAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncRequest(org.ccsds.moims.mo.mc.alert.AlertServiceInfo.UPDATEDEFINITION_OP, adapter, alertObjInstIds, alertDefDetails); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueUpdateDefinition(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mc.alert.consumer.AlertAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mc.alert.AlertServiceInfo.UPDATEDEFINITION_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The removeAlert operation allows a consumer to remove one or more definitions + * from the list of alerts supported by the alert provider. + * The operation does not remove the AlertIdentity or AlertDefinition objects + * from the COM archive, merely removes the objects from the provider. This + * permits existing AlertEvent objects to continue to reference the correct + * AlertDefinition object in the COM archive. + * + * @param alertInstIds The alertInstIds field shall hold the object instance identifiers of the AlertIdentity objects to be removed from the provider. +The list may contain the wildcard value of '0'. +The wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made. +If a provided AlertIdentity object instance identifier does not include a wildcard and does not match an existing AlertIdentity object then this operation shall fail with an UNKNOWN error. +Matched AlertIdentity objects shall not be removed from the COM archive only the list of AlertIdentity objects in the provider. +If an error is raised then no alerts shall be removed as a result of this operation call. +If the operation succeeds then the provider shall not publish AlertEvent events for the deleted AlertIdentity objects anymore. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void removeAlert(org.ccsds.moims.mo.mal.structures.LongList alertInstIds) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.submit(org.ccsds.moims.mo.mc.alert.AlertServiceInfo.REMOVEALERT_OP, alertInstIds); + } + + /** + * Asynchronous version of method removeAlert. + * + * @param alertInstIds The alertInstIds field shall hold the object instance identifiers of the AlertIdentity objects to be removed from the provider. +The list may contain the wildcard value of '0'. +The wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made. +If a provided AlertIdentity object instance identifier does not include a wildcard and does not match an existing AlertIdentity object then this operation shall fail with an UNKNOWN error. +Matched AlertIdentity objects shall not be removed from the COM archive only the list of AlertIdentity objects in the provider. +If an error is raised then no alerts shall be removed as a result of this operation call. +If the operation succeeds then the provider shall not publish AlertEvent events for the deleted AlertIdentity objects anymore. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncRemoveAlert(org.ccsds.moims.mo.mal.structures.LongList alertInstIds, + org.ccsds.moims.mo.mc.alert.consumer.AlertAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncSubmit(org.ccsds.moims.mo.mc.alert.AlertServiceInfo.REMOVEALERT_OP, adapter, alertInstIds); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueRemoveAlert(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mc.alert.consumer.AlertAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mc.alert.AlertServiceInfo.REMOVEALERT_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/alert/consumer/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/alert/consumer/package-info.java new file mode 100644 index 00000000..2b2ee49f --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/alert/consumer/package-info.java @@ -0,0 +1,4 @@ +/** + * Package containing the consumer stubs for the Alert service. +*/ +package org.ccsds.moims.mo.mc.alert.consumer; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/alert/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/alert/package-info.java new file mode 100644 index 00000000..d371bbbd --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/alert/package-info.java @@ -0,0 +1,11 @@ +/** + * The alert service defines the structures and patterns for the publishing + * and monitoring of alerts. The alert service uses COM event service to monitor + * and publish alert events. + * The generation of alerts can be controlled using the enableGeneration operation, + * which supports the use of groups. Groups must reference either other groups + * or alerts only. + * Alert definitions are maintained using the operations defined in this service + * but storage of definitions is delegated to the COM archive. +*/ +package org.ccsds.moims.mo.mc.alert; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/alert/provider/AlertHandler.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/alert/provider/AlertHandler.java new file mode 100644 index 00000000..439ee27d --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/alert/provider/AlertHandler.java @@ -0,0 +1,113 @@ +package org.ccsds.moims.mo.mc.alert.provider; + +/** + * Interface that providers of the Alert service must implement to handle + * the operations of that service. + */ +public interface AlertHandler { + + /** + * Implements the operation enableGeneration. + * + * @param isGroupIds If the isGroupIds field is TRUE then the enableInstances field shall contain GroupIdentity object instance identifiers, otherwise the field contains AlertIdentity object instance identifiers. +The AlertIdentity objects referenced, either directly or indirectly via groups, by the enableInstances field shall be the AlertIdentity objects to match. +The id of the enableInstances field shall support the wildcard value of '0' and matches all AlertIdentity objects of the provider. +The service provider shall check for the wildcard value in the list of object instance identifiers in the enableInstances field first and if found no other checks of supplied object instance identifiers shall be made. +If the enableInstances field contains a value of TRUE then instances of matching AlertIdentity objects shall be generated, a value of FALSE requests that instances will not be generated. +No error shall be raised if the enableInstances Boolean value supplied is the same as the current generationEnabled field for an alert object i.e. enabling an already enabled alert will not result in an error. +If a requested AlertIdentity or GroupIdentity object is unknown then an UNKNOWN error shall be returned. +If a requested Group, or the Group objects referenced by that Group, does not contain AlertIdentity objects then an INVALID error shall be returned. +If an error is raised then no modifications shall be made as a result of this operation call. +The provider shall create and store a new AlertDefinition object in the COM archive if the generationEnabled field is changed. +If a new AlertDefinition object is created then that new object shall be the current AlertDefinition used for the specific AlertIdentity. + * @param enableInstances enableInstances Argument number 1 as defined by the service operation + * @param interaction The MAL object representing the interaction in the provider. + * @return The return value of the operation + * @throws org.ccsds.moims.mo.com.InvalidException One of the supplied groups is either not a group of groups or a group of AlertIdentity objects. + * @throws org.ccsds.moims.mo.mal.UnknownException One or more of the requested alerts or group objects is unknown. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + org.ccsds.moims.mo.mal.structures.LongList enableGeneration(Boolean isGroupIds, + org.ccsds.moims.mo.com.structures.InstanceBooleanPairList enableInstances, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.com.InvalidException, org.ccsds.moims.mo.mal.UnknownException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation listDefinition. + * + * @param alertNames The alertNames field shall contain a list of alert names to retrieve the AlertIdentity and AlertDefinition object instance identifiers for. +The alertNames field may contain the wildcard value of '*' to return all supported AlertIdentity and AlertDefinition objects. +The wildcard value should be checked for first, if found no other checks of supplied identifiers shall be made. +If a provided identifier does not include a wildcard and does not match an existing AlertIdentity object then this operation shall fail with an UNKNOWN error. + * @param interaction The MAL object representing the interaction in the provider. + * @return The return value of the operation + * @throws org.ccsds.moims.mo.mal.UnknownException One of the supplied identifiers is unknown. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + org.ccsds.moims.mo.mc.structures.ObjectInstancePairList listDefinition(org.ccsds.moims.mo.mal.structures.IdentifierList alertNames, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mal.UnknownException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation addAlert. + * + * @param alertDefDetails The alertDefDetails field shall hold the name and the AlertDefinitionDetails to be added. +The name field must not be the wildcard '*', or empty (an INVALID error shall be returned in this case). +The supplied name must be unique among all AlertIdentity objects for the domain of the provider otherwise a DUPLICATE error shall be raised. +If an error is raised then no new identities and definitions shall be added as a result of this operation call. +If the supplied name matches an existing, but removed, AlertIdentity then that AlertIdentity shall be reused otherwise a new AlertIdentity shall be created. +The provider shall create a new AlertDefinition object and store it, and any new AlertIdentity objects, in the COM archive. + * @param interaction The MAL object representing the interaction in the provider. + * @return The return value of the operation + * @throws org.ccsds.moims.mo.com.DuplicateException One or more of the AlertIdentity objects being added has supplied an alert name that is already in use in the domain. + * @throws org.ccsds.moims.mo.com.InvalidException One of the supplied AlertIdentity objects contains an invalid name. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + org.ccsds.moims.mo.mc.structures.ObjectInstancePairList addAlert(org.ccsds.moims.mo.mc.alert.structures.AlertCreationRequestList alertDefDetails, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.com.DuplicateException, org.ccsds.moims.mo.com.InvalidException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation updateDefinition. + * + * @param alertObjInstIds The alertObjInstIds field shall contain the object instance identifiers of the AlertIdentity objects to be updated. +The supplied object instance identifiers shall match existing identity objects, an UNKNOWN error shall be raised if this is not the case. +If the alertObjInstIds list contains either NULL or '0' an INVALID error shall be raised. + * @param alertDefDetails The alertDefDetails field shall contain the replacement AlertDefinitionDetails. +The two lists shall be ordered the same. +The number of entries in the two lists shall be the same size otherwise an INVALID error shall be returned. +If an error is raised then no definitions shall be updated as a result of this operation call. +The provider shall create a new AlertDefinition object and store it in the COM archive. +The new AlertDefinition object shall be the current AlertDefinition used for the specific AlertIdentity. + * @param interaction The MAL object representing the interaction in the provider. + * @return The return value of the operation + * @throws org.ccsds.moims.mo.com.InvalidException One of the supplied AlertDefinition objects contains an invalid value or the two supplied lists are not the same length. +If the two lists are not the same length then the extra information field shall contain the first index of the element in the largest list which does not have corresponding element in the other list. + * @throws org.ccsds.moims.mo.mal.UnknownException One of the supplied AlertIdentity object instance identifiers is unknown. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + org.ccsds.moims.mo.mal.structures.LongList updateDefinition(org.ccsds.moims.mo.mal.structures.LongList alertObjInstIds, + org.ccsds.moims.mo.mc.alert.structures.AlertDefinitionDetailsList alertDefDetails, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.com.InvalidException, org.ccsds.moims.mo.mal.UnknownException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation removeAlert. + * + * @param alertInstIds The alertInstIds field shall hold the object instance identifiers of the AlertIdentity objects to be removed from the provider. +The list may contain the wildcard value of '0'. +The wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made. +If a provided AlertIdentity object instance identifier does not include a wildcard and does not match an existing AlertIdentity object then this operation shall fail with an UNKNOWN error. +Matched AlertIdentity objects shall not be removed from the COM archive only the list of AlertIdentity objects in the provider. +If an error is raised then no alerts shall be removed as a result of this operation call. +If the operation succeeds then the provider shall not publish AlertEvent events for the deleted AlertIdentity objects anymore. + * @param interaction The MAL object representing the interaction in the provider. + * @throws org.ccsds.moims.mo.mal.UnknownException One of the supplied AlertIdentity object instance identifiers is unknown. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + void removeAlert(org.ccsds.moims.mo.mal.structures.LongList alertInstIds, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mal.UnknownException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Sets the skeleton to be used for creation of publishers. + * + * @param skeleton The skeleton to be used. + */ + void setSkeleton(org.ccsds.moims.mo.mc.alert.provider.AlertSkeleton skeleton); +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/alert/provider/AlertInheritanceSkeleton.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/alert/provider/AlertInheritanceSkeleton.java new file mode 100644 index 00000000..b19a4220 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/alert/provider/AlertInheritanceSkeleton.java @@ -0,0 +1,132 @@ +package org.ccsds.moims.mo.mc.alert.provider; + +/** + * Provider Inheritance skeleton for AlertInheritanceSkeleton service. + */ +public abstract class AlertInheritanceSkeleton implements org.ccsds.moims.mo.mal.provider.MALInteractionHandler, org.ccsds.moims.mo.mc.alert.provider.AlertSkeleton, org.ccsds.moims.mo.mc.alert.provider.AlertHandler { + + /** + * The providerSet field. + */ + private org.ccsds.moims.mo.mal.provider.MALProviderSet providerSet = new org.ccsds.moims.mo.mal.provider.MALProviderSet(org.ccsds.moims.mo.mc.alert.AlertHelper.ALERT_SERVICE); + + /** + * Returns the connection object for this provider. + * + * @return the connection object for this provider + * @throws java.io.IOException if the method was not implemented yet. + */ + public org.ccsds.moims.mo.mal.helpertools.connections.ConnectionProvider getConnection() throws java.io.IOException { + throw new java.io.IOException("This method needs to be overridden!"); + } + + @Override + public void setSkeleton(org.ccsds.moims.mo.mc.alert.provider.AlertSkeleton skeleton) { + // Not used in the inheritance pattern (the skeleton is 'this'); + } + + @Override + public void malInitialize(org.ccsds.moims.mo.mal.provider.MALProvider provider) throws org.ccsds.moims.mo.mal.MALException { + providerSet.addProvider(provider); + } + + @Override + public void malFinalize(org.ccsds.moims.mo.mal.provider.MALProvider provider) throws org.ccsds.moims.mo.mal.MALException { + providerSet.removeProvider(provider); + } + + @Override + public void handleSend(org.ccsds.moims.mo.mal.provider.MALInteraction interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + switch (opNumber) { + default: + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } + + @Override + public void handleSubmit(org.ccsds.moims.mo.mal.provider.MALSubmit interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + try { + switch (opNumber) { + case org.ccsds.moims.mo.mc.alert.AlertServiceInfo._REMOVEALERT_OP_NUMBER: + removeAlert((org.ccsds.moims.mo.mal.structures.LongList) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.LongList()), + interaction); + interaction.sendAcknowledgement(); + break; + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } catch (org.ccsds.moims.mo.mal.MOErrorException error) { + throw new org.ccsds.moims.mo.mal.MALInteractionException(error); + } + } + + @Override + public void handleRequest(org.ccsds.moims.mo.mal.provider.MALRequest interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + try { + switch (opNumber) { + case org.ccsds.moims.mo.mc.alert.AlertServiceInfo._ENABLEGENERATION_OP_NUMBER: + interaction.sendResponse(enableGeneration((body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.Union(Boolean.FALSE)) == null) ? null : ((org.ccsds.moims.mo.mal.structures.Union) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.Union(Boolean.FALSE))).getBooleanValue(), + (org.ccsds.moims.mo.com.structures.InstanceBooleanPairList) body.getBodyElement(1, new org.ccsds.moims.mo.com.structures.InstanceBooleanPairList()), + interaction)); + break; + case org.ccsds.moims.mo.mc.alert.AlertServiceInfo._LISTDEFINITION_OP_NUMBER: + interaction.sendResponse(listDefinition((org.ccsds.moims.mo.mal.structures.IdentifierList) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.IdentifierList()), + interaction)); + break; + case org.ccsds.moims.mo.mc.alert.AlertServiceInfo._ADDALERT_OP_NUMBER: + interaction.sendResponse(addAlert((org.ccsds.moims.mo.mc.alert.structures.AlertCreationRequestList) body.getBodyElement(0, new org.ccsds.moims.mo.mc.alert.structures.AlertCreationRequestList()), + interaction)); + break; + case org.ccsds.moims.mo.mc.alert.AlertServiceInfo._UPDATEDEFINITION_OP_NUMBER: + interaction.sendResponse(updateDefinition((org.ccsds.moims.mo.mal.structures.LongList) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.LongList()), + (org.ccsds.moims.mo.mc.alert.structures.AlertDefinitionDetailsList) body.getBodyElement(1, new org.ccsds.moims.mo.mc.alert.structures.AlertDefinitionDetailsList()), + interaction)); + break; + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } catch (org.ccsds.moims.mo.mal.MOErrorException error) { + throw new org.ccsds.moims.mo.mal.MALInteractionException(error); + } + } + + @Override + public void handleInvoke(org.ccsds.moims.mo.mal.provider.MALInvoke interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + switch (opNumber) { + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } + + @Override + public void handleProgress(org.ccsds.moims.mo.mal.provider.MALProgress interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + switch (opNumber) { + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/alert/provider/AlertSkeleton.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/alert/provider/AlertSkeleton.java new file mode 100644 index 00000000..3d67a915 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/alert/provider/AlertSkeleton.java @@ -0,0 +1,8 @@ +package org.ccsds.moims.mo.mc.alert.provider; + +/** + * The skeleton interface for the Alert service. + */ +public interface AlertSkeleton { + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/alert/provider/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/alert/provider/package-info.java new file mode 100644 index 00000000..b8e46511 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/alert/provider/package-info.java @@ -0,0 +1,4 @@ +/** + * Package containing the provider skeletons for the Alert service. +*/ +package org.ccsds.moims.mo.mc.alert.provider; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/alert/structures/AlertCreationRequest.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/alert/structures/AlertCreationRequest.java new file mode 100644 index 00000000..9f428b95 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/alert/structures/AlertCreationRequest.java @@ -0,0 +1,140 @@ +package org.ccsds.moims.mo.mc.alert.structures; + +/** + * The AlertCreationRequest contains all the fields required when creating + * a new alert in a provider. + */ +public final class AlertCreationRequest implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1125912808521731L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125912808521731L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Alert name. Must not be empty or wildcard value. + */ + private org.ccsds.moims.mo.mal.structures.Identifier name; + + /** + * The alert definition details. + */ + private org.ccsds.moims.mo.mc.alert.structures.AlertDefinitionDetails alertDefDetails; + + /** + * Default constructor for AlertCreationRequest. + * + */ + public AlertCreationRequest() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param name Alert name. Must not be empty or wildcard value. + * @param alertDefDetails The alert definition details. + */ + public AlertCreationRequest(org.ccsds.moims.mo.mal.structures.Identifier name, + org.ccsds.moims.mo.mc.alert.structures.AlertDefinitionDetails alertDefDetails) { + this.name = name; + this.alertDefDetails = alertDefDetails; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mc.alert.structures.AlertCreationRequest(); + } + + /** + * Returns the field name. + * + * @return The field name + */ + public org.ccsds.moims.mo.mal.structures.Identifier getName() { + return name; + } + + /** + * Returns the field alertDefDetails. + * + * @return The field alertDefDetails + */ + public org.ccsds.moims.mo.mc.alert.structures.AlertDefinitionDetails getAlertDefDetails() { + return alertDefDetails; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof AlertCreationRequest) { + AlertCreationRequest other = (AlertCreationRequest) obj; + if (name == null) { + if (other.name != null) { + return false; + } + } else { + if (! name.equals(other.name)) { + return false; + } + } + if (alertDefDetails == null) { + if (other.alertDefDetails != null) { + return false; + } + } else { + if (! alertDefDetails.equals(other.alertDefDetails)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (name != null ? name.hashCode() : 0); + hash = 83 * hash + (alertDefDetails != null ? alertDefDetails.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(AlertCreationRequest: "); + buf.append("name=").append(name); + buf.append(", alertDefDetails=").append(alertDefDetails); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (name == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'name' cannot be null!"); + } + if (alertDefDetails == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'alertDefDetails' cannot be null!"); + } + encoder.encodeIdentifier(name); + encoder.encodeElement(alertDefDetails); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + name = decoder.decodeIdentifier(); + alertDefDetails = (org.ccsds.moims.mo.mc.alert.structures.AlertDefinitionDetails) decoder.decodeElement(new org.ccsds.moims.mo.mc.alert.structures.AlertDefinitionDetails()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/alert/structures/AlertCreationRequestList.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/alert/structures/AlertCreationRequestList.java new file mode 100644 index 00000000..3571428e --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/alert/structures/AlertCreationRequestList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mc.alert.structures; + +/** + * List class for AlertCreationRequest. + */ +public final class AlertCreationRequestList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1125912825298941L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125912825298941L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for AlertCreationRequestList. + * + */ + public AlertCreationRequestList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public AlertCreationRequestList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public AlertCreationRequestList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mc.alert.structures.AlertCreationRequest element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mc.alert.structures.AlertCreationRequest element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new AlertCreationRequestList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mc.alert.structures.AlertCreationRequest(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/alert/structures/AlertDefinitionDetails.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/alert/structures/AlertDefinitionDetails.java new file mode 100644 index 00000000..89a6b0cd --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/alert/structures/AlertDefinitionDetails.java @@ -0,0 +1,206 @@ +package org.ccsds.moims.mo.mc.alert.structures; + +/** + * The AlertDefinitionDetails provides the definition of an alert including + * any argument definitions. + */ +public final class AlertDefinitionDetails implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1125912808521729L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125912808521729L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * The description of the alert. + */ + private String description; + + /** + * Severity of the alert. + */ + private org.ccsds.moims.mo.mc.structures.Severity severity; + + /** + * Controls whether instances of this alert are to be generated. + */ + private Boolean generationEnabled; + + /** + * The list of argument definitions. + */ + private org.ccsds.moims.mo.mc.structures.ArgumentDefinitionDetailsList arguments; + + /** + * Default constructor for AlertDefinitionDetails. + * + */ + public AlertDefinitionDetails() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param description The description of the alert. + * @param severity Severity of the alert. + * @param generationEnabled Controls whether instances of this alert are to be generated. + * @param arguments The list of argument definitions. + */ + public AlertDefinitionDetails(String description, + org.ccsds.moims.mo.mc.structures.Severity severity, + Boolean generationEnabled, + org.ccsds.moims.mo.mc.structures.ArgumentDefinitionDetailsList arguments) { + this.description = description; + this.severity = severity; + this.generationEnabled = generationEnabled; + this.arguments = arguments; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mc.alert.structures.AlertDefinitionDetails(); + } + + /** + * Returns the field description. + * + * @return The field description + */ + public String getDescription() { + return description; + } + + /** + * Returns the field severity. + * + * @return The field severity + */ + public org.ccsds.moims.mo.mc.structures.Severity getSeverity() { + return severity; + } + + /** + * Returns the field generationEnabled. + * + * @return The field generationEnabled + */ + public Boolean getGenerationEnabled() { + return generationEnabled; + } + + /** + * Returns the field arguments. + * + * @return The field arguments + */ + public org.ccsds.moims.mo.mc.structures.ArgumentDefinitionDetailsList getArguments() { + return arguments; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof AlertDefinitionDetails) { + AlertDefinitionDetails other = (AlertDefinitionDetails) obj; + if (description == null) { + if (other.description != null) { + return false; + } + } else { + if (! description.equals(other.description)) { + return false; + } + } + if (severity == null) { + if (other.severity != null) { + return false; + } + } else { + if (! severity.equals(other.severity)) { + return false; + } + } + if (generationEnabled == null) { + if (other.generationEnabled != null) { + return false; + } + } else { + if (! generationEnabled.equals(other.generationEnabled)) { + return false; + } + } + if (arguments == null) { + if (other.arguments != null) { + return false; + } + } else { + if (! arguments.equals(other.arguments)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (description != null ? description.hashCode() : 0); + hash = 83 * hash + (severity != null ? severity.hashCode() : 0); + hash = 83 * hash + (generationEnabled != null ? generationEnabled.hashCode() : 0); + hash = 83 * hash + (arguments != null ? arguments.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(AlertDefinitionDetails: "); + buf.append("description=").append(description); + buf.append(", severity=").append(severity); + buf.append(", generationEnabled=").append(generationEnabled); + buf.append(", arguments=").append(arguments); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (description == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'description' cannot be null!"); + } + if (severity == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'severity' cannot be null!"); + } + if (generationEnabled == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'generationEnabled' cannot be null!"); + } + if (arguments == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'arguments' cannot be null!"); + } + encoder.encodeString(description); + encoder.encodeElement(severity); + encoder.encodeBoolean(generationEnabled); + encoder.encodeElement(arguments); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + description = decoder.decodeString(); + severity = (org.ccsds.moims.mo.mc.structures.Severity) decoder.decodeElement(org.ccsds.moims.mo.mc.structures.Severity.INFORMATIONAL); + generationEnabled = decoder.decodeBoolean(); + arguments = (org.ccsds.moims.mo.mc.structures.ArgumentDefinitionDetailsList) decoder.decodeElement(new org.ccsds.moims.mo.mc.structures.ArgumentDefinitionDetailsList()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/alert/structures/AlertDefinitionDetailsList.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/alert/structures/AlertDefinitionDetailsList.java new file mode 100644 index 00000000..6e8ff946 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/alert/structures/AlertDefinitionDetailsList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mc.alert.structures; + +/** + * List class for AlertDefinitionDetails. + */ +public final class AlertDefinitionDetailsList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1125912825298943L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125912825298943L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for AlertDefinitionDetailsList. + * + */ + public AlertDefinitionDetailsList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public AlertDefinitionDetailsList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public AlertDefinitionDetailsList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mc.alert.structures.AlertDefinitionDetails element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mc.alert.structures.AlertDefinitionDetails element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new AlertDefinitionDetailsList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mc.alert.structures.AlertDefinitionDetails(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/alert/structures/AlertEventDetails.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/alert/structures/AlertEventDetails.java new file mode 100644 index 00000000..922e6bab --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/alert/structures/AlertEventDetails.java @@ -0,0 +1,139 @@ +package org.ccsds.moims.mo.mc.alert.structures; + +/** + * The AlertEventDetails structure holds the details of an instance of an + * alert. + */ +public final class AlertEventDetails implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1125912808521730L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125912808521730L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * List containing the values of the arguments. The ordering of the list matches + * that of the definition. If a value for a particular entry is not being + * supplied, then its position is filled with a NULL value. If no arguments + * are defined, then the complete list is replaced with a NULL. + */ + private org.ccsds.moims.mo.mc.structures.AttributeValueList argumentValues; + + /** + * Optional list of argument definition identifiers. Allows the consumer to + * verify that the correct arguments are being supplied. The ordering of the + * list matches that of the argument list of the alert definition. + */ + private org.ccsds.moims.mo.mal.structures.IdentifierList argumentIds; + + /** + * Default constructor for AlertEventDetails. + * + */ + public AlertEventDetails() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param argumentValues List containing the values of the arguments. The ordering of the list matches that of the definition. If a value for a particular entry is not being supplied, then its position is filled with a NULL value. If no arguments are defined, then the complete list is replaced with a NULL. + * @param argumentIds Optional list of argument definition identifiers. Allows the consumer to verify that the correct arguments are being supplied. The ordering of the list matches that of the argument list of the alert definition. + */ + public AlertEventDetails(org.ccsds.moims.mo.mc.structures.AttributeValueList argumentValues, + org.ccsds.moims.mo.mal.structures.IdentifierList argumentIds) { + this.argumentValues = argumentValues; + this.argumentIds = argumentIds; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mc.alert.structures.AlertEventDetails(); + } + + /** + * Returns the field argumentValues. + * + * @return The field argumentValues + */ + public org.ccsds.moims.mo.mc.structures.AttributeValueList getArgumentValues() { + return argumentValues; + } + + /** + * Returns the field argumentIds. + * + * @return The field argumentIds + */ + public org.ccsds.moims.mo.mal.structures.IdentifierList getArgumentIds() { + return argumentIds; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof AlertEventDetails) { + AlertEventDetails other = (AlertEventDetails) obj; + if (argumentValues == null) { + if (other.argumentValues != null) { + return false; + } + } else { + if (! argumentValues.equals(other.argumentValues)) { + return false; + } + } + if (argumentIds == null) { + if (other.argumentIds != null) { + return false; + } + } else { + if (! argumentIds.equals(other.argumentIds)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (argumentValues != null ? argumentValues.hashCode() : 0); + hash = 83 * hash + (argumentIds != null ? argumentIds.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(AlertEventDetails: "); + buf.append("argumentValues=").append(argumentValues); + buf.append(", argumentIds=").append(argumentIds); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeNullableElement(argumentValues); + encoder.encodeNullableElement(argumentIds); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + argumentValues = (org.ccsds.moims.mo.mc.structures.AttributeValueList) decoder.decodeNullableElement(new org.ccsds.moims.mo.mc.structures.AttributeValueList()); + argumentIds = (org.ccsds.moims.mo.mal.structures.IdentifierList) decoder.decodeNullableElement(new org.ccsds.moims.mo.mal.structures.IdentifierList()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/alert/structures/AlertEventDetailsList.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/alert/structures/AlertEventDetailsList.java new file mode 100644 index 00000000..8dbdf166 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/alert/structures/AlertEventDetailsList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mc.alert.structures; + +/** + * List class for AlertEventDetails. + */ +public final class AlertEventDetailsList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1125912825298942L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125912825298942L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for AlertEventDetailsList. + * + */ + public AlertEventDetailsList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public AlertEventDetailsList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public AlertEventDetailsList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mc.alert.structures.AlertEventDetails element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mc.alert.structures.AlertEventDetails element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new AlertEventDetailsList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mc.alert.structures.AlertEventDetails(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/alert/structures/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/alert/structures/package-info.java new file mode 100644 index 00000000..211f0c2e --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/alert/structures/package-info.java @@ -0,0 +1,4 @@ +/** + * Package containing types defined in the Alert service. +*/ +package org.ccsds.moims.mo.mc.alert.structures; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/CheckHelper.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/CheckHelper.java new file mode 100644 index 00000000..2d8ebe3a --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/CheckHelper.java @@ -0,0 +1,17 @@ +package org.ccsds.moims.mo.mc.check; + +/** + * Helper class for Check service. + */ +public class CheckHelper { + + /** + * Service singleton instance. + */ + public static final org.ccsds.moims.mo.mc.check.CheckServiceInfo CHECK_SERVICE = new org.ccsds.moims.mo.mc.check.CheckServiceInfo(); + + private CheckHelper() { + // Utility class; not meant to be instantiated. + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/CheckServiceInfo.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/CheckServiceInfo.java new file mode 100644 index 00000000..32a7f151 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/CheckServiceInfo.java @@ -0,0 +1,661 @@ +package org.ccsds.moims.mo.mc.check; + +/** + * Helper class for Check service. + */ +public class CheckServiceInfo extends org.ccsds.moims.mo.com.COMService { + + /** + * Service number literal. + */ + public static final int _CHECK_SERVICE_NUMBER = 4; + + /** + * Service number instance. + */ + public static final org.ccsds.moims.mo.mal.structures.UShort CHECK_SERVICE_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_CHECK_SERVICE_NUMBER); + + /** + * Service name constant. + */ + public static final org.ccsds.moims.mo.mal.structures.Identifier CHECK_SERVICE_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("Check"); + + /** + * The service key of this service. + */ + private static final org.ccsds.moims.mo.mal.ServiceKey SERVICE_KEY = new org.ccsds.moims.mo.mal.ServiceKey( + 4, 1, CHECK_SERVICE_NUMBER); + + /** + * Operation number literal for operation GETCURRENTTRANSITIONLIST. + */ + public static final int _GETCURRENTTRANSITIONLIST_OP_NUMBER = 1; + + /** + * Operation number instance for operation GETCURRENTTRANSITIONLIST. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort GETCURRENTTRANSITIONLIST_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_GETCURRENTTRANSITIONLIST_OP_NUMBER); + + /** + * Operation instance for operation GETCURRENTTRANSITIONLIST. + */ + public static final org.ccsds.moims.mo.mal.MALProgressOperation GETCURRENTTRANSITIONLIST_OP = new org.ccsds.moims.mo.mal.MALProgressOperation(SERVICE_KEY, + GETCURRENTTRANSITIONLIST_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("getCurrentTransitionList"), + new org.ccsds.moims.mo.mal.structures.UShort(1), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("filter", true, org.ccsds.moims.mo.mc.check.structures.CheckResultFilter.SHORT_FORM, "The filter field shall contain a set of object instance identifiers for which the check result is required.\nIf the checkFilterViaGroups field is TRUE then the checkFilter field shall contain GroupIdentity object instance identifiers, otherwise the field contains CheckIdentity object instance identifiers.\nThe CheckIdentity objects referenced, either directly or indirectly via groups, by the checkFilter field shall be the CheckIdentity objects to match.\nThe checkFilter field shall support the wildcard value of '0' and shall match all CheckIdentity objects of the provider.\nThe service provider shall check for the wildcard value in the list of object instance identifiers in the checkFilter field first and if found no other checks of supplied CheckIdentity object instance identifiers shall be made.\nIf the parameterFilterViaGroups field is TRUE then the parameterFilter field shall contain GroupIdentity object instance identifiers, otherwise the field contains ParameterIdentity object instance identifiers.\nThe ParameterIdentity objects referenced, either directly or indirectly via groups, by the parameterFilter field shall be the ParameterIdentity objects to match.\nThe parameterFilter field shall support the wildcard value of '0' and shall match all ParameterIdentity objects of the provider.\nThe service provider shall check for the wildcard value in the list of object instance identifiers in the parameterFilter field first and if found no other checks of supplied ParameterIdentity object instance identifiers shall be made.\nIf a referenced GroupIdentity object is unknown then an UNKNOWN error shall be returned.\nIf a requested Group, or the Group objects referenced by that Group, does not contain CheckIdentity objects for the checkFilter or ParameterIdentity for the parameterFilter then an INVALID error shall be returned.\nIf a referenced CheckIdentity object, either directly or indirectly via groups, is unknown then an UNKNOWN error shall be returned.\nIf a referenced ParameterIdentity object, either directly or indirectly via groups, is unknown then an UNKNOWN error shall be returned.\nThe filter field shall also contain a list of CheckState enumerations of which states to filter on.\nThe supplied lists shall be AND'd together to form the complete filter.\nIf a CheckLink object matches the CheckIdentity filter, and the ParameterIdentity filter, and its state matches any of the supplied CheckState enumerations, then its latest CheckResult value shall be returned.\nTo report all checks, the wildcard values may be used in the CheckResultFilter.")}, + new org.ccsds.moims.mo.mal.OperationField[] {}, + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("updateSummaries", true, org.ccsds.moims.mo.mc.check.structures.CheckResultSummaryList.SHORT_FORM, "The returned list shall contain an entry for each matched check returning the object instance identifier and the latest CheckResult for that CheckLink object.")}, + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("responseSummaries", true, org.ccsds.moims.mo.mc.check.structures.CheckResultSummaryList.SHORT_FORM, "The PROGRESS pattern is used to allow the possibly large list of filtered check results to be split into several updates.\nThe size of the lists returned in each update and final response is implementation specific.")}, + "The getCurrentTransitionList operation allows a consumer to obtain the latest result of a number of checks filtering on check state."); + + /** + * Operation number literal for operation GETSUMMARYREPORT. + */ + public static final int _GETSUMMARYREPORT_OP_NUMBER = 2; + + /** + * Operation number instance for operation GETSUMMARYREPORT. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort GETSUMMARYREPORT_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_GETSUMMARYREPORT_OP_NUMBER); + + /** + * Operation instance for operation GETSUMMARYREPORT. + */ + public static final org.ccsds.moims.mo.mal.MALProgressOperation GETSUMMARYREPORT_OP = new org.ccsds.moims.mo.mal.MALProgressOperation(SERVICE_KEY, + GETSUMMARYREPORT_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("getSummaryReport"), + new org.ccsds.moims.mo.mal.structures.UShort(1), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("objInstIds", true, org.ccsds.moims.mo.mal.structures.LongList.SHORT_FORM, "The objInstIds field shall hold one or more CheckIdentity object instance identifiers of which a check report is required.\nA wildcard value of '0' shall report on all checks.\nThe wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made.\nIf a requested check is unknown then an UNKNOWN error shall be returned in the ACKNOWLEDGE message and the operation shall end.")}, + new org.ccsds.moims.mo.mal.OperationField[] {}, + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("updateObjInstIds", true, org.ccsds.moims.mo.mal.structures.Attribute.LONG_SHORT_FORM, "The returned updates and final response shall contain an entry for each requested CheckIdentity.\nThe first part of the update shall be the CheckIdentity object instance identifier.\nThe second part shall be the list of all CheckLink object instance identifiers and CheckResults associated with that CheckIdentity."), + new org.ccsds.moims.mo.mal.OperationField("updateSummaries", true, org.ccsds.moims.mo.mc.check.structures.CheckResultSummaryList.SHORT_FORM, null)}, + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("responseObjInstIds", true, org.ccsds.moims.mo.mal.structures.Attribute.LONG_SHORT_FORM, null), + new org.ccsds.moims.mo.mal.OperationField("responseSummaries", true, org.ccsds.moims.mo.mc.check.structures.CheckResultSummaryList.SHORT_FORM, null)}, + "The getSummaryReport operation allows a consumer to obtain the status of a number of checks and the result of any check evaluations linked to them."); + + /** + * Operation number literal for operation ENABLESERVICE. + */ + public static final int _ENABLESERVICE_OP_NUMBER = 3; + + /** + * Operation number instance for operation ENABLESERVICE. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort ENABLESERVICE_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_ENABLESERVICE_OP_NUMBER); + + /** + * Operation instance for operation ENABLESERVICE. + */ + public static final org.ccsds.moims.mo.mal.MALSubmitOperation ENABLESERVICE_OP = new org.ccsds.moims.mo.mal.MALSubmitOperation(SERVICE_KEY, + ENABLESERVICE_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("enableService"), + new org.ccsds.moims.mo.mal.structures.UShort(2), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("enableService", true, org.ccsds.moims.mo.mal.structures.Attribute.BOOLEAN_SHORT_FORM, "If enableService is set to TRUE the service shall be enabled and evaluation and reporting of check will commence.\nIf enableService is set to FALSE then all evaluation of checks shall be suspended and no check transitions will be reported.\nIf the enableService value matches the current enabled state of the service then no change shall be made and no error reported. Enabling an already enabled service has no effect.")}, + "The enableService operation allows a consumer to globally control whether evaluation of all checks is performed or not.\nIt should be noted that no check reports will be generated if the service provider has been disabled via the enableService operation."); + + /** + * Operation number literal for operation GETSERVICESTATUS. + */ + public static final int _GETSERVICESTATUS_OP_NUMBER = 4; + + /** + * Operation number instance for operation GETSERVICESTATUS. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort GETSERVICESTATUS_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_GETSERVICESTATUS_OP_NUMBER); + + /** + * Operation instance for operation GETSERVICESTATUS. + */ + public static final org.ccsds.moims.mo.mal.MALRequestOperation GETSERVICESTATUS_OP = new org.ccsds.moims.mo.mal.MALRequestOperation(SERVICE_KEY, + GETSERVICESTATUS_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("getServiceStatus"), + new org.ccsds.moims.mo.mal.structures.UShort(2), + new org.ccsds.moims.mo.mal.OperationField[] {}, + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("serviceEnabled", true, org.ccsds.moims.mo.mal.structures.Attribute.BOOLEAN_SHORT_FORM, "The operation shall return TRUE if the service is currently enabled or FALSE if the service is currently disabled.")}, + "The getServiceStatus operation allows a consumer to determine the global check service enabled status."); + + /** + * Operation number literal for operation ENABLECHECK. + */ + public static final int _ENABLECHECK_OP_NUMBER = 5; + + /** + * Operation number instance for operation ENABLECHECK. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort ENABLECHECK_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_ENABLECHECK_OP_NUMBER); + + /** + * Operation instance for operation ENABLECHECK. + */ + public static final org.ccsds.moims.mo.mal.MALSubmitOperation ENABLECHECK_OP = new org.ccsds.moims.mo.mal.MALSubmitOperation(SERVICE_KEY, + ENABLECHECK_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("enableCheck"), + new org.ccsds.moims.mo.mal.structures.UShort(3), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("isGroupIds", true, org.ccsds.moims.mo.mal.structures.Attribute.BOOLEAN_SHORT_FORM, "If the isGroupIds field is TRUE then the enableInstances field shall contain GroupIdentity object instance identifiers, otherwise the field contains CheckLink object instance identifiers.\nThe CheckLink objects referenced, either directly or indirectly via groups, by the enableInstances field shall be the CheckLink objects to match.\nThe id of the enableInstances field shall support the wildcard value of '0' and matches all CheckLink objects of the provider.\nThe service provider shall check for the wildcard value in the list of object instance identifiers in the enableInstances field first and if found no other checks of supplied object instance identifiers shall be made.\nIf the enableInstances field contains a value of TRUE then evaluations of matching CheckLink objects shall be performed, a value of FALSE requests that evaluations will not be performed.\nNo error shall be raised if the enableInstances Boolean value supplied is the same as the current checkEnabled field for a CheckLink object i.e. enabling an already enabled check will not result in an error.\nIf a requested CheckLink or GroupIdentity object is unknown then an UNKNOWN error shall be returned.\nIf a requested Group, or the Group objects referenced by that Group, does not contain CheckLink objects then an INVALID error shall be returned.\nIf an error is raised then no modifications shall be made as a result of this operation call.\nThe provider shall create and store a new CheckLinkDefinition object in the COM archive if the checkEnabled field is changed."), + new org.ccsds.moims.mo.mal.OperationField("enableInstances", true, org.ccsds.moims.mo.com.structures.InstanceBooleanPairList.SHORT_FORM, "If the check is being enabled, and the check is defined as being periodic in the check link definition, then the provider shall generate a check result immediately and start the checking interval from that check.")}, + "The enableCheck operation allows a consumer to control whether evaluation of a set of checks is performed or not. The operation allows the consumer to select the checks directly or indirectly using groups."); + + /** + * Operation number literal for operation TRIGGERCHECK. + */ + public static final int _TRIGGERCHECK_OP_NUMBER = 6; + + /** + * Operation number instance for operation TRIGGERCHECK. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort TRIGGERCHECK_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_TRIGGERCHECK_OP_NUMBER); + + /** + * Operation instance for operation TRIGGERCHECK. + */ + public static final org.ccsds.moims.mo.mal.MALSubmitOperation TRIGGERCHECK_OP = new org.ccsds.moims.mo.mal.MALSubmitOperation(SERVICE_KEY, + TRIGGERCHECK_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("triggerCheck"), + new org.ccsds.moims.mo.mal.structures.UShort(4), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("checkObjInstIds", true, org.ccsds.moims.mo.mal.structures.LongList.SHORT_FORM, "The checkObjInstIds field shall hold a list of CheckIdentity object instance identifiers to trigger the evaluation of all linked checks."), + new org.ccsds.moims.mo.mal.OperationField("linkObjInstIds", true, org.ccsds.moims.mo.mal.structures.LongList.SHORT_FORM, "The linkObjInstIds field shall hold a list of CheckLink object instance identifiers to trigger the evaluation of.\nThe wildcard value of '0' shall be permitted in either list.\nThe wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made.\nIf a requested CheckIdentity or CheckLink object is unknown then an UNKNOWN error shall be returned.\nIf an error is raised then no evaluations shall be made as a result of this operation call.\nEither list may be empty in which case filtering on that aspect, check identity or specific check link, shall be ignored.\nThe two lists shall be combined using 'OR' logic, where a CheckLink is evaluated if the identity of a check is in the first list or if the link is directly listed in the second list.\nTriggering a check shall ignore the nominalTime, nominalCount, violationTime and violationCount fields and requests an immediate evaluation of the checks.\nTriggering a check during a periodic check shall not influence the periodic check (e.g. it does not reset the checkInterval timer, the successive valid samples that passed/violated the check or the maxReportingInterval timer).")}, + "The triggerCheck operation allows a consumer to request the immediate evaluation of a number of checks. Any violations will cause appropriate events to be generated.\nIt should be noted that no check reports will be generated if the service provider has been disabled via the enableService operation."); + + /** + * Operation number literal for operation LISTDEFINITION. + */ + public static final int _LISTDEFINITION_OP_NUMBER = 7; + + /** + * Operation number instance for operation LISTDEFINITION. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort LISTDEFINITION_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_LISTDEFINITION_OP_NUMBER); + + /** + * Operation instance for operation LISTDEFINITION. + */ + public static final org.ccsds.moims.mo.mal.MALRequestOperation LISTDEFINITION_OP = new org.ccsds.moims.mo.mal.MALRequestOperation(SERVICE_KEY, + LISTDEFINITION_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("listDefinition"), + new org.ccsds.moims.mo.mal.structures.UShort(5), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("names", true, org.ccsds.moims.mo.mal.structures.IdentifierList.SHORT_FORM, "The names field shall hold a list of CheckIdentity names to retrieve the CheckIdentity and actual check definition object instance identifiers for.\nThe request may contain the wildcard value of '*' to return all supported check definitions.\nThe wildcard value should be checked for first, if found no other checks of supplied identifiers shall be made.\nIf a provided identifier does not include a wildcard and does not match an existing CheckIdentity object then this operation shall fail with an UNKNOWN error.")}, + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("objInstIds", true, org.ccsds.moims.mo.mc.check.structures.CheckTypedInstanceList.SHORT_FORM, "The response shall contain a list of matching CheckIdentity and actual check definition object instance identifiers and the actual check definition object type.\nThe returned list shall maintain the same order as the submitted list unless the wildcard value was included in the request.")}, + "The listDefinition operation allows a consumer to request the latest object instance identifiers of the CheckIdentity and actual check definition objects for the supported checks of the provider."); + + /** + * Operation number literal for operation LISTCHECKLINKS. + */ + public static final int _LISTCHECKLINKS_OP_NUMBER = 8; + + /** + * Operation number instance for operation LISTCHECKLINKS. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort LISTCHECKLINKS_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_LISTCHECKLINKS_OP_NUMBER); + + /** + * Operation instance for operation LISTCHECKLINKS. + */ + public static final org.ccsds.moims.mo.mal.MALRequestOperation LISTCHECKLINKS_OP = new org.ccsds.moims.mo.mal.MALRequestOperation(SERVICE_KEY, + LISTCHECKLINKS_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("listCheckLinks"), + new org.ccsds.moims.mo.mal.structures.UShort(5), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("checkObjInstIds", true, org.ccsds.moims.mo.mal.structures.LongList.SHORT_FORM, "The checkObjInstIds field shall hold a list of CheckIdentity object instance identifiers to retrieve the CheckLink object instance identifiers for.\nThe request may contain the wildcard value of '0' to return all supported check links.\nThe wildcard value should be checked for first, if found no other checks of supplied identifiers shall be made.\nIf a provided identifier does not include a wildcard and does not match an existing CheckIdentity object then this operation shall fail with an UNKNOWN error.")}, + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("chkLinkObjInstIds", true, org.ccsds.moims.mo.mc.check.structures.CheckLinkSummaryList.SHORT_FORM, "The response shall contain a list of CheckLinkSummary that contain the object instance identifiers of the CheckLink, CheckIdentity, and ParameterIdentity for the matched CheckIdentity objects.")}, + "The listCheckLinks operation allows a consumer to request the object instance identifiers of the CheckLink objects for the checks of the provider."); + + /** + * Operation number literal for operation ADDCHECK. + */ + public static final int _ADDCHECK_OP_NUMBER = 9; + + /** + * Operation number instance for operation ADDCHECK. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort ADDCHECK_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_ADDCHECK_OP_NUMBER); + + /** + * Operation instance for operation ADDCHECK. + */ + public static final org.ccsds.moims.mo.mal.MALRequestOperation ADDCHECK_OP = new org.ccsds.moims.mo.mal.MALRequestOperation(SERVICE_KEY, + ADDCHECK_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("addCheck"), + new org.ccsds.moims.mo.mal.structures.UShort(6), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("checkNames", true, org.ccsds.moims.mo.mal.structures.StringList.SHORT_FORM, "The checkNames field shall hold the names of the checks to be added.\nThe checkNames field must not contain NULL, the wildcard '*', or empty value (an INVALID error shall be returned in this case).\nThe supplied names must be unique among all CheckIdentity objects for the domain of the provider otherwise a DUPLICATE error shall be raised."), + new org.ccsds.moims.mo.mal.OperationField("checkDefDetails", true, null, "The checkDefDetails field shall hold the CheckDefinitionDetails to be added.\nThe two lists shall be ordered the same.\nThe number of entries in the two lists shall be the same size otherwise an INVALID error shall be raised.\nOnly one of nominalTime and nominalCount is permitted to be zero, an INVALID error shall be returned if this is not the case.\nOnly one of violationTime and violationCount is permitted to be zero, an INVALID error shall be returned if this is not the case.\nIf an error is raised then no new identities and definitions shall be added as a result of this operation call.\nIf the supplied name matches an existing, but removed, CheckIdentity then that CheckIdentity shall be reused otherwise a new CheckIdentity shall be created.\nThe provider shall create a new actual check definition object and store it, and any new CheckIdentity objects, in the COM archive.")}, + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("newObjInstIds", true, org.ccsds.moims.mo.mc.structures.ObjectInstancePairList.SHORT_FORM, "The response shall contain the list of object instance identifiers for the CheckIdentity and new actual definition objects.\nThe returned list shall maintain the same order as the submitted definitions.")}, + "The addCheck operation allows a consumer to define one or more checks that do not currently exist.\nThe new CheckIdentity and actual check definition objects are expected to be stored in the COM archive by the provider of the check service."); + + /** + * Operation number literal for operation UPDATEDEFINITION. + */ + public static final int _UPDATEDEFINITION_OP_NUMBER = 10; + + /** + * Operation number instance for operation UPDATEDEFINITION. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort UPDATEDEFINITION_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_UPDATEDEFINITION_OP_NUMBER); + + /** + * Operation instance for operation UPDATEDEFINITION. + */ + public static final org.ccsds.moims.mo.mal.MALRequestOperation UPDATEDEFINITION_OP = new org.ccsds.moims.mo.mal.MALRequestOperation(SERVICE_KEY, + UPDATEDEFINITION_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("updateDefinition"), + new org.ccsds.moims.mo.mal.structures.UShort(6), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("checkInstIds", true, org.ccsds.moims.mo.mal.structures.LongList.SHORT_FORM, "The checkInstIds field shall hold the object instance identifiers of the CheckIdentity objects to be updated.\nIf the checkInstIds list contains either NULL or '0' an INVALID error shall be raised.\nThe supplied object instance identifiers shall match existing identity objects, an UNKNOWN error shall be raised if this is not the case.\nIf the check to be updated is currently being used by a CheckLink object, a REFERENCED error shall be raised."), + new org.ccsds.moims.mo.mal.OperationField("checkDefDetails", true, null, "The checkDefDetails field shall contain the replacement CheckDefinitionDetails.\nThe two lists shall be ordered the same.\nThe number of entries in the two lists shall be the same size otherwise an INVALID error shall be raised.\nOnly one of nominalTime and nominalCount is permitted to be zero, an INVALID error shall be returned if this is not the case.\nOnly one of violationTime and violationCount is permitted to be zero, an INVALID error shall be returned if this is not the case.\nIf an error is raised then no definitions shall be updated as a result of this operation call.\nThe provider shall create new actual check definition objects and store them in the COM archive.\nThe new definition object shall be the current definition used for the specific CheckIdentity.")}, + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("newObjInstIds", true, org.ccsds.moims.mo.mal.structures.LongList.SHORT_FORM, "The response shall contain the list of object instance identifiers for the new check definition objects.\nThe returned list shall maintain the same order as the submitted definitions.")}, + "The updateDefinition operation allows a consumer to update a definition for one or more checks.\nThis differs from deleting an existing check and adding a new definition with the same check name in the fact that the CheckIdentity object is not changed between the two definitions.\nThe replacement definition should be stored in the COM archive by the service provider. The operation does not remove the previous object from the COM archive, merely removes the object from the provider.\nThe operation also cannot be used to update a check definition for a check that is currently being used i.e. has CheckLink objects linked to it. The CheckLink objects should first be removed using removeParameterCheck before calling this operation."); + + /** + * Operation number literal for operation REMOVECHECK. + */ + public static final int _REMOVECHECK_OP_NUMBER = 11; + + /** + * Operation number instance for operation REMOVECHECK. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort REMOVECHECK_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_REMOVECHECK_OP_NUMBER); + + /** + * Operation instance for operation REMOVECHECK. + */ + public static final org.ccsds.moims.mo.mal.MALSubmitOperation REMOVECHECK_OP = new org.ccsds.moims.mo.mal.MALSubmitOperation(SERVICE_KEY, + REMOVECHECK_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("removeCheck"), + new org.ccsds.moims.mo.mal.structures.UShort(6), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("objInstIds", true, org.ccsds.moims.mo.mal.structures.LongList.SHORT_FORM, "The objInstIds field holds the object instance identifiers of the CheckIdentity objects to be removed from the provider.\nThe list may contain the wildcard value of '0'.\nThe wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made.\nIf a provided CheckIdentity instance identifier does not include a wildcard and does not match an existing check then this operation shall fail with an UNKNOWN error.\nIf any of the matched CheckIdentity objects are being referenced by a CheckLink object then a REFERENCED error shall be returned.\nMatched CheckIdentity objects shall not be removed from the COM archive only the list of available CheckIdentity objects in the provider.\nIf an error is raised then no CheckIdentity objects shall be removed as a result of this operation call.\nIf the operation succeeds then the provider shall not allow new CheckLink objects to be created for the matched CheckIdentity anymore, existing CheckLink objects are not affected.")}, + "The removeCheck operation allows a consumer to remove one or more definitions from the list of checks supported by the check provider.\nThe operation does not remove the CheckIdentity and actual check definition objects from the COM archive, merely removes the objects from the provider. This permits existing CheckLink objects to continue to reference the correct check object in the COM archive."); + + /** + * Operation number literal for operation ADDPARAMETERCHECK. + */ + public static final int _ADDPARAMETERCHECK_OP_NUMBER = 12; + + /** + * Operation number instance for operation ADDPARAMETERCHECK. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort ADDPARAMETERCHECK_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_ADDPARAMETERCHECK_OP_NUMBER); + + /** + * Operation instance for operation ADDPARAMETERCHECK. + */ + public static final org.ccsds.moims.mo.mal.MALRequestOperation ADDPARAMETERCHECK_OP = new org.ccsds.moims.mo.mal.MALRequestOperation(SERVICE_KEY, + ADDPARAMETERCHECK_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("addParameterCheck"), + new org.ccsds.moims.mo.mal.structures.UShort(7), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("linkDetails", true, org.ccsds.moims.mo.mc.check.structures.CheckLinkDetailsList.SHORT_FORM, "The linkDetails field shall contain the new CheckLink details.\nThe linkRefs field shall contain the related and source links of the new CheckLink.\nThe related field of the ObjectDetails shall reference the object instance identifier of the CheckIdentity being used by the new CheckLink.\nThe source field of the ObjectDetails shall reference the ParameterIdentity that the check is being applied to.\nThe two lists must be ordered the same so that the correct ObjectDetails for a specific CheckLink can be determined."), + new org.ccsds.moims.mo.mal.OperationField("linkRefs", true, org.ccsds.moims.mo.com.structures.ObjectDetailsList.SHORT_FORM, "If the requested CheckIdentity and ParameterIdentity do not exist then an UNKNOWN error shall be returned.\nThe number of entries in the two lists shall be the same size otherwise an INVALID error shall be raised.\nIf an interval that is not supported by the provider is requested then an INVALID error shall be returned.\nIf the checkInterval is not '0' and the checkOnChange Value is TRUE, then an INVALID error shall be returned.\nThe provider shall create new CheckLink and CheckLinkDefinition objects for each pair and store them in the COM archive.")}, + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("newObjInstIds", true, org.ccsds.moims.mo.mc.structures.ObjectInstancePairList.SHORT_FORM, "The response shall contain the list of object instance identifiers for the new CheckLink and CheckLinkDefinition objects.\nThe returned list shall maintain the same order as the submitted links.")}, + "The addParameterCheck operation allows a consumer to request that one or more parameters/check combinations are added to the list of checks that are being evaluated.\nThe new CheckLink and CheckLinkDefinition objects are expected to be stored in the COM archive by the provider of the check service."); + + /** + * Operation number literal for operation REMOVEPARAMETERCHECK. + */ + public static final int _REMOVEPARAMETERCHECK_OP_NUMBER = 13; + + /** + * Operation number instance for operation REMOVEPARAMETERCHECK. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort REMOVEPARAMETERCHECK_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_REMOVEPARAMETERCHECK_OP_NUMBER); + + /** + * Operation instance for operation REMOVEPARAMETERCHECK. + */ + public static final org.ccsds.moims.mo.mal.MALSubmitOperation REMOVEPARAMETERCHECK_OP = new org.ccsds.moims.mo.mal.MALSubmitOperation(SERVICE_KEY, + REMOVEPARAMETERCHECK_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("removeParameterCheck"), + new org.ccsds.moims.mo.mal.structures.UShort(7), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("objInstIds", true, org.ccsds.moims.mo.mal.structures.LongList.SHORT_FORM, "The objInstIds field holds the object instance identifiers of the CheckLink objects to be removed from the provider.\nThe list may contain the wildcard value of '0'.\nThe wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made.\nIf a provided CheckLink instance identifier does not include a wildcard and does not match an existing link then this operation shall fail with an UNKNOWN error.\nMatched CheckLink objects shall not be removed from the COM archive only the list of available CheckLink objects in the provider.\nIf an error is raised then no CheckLink objects shall be removed as a result of this operation call.\nIf the operation succeeds then the provider shall not evaluate those parameter/check definition combinations for the deleted CheckLink objects anymore.")}, + "The removeParameterCheck operation allows a consumer to remove one or more parameters from the list of parameters being checked by the check provider.\nThe operation does not remove the CheckLink or CheckLinkDefinition objects from the COM archive, merely removes them from the provider. This permits existing CheckTransition events to continue to reference the correct check link/definition objects in the COM archive."); + + /** + * Area elements. + */ + public static final org.ccsds.moims.mo.mal.structures.Element[] CHECK_SERVICE_ELEMENTS = {}; + + /** + * The set of operations for this service. + */ + public static final org.ccsds.moims.mo.mal.MALOperation[] OPERATIONS = new org.ccsds.moims.mo.mal.MALOperation[]{GETCURRENTTRANSITIONLIST_OP, + GETSUMMARYREPORT_OP, + ENABLESERVICE_OP, + GETSERVICESTATUS_OP, + ENABLECHECK_OP, + TRIGGERCHECK_OP, + LISTDEFINITION_OP, + LISTCHECKLINKS_OP, + ADDCHECK_OP, + UPDATEDEFINITION_OP, + REMOVECHECK_OP, + ADDPARAMETERCHECK_OP, + REMOVEPARAMETERCHECK_OP}; + + /** + * Literal for object CHECKIDENTITY. + */ + @Deprecated + public static final int _CHECKIDENTITY_OBJECT_NUMBER = 1; + + /** + * Instance for object CHECKIDENTITY. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.UShort CHECKIDENTITY_OBJECT_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_CHECKIDENTITY_OBJECT_NUMBER); + + /** + * Object name constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.Identifier CHECKIDENTITY_OBJECT_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("CheckIdentity"); + + /** + * Object type constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.com.structures.ObjectType CHECKIDENTITY_OBJECT_TYPE = new org.ccsds.moims.mo.com.structures.ObjectType(new org.ccsds.moims.mo.mal.structures.UShort(4), CHECK_SERVICE_NUMBER, new org.ccsds.moims.mo.mal.structures.UOctet(1), CHECKIDENTITY_OBJECT_NUMBER); + + /** + * Object instance. + */ + @Deprecated + public static org.ccsds.moims.mo.com.COMObject CHECKIDENTITY_OBJECT = new org.ccsds.moims.mo.com.COMObject(CHECKIDENTITY_OBJECT_TYPE, CHECKIDENTITY_OBJECT_NAME, org.ccsds.moims.mo.mal.structures.Attribute.IDENTIFIER_SHORT_FORM, false, null, false, null, false); + + /** + * Literal for object CHECKLINK. + */ + @Deprecated + public static final int _CHECKLINK_OBJECT_NUMBER = 2; + + /** + * Instance for object CHECKLINK. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.UShort CHECKLINK_OBJECT_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_CHECKLINK_OBJECT_NUMBER); + + /** + * Object name constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.Identifier CHECKLINK_OBJECT_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("CheckLink"); + + /** + * Object type constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.com.structures.ObjectType CHECKLINK_OBJECT_TYPE = new org.ccsds.moims.mo.com.structures.ObjectType(new org.ccsds.moims.mo.mal.structures.UShort(4), CHECK_SERVICE_NUMBER, new org.ccsds.moims.mo.mal.structures.UOctet(1), CHECKLINK_OBJECT_NUMBER); + + /** + * Object instance. + */ + @Deprecated + public static org.ccsds.moims.mo.com.COMObject CHECKLINK_OBJECT = new org.ccsds.moims.mo.com.COMObject(CHECKLINK_OBJECT_TYPE, CHECKLINK_OBJECT_NAME, null, true, org.ccsds.moims.mo.mc.check.CheckServiceInfo.CHECKIDENTITY_OBJECT_TYPE, true, org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo.PARAMETERIDENTITY_OBJECT_TYPE, false); + + /** + * Literal for object CHECKLINKDEFINITION. + */ + @Deprecated + public static final int _CHECKLINKDEFINITION_OBJECT_NUMBER = 3; + + /** + * Instance for object CHECKLINKDEFINITION. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.UShort CHECKLINKDEFINITION_OBJECT_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_CHECKLINKDEFINITION_OBJECT_NUMBER); + + /** + * Object name constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.Identifier CHECKLINKDEFINITION_OBJECT_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("CheckLinkDefinition"); + + /** + * Object type constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.com.structures.ObjectType CHECKLINKDEFINITION_OBJECT_TYPE = new org.ccsds.moims.mo.com.structures.ObjectType(new org.ccsds.moims.mo.mal.structures.UShort(4), CHECK_SERVICE_NUMBER, new org.ccsds.moims.mo.mal.structures.UOctet(1), CHECKLINKDEFINITION_OBJECT_NUMBER); + + /** + * Object instance. + */ + @Deprecated + public static org.ccsds.moims.mo.com.COMObject CHECKLINKDEFINITION_OBJECT = new org.ccsds.moims.mo.com.COMObject(CHECKLINKDEFINITION_OBJECT_TYPE, CHECKLINKDEFINITION_OBJECT_NAME, org.ccsds.moims.mo.mc.check.structures.CheckLinkDetails.SHORT_FORM, true, org.ccsds.moims.mo.mc.check.CheckServiceInfo.CHECKLINK_OBJECT_TYPE, false, null, false); + + /** + * Literal for object CONSTANTCHECK. + */ + @Deprecated + public static final int _CONSTANTCHECK_OBJECT_NUMBER = 5; + + /** + * Instance for object CONSTANTCHECK. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.UShort CONSTANTCHECK_OBJECT_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_CONSTANTCHECK_OBJECT_NUMBER); + + /** + * Object name constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.Identifier CONSTANTCHECK_OBJECT_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("ConstantCheck"); + + /** + * Object type constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.com.structures.ObjectType CONSTANTCHECK_OBJECT_TYPE = new org.ccsds.moims.mo.com.structures.ObjectType(new org.ccsds.moims.mo.mal.structures.UShort(4), CHECK_SERVICE_NUMBER, new org.ccsds.moims.mo.mal.structures.UOctet(1), CONSTANTCHECK_OBJECT_NUMBER); + + /** + * Object instance. + */ + @Deprecated + public static org.ccsds.moims.mo.com.COMObject CONSTANTCHECK_OBJECT = new org.ccsds.moims.mo.com.COMObject(CONSTANTCHECK_OBJECT_TYPE, CONSTANTCHECK_OBJECT_NAME, org.ccsds.moims.mo.mc.check.structures.ConstantCheckDefinition.SHORT_FORM, true, org.ccsds.moims.mo.mc.check.CheckServiceInfo.CHECKIDENTITY_OBJECT_TYPE, false, null, false); + + /** + * Literal for object REFERENCECHECK. + */ + @Deprecated + public static final int _REFERENCECHECK_OBJECT_NUMBER = 6; + + /** + * Instance for object REFERENCECHECK. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.UShort REFERENCECHECK_OBJECT_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_REFERENCECHECK_OBJECT_NUMBER); + + /** + * Object name constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.Identifier REFERENCECHECK_OBJECT_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("ReferenceCheck"); + + /** + * Object type constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.com.structures.ObjectType REFERENCECHECK_OBJECT_TYPE = new org.ccsds.moims.mo.com.structures.ObjectType(new org.ccsds.moims.mo.mal.structures.UShort(4), CHECK_SERVICE_NUMBER, new org.ccsds.moims.mo.mal.structures.UOctet(1), REFERENCECHECK_OBJECT_NUMBER); + + /** + * Object instance. + */ + @Deprecated + public static org.ccsds.moims.mo.com.COMObject REFERENCECHECK_OBJECT = new org.ccsds.moims.mo.com.COMObject(REFERENCECHECK_OBJECT_TYPE, REFERENCECHECK_OBJECT_NAME, org.ccsds.moims.mo.mc.check.structures.ReferenceCheckDefinition.SHORT_FORM, true, org.ccsds.moims.mo.mc.check.CheckServiceInfo.CHECKIDENTITY_OBJECT_TYPE, false, null, false); + + /** + * Literal for object DELTACHECK. + */ + @Deprecated + public static final int _DELTACHECK_OBJECT_NUMBER = 7; + + /** + * Instance for object DELTACHECK. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.UShort DELTACHECK_OBJECT_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_DELTACHECK_OBJECT_NUMBER); + + /** + * Object name constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.Identifier DELTACHECK_OBJECT_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("DeltaCheck"); + + /** + * Object type constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.com.structures.ObjectType DELTACHECK_OBJECT_TYPE = new org.ccsds.moims.mo.com.structures.ObjectType(new org.ccsds.moims.mo.mal.structures.UShort(4), CHECK_SERVICE_NUMBER, new org.ccsds.moims.mo.mal.structures.UOctet(1), DELTACHECK_OBJECT_NUMBER); + + /** + * Object instance. + */ + @Deprecated + public static org.ccsds.moims.mo.com.COMObject DELTACHECK_OBJECT = new org.ccsds.moims.mo.com.COMObject(DELTACHECK_OBJECT_TYPE, DELTACHECK_OBJECT_NAME, org.ccsds.moims.mo.mc.check.structures.DeltaCheckDefinition.SHORT_FORM, true, org.ccsds.moims.mo.mc.check.CheckServiceInfo.CHECKIDENTITY_OBJECT_TYPE, false, null, false); + + /** + * Literal for object LIMITCHECK. + */ + @Deprecated + public static final int _LIMITCHECK_OBJECT_NUMBER = 8; + + /** + * Instance for object LIMITCHECK. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.UShort LIMITCHECK_OBJECT_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_LIMITCHECK_OBJECT_NUMBER); + + /** + * Object name constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.Identifier LIMITCHECK_OBJECT_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("LimitCheck"); + + /** + * Object type constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.com.structures.ObjectType LIMITCHECK_OBJECT_TYPE = new org.ccsds.moims.mo.com.structures.ObjectType(new org.ccsds.moims.mo.mal.structures.UShort(4), CHECK_SERVICE_NUMBER, new org.ccsds.moims.mo.mal.structures.UOctet(1), LIMITCHECK_OBJECT_NUMBER); + + /** + * Object instance. + */ + @Deprecated + public static org.ccsds.moims.mo.com.COMObject LIMITCHECK_OBJECT = new org.ccsds.moims.mo.com.COMObject(LIMITCHECK_OBJECT_TYPE, LIMITCHECK_OBJECT_NAME, org.ccsds.moims.mo.mc.check.structures.LimitCheckDefinition.SHORT_FORM, true, org.ccsds.moims.mo.mc.check.CheckServiceInfo.CHECKIDENTITY_OBJECT_TYPE, false, null, false); + + /** + * Literal for object COMPOUNDCHECK. + */ + @Deprecated + public static final int _COMPOUNDCHECK_OBJECT_NUMBER = 9; + + /** + * Instance for object COMPOUNDCHECK. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.UShort COMPOUNDCHECK_OBJECT_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_COMPOUNDCHECK_OBJECT_NUMBER); + + /** + * Object name constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.Identifier COMPOUNDCHECK_OBJECT_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("CompoundCheck"); + + /** + * Object type constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.com.structures.ObjectType COMPOUNDCHECK_OBJECT_TYPE = new org.ccsds.moims.mo.com.structures.ObjectType(new org.ccsds.moims.mo.mal.structures.UShort(4), CHECK_SERVICE_NUMBER, new org.ccsds.moims.mo.mal.structures.UOctet(1), COMPOUNDCHECK_OBJECT_NUMBER); + + /** + * Object instance. + */ + @Deprecated + public static org.ccsds.moims.mo.com.COMObject COMPOUNDCHECK_OBJECT = new org.ccsds.moims.mo.com.COMObject(COMPOUNDCHECK_OBJECT_TYPE, COMPOUNDCHECK_OBJECT_NAME, org.ccsds.moims.mo.mc.check.structures.CompoundCheckDefinition.SHORT_FORM, true, org.ccsds.moims.mo.mc.check.CheckServiceInfo.CHECKIDENTITY_OBJECT_TYPE, false, null, false); + + /** + * Literal for object CHECKTRANSITION. + */ + @Deprecated + public static final int _CHECKTRANSITION_OBJECT_NUMBER = 4; + + /** + * Instance for object CHECKTRANSITION. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.UShort CHECKTRANSITION_OBJECT_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_CHECKTRANSITION_OBJECT_NUMBER); + + /** + * Object name constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.Identifier CHECKTRANSITION_OBJECT_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("CheckTransition"); + + /** + * Object type constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.com.structures.ObjectType CHECKTRANSITION_OBJECT_TYPE = new org.ccsds.moims.mo.com.structures.ObjectType(new org.ccsds.moims.mo.mal.structures.UShort(4), CHECK_SERVICE_NUMBER, new org.ccsds.moims.mo.mal.structures.UOctet(1), CHECKTRANSITION_OBJECT_NUMBER); + + /** + * Object instance. + */ + @Deprecated + public static org.ccsds.moims.mo.com.COMObject CHECKTRANSITION_OBJECT = new org.ccsds.moims.mo.com.COMObject(CHECKTRANSITION_OBJECT_TYPE, CHECKTRANSITION_OBJECT_NAME, org.ccsds.moims.mo.mc.check.structures.CheckResult.SHORT_FORM, true, org.ccsds.moims.mo.mc.check.CheckServiceInfo.CHECKLINKDEFINITION_OBJECT_TYPE, true, null, true); + + /** + * Object instance. + */ + public static final org.ccsds.moims.mo.com.COMObject[] COM_OBJECTS = { + CHECKIDENTITY_OBJECT, + CHECKLINK_OBJECT, + CHECKLINKDEFINITION_OBJECT, + CONSTANTCHECK_OBJECT, + REFERENCECHECK_OBJECT, + DELTACHECK_OBJECT, + LIMITCHECK_OBJECT, + COMPOUNDCHECK_OBJECT, + CHECKTRANSITION_OBJECT,}; + + /** + * Creates an instance of the Check ServiceInfo. + * + */ + public CheckServiceInfo() { + super(SERVICE_KEY, CHECK_SERVICE_NAME, CHECK_SERVICE_ELEMENTS, OPERATIONS, COM_OBJECTS); + } + + @Override + public org.ccsds.moims.mo.mal.MALArea getArea() { + return org.ccsds.moims.mo.mc.MCHelper.MC_AREA; + } + + @Override + public org.ccsds.moims.mo.mal.MOErrorException generateMOError(int errorNumber, + Object extraInfo) { + switch (errorNumber) { + case 70020: + return new org.ccsds.moims.mo.mc.ReadonlyException(extraInfo); + case 70021: + return new org.ccsds.moims.mo.mc.ReferencedException(extraInfo); + } + return null; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/consumer/CheckAdapter.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/consumer/CheckAdapter.java new file mode 100644 index 00000000..b1c34ac9 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/consumer/CheckAdapter.java @@ -0,0 +1,660 @@ +package org.ccsds.moims.mo.mc.check.consumer; + +/** + * Consumer adapter for Check service. + */ +public abstract class CheckAdapter extends org.ccsds.moims.mo.mal.consumer.MALInteractionAdapter { + + /** + * Called by the MAL when a PROGRESS acknowledgement is received from a provider + * for the operation getCurrentTransitionList. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void getCurrentTransitionListAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PROGRESS update is received from a provider for + * the operation getCurrentTransitionList. + * + * @param msgHeader msgHeader The header of the received message + * @param updateSummaries The returned list shall contain an entry for each matched check returning the object instance identifier and the latest CheckResult for that CheckLink object. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void getCurrentTransitionListUpdateReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mc.check.structures.CheckResultSummaryList updateSummaries, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PROGRESS response is received from a provider + * for the operation getCurrentTransitionList. + * + * @param msgHeader msgHeader The header of the received message + * @param responseSummaries The PROGRESS pattern is used to allow the possibly large list of filtered check results to be split into several updates. +The size of the lists returned in each update and final response is implementation specific. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void getCurrentTransitionListResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mc.check.structures.CheckResultSummaryList responseSummaries, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PROGRESS acknowledgement error is received from + * a provider for the operation getCurrentTransitionList. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void getCurrentTransitionListAckErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PROGRESS update error is received from a provider + * for the operation getCurrentTransitionList. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void getCurrentTransitionListUpdateErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PROGRESS response error is received from a provider + * for the operation getCurrentTransitionList. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void getCurrentTransitionListResponseErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PROGRESS acknowledgement is received from a provider + * for the operation getSummaryReport. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void getSummaryReportAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PROGRESS update is received from a provider for + * the operation getSummaryReport. + * + * @param msgHeader msgHeader The header of the received message + * @param updateObjInstIds The returned updates and final response shall contain an entry for each requested CheckIdentity. +The first part of the update shall be the CheckIdentity object instance identifier. +The second part shall be the list of all CheckLink object instance identifiers and CheckResults associated with that CheckIdentity. + * @param updateSummaries updateSummaries Argument number 1 as defined by the service operation + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void getSummaryReportUpdateReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + Long updateObjInstIds, + org.ccsds.moims.mo.mc.check.structures.CheckResultSummaryList updateSummaries, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PROGRESS response is received from a provider + * for the operation getSummaryReport. + * + * @param msgHeader msgHeader The header of the received message + * @param responseObjInstIds responseObjInstIds Argument number 0 as defined by the service operation + * @param responseSummaries responseSummaries Argument number 1 as defined by the service operation + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void getSummaryReportResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + Long responseObjInstIds, + org.ccsds.moims.mo.mc.check.structures.CheckResultSummaryList responseSummaries, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PROGRESS acknowledgement error is received from + * a provider for the operation getSummaryReport. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void getSummaryReportAckErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PROGRESS update error is received from a provider + * for the operation getSummaryReport. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void getSummaryReportUpdateErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PROGRESS response error is received from a provider + * for the operation getSummaryReport. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void getSummaryReportResponseErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a SUBMIT acknowledgement is received from a provider + * for the operation enableService. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void enableServiceAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a SUBMIT acknowledgement error is received from + * a provider for the operation enableService. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void enableServiceErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response is received from a provider for + * the operation getServiceStatus. + * + * @param msgHeader msgHeader The header of the received message + * @param serviceEnabled The operation shall return TRUE if the service is currently enabled or FALSE if the service is currently disabled. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void getServiceStatusResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + Boolean serviceEnabled, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response error is received from a provider + * for the operation getServiceStatus. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void getServiceStatusErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a SUBMIT acknowledgement is received from a provider + * for the operation enableCheck. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void enableCheckAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a SUBMIT acknowledgement error is received from + * a provider for the operation enableCheck. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void enableCheckErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a SUBMIT acknowledgement is received from a provider + * for the operation triggerCheck. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void triggerCheckAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a SUBMIT acknowledgement error is received from + * a provider for the operation triggerCheck. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void triggerCheckErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response is received from a provider for + * the operation listDefinition. + * + * @param msgHeader msgHeader The header of the received message + * @param objInstIds The response shall contain a list of matching CheckIdentity and actual check definition object instance identifiers and the actual check definition object type. +The returned list shall maintain the same order as the submitted list unless the wildcard value was included in the request. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void listDefinitionResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mc.check.structures.CheckTypedInstanceList objInstIds, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response error is received from a provider + * for the operation listDefinition. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void listDefinitionErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response is received from a provider for + * the operation listCheckLinks. + * + * @param msgHeader msgHeader The header of the received message + * @param chkLinkObjInstIds The response shall contain a list of CheckLinkSummary that contain the object instance identifiers of the CheckLink, CheckIdentity, and ParameterIdentity for the matched CheckIdentity objects. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void listCheckLinksResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mc.check.structures.CheckLinkSummaryList chkLinkObjInstIds, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response error is received from a provider + * for the operation listCheckLinks. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void listCheckLinksErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response is received from a provider for + * the operation addCheck. + * + * @param msgHeader msgHeader The header of the received message + * @param newObjInstIds The response shall contain the list of object instance identifiers for the CheckIdentity and new actual definition objects. +The returned list shall maintain the same order as the submitted definitions. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void addCheckResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mc.structures.ObjectInstancePairList newObjInstIds, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response error is received from a provider + * for the operation addCheck. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void addCheckErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response is received from a provider for + * the operation updateDefinition. + * + * @param msgHeader msgHeader The header of the received message + * @param newObjInstIds The response shall contain the list of object instance identifiers for the new check definition objects. +The returned list shall maintain the same order as the submitted definitions. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void updateDefinitionResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.structures.LongList newObjInstIds, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response error is received from a provider + * for the operation updateDefinition. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void updateDefinitionErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a SUBMIT acknowledgement is received from a provider + * for the operation removeCheck. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void removeCheckAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a SUBMIT acknowledgement error is received from + * a provider for the operation removeCheck. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void removeCheckErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response is received from a provider for + * the operation addParameterCheck. + * + * @param msgHeader msgHeader The header of the received message + * @param newObjInstIds The response shall contain the list of object instance identifiers for the new CheckLink and CheckLinkDefinition objects. +The returned list shall maintain the same order as the submitted links. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void addParameterCheckResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mc.structures.ObjectInstancePairList newObjInstIds, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response error is received from a provider + * for the operation addParameterCheck. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void addParameterCheckErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a SUBMIT acknowledgement is received from a provider + * for the operation removeParameterCheck. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void removeParameterCheckAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a SUBMIT acknowledgement error is received from + * a provider for the operation removeParameterCheck. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void removeParameterCheckErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + @Override + public final void submitAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mc.check.CheckServiceInfo._ENABLESERVICE_OP_NUMBER: + enableServiceAckReceived(msgHeader, qosProperties); + break; + case org.ccsds.moims.mo.mc.check.CheckServiceInfo._ENABLECHECK_OP_NUMBER: + enableCheckAckReceived(msgHeader, qosProperties); + break; + case org.ccsds.moims.mo.mc.check.CheckServiceInfo._TRIGGERCHECK_OP_NUMBER: + triggerCheckAckReceived(msgHeader, qosProperties); + break; + case org.ccsds.moims.mo.mc.check.CheckServiceInfo._REMOVECHECK_OP_NUMBER: + removeCheckAckReceived(msgHeader, qosProperties); + break; + case org.ccsds.moims.mo.mc.check.CheckServiceInfo._REMOVEPARAMETERCHECK_OP_NUMBER: + removeParameterCheckAckReceived(msgHeader, qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void submitErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALErrorBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mc.check.CheckServiceInfo._ENABLESERVICE_OP_NUMBER: + enableServiceErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mc.check.CheckServiceInfo._ENABLECHECK_OP_NUMBER: + enableCheckErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mc.check.CheckServiceInfo._TRIGGERCHECK_OP_NUMBER: + triggerCheckErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mc.check.CheckServiceInfo._REMOVECHECK_OP_NUMBER: + removeCheckErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mc.check.CheckServiceInfo._REMOVEPARAMETERCHECK_OP_NUMBER: + removeParameterCheckErrorReceived(msgHeader, body.getError(), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void requestResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALMessageBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mc.check.CheckServiceInfo._GETSERVICESTATUS_OP_NUMBER: + getServiceStatusResponseReceived(msgHeader, + (body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.Union(Boolean.FALSE)) == null) ? null : ((org.ccsds.moims.mo.mal.structures.Union) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.Union(Boolean.FALSE))).getBooleanValue(), qosProperties); + break; + case org.ccsds.moims.mo.mc.check.CheckServiceInfo._LISTDEFINITION_OP_NUMBER: + listDefinitionResponseReceived(msgHeader, + (org.ccsds.moims.mo.mc.check.structures.CheckTypedInstanceList) body.getBodyElement(0, new org.ccsds.moims.mo.mc.check.structures.CheckTypedInstanceList()), qosProperties); + break; + case org.ccsds.moims.mo.mc.check.CheckServiceInfo._LISTCHECKLINKS_OP_NUMBER: + listCheckLinksResponseReceived(msgHeader, + (org.ccsds.moims.mo.mc.check.structures.CheckLinkSummaryList) body.getBodyElement(0, new org.ccsds.moims.mo.mc.check.structures.CheckLinkSummaryList()), qosProperties); + break; + case org.ccsds.moims.mo.mc.check.CheckServiceInfo._ADDCHECK_OP_NUMBER: + addCheckResponseReceived(msgHeader, + (org.ccsds.moims.mo.mc.structures.ObjectInstancePairList) body.getBodyElement(0, new org.ccsds.moims.mo.mc.structures.ObjectInstancePairList()), qosProperties); + break; + case org.ccsds.moims.mo.mc.check.CheckServiceInfo._UPDATEDEFINITION_OP_NUMBER: + updateDefinitionResponseReceived(msgHeader, + (org.ccsds.moims.mo.mal.structures.LongList) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.LongList()), qosProperties); + break; + case org.ccsds.moims.mo.mc.check.CheckServiceInfo._ADDPARAMETERCHECK_OP_NUMBER: + addParameterCheckResponseReceived(msgHeader, + (org.ccsds.moims.mo.mc.structures.ObjectInstancePairList) body.getBodyElement(0, new org.ccsds.moims.mo.mc.structures.ObjectInstancePairList()), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void requestErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALErrorBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mc.check.CheckServiceInfo._GETSERVICESTATUS_OP_NUMBER: + getServiceStatusErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mc.check.CheckServiceInfo._LISTDEFINITION_OP_NUMBER: + listDefinitionErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mc.check.CheckServiceInfo._LISTCHECKLINKS_OP_NUMBER: + listCheckLinksErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mc.check.CheckServiceInfo._ADDCHECK_OP_NUMBER: + addCheckErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mc.check.CheckServiceInfo._UPDATEDEFINITION_OP_NUMBER: + updateDefinitionErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mc.check.CheckServiceInfo._ADDPARAMETERCHECK_OP_NUMBER: + addParameterCheckErrorReceived(msgHeader, body.getError(), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void progressAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALMessageBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mc.check.CheckServiceInfo._GETCURRENTTRANSITIONLIST_OP_NUMBER: + getCurrentTransitionListAckReceived(msgHeader, qosProperties); + break; + case org.ccsds.moims.mo.mc.check.CheckServiceInfo._GETSUMMARYREPORT_OP_NUMBER: + getSummaryReportAckReceived(msgHeader, qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void progressAckErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALErrorBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mc.check.CheckServiceInfo._GETCURRENTTRANSITIONLIST_OP_NUMBER: + getCurrentTransitionListAckErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mc.check.CheckServiceInfo._GETSUMMARYREPORT_OP_NUMBER: + getSummaryReportAckErrorReceived(msgHeader, body.getError(), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void progressUpdateReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALMessageBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mc.check.CheckServiceInfo._GETCURRENTTRANSITIONLIST_OP_NUMBER: + getCurrentTransitionListUpdateReceived(msgHeader, + (org.ccsds.moims.mo.mc.check.structures.CheckResultSummaryList) body.getBodyElement(0, new org.ccsds.moims.mo.mc.check.structures.CheckResultSummaryList()), qosProperties); + break; + case org.ccsds.moims.mo.mc.check.CheckServiceInfo._GETSUMMARYREPORT_OP_NUMBER: + getSummaryReportUpdateReceived(msgHeader, + (body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.Union(Long.MAX_VALUE)) == null) ? null : ((org.ccsds.moims.mo.mal.structures.Union) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.Union(Long.MAX_VALUE))).getLongValue(), + (org.ccsds.moims.mo.mc.check.structures.CheckResultSummaryList) body.getBodyElement(1, new org.ccsds.moims.mo.mc.check.structures.CheckResultSummaryList()), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void progressUpdateErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALErrorBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mc.check.CheckServiceInfo._GETCURRENTTRANSITIONLIST_OP_NUMBER: + getCurrentTransitionListUpdateErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mc.check.CheckServiceInfo._GETSUMMARYREPORT_OP_NUMBER: + getSummaryReportUpdateErrorReceived(msgHeader, body.getError(), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void progressResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALMessageBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mc.check.CheckServiceInfo._GETCURRENTTRANSITIONLIST_OP_NUMBER: + getCurrentTransitionListResponseReceived(msgHeader, + (org.ccsds.moims.mo.mc.check.structures.CheckResultSummaryList) body.getBodyElement(0, new org.ccsds.moims.mo.mc.check.structures.CheckResultSummaryList()), qosProperties); + break; + case org.ccsds.moims.mo.mc.check.CheckServiceInfo._GETSUMMARYREPORT_OP_NUMBER: + getSummaryReportResponseReceived(msgHeader, + (body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.Union(Long.MAX_VALUE)) == null) ? null : ((org.ccsds.moims.mo.mal.structures.Union) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.Union(Long.MAX_VALUE))).getLongValue(), + (org.ccsds.moims.mo.mc.check.structures.CheckResultSummaryList) body.getBodyElement(1, new org.ccsds.moims.mo.mc.check.structures.CheckResultSummaryList()), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void progressResponseErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALErrorBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mc.check.CheckServiceInfo._GETCURRENTTRANSITIONLIST_OP_NUMBER: + getCurrentTransitionListResponseErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mc.check.CheckServiceInfo._GETSUMMARYREPORT_OP_NUMBER: + getSummaryReportResponseErrorReceived(msgHeader, body.getError(), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/consumer/CheckStub.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/consumer/CheckStub.java new file mode 100644 index 00000000..d9ee8ae6 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/consumer/CheckStub.java @@ -0,0 +1,829 @@ +package org.ccsds.moims.mo.mc.check.consumer; + +/** + * Consumer stub for Check service. + */ +public class CheckStub { + + /** + * The consumer field. + */ + private final org.ccsds.moims.mo.mal.consumer.MALConsumer consumer; + + /** + * Wraps a MALconsumer connection with service specific methods that map from + * the high level service API to the generic MAL API. + * + * @param consumer consumer The MALConsumer to use in this stub. + */ + public CheckStub(org.ccsds.moims.mo.mal.consumer.MALConsumer consumer) { + this.consumer = consumer; + } + + /** + * Returns the internal MAL consumer object used for sending of messages from + * this interface. + * + * @return The MAL consumer object. + */ + public org.ccsds.moims.mo.mal.consumer.MALConsumer getConsumer() { + return consumer; + } + + /** + * The getCurrentTransitionList operation allows a consumer to obtain the + * latest result of a number of checks filtering on check state. + * + * @param filter The filter field shall contain a set of object instance identifiers for which the check result is required. +If the checkFilterViaGroups field is TRUE then the checkFilter field shall contain GroupIdentity object instance identifiers, otherwise the field contains CheckIdentity object instance identifiers. +The CheckIdentity objects referenced, either directly or indirectly via groups, by the checkFilter field shall be the CheckIdentity objects to match. +The checkFilter field shall support the wildcard value of '0' and shall match all CheckIdentity objects of the provider. +The service provider shall check for the wildcard value in the list of object instance identifiers in the checkFilter field first and if found no other checks of supplied CheckIdentity object instance identifiers shall be made. +If the parameterFilterViaGroups field is TRUE then the parameterFilter field shall contain GroupIdentity object instance identifiers, otherwise the field contains ParameterIdentity object instance identifiers. +The ParameterIdentity objects referenced, either directly or indirectly via groups, by the parameterFilter field shall be the ParameterIdentity objects to match. +The parameterFilter field shall support the wildcard value of '0' and shall match all ParameterIdentity objects of the provider. +The service provider shall check for the wildcard value in the list of object instance identifiers in the parameterFilter field first and if found no other checks of supplied ParameterIdentity object instance identifiers shall be made. +If a referenced GroupIdentity object is unknown then an UNKNOWN error shall be returned. +If a requested Group, or the Group objects referenced by that Group, does not contain CheckIdentity objects for the checkFilter or ParameterIdentity for the parameterFilter then an INVALID error shall be returned. +If a referenced CheckIdentity object, either directly or indirectly via groups, is unknown then an UNKNOWN error shall be returned. +If a referenced ParameterIdentity object, either directly or indirectly via groups, is unknown then an UNKNOWN error shall be returned. +The filter field shall also contain a list of CheckState enumerations of which states to filter on. +The supplied lists shall be AND'd together to form the complete filter. +If a CheckLink object matches the CheckIdentity filter, and the ParameterIdentity filter, and its state matches any of the supplied CheckState enumerations, then its latest CheckResult value shall be returned. +To report all checks, the wildcard values may be used in the CheckResultFilter. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void getCurrentTransitionList(org.ccsds.moims.mo.mc.check.structures.CheckResultFilter filter, + org.ccsds.moims.mo.mc.check.consumer.CheckAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.progress(org.ccsds.moims.mo.mc.check.CheckServiceInfo.GETCURRENTTRANSITIONLIST_OP, adapter, filter); + } + + /** + * Asynchronous version of method getCurrentTransitionList. + * + * @param filter The filter field shall contain a set of object instance identifiers for which the check result is required. +If the checkFilterViaGroups field is TRUE then the checkFilter field shall contain GroupIdentity object instance identifiers, otherwise the field contains CheckIdentity object instance identifiers. +The CheckIdentity objects referenced, either directly or indirectly via groups, by the checkFilter field shall be the CheckIdentity objects to match. +The checkFilter field shall support the wildcard value of '0' and shall match all CheckIdentity objects of the provider. +The service provider shall check for the wildcard value in the list of object instance identifiers in the checkFilter field first and if found no other checks of supplied CheckIdentity object instance identifiers shall be made. +If the parameterFilterViaGroups field is TRUE then the parameterFilter field shall contain GroupIdentity object instance identifiers, otherwise the field contains ParameterIdentity object instance identifiers. +The ParameterIdentity objects referenced, either directly or indirectly via groups, by the parameterFilter field shall be the ParameterIdentity objects to match. +The parameterFilter field shall support the wildcard value of '0' and shall match all ParameterIdentity objects of the provider. +The service provider shall check for the wildcard value in the list of object instance identifiers in the parameterFilter field first and if found no other checks of supplied ParameterIdentity object instance identifiers shall be made. +If a referenced GroupIdentity object is unknown then an UNKNOWN error shall be returned. +If a requested Group, or the Group objects referenced by that Group, does not contain CheckIdentity objects for the checkFilter or ParameterIdentity for the parameterFilter then an INVALID error shall be returned. +If a referenced CheckIdentity object, either directly or indirectly via groups, is unknown then an UNKNOWN error shall be returned. +If a referenced ParameterIdentity object, either directly or indirectly via groups, is unknown then an UNKNOWN error shall be returned. +The filter field shall also contain a list of CheckState enumerations of which states to filter on. +The supplied lists shall be AND'd together to form the complete filter. +If a CheckLink object matches the CheckIdentity filter, and the ParameterIdentity filter, and its state matches any of the supplied CheckState enumerations, then its latest CheckResult value shall be returned. +To report all checks, the wildcard values may be used in the CheckResultFilter. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncGetCurrentTransitionList(org.ccsds.moims.mo.mc.check.structures.CheckResultFilter filter, + org.ccsds.moims.mo.mc.check.consumer.CheckAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncProgress(org.ccsds.moims.mo.mc.check.CheckServiceInfo.GETCURRENTTRANSITIONLIST_OP, adapter, filter); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueGetCurrentTransitionList(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mc.check.consumer.CheckAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mc.check.CheckServiceInfo.GETCURRENTTRANSITIONLIST_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The getSummaryReport operation allows a consumer to obtain the status of + * a number of checks and the result of any check evaluations linked to them. + * + * @param objInstIds The objInstIds field shall hold one or more CheckIdentity object instance identifiers of which a check report is required. +A wildcard value of '0' shall report on all checks. +The wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made. +If a requested check is unknown then an UNKNOWN error shall be returned in the ACKNOWLEDGE message and the operation shall end. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void getSummaryReport(org.ccsds.moims.mo.mal.structures.LongList objInstIds, + org.ccsds.moims.mo.mc.check.consumer.CheckAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.progress(org.ccsds.moims.mo.mc.check.CheckServiceInfo.GETSUMMARYREPORT_OP, adapter, objInstIds); + } + + /** + * Asynchronous version of method getSummaryReport. + * + * @param objInstIds The objInstIds field shall hold one or more CheckIdentity object instance identifiers of which a check report is required. +A wildcard value of '0' shall report on all checks. +The wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made. +If a requested check is unknown then an UNKNOWN error shall be returned in the ACKNOWLEDGE message and the operation shall end. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncGetSummaryReport(org.ccsds.moims.mo.mal.structures.LongList objInstIds, + org.ccsds.moims.mo.mc.check.consumer.CheckAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncProgress(org.ccsds.moims.mo.mc.check.CheckServiceInfo.GETSUMMARYREPORT_OP, adapter, objInstIds); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueGetSummaryReport(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mc.check.consumer.CheckAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mc.check.CheckServiceInfo.GETSUMMARYREPORT_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The enableService operation allows a consumer to globally control whether + * evaluation of all checks is performed or not. + * It should be noted that no check reports will be generated if the service + * provider has been disabled via the enableService operation. + * + * @param enableService If enableService is set to TRUE the service shall be enabled and evaluation and reporting of check will commence. +If enableService is set to FALSE then all evaluation of checks shall be suspended and no check transitions will be reported. +If the enableService value matches the current enabled state of the service then no change shall be made and no error reported. Enabling an already enabled service has no effect. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void enableService(Boolean enableService) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.submit(org.ccsds.moims.mo.mc.check.CheckServiceInfo.ENABLESERVICE_OP, (enableService == null) ? null : new org.ccsds.moims.mo.mal.structures.Union(enableService)); + } + + /** + * Asynchronous version of method enableService. + * + * @param enableService If enableService is set to TRUE the service shall be enabled and evaluation and reporting of check will commence. +If enableService is set to FALSE then all evaluation of checks shall be suspended and no check transitions will be reported. +If the enableService value matches the current enabled state of the service then no change shall be made and no error reported. Enabling an already enabled service has no effect. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncEnableService(Boolean enableService, + org.ccsds.moims.mo.mc.check.consumer.CheckAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncSubmit(org.ccsds.moims.mo.mc.check.CheckServiceInfo.ENABLESERVICE_OP, adapter, (enableService == null) ? null : new org.ccsds.moims.mo.mal.structures.Union(enableService)); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueEnableService(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mc.check.consumer.CheckAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mc.check.CheckServiceInfo.ENABLESERVICE_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The getServiceStatus operation allows a consumer to determine the global + * check service enabled status. + * + * @return The return value of the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public Boolean getServiceStatus() throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + org.ccsds.moims.mo.mal.transport.MALMessageBody body = consumer.request(org.ccsds.moims.mo.mc.check.CheckServiceInfo.GETSERVICESTATUS_OP, (Object[]) null); + Object body0 = (Object) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.Union(Boolean.FALSE)); + return (body0 == null) ? null : ((org.ccsds.moims.mo.mal.structures.Union) body0).getBooleanValue(); + } + + /** + * Asynchronous version of method getServiceStatus. + * + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncGetServiceStatus(org.ccsds.moims.mo.mc.check.consumer.CheckAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncRequest(org.ccsds.moims.mo.mc.check.CheckServiceInfo.GETSERVICESTATUS_OP, adapter, (Object[]) null); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueGetServiceStatus(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mc.check.consumer.CheckAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mc.check.CheckServiceInfo.GETSERVICESTATUS_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The enableCheck operation allows a consumer to control whether evaluation + * of a set of checks is performed or not. The operation allows the consumer + * to select the checks directly or indirectly using groups. + * + * @param isGroupIds If the isGroupIds field is TRUE then the enableInstances field shall contain GroupIdentity object instance identifiers, otherwise the field contains CheckLink object instance identifiers. +The CheckLink objects referenced, either directly or indirectly via groups, by the enableInstances field shall be the CheckLink objects to match. +The id of the enableInstances field shall support the wildcard value of '0' and matches all CheckLink objects of the provider. +The service provider shall check for the wildcard value in the list of object instance identifiers in the enableInstances field first and if found no other checks of supplied object instance identifiers shall be made. +If the enableInstances field contains a value of TRUE then evaluations of matching CheckLink objects shall be performed, a value of FALSE requests that evaluations will not be performed. +No error shall be raised if the enableInstances Boolean value supplied is the same as the current checkEnabled field for a CheckLink object i.e. enabling an already enabled check will not result in an error. +If a requested CheckLink or GroupIdentity object is unknown then an UNKNOWN error shall be returned. +If a requested Group, or the Group objects referenced by that Group, does not contain CheckLink objects then an INVALID error shall be returned. +If an error is raised then no modifications shall be made as a result of this operation call. +The provider shall create and store a new CheckLinkDefinition object in the COM archive if the checkEnabled field is changed. + * @param enableInstances If the check is being enabled, and the check is defined as being periodic in the check link definition, then the provider shall generate a check result immediately and start the checking interval from that check. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void enableCheck(Boolean isGroupIds, + org.ccsds.moims.mo.com.structures.InstanceBooleanPairList enableInstances) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.submit(org.ccsds.moims.mo.mc.check.CheckServiceInfo.ENABLECHECK_OP, (isGroupIds == null) ? null : new org.ccsds.moims.mo.mal.structures.Union(isGroupIds), enableInstances); + } + + /** + * Asynchronous version of method enableCheck. + * + * @param isGroupIds If the isGroupIds field is TRUE then the enableInstances field shall contain GroupIdentity object instance identifiers, otherwise the field contains CheckLink object instance identifiers. +The CheckLink objects referenced, either directly or indirectly via groups, by the enableInstances field shall be the CheckLink objects to match. +The id of the enableInstances field shall support the wildcard value of '0' and matches all CheckLink objects of the provider. +The service provider shall check for the wildcard value in the list of object instance identifiers in the enableInstances field first and if found no other checks of supplied object instance identifiers shall be made. +If the enableInstances field contains a value of TRUE then evaluations of matching CheckLink objects shall be performed, a value of FALSE requests that evaluations will not be performed. +No error shall be raised if the enableInstances Boolean value supplied is the same as the current checkEnabled field for a CheckLink object i.e. enabling an already enabled check will not result in an error. +If a requested CheckLink or GroupIdentity object is unknown then an UNKNOWN error shall be returned. +If a requested Group, or the Group objects referenced by that Group, does not contain CheckLink objects then an INVALID error shall be returned. +If an error is raised then no modifications shall be made as a result of this operation call. +The provider shall create and store a new CheckLinkDefinition object in the COM archive if the checkEnabled field is changed. + * @param enableInstances If the check is being enabled, and the check is defined as being periodic in the check link definition, then the provider shall generate a check result immediately and start the checking interval from that check. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncEnableCheck(Boolean isGroupIds, + org.ccsds.moims.mo.com.structures.InstanceBooleanPairList enableInstances, + org.ccsds.moims.mo.mc.check.consumer.CheckAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncSubmit(org.ccsds.moims.mo.mc.check.CheckServiceInfo.ENABLECHECK_OP, adapter, (isGroupIds == null) ? null : new org.ccsds.moims.mo.mal.structures.Union(isGroupIds), enableInstances); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueEnableCheck(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mc.check.consumer.CheckAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mc.check.CheckServiceInfo.ENABLECHECK_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The triggerCheck operation allows a consumer to request the immediate evaluation + * of a number of checks. Any violations will cause appropriate events to + * be generated. + * It should be noted that no check reports will be generated if the service + * provider has been disabled via the enableService operation. + * + * @param checkObjInstIds The checkObjInstIds field shall hold a list of CheckIdentity object instance identifiers to trigger the evaluation of all linked checks. + * @param linkObjInstIds The linkObjInstIds field shall hold a list of CheckLink object instance identifiers to trigger the evaluation of. +The wildcard value of '0' shall be permitted in either list. +The wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made. +If a requested CheckIdentity or CheckLink object is unknown then an UNKNOWN error shall be returned. +If an error is raised then no evaluations shall be made as a result of this operation call. +Either list may be empty in which case filtering on that aspect, check identity or specific check link, shall be ignored. +The two lists shall be combined using 'OR' logic, where a CheckLink is evaluated if the identity of a check is in the first list or if the link is directly listed in the second list. +Triggering a check shall ignore the nominalTime, nominalCount, violationTime and violationCount fields and requests an immediate evaluation of the checks. +Triggering a check during a periodic check shall not influence the periodic check (e.g. it does not reset the checkInterval timer, the successive valid samples that passed/violated the check or the maxReportingInterval timer). + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void triggerCheck(org.ccsds.moims.mo.mal.structures.LongList checkObjInstIds, + org.ccsds.moims.mo.mal.structures.LongList linkObjInstIds) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.submit(org.ccsds.moims.mo.mc.check.CheckServiceInfo.TRIGGERCHECK_OP, checkObjInstIds, linkObjInstIds); + } + + /** + * Asynchronous version of method triggerCheck. + * + * @param checkObjInstIds The checkObjInstIds field shall hold a list of CheckIdentity object instance identifiers to trigger the evaluation of all linked checks. + * @param linkObjInstIds The linkObjInstIds field shall hold a list of CheckLink object instance identifiers to trigger the evaluation of. +The wildcard value of '0' shall be permitted in either list. +The wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made. +If a requested CheckIdentity or CheckLink object is unknown then an UNKNOWN error shall be returned. +If an error is raised then no evaluations shall be made as a result of this operation call. +Either list may be empty in which case filtering on that aspect, check identity or specific check link, shall be ignored. +The two lists shall be combined using 'OR' logic, where a CheckLink is evaluated if the identity of a check is in the first list or if the link is directly listed in the second list. +Triggering a check shall ignore the nominalTime, nominalCount, violationTime and violationCount fields and requests an immediate evaluation of the checks. +Triggering a check during a periodic check shall not influence the periodic check (e.g. it does not reset the checkInterval timer, the successive valid samples that passed/violated the check or the maxReportingInterval timer). + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncTriggerCheck(org.ccsds.moims.mo.mal.structures.LongList checkObjInstIds, + org.ccsds.moims.mo.mal.structures.LongList linkObjInstIds, + org.ccsds.moims.mo.mc.check.consumer.CheckAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncSubmit(org.ccsds.moims.mo.mc.check.CheckServiceInfo.TRIGGERCHECK_OP, adapter, checkObjInstIds, linkObjInstIds); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueTriggerCheck(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mc.check.consumer.CheckAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mc.check.CheckServiceInfo.TRIGGERCHECK_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The listDefinition operation allows a consumer to request the latest object + * instance identifiers of the CheckIdentity and actual check definition objects + * for the supported checks of the provider. + * + * @param names The names field shall hold a list of CheckIdentity names to retrieve the CheckIdentity and actual check definition object instance identifiers for. +The request may contain the wildcard value of '*' to return all supported check definitions. +The wildcard value should be checked for first, if found no other checks of supplied identifiers shall be made. +If a provided identifier does not include a wildcard and does not match an existing CheckIdentity object then this operation shall fail with an UNKNOWN error. + * @return The return value of the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mc.check.structures.CheckTypedInstanceList listDefinition(org.ccsds.moims.mo.mal.structures.IdentifierList names) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + org.ccsds.moims.mo.mal.transport.MALMessageBody body = consumer.request(org.ccsds.moims.mo.mc.check.CheckServiceInfo.LISTDEFINITION_OP, names); + Object body0 = (Object) body.getBodyElement(0, new org.ccsds.moims.mo.mc.check.structures.CheckTypedInstanceList()); + return (org.ccsds.moims.mo.mc.check.structures.CheckTypedInstanceList) body0; + } + + /** + * Asynchronous version of method listDefinition. + * + * @param names The names field shall hold a list of CheckIdentity names to retrieve the CheckIdentity and actual check definition object instance identifiers for. +The request may contain the wildcard value of '*' to return all supported check definitions. +The wildcard value should be checked for first, if found no other checks of supplied identifiers shall be made. +If a provided identifier does not include a wildcard and does not match an existing CheckIdentity object then this operation shall fail with an UNKNOWN error. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncListDefinition(org.ccsds.moims.mo.mal.structures.IdentifierList names, + org.ccsds.moims.mo.mc.check.consumer.CheckAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncRequest(org.ccsds.moims.mo.mc.check.CheckServiceInfo.LISTDEFINITION_OP, adapter, names); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueListDefinition(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mc.check.consumer.CheckAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mc.check.CheckServiceInfo.LISTDEFINITION_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The listCheckLinks operation allows a consumer to request the object instance + * identifiers of the CheckLink objects for the checks of the provider. + * + * @param checkObjInstIds The checkObjInstIds field shall hold a list of CheckIdentity object instance identifiers to retrieve the CheckLink object instance identifiers for. +The request may contain the wildcard value of '0' to return all supported check links. +The wildcard value should be checked for first, if found no other checks of supplied identifiers shall be made. +If a provided identifier does not include a wildcard and does not match an existing CheckIdentity object then this operation shall fail with an UNKNOWN error. + * @return The return value of the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mc.check.structures.CheckLinkSummaryList listCheckLinks(org.ccsds.moims.mo.mal.structures.LongList checkObjInstIds) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + org.ccsds.moims.mo.mal.transport.MALMessageBody body = consumer.request(org.ccsds.moims.mo.mc.check.CheckServiceInfo.LISTCHECKLINKS_OP, checkObjInstIds); + Object body0 = (Object) body.getBodyElement(0, new org.ccsds.moims.mo.mc.check.structures.CheckLinkSummaryList()); + return (org.ccsds.moims.mo.mc.check.structures.CheckLinkSummaryList) body0; + } + + /** + * Asynchronous version of method listCheckLinks. + * + * @param checkObjInstIds The checkObjInstIds field shall hold a list of CheckIdentity object instance identifiers to retrieve the CheckLink object instance identifiers for. +The request may contain the wildcard value of '0' to return all supported check links. +The wildcard value should be checked for first, if found no other checks of supplied identifiers shall be made. +If a provided identifier does not include a wildcard and does not match an existing CheckIdentity object then this operation shall fail with an UNKNOWN error. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncListCheckLinks(org.ccsds.moims.mo.mal.structures.LongList checkObjInstIds, + org.ccsds.moims.mo.mc.check.consumer.CheckAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncRequest(org.ccsds.moims.mo.mc.check.CheckServiceInfo.LISTCHECKLINKS_OP, adapter, checkObjInstIds); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueListCheckLinks(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mc.check.consumer.CheckAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mc.check.CheckServiceInfo.LISTCHECKLINKS_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The addCheck operation allows a consumer to define one or more checks that + * do not currently exist. + * The new CheckIdentity and actual check definition objects are expected + * to be stored in the COM archive by the provider of the check service. + * + * @param checkNames The checkNames field shall hold the names of the checks to be added. +The checkNames field must not contain NULL, the wildcard '*', or empty value (an INVALID error shall be returned in this case). +The supplied names must be unique among all CheckIdentity objects for the domain of the provider otherwise a DUPLICATE error shall be raised. + * @param checkDefDetails The checkDefDetails field shall hold the CheckDefinitionDetails to be added. +The two lists shall be ordered the same. +The number of entries in the two lists shall be the same size otherwise an INVALID error shall be raised. +Only one of nominalTime and nominalCount is permitted to be zero, an INVALID error shall be returned if this is not the case. +Only one of violationTime and violationCount is permitted to be zero, an INVALID error shall be returned if this is not the case. +If an error is raised then no new identities and definitions shall be added as a result of this operation call. +If the supplied name matches an existing, but removed, CheckIdentity then that CheckIdentity shall be reused otherwise a new CheckIdentity shall be created. +The provider shall create a new actual check definition object and store it, and any new CheckIdentity objects, in the COM archive. + * @return The return value of the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mc.structures.ObjectInstancePairList addCheck(org.ccsds.moims.mo.mal.structures.StringList checkNames, + org.ccsds.moims.mo.mc.check.structures.CheckDefinitionDetailsList checkDefDetails) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + org.ccsds.moims.mo.mal.transport.MALMessageBody body = consumer.request(org.ccsds.moims.mo.mc.check.CheckServiceInfo.ADDCHECK_OP, checkNames, checkDefDetails); + Object body0 = (Object) body.getBodyElement(0, new org.ccsds.moims.mo.mc.structures.ObjectInstancePairList()); + return (org.ccsds.moims.mo.mc.structures.ObjectInstancePairList) body0; + } + + /** + * Asynchronous version of method addCheck. + * + * @param checkNames The checkNames field shall hold the names of the checks to be added. +The checkNames field must not contain NULL, the wildcard '*', or empty value (an INVALID error shall be returned in this case). +The supplied names must be unique among all CheckIdentity objects for the domain of the provider otherwise a DUPLICATE error shall be raised. + * @param checkDefDetails The checkDefDetails field shall hold the CheckDefinitionDetails to be added. +The two lists shall be ordered the same. +The number of entries in the two lists shall be the same size otherwise an INVALID error shall be raised. +Only one of nominalTime and nominalCount is permitted to be zero, an INVALID error shall be returned if this is not the case. +Only one of violationTime and violationCount is permitted to be zero, an INVALID error shall be returned if this is not the case. +If an error is raised then no new identities and definitions shall be added as a result of this operation call. +If the supplied name matches an existing, but removed, CheckIdentity then that CheckIdentity shall be reused otherwise a new CheckIdentity shall be created. +The provider shall create a new actual check definition object and store it, and any new CheckIdentity objects, in the COM archive. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncAddCheck(org.ccsds.moims.mo.mal.structures.StringList checkNames, + org.ccsds.moims.mo.mc.check.structures.CheckDefinitionDetailsList checkDefDetails, + org.ccsds.moims.mo.mc.check.consumer.CheckAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncRequest(org.ccsds.moims.mo.mc.check.CheckServiceInfo.ADDCHECK_OP, adapter, checkNames, checkDefDetails); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueAddCheck(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mc.check.consumer.CheckAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mc.check.CheckServiceInfo.ADDCHECK_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The updateDefinition operation allows a consumer to update a definition + * for one or more checks. + * This differs from deleting an existing check and adding a new definition + * with the same check name in the fact that the CheckIdentity object is not + * changed between the two definitions. + * The replacement definition should be stored in the COM archive by the service + * provider. The operation does not remove the previous object from the COM + * archive, merely removes the object from the provider. + * The operation also cannot be used to update a check definition for a check + * that is currently being used i.e. has CheckLink objects linked to it. The + * CheckLink objects should first be removed using removeParameterCheck before + * calling this operation. + * + * @param checkInstIds The checkInstIds field shall hold the object instance identifiers of the CheckIdentity objects to be updated. +If the checkInstIds list contains either NULL or '0' an INVALID error shall be raised. +The supplied object instance identifiers shall match existing identity objects, an UNKNOWN error shall be raised if this is not the case. +If the check to be updated is currently being used by a CheckLink object, a REFERENCED error shall be raised. + * @param checkDefDetails The checkDefDetails field shall contain the replacement CheckDefinitionDetails. +The two lists shall be ordered the same. +The number of entries in the two lists shall be the same size otherwise an INVALID error shall be raised. +Only one of nominalTime and nominalCount is permitted to be zero, an INVALID error shall be returned if this is not the case. +Only one of violationTime and violationCount is permitted to be zero, an INVALID error shall be returned if this is not the case. +If an error is raised then no definitions shall be updated as a result of this operation call. +The provider shall create new actual check definition objects and store them in the COM archive. +The new definition object shall be the current definition used for the specific CheckIdentity. + * @return The return value of the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.structures.LongList updateDefinition(org.ccsds.moims.mo.mal.structures.LongList checkInstIds, + org.ccsds.moims.mo.mc.check.structures.CheckDefinitionDetailsList checkDefDetails) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + org.ccsds.moims.mo.mal.transport.MALMessageBody body = consumer.request(org.ccsds.moims.mo.mc.check.CheckServiceInfo.UPDATEDEFINITION_OP, checkInstIds, checkDefDetails); + Object body0 = (Object) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.LongList()); + return (org.ccsds.moims.mo.mal.structures.LongList) body0; + } + + /** + * Asynchronous version of method updateDefinition. + * + * @param checkInstIds The checkInstIds field shall hold the object instance identifiers of the CheckIdentity objects to be updated. +If the checkInstIds list contains either NULL or '0' an INVALID error shall be raised. +The supplied object instance identifiers shall match existing identity objects, an UNKNOWN error shall be raised if this is not the case. +If the check to be updated is currently being used by a CheckLink object, a REFERENCED error shall be raised. + * @param checkDefDetails The checkDefDetails field shall contain the replacement CheckDefinitionDetails. +The two lists shall be ordered the same. +The number of entries in the two lists shall be the same size otherwise an INVALID error shall be raised. +Only one of nominalTime and nominalCount is permitted to be zero, an INVALID error shall be returned if this is not the case. +Only one of violationTime and violationCount is permitted to be zero, an INVALID error shall be returned if this is not the case. +If an error is raised then no definitions shall be updated as a result of this operation call. +The provider shall create new actual check definition objects and store them in the COM archive. +The new definition object shall be the current definition used for the specific CheckIdentity. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncUpdateDefinition(org.ccsds.moims.mo.mal.structures.LongList checkInstIds, + org.ccsds.moims.mo.mc.check.structures.CheckDefinitionDetailsList checkDefDetails, + org.ccsds.moims.mo.mc.check.consumer.CheckAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncRequest(org.ccsds.moims.mo.mc.check.CheckServiceInfo.UPDATEDEFINITION_OP, adapter, checkInstIds, checkDefDetails); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueUpdateDefinition(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mc.check.consumer.CheckAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mc.check.CheckServiceInfo.UPDATEDEFINITION_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The removeCheck operation allows a consumer to remove one or more definitions + * from the list of checks supported by the check provider. + * The operation does not remove the CheckIdentity and actual check definition + * objects from the COM archive, merely removes the objects from the provider. + * This permits existing CheckLink objects to continue to reference the correct + * check object in the COM archive. + * + * @param objInstIds The objInstIds field holds the object instance identifiers of the CheckIdentity objects to be removed from the provider. +The list may contain the wildcard value of '0'. +The wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made. +If a provided CheckIdentity instance identifier does not include a wildcard and does not match an existing check then this operation shall fail with an UNKNOWN error. +If any of the matched CheckIdentity objects are being referenced by a CheckLink object then a REFERENCED error shall be returned. +Matched CheckIdentity objects shall not be removed from the COM archive only the list of available CheckIdentity objects in the provider. +If an error is raised then no CheckIdentity objects shall be removed as a result of this operation call. +If the operation succeeds then the provider shall not allow new CheckLink objects to be created for the matched CheckIdentity anymore, existing CheckLink objects are not affected. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void removeCheck(org.ccsds.moims.mo.mal.structures.LongList objInstIds) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.submit(org.ccsds.moims.mo.mc.check.CheckServiceInfo.REMOVECHECK_OP, objInstIds); + } + + /** + * Asynchronous version of method removeCheck. + * + * @param objInstIds The objInstIds field holds the object instance identifiers of the CheckIdentity objects to be removed from the provider. +The list may contain the wildcard value of '0'. +The wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made. +If a provided CheckIdentity instance identifier does not include a wildcard and does not match an existing check then this operation shall fail with an UNKNOWN error. +If any of the matched CheckIdentity objects are being referenced by a CheckLink object then a REFERENCED error shall be returned. +Matched CheckIdentity objects shall not be removed from the COM archive only the list of available CheckIdentity objects in the provider. +If an error is raised then no CheckIdentity objects shall be removed as a result of this operation call. +If the operation succeeds then the provider shall not allow new CheckLink objects to be created for the matched CheckIdentity anymore, existing CheckLink objects are not affected. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncRemoveCheck(org.ccsds.moims.mo.mal.structures.LongList objInstIds, + org.ccsds.moims.mo.mc.check.consumer.CheckAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncSubmit(org.ccsds.moims.mo.mc.check.CheckServiceInfo.REMOVECHECK_OP, adapter, objInstIds); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueRemoveCheck(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mc.check.consumer.CheckAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mc.check.CheckServiceInfo.REMOVECHECK_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The addParameterCheck operation allows a consumer to request that one or + * more parameters/check combinations are added to the list of checks that + * are being evaluated. + * The new CheckLink and CheckLinkDefinition objects are expected to be stored + * in the COM archive by the provider of the check service. + * + * @param linkDetails The linkDetails field shall contain the new CheckLink details. +The linkRefs field shall contain the related and source links of the new CheckLink. +The related field of the ObjectDetails shall reference the object instance identifier of the CheckIdentity being used by the new CheckLink. +The source field of the ObjectDetails shall reference the ParameterIdentity that the check is being applied to. +The two lists must be ordered the same so that the correct ObjectDetails for a specific CheckLink can be determined. + * @param linkRefs If the requested CheckIdentity and ParameterIdentity do not exist then an UNKNOWN error shall be returned. +The number of entries in the two lists shall be the same size otherwise an INVALID error shall be raised. +If an interval that is not supported by the provider is requested then an INVALID error shall be returned. +If the checkInterval is not '0' and the checkOnChange Value is TRUE, then an INVALID error shall be returned. +The provider shall create new CheckLink and CheckLinkDefinition objects for each pair and store them in the COM archive. + * @return The return value of the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mc.structures.ObjectInstancePairList addParameterCheck(org.ccsds.moims.mo.mc.check.structures.CheckLinkDetailsList linkDetails, + org.ccsds.moims.mo.com.structures.ObjectDetailsList linkRefs) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + org.ccsds.moims.mo.mal.transport.MALMessageBody body = consumer.request(org.ccsds.moims.mo.mc.check.CheckServiceInfo.ADDPARAMETERCHECK_OP, linkDetails, linkRefs); + Object body0 = (Object) body.getBodyElement(0, new org.ccsds.moims.mo.mc.structures.ObjectInstancePairList()); + return (org.ccsds.moims.mo.mc.structures.ObjectInstancePairList) body0; + } + + /** + * Asynchronous version of method addParameterCheck. + * + * @param linkDetails The linkDetails field shall contain the new CheckLink details. +The linkRefs field shall contain the related and source links of the new CheckLink. +The related field of the ObjectDetails shall reference the object instance identifier of the CheckIdentity being used by the new CheckLink. +The source field of the ObjectDetails shall reference the ParameterIdentity that the check is being applied to. +The two lists must be ordered the same so that the correct ObjectDetails for a specific CheckLink can be determined. + * @param linkRefs If the requested CheckIdentity and ParameterIdentity do not exist then an UNKNOWN error shall be returned. +The number of entries in the two lists shall be the same size otherwise an INVALID error shall be raised. +If an interval that is not supported by the provider is requested then an INVALID error shall be returned. +If the checkInterval is not '0' and the checkOnChange Value is TRUE, then an INVALID error shall be returned. +The provider shall create new CheckLink and CheckLinkDefinition objects for each pair and store them in the COM archive. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncAddParameterCheck(org.ccsds.moims.mo.mc.check.structures.CheckLinkDetailsList linkDetails, + org.ccsds.moims.mo.com.structures.ObjectDetailsList linkRefs, + org.ccsds.moims.mo.mc.check.consumer.CheckAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncRequest(org.ccsds.moims.mo.mc.check.CheckServiceInfo.ADDPARAMETERCHECK_OP, adapter, linkDetails, linkRefs); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueAddParameterCheck(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mc.check.consumer.CheckAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mc.check.CheckServiceInfo.ADDPARAMETERCHECK_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The removeParameterCheck operation allows a consumer to remove one or more + * parameters from the list of parameters being checked by the check provider. + * The operation does not remove the CheckLink or CheckLinkDefinition objects + * from the COM archive, merely removes them from the provider. This permits + * existing CheckTransition events to continue to reference the correct check + * link/definition objects in the COM archive. + * + * @param objInstIds The objInstIds field holds the object instance identifiers of the CheckLink objects to be removed from the provider. +The list may contain the wildcard value of '0'. +The wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made. +If a provided CheckLink instance identifier does not include a wildcard and does not match an existing link then this operation shall fail with an UNKNOWN error. +Matched CheckLink objects shall not be removed from the COM archive only the list of available CheckLink objects in the provider. +If an error is raised then no CheckLink objects shall be removed as a result of this operation call. +If the operation succeeds then the provider shall not evaluate those parameter/check definition combinations for the deleted CheckLink objects anymore. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void removeParameterCheck(org.ccsds.moims.mo.mal.structures.LongList objInstIds) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.submit(org.ccsds.moims.mo.mc.check.CheckServiceInfo.REMOVEPARAMETERCHECK_OP, objInstIds); + } + + /** + * Asynchronous version of method removeParameterCheck. + * + * @param objInstIds The objInstIds field holds the object instance identifiers of the CheckLink objects to be removed from the provider. +The list may contain the wildcard value of '0'. +The wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made. +If a provided CheckLink instance identifier does not include a wildcard and does not match an existing link then this operation shall fail with an UNKNOWN error. +Matched CheckLink objects shall not be removed from the COM archive only the list of available CheckLink objects in the provider. +If an error is raised then no CheckLink objects shall be removed as a result of this operation call. +If the operation succeeds then the provider shall not evaluate those parameter/check definition combinations for the deleted CheckLink objects anymore. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncRemoveParameterCheck(org.ccsds.moims.mo.mal.structures.LongList objInstIds, + org.ccsds.moims.mo.mc.check.consumer.CheckAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncSubmit(org.ccsds.moims.mo.mc.check.CheckServiceInfo.REMOVEPARAMETERCHECK_OP, adapter, objInstIds); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueRemoveParameterCheck(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mc.check.consumer.CheckAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mc.check.CheckServiceInfo.REMOVEPARAMETERCHECK_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/consumer/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/consumer/package-info.java new file mode 100644 index 00000000..25d1c5a1 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/consumer/package-info.java @@ -0,0 +1,4 @@ +/** + * Package containing the consumer stubs for the Check service. +*/ +package org.ccsds.moims.mo.mc.check.consumer; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/package-info.java new file mode 100644 index 00000000..7a3d804b --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/package-info.java @@ -0,0 +1,55 @@ +/** + * The check service allows the user to monitor and control the checking of + * parameters values against check definitions including limit sets. Violations + * of these defined checks are published using the COM event service. + * The check service allows the consumer to define checks and then link the + * check definition to a parameter to be monitored. Figure 3-6 shows the nominal + * sequence of operations for the check service: + * ---- check sequence diag ---- + * Check service nominal sequence + * A consumer first subscribes for check events before linking some already + * existing checks to some parameters. The figure shows how check evaluation + * is normally triggered by either a periodic interval or a change in a monitored + * value, however, the service also supports the optional ability for consumers + * to trigger the evaluation of checks using the triggerCheck operation. Finally, + * if a check event has not been generated for a configurable period of time, + * known as the maximum reporting interval, an event is generated regardless + * of whether the check is in violation or not. This maximum reporting interval + * supports the situation where regular confirmation of the non-violating + * state of a check is required. + * The list of currently violating checks can be obtained using the getCurrentTransitionList + * operation; to get a full report including non-violating checks the getSummaryReport + * operation should be used. + * The following figure (3-7) shows the flow chart for determining the status + * of a check: + * --- check state diag --- + * Flow Chart for Determining the Status of a Check + * Each time a check is evaluated, the procedure indicated in the flow chart + * depicted in figure 3-7 is performed to calculate the check result. Each + * check link can have a condition included which determines whether the check + * should be applied or not; this allows several checks to be associated to + * a single parameter and applied in different conditions. + * The service defines five basic check types, constant, reference, delta, + * limit, and compound. A constant check is used to ensure that a parameter + * value either does not change or does not change from a set of specific + * values. + * In the Reference and Delta checks, a value is compared against another + * value which serves as a reference value. The reference value can be taken + * from either another parameter or the parameter being checked, and can be + * the previous value or a value in the past, specified by using a delta time + * in the ReferenceValue composite. This does not affect the logic of the + * flow chart above. + * Limit checks monitor parameters to see if the parameter value is either + * inside or outside a range of values. + * The final check type, compound, monitors a set of previously defined checks + * and only violates when a specified number of those monitored checks violate + * themselves. + * The service only publishes check results (as check transition events) when + * either the result changes from the previous value (for example a check + * starts to violate), or the maximum reporting interval expires. This reduces + * the amount of "no change" reporting data being distributed. For + * situations where regular reporting of the check result is required, even + * when no change is detected, a low maximum reporting interval value should + * be specified. +*/ +package org.ccsds.moims.mo.mc.check; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/provider/CheckHandler.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/provider/CheckHandler.java new file mode 100644 index 00000000..cf8a9116 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/provider/CheckHandler.java @@ -0,0 +1,264 @@ +package org.ccsds.moims.mo.mc.check.provider; + +/** + * Interface that providers of the Check service must implement to handle + * the operations of that service. + */ +public interface CheckHandler { + + /** + * Implements the operation getCurrentTransitionList. + * + * @param filter The filter field shall contain a set of object instance identifiers for which the check result is required. +If the checkFilterViaGroups field is TRUE then the checkFilter field shall contain GroupIdentity object instance identifiers, otherwise the field contains CheckIdentity object instance identifiers. +The CheckIdentity objects referenced, either directly or indirectly via groups, by the checkFilter field shall be the CheckIdentity objects to match. +The checkFilter field shall support the wildcard value of '0' and shall match all CheckIdentity objects of the provider. +The service provider shall check for the wildcard value in the list of object instance identifiers in the checkFilter field first and if found no other checks of supplied CheckIdentity object instance identifiers shall be made. +If the parameterFilterViaGroups field is TRUE then the parameterFilter field shall contain GroupIdentity object instance identifiers, otherwise the field contains ParameterIdentity object instance identifiers. +The ParameterIdentity objects referenced, either directly or indirectly via groups, by the parameterFilter field shall be the ParameterIdentity objects to match. +The parameterFilter field shall support the wildcard value of '0' and shall match all ParameterIdentity objects of the provider. +The service provider shall check for the wildcard value in the list of object instance identifiers in the parameterFilter field first and if found no other checks of supplied ParameterIdentity object instance identifiers shall be made. +If a referenced GroupIdentity object is unknown then an UNKNOWN error shall be returned. +If a requested Group, or the Group objects referenced by that Group, does not contain CheckIdentity objects for the checkFilter or ParameterIdentity for the parameterFilter then an INVALID error shall be returned. +If a referenced CheckIdentity object, either directly or indirectly via groups, is unknown then an UNKNOWN error shall be returned. +If a referenced ParameterIdentity object, either directly or indirectly via groups, is unknown then an UNKNOWN error shall be returned. +The filter field shall also contain a list of CheckState enumerations of which states to filter on. +The supplied lists shall be AND'd together to form the complete filter. +If a CheckLink object matches the CheckIdentity filter, and the ParameterIdentity filter, and its state matches any of the supplied CheckState enumerations, then its latest CheckResult value shall be returned. +To report all checks, the wildcard values may be used in the CheckResultFilter. + * @param interaction The MAL object representing the interaction in the provider. + * @throws org.ccsds.moims.mo.com.InvalidException One of the referenced groups does not contain the correct type of object. + * @throws org.ccsds.moims.mo.mal.UnknownException One or more of the checks, parameters, or groups specified in the list do not exist. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + void getCurrentTransitionList(org.ccsds.moims.mo.mc.check.structures.CheckResultFilter filter, + org.ccsds.moims.mo.mc.check.provider.GetCurrentTransitionListInteraction interaction) throws org.ccsds.moims.mo.com.InvalidException, org.ccsds.moims.mo.mal.UnknownException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation getSummaryReport. + * + * @param objInstIds The objInstIds field shall hold one or more CheckIdentity object instance identifiers of which a check report is required. +A wildcard value of '0' shall report on all checks. +The wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made. +If a requested check is unknown then an UNKNOWN error shall be returned in the ACKNOWLEDGE message and the operation shall end. + * @param interaction The MAL object representing the interaction in the provider. + * @throws org.ccsds.moims.mo.mal.UnknownException One or more of the checks specified in the list do not exist. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + void getSummaryReport(org.ccsds.moims.mo.mal.structures.LongList objInstIds, + org.ccsds.moims.mo.mc.check.provider.GetSummaryReportInteraction interaction) throws org.ccsds.moims.mo.mal.UnknownException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation enableService. + * + * @param enableService If enableService is set to TRUE the service shall be enabled and evaluation and reporting of check will commence. +If enableService is set to FALSE then all evaluation of checks shall be suspended and no check transitions will be reported. +If the enableService value matches the current enabled state of the service then no change shall be made and no error reported. Enabling an already enabled service has no effect. + * @param interaction The MAL object representing the interaction in the provider. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + void enableService(Boolean enableService, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation getServiceStatus. + * + * @param interaction The MAL object representing the interaction in the provider. + * @return The return value of the operation + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + Boolean getServiceStatus(org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation enableCheck. + * + * @param isGroupIds If the isGroupIds field is TRUE then the enableInstances field shall contain GroupIdentity object instance identifiers, otherwise the field contains CheckLink object instance identifiers. +The CheckLink objects referenced, either directly or indirectly via groups, by the enableInstances field shall be the CheckLink objects to match. +The id of the enableInstances field shall support the wildcard value of '0' and matches all CheckLink objects of the provider. +The service provider shall check for the wildcard value in the list of object instance identifiers in the enableInstances field first and if found no other checks of supplied object instance identifiers shall be made. +If the enableInstances field contains a value of TRUE then evaluations of matching CheckLink objects shall be performed, a value of FALSE requests that evaluations will not be performed. +No error shall be raised if the enableInstances Boolean value supplied is the same as the current checkEnabled field for a CheckLink object i.e. enabling an already enabled check will not result in an error. +If a requested CheckLink or GroupIdentity object is unknown then an UNKNOWN error shall be returned. +If a requested Group, or the Group objects referenced by that Group, does not contain CheckLink objects then an INVALID error shall be returned. +If an error is raised then no modifications shall be made as a result of this operation call. +The provider shall create and store a new CheckLinkDefinition object in the COM archive if the checkEnabled field is changed. + * @param enableInstances If the check is being enabled, and the check is defined as being periodic in the check link definition, then the provider shall generate a check result immediately and start the checking interval from that check. + * @param interaction The MAL object representing the interaction in the provider. + * @throws org.ccsds.moims.mo.mal.UnknownException One or more of the requested groups or CheckLink objects is unknown. + * @throws org.ccsds.moims.mo.com.InvalidException One of the supplied groups is not a group of either other group objects or CheckLink objects. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + void enableCheck(Boolean isGroupIds, + org.ccsds.moims.mo.com.structures.InstanceBooleanPairList enableInstances, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mal.UnknownException, org.ccsds.moims.mo.com.InvalidException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation triggerCheck. + * + * @param checkObjInstIds The checkObjInstIds field shall hold a list of CheckIdentity object instance identifiers to trigger the evaluation of all linked checks. + * @param linkObjInstIds The linkObjInstIds field shall hold a list of CheckLink object instance identifiers to trigger the evaluation of. +The wildcard value of '0' shall be permitted in either list. +The wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made. +If a requested CheckIdentity or CheckLink object is unknown then an UNKNOWN error shall be returned. +If an error is raised then no evaluations shall be made as a result of this operation call. +Either list may be empty in which case filtering on that aspect, check identity or specific check link, shall be ignored. +The two lists shall be combined using 'OR' logic, where a CheckLink is evaluated if the identity of a check is in the first list or if the link is directly listed in the second list. +Triggering a check shall ignore the nominalTime, nominalCount, violationTime and violationCount fields and requests an immediate evaluation of the checks. +Triggering a check during a periodic check shall not influence the periodic check (e.g. it does not reset the checkInterval timer, the successive valid samples that passed/violated the check or the maxReportingInterval timer). + * @param interaction The MAL object representing the interaction in the provider. + * @throws org.ccsds.moims.mo.mal.UnknownException One or more of the requested CheckIdentity or CheckLink objects is unknown. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + void triggerCheck(org.ccsds.moims.mo.mal.structures.LongList checkObjInstIds, + org.ccsds.moims.mo.mal.structures.LongList linkObjInstIds, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mal.UnknownException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation listDefinition. + * + * @param names The names field shall hold a list of CheckIdentity names to retrieve the CheckIdentity and actual check definition object instance identifiers for. +The request may contain the wildcard value of '*' to return all supported check definitions. +The wildcard value should be checked for first, if found no other checks of supplied identifiers shall be made. +If a provided identifier does not include a wildcard and does not match an existing CheckIdentity object then this operation shall fail with an UNKNOWN error. + * @param interaction The MAL object representing the interaction in the provider. + * @return The return value of the operation + * @throws org.ccsds.moims.mo.mal.UnknownException One of the supplied identifiers is unknown. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + org.ccsds.moims.mo.mc.check.structures.CheckTypedInstanceList listDefinition(org.ccsds.moims.mo.mal.structures.IdentifierList names, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mal.UnknownException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation listCheckLinks. + * + * @param checkObjInstIds The checkObjInstIds field shall hold a list of CheckIdentity object instance identifiers to retrieve the CheckLink object instance identifiers for. +The request may contain the wildcard value of '0' to return all supported check links. +The wildcard value should be checked for first, if found no other checks of supplied identifiers shall be made. +If a provided identifier does not include a wildcard and does not match an existing CheckIdentity object then this operation shall fail with an UNKNOWN error. + * @param interaction The MAL object representing the interaction in the provider. + * @return The return value of the operation + * @throws org.ccsds.moims.mo.mal.UnknownException One of the supplied identifiers is unknown. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + org.ccsds.moims.mo.mc.check.structures.CheckLinkSummaryList listCheckLinks(org.ccsds.moims.mo.mal.structures.LongList checkObjInstIds, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mal.UnknownException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation addCheck. + * + * @param checkNames The checkNames field shall hold the names of the checks to be added. +The checkNames field must not contain NULL, the wildcard '*', or empty value (an INVALID error shall be returned in this case). +The supplied names must be unique among all CheckIdentity objects for the domain of the provider otherwise a DUPLICATE error shall be raised. + * @param checkDefDetails The checkDefDetails field shall hold the CheckDefinitionDetails to be added. +The two lists shall be ordered the same. +The number of entries in the two lists shall be the same size otherwise an INVALID error shall be raised. +Only one of nominalTime and nominalCount is permitted to be zero, an INVALID error shall be returned if this is not the case. +Only one of violationTime and violationCount is permitted to be zero, an INVALID error shall be returned if this is not the case. +If an error is raised then no new identities and definitions shall be added as a result of this operation call. +If the supplied name matches an existing, but removed, CheckIdentity then that CheckIdentity shall be reused otherwise a new CheckIdentity shall be created. +The provider shall create a new actual check definition object and store it, and any new CheckIdentity objects, in the COM archive. + * @param interaction The MAL object representing the interaction in the provider. + * @return The return value of the operation + * @throws org.ccsds.moims.mo.com.InvalidException One of the supplied CheckIdentity objects contains an invalid name or the two lists are not the same size or there is an inconsistency in the time and count fields. +If the two lists are not the same length then the extra information field shall contain the first index of the element in the largest list which does not have corresponding element in the other list. + * @throws org.ccsds.moims.mo.com.DuplicateException One or more of the CheckIdentity objects being added has supplied a check name that is already in use in the domain. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + org.ccsds.moims.mo.mc.structures.ObjectInstancePairList addCheck(org.ccsds.moims.mo.mal.structures.StringList checkNames, + org.ccsds.moims.mo.mc.check.structures.CheckDefinitionDetailsList checkDefDetails, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.com.InvalidException, org.ccsds.moims.mo.com.DuplicateException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation updateDefinition. + * + * @param checkInstIds The checkInstIds field shall hold the object instance identifiers of the CheckIdentity objects to be updated. +If the checkInstIds list contains either NULL or '0' an INVALID error shall be raised. +The supplied object instance identifiers shall match existing identity objects, an UNKNOWN error shall be raised if this is not the case. +If the check to be updated is currently being used by a CheckLink object, a REFERENCED error shall be raised. + * @param checkDefDetails The checkDefDetails field shall contain the replacement CheckDefinitionDetails. +The two lists shall be ordered the same. +The number of entries in the two lists shall be the same size otherwise an INVALID error shall be raised. +Only one of nominalTime and nominalCount is permitted to be zero, an INVALID error shall be returned if this is not the case. +Only one of violationTime and violationCount is permitted to be zero, an INVALID error shall be returned if this is not the case. +If an error is raised then no definitions shall be updated as a result of this operation call. +The provider shall create new actual check definition objects and store them in the COM archive. +The new definition object shall be the current definition used for the specific CheckIdentity. + * @param interaction The MAL object representing the interaction in the provider. + * @return The return value of the operation + * @throws org.ccsds.moims.mo.mal.UnknownException One of the supplied CheckIdentity object instance identifiers is unknown. + * @throws org.ccsds.moims.mo.com.InvalidException The supplied object instance identifiers list contains either a NULL or '0', or the two lists do not contain the same number of entries or there is an inconsistency in the time and count fields. +If the two lists are not the same length then the extra information field shall contain the first index of the element in the largest list which does not have corresponding element in the other list. + * @throws org.ccsds.moims.mo.mc.ReferencedException One of the check objects is currently being used by a CheckLink object. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + org.ccsds.moims.mo.mal.structures.LongList updateDefinition(org.ccsds.moims.mo.mal.structures.LongList checkInstIds, + org.ccsds.moims.mo.mc.check.structures.CheckDefinitionDetailsList checkDefDetails, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mal.UnknownException, org.ccsds.moims.mo.com.InvalidException, org.ccsds.moims.mo.mc.ReferencedException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation removeCheck. + * + * @param objInstIds The objInstIds field holds the object instance identifiers of the CheckIdentity objects to be removed from the provider. +The list may contain the wildcard value of '0'. +The wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made. +If a provided CheckIdentity instance identifier does not include a wildcard and does not match an existing check then this operation shall fail with an UNKNOWN error. +If any of the matched CheckIdentity objects are being referenced by a CheckLink object then a REFERENCED error shall be returned. +Matched CheckIdentity objects shall not be removed from the COM archive only the list of available CheckIdentity objects in the provider. +If an error is raised then no CheckIdentity objects shall be removed as a result of this operation call. +If the operation succeeds then the provider shall not allow new CheckLink objects to be created for the matched CheckIdentity anymore, existing CheckLink objects are not affected. + * @param interaction The MAL object representing the interaction in the provider. + * @throws org.ccsds.moims.mo.mc.ReferencedException One of the check objects is currently being used by a CheckLink object. + * @throws org.ccsds.moims.mo.mal.UnknownException One of the supplied CheckIdentity object instance identifiers is unknown. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + void removeCheck(org.ccsds.moims.mo.mal.structures.LongList objInstIds, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mc.ReferencedException, org.ccsds.moims.mo.mal.UnknownException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation addParameterCheck. + * + * @param linkDetails The linkDetails field shall contain the new CheckLink details. +The linkRefs field shall contain the related and source links of the new CheckLink. +The related field of the ObjectDetails shall reference the object instance identifier of the CheckIdentity being used by the new CheckLink. +The source field of the ObjectDetails shall reference the ParameterIdentity that the check is being applied to. +The two lists must be ordered the same so that the correct ObjectDetails for a specific CheckLink can be determined. + * @param linkRefs If the requested CheckIdentity and ParameterIdentity do not exist then an UNKNOWN error shall be returned. +The number of entries in the two lists shall be the same size otherwise an INVALID error shall be raised. +If an interval that is not supported by the provider is requested then an INVALID error shall be returned. +If the checkInterval is not '0' and the checkOnChange Value is TRUE, then an INVALID error shall be returned. +The provider shall create new CheckLink and CheckLinkDefinition objects for each pair and store them in the COM archive. + * @param interaction The MAL object representing the interaction in the provider. + * @return The return value of the operation + * @throws org.ccsds.moims.mo.com.InvalidException The supplied lists do not contain the same number of entries, the supplied interval is not supported by the provider, or a period check with changed based checking has been requested. +If the two lists are not the same length then the extra information field shall contain the first index of the element in the largest list which does not have corresponding element in the other list. + * @throws org.ccsds.moims.mo.mal.UnknownException One of the supplied object instance identifiers is unknown. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + org.ccsds.moims.mo.mc.structures.ObjectInstancePairList addParameterCheck(org.ccsds.moims.mo.mc.check.structures.CheckLinkDetailsList linkDetails, + org.ccsds.moims.mo.com.structures.ObjectDetailsList linkRefs, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.com.InvalidException, org.ccsds.moims.mo.mal.UnknownException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation removeParameterCheck. + * + * @param objInstIds The objInstIds field holds the object instance identifiers of the CheckLink objects to be removed from the provider. +The list may contain the wildcard value of '0'. +The wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made. +If a provided CheckLink instance identifier does not include a wildcard and does not match an existing link then this operation shall fail with an UNKNOWN error. +Matched CheckLink objects shall not be removed from the COM archive only the list of available CheckLink objects in the provider. +If an error is raised then no CheckLink objects shall be removed as a result of this operation call. +If the operation succeeds then the provider shall not evaluate those parameter/check definition combinations for the deleted CheckLink objects anymore. + * @param interaction The MAL object representing the interaction in the provider. + * @throws org.ccsds.moims.mo.mal.UnknownException One of the supplied CheckLink object instance identifiers is unknown. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + void removeParameterCheck(org.ccsds.moims.mo.mal.structures.LongList objInstIds, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mal.UnknownException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Sets the skeleton to be used for creation of publishers. + * + * @param skeleton The skeleton to be used. + */ + void setSkeleton(org.ccsds.moims.mo.mc.check.provider.CheckSkeleton skeleton); +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/provider/CheckInheritanceSkeleton.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/provider/CheckInheritanceSkeleton.java new file mode 100644 index 00000000..c8cd3956 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/provider/CheckInheritanceSkeleton.java @@ -0,0 +1,175 @@ +package org.ccsds.moims.mo.mc.check.provider; + +/** + * Provider Inheritance skeleton for CheckInheritanceSkeleton service. + */ +public abstract class CheckInheritanceSkeleton implements org.ccsds.moims.mo.mal.provider.MALInteractionHandler, org.ccsds.moims.mo.mc.check.provider.CheckSkeleton, org.ccsds.moims.mo.mc.check.provider.CheckHandler { + + /** + * The providerSet field. + */ + private org.ccsds.moims.mo.mal.provider.MALProviderSet providerSet = new org.ccsds.moims.mo.mal.provider.MALProviderSet(org.ccsds.moims.mo.mc.check.CheckHelper.CHECK_SERVICE); + + /** + * Returns the connection object for this provider. + * + * @return the connection object for this provider + * @throws java.io.IOException if the method was not implemented yet. + */ + public org.ccsds.moims.mo.mal.helpertools.connections.ConnectionProvider getConnection() throws java.io.IOException { + throw new java.io.IOException("This method needs to be overridden!"); + } + + @Override + public void setSkeleton(org.ccsds.moims.mo.mc.check.provider.CheckSkeleton skeleton) { + // Not used in the inheritance pattern (the skeleton is 'this'); + } + + @Override + public void malInitialize(org.ccsds.moims.mo.mal.provider.MALProvider provider) throws org.ccsds.moims.mo.mal.MALException { + providerSet.addProvider(provider); + } + + @Override + public void malFinalize(org.ccsds.moims.mo.mal.provider.MALProvider provider) throws org.ccsds.moims.mo.mal.MALException { + providerSet.removeProvider(provider); + } + + @Override + public void handleSend(org.ccsds.moims.mo.mal.provider.MALInteraction interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + switch (opNumber) { + default: + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } + + @Override + public void handleSubmit(org.ccsds.moims.mo.mal.provider.MALSubmit interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + try { + switch (opNumber) { + case org.ccsds.moims.mo.mc.check.CheckServiceInfo._ENABLESERVICE_OP_NUMBER: + enableService((body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.Union(Boolean.FALSE)) == null) ? null : ((org.ccsds.moims.mo.mal.structures.Union) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.Union(Boolean.FALSE))).getBooleanValue(), + interaction); + interaction.sendAcknowledgement(); + break; + case org.ccsds.moims.mo.mc.check.CheckServiceInfo._ENABLECHECK_OP_NUMBER: + enableCheck((body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.Union(Boolean.FALSE)) == null) ? null : ((org.ccsds.moims.mo.mal.structures.Union) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.Union(Boolean.FALSE))).getBooleanValue(), + (org.ccsds.moims.mo.com.structures.InstanceBooleanPairList) body.getBodyElement(1, new org.ccsds.moims.mo.com.structures.InstanceBooleanPairList()), + interaction); + interaction.sendAcknowledgement(); + break; + case org.ccsds.moims.mo.mc.check.CheckServiceInfo._TRIGGERCHECK_OP_NUMBER: + triggerCheck((org.ccsds.moims.mo.mal.structures.LongList) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.LongList()), + (org.ccsds.moims.mo.mal.structures.LongList) body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.LongList()), + interaction); + interaction.sendAcknowledgement(); + break; + case org.ccsds.moims.mo.mc.check.CheckServiceInfo._REMOVECHECK_OP_NUMBER: + removeCheck((org.ccsds.moims.mo.mal.structures.LongList) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.LongList()), + interaction); + interaction.sendAcknowledgement(); + break; + case org.ccsds.moims.mo.mc.check.CheckServiceInfo._REMOVEPARAMETERCHECK_OP_NUMBER: + removeParameterCheck((org.ccsds.moims.mo.mal.structures.LongList) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.LongList()), + interaction); + interaction.sendAcknowledgement(); + break; + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } catch (org.ccsds.moims.mo.mal.MOErrorException error) { + throw new org.ccsds.moims.mo.mal.MALInteractionException(error); + } + } + + @Override + public void handleRequest(org.ccsds.moims.mo.mal.provider.MALRequest interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + try { + switch (opNumber) { + case org.ccsds.moims.mo.mc.check.CheckServiceInfo._GETSERVICESTATUS_OP_NUMBER: + Boolean getServiceStatusRt = getServiceStatus(interaction); + interaction.sendResponse((getServiceStatusRt == null) ? null : new org.ccsds.moims.mo.mal.structures.Union(getServiceStatusRt)); + break; + case org.ccsds.moims.mo.mc.check.CheckServiceInfo._LISTDEFINITION_OP_NUMBER: + interaction.sendResponse(listDefinition((org.ccsds.moims.mo.mal.structures.IdentifierList) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.IdentifierList()), + interaction)); + break; + case org.ccsds.moims.mo.mc.check.CheckServiceInfo._LISTCHECKLINKS_OP_NUMBER: + interaction.sendResponse(listCheckLinks((org.ccsds.moims.mo.mal.structures.LongList) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.LongList()), + interaction)); + break; + case org.ccsds.moims.mo.mc.check.CheckServiceInfo._ADDCHECK_OP_NUMBER: + interaction.sendResponse(addCheck((org.ccsds.moims.mo.mal.structures.StringList) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.StringList()), + (org.ccsds.moims.mo.mc.check.structures.CheckDefinitionDetailsList) body.getBodyElement(1, new org.ccsds.moims.mo.mc.check.structures.CheckDefinitionDetailsList()), + interaction)); + break; + case org.ccsds.moims.mo.mc.check.CheckServiceInfo._UPDATEDEFINITION_OP_NUMBER: + interaction.sendResponse(updateDefinition((org.ccsds.moims.mo.mal.structures.LongList) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.LongList()), + (org.ccsds.moims.mo.mc.check.structures.CheckDefinitionDetailsList) body.getBodyElement(1, new org.ccsds.moims.mo.mc.check.structures.CheckDefinitionDetailsList()), + interaction)); + break; + case org.ccsds.moims.mo.mc.check.CheckServiceInfo._ADDPARAMETERCHECK_OP_NUMBER: + interaction.sendResponse(addParameterCheck((org.ccsds.moims.mo.mc.check.structures.CheckLinkDetailsList) body.getBodyElement(0, new org.ccsds.moims.mo.mc.check.structures.CheckLinkDetailsList()), + (org.ccsds.moims.mo.com.structures.ObjectDetailsList) body.getBodyElement(1, new org.ccsds.moims.mo.com.structures.ObjectDetailsList()), + interaction)); + break; + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } catch (org.ccsds.moims.mo.mal.MOErrorException error) { + throw new org.ccsds.moims.mo.mal.MALInteractionException(error); + } + } + + @Override + public void handleInvoke(org.ccsds.moims.mo.mal.provider.MALInvoke interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + switch (opNumber) { + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } + + @Override + public void handleProgress(org.ccsds.moims.mo.mal.provider.MALProgress interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + try { + switch (opNumber) { + case org.ccsds.moims.mo.mc.check.CheckServiceInfo._GETCURRENTTRANSITIONLIST_OP_NUMBER: + getCurrentTransitionList((org.ccsds.moims.mo.mc.check.structures.CheckResultFilter) body.getBodyElement(0, new org.ccsds.moims.mo.mc.check.structures.CheckResultFilter()), + new GetCurrentTransitionListInteraction(interaction)); + break; + case org.ccsds.moims.mo.mc.check.CheckServiceInfo._GETSUMMARYREPORT_OP_NUMBER: + getSummaryReport((org.ccsds.moims.mo.mal.structures.LongList) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.LongList()), + new GetSummaryReportInteraction(interaction)); + break; + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } catch (org.ccsds.moims.mo.mal.MOErrorException error) { + throw new org.ccsds.moims.mo.mal.MALInteractionException(error); + } + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/provider/CheckSkeleton.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/provider/CheckSkeleton.java new file mode 100644 index 00000000..796da3b0 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/provider/CheckSkeleton.java @@ -0,0 +1,8 @@ +package org.ccsds.moims.mo.mc.check.provider; + +/** + * The skeleton interface for the Check service. + */ +public interface CheckSkeleton { + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/provider/GetCurrentTransitionListInteraction.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/provider/GetCurrentTransitionListInteraction.java new file mode 100644 index 00000000..fcc3b42a --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/provider/GetCurrentTransitionListInteraction.java @@ -0,0 +1,94 @@ +package org.ccsds.moims.mo.mc.check.provider; + +/** + * Provider PROGRESS interaction class for Check::getCurrentTransitionList + * operation. + */ +public class GetCurrentTransitionListInteraction { + + /** + * The interaction field. + */ + private org.ccsds.moims.mo.mal.provider.MALProgress interaction; + + /** + * Wraps the provided MAL interaction object with methods for sending responses + * to an PROGRESS interaction from a provider. + * + * @param interaction The MAL interaction action object to use. + */ + public GetCurrentTransitionListInteraction(org.ccsds.moims.mo.mal.provider.MALProgress interaction) { + this.interaction = interaction; + } + + /** + * Returns the MAL interaction object used for returning messages from the + * provider. + * + * @return The MAL interaction object provided in the constructor + */ + public org.ccsds.moims.mo.mal.provider.MALProgress getInteraction() { + return interaction; + } + + /** + * Sends a PROGRESS acknowledge to the consumer. + * + * @return Returns the MAL message created by the acknowledge + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage sendAcknowledgement() throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return interaction.sendAcknowledgement((Object[]) null); + } + + /** + * Sends a PROGRESS update to the consumer. + * + * @param updateSummaries The returned list shall contain an entry for each matched check returning the object instance identifier and the latest CheckResult for that CheckLink object. + * @return Returns the MAL message created by the update + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage sendUpdate(org.ccsds.moims.mo.mc.check.structures.CheckResultSummaryList updateSummaries) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return interaction.sendUpdate(updateSummaries); + } + + /** + * Sends a PROGRESS response to the consumer. + * + * @param responseSummaries The PROGRESS pattern is used to allow the possibly large list of filtered check results to be split into several updates. +The size of the lists returned in each update and final response is implementation specific. + * @return Returns the MAL message created by the response + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage sendResponse(org.ccsds.moims.mo.mc.check.structures.CheckResultSummaryList responseSummaries) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return interaction.sendResponse(responseSummaries); + } + + /** + * Sends an error to the consumer. + * + * @param error error The MAL error to send to the consumer. + * @return Returns the MAL message created by the error + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage sendError(org.ccsds.moims.mo.mal.MOErrorException error) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return interaction.sendError(error); + } + + /** + * Sends an update error to the consumer. + * + * @param error error The MAL error to send to the consumer. + * @return Returns the MAL message created by the error + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage sendUpdateError(org.ccsds.moims.mo.mal.MOErrorException error) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return interaction.sendUpdateError(error); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/provider/GetSummaryReportInteraction.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/provider/GetSummaryReportInteraction.java new file mode 100644 index 00000000..c643dff2 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/provider/GetSummaryReportInteraction.java @@ -0,0 +1,98 @@ +package org.ccsds.moims.mo.mc.check.provider; + +/** + * Provider PROGRESS interaction class for Check::getSummaryReport operation. + */ +public class GetSummaryReportInteraction { + + /** + * The interaction field. + */ + private org.ccsds.moims.mo.mal.provider.MALProgress interaction; + + /** + * Wraps the provided MAL interaction object with methods for sending responses + * to an PROGRESS interaction from a provider. + * + * @param interaction The MAL interaction action object to use. + */ + public GetSummaryReportInteraction(org.ccsds.moims.mo.mal.provider.MALProgress interaction) { + this.interaction = interaction; + } + + /** + * Returns the MAL interaction object used for returning messages from the + * provider. + * + * @return The MAL interaction object provided in the constructor + */ + public org.ccsds.moims.mo.mal.provider.MALProgress getInteraction() { + return interaction; + } + + /** + * Sends a PROGRESS acknowledge to the consumer. + * + * @return Returns the MAL message created by the acknowledge + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage sendAcknowledgement() throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return interaction.sendAcknowledgement((Object[]) null); + } + + /** + * Sends a PROGRESS update to the consumer. + * + * @param updateObjInstIds The returned updates and final response shall contain an entry for each requested CheckIdentity. +The first part of the update shall be the CheckIdentity object instance identifier. +The second part shall be the list of all CheckLink object instance identifiers and CheckResults associated with that CheckIdentity. + * @param updateSummaries updateSummaries Argument number 1 as defined by the service operation + * @return Returns the MAL message created by the update + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage sendUpdate(Long updateObjInstIds, + org.ccsds.moims.mo.mc.check.structures.CheckResultSummaryList updateSummaries) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return interaction.sendUpdate((updateObjInstIds == null) ? null : new org.ccsds.moims.mo.mal.structures.Union(updateObjInstIds), updateSummaries); + } + + /** + * Sends a PROGRESS response to the consumer. + * + * @param responseObjInstIds responseObjInstIds Argument number 0 as defined by the service operation + * @param responseSummaries responseSummaries Argument number 1 as defined by the service operation + * @return Returns the MAL message created by the response + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage sendResponse(Long responseObjInstIds, + org.ccsds.moims.mo.mc.check.structures.CheckResultSummaryList responseSummaries) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return interaction.sendResponse((responseObjInstIds == null) ? null : new org.ccsds.moims.mo.mal.structures.Union(responseObjInstIds), responseSummaries); + } + + /** + * Sends an error to the consumer. + * + * @param error error The MAL error to send to the consumer. + * @return Returns the MAL message created by the error + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage sendError(org.ccsds.moims.mo.mal.MOErrorException error) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return interaction.sendError(error); + } + + /** + * Sends an update error to the consumer. + * + * @param error error The MAL error to send to the consumer. + * @return Returns the MAL message created by the error + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage sendUpdateError(org.ccsds.moims.mo.mal.MOErrorException error) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return interaction.sendUpdateError(error); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/provider/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/provider/package-info.java new file mode 100644 index 00000000..02794f5b --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/provider/package-info.java @@ -0,0 +1,4 @@ +/** + * Package containing the provider skeletons for the Check service. +*/ +package org.ccsds.moims.mo.mc.check.provider; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/CheckDefinitionDetails.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/CheckDefinitionDetails.java new file mode 100644 index 00000000..bbbba636 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/CheckDefinitionDetails.java @@ -0,0 +1,298 @@ +package org.ccsds.moims.mo.mc.check.structures; + +/** + * The CheckDefinitionDetails structure holds the definition of a check. + */ +public abstract class CheckDefinitionDetails implements org.ccsds.moims.mo.mal.structures.Composite { + + /** + * The description of the check. May be empty. + */ + private String description; + + /** + * Indicates the seriousness of the violation based on its possible negative + * consequences. + */ + private org.ccsds.moims.mo.mc.structures.Severity checkSeverity; + + /** + * Maximum interval that can elapse between generations of CheckResult reports. + * If this value expires, then a CheckResult is generated with the same state + * for the previous and current state. If set to "0", then no maximum + * reporting interval shall be applied. + */ + private org.ccsds.moims.mo.mal.structures.Duration maxReportingInterval; + + /** + * Number of consecutive valid samples passing the check for the check to + * be OK. + */ + private org.ccsds.moims.mo.mal.structures.UInteger nominalCount; + + /** + * If nominalCount is zero then this is duration that a parameter is continuously + * passing the check for the check to be OK. If nominalCount is not zero then + * this is the period over which samples will be used in the nominalCount + * calculation, i.e. samples further in the past than nominalTime are not + * considered. + */ + private org.ccsds.moims.mo.mal.structures.Duration nominalTime; + + /** + * Number of consecutive valid samples violating the check for the check to + * be in violation. + */ + private org.ccsds.moims.mo.mal.structures.UInteger violationCount; + + /** + * If violationCount is zero then this is duration that a parameter is continuously + * violating the check for the check to be in violation. If violationCount + * not zero then this is the period over which samples will be used in the + * violationCount calculation, i.e. samples further in the past than violationTime + * are not considered. + */ + private org.ccsds.moims.mo.mal.structures.Duration violationTime; + + /** + * Default constructor for CheckDefinitionDetails. + * + */ + public CheckDefinitionDetails() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param description The description of the check. May be empty. + * @param checkSeverity Indicates the seriousness of the violation based on its possible negative consequences. + * @param maxReportingInterval Maximum interval that can elapse between generations of CheckResult reports. If this value expires, then a CheckResult is generated with the same state for the previous and current state. If set to '0', then no maximum reporting interval shall be applied. + * @param nominalCount Number of consecutive valid samples passing the check for the check to be OK. + * @param nominalTime If nominalCount is zero then this is duration that a parameter is continuously passing the check for the check to be OK. If nominalCount is not zero then this is the period over which samples will be used in the nominalCount calculation, i.e. samples further in the past than nominalTime are not considered. + * @param violationCount Number of consecutive valid samples violating the check for the check to be in violation. + * @param violationTime If violationCount is zero then this is duration that a parameter is continuously violating the check for the check to be in violation. If violationCount not zero then this is the period over which samples will be used in the violationCount calculation, i.e. samples further in the past than violationTime are not considered. + */ + public CheckDefinitionDetails(String description, + org.ccsds.moims.mo.mc.structures.Severity checkSeverity, + org.ccsds.moims.mo.mal.structures.Duration maxReportingInterval, + org.ccsds.moims.mo.mal.structures.UInteger nominalCount, + org.ccsds.moims.mo.mal.structures.Duration nominalTime, + org.ccsds.moims.mo.mal.structures.UInteger violationCount, + org.ccsds.moims.mo.mal.structures.Duration violationTime) { + this.description = description; + this.checkSeverity = checkSeverity; + this.maxReportingInterval = maxReportingInterval; + this.nominalCount = nominalCount; + this.nominalTime = nominalTime; + this.violationCount = violationCount; + this.violationTime = violationTime; + } + + /** + * Returns the field description. + * + * @return The field description + */ + public String getDescription() { + return description; + } + + /** + * Returns the field checkSeverity. + * + * @return The field checkSeverity + */ + public org.ccsds.moims.mo.mc.structures.Severity getCheckSeverity() { + return checkSeverity; + } + + /** + * Returns the field maxReportingInterval. + * + * @return The field maxReportingInterval + */ + public org.ccsds.moims.mo.mal.structures.Duration getMaxReportingInterval() { + return maxReportingInterval; + } + + /** + * Returns the field nominalCount. + * + * @return The field nominalCount + */ + public org.ccsds.moims.mo.mal.structures.UInteger getNominalCount() { + return nominalCount; + } + + /** + * Returns the field nominalTime. + * + * @return The field nominalTime + */ + public org.ccsds.moims.mo.mal.structures.Duration getNominalTime() { + return nominalTime; + } + + /** + * Returns the field violationCount. + * + * @return The field violationCount + */ + public org.ccsds.moims.mo.mal.structures.UInteger getViolationCount() { + return violationCount; + } + + /** + * Returns the field violationTime. + * + * @return The field violationTime + */ + public org.ccsds.moims.mo.mal.structures.Duration getViolationTime() { + return violationTime; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof CheckDefinitionDetails) { + CheckDefinitionDetails other = (CheckDefinitionDetails) obj; + if (description == null) { + if (other.description != null) { + return false; + } + } else { + if (! description.equals(other.description)) { + return false; + } + } + if (checkSeverity == null) { + if (other.checkSeverity != null) { + return false; + } + } else { + if (! checkSeverity.equals(other.checkSeverity)) { + return false; + } + } + if (maxReportingInterval == null) { + if (other.maxReportingInterval != null) { + return false; + } + } else { + if (! maxReportingInterval.equals(other.maxReportingInterval)) { + return false; + } + } + if (nominalCount == null) { + if (other.nominalCount != null) { + return false; + } + } else { + if (! nominalCount.equals(other.nominalCount)) { + return false; + } + } + if (nominalTime == null) { + if (other.nominalTime != null) { + return false; + } + } else { + if (! nominalTime.equals(other.nominalTime)) { + return false; + } + } + if (violationCount == null) { + if (other.violationCount != null) { + return false; + } + } else { + if (! violationCount.equals(other.violationCount)) { + return false; + } + } + if (violationTime == null) { + if (other.violationTime != null) { + return false; + } + } else { + if (! violationTime.equals(other.violationTime)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (description != null ? description.hashCode() : 0); + hash = 83 * hash + (checkSeverity != null ? checkSeverity.hashCode() : 0); + hash = 83 * hash + (maxReportingInterval != null ? maxReportingInterval.hashCode() : 0); + hash = 83 * hash + (nominalCount != null ? nominalCount.hashCode() : 0); + hash = 83 * hash + (nominalTime != null ? nominalTime.hashCode() : 0); + hash = 83 * hash + (violationCount != null ? violationCount.hashCode() : 0); + hash = 83 * hash + (violationTime != null ? violationTime.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(CheckDefinitionDetails: "); + buf.append("description=").append(description); + buf.append(", checkSeverity=").append(checkSeverity); + buf.append(", maxReportingInterval=").append(maxReportingInterval); + buf.append(", nominalCount=").append(nominalCount); + buf.append(", nominalTime=").append(nominalTime); + buf.append(", violationCount=").append(violationCount); + buf.append(", violationTime=").append(violationTime); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (description == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'description' cannot be null!"); + } + if (checkSeverity == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'checkSeverity' cannot be null!"); + } + if (maxReportingInterval == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'maxReportingInterval' cannot be null!"); + } + if (nominalCount == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'nominalCount' cannot be null!"); + } + if (nominalTime == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'nominalTime' cannot be null!"); + } + if (violationCount == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'violationCount' cannot be null!"); + } + if (violationTime == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'violationTime' cannot be null!"); + } + encoder.encodeString(description); + encoder.encodeElement(checkSeverity); + encoder.encodeDuration(maxReportingInterval); + encoder.encodeUInteger(nominalCount); + encoder.encodeDuration(nominalTime); + encoder.encodeUInteger(violationCount); + encoder.encodeDuration(violationTime); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + description = decoder.decodeString(); + checkSeverity = (org.ccsds.moims.mo.mc.structures.Severity) decoder.decodeElement(org.ccsds.moims.mo.mc.structures.Severity.INFORMATIONAL); + maxReportingInterval = decoder.decodeDuration(); + nominalCount = decoder.decodeUInteger(); + nominalTime = decoder.decodeDuration(); + violationCount = decoder.decodeUInteger(); + violationTime = decoder.decodeDuration(); + return this; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/CheckDefinitionDetailsList.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/CheckDefinitionDetailsList.java new file mode 100644 index 00000000..ca62de60 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/CheckDefinitionDetailsList.java @@ -0,0 +1,23 @@ +package org.ccsds.moims.mo.mc.check.structures; + +/** + * List class for CheckDefinitionDetails. + */ +public final class CheckDefinitionDetailsList extends org.ccsds.moims.mo.mal.structures.HeterogeneousList { + + /** + * Default constructor for CheckDefinitionDetailsList. + * + */ + public CheckDefinitionDetailsList() { + } + + @Override + public boolean add(org.ccsds.moims.mo.mal.structures.Element element) { + if (element != null && !(element instanceof CheckDefinitionDetails)) { + throw new java.lang.ClassCastException("The added element does not extend the type: CheckDefinitionDetails"); + } + return super.add(element); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/CheckLinkDetails.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/CheckLinkDetails.java new file mode 100644 index 00000000..b8f45625 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/CheckLinkDetails.java @@ -0,0 +1,261 @@ +package org.ccsds.moims.mo.mc.check.structures; + +/** + * The CheckLinkDetails structure represents the link from a check definition + * to a check result for a specific parameter. + */ +public final class CheckLinkDetails implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1125917103489025L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125917103489025L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * TRUE if the check instance is enabled. + */ + private Boolean checkEnabled; + + /** + * If TRUE then any change to state or value of the parameter, or the check + * condition will trigger a check evaluation. Ignored for Compound checks. + */ + private Boolean checkOnChange; + + /** + * If set to TRUE the converted value field of the parameter value should + * be used, otherwise the raw value field should be used. Ignored for Compound + * checks. + */ + private Boolean useConverted; + + /** + * The interval that a check should be applied. Only applicable if checkOnChange + * is FALSE. If "0", then no periodic checking shall be performed, + * and a check will be triggered by another mechanism. Ignored for Compound + * checks. + */ + private org.ccsds.moims.mo.mal.structures.Duration checkInterval; + + /** + * Should this check be applied, if NULL then always applied. + */ + private org.ccsds.moims.mo.mc.structures.ParameterExpression condition; + + /** + * Default constructor for CheckLinkDetails. + * + */ + public CheckLinkDetails() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param checkEnabled TRUE if the check instance is enabled. + * @param checkOnChange If TRUE then any change to state or value of the parameter, or the check condition will trigger a check evaluation. Ignored for Compound checks. + * @param useConverted If set to TRUE the converted value field of the parameter value should be used, otherwise the raw value field should be used. Ignored for Compound checks. + * @param checkInterval The interval that a check should be applied. Only applicable if checkOnChange is FALSE. If '0', then no periodic checking shall be performed, and a check will be triggered by another mechanism. Ignored for Compound checks. + * @param condition Should this check be applied, if NULL then always applied. + */ + public CheckLinkDetails(Boolean checkEnabled, + Boolean checkOnChange, + Boolean useConverted, + org.ccsds.moims.mo.mal.structures.Duration checkInterval, + org.ccsds.moims.mo.mc.structures.ParameterExpression condition) { + this.checkEnabled = checkEnabled; + this.checkOnChange = checkOnChange; + this.useConverted = useConverted; + this.checkInterval = checkInterval; + this.condition = condition; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param checkEnabled TRUE if the check instance is enabled. + * @param checkOnChange If TRUE then any change to state or value of the parameter, or the check condition will trigger a check evaluation. Ignored for Compound checks. + * @param useConverted If set to TRUE the converted value field of the parameter value should be used, otherwise the raw value field should be used. Ignored for Compound checks. + * @param checkInterval The interval that a check should be applied. Only applicable if checkOnChange is FALSE. If '0', then no periodic checking shall be performed, and a check will be triggered by another mechanism. Ignored for Compound checks. + */ + public CheckLinkDetails(Boolean checkEnabled, + Boolean checkOnChange, + Boolean useConverted, + org.ccsds.moims.mo.mal.structures.Duration checkInterval) { + this.checkEnabled = checkEnabled; + this.checkOnChange = checkOnChange; + this.useConverted = useConverted; + this.checkInterval = checkInterval; + this.condition = null; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mc.check.structures.CheckLinkDetails(); + } + + /** + * Returns the field checkEnabled. + * + * @return The field checkEnabled + */ + public Boolean getCheckEnabled() { + return checkEnabled; + } + + /** + * Returns the field checkOnChange. + * + * @return The field checkOnChange + */ + public Boolean getCheckOnChange() { + return checkOnChange; + } + + /** + * Returns the field useConverted. + * + * @return The field useConverted + */ + public Boolean getUseConverted() { + return useConverted; + } + + /** + * Returns the field checkInterval. + * + * @return The field checkInterval + */ + public org.ccsds.moims.mo.mal.structures.Duration getCheckInterval() { + return checkInterval; + } + + /** + * Returns the field condition. + * + * @return The field condition + */ + public org.ccsds.moims.mo.mc.structures.ParameterExpression getCondition() { + return condition; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof CheckLinkDetails) { + CheckLinkDetails other = (CheckLinkDetails) obj; + if (checkEnabled == null) { + if (other.checkEnabled != null) { + return false; + } + } else { + if (! checkEnabled.equals(other.checkEnabled)) { + return false; + } + } + if (checkOnChange == null) { + if (other.checkOnChange != null) { + return false; + } + } else { + if (! checkOnChange.equals(other.checkOnChange)) { + return false; + } + } + if (useConverted == null) { + if (other.useConverted != null) { + return false; + } + } else { + if (! useConverted.equals(other.useConverted)) { + return false; + } + } + if (checkInterval == null) { + if (other.checkInterval != null) { + return false; + } + } else { + if (! checkInterval.equals(other.checkInterval)) { + return false; + } + } + if (condition == null) { + if (other.condition != null) { + return false; + } + } else { + if (! condition.equals(other.condition)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (checkEnabled != null ? checkEnabled.hashCode() : 0); + hash = 83 * hash + (checkOnChange != null ? checkOnChange.hashCode() : 0); + hash = 83 * hash + (useConverted != null ? useConverted.hashCode() : 0); + hash = 83 * hash + (checkInterval != null ? checkInterval.hashCode() : 0); + hash = 83 * hash + (condition != null ? condition.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(CheckLinkDetails: "); + buf.append("checkEnabled=").append(checkEnabled); + buf.append(", checkOnChange=").append(checkOnChange); + buf.append(", useConverted=").append(useConverted); + buf.append(", checkInterval=").append(checkInterval); + buf.append(", condition=").append(condition); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (checkEnabled == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'checkEnabled' cannot be null!"); + } + if (checkOnChange == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'checkOnChange' cannot be null!"); + } + if (useConverted == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'useConverted' cannot be null!"); + } + if (checkInterval == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'checkInterval' cannot be null!"); + } + encoder.encodeBoolean(checkEnabled); + encoder.encodeBoolean(checkOnChange); + encoder.encodeBoolean(useConverted); + encoder.encodeDuration(checkInterval); + encoder.encodeNullableElement(condition); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + checkEnabled = decoder.decodeBoolean(); + checkOnChange = decoder.decodeBoolean(); + useConverted = decoder.decodeBoolean(); + checkInterval = decoder.decodeDuration(); + condition = (org.ccsds.moims.mo.mc.structures.ParameterExpression) decoder.decodeNullableElement(new org.ccsds.moims.mo.mc.structures.ParameterExpression()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/CheckLinkDetailsList.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/CheckLinkDetailsList.java new file mode 100644 index 00000000..a0ae8676 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/CheckLinkDetailsList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mc.check.structures; + +/** + * List class for CheckLinkDetails. + */ +public final class CheckLinkDetailsList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1125917120266239L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125917120266239L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for CheckLinkDetailsList. + * + */ + public CheckLinkDetailsList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public CheckLinkDetailsList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public CheckLinkDetailsList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mc.check.structures.CheckLinkDetails element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mc.check.structures.CheckLinkDetails element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new CheckLinkDetailsList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mc.check.structures.CheckLinkDetails(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/CheckLinkSummary.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/CheckLinkSummary.java new file mode 100644 index 00000000..1e2160d5 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/CheckLinkSummary.java @@ -0,0 +1,256 @@ +package org.ccsds.moims.mo.mc.check.structures; + +/** + * The CheckLinkSummary structure holds the ids of a specific check link and + * the check and parameter it links to. + */ +public final class CheckLinkSummary implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1125917103489027L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125917103489027L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * The object instance identifier of the CheckIdentity object. + */ + private Long checkId; + + /** + * The object instance identifier of the CheckLink object. + */ + private Long linkId; + + /** + * Contains the object instance identifier of the CheckLinkDefinition object. + */ + private Long linkDefinitionId; + + /** + * TRUE if the check instance is enabled. + */ + private Boolean checkEnabled; + + /** + * The object instance identifier of the ParameterIdentity object for the + * check link. NULL for Compound checks. + */ + private org.ccsds.moims.mo.com.structures.ObjectKey parameterId; + + /** + * Default constructor for CheckLinkSummary. + * + */ + public CheckLinkSummary() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param checkId The object instance identifier of the CheckIdentity object. + * @param linkId The object instance identifier of the CheckLink object. + * @param linkDefinitionId Contains the object instance identifier of the CheckLinkDefinition object. + * @param checkEnabled TRUE if the check instance is enabled. + * @param parameterId The object instance identifier of the ParameterIdentity object for the check link. NULL for Compound checks. + */ + public CheckLinkSummary(Long checkId, + Long linkId, + Long linkDefinitionId, + Boolean checkEnabled, + org.ccsds.moims.mo.com.structures.ObjectKey parameterId) { + this.checkId = checkId; + this.linkId = linkId; + this.linkDefinitionId = linkDefinitionId; + this.checkEnabled = checkEnabled; + this.parameterId = parameterId; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param checkId The object instance identifier of the CheckIdentity object. + * @param linkId The object instance identifier of the CheckLink object. + * @param linkDefinitionId Contains the object instance identifier of the CheckLinkDefinition object. + * @param checkEnabled TRUE if the check instance is enabled. + */ + public CheckLinkSummary(Long checkId, + Long linkId, + Long linkDefinitionId, + Boolean checkEnabled) { + this.checkId = checkId; + this.linkId = linkId; + this.linkDefinitionId = linkDefinitionId; + this.checkEnabled = checkEnabled; + this.parameterId = null; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mc.check.structures.CheckLinkSummary(); + } + + /** + * Returns the field checkId. + * + * @return The field checkId + */ + public Long getCheckId() { + return checkId; + } + + /** + * Returns the field linkId. + * + * @return The field linkId + */ + public Long getLinkId() { + return linkId; + } + + /** + * Returns the field linkDefinitionId. + * + * @return The field linkDefinitionId + */ + public Long getLinkDefinitionId() { + return linkDefinitionId; + } + + /** + * Returns the field checkEnabled. + * + * @return The field checkEnabled + */ + public Boolean getCheckEnabled() { + return checkEnabled; + } + + /** + * Returns the field parameterId. + * + * @return The field parameterId + */ + public org.ccsds.moims.mo.com.structures.ObjectKey getParameterId() { + return parameterId; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof CheckLinkSummary) { + CheckLinkSummary other = (CheckLinkSummary) obj; + if (checkId == null) { + if (other.checkId != null) { + return false; + } + } else { + if (! checkId.equals(other.checkId)) { + return false; + } + } + if (linkId == null) { + if (other.linkId != null) { + return false; + } + } else { + if (! linkId.equals(other.linkId)) { + return false; + } + } + if (linkDefinitionId == null) { + if (other.linkDefinitionId != null) { + return false; + } + } else { + if (! linkDefinitionId.equals(other.linkDefinitionId)) { + return false; + } + } + if (checkEnabled == null) { + if (other.checkEnabled != null) { + return false; + } + } else { + if (! checkEnabled.equals(other.checkEnabled)) { + return false; + } + } + if (parameterId == null) { + if (other.parameterId != null) { + return false; + } + } else { + if (! parameterId.equals(other.parameterId)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (checkId != null ? checkId.hashCode() : 0); + hash = 83 * hash + (linkId != null ? linkId.hashCode() : 0); + hash = 83 * hash + (linkDefinitionId != null ? linkDefinitionId.hashCode() : 0); + hash = 83 * hash + (checkEnabled != null ? checkEnabled.hashCode() : 0); + hash = 83 * hash + (parameterId != null ? parameterId.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(CheckLinkSummary: "); + buf.append("checkId=").append(checkId); + buf.append(", linkId=").append(linkId); + buf.append(", linkDefinitionId=").append(linkDefinitionId); + buf.append(", checkEnabled=").append(checkEnabled); + buf.append(", parameterId=").append(parameterId); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (checkId == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'checkId' cannot be null!"); + } + if (linkId == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'linkId' cannot be null!"); + } + if (linkDefinitionId == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'linkDefinitionId' cannot be null!"); + } + if (checkEnabled == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'checkEnabled' cannot be null!"); + } + encoder.encodeLong(checkId); + encoder.encodeLong(linkId); + encoder.encodeLong(linkDefinitionId); + encoder.encodeBoolean(checkEnabled); + encoder.encodeNullableElement(parameterId); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + checkId = decoder.decodeLong(); + linkId = decoder.decodeLong(); + linkDefinitionId = decoder.decodeLong(); + checkEnabled = decoder.decodeBoolean(); + parameterId = (org.ccsds.moims.mo.com.structures.ObjectKey) decoder.decodeNullableElement(new org.ccsds.moims.mo.com.structures.ObjectKey()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/CheckLinkSummaryList.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/CheckLinkSummaryList.java new file mode 100644 index 00000000..256ce40a --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/CheckLinkSummaryList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mc.check.structures; + +/** + * List class for CheckLinkSummary. + */ +public final class CheckLinkSummaryList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1125917120266237L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125917120266237L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for CheckLinkSummaryList. + * + */ + public CheckLinkSummaryList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public CheckLinkSummaryList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public CheckLinkSummaryList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mc.check.structures.CheckLinkSummary element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mc.check.structures.CheckLinkSummary element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new CheckLinkSummaryList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mc.check.structures.CheckLinkSummary(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/CheckResult.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/CheckResult.java new file mode 100644 index 00000000..5433b622 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/CheckResult.java @@ -0,0 +1,221 @@ +package org.ccsds.moims.mo.mc.check.structures; + +/** + * The CheckResult structure holds basic information about the check state + * and the value of the parameter at the time of the check. The timestamp + * of the event is the transition time of the check. + */ +public final class CheckResult implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1125917103489026L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125917103489026L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * The previous evaluation state of the check. Initially UNCHECKED for the + * first transition of a check. For check evaluations that do not detect a + * check transition, this value will be the same as the currentCheckState. + */ + private org.ccsds.moims.mo.mc.check.structures.CheckState previousCheckState; + + /** + * The current evaluation state of the check. + */ + private org.ccsds.moims.mo.mc.check.structures.CheckState currentCheckState; + + /** + * The object instance identifier of the ParameterDefinition used for the + * check evaluation. NULL if compound check. + */ + private Long paramDefInstId; + + /** + * This is the value of the parameter or for a compound check the number of + * checks in violation at the time of a check state transition, or if it is + * a report due to the CheckDefinitionDetails maxReportingInterval expiring, + * then it is the value or the number when the interval expired. + */ + private org.ccsds.moims.mo.mal.structures.Attribute checkedValue; + + /** + * Default constructor for CheckResult. + * + */ + public CheckResult() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param previousCheckState The previous evaluation state of the check. Initially UNCHECKED for the first transition of a check. For check evaluations that do not detect a check transition, this value will be the same as the currentCheckState. + * @param currentCheckState The current evaluation state of the check + * @param paramDefInstId The object instance identifier of the ParameterDefinition used for the check evaluation. NULL if compound check. + * @param checkedValue This is the value of the parameter or for a compound check the number of checks in violation at the time of a check state transition, or if it is a report due to the CheckDefinitionDetails maxReportingInterval expiring, then it is the value or the number when the interval expired. + */ + public CheckResult(org.ccsds.moims.mo.mc.check.structures.CheckState previousCheckState, + org.ccsds.moims.mo.mc.check.structures.CheckState currentCheckState, + Long paramDefInstId, + org.ccsds.moims.mo.mal.structures.Attribute checkedValue) { + this.previousCheckState = previousCheckState; + this.currentCheckState = currentCheckState; + this.paramDefInstId = paramDefInstId; + this.checkedValue = checkedValue; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param previousCheckState The previous evaluation state of the check. Initially UNCHECKED for the first transition of a check. For check evaluations that do not detect a check transition, this value will be the same as the currentCheckState. + * @param currentCheckState The current evaluation state of the check + */ + public CheckResult(org.ccsds.moims.mo.mc.check.structures.CheckState previousCheckState, + org.ccsds.moims.mo.mc.check.structures.CheckState currentCheckState) { + this.previousCheckState = previousCheckState; + this.currentCheckState = currentCheckState; + this.paramDefInstId = null; + this.checkedValue = null; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mc.check.structures.CheckResult(); + } + + /** + * Returns the field previousCheckState. + * + * @return The field previousCheckState + */ + public org.ccsds.moims.mo.mc.check.structures.CheckState getPreviousCheckState() { + return previousCheckState; + } + + /** + * Returns the field currentCheckState. + * + * @return The field currentCheckState + */ + public org.ccsds.moims.mo.mc.check.structures.CheckState getCurrentCheckState() { + return currentCheckState; + } + + /** + * Returns the field paramDefInstId. + * + * @return The field paramDefInstId + */ + public Long getParamDefInstId() { + return paramDefInstId; + } + + /** + * Returns the field checkedValue. + * + * @return The field checkedValue + */ + public org.ccsds.moims.mo.mal.structures.Attribute getCheckedValue() { + return checkedValue; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof CheckResult) { + CheckResult other = (CheckResult) obj; + if (previousCheckState == null) { + if (other.previousCheckState != null) { + return false; + } + } else { + if (! previousCheckState.equals(other.previousCheckState)) { + return false; + } + } + if (currentCheckState == null) { + if (other.currentCheckState != null) { + return false; + } + } else { + if (! currentCheckState.equals(other.currentCheckState)) { + return false; + } + } + if (paramDefInstId == null) { + if (other.paramDefInstId != null) { + return false; + } + } else { + if (! paramDefInstId.equals(other.paramDefInstId)) { + return false; + } + } + if (checkedValue == null) { + if (other.checkedValue != null) { + return false; + } + } else { + if (! checkedValue.equals(other.checkedValue)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (previousCheckState != null ? previousCheckState.hashCode() : 0); + hash = 83 * hash + (currentCheckState != null ? currentCheckState.hashCode() : 0); + hash = 83 * hash + (paramDefInstId != null ? paramDefInstId.hashCode() : 0); + hash = 83 * hash + (checkedValue != null ? checkedValue.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(CheckResult: "); + buf.append("previousCheckState=").append(previousCheckState); + buf.append(", currentCheckState=").append(currentCheckState); + buf.append(", paramDefInstId=").append(paramDefInstId); + buf.append(", checkedValue=").append(checkedValue); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (previousCheckState == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'previousCheckState' cannot be null!"); + } + if (currentCheckState == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'currentCheckState' cannot be null!"); + } + encoder.encodeElement(previousCheckState); + encoder.encodeElement(currentCheckState); + encoder.encodeNullableLong(paramDefInstId); + encoder.encodeNullableAttribute(checkedValue); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + previousCheckState = (org.ccsds.moims.mo.mc.check.structures.CheckState) decoder.decodeElement(org.ccsds.moims.mo.mc.check.structures.CheckState.DISABLED); + currentCheckState = (org.ccsds.moims.mo.mc.check.structures.CheckState) decoder.decodeElement(org.ccsds.moims.mo.mc.check.structures.CheckState.DISABLED); + paramDefInstId = decoder.decodeNullableLong(); + checkedValue = (org.ccsds.moims.mo.mal.structures.Attribute) decoder.decodeNullableAttribute(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/CheckResultFilter.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/CheckResultFilter.java new file mode 100644 index 00000000..80fc2c68 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/CheckResultFilter.java @@ -0,0 +1,248 @@ +package org.ccsds.moims.mo.mc.check.structures; + +/** + * The CheckResultFilter structure holds a filter for the current check result + * transition information. + */ +public final class CheckResultFilter implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1125917103489029L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125917103489029L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * If TRUE then the checkFilter field contains GroupIdentity object instance + * identifiers that link to CheckIdentity objects otherwise it contains CheckIdentity + * object instance identifiers directly. + */ + private Boolean checkFilterViaGroups; + + /** + * The list of GroupIdentity object instance identifiers if checkFilterViaGroups + * is TRUE otherwise the CheckIdentity object instance identifiers to filter + * on. A value of "0" means match all. + */ + private org.ccsds.moims.mo.mal.structures.LongList checkFilter; + + /** + * If TRUE then the parameterFilter field contains GroupIdentity object instance + * identifiers that link to ParameterIdentity objects otherwise it contains + * ParameterIdentity object instance identifiers directly. + */ + private Boolean parameterFilterViaGroups; + + /** + * The list of GroupIdentity object instance identifiers if parameterFilterViaGroups + * is TRUE otherwise the ParameterIdentity object instance identifiers to + * filter on. A value of "0" means match all. + */ + private org.ccsds.moims.mo.mal.structures.LongList parameterFilter; + + /** + * The list of required check states to filter on. Empty list means match + * all. + */ + private org.ccsds.moims.mo.mc.check.structures.CheckStateList stateFilter; + + /** + * Default constructor for CheckResultFilter. + * + */ + public CheckResultFilter() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param checkFilterViaGroups If TRUE then the checkFilter field contains GroupIdentity object instance identifiers that link to CheckIdentity objects otherwise it contains CheckIdentity object instance identifiers directly. + * @param checkFilter The list of GroupIdentity object instance identifiers if checkFilterViaGroups is TRUE otherwise the CheckIdentity object instance identifiers to filter on. A value of '0' means match all. + * @param parameterFilterViaGroups If TRUE then the parameterFilter field contains GroupIdentity object instance identifiers that link to ParameterIdentity objects otherwise it contains ParameterIdentity object instance identifiers directly. + * @param parameterFilter The list of GroupIdentity object instance identifiers if parameterFilterViaGroups is TRUE otherwise the ParameterIdentity object instance identifiers to filter on. A value of '0' means match all. + * @param stateFilter The list of required check states to filter on. Empty list means match all. + */ + public CheckResultFilter(Boolean checkFilterViaGroups, + org.ccsds.moims.mo.mal.structures.LongList checkFilter, + Boolean parameterFilterViaGroups, + org.ccsds.moims.mo.mal.structures.LongList parameterFilter, + org.ccsds.moims.mo.mc.check.structures.CheckStateList stateFilter) { + this.checkFilterViaGroups = checkFilterViaGroups; + this.checkFilter = checkFilter; + this.parameterFilterViaGroups = parameterFilterViaGroups; + this.parameterFilter = parameterFilter; + this.stateFilter = stateFilter; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mc.check.structures.CheckResultFilter(); + } + + /** + * Returns the field checkFilterViaGroups. + * + * @return The field checkFilterViaGroups + */ + public Boolean getCheckFilterViaGroups() { + return checkFilterViaGroups; + } + + /** + * Returns the field checkFilter. + * + * @return The field checkFilter + */ + public org.ccsds.moims.mo.mal.structures.LongList getCheckFilter() { + return checkFilter; + } + + /** + * Returns the field parameterFilterViaGroups. + * + * @return The field parameterFilterViaGroups + */ + public Boolean getParameterFilterViaGroups() { + return parameterFilterViaGroups; + } + + /** + * Returns the field parameterFilter. + * + * @return The field parameterFilter + */ + public org.ccsds.moims.mo.mal.structures.LongList getParameterFilter() { + return parameterFilter; + } + + /** + * Returns the field stateFilter. + * + * @return The field stateFilter + */ + public org.ccsds.moims.mo.mc.check.structures.CheckStateList getStateFilter() { + return stateFilter; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof CheckResultFilter) { + CheckResultFilter other = (CheckResultFilter) obj; + if (checkFilterViaGroups == null) { + if (other.checkFilterViaGroups != null) { + return false; + } + } else { + if (! checkFilterViaGroups.equals(other.checkFilterViaGroups)) { + return false; + } + } + if (checkFilter == null) { + if (other.checkFilter != null) { + return false; + } + } else { + if (! checkFilter.equals(other.checkFilter)) { + return false; + } + } + if (parameterFilterViaGroups == null) { + if (other.parameterFilterViaGroups != null) { + return false; + } + } else { + if (! parameterFilterViaGroups.equals(other.parameterFilterViaGroups)) { + return false; + } + } + if (parameterFilter == null) { + if (other.parameterFilter != null) { + return false; + } + } else { + if (! parameterFilter.equals(other.parameterFilter)) { + return false; + } + } + if (stateFilter == null) { + if (other.stateFilter != null) { + return false; + } + } else { + if (! stateFilter.equals(other.stateFilter)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (checkFilterViaGroups != null ? checkFilterViaGroups.hashCode() : 0); + hash = 83 * hash + (checkFilter != null ? checkFilter.hashCode() : 0); + hash = 83 * hash + (parameterFilterViaGroups != null ? parameterFilterViaGroups.hashCode() : 0); + hash = 83 * hash + (parameterFilter != null ? parameterFilter.hashCode() : 0); + hash = 83 * hash + (stateFilter != null ? stateFilter.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(CheckResultFilter: "); + buf.append("checkFilterViaGroups=").append(checkFilterViaGroups); + buf.append(", checkFilter=").append(checkFilter); + buf.append(", parameterFilterViaGroups=").append(parameterFilterViaGroups); + buf.append(", parameterFilter=").append(parameterFilter); + buf.append(", stateFilter=").append(stateFilter); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (checkFilterViaGroups == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'checkFilterViaGroups' cannot be null!"); + } + if (checkFilter == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'checkFilter' cannot be null!"); + } + if (parameterFilterViaGroups == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'parameterFilterViaGroups' cannot be null!"); + } + if (parameterFilter == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'parameterFilter' cannot be null!"); + } + if (stateFilter == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'stateFilter' cannot be null!"); + } + encoder.encodeBoolean(checkFilterViaGroups); + encoder.encodeElement(checkFilter); + encoder.encodeBoolean(parameterFilterViaGroups); + encoder.encodeElement(parameterFilter); + encoder.encodeElement(stateFilter); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + checkFilterViaGroups = decoder.decodeBoolean(); + checkFilter = (org.ccsds.moims.mo.mal.structures.LongList) decoder.decodeElement(new org.ccsds.moims.mo.mal.structures.LongList()); + parameterFilterViaGroups = decoder.decodeBoolean(); + parameterFilter = (org.ccsds.moims.mo.mal.structures.LongList) decoder.decodeElement(new org.ccsds.moims.mo.mal.structures.LongList()); + stateFilter = (org.ccsds.moims.mo.mc.check.structures.CheckStateList) decoder.decodeElement(new org.ccsds.moims.mo.mc.check.structures.CheckStateList()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/CheckResultFilterList.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/CheckResultFilterList.java new file mode 100644 index 00000000..30617208 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/CheckResultFilterList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mc.check.structures; + +/** + * List class for CheckResultFilter. + */ +public final class CheckResultFilterList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1125917120266235L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125917120266235L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for CheckResultFilterList. + * + */ + public CheckResultFilterList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public CheckResultFilterList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public CheckResultFilterList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mc.check.structures.CheckResultFilter element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mc.check.structures.CheckResultFilter element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new CheckResultFilterList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mc.check.structures.CheckResultFilter(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/CheckResultList.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/CheckResultList.java new file mode 100644 index 00000000..0cfc34d5 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/CheckResultList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mc.check.structures; + +/** + * List class for CheckResult. + */ +public final class CheckResultList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1125917120266238L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125917120266238L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for CheckResultList. + * + */ + public CheckResultList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public CheckResultList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public CheckResultList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mc.check.structures.CheckResult element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mc.check.structures.CheckResult element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new CheckResultList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mc.check.structures.CheckResult(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/CheckResultSummary.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/CheckResultSummary.java new file mode 100644 index 00000000..61eb1936 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/CheckResultSummary.java @@ -0,0 +1,257 @@ +package org.ccsds.moims.mo.mc.check.structures; + +/** + * The CheckResultSummary structure holds details about a specific check link + * and its evaluated result. + */ +public final class CheckResultSummary implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1125917103489028L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125917103489028L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * The object instance identifier of the check link. + */ + private Long linkId; + + /** + * The current enabled state of the check link. + */ + private Boolean checkEnabled; + + /** + * The object instance key of the ParameterIdentity being checked. NULL only + * for Compound checks. + */ + private org.ccsds.moims.mo.com.structures.ObjectKey parameterId; + + /** + * The timestamp of the check result. If as a result of max reporting interval + * expiring then it shall contain the expiration timestamp. + */ + private org.ccsds.moims.mo.mal.structures.Time evaluationTime; + + /** + * The check result value. + */ + private org.ccsds.moims.mo.mc.check.structures.CheckResult result; + + /** + * Default constructor for CheckResultSummary. + * + */ + public CheckResultSummary() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param linkId The object instance identifier of the check link. + * @param checkEnabled The current enabled state of the check link. + * @param parameterId The object instance key of the ParameterIdentity being checked. NULL only for Compound checks. + * @param evaluationTime The timestamp of the check result. If as a result of max reporting interval expiring then it shall contain the expiration timestamp. + * @param result The check result value. + */ + public CheckResultSummary(Long linkId, + Boolean checkEnabled, + org.ccsds.moims.mo.com.structures.ObjectKey parameterId, + org.ccsds.moims.mo.mal.structures.Time evaluationTime, + org.ccsds.moims.mo.mc.check.structures.CheckResult result) { + this.linkId = linkId; + this.checkEnabled = checkEnabled; + this.parameterId = parameterId; + this.evaluationTime = evaluationTime; + this.result = result; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param linkId The object instance identifier of the check link. + * @param checkEnabled The current enabled state of the check link. + * @param evaluationTime The timestamp of the check result. If as a result of max reporting interval expiring then it shall contain the expiration timestamp. + * @param result The check result value. + */ + public CheckResultSummary(Long linkId, + Boolean checkEnabled, + org.ccsds.moims.mo.mal.structures.Time evaluationTime, + org.ccsds.moims.mo.mc.check.structures.CheckResult result) { + this.linkId = linkId; + this.checkEnabled = checkEnabled; + this.parameterId = null; + this.evaluationTime = evaluationTime; + this.result = result; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mc.check.structures.CheckResultSummary(); + } + + /** + * Returns the field linkId. + * + * @return The field linkId + */ + public Long getLinkId() { + return linkId; + } + + /** + * Returns the field checkEnabled. + * + * @return The field checkEnabled + */ + public Boolean getCheckEnabled() { + return checkEnabled; + } + + /** + * Returns the field parameterId. + * + * @return The field parameterId + */ + public org.ccsds.moims.mo.com.structures.ObjectKey getParameterId() { + return parameterId; + } + + /** + * Returns the field evaluationTime. + * + * @return The field evaluationTime + */ + public org.ccsds.moims.mo.mal.structures.Time getEvaluationTime() { + return evaluationTime; + } + + /** + * Returns the field result. + * + * @return The field result + */ + public org.ccsds.moims.mo.mc.check.structures.CheckResult getResult() { + return result; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof CheckResultSummary) { + CheckResultSummary other = (CheckResultSummary) obj; + if (linkId == null) { + if (other.linkId != null) { + return false; + } + } else { + if (! linkId.equals(other.linkId)) { + return false; + } + } + if (checkEnabled == null) { + if (other.checkEnabled != null) { + return false; + } + } else { + if (! checkEnabled.equals(other.checkEnabled)) { + return false; + } + } + if (parameterId == null) { + if (other.parameterId != null) { + return false; + } + } else { + if (! parameterId.equals(other.parameterId)) { + return false; + } + } + if (evaluationTime == null) { + if (other.evaluationTime != null) { + return false; + } + } else { + if (! evaluationTime.equals(other.evaluationTime)) { + return false; + } + } + if (result == null) { + if (other.result != null) { + return false; + } + } else { + if (! result.equals(other.result)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (linkId != null ? linkId.hashCode() : 0); + hash = 83 * hash + (checkEnabled != null ? checkEnabled.hashCode() : 0); + hash = 83 * hash + (parameterId != null ? parameterId.hashCode() : 0); + hash = 83 * hash + (evaluationTime != null ? evaluationTime.hashCode() : 0); + hash = 83 * hash + (result != null ? result.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(CheckResultSummary: "); + buf.append("linkId=").append(linkId); + buf.append(", checkEnabled=").append(checkEnabled); + buf.append(", parameterId=").append(parameterId); + buf.append(", evaluationTime=").append(evaluationTime); + buf.append(", result=").append(result); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (linkId == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'linkId' cannot be null!"); + } + if (checkEnabled == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'checkEnabled' cannot be null!"); + } + if (evaluationTime == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'evaluationTime' cannot be null!"); + } + if (result == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'result' cannot be null!"); + } + encoder.encodeLong(linkId); + encoder.encodeBoolean(checkEnabled); + encoder.encodeNullableElement(parameterId); + encoder.encodeTime(evaluationTime); + encoder.encodeElement(result); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + linkId = decoder.decodeLong(); + checkEnabled = decoder.decodeBoolean(); + parameterId = (org.ccsds.moims.mo.com.structures.ObjectKey) decoder.decodeNullableElement(new org.ccsds.moims.mo.com.structures.ObjectKey()); + evaluationTime = decoder.decodeTime(); + result = (org.ccsds.moims.mo.mc.check.structures.CheckResult) decoder.decodeElement(new org.ccsds.moims.mo.mc.check.structures.CheckResult()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/CheckResultSummaryList.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/CheckResultSummaryList.java new file mode 100644 index 00000000..44a8148c --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/CheckResultSummaryList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mc.check.structures; + +/** + * List class for CheckResultSummary. + */ +public final class CheckResultSummaryList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1125917120266236L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125917120266236L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for CheckResultSummaryList. + * + */ + public CheckResultSummaryList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public CheckResultSummaryList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public CheckResultSummaryList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mc.check.structures.CheckResultSummary element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mc.check.structures.CheckResultSummary element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new CheckResultSummaryList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mc.check.structures.CheckResultSummary(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/CheckState.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/CheckState.java new file mode 100644 index 00000000..6ff7ef34 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/CheckState.java @@ -0,0 +1,167 @@ +package org.ccsds.moims.mo.mc.check.structures; + +/** + * Enumeration class for CheckState. + */ +public final class CheckState extends org.ccsds.moims.mo.mal.structures.Enumeration { + + private static final long serialVersionUID = 1125917103489030L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125917103489030L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Enumeration value for DISABLED. + */ + public static final int DISABLED_VALUE = 1; + + /** + * Enumeration singleton for value DISABLED. + */ + public static final org.ccsds.moims.mo.mc.check.structures.CheckState DISABLED = new org.ccsds.moims.mo.mc.check.structures.CheckState(org.ccsds.moims.mo.mc.check.structures.CheckState.DISABLED_VALUE); + + /** + * Enumeration value for UNCHECKED. + */ + public static final int UNCHECKED_VALUE = 2; + + /** + * Enumeration singleton for value UNCHECKED. + */ + public static final org.ccsds.moims.mo.mc.check.structures.CheckState UNCHECKED = new org.ccsds.moims.mo.mc.check.structures.CheckState(org.ccsds.moims.mo.mc.check.structures.CheckState.UNCHECKED_VALUE); + + /** + * Enumeration value for INVALID. + */ + public static final int INVALID_VALUE = 3; + + /** + * Enumeration singleton for value INVALID. + */ + public static final org.ccsds.moims.mo.mc.check.structures.CheckState INVALID = new org.ccsds.moims.mo.mc.check.structures.CheckState(org.ccsds.moims.mo.mc.check.structures.CheckState.INVALID_VALUE); + + /** + * Enumeration value for OK. + */ + public static final int OK_VALUE = 4; + + /** + * Enumeration singleton for value OK. + */ + public static final org.ccsds.moims.mo.mc.check.structures.CheckState OK = new org.ccsds.moims.mo.mc.check.structures.CheckState(org.ccsds.moims.mo.mc.check.structures.CheckState.OK_VALUE); + + /** + * Enumeration value for NOT_OK. + */ + public static final int NOT_OK_VALUE = 5; + + /** + * Enumeration singleton for value NOT_OK. + */ + public static final org.ccsds.moims.mo.mc.check.structures.CheckState NOT_OK = new org.ccsds.moims.mo.mc.check.structures.CheckState(org.ccsds.moims.mo.mc.check.structures.CheckState.NOT_OK_VALUE); + + /** + * Set of enumeration instances. + */ + private static final org.ccsds.moims.mo.mc.check.structures.CheckState[] _ENUMERATIONS = { + DISABLED, UNCHECKED, INVALID, OK, NOT_OK}; + + /** + * The CheckState enumeration holds the possible basic states of a check. The meaning of the NOT_OK value is check specific and detailed in the relevant check type definition. + */ + public CheckState() { + super(-1); + } + + /** + * The CheckState enumeration holds the possible basic states of a check. + * The meaning of the NOT_OK value is check specific and detailed in the relevant + * check type definition. + * + * @param value The value of the Enumeration. + */ + public CheckState(int value) { + super(value); + } + + @Override + public String toString() { + switch (getValue()) { + case DISABLED_VALUE: + return "DISABLED"; + case UNCHECKED_VALUE: + return "UNCHECKED"; + case INVALID_VALUE: + return "INVALID"; + case OK_VALUE: + return "OK"; + case NOT_OK_VALUE: + return "NOT_OK"; + default: + throw new RuntimeException("Unknown ordinal!"); + } + } + + /** + * Returns the enumeration element represented by the supplied string, or + * null if not matched. + * + * @param s s The string to search for. + * @return The matched enumeration element, or null if not matched. + */ + public static org.ccsds.moims.mo.mc.check.structures.CheckState fromString(String s) { + switch (s) { + case "DISABLED": + return CheckState.DISABLED; + case "UNCHECKED": + return CheckState.UNCHECKED; + case "INVALID": + return CheckState.INVALID; + case "OK": + return CheckState.OK; + case "NOT_OK": + return CheckState.NOT_OK; + default: + throw new RuntimeException("Unknown Enumeration for the provided string: " + s); + } + } + + @Override + public org.ccsds.moims.mo.mal.structures.Enumeration fromValue(Integer value) { + switch (value) { + case DISABLED_VALUE: + return CheckState.DISABLED; + case UNCHECKED_VALUE: + return CheckState.UNCHECKED; + case INVALID_VALUE: + return CheckState.INVALID; + case OK_VALUE: + return CheckState.OK; + case NOT_OK_VALUE: + return CheckState.NOT_OK; + default: + throw new RuntimeException("Unknown Enumeration for the provided value: " + value); + } + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return _ENUMERATIONS[0]; + } + + @Override + public int getEnumSize() { + return 5; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/CheckStateList.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/CheckStateList.java new file mode 100644 index 00000000..0a9647c2 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/CheckStateList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mc.check.structures; + +/** + * List class for CheckState. + */ +public final class CheckStateList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1125917120266234L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125917120266234L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for CheckStateList. + * + */ + public CheckStateList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public CheckStateList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public CheckStateList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mc.check.structures.CheckState element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mc.check.structures.CheckState element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new CheckStateList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return org.ccsds.moims.mo.mc.check.structures.CheckState.DISABLED; + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/CheckTypedInstance.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/CheckTypedInstance.java new file mode 100644 index 00000000..34612bdc --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/CheckTypedInstance.java @@ -0,0 +1,148 @@ +package org.ccsds.moims.mo.mc.check.structures; + +/** + * The CheckTypedInstance structure is used to hold the two COM object instance + * identifiers that form the identity and the body of the check definition + * in combination with the COM object type of the check body definition. + */ +public final class CheckTypedInstance implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1125917103489037L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125917103489037L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * The COM object type of the check body. + */ + private org.ccsds.moims.mo.com.structures.ObjectType objDefCheckType; + + /** + * The object instance identifiers. + */ + private org.ccsds.moims.mo.mc.structures.ObjectInstancePair objInstIds; + + /** + * Default constructor for CheckTypedInstance. + * + */ + public CheckTypedInstance() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param objDefCheckType The COM object type of the check body. + * @param objInstIds The object instance identifiers. + */ + public CheckTypedInstance(org.ccsds.moims.mo.com.structures.ObjectType objDefCheckType, + org.ccsds.moims.mo.mc.structures.ObjectInstancePair objInstIds) { + this.objDefCheckType = objDefCheckType; + this.objInstIds = objInstIds; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param objDefCheckType The COM object type of the check body. + */ + public CheckTypedInstance(org.ccsds.moims.mo.com.structures.ObjectType objDefCheckType) { + this.objDefCheckType = objDefCheckType; + this.objInstIds = null; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mc.check.structures.CheckTypedInstance(); + } + + /** + * Returns the field objDefCheckType. + * + * @return The field objDefCheckType + */ + public org.ccsds.moims.mo.com.structures.ObjectType getObjDefCheckType() { + return objDefCheckType; + } + + /** + * Returns the field objInstIds. + * + * @return The field objInstIds + */ + public org.ccsds.moims.mo.mc.structures.ObjectInstancePair getObjInstIds() { + return objInstIds; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof CheckTypedInstance) { + CheckTypedInstance other = (CheckTypedInstance) obj; + if (objDefCheckType == null) { + if (other.objDefCheckType != null) { + return false; + } + } else { + if (! objDefCheckType.equals(other.objDefCheckType)) { + return false; + } + } + if (objInstIds == null) { + if (other.objInstIds != null) { + return false; + } + } else { + if (! objInstIds.equals(other.objInstIds)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (objDefCheckType != null ? objDefCheckType.hashCode() : 0); + hash = 83 * hash + (objInstIds != null ? objInstIds.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(CheckTypedInstance: "); + buf.append("objDefCheckType=").append(objDefCheckType); + buf.append(", objInstIds=").append(objInstIds); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (objDefCheckType == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'objDefCheckType' cannot be null!"); + } + encoder.encodeElement(objDefCheckType); + encoder.encodeNullableElement(objInstIds); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + objDefCheckType = (org.ccsds.moims.mo.com.structures.ObjectType) decoder.decodeElement(new org.ccsds.moims.mo.com.structures.ObjectType()); + objInstIds = (org.ccsds.moims.mo.mc.structures.ObjectInstancePair) decoder.decodeNullableElement(new org.ccsds.moims.mo.mc.structures.ObjectInstancePair()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/CheckTypedInstanceList.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/CheckTypedInstanceList.java new file mode 100644 index 00000000..dbcec514 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/CheckTypedInstanceList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mc.check.structures; + +/** + * List class for CheckTypedInstance. + */ +public final class CheckTypedInstanceList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1125917120266227L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125917120266227L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for CheckTypedInstanceList. + * + */ + public CheckTypedInstanceList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public CheckTypedInstanceList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public CheckTypedInstanceList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mc.check.structures.CheckTypedInstance element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mc.check.structures.CheckTypedInstance element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new CheckTypedInstanceList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mc.check.structures.CheckTypedInstance(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/CompoundCheckDefinition.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/CompoundCheckDefinition.java new file mode 100644 index 00000000..a7f5c744 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/CompoundCheckDefinition.java @@ -0,0 +1,169 @@ +package org.ccsds.moims.mo.mc.check.structures; + +/** + * The CompoundCheckDefinition structure holds the object instance identifiers + * of one or more check link objects to monitor for a compound check. + */ +public final class CompoundCheckDefinition extends org.ccsds.moims.mo.mc.check.structures.CheckDefinitionDetails { + + private static final long serialVersionUID = 1125917103489036L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125917103489036L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * The number of referenced checks that must be in violation for this check + * to be considered in violation. If set to "0" then all referenced + * checks must be in violation. + */ + private org.ccsds.moims.mo.mal.structures.UInteger minimumChecksInViolation; + + /** + * The set of CheckLink objects that form the compound check. + */ + private org.ccsds.moims.mo.mal.structures.LongList checkLinkIds; + + /** + * Default constructor for CompoundCheckDefinition. + * + */ + public CompoundCheckDefinition() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param description The description of the check. May be empty. + * @param checkSeverity Indicates the seriousness of the violation based on its possible negative consequences. + * @param maxReportingInterval Maximum interval that can elapse between generations of CheckResult reports. If this value expires, then a CheckResult is generated with the same state for the previous and current state. If set to '0', then no maximum reporting interval shall be applied. + * @param nominalCount Number of consecutive valid samples passing the check for the check to be OK. + * @param nominalTime If nominalCount is zero then this is duration that a parameter is continuously passing the check for the check to be OK. If nominalCount is not zero then this is the period over which samples will be used in the nominalCount calculation, i.e. samples further in the past than nominalTime are not considered. + * @param violationCount Number of consecutive valid samples violating the check for the check to be in violation. + * @param violationTime If violationCount is zero then this is duration that a parameter is continuously violating the check for the check to be in violation. If violationCount not zero then this is the period over which samples will be used in the violationCount calculation, i.e. samples further in the past than violationTime are not considered. + * @param minimumChecksInViolation The number of referenced checks that must be in violation for this check to be considered in violation. If set to '0' then all referenced checks must be in violation. + * @param checkLinkIds The set of CheckLink objects that form the compound check. + */ + public CompoundCheckDefinition(String description, + org.ccsds.moims.mo.mc.structures.Severity checkSeverity, + org.ccsds.moims.mo.mal.structures.Duration maxReportingInterval, + org.ccsds.moims.mo.mal.structures.UInteger nominalCount, + org.ccsds.moims.mo.mal.structures.Duration nominalTime, + org.ccsds.moims.mo.mal.structures.UInteger violationCount, + org.ccsds.moims.mo.mal.structures.Duration violationTime, + org.ccsds.moims.mo.mal.structures.UInteger minimumChecksInViolation, + org.ccsds.moims.mo.mal.structures.LongList checkLinkIds) { + super(description, + checkSeverity, + maxReportingInterval, + nominalCount, + nominalTime, + violationCount, + violationTime); + this.minimumChecksInViolation = minimumChecksInViolation; + this.checkLinkIds = checkLinkIds; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mc.check.structures.CompoundCheckDefinition(); + } + + /** + * Returns the field minimumChecksInViolation. + * + * @return The field minimumChecksInViolation + */ + public org.ccsds.moims.mo.mal.structures.UInteger getMinimumChecksInViolation() { + return minimumChecksInViolation; + } + + /** + * Returns the field checkLinkIds. + * + * @return The field checkLinkIds + */ + public org.ccsds.moims.mo.mal.structures.LongList getCheckLinkIds() { + return checkLinkIds; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof CompoundCheckDefinition) { + if (! super.equals(obj)) { + return false; + } + CompoundCheckDefinition other = (CompoundCheckDefinition) obj; + if (minimumChecksInViolation == null) { + if (other.minimumChecksInViolation != null) { + return false; + } + } else { + if (! minimumChecksInViolation.equals(other.minimumChecksInViolation)) { + return false; + } + } + if (checkLinkIds == null) { + if (other.checkLinkIds != null) { + return false; + } + } else { + if (! checkLinkIds.equals(other.checkLinkIds)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = super.hashCode(); + hash = 83 * hash + (minimumChecksInViolation != null ? minimumChecksInViolation.hashCode() : 0); + hash = 83 * hash + (checkLinkIds != null ? checkLinkIds.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(CompoundCheckDefinition: "); + buf.append(super.toString()); + buf.append(", minimumChecksInViolation=").append(minimumChecksInViolation); + buf.append(", checkLinkIds=").append(checkLinkIds); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + super.encode(encoder); + if (minimumChecksInViolation == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'minimumChecksInViolation' cannot be null!"); + } + if (checkLinkIds == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'checkLinkIds' cannot be null!"); + } + encoder.encodeUInteger(minimumChecksInViolation); + encoder.encodeElement(checkLinkIds); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + super.decode(decoder); + minimumChecksInViolation = decoder.decodeUInteger(); + checkLinkIds = (org.ccsds.moims.mo.mal.structures.LongList) decoder.decodeElement(new org.ccsds.moims.mo.mal.structures.LongList()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/CompoundCheckDefinitionList.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/CompoundCheckDefinitionList.java new file mode 100644 index 00000000..6b133beb --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/CompoundCheckDefinitionList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mc.check.structures; + +/** + * List class for CompoundCheckDefinition. + */ +public final class CompoundCheckDefinitionList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1125917120266228L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125917120266228L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for CompoundCheckDefinitionList. + * + */ + public CompoundCheckDefinitionList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public CompoundCheckDefinitionList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public CompoundCheckDefinitionList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mc.check.structures.CompoundCheckDefinition element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mc.check.structures.CompoundCheckDefinition element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new CompoundCheckDefinitionList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mc.check.structures.CompoundCheckDefinition(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/ConstantCheckDefinition.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/ConstantCheckDefinition.java new file mode 100644 index 00000000..52d67f8f --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/ConstantCheckDefinition.java @@ -0,0 +1,168 @@ +package org.ccsds.moims.mo.mc.check.structures; + +/** + * The ConstantCheckDefinition structure holds the constant values to compare + * against for a consistency check. + */ +public final class ConstantCheckDefinition extends org.ccsds.moims.mo.mc.check.structures.CheckDefinitionDetails { + + private static final long serialVersionUID = 1125917103489032L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125917103489032L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * The operator to be used to perform the check. + */ + private org.ccsds.moims.mo.com.archive.structures.ExpressionOperator operator; + + /** + * The set of constant values to be checked against. An empty list means that + * any value change triggers the check. + */ + private org.ccsds.moims.mo.mc.structures.AttributeValueList values; + + /** + * Default constructor for ConstantCheckDefinition. + * + */ + public ConstantCheckDefinition() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param description The description of the check. May be empty. + * @param checkSeverity Indicates the seriousness of the violation based on its possible negative consequences. + * @param maxReportingInterval Maximum interval that can elapse between generations of CheckResult reports. If this value expires, then a CheckResult is generated with the same state for the previous and current state. If set to '0', then no maximum reporting interval shall be applied. + * @param nominalCount Number of consecutive valid samples passing the check for the check to be OK. + * @param nominalTime If nominalCount is zero then this is duration that a parameter is continuously passing the check for the check to be OK. If nominalCount is not zero then this is the period over which samples will be used in the nominalCount calculation, i.e. samples further in the past than nominalTime are not considered. + * @param violationCount Number of consecutive valid samples violating the check for the check to be in violation. + * @param violationTime If violationCount is zero then this is duration that a parameter is continuously violating the check for the check to be in violation. If violationCount not zero then this is the period over which samples will be used in the violationCount calculation, i.e. samples further in the past than violationTime are not considered. + * @param operator The operator to be used to perform the check. + * @param values The set of constant values to be checked against. An empty list means that any value change triggers the check. + */ + public ConstantCheckDefinition(String description, + org.ccsds.moims.mo.mc.structures.Severity checkSeverity, + org.ccsds.moims.mo.mal.structures.Duration maxReportingInterval, + org.ccsds.moims.mo.mal.structures.UInteger nominalCount, + org.ccsds.moims.mo.mal.structures.Duration nominalTime, + org.ccsds.moims.mo.mal.structures.UInteger violationCount, + org.ccsds.moims.mo.mal.structures.Duration violationTime, + org.ccsds.moims.mo.com.archive.structures.ExpressionOperator operator, + org.ccsds.moims.mo.mc.structures.AttributeValueList values) { + super(description, + checkSeverity, + maxReportingInterval, + nominalCount, + nominalTime, + violationCount, + violationTime); + this.operator = operator; + this.values = values; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mc.check.structures.ConstantCheckDefinition(); + } + + /** + * Returns the field operator. + * + * @return The field operator + */ + public org.ccsds.moims.mo.com.archive.structures.ExpressionOperator getOperator() { + return operator; + } + + /** + * Returns the field values. + * + * @return The field values + */ + public org.ccsds.moims.mo.mc.structures.AttributeValueList getValues() { + return values; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ConstantCheckDefinition) { + if (! super.equals(obj)) { + return false; + } + ConstantCheckDefinition other = (ConstantCheckDefinition) obj; + if (operator == null) { + if (other.operator != null) { + return false; + } + } else { + if (! operator.equals(other.operator)) { + return false; + } + } + if (values == null) { + if (other.values != null) { + return false; + } + } else { + if (! values.equals(other.values)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = super.hashCode(); + hash = 83 * hash + (operator != null ? operator.hashCode() : 0); + hash = 83 * hash + (values != null ? values.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(ConstantCheckDefinition: "); + buf.append(super.toString()); + buf.append(", operator=").append(operator); + buf.append(", values=").append(values); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + super.encode(encoder); + if (operator == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'operator' cannot be null!"); + } + if (values == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'values' cannot be null!"); + } + encoder.encodeElement(operator); + encoder.encodeElement(values); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + super.decode(decoder); + operator = (org.ccsds.moims.mo.com.archive.structures.ExpressionOperator) decoder.decodeElement(org.ccsds.moims.mo.com.archive.structures.ExpressionOperator.EQUAL); + values = (org.ccsds.moims.mo.mc.structures.AttributeValueList) decoder.decodeElement(new org.ccsds.moims.mo.mc.structures.AttributeValueList()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/ConstantCheckDefinitionList.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/ConstantCheckDefinitionList.java new file mode 100644 index 00000000..ac6f53d3 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/ConstantCheckDefinitionList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mc.check.structures; + +/** + * List class for ConstantCheckDefinition. + */ +public final class ConstantCheckDefinitionList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1125917120266232L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125917120266232L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for ConstantCheckDefinitionList. + * + */ + public ConstantCheckDefinitionList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public ConstantCheckDefinitionList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public ConstantCheckDefinitionList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mc.check.structures.ConstantCheckDefinition element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mc.check.structures.ConstantCheckDefinition element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new ConstantCheckDefinitionList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mc.check.structures.ConstantCheckDefinition(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/DeltaCheckDefinition.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/DeltaCheckDefinition.java new file mode 100644 index 00000000..bc236e40 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/DeltaCheckDefinition.java @@ -0,0 +1,303 @@ +package org.ccsds.moims.mo.mc.check.structures; + +/** + * The DeltaCheckDefinition defines a delta transition check. + */ +public final class DeltaCheckDefinition extends org.ccsds.moims.mo.mc.check.structures.CheckDefinitionDetails { + + private static final long serialVersionUID = 1125917103489034L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125917103489034L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * The value to compare the current value against. + */ + private org.ccsds.moims.mo.mc.check.structures.ReferenceValue checkReference; + + /** + * If TRUE, then the safe (non violating) values lie outside the specified + * threshold range. + */ + private Boolean violateInRange; + + /** + * If TRUE, then the thresholds contain value deltas. If FALSE, they contain + * percentage deltas. + */ + private Boolean valueDelta; + + /** + * The lower threshold of the delta value. Must be of the correct type for + * the entity being checked. Must be a Float if percentage threshold in the + * range (-1.0 to 1.0 representing +-100%). + */ + private org.ccsds.moims.mo.mal.structures.Attribute lowerThreshold; + + /** + * The upper threshold of the delta value. Must be of the correct type for + * the entity being checked. Must be a Float if percentage threshold in the + * range (-1.0 to 1.0 representing +-100%). + */ + private org.ccsds.moims.mo.mal.structures.Attribute upperThreshold; + + /** + * Default constructor for DeltaCheckDefinition. + * + */ + public DeltaCheckDefinition() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param description The description of the check. May be empty. + * @param checkSeverity Indicates the seriousness of the violation based on its possible negative consequences. + * @param maxReportingInterval Maximum interval that can elapse between generations of CheckResult reports. If this value expires, then a CheckResult is generated with the same state for the previous and current state. If set to '0', then no maximum reporting interval shall be applied. + * @param nominalCount Number of consecutive valid samples passing the check for the check to be OK. + * @param nominalTime If nominalCount is zero then this is duration that a parameter is continuously passing the check for the check to be OK. If nominalCount is not zero then this is the period over which samples will be used in the nominalCount calculation, i.e. samples further in the past than nominalTime are not considered. + * @param violationCount Number of consecutive valid samples violating the check for the check to be in violation. + * @param violationTime If violationCount is zero then this is duration that a parameter is continuously violating the check for the check to be in violation. If violationCount not zero then this is the period over which samples will be used in the violationCount calculation, i.e. samples further in the past than violationTime are not considered. + * @param checkReference The value to compare the current value against. + * @param violateInRange If TRUE, then the safe (non violating) values lie outside the specified threshold range. + * @param valueDelta If TRUE, then the thresholds contain value deltas. If FALSE, they contain percentage deltas. + * @param lowerThreshold The lower threshold of the delta value. Must be of the correct type for the entity being checked. Must be a Float if percentage threshold in the range (-1.0 to 1.0 representing +-100%). + * @param upperThreshold The upper threshold of the delta value. Must be of the correct type for the entity being checked. Must be a Float if percentage threshold in the range (-1.0 to 1.0 representing +-100%). + */ + public DeltaCheckDefinition(String description, + org.ccsds.moims.mo.mc.structures.Severity checkSeverity, + org.ccsds.moims.mo.mal.structures.Duration maxReportingInterval, + org.ccsds.moims.mo.mal.structures.UInteger nominalCount, + org.ccsds.moims.mo.mal.structures.Duration nominalTime, + org.ccsds.moims.mo.mal.structures.UInteger violationCount, + org.ccsds.moims.mo.mal.structures.Duration violationTime, + org.ccsds.moims.mo.mc.check.structures.ReferenceValue checkReference, + Boolean violateInRange, + Boolean valueDelta, + org.ccsds.moims.mo.mal.structures.Attribute lowerThreshold, + org.ccsds.moims.mo.mal.structures.Attribute upperThreshold) { + super(description, + checkSeverity, + maxReportingInterval, + nominalCount, + nominalTime, + violationCount, + violationTime); + this.checkReference = checkReference; + this.violateInRange = violateInRange; + this.valueDelta = valueDelta; + this.lowerThreshold = lowerThreshold; + this.upperThreshold = upperThreshold; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param description The description of the check. May be empty. + * @param checkSeverity Indicates the seriousness of the violation based on its possible negative consequences. + * @param maxReportingInterval Maximum interval that can elapse between generations of CheckResult reports. If this value expires, then a CheckResult is generated with the same state for the previous and current state. If set to '0', then no maximum reporting interval shall be applied. + * @param nominalCount Number of consecutive valid samples passing the check for the check to be OK. + * @param nominalTime If nominalCount is zero then this is duration that a parameter is continuously passing the check for the check to be OK. If nominalCount is not zero then this is the period over which samples will be used in the nominalCount calculation, i.e. samples further in the past than nominalTime are not considered. + * @param violationCount Number of consecutive valid samples violating the check for the check to be in violation. + * @param violationTime If violationCount is zero then this is duration that a parameter is continuously violating the check for the check to be in violation. If violationCount not zero then this is the period over which samples will be used in the violationCount calculation, i.e. samples further in the past than violationTime are not considered. + * @param checkReference The value to compare the current value against. + * @param violateInRange If TRUE, then the safe (non violating) values lie outside the specified threshold range. + * @param valueDelta If TRUE, then the thresholds contain value deltas. If FALSE, they contain percentage deltas. + */ + public DeltaCheckDefinition(String description, + org.ccsds.moims.mo.mc.structures.Severity checkSeverity, + org.ccsds.moims.mo.mal.structures.Duration maxReportingInterval, + org.ccsds.moims.mo.mal.structures.UInteger nominalCount, + org.ccsds.moims.mo.mal.structures.Duration nominalTime, + org.ccsds.moims.mo.mal.structures.UInteger violationCount, + org.ccsds.moims.mo.mal.structures.Duration violationTime, + org.ccsds.moims.mo.mc.check.structures.ReferenceValue checkReference, + Boolean violateInRange, + Boolean valueDelta) { + super(description, + checkSeverity, + maxReportingInterval, + nominalCount, + nominalTime, + violationCount, + violationTime); + this.checkReference = checkReference; + this.violateInRange = violateInRange; + this.valueDelta = valueDelta; + this.lowerThreshold = null; + this.upperThreshold = null; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mc.check.structures.DeltaCheckDefinition(); + } + + /** + * Returns the field checkReference. + * + * @return The field checkReference + */ + public org.ccsds.moims.mo.mc.check.structures.ReferenceValue getCheckReference() { + return checkReference; + } + + /** + * Returns the field violateInRange. + * + * @return The field violateInRange + */ + public Boolean getViolateInRange() { + return violateInRange; + } + + /** + * Returns the field valueDelta. + * + * @return The field valueDelta + */ + public Boolean getValueDelta() { + return valueDelta; + } + + /** + * Returns the field lowerThreshold. + * + * @return The field lowerThreshold + */ + public org.ccsds.moims.mo.mal.structures.Attribute getLowerThreshold() { + return lowerThreshold; + } + + /** + * Returns the field upperThreshold. + * + * @return The field upperThreshold + */ + public org.ccsds.moims.mo.mal.structures.Attribute getUpperThreshold() { + return upperThreshold; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof DeltaCheckDefinition) { + if (! super.equals(obj)) { + return false; + } + DeltaCheckDefinition other = (DeltaCheckDefinition) obj; + if (checkReference == null) { + if (other.checkReference != null) { + return false; + } + } else { + if (! checkReference.equals(other.checkReference)) { + return false; + } + } + if (violateInRange == null) { + if (other.violateInRange != null) { + return false; + } + } else { + if (! violateInRange.equals(other.violateInRange)) { + return false; + } + } + if (valueDelta == null) { + if (other.valueDelta != null) { + return false; + } + } else { + if (! valueDelta.equals(other.valueDelta)) { + return false; + } + } + if (lowerThreshold == null) { + if (other.lowerThreshold != null) { + return false; + } + } else { + if (! lowerThreshold.equals(other.lowerThreshold)) { + return false; + } + } + if (upperThreshold == null) { + if (other.upperThreshold != null) { + return false; + } + } else { + if (! upperThreshold.equals(other.upperThreshold)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = super.hashCode(); + hash = 83 * hash + (checkReference != null ? checkReference.hashCode() : 0); + hash = 83 * hash + (violateInRange != null ? violateInRange.hashCode() : 0); + hash = 83 * hash + (valueDelta != null ? valueDelta.hashCode() : 0); + hash = 83 * hash + (lowerThreshold != null ? lowerThreshold.hashCode() : 0); + hash = 83 * hash + (upperThreshold != null ? upperThreshold.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(DeltaCheckDefinition: "); + buf.append(super.toString()); + buf.append(", checkReference=").append(checkReference); + buf.append(", violateInRange=").append(violateInRange); + buf.append(", valueDelta=").append(valueDelta); + buf.append(", lowerThreshold=").append(lowerThreshold); + buf.append(", upperThreshold=").append(upperThreshold); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + super.encode(encoder); + if (checkReference == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'checkReference' cannot be null!"); + } + if (violateInRange == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'violateInRange' cannot be null!"); + } + if (valueDelta == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'valueDelta' cannot be null!"); + } + encoder.encodeElement(checkReference); + encoder.encodeBoolean(violateInRange); + encoder.encodeBoolean(valueDelta); + encoder.encodeNullableAttribute(lowerThreshold); + encoder.encodeNullableAttribute(upperThreshold); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + super.decode(decoder); + checkReference = (org.ccsds.moims.mo.mc.check.structures.ReferenceValue) decoder.decodeElement(new org.ccsds.moims.mo.mc.check.structures.ReferenceValue()); + violateInRange = decoder.decodeBoolean(); + valueDelta = decoder.decodeBoolean(); + lowerThreshold = (org.ccsds.moims.mo.mal.structures.Attribute) decoder.decodeNullableAttribute(); + upperThreshold = (org.ccsds.moims.mo.mal.structures.Attribute) decoder.decodeNullableAttribute(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/DeltaCheckDefinitionList.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/DeltaCheckDefinitionList.java new file mode 100644 index 00000000..606af6b3 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/DeltaCheckDefinitionList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mc.check.structures; + +/** + * List class for DeltaCheckDefinition. + */ +public final class DeltaCheckDefinitionList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1125917120266230L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125917120266230L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for DeltaCheckDefinitionList. + * + */ + public DeltaCheckDefinitionList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public DeltaCheckDefinitionList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public DeltaCheckDefinitionList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mc.check.structures.DeltaCheckDefinition element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mc.check.structures.DeltaCheckDefinition element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new DeltaCheckDefinitionList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mc.check.structures.DeltaCheckDefinition(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/LimitCheckDefinition.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/LimitCheckDefinition.java new file mode 100644 index 00000000..e523262b --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/LimitCheckDefinition.java @@ -0,0 +1,230 @@ +package org.ccsds.moims.mo.mc.check.structures; + +/** + * The LimitCheckDefinition defines a high and low limit check. It is valid + * to supply only one limit; the other limit is assumed to be the relevant + * maximum supported by the type being checked in this case. + */ +public final class LimitCheckDefinition extends org.ccsds.moims.mo.mc.check.structures.CheckDefinitionDetails { + + private static final long serialVersionUID = 1125917103489035L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125917103489035L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * If TRUE, then the safe (non violating) values lie outside the specified + * limits range. + */ + private Boolean violateInRange; + + /** + * The lower limit of the value. Must be of the correct type for the entity + * being checked. + */ + private org.ccsds.moims.mo.mal.structures.Attribute lowerLimit; + + /** + * The upper limit of the value. Must be of the correct type for the entity + * being checked. + */ + private org.ccsds.moims.mo.mal.structures.Attribute upperLimit; + + /** + * Default constructor for LimitCheckDefinition. + * + */ + public LimitCheckDefinition() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param description The description of the check. May be empty. + * @param checkSeverity Indicates the seriousness of the violation based on its possible negative consequences. + * @param maxReportingInterval Maximum interval that can elapse between generations of CheckResult reports. If this value expires, then a CheckResult is generated with the same state for the previous and current state. If set to '0', then no maximum reporting interval shall be applied. + * @param nominalCount Number of consecutive valid samples passing the check for the check to be OK. + * @param nominalTime If nominalCount is zero then this is duration that a parameter is continuously passing the check for the check to be OK. If nominalCount is not zero then this is the period over which samples will be used in the nominalCount calculation, i.e. samples further in the past than nominalTime are not considered. + * @param violationCount Number of consecutive valid samples violating the check for the check to be in violation. + * @param violationTime If violationCount is zero then this is duration that a parameter is continuously violating the check for the check to be in violation. If violationCount not zero then this is the period over which samples will be used in the violationCount calculation, i.e. samples further in the past than violationTime are not considered. + * @param violateInRange If TRUE, then the safe (non violating) values lie outside the specified limits range. + * @param lowerLimit The lower limit of the value. Must be of the correct type for the entity being checked. + * @param upperLimit The upper limit of the value. Must be of the correct type for the entity being checked. + */ + public LimitCheckDefinition(String description, + org.ccsds.moims.mo.mc.structures.Severity checkSeverity, + org.ccsds.moims.mo.mal.structures.Duration maxReportingInterval, + org.ccsds.moims.mo.mal.structures.UInteger nominalCount, + org.ccsds.moims.mo.mal.structures.Duration nominalTime, + org.ccsds.moims.mo.mal.structures.UInteger violationCount, + org.ccsds.moims.mo.mal.structures.Duration violationTime, + Boolean violateInRange, + org.ccsds.moims.mo.mal.structures.Attribute lowerLimit, + org.ccsds.moims.mo.mal.structures.Attribute upperLimit) { + super(description, + checkSeverity, + maxReportingInterval, + nominalCount, + nominalTime, + violationCount, + violationTime); + this.violateInRange = violateInRange; + this.lowerLimit = lowerLimit; + this.upperLimit = upperLimit; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param description The description of the check. May be empty. + * @param checkSeverity Indicates the seriousness of the violation based on its possible negative consequences. + * @param maxReportingInterval Maximum interval that can elapse between generations of CheckResult reports. If this value expires, then a CheckResult is generated with the same state for the previous and current state. If set to '0', then no maximum reporting interval shall be applied. + * @param nominalCount Number of consecutive valid samples passing the check for the check to be OK. + * @param nominalTime If nominalCount is zero then this is duration that a parameter is continuously passing the check for the check to be OK. If nominalCount is not zero then this is the period over which samples will be used in the nominalCount calculation, i.e. samples further in the past than nominalTime are not considered. + * @param violationCount Number of consecutive valid samples violating the check for the check to be in violation. + * @param violationTime If violationCount is zero then this is duration that a parameter is continuously violating the check for the check to be in violation. If violationCount not zero then this is the period over which samples will be used in the violationCount calculation, i.e. samples further in the past than violationTime are not considered. + * @param violateInRange If TRUE, then the safe (non violating) values lie outside the specified limits range. + */ + public LimitCheckDefinition(String description, + org.ccsds.moims.mo.mc.structures.Severity checkSeverity, + org.ccsds.moims.mo.mal.structures.Duration maxReportingInterval, + org.ccsds.moims.mo.mal.structures.UInteger nominalCount, + org.ccsds.moims.mo.mal.structures.Duration nominalTime, + org.ccsds.moims.mo.mal.structures.UInteger violationCount, + org.ccsds.moims.mo.mal.structures.Duration violationTime, + Boolean violateInRange) { + super(description, + checkSeverity, + maxReportingInterval, + nominalCount, + nominalTime, + violationCount, + violationTime); + this.violateInRange = violateInRange; + this.lowerLimit = null; + this.upperLimit = null; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mc.check.structures.LimitCheckDefinition(); + } + + /** + * Returns the field violateInRange. + * + * @return The field violateInRange + */ + public Boolean getViolateInRange() { + return violateInRange; + } + + /** + * Returns the field lowerLimit. + * + * @return The field lowerLimit + */ + public org.ccsds.moims.mo.mal.structures.Attribute getLowerLimit() { + return lowerLimit; + } + + /** + * Returns the field upperLimit. + * + * @return The field upperLimit + */ + public org.ccsds.moims.mo.mal.structures.Attribute getUpperLimit() { + return upperLimit; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof LimitCheckDefinition) { + if (! super.equals(obj)) { + return false; + } + LimitCheckDefinition other = (LimitCheckDefinition) obj; + if (violateInRange == null) { + if (other.violateInRange != null) { + return false; + } + } else { + if (! violateInRange.equals(other.violateInRange)) { + return false; + } + } + if (lowerLimit == null) { + if (other.lowerLimit != null) { + return false; + } + } else { + if (! lowerLimit.equals(other.lowerLimit)) { + return false; + } + } + if (upperLimit == null) { + if (other.upperLimit != null) { + return false; + } + } else { + if (! upperLimit.equals(other.upperLimit)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = super.hashCode(); + hash = 83 * hash + (violateInRange != null ? violateInRange.hashCode() : 0); + hash = 83 * hash + (lowerLimit != null ? lowerLimit.hashCode() : 0); + hash = 83 * hash + (upperLimit != null ? upperLimit.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(LimitCheckDefinition: "); + buf.append(super.toString()); + buf.append(", violateInRange=").append(violateInRange); + buf.append(", lowerLimit=").append(lowerLimit); + buf.append(", upperLimit=").append(upperLimit); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + super.encode(encoder); + if (violateInRange == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'violateInRange' cannot be null!"); + } + encoder.encodeBoolean(violateInRange); + encoder.encodeNullableAttribute(lowerLimit); + encoder.encodeNullableAttribute(upperLimit); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + super.decode(decoder); + violateInRange = decoder.decodeBoolean(); + lowerLimit = (org.ccsds.moims.mo.mal.structures.Attribute) decoder.decodeNullableAttribute(); + upperLimit = (org.ccsds.moims.mo.mal.structures.Attribute) decoder.decodeNullableAttribute(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/LimitCheckDefinitionList.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/LimitCheckDefinitionList.java new file mode 100644 index 00000000..13bdc03f --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/LimitCheckDefinitionList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mc.check.structures; + +/** + * List class for LimitCheckDefinition. + */ +public final class LimitCheckDefinitionList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1125917120266229L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125917120266229L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for LimitCheckDefinitionList. + * + */ + public LimitCheckDefinitionList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public LimitCheckDefinitionList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public LimitCheckDefinitionList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mc.check.structures.LimitCheckDefinition element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mc.check.structures.LimitCheckDefinition element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new LimitCheckDefinitionList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mc.check.structures.LimitCheckDefinition(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/ReferenceCheckDefinition.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/ReferenceCheckDefinition.java new file mode 100644 index 00000000..ef06790d --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/ReferenceCheckDefinition.java @@ -0,0 +1,167 @@ +package org.ccsds.moims.mo.mc.check.structures; + +/** + * The ReferenceCheckDefinition structure holds the key to another entity + * to compare against for a consistency check. + */ +public final class ReferenceCheckDefinition extends org.ccsds.moims.mo.mc.check.structures.CheckDefinitionDetails { + + private static final long serialVersionUID = 1125917103489033L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125917103489033L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * The operator to be used to perform the check. + */ + private org.ccsds.moims.mo.com.archive.structures.ExpressionOperator operator; + + /** + * The value to check against. + */ + private org.ccsds.moims.mo.mc.check.structures.ReferenceValue checkReference; + + /** + * Default constructor for ReferenceCheckDefinition. + * + */ + public ReferenceCheckDefinition() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param description The description of the check. May be empty. + * @param checkSeverity Indicates the seriousness of the violation based on its possible negative consequences. + * @param maxReportingInterval Maximum interval that can elapse between generations of CheckResult reports. If this value expires, then a CheckResult is generated with the same state for the previous and current state. If set to '0', then no maximum reporting interval shall be applied. + * @param nominalCount Number of consecutive valid samples passing the check for the check to be OK. + * @param nominalTime If nominalCount is zero then this is duration that a parameter is continuously passing the check for the check to be OK. If nominalCount is not zero then this is the period over which samples will be used in the nominalCount calculation, i.e. samples further in the past than nominalTime are not considered. + * @param violationCount Number of consecutive valid samples violating the check for the check to be in violation. + * @param violationTime If violationCount is zero then this is duration that a parameter is continuously violating the check for the check to be in violation. If violationCount not zero then this is the period over which samples will be used in the violationCount calculation, i.e. samples further in the past than violationTime are not considered. + * @param operator The operator to be used to perform the check. + * @param checkReference The value to check against. + */ + public ReferenceCheckDefinition(String description, + org.ccsds.moims.mo.mc.structures.Severity checkSeverity, + org.ccsds.moims.mo.mal.structures.Duration maxReportingInterval, + org.ccsds.moims.mo.mal.structures.UInteger nominalCount, + org.ccsds.moims.mo.mal.structures.Duration nominalTime, + org.ccsds.moims.mo.mal.structures.UInteger violationCount, + org.ccsds.moims.mo.mal.structures.Duration violationTime, + org.ccsds.moims.mo.com.archive.structures.ExpressionOperator operator, + org.ccsds.moims.mo.mc.check.structures.ReferenceValue checkReference) { + super(description, + checkSeverity, + maxReportingInterval, + nominalCount, + nominalTime, + violationCount, + violationTime); + this.operator = operator; + this.checkReference = checkReference; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mc.check.structures.ReferenceCheckDefinition(); + } + + /** + * Returns the field operator. + * + * @return The field operator + */ + public org.ccsds.moims.mo.com.archive.structures.ExpressionOperator getOperator() { + return operator; + } + + /** + * Returns the field checkReference. + * + * @return The field checkReference + */ + public org.ccsds.moims.mo.mc.check.structures.ReferenceValue getCheckReference() { + return checkReference; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ReferenceCheckDefinition) { + if (! super.equals(obj)) { + return false; + } + ReferenceCheckDefinition other = (ReferenceCheckDefinition) obj; + if (operator == null) { + if (other.operator != null) { + return false; + } + } else { + if (! operator.equals(other.operator)) { + return false; + } + } + if (checkReference == null) { + if (other.checkReference != null) { + return false; + } + } else { + if (! checkReference.equals(other.checkReference)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = super.hashCode(); + hash = 83 * hash + (operator != null ? operator.hashCode() : 0); + hash = 83 * hash + (checkReference != null ? checkReference.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(ReferenceCheckDefinition: "); + buf.append(super.toString()); + buf.append(", operator=").append(operator); + buf.append(", checkReference=").append(checkReference); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + super.encode(encoder); + if (operator == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'operator' cannot be null!"); + } + if (checkReference == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'checkReference' cannot be null!"); + } + encoder.encodeElement(operator); + encoder.encodeElement(checkReference); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + super.decode(decoder); + operator = (org.ccsds.moims.mo.com.archive.structures.ExpressionOperator) decoder.decodeElement(org.ccsds.moims.mo.com.archive.structures.ExpressionOperator.EQUAL); + checkReference = (org.ccsds.moims.mo.mc.check.structures.ReferenceValue) decoder.decodeElement(new org.ccsds.moims.mo.mc.check.structures.ReferenceValue()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/ReferenceCheckDefinitionList.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/ReferenceCheckDefinitionList.java new file mode 100644 index 00000000..98280818 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/ReferenceCheckDefinitionList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mc.check.structures; + +/** + * List class for ReferenceCheckDefinition. + */ +public final class ReferenceCheckDefinitionList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1125917120266231L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125917120266231L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for ReferenceCheckDefinitionList. + * + */ + public ReferenceCheckDefinitionList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public ReferenceCheckDefinitionList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public ReferenceCheckDefinitionList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mc.check.structures.ReferenceCheckDefinition element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mc.check.structures.ReferenceCheckDefinition element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new ReferenceCheckDefinitionList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mc.check.structures.ReferenceCheckDefinition(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/ReferenceValue.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/ReferenceValue.java new file mode 100644 index 00000000..0196845b --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/ReferenceValue.java @@ -0,0 +1,187 @@ +package org.ccsds.moims.mo.mc.check.structures; + +/** + * The ReferenceValue structure defines a value to compare against. A validCount + * of "1" and deltaTime of "0" would compare against the + * previous sample value. + */ +public final class ReferenceValue implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1125917103489031L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125917103489031L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Number of valid samples that should be collected to update the reference + * value. + */ + private org.ccsds.moims.mo.mal.structures.UShort validCount; + + /** + * Delta time from now into the past from which the reference value should + * be sampled. + */ + private org.ccsds.moims.mo.mal.structures.Duration deltaTime; + + /** + * The ParameterIdentity object to compare against. If NULL, then checked + * parameter should be compared against itself. + */ + private org.ccsds.moims.mo.com.structures.ObjectKey parameterId; + + /** + * Default constructor for ReferenceValue. + * + */ + public ReferenceValue() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param validCount Number of valid samples that should be collected to update the reference value. + * @param deltaTime Delta time from now into the past from which the reference value should be sampled. + * @param parameterId The ParameterIdentity object to compare against. If NULL, then checked parameter should be compared against itself. + */ + public ReferenceValue(org.ccsds.moims.mo.mal.structures.UShort validCount, + org.ccsds.moims.mo.mal.structures.Duration deltaTime, + org.ccsds.moims.mo.com.structures.ObjectKey parameterId) { + this.validCount = validCount; + this.deltaTime = deltaTime; + this.parameterId = parameterId; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param validCount Number of valid samples that should be collected to update the reference value. + * @param deltaTime Delta time from now into the past from which the reference value should be sampled. + */ + public ReferenceValue(org.ccsds.moims.mo.mal.structures.UShort validCount, + org.ccsds.moims.mo.mal.structures.Duration deltaTime) { + this.validCount = validCount; + this.deltaTime = deltaTime; + this.parameterId = null; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mc.check.structures.ReferenceValue(); + } + + /** + * Returns the field validCount. + * + * @return The field validCount + */ + public org.ccsds.moims.mo.mal.structures.UShort getValidCount() { + return validCount; + } + + /** + * Returns the field deltaTime. + * + * @return The field deltaTime + */ + public org.ccsds.moims.mo.mal.structures.Duration getDeltaTime() { + return deltaTime; + } + + /** + * Returns the field parameterId. + * + * @return The field parameterId + */ + public org.ccsds.moims.mo.com.structures.ObjectKey getParameterId() { + return parameterId; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ReferenceValue) { + ReferenceValue other = (ReferenceValue) obj; + if (validCount == null) { + if (other.validCount != null) { + return false; + } + } else { + if (! validCount.equals(other.validCount)) { + return false; + } + } + if (deltaTime == null) { + if (other.deltaTime != null) { + return false; + } + } else { + if (! deltaTime.equals(other.deltaTime)) { + return false; + } + } + if (parameterId == null) { + if (other.parameterId != null) { + return false; + } + } else { + if (! parameterId.equals(other.parameterId)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (validCount != null ? validCount.hashCode() : 0); + hash = 83 * hash + (deltaTime != null ? deltaTime.hashCode() : 0); + hash = 83 * hash + (parameterId != null ? parameterId.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(ReferenceValue: "); + buf.append("validCount=").append(validCount); + buf.append(", deltaTime=").append(deltaTime); + buf.append(", parameterId=").append(parameterId); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (validCount == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'validCount' cannot be null!"); + } + if (deltaTime == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'deltaTime' cannot be null!"); + } + encoder.encodeUShort(validCount); + encoder.encodeDuration(deltaTime); + encoder.encodeNullableElement(parameterId); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + validCount = decoder.decodeUShort(); + deltaTime = decoder.decodeDuration(); + parameterId = (org.ccsds.moims.mo.com.structures.ObjectKey) decoder.decodeNullableElement(new org.ccsds.moims.mo.com.structures.ObjectKey()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/ReferenceValueList.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/ReferenceValueList.java new file mode 100644 index 00000000..55161afb --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/ReferenceValueList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mc.check.structures; + +/** + * List class for ReferenceValue. + */ +public final class ReferenceValueList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1125917120266233L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125917120266233L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for ReferenceValueList. + * + */ + public ReferenceValueList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public ReferenceValueList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public ReferenceValueList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mc.check.structures.ReferenceValue element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mc.check.structures.ReferenceValue element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new ReferenceValueList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mc.check.structures.ReferenceValue(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/package-info.java new file mode 100644 index 00000000..1ee262cf --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/check/structures/package-info.java @@ -0,0 +1,4 @@ +/** + * Package containing types defined in the Check service. +*/ +package org.ccsds.moims.mo.mc.check.structures; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/conversion/ConversionHelper.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/conversion/ConversionHelper.java new file mode 100644 index 00000000..86c1ec2f --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/conversion/ConversionHelper.java @@ -0,0 +1,17 @@ +package org.ccsds.moims.mo.mc.conversion; + +/** + * Helper class for Conversion service. + */ +public class ConversionHelper { + + /** + * Service singleton instance. + */ + public static final org.ccsds.moims.mo.mc.conversion.ConversionServiceInfo CONVERSION_SERVICE = new org.ccsds.moims.mo.mc.conversion.ConversionServiceInfo(); + + private ConversionHelper() { + // Utility class; not meant to be instantiated. + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/conversion/ConversionServiceInfo.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/conversion/ConversionServiceInfo.java new file mode 100644 index 00000000..288fcd58 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/conversion/ConversionServiceInfo.java @@ -0,0 +1,224 @@ +package org.ccsds.moims.mo.mc.conversion; + +/** + * Helper class for Conversion service. + */ +public class ConversionServiceInfo extends org.ccsds.moims.mo.com.COMService { + + /** + * Service number literal. + */ + public static final int _CONVERSION_SERVICE_NUMBER = 7; + + /** + * Service number instance. + */ + public static final org.ccsds.moims.mo.mal.structures.UShort CONVERSION_SERVICE_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_CONVERSION_SERVICE_NUMBER); + + /** + * Service name constant. + */ + public static final org.ccsds.moims.mo.mal.structures.Identifier CONVERSION_SERVICE_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("Conversion"); + + /** + * The service key of this service. + */ + private static final org.ccsds.moims.mo.mal.ServiceKey SERVICE_KEY = new org.ccsds.moims.mo.mal.ServiceKey( + 4, 1, CONVERSION_SERVICE_NUMBER); + + /** + * Area elements. + */ + public static final org.ccsds.moims.mo.mal.structures.Element[] CONVERSION_SERVICE_ELEMENTS = {}; + + /** + * The set of operations for this service. + */ + public static final org.ccsds.moims.mo.mal.MALOperation[] OPERATIONS = new org.ccsds.moims.mo.mal.MALOperation[]{}; + + /** + * Literal for object CONVERSIONIDENTITY. + */ + @Deprecated + public static final int _CONVERSIONIDENTITY_OBJECT_NUMBER = 1; + + /** + * Instance for object CONVERSIONIDENTITY. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.UShort CONVERSIONIDENTITY_OBJECT_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_CONVERSIONIDENTITY_OBJECT_NUMBER); + + /** + * Object name constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.Identifier CONVERSIONIDENTITY_OBJECT_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("ConversionIdentity"); + + /** + * Object type constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.com.structures.ObjectType CONVERSIONIDENTITY_OBJECT_TYPE = new org.ccsds.moims.mo.com.structures.ObjectType(new org.ccsds.moims.mo.mal.structures.UShort(4), CONVERSION_SERVICE_NUMBER, new org.ccsds.moims.mo.mal.structures.UOctet(1), CONVERSIONIDENTITY_OBJECT_NUMBER); + + /** + * Object instance. + */ + @Deprecated + public static org.ccsds.moims.mo.com.COMObject CONVERSIONIDENTITY_OBJECT = new org.ccsds.moims.mo.com.COMObject(CONVERSIONIDENTITY_OBJECT_TYPE, CONVERSIONIDENTITY_OBJECT_NAME, org.ccsds.moims.mo.mal.structures.Attribute.IDENTIFIER_SHORT_FORM, false, null, true, null, false); + + /** + * Literal for object DISCRETECONVERSION. + */ + @Deprecated + public static final int _DISCRETECONVERSION_OBJECT_NUMBER = 2; + + /** + * Instance for object DISCRETECONVERSION. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.UShort DISCRETECONVERSION_OBJECT_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_DISCRETECONVERSION_OBJECT_NUMBER); + + /** + * Object name constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.Identifier DISCRETECONVERSION_OBJECT_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("DiscreteConversion"); + + /** + * Object type constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.com.structures.ObjectType DISCRETECONVERSION_OBJECT_TYPE = new org.ccsds.moims.mo.com.structures.ObjectType(new org.ccsds.moims.mo.mal.structures.UShort(4), CONVERSION_SERVICE_NUMBER, new org.ccsds.moims.mo.mal.structures.UOctet(1), DISCRETECONVERSION_OBJECT_NUMBER); + + /** + * Object instance. + */ + @Deprecated + public static org.ccsds.moims.mo.com.COMObject DISCRETECONVERSION_OBJECT = new org.ccsds.moims.mo.com.COMObject(DISCRETECONVERSION_OBJECT_TYPE, DISCRETECONVERSION_OBJECT_NAME, org.ccsds.moims.mo.mc.conversion.structures.DiscreteConversionDetails.SHORT_FORM, true, org.ccsds.moims.mo.mc.conversion.ConversionServiceInfo.CONVERSIONIDENTITY_OBJECT_TYPE, true, null, false); + + /** + * Literal for object LINECONVERSION. + */ + @Deprecated + public static final int _LINECONVERSION_OBJECT_NUMBER = 3; + + /** + * Instance for object LINECONVERSION. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.UShort LINECONVERSION_OBJECT_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_LINECONVERSION_OBJECT_NUMBER); + + /** + * Object name constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.Identifier LINECONVERSION_OBJECT_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("LineConversion"); + + /** + * Object type constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.com.structures.ObjectType LINECONVERSION_OBJECT_TYPE = new org.ccsds.moims.mo.com.structures.ObjectType(new org.ccsds.moims.mo.mal.structures.UShort(4), CONVERSION_SERVICE_NUMBER, new org.ccsds.moims.mo.mal.structures.UOctet(1), LINECONVERSION_OBJECT_NUMBER); + + /** + * Object instance. + */ + @Deprecated + public static org.ccsds.moims.mo.com.COMObject LINECONVERSION_OBJECT = new org.ccsds.moims.mo.com.COMObject(LINECONVERSION_OBJECT_TYPE, LINECONVERSION_OBJECT_NAME, org.ccsds.moims.mo.mc.conversion.structures.LineConversionDetails.SHORT_FORM, true, org.ccsds.moims.mo.mc.conversion.ConversionServiceInfo.CONVERSIONIDENTITY_OBJECT_TYPE, true, null, false); + + /** + * Literal for object POLYCONVERSION. + */ + @Deprecated + public static final int _POLYCONVERSION_OBJECT_NUMBER = 4; + + /** + * Instance for object POLYCONVERSION. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.UShort POLYCONVERSION_OBJECT_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_POLYCONVERSION_OBJECT_NUMBER); + + /** + * Object name constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.Identifier POLYCONVERSION_OBJECT_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("PolyConversion"); + + /** + * Object type constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.com.structures.ObjectType POLYCONVERSION_OBJECT_TYPE = new org.ccsds.moims.mo.com.structures.ObjectType(new org.ccsds.moims.mo.mal.structures.UShort(4), CONVERSION_SERVICE_NUMBER, new org.ccsds.moims.mo.mal.structures.UOctet(1), POLYCONVERSION_OBJECT_NUMBER); + + /** + * Object instance. + */ + @Deprecated + public static org.ccsds.moims.mo.com.COMObject POLYCONVERSION_OBJECT = new org.ccsds.moims.mo.com.COMObject(POLYCONVERSION_OBJECT_TYPE, POLYCONVERSION_OBJECT_NAME, org.ccsds.moims.mo.mc.conversion.structures.PolyConversionDetails.SHORT_FORM, true, org.ccsds.moims.mo.mc.conversion.ConversionServiceInfo.CONVERSIONIDENTITY_OBJECT_TYPE, true, null, false); + + /** + * Literal for object RANGECONVERSION. + */ + @Deprecated + public static final int _RANGECONVERSION_OBJECT_NUMBER = 5; + + /** + * Instance for object RANGECONVERSION. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.UShort RANGECONVERSION_OBJECT_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_RANGECONVERSION_OBJECT_NUMBER); + + /** + * Object name constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.Identifier RANGECONVERSION_OBJECT_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("RangeConversion"); + + /** + * Object type constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.com.structures.ObjectType RANGECONVERSION_OBJECT_TYPE = new org.ccsds.moims.mo.com.structures.ObjectType(new org.ccsds.moims.mo.mal.structures.UShort(4), CONVERSION_SERVICE_NUMBER, new org.ccsds.moims.mo.mal.structures.UOctet(1), RANGECONVERSION_OBJECT_NUMBER); + + /** + * Object instance. + */ + @Deprecated + public static org.ccsds.moims.mo.com.COMObject RANGECONVERSION_OBJECT = new org.ccsds.moims.mo.com.COMObject(RANGECONVERSION_OBJECT_TYPE, RANGECONVERSION_OBJECT_NAME, org.ccsds.moims.mo.mc.conversion.structures.RangeConversionDetails.SHORT_FORM, true, org.ccsds.moims.mo.mc.conversion.ConversionServiceInfo.CONVERSIONIDENTITY_OBJECT_TYPE, true, null, false); + + /** + * Object instance. + */ + public static final org.ccsds.moims.mo.com.COMObject[] COM_OBJECTS = { + CONVERSIONIDENTITY_OBJECT, + DISCRETECONVERSION_OBJECT, + LINECONVERSION_OBJECT, + POLYCONVERSION_OBJECT, + RANGECONVERSION_OBJECT,}; + + /** + * Creates an instance of the Conversion ServiceInfo. + * + */ + public ConversionServiceInfo() { + super(SERVICE_KEY, CONVERSION_SERVICE_NAME, CONVERSION_SERVICE_ELEMENTS, OPERATIONS, COM_OBJECTS); + } + + @Override + public org.ccsds.moims.mo.mal.MALArea getArea() { + return org.ccsds.moims.mo.mc.MCHelper.MC_AREA; + } + + @Override + public org.ccsds.moims.mo.mal.MOErrorException generateMOError(int errorNumber, + Object extraInfo) { + switch (errorNumber) { + case 70020: + return new org.ccsds.moims.mo.mc.ReadonlyException(extraInfo); + case 70021: + return new org.ccsds.moims.mo.mc.ReferencedException(extraInfo); + } + return null; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/conversion/consumer/ConversionAdapter.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/conversion/consumer/ConversionAdapter.java new file mode 100644 index 00000000..fae832c1 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/conversion/consumer/ConversionAdapter.java @@ -0,0 +1,8 @@ +package org.ccsds.moims.mo.mc.conversion.consumer; + +/** + * Consumer adapter for Conversion service. + */ +public abstract class ConversionAdapter extends org.ccsds.moims.mo.mal.consumer.MALInteractionAdapter { + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/conversion/consumer/ConversionStub.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/conversion/consumer/ConversionStub.java new file mode 100644 index 00000000..cf11fd54 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/conversion/consumer/ConversionStub.java @@ -0,0 +1,33 @@ +package org.ccsds.moims.mo.mc.conversion.consumer; + +/** + * Consumer stub for Conversion service. + */ +public class ConversionStub { + + /** + * The consumer field. + */ + private final org.ccsds.moims.mo.mal.consumer.MALConsumer consumer; + + /** + * Wraps a MALconsumer connection with service specific methods that map from + * the high level service API to the generic MAL API. + * + * @param consumer consumer The MALConsumer to use in this stub. + */ + public ConversionStub(org.ccsds.moims.mo.mal.consumer.MALConsumer consumer) { + this.consumer = consumer; + } + + /** + * Returns the internal MAL consumer object used for sending of messages from + * this interface. + * + * @return The MAL consumer object. + */ + public org.ccsds.moims.mo.mal.consumer.MALConsumer getConsumer() { + return consumer; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/conversion/consumer/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/conversion/consumer/package-info.java new file mode 100644 index 00000000..0fd0c15b --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/conversion/consumer/package-info.java @@ -0,0 +1,4 @@ +/** + * Package containing the consumer stubs for the Conversion service. +*/ +package org.ccsds.moims.mo.mc.conversion.consumer; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/conversion/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/conversion/package-info.java new file mode 100644 index 00000000..5e059105 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/conversion/package-info.java @@ -0,0 +1,13 @@ +/** + * The conversion service provides a set of basic conversion definition types + * that allows the specification of a conversion between two representations. + * These conversions are used by the other MC services (such as Action, Alert, + * and Parameter) to define conversions from raw field representations to + * some engineering representation. + * Conversions are associated with other entities such as parameters or action/alert + * arguments through the configuration of the relevant service (action/alert/parameter). + * The conversion service does not provide any operations directly, but allows + * consumers to add, remove, and modify conversion definitions via the COM + * archive. +*/ +package org.ccsds.moims.mo.mc.conversion; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/conversion/provider/ConversionHandler.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/conversion/provider/ConversionHandler.java new file mode 100644 index 00000000..de33c5b4 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/conversion/provider/ConversionHandler.java @@ -0,0 +1,15 @@ +package org.ccsds.moims.mo.mc.conversion.provider; + +/** + * Interface that providers of the Conversion service must implement to handle + * the operations of that service. + */ +public interface ConversionHandler { + + /** + * Sets the skeleton to be used for creation of publishers. + * + * @param skeleton The skeleton to be used. + */ + void setSkeleton(org.ccsds.moims.mo.mc.conversion.provider.ConversionSkeleton skeleton); +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/conversion/provider/ConversionInheritanceSkeleton.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/conversion/provider/ConversionInheritanceSkeleton.java new file mode 100644 index 00000000..5952e5a3 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/conversion/provider/ConversionInheritanceSkeleton.java @@ -0,0 +1,101 @@ +package org.ccsds.moims.mo.mc.conversion.provider; + +/** + * Provider Inheritance skeleton for ConversionInheritanceSkeleton service. + */ +public abstract class ConversionInheritanceSkeleton implements org.ccsds.moims.mo.mal.provider.MALInteractionHandler, org.ccsds.moims.mo.mc.conversion.provider.ConversionSkeleton, org.ccsds.moims.mo.mc.conversion.provider.ConversionHandler { + + /** + * The providerSet field. + */ + private org.ccsds.moims.mo.mal.provider.MALProviderSet providerSet = new org.ccsds.moims.mo.mal.provider.MALProviderSet(org.ccsds.moims.mo.mc.conversion.ConversionHelper.CONVERSION_SERVICE); + + /** + * Returns the connection object for this provider. + * + * @return the connection object for this provider + * @throws java.io.IOException if the method was not implemented yet. + */ + public org.ccsds.moims.mo.mal.helpertools.connections.ConnectionProvider getConnection() throws java.io.IOException { + throw new java.io.IOException("This method needs to be overridden!"); + } + + @Override + public void setSkeleton(org.ccsds.moims.mo.mc.conversion.provider.ConversionSkeleton skeleton) { + // Not used in the inheritance pattern (the skeleton is 'this'); + } + + @Override + public void malInitialize(org.ccsds.moims.mo.mal.provider.MALProvider provider) throws org.ccsds.moims.mo.mal.MALException { + providerSet.addProvider(provider); + } + + @Override + public void malFinalize(org.ccsds.moims.mo.mal.provider.MALProvider provider) throws org.ccsds.moims.mo.mal.MALException { + providerSet.removeProvider(provider); + } + + @Override + public void handleSend(org.ccsds.moims.mo.mal.provider.MALInteraction interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + switch (opNumber) { + default: + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } + + @Override + public void handleSubmit(org.ccsds.moims.mo.mal.provider.MALSubmit interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + switch (opNumber) { + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } + + @Override + public void handleRequest(org.ccsds.moims.mo.mal.provider.MALRequest interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + switch (opNumber) { + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } + + @Override + public void handleInvoke(org.ccsds.moims.mo.mal.provider.MALInvoke interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + switch (opNumber) { + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } + + @Override + public void handleProgress(org.ccsds.moims.mo.mal.provider.MALProgress interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + switch (opNumber) { + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/conversion/provider/ConversionSkeleton.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/conversion/provider/ConversionSkeleton.java new file mode 100644 index 00000000..2fe387a7 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/conversion/provider/ConversionSkeleton.java @@ -0,0 +1,8 @@ +package org.ccsds.moims.mo.mc.conversion.provider; + +/** + * The skeleton interface for the Conversion service. + */ +public interface ConversionSkeleton { + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/conversion/provider/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/conversion/provider/package-info.java new file mode 100644 index 00000000..fba8f6fb --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/conversion/provider/package-info.java @@ -0,0 +1,4 @@ +/** + * Package containing the provider skeletons for the Conversion service. +*/ +package org.ccsds.moims.mo.mc.conversion.provider; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/conversion/structures/DiscreteConversionDetails.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/conversion/structures/DiscreteConversionDetails.java new file mode 100644 index 00000000..163a8089 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/conversion/structures/DiscreteConversionDetails.java @@ -0,0 +1,111 @@ +package org.ccsds.moims.mo.mc.conversion.structures; + +/** + * The DiscreteConversionDetails structure holds a bidirectional conversion + * between raw and converted values. The first element of the pair is the + * raw value and the second is the converted value. Both sets of values must + * be unique. + */ +public final class DiscreteConversionDetails implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1125929988390913L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125929988390913L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Defines a mapping between raw and converted values as a discrete set of + * points. The first entry in the pair is the raw value, and the second entry + * is the converted value. + */ + private org.ccsds.moims.mo.mal.structures.PairList mapping; + + /** + * Default constructor for DiscreteConversionDetails. + * + */ + public DiscreteConversionDetails() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param mapping Defines a mapping between raw and converted values as a discrete set of points. The first entry in the pair is the raw value, and the second entry is the converted value. + */ + public DiscreteConversionDetails(org.ccsds.moims.mo.mal.structures.PairList mapping) { + this.mapping = mapping; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mc.conversion.structures.DiscreteConversionDetails(); + } + + /** + * Returns the field mapping. + * + * @return The field mapping + */ + public org.ccsds.moims.mo.mal.structures.PairList getMapping() { + return mapping; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof DiscreteConversionDetails) { + DiscreteConversionDetails other = (DiscreteConversionDetails) obj; + if (mapping == null) { + if (other.mapping != null) { + return false; + } + } else { + if (! mapping.equals(other.mapping)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (mapping != null ? mapping.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(DiscreteConversionDetails: "); + buf.append("mapping=").append(mapping); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (mapping == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'mapping' cannot be null!"); + } + encoder.encodeElement(mapping); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + mapping = (org.ccsds.moims.mo.mal.structures.PairList) decoder.decodeElement(new org.ccsds.moims.mo.mal.structures.PairList()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/conversion/structures/DiscreteConversionDetailsList.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/conversion/structures/DiscreteConversionDetailsList.java new file mode 100644 index 00000000..7024a0b5 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/conversion/structures/DiscreteConversionDetailsList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mc.conversion.structures; + +/** + * List class for DiscreteConversionDetails. + */ +public final class DiscreteConversionDetailsList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1125930005168127L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125930005168127L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for DiscreteConversionDetailsList. + * + */ + public DiscreteConversionDetailsList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public DiscreteConversionDetailsList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public DiscreteConversionDetailsList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mc.conversion.structures.DiscreteConversionDetails element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mc.conversion.structures.DiscreteConversionDetails element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new DiscreteConversionDetailsList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mc.conversion.structures.DiscreteConversionDetails(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/conversion/structures/LineConversionDetails.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/conversion/structures/LineConversionDetails.java new file mode 100644 index 00000000..45342973 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/conversion/structures/LineConversionDetails.java @@ -0,0 +1,144 @@ +package org.ccsds.moims.mo.mc.conversion.structures; + +/** + * The LineConversionDetails structure is a bi-directional conversion between + * raw and converted values. It is defined by a series of points between which + * values are to be interpolated. The extrapolate attribute indicates if values + * can also be linearly extrapolated beyond the initial and final points. + */ +public final class LineConversionDetails implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1125929988390914L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125929988390914L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Indicates whether or not values can be extrapolated beyond the start and + * the end of the points. + */ + private Boolean extrapolate; + + /** + * Defines the bi-directional conversion. The first attribute of the point + * is a raw value, and the second attribute is the converted value. + */ + private org.ccsds.moims.mo.mal.structures.PairList points; + + /** + * Default constructor for LineConversionDetails. + * + */ + public LineConversionDetails() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param extrapolate Indicates whether or not values can be extrapolated beyond the start and the end of the points. + * @param points Defines the bi-directional conversion. The first attribute of the point is a raw value, and the second attribute is the converted value. + */ + public LineConversionDetails(Boolean extrapolate, + org.ccsds.moims.mo.mal.structures.PairList points) { + this.extrapolate = extrapolate; + this.points = points; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mc.conversion.structures.LineConversionDetails(); + } + + /** + * Returns the field extrapolate. + * + * @return The field extrapolate + */ + public Boolean getExtrapolate() { + return extrapolate; + } + + /** + * Returns the field points. + * + * @return The field points + */ + public org.ccsds.moims.mo.mal.structures.PairList getPoints() { + return points; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof LineConversionDetails) { + LineConversionDetails other = (LineConversionDetails) obj; + if (extrapolate == null) { + if (other.extrapolate != null) { + return false; + } + } else { + if (! extrapolate.equals(other.extrapolate)) { + return false; + } + } + if (points == null) { + if (other.points != null) { + return false; + } + } else { + if (! points.equals(other.points)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (extrapolate != null ? extrapolate.hashCode() : 0); + hash = 83 * hash + (points != null ? points.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(LineConversionDetails: "); + buf.append("extrapolate=").append(extrapolate); + buf.append(", points=").append(points); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (extrapolate == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'extrapolate' cannot be null!"); + } + if (points == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'points' cannot be null!"); + } + encoder.encodeBoolean(extrapolate); + encoder.encodeElement(points); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + extrapolate = decoder.decodeBoolean(); + points = (org.ccsds.moims.mo.mal.structures.PairList) decoder.decodeElement(new org.ccsds.moims.mo.mal.structures.PairList()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/conversion/structures/LineConversionDetailsList.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/conversion/structures/LineConversionDetailsList.java new file mode 100644 index 00000000..9b38d6c4 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/conversion/structures/LineConversionDetailsList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mc.conversion.structures; + +/** + * List class for LineConversionDetails. + */ +public final class LineConversionDetailsList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1125930005168126L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125930005168126L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for LineConversionDetailsList. + * + */ + public LineConversionDetailsList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public LineConversionDetailsList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public LineConversionDetailsList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mc.conversion.structures.LineConversionDetails element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mc.conversion.structures.LineConversionDetails element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new LineConversionDetailsList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mc.conversion.structures.LineConversionDetails(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/conversion/structures/PolyConversionDetails.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/conversion/structures/PolyConversionDetails.java new file mode 100644 index 00000000..155ba100 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/conversion/structures/PolyConversionDetails.java @@ -0,0 +1,110 @@ +package org.ccsds.moims.mo.mc.conversion.structures; + +/** + * The PolyConversionDetails structure holds only forward (raw to converted) + * polynomial conversions. They are defined by a series of points for the + * polynomial coefficients. + */ +public final class PolyConversionDetails implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1125929988390915L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125929988390915L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * The first attribute of a point is a MAL::Integer, being the degree of the + * polynomial; the second attribute is either a MAL::Float or a MAL::Double, + * being the coefficient of the term. + */ + private org.ccsds.moims.mo.mal.structures.PairList points; + + /** + * Default constructor for PolyConversionDetails. + * + */ + public PolyConversionDetails() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param points The first attribute of a point is a MAL::Integer, being the degree of the polynomial; the second attribute is either a MAL::Float or a MAL::Double, being the coefficient of the term. + */ + public PolyConversionDetails(org.ccsds.moims.mo.mal.structures.PairList points) { + this.points = points; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mc.conversion.structures.PolyConversionDetails(); + } + + /** + * Returns the field points. + * + * @return The field points + */ + public org.ccsds.moims.mo.mal.structures.PairList getPoints() { + return points; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof PolyConversionDetails) { + PolyConversionDetails other = (PolyConversionDetails) obj; + if (points == null) { + if (other.points != null) { + return false; + } + } else { + if (! points.equals(other.points)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (points != null ? points.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(PolyConversionDetails: "); + buf.append("points=").append(points); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (points == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'points' cannot be null!"); + } + encoder.encodeElement(points); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + points = (org.ccsds.moims.mo.mal.structures.PairList) decoder.decodeElement(new org.ccsds.moims.mo.mal.structures.PairList()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/conversion/structures/PolyConversionDetailsList.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/conversion/structures/PolyConversionDetailsList.java new file mode 100644 index 00000000..122ccf6a --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/conversion/structures/PolyConversionDetailsList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mc.conversion.structures; + +/** + * List class for PolyConversionDetails. + */ +public final class PolyConversionDetailsList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1125930005168125L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125930005168125L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for PolyConversionDetailsList. + * + */ + public PolyConversionDetailsList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public PolyConversionDetailsList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public PolyConversionDetailsList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mc.conversion.structures.PolyConversionDetails element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mc.conversion.structures.PolyConversionDetails element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new PolyConversionDetailsList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mc.conversion.structures.PolyConversionDetails(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/conversion/structures/RangeConversionDetails.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/conversion/structures/RangeConversionDetails.java new file mode 100644 index 00000000..6c8951e1 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/conversion/structures/RangeConversionDetails.java @@ -0,0 +1,109 @@ +package org.ccsds.moims.mo.mc.conversion.structures; + +/** + * The RangeConversionDetails structure holds a range for a one-way conversion + * to convert between a continuous range to a discrete value. A range is defined + * as from this point up to, but not including, the next point. + */ +public final class RangeConversionDetails implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1125929988390916L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125929988390916L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * The first attribute in each pair is the raw range, and the second attribute + * is the converted value. + */ + private org.ccsds.moims.mo.mal.structures.PairList points; + + /** + * Default constructor for RangeConversionDetails. + * + */ + public RangeConversionDetails() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param points The first attribute in each pair is the raw range, and the second attribute is the converted value. + */ + public RangeConversionDetails(org.ccsds.moims.mo.mal.structures.PairList points) { + this.points = points; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mc.conversion.structures.RangeConversionDetails(); + } + + /** + * Returns the field points. + * + * @return The field points + */ + public org.ccsds.moims.mo.mal.structures.PairList getPoints() { + return points; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof RangeConversionDetails) { + RangeConversionDetails other = (RangeConversionDetails) obj; + if (points == null) { + if (other.points != null) { + return false; + } + } else { + if (! points.equals(other.points)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (points != null ? points.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(RangeConversionDetails: "); + buf.append("points=").append(points); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (points == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'points' cannot be null!"); + } + encoder.encodeElement(points); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + points = (org.ccsds.moims.mo.mal.structures.PairList) decoder.decodeElement(new org.ccsds.moims.mo.mal.structures.PairList()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/conversion/structures/RangeConversionDetailsList.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/conversion/structures/RangeConversionDetailsList.java new file mode 100644 index 00000000..83619daa --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/conversion/structures/RangeConversionDetailsList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mc.conversion.structures; + +/** + * List class for RangeConversionDetails. + */ +public final class RangeConversionDetailsList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1125930005168124L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125930005168124L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for RangeConversionDetailsList. + * + */ + public RangeConversionDetailsList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public RangeConversionDetailsList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public RangeConversionDetailsList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mc.conversion.structures.RangeConversionDetails element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mc.conversion.structures.RangeConversionDetails element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new RangeConversionDetailsList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mc.conversion.structures.RangeConversionDetails(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/conversion/structures/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/conversion/structures/package-info.java new file mode 100644 index 00000000..49b1f802 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/conversion/structures/package-info.java @@ -0,0 +1,4 @@ +/** + * Package containing types defined in the Conversion service. +*/ +package org.ccsds.moims.mo.mc.conversion.structures; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/group/GroupHelper.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/group/GroupHelper.java new file mode 100644 index 00000000..6e291099 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/group/GroupHelper.java @@ -0,0 +1,17 @@ +package org.ccsds.moims.mo.mc.group; + +/** + * Helper class for Group service. + */ +public class GroupHelper { + + /** + * Service singleton instance. + */ + public static final org.ccsds.moims.mo.mc.group.GroupServiceInfo GROUP_SERVICE = new org.ccsds.moims.mo.mc.group.GroupServiceInfo(); + + private GroupHelper() { + // Utility class; not meant to be instantiated. + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/group/GroupServiceInfo.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/group/GroupServiceInfo.java new file mode 100644 index 00000000..c21a485e --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/group/GroupServiceInfo.java @@ -0,0 +1,131 @@ +package org.ccsds.moims.mo.mc.group; + +/** + * Helper class for Group service. + */ +public class GroupServiceInfo extends org.ccsds.moims.mo.com.COMService { + + /** + * Service number literal. + */ + public static final int _GROUP_SERVICE_NUMBER = 8; + + /** + * Service number instance. + */ + public static final org.ccsds.moims.mo.mal.structures.UShort GROUP_SERVICE_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_GROUP_SERVICE_NUMBER); + + /** + * Service name constant. + */ + public static final org.ccsds.moims.mo.mal.structures.Identifier GROUP_SERVICE_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("Group"); + + /** + * The service key of this service. + */ + private static final org.ccsds.moims.mo.mal.ServiceKey SERVICE_KEY = new org.ccsds.moims.mo.mal.ServiceKey( + 4, 1, GROUP_SERVICE_NUMBER); + + /** + * Area elements. + */ + public static final org.ccsds.moims.mo.mal.structures.Element[] GROUP_SERVICE_ELEMENTS = {}; + + /** + * The set of operations for this service. + */ + public static final org.ccsds.moims.mo.mal.MALOperation[] OPERATIONS = new org.ccsds.moims.mo.mal.MALOperation[]{}; + + /** + * Literal for object GROUPIDENTITY. + */ + @Deprecated + public static final int _GROUPIDENTITY_OBJECT_NUMBER = 1; + + /** + * Instance for object GROUPIDENTITY. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.UShort GROUPIDENTITY_OBJECT_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_GROUPIDENTITY_OBJECT_NUMBER); + + /** + * Object name constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.Identifier GROUPIDENTITY_OBJECT_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("GroupIdentity"); + + /** + * Object type constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.com.structures.ObjectType GROUPIDENTITY_OBJECT_TYPE = new org.ccsds.moims.mo.com.structures.ObjectType(new org.ccsds.moims.mo.mal.structures.UShort(4), GROUP_SERVICE_NUMBER, new org.ccsds.moims.mo.mal.structures.UOctet(1), GROUPIDENTITY_OBJECT_NUMBER); + + /** + * Object instance. + */ + @Deprecated + public static org.ccsds.moims.mo.com.COMObject GROUPIDENTITY_OBJECT = new org.ccsds.moims.mo.com.COMObject(GROUPIDENTITY_OBJECT_TYPE, GROUPIDENTITY_OBJECT_NAME, org.ccsds.moims.mo.mal.structures.Attribute.IDENTIFIER_SHORT_FORM, false, null, true, null, false); + + /** + * Literal for object GROUPDEFINITION. + */ + @Deprecated + public static final int _GROUPDEFINITION_OBJECT_NUMBER = 2; + + /** + * Instance for object GROUPDEFINITION. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.UShort GROUPDEFINITION_OBJECT_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_GROUPDEFINITION_OBJECT_NUMBER); + + /** + * Object name constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.Identifier GROUPDEFINITION_OBJECT_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("GroupDefinition"); + + /** + * Object type constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.com.structures.ObjectType GROUPDEFINITION_OBJECT_TYPE = new org.ccsds.moims.mo.com.structures.ObjectType(new org.ccsds.moims.mo.mal.structures.UShort(4), GROUP_SERVICE_NUMBER, new org.ccsds.moims.mo.mal.structures.UOctet(1), GROUPDEFINITION_OBJECT_NUMBER); + + /** + * Object instance. + */ + @Deprecated + public static org.ccsds.moims.mo.com.COMObject GROUPDEFINITION_OBJECT = new org.ccsds.moims.mo.com.COMObject(GROUPDEFINITION_OBJECT_TYPE, GROUPDEFINITION_OBJECT_NAME, org.ccsds.moims.mo.mc.group.structures.GroupDetails.SHORT_FORM, true, org.ccsds.moims.mo.mc.group.GroupServiceInfo.GROUPIDENTITY_OBJECT_TYPE, true, null, false); + + /** + * Object instance. + */ + public static final org.ccsds.moims.mo.com.COMObject[] COM_OBJECTS = { + GROUPIDENTITY_OBJECT, + GROUPDEFINITION_OBJECT,}; + + /** + * Creates an instance of the Group ServiceInfo. + * + */ + public GroupServiceInfo() { + super(SERVICE_KEY, GROUP_SERVICE_NAME, GROUP_SERVICE_ELEMENTS, OPERATIONS, COM_OBJECTS); + } + + @Override + public org.ccsds.moims.mo.mal.MALArea getArea() { + return org.ccsds.moims.mo.mc.MCHelper.MC_AREA; + } + + @Override + public org.ccsds.moims.mo.mal.MOErrorException generateMOError(int errorNumber, + Object extraInfo) { + switch (errorNumber) { + case 70020: + return new org.ccsds.moims.mo.mc.ReadonlyException(extraInfo); + case 70021: + return new org.ccsds.moims.mo.mc.ReferencedException(extraInfo); + } + return null; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/group/consumer/GroupAdapter.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/group/consumer/GroupAdapter.java new file mode 100644 index 00000000..3f81042f --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/group/consumer/GroupAdapter.java @@ -0,0 +1,8 @@ +package org.ccsds.moims.mo.mc.group.consumer; + +/** + * Consumer adapter for Group service. + */ +public abstract class GroupAdapter extends org.ccsds.moims.mo.mal.consumer.MALInteractionAdapter { + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/group/consumer/GroupStub.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/group/consumer/GroupStub.java new file mode 100644 index 00000000..0c746f8b --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/group/consumer/GroupStub.java @@ -0,0 +1,33 @@ +package org.ccsds.moims.mo.mc.group.consumer; + +/** + * Consumer stub for Group service. + */ +public class GroupStub { + + /** + * The consumer field. + */ + private final org.ccsds.moims.mo.mal.consumer.MALConsumer consumer; + + /** + * Wraps a MALconsumer connection with service specific methods that map from + * the high level service API to the generic MAL API. + * + * @param consumer consumer The MALConsumer to use in this stub. + */ + public GroupStub(org.ccsds.moims.mo.mal.consumer.MALConsumer consumer) { + this.consumer = consumer; + } + + /** + * Returns the internal MAL consumer object used for sending of messages from + * this interface. + * + * @return The MAL consumer object. + */ + public org.ccsds.moims.mo.mal.consumer.MALConsumer getConsumer() { + return consumer; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/group/consumer/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/group/consumer/package-info.java new file mode 100644 index 00000000..cee4cb15 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/group/consumer/package-info.java @@ -0,0 +1,4 @@ +/** + * Package containing the consumer stubs for the Group service. +*/ +package org.ccsds.moims.mo.mc.group.consumer; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/group/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/group/package-info.java new file mode 100644 index 00000000..f22b41f8 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/group/package-info.java @@ -0,0 +1,18 @@ +/** + * The group service provides a mechanism for other services to reference + * sets of their own objects using a single group reference. These groups + * are used by the other MC services (such as Action, Alert, Check, Aggregation + * and Parameter) to reduce the complexity of operations by allowing consumers + * to reference groups of objects (such as parameters) in operations rather + * than having to supply large lists of object references. + * Where operations of other service mention the use of groups in their operations, + * any reference to a group object instance identifier implicitly means a + * GroupIdentity object. + * Groups of other groups is supported, however all objects within the group + * of groups should have the same object type as most operations expect a + * single type. + * The creation of cyclic group of groups should also be avoided. + * The group service does not provide any operations directly, but allows + * consumers to add, remove, and modify groups via the COM archive. +*/ +package org.ccsds.moims.mo.mc.group; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/group/provider/GroupHandler.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/group/provider/GroupHandler.java new file mode 100644 index 00000000..cebc9e46 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/group/provider/GroupHandler.java @@ -0,0 +1,15 @@ +package org.ccsds.moims.mo.mc.group.provider; + +/** + * Interface that providers of the Group service must implement to handle + * the operations of that service. + */ +public interface GroupHandler { + + /** + * Sets the skeleton to be used for creation of publishers. + * + * @param skeleton The skeleton to be used. + */ + void setSkeleton(org.ccsds.moims.mo.mc.group.provider.GroupSkeleton skeleton); +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/group/provider/GroupInheritanceSkeleton.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/group/provider/GroupInheritanceSkeleton.java new file mode 100644 index 00000000..89e2a41a --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/group/provider/GroupInheritanceSkeleton.java @@ -0,0 +1,101 @@ +package org.ccsds.moims.mo.mc.group.provider; + +/** + * Provider Inheritance skeleton for GroupInheritanceSkeleton service. + */ +public abstract class GroupInheritanceSkeleton implements org.ccsds.moims.mo.mal.provider.MALInteractionHandler, org.ccsds.moims.mo.mc.group.provider.GroupSkeleton, org.ccsds.moims.mo.mc.group.provider.GroupHandler { + + /** + * The providerSet field. + */ + private org.ccsds.moims.mo.mal.provider.MALProviderSet providerSet = new org.ccsds.moims.mo.mal.provider.MALProviderSet(org.ccsds.moims.mo.mc.group.GroupHelper.GROUP_SERVICE); + + /** + * Returns the connection object for this provider. + * + * @return the connection object for this provider + * @throws java.io.IOException if the method was not implemented yet. + */ + public org.ccsds.moims.mo.mal.helpertools.connections.ConnectionProvider getConnection() throws java.io.IOException { + throw new java.io.IOException("This method needs to be overridden!"); + } + + @Override + public void setSkeleton(org.ccsds.moims.mo.mc.group.provider.GroupSkeleton skeleton) { + // Not used in the inheritance pattern (the skeleton is 'this'); + } + + @Override + public void malInitialize(org.ccsds.moims.mo.mal.provider.MALProvider provider) throws org.ccsds.moims.mo.mal.MALException { + providerSet.addProvider(provider); + } + + @Override + public void malFinalize(org.ccsds.moims.mo.mal.provider.MALProvider provider) throws org.ccsds.moims.mo.mal.MALException { + providerSet.removeProvider(provider); + } + + @Override + public void handleSend(org.ccsds.moims.mo.mal.provider.MALInteraction interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + switch (opNumber) { + default: + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } + + @Override + public void handleSubmit(org.ccsds.moims.mo.mal.provider.MALSubmit interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + switch (opNumber) { + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } + + @Override + public void handleRequest(org.ccsds.moims.mo.mal.provider.MALRequest interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + switch (opNumber) { + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } + + @Override + public void handleInvoke(org.ccsds.moims.mo.mal.provider.MALInvoke interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + switch (opNumber) { + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } + + @Override + public void handleProgress(org.ccsds.moims.mo.mal.provider.MALProgress interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + switch (opNumber) { + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/group/provider/GroupSkeleton.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/group/provider/GroupSkeleton.java new file mode 100644 index 00000000..5e5320c0 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/group/provider/GroupSkeleton.java @@ -0,0 +1,8 @@ +package org.ccsds.moims.mo.mc.group.provider; + +/** + * The skeleton interface for the Group service. + */ +public interface GroupSkeleton { + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/group/provider/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/group/provider/package-info.java new file mode 100644 index 00000000..8d434d64 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/group/provider/package-info.java @@ -0,0 +1,4 @@ +/** + * Package containing the provider skeletons for the Group service. +*/ +package org.ccsds.moims.mo.mc.group.provider; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/group/structures/GroupDetails.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/group/structures/GroupDetails.java new file mode 100644 index 00000000..3ad42c75 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/group/structures/GroupDetails.java @@ -0,0 +1,207 @@ +package org.ccsds.moims.mo.mc.group.structures; + +/** + * The GroupDetails structure holds the object type, domain, and set of object + * instance identifiers for a set of objects from another service. + */ +public final class GroupDetails implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1125934283358209L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125934283358209L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Description of the group. + */ + private String description; + + /** + * The object type of the objects referenced by this group. + */ + private org.ccsds.moims.mo.com.structures.ObjectType objectType; + + /** + * The domain of the objects being referenced by this group. + */ + private org.ccsds.moims.mo.mal.structures.IdentifierList domain; + + /** + * The list of object instance identifiers of the objects being referenced + * by this group. + */ + private org.ccsds.moims.mo.mal.structures.LongList instanceIds; + + /** + * Default constructor for GroupDetails. + * + */ + public GroupDetails() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param description Description of the group. + * @param objectType The object type of the objects referenced by this group. + * @param domain The domain of the objects being referenced by this group. + * @param instanceIds The list of object instance identifiers of the objects being referenced by this group. + */ + public GroupDetails(String description, + org.ccsds.moims.mo.com.structures.ObjectType objectType, + org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.LongList instanceIds) { + this.description = description; + this.objectType = objectType; + this.domain = domain; + this.instanceIds = instanceIds; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mc.group.structures.GroupDetails(); + } + + /** + * Returns the field description. + * + * @return The field description + */ + public String getDescription() { + return description; + } + + /** + * Returns the field objectType. + * + * @return The field objectType + */ + public org.ccsds.moims.mo.com.structures.ObjectType getObjectType() { + return objectType; + } + + /** + * Returns the field domain. + * + * @return The field domain + */ + public org.ccsds.moims.mo.mal.structures.IdentifierList getDomain() { + return domain; + } + + /** + * Returns the field instanceIds. + * + * @return The field instanceIds + */ + public org.ccsds.moims.mo.mal.structures.LongList getInstanceIds() { + return instanceIds; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof GroupDetails) { + GroupDetails other = (GroupDetails) obj; + if (description == null) { + if (other.description != null) { + return false; + } + } else { + if (! description.equals(other.description)) { + return false; + } + } + if (objectType == null) { + if (other.objectType != null) { + return false; + } + } else { + if (! objectType.equals(other.objectType)) { + return false; + } + } + if (domain == null) { + if (other.domain != null) { + return false; + } + } else { + if (! domain.equals(other.domain)) { + return false; + } + } + if (instanceIds == null) { + if (other.instanceIds != null) { + return false; + } + } else { + if (! instanceIds.equals(other.instanceIds)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (description != null ? description.hashCode() : 0); + hash = 83 * hash + (objectType != null ? objectType.hashCode() : 0); + hash = 83 * hash + (domain != null ? domain.hashCode() : 0); + hash = 83 * hash + (instanceIds != null ? instanceIds.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(GroupDetails: "); + buf.append("description=").append(description); + buf.append(", objectType=").append(objectType); + buf.append(", domain=").append(domain); + buf.append(", instanceIds=").append(instanceIds); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (description == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'description' cannot be null!"); + } + if (objectType == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'objectType' cannot be null!"); + } + if (domain == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'domain' cannot be null!"); + } + if (instanceIds == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'instanceIds' cannot be null!"); + } + encoder.encodeString(description); + encoder.encodeElement(objectType); + encoder.encodeElement(domain); + encoder.encodeElement(instanceIds); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + description = decoder.decodeString(); + objectType = (org.ccsds.moims.mo.com.structures.ObjectType) decoder.decodeElement(new org.ccsds.moims.mo.com.structures.ObjectType()); + domain = (org.ccsds.moims.mo.mal.structures.IdentifierList) decoder.decodeElement(new org.ccsds.moims.mo.mal.structures.IdentifierList()); + instanceIds = (org.ccsds.moims.mo.mal.structures.LongList) decoder.decodeElement(new org.ccsds.moims.mo.mal.structures.LongList()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/group/structures/GroupDetailsList.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/group/structures/GroupDetailsList.java new file mode 100644 index 00000000..eb7e3a15 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/group/structures/GroupDetailsList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mc.group.structures; + +/** + * List class for GroupDetails. + */ +public final class GroupDetailsList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1125934300135423L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125934300135423L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for GroupDetailsList. + * + */ + public GroupDetailsList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public GroupDetailsList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public GroupDetailsList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mc.group.structures.GroupDetails element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mc.group.structures.GroupDetails element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new GroupDetailsList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mc.group.structures.GroupDetails(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/group/structures/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/group/structures/package-info.java new file mode 100644 index 00000000..b72f88a4 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/group/structures/package-info.java @@ -0,0 +1,4 @@ +/** + * Package containing types defined in the Group service. +*/ +package org.ccsds.moims.mo.mc.group.structures; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/package-info.java new file mode 100644 index 00000000..65cdc7fc --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/package-info.java @@ -0,0 +1,15 @@ +/** + * This section details the MC services, the structures used by the services + * are detailed in section 4. Both the services and structures are defined + * in terms of the MO MAL, which is defined in [2], so it is possible to deploy + * them over any supported protocol and message transport. + * The services defined here are also specified in terms of the COM, which + * is defined in [3]. + * To aid comprehension, several tables are included for each service and + * operation definition. The table formats are briefly described in section + * 1.6.3.2 and are the same as those used for the specification of the MO + * COM services in [3]. + * All service specifications in this document are part of the MC area, which + * has a short form number of "4". +*/ +package org.ccsds.moims.mo.mc; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/ParameterHelper.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/ParameterHelper.java new file mode 100644 index 00000000..adc55a0e --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/ParameterHelper.java @@ -0,0 +1,17 @@ +package org.ccsds.moims.mo.mc.parameter; + +/** + * Helper class for Parameter service. + */ +public class ParameterHelper { + + /** + * Service singleton instance. + */ + public static final org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo PARAMETER_SERVICE = new org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo(); + + private ParameterHelper() { + // Utility class; not meant to be instantiated. + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/ParameterServiceInfo.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/ParameterServiceInfo.java new file mode 100644 index 00000000..89da3d5e --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/ParameterServiceInfo.java @@ -0,0 +1,360 @@ +package org.ccsds.moims.mo.mc.parameter; + +/** + * Helper class for Parameter service. + */ +public class ParameterServiceInfo extends org.ccsds.moims.mo.com.COMService { + + /** + * Service number literal. + */ + public static final int _PARAMETER_SERVICE_NUMBER = 2; + + /** + * Service number instance. + */ + public static final org.ccsds.moims.mo.mal.structures.UShort PARAMETER_SERVICE_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_PARAMETER_SERVICE_NUMBER); + + /** + * Service name constant. + */ + public static final org.ccsds.moims.mo.mal.structures.Identifier PARAMETER_SERVICE_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("Parameter"); + + /** + * The service key of this service. + */ + private static final org.ccsds.moims.mo.mal.ServiceKey SERVICE_KEY = new org.ccsds.moims.mo.mal.ServiceKey( + 4, 1, PARAMETER_SERVICE_NUMBER); + + /** + * Operation number literal for operation MONITORVALUE. + */ + public static final int _MONITORVALUE_OP_NUMBER = 1; + + /** + * Operation number instance for operation MONITORVALUE. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort MONITORVALUE_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_MONITORVALUE_OP_NUMBER); + + /** + * Operation instance for operation MONITORVALUE. + */ + public static final org.ccsds.moims.mo.mal.MALPubSubOperation MONITORVALUE_OP = new org.ccsds.moims.mo.mal.MALPubSubOperation(SERVICE_KEY, + MONITORVALUE_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("monitorValue"), + new org.ccsds.moims.mo.mal.structures.UShort(1), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("objId", true, org.ccsds.moims.mo.com.structures.ObjectId.SHORT_FORM, "The MAL EntityKey.firstSubKey shall contain the parameter name.\nThe MAL EntityKey.secondSubKey shall contain the ParameterIdentity object instance identifier.\nThe MAL EntityKey.thirdSubKey shall contain the ParameterDefinition object instance identifier.\nThe MAL EntityKey.fourthSubKey shall contain the new ParameterValueInstance object instance identifier.\nThe timestamp of the ParameterValueInstance report shall be taken from the publish message and shall be the time of the parameter value update.\nThe publish message shall include the ObjectId of the source link of the report.\nIf no source link is needed then the ObjectId shall be replaced with a NULL."), + new org.ccsds.moims.mo.mal.OperationField("newValue", true, org.ccsds.moims.mo.mc.parameter.structures.ParameterValue.SHORT_FORM, "The second part of the publish message shall be the ParameterValueInstance object value.")}, + "The monitorValue operation allows a consumer to subscribe for parameter value reports."); + + /** + * Key names instance for MONITORVALUE operation of pubsub interaction pattern. + */ + private static final org.ccsds.moims.mo.mal.structures.Identifier [] _MONITORVALUE_OP_KEY_NAMES = {}; + + /** + * Key names instance for MONITORVALUE operation of pubsub interaction pattern. + */ + private static final org.ccsds.moims.mo.mal.structures.IdentifierList MONITORVALUE_OP_KEY_NAMES = new org.ccsds.moims.mo.mal.structures.IdentifierList(new java.util.ArrayList<>(java.util.Arrays.asList(_MONITORVALUE_OP_KEY_NAMES))); + + /** + * Operation number literal for operation GETVALUE. + */ + public static final int _GETVALUE_OP_NUMBER = 2; + + /** + * Operation number instance for operation GETVALUE. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort GETVALUE_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_GETVALUE_OP_NUMBER); + + /** + * Operation instance for operation GETVALUE. + */ + public static final org.ccsds.moims.mo.mal.MALRequestOperation GETVALUE_OP = new org.ccsds.moims.mo.mal.MALRequestOperation(SERVICE_KEY, + GETVALUE_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("getValue"), + new org.ccsds.moims.mo.mal.structures.UShort(2), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("paramInstIds", true, org.ccsds.moims.mo.mal.structures.LongList.SHORT_FORM, "The paramInstIds field shall provide the list of ParameterIdentity object instance identifiers.\nThe wildcard value of '0' shall be supported and matches all parameters of the provider.\nThe wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made.\nIf a requested parameter is unknown then an UNKNOWN error shall be returned.\nIf a parameter is being reported periodically, using the operation shall not reset the reportInterval timer.")}, + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("paramValDetails", true, org.ccsds.moims.mo.mc.parameter.structures.ParameterValueDetailsList.SHORT_FORM, "The response shall contain a list of returned ParameterIdentity and ParameterDefinition object instance identifier pairs and a matching list of parameter values.\nThe new value shall not be published via the monitorValue operation.")}, + "The getValue operation returns the latest received value for a requested parameter."); + + /** + * Operation number literal for operation SETVALUE. + */ + public static final int _SETVALUE_OP_NUMBER = 3; + + /** + * Operation number instance for operation SETVALUE. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort SETVALUE_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_SETVALUE_OP_NUMBER); + + /** + * Operation instance for operation SETVALUE. + */ + public static final org.ccsds.moims.mo.mal.MALSubmitOperation SETVALUE_OP = new org.ccsds.moims.mo.mal.MALSubmitOperation(SERVICE_KEY, + SETVALUE_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("setValue"), + new org.ccsds.moims.mo.mal.structures.UShort(3), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("newRawValues", true, org.ccsds.moims.mo.mc.parameter.structures.ParameterRawValueList.SHORT_FORM, "The submitted newRawValues shall hold a list of ParameterRawValues that contain the ParameterIdentity object instance identifier and the respective raw value to be set.\nIf the paramInstId field contains the wildcard value of '0' then an INVALID error shall be returned.\nIf a requested ParameterIdentity is unknown then an UNKNOWN error shall be returned.\nIf a request ParameterIdentity is not settable due to it being read only then a READONLY error shall be returned.\nThe rawValue shall contain the new parameter raw value to be set.\nIf the supplied new parameter raw value does not match the defined type for the ParameterIdentity then an INVALID error shall be returned.\nIf an error is raised then no modifications shall be made as a result of this operation call.\nThe parameter values shall be set concurrently, by this it is meant that all values are set at the same time without interleaving of other values being (ATOMIC behaviour). How this is implemented is an implementation detail.\nThe service provider shall create new ParameterValueInstance objects for the updated parameter values, store these in the COM Archive, and publish these new values.")}, + "The setValue operation allows a consumer to set the raw value for one or more parameters."); + + /** + * Operation number literal for operation ENABLEGENERATION. + */ + public static final int _ENABLEGENERATION_OP_NUMBER = 4; + + /** + * Operation number instance for operation ENABLEGENERATION. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort ENABLEGENERATION_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_ENABLEGENERATION_OP_NUMBER); + + /** + * Operation instance for operation ENABLEGENERATION. + */ + public static final org.ccsds.moims.mo.mal.MALRequestOperation ENABLEGENERATION_OP = new org.ccsds.moims.mo.mal.MALRequestOperation(SERVICE_KEY, + ENABLEGENERATION_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("enableGeneration"), + new org.ccsds.moims.mo.mal.structures.UShort(4), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("isGroupIds", true, org.ccsds.moims.mo.mal.structures.Attribute.BOOLEAN_SHORT_FORM, "If the isGroupIds field is TRUE then the enableInstances field shall contain GroupIdentity object instance identifiers, otherwise the field contains ParameterIdentity object instance identifiers.\nThe ParameterIdentity objects referenced, either directly or indirectly via groups, by the enableInstances field shall be the ParameterIdentity objects to match.\nThe id of the enableInstances field shall support the wildcard value of '0' and matches all ParameterIdentity objects of the provider.\nThe service provider shall check for the wildcard value in the list of object instance identifiers in the enableInstances field first and if found no other checks of supplied object instance identifiers shall be made.\nIf the enableInstances field contains a value of TRUE then reports for matching ParameterIdentity objects shall be generated, a value of FALSE requests that reports will not be generated.\nNo error shall be raised if the enableInstances Boolean value supplied is the same as the current generationEnabled field of the definition for a matched ParameterIdentity object i.e. enabling an already enabled parameter will not result in an error.\nIf a requested ParameterIdentity or GroupIdentity object is unknown then an UNKNOWN error shall be returned.\nIf a requested Group, or the Group objects referenced by that Group, does not contain ParameterIdentity objects then an INVALID error shall be returned.\nIf an error is raised then no modifications shall be made as a result of this operation call.\nThe provider shall create and store a new ParameterDefinition object in the COM archive if the generationEnabled field is changed.\nIf a new ParameterDefinition object is created then that new object shall be the current ParameterDefinition used for the specific ParameterIdentity."), + new org.ccsds.moims.mo.mal.OperationField("enableInstances", true, org.ccsds.moims.mo.com.structures.InstanceBooleanPairList.SHORT_FORM, "If the generation of reports is being enabled, and the parameter is defined as being periodic, then the provider shall generate a report immediately and start the report interval from that report.")}, + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("newObjInstIds", true, org.ccsds.moims.mo.mal.structures.LongList.SHORT_FORM, "The response shall contain the list of object instance identifiers for the new ParameterDefinition objects.")}, + "The enableGeneration operation allows a consumer to control whether reports for specific parameters are generated or not. The operation allows the consumer to select the parameters directly or indirectly using groups."); + + /** + * Operation number literal for operation LISTDEFINITION. + */ + public static final int _LISTDEFINITION_OP_NUMBER = 5; + + /** + * Operation number instance for operation LISTDEFINITION. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort LISTDEFINITION_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_LISTDEFINITION_OP_NUMBER); + + /** + * Operation instance for operation LISTDEFINITION. + */ + public static final org.ccsds.moims.mo.mal.MALRequestOperation LISTDEFINITION_OP = new org.ccsds.moims.mo.mal.MALRequestOperation(SERVICE_KEY, + LISTDEFINITION_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("listDefinition"), + new org.ccsds.moims.mo.mal.structures.UShort(5), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("paramNames", true, org.ccsds.moims.mo.mal.structures.IdentifierList.SHORT_FORM, "The paramNames field shall contain a list of parameter names to retrieve the ParameterIdentity and ParameterDefinition object instance identifiers for.\nThe paramNames field may contain the wildcard value of '*' to return all supported ParameterIdentity and ParameterDefinition objects.\nThe wildcard value should be checked for first, if found no other checks of supplied identifiers shall be made.\nIf a provided identifier does not include a wildcard and does not match an existing ParameterIdentity object then this operation shall fail with an UNKNOWN error.")}, + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("objInstIds", true, org.ccsds.moims.mo.mc.structures.ObjectInstancePairList.SHORT_FORM, "The response shall contain a list of matching ParameterIdentity and ParameterDefinition object instance identifier pairs.\nThe returned list shall maintain the same order as the submitted list unless the wildcard value was included in the request.")}, + "The listDefinition operation allows a consumer to request the latest object instance identifiers of the ParameterIdentity and ParameterDefinition objects for the supported parameters of the provider."); + + /** + * Operation number literal for operation ADDPARAMETER. + */ + public static final int _ADDPARAMETER_OP_NUMBER = 6; + + /** + * Operation number instance for operation ADDPARAMETER. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort ADDPARAMETER_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_ADDPARAMETER_OP_NUMBER); + + /** + * Operation instance for operation ADDPARAMETER. + */ + public static final org.ccsds.moims.mo.mal.MALRequestOperation ADDPARAMETER_OP = new org.ccsds.moims.mo.mal.MALRequestOperation(SERVICE_KEY, + ADDPARAMETER_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("addParameter"), + new org.ccsds.moims.mo.mal.structures.UShort(6), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("paramDefDetails", true, org.ccsds.moims.mo.mc.parameter.structures.ParameterCreationRequestList.SHORT_FORM, "The paramDefDetails field shall hold the name and the ParameterDefinitionDetails to be added.\nThe name field must not be the wildcard '*', or empty (an INVALID error shall be returned in this case).\nIf the supplied reportInterval value is not supported by the provider then an INVALID error shall be returned.\nThe supplied name must be unique among all ParameterIdentity objects for the domain of the provider otherwise a DUPLICATE error shall be raised.\nIf an error is raised then no new identities and definitions shall be added as a result of this operation call.\nIf the supplied name matches an existing, but removed, ParameterIdentity then that ParameterIdentity shall be reused otherwise a new ParameterIdentity shall be created.\nThe provider shall create a new ParameterDefinition object and store it, and any new ParameterIdentity objects, in the COM archive.")}, + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("newObjInstIds", true, org.ccsds.moims.mo.mc.structures.ObjectInstancePairList.SHORT_FORM, "The response shall contain the list of object instance identifiers for the ParameterIdentity and new ParameterDefinition objects.\nThe returned list shall maintain the same order as the submitted definitions.")}, + "The addParameter operation allows a consumer to define one or more parameters that do not currently exist.\nThe new ParameterIdentity and ParameterDefinition objects are expected to be stored in the COM archive by the provider of the parameter service."); + + /** + * Operation number literal for operation UPDATEDEFINITION. + */ + public static final int _UPDATEDEFINITION_OP_NUMBER = 7; + + /** + * Operation number instance for operation UPDATEDEFINITION. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort UPDATEDEFINITION_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_UPDATEDEFINITION_OP_NUMBER); + + /** + * Operation instance for operation UPDATEDEFINITION. + */ + public static final org.ccsds.moims.mo.mal.MALRequestOperation UPDATEDEFINITION_OP = new org.ccsds.moims.mo.mal.MALRequestOperation(SERVICE_KEY, + UPDATEDEFINITION_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("updateDefinition"), + new org.ccsds.moims.mo.mal.structures.UShort(6), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("paramInstIds", true, org.ccsds.moims.mo.mal.structures.LongList.SHORT_FORM, "The paramInstIds field shall contain the object instance identifiers of the ParameterIdentity objects to be updated.\nThe supplied object instance identifiers shall match existing identity objects, an UNKNOWN error shall be raised if this is not the case.\nIf the paramInstIds list contains either NULL or '0' an INVALID error shall be raised."), + new org.ccsds.moims.mo.mal.OperationField("paramDefDetails", true, org.ccsds.moims.mo.mc.parameter.structures.ParameterDefinitionDetailsList.SHORT_FORM, "The paramDefDetails field shall contain the replacement ParameterDefinitionDetails.\nThe two lists shall be ordered the same.\nThe number of entries in the two lists shall be the same size otherwise an INVALID error shall be returned.\nIf the supplied reportInterval value is not supported by the provider then an INVALID error shall be returned.\nIf an error is raised then no definitions shall be updated as a result of this operation call.\nThe provider shall create a new ParameterDefinition object and store it in the COM archive.\nThe new ParameterDefinition object shall be the current ParameterDefinition used for the specific ParameterIdentity.")}, + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("newObjInstIds", true, org.ccsds.moims.mo.mal.structures.LongList.SHORT_FORM, "The response shall contain the list of object instance identifiers for the new ParameterDefinition objects.\nThe returned list shall maintain the same order as the submitted definitions.")}, + "The updateDefinition operation allows a consumer to update a definition for one or more parameters.\nThis differs from deleting an existing parameter and adding a new definition with the same parameter name in the fact that the ParameterIdentity object is not changed between the two definitions.\nThe replacement definition should be stored in the COM archive by the service provider. The operation does not remove the previous object from the COM archive, merely removes the object from the provider."); + + /** + * Operation number literal for operation REMOVEPARAMETER. + */ + public static final int _REMOVEPARAMETER_OP_NUMBER = 8; + + /** + * Operation number instance for operation REMOVEPARAMETER. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort REMOVEPARAMETER_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_REMOVEPARAMETER_OP_NUMBER); + + /** + * Operation instance for operation REMOVEPARAMETER. + */ + public static final org.ccsds.moims.mo.mal.MALSubmitOperation REMOVEPARAMETER_OP = new org.ccsds.moims.mo.mal.MALSubmitOperation(SERVICE_KEY, + REMOVEPARAMETER_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("removeParameter"), + new org.ccsds.moims.mo.mal.structures.UShort(6), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("paramInstIds", true, org.ccsds.moims.mo.mal.structures.LongList.SHORT_FORM, "The paramInstIds field shall hold the object instance identifiers of the ParameterIdentity objects to be removed from the provider.\nThe list may contain the wildcard value of '0'.\nThe wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made.\nIf a provided ParameterIdentity object instance identifier does not include a wildcard and does not match an existing parameter identity object then this operation shall fail with an UNKNOWN error.\nMatched ParameterIdentity and ParameterDefinition objects shall not be removed from the COM archive only the list of ParameterIdentity and ParameterDefinition objects from the provider.\nIf an error is raised then no parameters shall be removed as a result of this operation call.\nIf the operation succeeds then the provider shall not publish parameter values for the deleted ParameterIdentity objects anymore.")}, + "The removeParameter operation allows a consumer to remove one or more parameters from the list of parameters supported by the parameter provider.\nThe operation does not remove the ParameterIdentity or ParameterDefinition objects from the COM archive, merely removes the objects from the provider. This permits existing parameter values to continue to reference the correct ParameterIdentity and ParameterDefinition objects in the COM archive."); + + /** + * Area elements. + */ + public static final org.ccsds.moims.mo.mal.structures.Element[] PARAMETER_SERVICE_ELEMENTS = {}; + + /** + * The set of operations for this service. + */ + public static final org.ccsds.moims.mo.mal.MALOperation[] OPERATIONS = new org.ccsds.moims.mo.mal.MALOperation[]{MONITORVALUE_OP, + GETVALUE_OP, + SETVALUE_OP, + ENABLEGENERATION_OP, + LISTDEFINITION_OP, + ADDPARAMETER_OP, + UPDATEDEFINITION_OP, + REMOVEPARAMETER_OP}; + + /** + * Literal for object PARAMETERIDENTITY. + */ + @Deprecated + public static final int _PARAMETERIDENTITY_OBJECT_NUMBER = 1; + + /** + * Instance for object PARAMETERIDENTITY. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.UShort PARAMETERIDENTITY_OBJECT_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_PARAMETERIDENTITY_OBJECT_NUMBER); + + /** + * Object name constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.Identifier PARAMETERIDENTITY_OBJECT_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("ParameterIdentity"); + + /** + * Object type constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.com.structures.ObjectType PARAMETERIDENTITY_OBJECT_TYPE = new org.ccsds.moims.mo.com.structures.ObjectType(new org.ccsds.moims.mo.mal.structures.UShort(4), PARAMETER_SERVICE_NUMBER, new org.ccsds.moims.mo.mal.structures.UOctet(1), PARAMETERIDENTITY_OBJECT_NUMBER); + + /** + * Object instance. + */ + @Deprecated + public static org.ccsds.moims.mo.com.COMObject PARAMETERIDENTITY_OBJECT = new org.ccsds.moims.mo.com.COMObject(PARAMETERIDENTITY_OBJECT_TYPE, PARAMETERIDENTITY_OBJECT_NAME, org.ccsds.moims.mo.mal.structures.Attribute.IDENTIFIER_SHORT_FORM, false, null, true, null, false); + + /** + * Literal for object PARAMETERDEFINITION. + */ + @Deprecated + public static final int _PARAMETERDEFINITION_OBJECT_NUMBER = 2; + + /** + * Instance for object PARAMETERDEFINITION. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.UShort PARAMETERDEFINITION_OBJECT_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_PARAMETERDEFINITION_OBJECT_NUMBER); + + /** + * Object name constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.Identifier PARAMETERDEFINITION_OBJECT_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("ParameterDefinition"); + + /** + * Object type constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.com.structures.ObjectType PARAMETERDEFINITION_OBJECT_TYPE = new org.ccsds.moims.mo.com.structures.ObjectType(new org.ccsds.moims.mo.mal.structures.UShort(4), PARAMETER_SERVICE_NUMBER, new org.ccsds.moims.mo.mal.structures.UOctet(1), PARAMETERDEFINITION_OBJECT_NUMBER); + + /** + * Object instance. + */ + @Deprecated + public static org.ccsds.moims.mo.com.COMObject PARAMETERDEFINITION_OBJECT = new org.ccsds.moims.mo.com.COMObject(PARAMETERDEFINITION_OBJECT_TYPE, PARAMETERDEFINITION_OBJECT_NAME, org.ccsds.moims.mo.mc.parameter.structures.ParameterDefinitionDetails.SHORT_FORM, true, org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo.PARAMETERIDENTITY_OBJECT_TYPE, true, null, false); + + /** + * Literal for object PARAMETERVALUEINSTANCE. + */ + @Deprecated + public static final int _PARAMETERVALUEINSTANCE_OBJECT_NUMBER = 3; + + /** + * Instance for object PARAMETERVALUEINSTANCE. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.UShort PARAMETERVALUEINSTANCE_OBJECT_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_PARAMETERVALUEINSTANCE_OBJECT_NUMBER); + + /** + * Object name constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.Identifier PARAMETERVALUEINSTANCE_OBJECT_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("ParameterValueInstance"); + + /** + * Object type constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.com.structures.ObjectType PARAMETERVALUEINSTANCE_OBJECT_TYPE = new org.ccsds.moims.mo.com.structures.ObjectType(new org.ccsds.moims.mo.mal.structures.UShort(4), PARAMETER_SERVICE_NUMBER, new org.ccsds.moims.mo.mal.structures.UOctet(1), PARAMETERVALUEINSTANCE_OBJECT_NUMBER); + + /** + * Object instance. + */ + @Deprecated + public static org.ccsds.moims.mo.com.COMObject PARAMETERVALUEINSTANCE_OBJECT = new org.ccsds.moims.mo.com.COMObject(PARAMETERVALUEINSTANCE_OBJECT_TYPE, PARAMETERVALUEINSTANCE_OBJECT_NAME, org.ccsds.moims.mo.mc.parameter.structures.ParameterValue.SHORT_FORM, true, org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo.PARAMETERDEFINITION_OBJECT_TYPE, true, null, false); + + /** + * Object instance. + */ + public static final org.ccsds.moims.mo.com.COMObject[] COM_OBJECTS = { + PARAMETERIDENTITY_OBJECT, + PARAMETERDEFINITION_OBJECT, + PARAMETERVALUEINSTANCE_OBJECT,}; + + /** + * Creates an instance of the Parameter ServiceInfo. + * + */ + public ParameterServiceInfo() { + super(SERVICE_KEY, PARAMETER_SERVICE_NAME, PARAMETER_SERVICE_ELEMENTS, OPERATIONS, COM_OBJECTS); + } + + @Override + public org.ccsds.moims.mo.mal.MALArea getArea() { + return org.ccsds.moims.mo.mc.MCHelper.MC_AREA; + } + + @Override + public org.ccsds.moims.mo.mal.MOErrorException generateMOError(int errorNumber, + Object extraInfo) { + switch (errorNumber) { + case 70020: + return new org.ccsds.moims.mo.mc.ReadonlyException(extraInfo); + case 70021: + return new org.ccsds.moims.mo.mc.ReferencedException(extraInfo); + } + return null; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/consumer/MonitorValueSubscriptionKeys.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/consumer/MonitorValueSubscriptionKeys.java new file mode 100644 index 00000000..14056ef5 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/consumer/MonitorValueSubscriptionKeys.java @@ -0,0 +1,68 @@ +package org.ccsds.moims.mo.mc.parameter.consumer; + +/** + * Typed accessors for the Subscription Keys of the monitorValue PubSub operation. + */ +public final class MonitorValueSubscriptionKeys { + + /** + * The key values as received in the UpdateHeader. + */ + private org.ccsds.moims.mo.mal.structures.NullableAttributeList keyValues; + + /** + * The effective key names for the received key values. + */ + private org.ccsds.moims.mo.mal.structures.IdentifierList keyNames; + + /** + * The Subscription Key names defined by the operation, in order. + */ + private static final org.ccsds.moims.mo.mal.structures.IdentifierList CANONICAL_KEY_NAMES = new org.ccsds.moims.mo.mal.structures.IdentifierList(new java.util.ArrayList<>(java.util.Arrays.asList())); + + /** + * Creates an instance from the received UpdateHeader and the subscription + * selectedKeys. + * + * @param updateHeader The UpdateHeader received in the NOTIFY message + * @param selectedKeys The selectedKeys of the subscription, or null if trimming was not enabled + */ + public MonitorValueSubscriptionKeys(org.ccsds.moims.mo.mal.structures.UpdateHeader updateHeader, + org.ccsds.moims.mo.mal.structures.IdentifierList selectedKeys) { + this.keyValues = (updateHeader == null) ? null : updateHeader.getKeyValues(); + this.keyNames = (selectedKeys != null) ? selectedKeys : CANONICAL_KEY_NAMES; + } + + /** + * Returns the Subscription Key value with the given name, or null if it is + * not present (for example when it was trimmed away or is a custom key that + * is not part of this subscription). + * + * @param name The Subscription Key name + * @return The key value, or null if not present + */ + public org.ccsds.moims.mo.mal.structures.Attribute getByName(String name) { + return valueByName(name); + } + + /** + * + * @param name The Subscription Key name + */ + private org.ccsds.moims.mo.mal.structures.Attribute valueByName(String name) { + if (keyNames == null || keyValues == null) { + return null; + } + for (int i = 0; i < keyNames.size(); i++) { + if (name.equals(keyNames.get(i).getValue())) { + if (i >= keyValues.size()) { + return null; + } + org.ccsds.moims.mo.mal.structures.NullableAttribute na = keyValues.get(i); + return (na == null) ? null : na.getValue(); + } + } + return null; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/consumer/ParameterAdapter.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/consumer/ParameterAdapter.java new file mode 100644 index 00000000..394b8b33 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/consumer/ParameterAdapter.java @@ -0,0 +1,439 @@ +package org.ccsds.moims.mo.mc.parameter.consumer; + +/** + * Consumer adapter for Parameter service. + */ +public abstract class ParameterAdapter extends org.ccsds.moims.mo.mal.consumer.MALInteractionAdapter { + + /** + * Called by the MAL when a PubSub register acknowledgement is received from + * a broker for the operation monitorValue. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void monitorValueRegisterAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PubSub register acknowledgement error is received + * from a broker for the operation monitorValue. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void monitorValueRegisterErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PubSub deregister acknowledgement is received + * from a broker for the operation monitorValue. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void monitorValueDeregisterAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PubSub update is received from a broker for the + * operation monitorValue. + * + * @param msgHeader msgHeader The header of the received message + * @param subscriptionId The subscriptionId of the subscription. + * @param updateHeader The Update header. + * @param keys The typed Subscription Key accessors for this update + * @param objId The MAL EntityKey.firstSubKey shall contain the parameter name. +The MAL EntityKey.secondSubKey shall contain the ParameterIdentity object instance identifier. +The MAL EntityKey.thirdSubKey shall contain the ParameterDefinition object instance identifier. +The MAL EntityKey.fourthSubKey shall contain the new ParameterValueInstance object instance identifier. +The timestamp of the ParameterValueInstance report shall be taken from the publish message and shall be the time of the parameter value update. +The publish message shall include the ObjectId of the source link of the report. +If no source link is needed then the ObjectId shall be replaced with a NULL. + * @param newValue The second part of the publish message shall be the ParameterValueInstance object value. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void monitorValueNotifyReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.structures.Identifier subscriptionId, + org.ccsds.moims.mo.mal.structures.UpdateHeader updateHeader, + MonitorValueSubscriptionKeys keys, + org.ccsds.moims.mo.com.structures.ObjectId objId, + org.ccsds.moims.mo.mc.parameter.structures.ParameterValue newValue, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PubSub update error is received from a broker + * for the operation monitorValue. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void monitorValueNotifyErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response is received from a provider for + * the operation getValue. + * + * @param msgHeader msgHeader The header of the received message + * @param paramValDetails The response shall contain a list of returned ParameterIdentity and ParameterDefinition object instance identifier pairs and a matching list of parameter values. +The new value shall not be published via the monitorValue operation. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void getValueResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mc.parameter.structures.ParameterValueDetailsList paramValDetails, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response error is received from a provider + * for the operation getValue. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void getValueErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a SUBMIT acknowledgement is received from a provider + * for the operation setValue. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void setValueAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a SUBMIT acknowledgement error is received from + * a provider for the operation setValue. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void setValueErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response is received from a provider for + * the operation enableGeneration. + * + * @param msgHeader msgHeader The header of the received message + * @param newObjInstIds The response shall contain the list of object instance identifiers for the new ParameterDefinition objects. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void enableGenerationResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.structures.LongList newObjInstIds, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response error is received from a provider + * for the operation enableGeneration. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void enableGenerationErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response is received from a provider for + * the operation listDefinition. + * + * @param msgHeader msgHeader The header of the received message + * @param objInstIds The response shall contain a list of matching ParameterIdentity and ParameterDefinition object instance identifier pairs. +The returned list shall maintain the same order as the submitted list unless the wildcard value was included in the request. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void listDefinitionResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mc.structures.ObjectInstancePairList objInstIds, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response error is received from a provider + * for the operation listDefinition. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void listDefinitionErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response is received from a provider for + * the operation addParameter. + * + * @param msgHeader msgHeader The header of the received message + * @param newObjInstIds The response shall contain the list of object instance identifiers for the ParameterIdentity and new ParameterDefinition objects. +The returned list shall maintain the same order as the submitted definitions. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void addParameterResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mc.structures.ObjectInstancePairList newObjInstIds, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response error is received from a provider + * for the operation addParameter. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void addParameterErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response is received from a provider for + * the operation updateDefinition. + * + * @param msgHeader msgHeader The header of the received message + * @param newObjInstIds The response shall contain the list of object instance identifiers for the new ParameterDefinition objects. +The returned list shall maintain the same order as the submitted definitions. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void updateDefinitionResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.structures.LongList newObjInstIds, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response error is received from a provider + * for the operation updateDefinition. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void updateDefinitionErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a SUBMIT acknowledgement is received from a provider + * for the operation removeParameter. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void removeParameterAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a SUBMIT acknowledgement error is received from + * a provider for the operation removeParameter. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void removeParameterErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + @Override + public final void submitAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo._SETVALUE_OP_NUMBER: + setValueAckReceived(msgHeader, qosProperties); + break; + case org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo._REMOVEPARAMETER_OP_NUMBER: + removeParameterAckReceived(msgHeader, qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void submitErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALErrorBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo._SETVALUE_OP_NUMBER: + setValueErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo._REMOVEPARAMETER_OP_NUMBER: + removeParameterErrorReceived(msgHeader, body.getError(), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void requestResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALMessageBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo._GETVALUE_OP_NUMBER: + getValueResponseReceived(msgHeader, + (org.ccsds.moims.mo.mc.parameter.structures.ParameterValueDetailsList) body.getBodyElement(0, new org.ccsds.moims.mo.mc.parameter.structures.ParameterValueDetailsList()), qosProperties); + break; + case org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo._ENABLEGENERATION_OP_NUMBER: + enableGenerationResponseReceived(msgHeader, + (org.ccsds.moims.mo.mal.structures.LongList) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.LongList()), qosProperties); + break; + case org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo._LISTDEFINITION_OP_NUMBER: + listDefinitionResponseReceived(msgHeader, + (org.ccsds.moims.mo.mc.structures.ObjectInstancePairList) body.getBodyElement(0, new org.ccsds.moims.mo.mc.structures.ObjectInstancePairList()), qosProperties); + break; + case org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo._ADDPARAMETER_OP_NUMBER: + addParameterResponseReceived(msgHeader, + (org.ccsds.moims.mo.mc.structures.ObjectInstancePairList) body.getBodyElement(0, new org.ccsds.moims.mo.mc.structures.ObjectInstancePairList()), qosProperties); + break; + case org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo._UPDATEDEFINITION_OP_NUMBER: + updateDefinitionResponseReceived(msgHeader, + (org.ccsds.moims.mo.mal.structures.LongList) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.LongList()), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void requestErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALErrorBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo._GETVALUE_OP_NUMBER: + getValueErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo._ENABLEGENERATION_OP_NUMBER: + enableGenerationErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo._LISTDEFINITION_OP_NUMBER: + listDefinitionErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo._ADDPARAMETER_OP_NUMBER: + addParameterErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo._UPDATEDEFINITION_OP_NUMBER: + updateDefinitionErrorReceived(msgHeader, body.getError(), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void registerAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo._MONITORVALUE_OP_NUMBER: + monitorValueRegisterAckReceived(msgHeader, qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void registerErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALErrorBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo._MONITORVALUE_OP_NUMBER: + monitorValueRegisterErrorReceived(msgHeader, body.getError(), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void notifyReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALNotifyBody body, + org.ccsds.moims.mo.mal.structures.IdentifierList selectedKeys, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + if ((org.ccsds.moims.mo.mc.MCHelper.MC_AREA_NUMBER.equals(msgHeader.getServiceArea())) && (org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo.PARAMETER_SERVICE_NUMBER.equals(msgHeader.getService()))) { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo._MONITORVALUE_OP_NUMBER: + monitorValueNotifyReceived(msgHeader, + (org.ccsds.moims.mo.mal.structures.Identifier) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.Identifier()), + (org.ccsds.moims.mo.mal.structures.UpdateHeader) body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.UpdateHeader()), + new MonitorValueSubscriptionKeys((org.ccsds.moims.mo.mal.structures.UpdateHeader) body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.UpdateHeader()), selectedKeys), + (org.ccsds.moims.mo.com.structures.ObjectId) body.getBodyElement(2, new org.ccsds.moims.mo.com.structures.ObjectId()), + (org.ccsds.moims.mo.mc.parameter.structures.ParameterValue) body.getBodyElement(3, new org.ccsds.moims.mo.mc.parameter.structures.ParameterValue()), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + else { + notifyReceivedFromOtherService(msgHeader, body, qosProperties); + } + } + + @Override + public final void notifyErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALErrorBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo._MONITORVALUE_OP_NUMBER: + monitorValueNotifyErrorReceived(msgHeader, body.getError(), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void deregisterAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo._MONITORVALUE_OP_NUMBER: + monitorValueDeregisterAckReceived(msgHeader, qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + /** + * Called by the MAL when a PubSub update from another service is received + * from a broker. + * + * @param msgHeader msgHeader The header of the received message + * @param body body The body of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + * @throws org.ccsds.moims.mo.mal.MALException if an error is detected processing the message. + */ + public void notifyReceivedFromOtherService(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALNotifyBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/consumer/ParameterStub.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/consumer/ParameterStub.java new file mode 100644 index 00000000..97a0e0ee --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/consumer/ParameterStub.java @@ -0,0 +1,513 @@ +package org.ccsds.moims.mo.mc.parameter.consumer; + +/** + * Consumer stub for Parameter service. + */ +public class ParameterStub { + + /** + * The consumer field. + */ + private final org.ccsds.moims.mo.mal.consumer.MALConsumer consumer; + + /** + * Wraps a MALconsumer connection with service specific methods that map from + * the high level service API to the generic MAL API. + * + * @param consumer consumer The MALConsumer to use in this stub. + */ + public ParameterStub(org.ccsds.moims.mo.mal.consumer.MALConsumer consumer) { + this.consumer = consumer; + } + + /** + * Returns the internal MAL consumer object used for sending of messages from + * this interface. + * + * @return The MAL consumer object. + */ + public org.ccsds.moims.mo.mal.consumer.MALConsumer getConsumer() { + return consumer; + } + + /** + * Register method for the monitorValue PubSub interaction. + * + * @param subscription subscription the subscription to register for + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void monitorValueRegister(org.ccsds.moims.mo.mal.structures.Subscription subscription, + org.ccsds.moims.mo.mc.parameter.consumer.ParameterAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.register(org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo.MONITORVALUE_OP, subscription, adapter); + } + + /** + * Asynchronous version of method monitorValueRegister. + * + * @param subscription subscription the subscription to register for + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncMonitorValueRegister(org.ccsds.moims.mo.mal.structures.Subscription subscription, + org.ccsds.moims.mo.mc.parameter.consumer.ParameterAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncRegister(org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo.MONITORVALUE_OP, subscription, adapter); + } + + /** + * Deregister method for the monitorValue PubSub interaction. + * + * @param identifierList identifierList the subscription identifiers to deregister + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void monitorValueDeregister(org.ccsds.moims.mo.mal.structures.IdentifierList identifierList) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.deregister(org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo.MONITORVALUE_OP, identifierList); + } + + /** + * Asynchronous version of method monitorValueDeregister. + * + * @param identifierList identifierList the subscription identifiers to deregister + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncMonitorValueDeregister(org.ccsds.moims.mo.mal.structures.IdentifierList identifierList, + org.ccsds.moims.mo.mc.parameter.consumer.ParameterAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncDeregister(org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo.MONITORVALUE_OP, identifierList, adapter); + } + + /** + * The getValue operation returns the latest received value for a requested + * parameter. + * + * @param paramInstIds The paramInstIds field shall provide the list of ParameterIdentity object instance identifiers. +The wildcard value of '0' shall be supported and matches all parameters of the provider. +The wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made. +If a requested parameter is unknown then an UNKNOWN error shall be returned. +If a parameter is being reported periodically, using the operation shall not reset the reportInterval timer. + * @return The return value of the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mc.parameter.structures.ParameterValueDetailsList getValue(org.ccsds.moims.mo.mal.structures.LongList paramInstIds) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + org.ccsds.moims.mo.mal.transport.MALMessageBody body = consumer.request(org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo.GETVALUE_OP, paramInstIds); + Object body0 = (Object) body.getBodyElement(0, new org.ccsds.moims.mo.mc.parameter.structures.ParameterValueDetailsList()); + return (org.ccsds.moims.mo.mc.parameter.structures.ParameterValueDetailsList) body0; + } + + /** + * Asynchronous version of method getValue. + * + * @param paramInstIds The paramInstIds field shall provide the list of ParameterIdentity object instance identifiers. +The wildcard value of '0' shall be supported and matches all parameters of the provider. +The wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made. +If a requested parameter is unknown then an UNKNOWN error shall be returned. +If a parameter is being reported periodically, using the operation shall not reset the reportInterval timer. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncGetValue(org.ccsds.moims.mo.mal.structures.LongList paramInstIds, + org.ccsds.moims.mo.mc.parameter.consumer.ParameterAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncRequest(org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo.GETVALUE_OP, adapter, paramInstIds); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueGetValue(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mc.parameter.consumer.ParameterAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo.GETVALUE_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The setValue operation allows a consumer to set the raw value for one or + * more parameters. + * + * @param newRawValues The submitted newRawValues shall hold a list of ParameterRawValues that contain the ParameterIdentity object instance identifier and the respective raw value to be set. +If the paramInstId field contains the wildcard value of '0' then an INVALID error shall be returned. +If a requested ParameterIdentity is unknown then an UNKNOWN error shall be returned. +If a request ParameterIdentity is not settable due to it being read only then a READONLY error shall be returned. +The rawValue shall contain the new parameter raw value to be set. +If the supplied new parameter raw value does not match the defined type for the ParameterIdentity then an INVALID error shall be returned. +If an error is raised then no modifications shall be made as a result of this operation call. +The parameter values shall be set concurrently, by this it is meant that all values are set at the same time without interleaving of other values being (ATOMIC behaviour). How this is implemented is an implementation detail. +The service provider shall create new ParameterValueInstance objects for the updated parameter values, store these in the COM Archive, and publish these new values. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void setValue(org.ccsds.moims.mo.mc.parameter.structures.ParameterRawValueList newRawValues) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.submit(org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo.SETVALUE_OP, newRawValues); + } + + /** + * Asynchronous version of method setValue. + * + * @param newRawValues The submitted newRawValues shall hold a list of ParameterRawValues that contain the ParameterIdentity object instance identifier and the respective raw value to be set. +If the paramInstId field contains the wildcard value of '0' then an INVALID error shall be returned. +If a requested ParameterIdentity is unknown then an UNKNOWN error shall be returned. +If a request ParameterIdentity is not settable due to it being read only then a READONLY error shall be returned. +The rawValue shall contain the new parameter raw value to be set. +If the supplied new parameter raw value does not match the defined type for the ParameterIdentity then an INVALID error shall be returned. +If an error is raised then no modifications shall be made as a result of this operation call. +The parameter values shall be set concurrently, by this it is meant that all values are set at the same time without interleaving of other values being (ATOMIC behaviour). How this is implemented is an implementation detail. +The service provider shall create new ParameterValueInstance objects for the updated parameter values, store these in the COM Archive, and publish these new values. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncSetValue(org.ccsds.moims.mo.mc.parameter.structures.ParameterRawValueList newRawValues, + org.ccsds.moims.mo.mc.parameter.consumer.ParameterAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncSubmit(org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo.SETVALUE_OP, adapter, newRawValues); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueSetValue(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mc.parameter.consumer.ParameterAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo.SETVALUE_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The enableGeneration operation allows a consumer to control whether reports + * for specific parameters are generated or not. The operation allows the + * consumer to select the parameters directly or indirectly using groups. + * + * @param isGroupIds If the isGroupIds field is TRUE then the enableInstances field shall contain GroupIdentity object instance identifiers, otherwise the field contains ParameterIdentity object instance identifiers. +The ParameterIdentity objects referenced, either directly or indirectly via groups, by the enableInstances field shall be the ParameterIdentity objects to match. +The id of the enableInstances field shall support the wildcard value of '0' and matches all ParameterIdentity objects of the provider. +The service provider shall check for the wildcard value in the list of object instance identifiers in the enableInstances field first and if found no other checks of supplied object instance identifiers shall be made. +If the enableInstances field contains a value of TRUE then reports for matching ParameterIdentity objects shall be generated, a value of FALSE requests that reports will not be generated. +No error shall be raised if the enableInstances Boolean value supplied is the same as the current generationEnabled field of the definition for a matched ParameterIdentity object i.e. enabling an already enabled parameter will not result in an error. +If a requested ParameterIdentity or GroupIdentity object is unknown then an UNKNOWN error shall be returned. +If a requested Group, or the Group objects referenced by that Group, does not contain ParameterIdentity objects then an INVALID error shall be returned. +If an error is raised then no modifications shall be made as a result of this operation call. +The provider shall create and store a new ParameterDefinition object in the COM archive if the generationEnabled field is changed. +If a new ParameterDefinition object is created then that new object shall be the current ParameterDefinition used for the specific ParameterIdentity. + * @param enableInstances If the generation of reports is being enabled, and the parameter is defined as being periodic, then the provider shall generate a report immediately and start the report interval from that report. + * @return The return value of the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.structures.LongList enableGeneration(Boolean isGroupIds, + org.ccsds.moims.mo.com.structures.InstanceBooleanPairList enableInstances) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + org.ccsds.moims.mo.mal.transport.MALMessageBody body = consumer.request(org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo.ENABLEGENERATION_OP, (isGroupIds == null) ? null : new org.ccsds.moims.mo.mal.structures.Union(isGroupIds), enableInstances); + Object body0 = (Object) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.LongList()); + return (org.ccsds.moims.mo.mal.structures.LongList) body0; + } + + /** + * Asynchronous version of method enableGeneration. + * + * @param isGroupIds If the isGroupIds field is TRUE then the enableInstances field shall contain GroupIdentity object instance identifiers, otherwise the field contains ParameterIdentity object instance identifiers. +The ParameterIdentity objects referenced, either directly or indirectly via groups, by the enableInstances field shall be the ParameterIdentity objects to match. +The id of the enableInstances field shall support the wildcard value of '0' and matches all ParameterIdentity objects of the provider. +The service provider shall check for the wildcard value in the list of object instance identifiers in the enableInstances field first and if found no other checks of supplied object instance identifiers shall be made. +If the enableInstances field contains a value of TRUE then reports for matching ParameterIdentity objects shall be generated, a value of FALSE requests that reports will not be generated. +No error shall be raised if the enableInstances Boolean value supplied is the same as the current generationEnabled field of the definition for a matched ParameterIdentity object i.e. enabling an already enabled parameter will not result in an error. +If a requested ParameterIdentity or GroupIdentity object is unknown then an UNKNOWN error shall be returned. +If a requested Group, or the Group objects referenced by that Group, does not contain ParameterIdentity objects then an INVALID error shall be returned. +If an error is raised then no modifications shall be made as a result of this operation call. +The provider shall create and store a new ParameterDefinition object in the COM archive if the generationEnabled field is changed. +If a new ParameterDefinition object is created then that new object shall be the current ParameterDefinition used for the specific ParameterIdentity. + * @param enableInstances If the generation of reports is being enabled, and the parameter is defined as being periodic, then the provider shall generate a report immediately and start the report interval from that report. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncEnableGeneration(Boolean isGroupIds, + org.ccsds.moims.mo.com.structures.InstanceBooleanPairList enableInstances, + org.ccsds.moims.mo.mc.parameter.consumer.ParameterAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncRequest(org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo.ENABLEGENERATION_OP, adapter, (isGroupIds == null) ? null : new org.ccsds.moims.mo.mal.structures.Union(isGroupIds), enableInstances); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueEnableGeneration(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mc.parameter.consumer.ParameterAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo.ENABLEGENERATION_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The listDefinition operation allows a consumer to request the latest object + * instance identifiers of the ParameterIdentity and ParameterDefinition objects + * for the supported parameters of the provider. + * + * @param paramNames The paramNames field shall contain a list of parameter names to retrieve the ParameterIdentity and ParameterDefinition object instance identifiers for. +The paramNames field may contain the wildcard value of '*' to return all supported ParameterIdentity and ParameterDefinition objects. +The wildcard value should be checked for first, if found no other checks of supplied identifiers shall be made. +If a provided identifier does not include a wildcard and does not match an existing ParameterIdentity object then this operation shall fail with an UNKNOWN error. + * @return The return value of the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mc.structures.ObjectInstancePairList listDefinition(org.ccsds.moims.mo.mal.structures.IdentifierList paramNames) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + org.ccsds.moims.mo.mal.transport.MALMessageBody body = consumer.request(org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo.LISTDEFINITION_OP, paramNames); + Object body0 = (Object) body.getBodyElement(0, new org.ccsds.moims.mo.mc.structures.ObjectInstancePairList()); + return (org.ccsds.moims.mo.mc.structures.ObjectInstancePairList) body0; + } + + /** + * Asynchronous version of method listDefinition. + * + * @param paramNames The paramNames field shall contain a list of parameter names to retrieve the ParameterIdentity and ParameterDefinition object instance identifiers for. +The paramNames field may contain the wildcard value of '*' to return all supported ParameterIdentity and ParameterDefinition objects. +The wildcard value should be checked for first, if found no other checks of supplied identifiers shall be made. +If a provided identifier does not include a wildcard and does not match an existing ParameterIdentity object then this operation shall fail with an UNKNOWN error. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncListDefinition(org.ccsds.moims.mo.mal.structures.IdentifierList paramNames, + org.ccsds.moims.mo.mc.parameter.consumer.ParameterAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncRequest(org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo.LISTDEFINITION_OP, adapter, paramNames); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueListDefinition(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mc.parameter.consumer.ParameterAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo.LISTDEFINITION_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The addParameter operation allows a consumer to define one or more parameters + * that do not currently exist. + * The new ParameterIdentity and ParameterDefinition objects are expected + * to be stored in the COM archive by the provider of the parameter service. + * + * @param paramDefDetails The paramDefDetails field shall hold the name and the ParameterDefinitionDetails to be added. +The name field must not be the wildcard '*', or empty (an INVALID error shall be returned in this case). +If the supplied reportInterval value is not supported by the provider then an INVALID error shall be returned. +The supplied name must be unique among all ParameterIdentity objects for the domain of the provider otherwise a DUPLICATE error shall be raised. +If an error is raised then no new identities and definitions shall be added as a result of this operation call. +If the supplied name matches an existing, but removed, ParameterIdentity then that ParameterIdentity shall be reused otherwise a new ParameterIdentity shall be created. +The provider shall create a new ParameterDefinition object and store it, and any new ParameterIdentity objects, in the COM archive. + * @return The return value of the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mc.structures.ObjectInstancePairList addParameter(org.ccsds.moims.mo.mc.parameter.structures.ParameterCreationRequestList paramDefDetails) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + org.ccsds.moims.mo.mal.transport.MALMessageBody body = consumer.request(org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo.ADDPARAMETER_OP, paramDefDetails); + Object body0 = (Object) body.getBodyElement(0, new org.ccsds.moims.mo.mc.structures.ObjectInstancePairList()); + return (org.ccsds.moims.mo.mc.structures.ObjectInstancePairList) body0; + } + + /** + * Asynchronous version of method addParameter. + * + * @param paramDefDetails The paramDefDetails field shall hold the name and the ParameterDefinitionDetails to be added. +The name field must not be the wildcard '*', or empty (an INVALID error shall be returned in this case). +If the supplied reportInterval value is not supported by the provider then an INVALID error shall be returned. +The supplied name must be unique among all ParameterIdentity objects for the domain of the provider otherwise a DUPLICATE error shall be raised. +If an error is raised then no new identities and definitions shall be added as a result of this operation call. +If the supplied name matches an existing, but removed, ParameterIdentity then that ParameterIdentity shall be reused otherwise a new ParameterIdentity shall be created. +The provider shall create a new ParameterDefinition object and store it, and any new ParameterIdentity objects, in the COM archive. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncAddParameter(org.ccsds.moims.mo.mc.parameter.structures.ParameterCreationRequestList paramDefDetails, + org.ccsds.moims.mo.mc.parameter.consumer.ParameterAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncRequest(org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo.ADDPARAMETER_OP, adapter, paramDefDetails); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueAddParameter(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mc.parameter.consumer.ParameterAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo.ADDPARAMETER_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The updateDefinition operation allows a consumer to update a definition + * for one or more parameters. + * This differs from deleting an existing parameter and adding a new definition + * with the same parameter name in the fact that the ParameterIdentity object + * is not changed between the two definitions. + * The replacement definition should be stored in the COM archive by the service + * provider. The operation does not remove the previous object from the COM + * archive, merely removes the object from the provider. + * + * @param paramInstIds The paramInstIds field shall contain the object instance identifiers of the ParameterIdentity objects to be updated. +The supplied object instance identifiers shall match existing identity objects, an UNKNOWN error shall be raised if this is not the case. +If the paramInstIds list contains either NULL or '0' an INVALID error shall be raised. + * @param paramDefDetails The paramDefDetails field shall contain the replacement ParameterDefinitionDetails. +The two lists shall be ordered the same. +The number of entries in the two lists shall be the same size otherwise an INVALID error shall be returned. +If the supplied reportInterval value is not supported by the provider then an INVALID error shall be returned. +If an error is raised then no definitions shall be updated as a result of this operation call. +The provider shall create a new ParameterDefinition object and store it in the COM archive. +The new ParameterDefinition object shall be the current ParameterDefinition used for the specific ParameterIdentity. + * @return The return value of the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.structures.LongList updateDefinition(org.ccsds.moims.mo.mal.structures.LongList paramInstIds, + org.ccsds.moims.mo.mc.parameter.structures.ParameterDefinitionDetailsList paramDefDetails) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + org.ccsds.moims.mo.mal.transport.MALMessageBody body = consumer.request(org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo.UPDATEDEFINITION_OP, paramInstIds, paramDefDetails); + Object body0 = (Object) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.LongList()); + return (org.ccsds.moims.mo.mal.structures.LongList) body0; + } + + /** + * Asynchronous version of method updateDefinition. + * + * @param paramInstIds The paramInstIds field shall contain the object instance identifiers of the ParameterIdentity objects to be updated. +The supplied object instance identifiers shall match existing identity objects, an UNKNOWN error shall be raised if this is not the case. +If the paramInstIds list contains either NULL or '0' an INVALID error shall be raised. + * @param paramDefDetails The paramDefDetails field shall contain the replacement ParameterDefinitionDetails. +The two lists shall be ordered the same. +The number of entries in the two lists shall be the same size otherwise an INVALID error shall be returned. +If the supplied reportInterval value is not supported by the provider then an INVALID error shall be returned. +If an error is raised then no definitions shall be updated as a result of this operation call. +The provider shall create a new ParameterDefinition object and store it in the COM archive. +The new ParameterDefinition object shall be the current ParameterDefinition used for the specific ParameterIdentity. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncUpdateDefinition(org.ccsds.moims.mo.mal.structures.LongList paramInstIds, + org.ccsds.moims.mo.mc.parameter.structures.ParameterDefinitionDetailsList paramDefDetails, + org.ccsds.moims.mo.mc.parameter.consumer.ParameterAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncRequest(org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo.UPDATEDEFINITION_OP, adapter, paramInstIds, paramDefDetails); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueUpdateDefinition(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mc.parameter.consumer.ParameterAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo.UPDATEDEFINITION_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The removeParameter operation allows a consumer to remove one or more parameters + * from the list of parameters supported by the parameter provider. + * The operation does not remove the ParameterIdentity or ParameterDefinition + * objects from the COM archive, merely removes the objects from the provider. + * This permits existing parameter values to continue to reference the correct + * ParameterIdentity and ParameterDefinition objects in the COM archive. + * + * @param paramInstIds The paramInstIds field shall hold the object instance identifiers of the ParameterIdentity objects to be removed from the provider. +The list may contain the wildcard value of '0'. +The wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made. +If a provided ParameterIdentity object instance identifier does not include a wildcard and does not match an existing parameter identity object then this operation shall fail with an UNKNOWN error. +Matched ParameterIdentity and ParameterDefinition objects shall not be removed from the COM archive only the list of ParameterIdentity and ParameterDefinition objects from the provider. +If an error is raised then no parameters shall be removed as a result of this operation call. +If the operation succeeds then the provider shall not publish parameter values for the deleted ParameterIdentity objects anymore. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void removeParameter(org.ccsds.moims.mo.mal.structures.LongList paramInstIds) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.submit(org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo.REMOVEPARAMETER_OP, paramInstIds); + } + + /** + * Asynchronous version of method removeParameter. + * + * @param paramInstIds The paramInstIds field shall hold the object instance identifiers of the ParameterIdentity objects to be removed from the provider. +The list may contain the wildcard value of '0'. +The wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made. +If a provided ParameterIdentity object instance identifier does not include a wildcard and does not match an existing parameter identity object then this operation shall fail with an UNKNOWN error. +Matched ParameterIdentity and ParameterDefinition objects shall not be removed from the COM archive only the list of ParameterIdentity and ParameterDefinition objects from the provider. +If an error is raised then no parameters shall be removed as a result of this operation call. +If the operation succeeds then the provider shall not publish parameter values for the deleted ParameterIdentity objects anymore. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncRemoveParameter(org.ccsds.moims.mo.mal.structures.LongList paramInstIds, + org.ccsds.moims.mo.mc.parameter.consumer.ParameterAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncSubmit(org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo.REMOVEPARAMETER_OP, adapter, paramInstIds); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueRemoveParameter(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mc.parameter.consumer.ParameterAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo.REMOVEPARAMETER_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/consumer/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/consumer/package-info.java new file mode 100644 index 00000000..14095fbf --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/consumer/package-info.java @@ -0,0 +1,4 @@ +/** + * Package containing the consumer stubs for the Parameter service. +*/ +package org.ccsds.moims.mo.mc.parameter.consumer; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/package-info.java new file mode 100644 index 00000000..6b14b9f7 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/package-info.java @@ -0,0 +1,19 @@ +/** + * The parameter service allows the user to subscribe to parameter value report + * and optionally be able to set new values. A single PUBSUB operation is + * provided for monitoring and publishing of parameter values. + * A parameter value also contains a calculation of the validity of the parameter, + * the flow chart for this calculation is provided in Figure 3-3: + * validity calculation flow chart + * + * This standard supports the concept of non-standard invalidity states but + * the meaning and calculation of these is outside the scope of this standard. + * The generation of value reports can be controlled using the enableGeneration + * operation, which supports the use of groups. Groups must reference parameter + * identities or groups of parameter identities only. + * The parameter service does not include any value checking, this is delegated + * to the check service. + * Parameter definitions are maintained using the operations defined in this + * service but storage of definitions is delegated to the COM archive. +*/ +package org.ccsds.moims.mo.mc.parameter; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/provider/MonitorValuePublisher.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/provider/MonitorValuePublisher.java new file mode 100644 index 00000000..ea2b670d --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/provider/MonitorValuePublisher.java @@ -0,0 +1,123 @@ +package org.ccsds.moims.mo.mc.parameter.provider; + +/** + * Publisher class for the monitorValue operation. + */ +public final class MonitorValuePublisher { + + /** + * The publisherSet field. + */ + private org.ccsds.moims.mo.mal.provider.MALPublisherSet publisherSet; + + /** + * Creates an instance of this class using the supplied publisher set. + * + * @param publisherSet The set of broker connections to use when registering and publishing. + */ + public MonitorValuePublisher(org.ccsds.moims.mo.mal.provider.MALPublisherSet publisherSet) { + this.publisherSet = publisherSet; + } + + /** + * Registers this provider implementation to the set of broker connections. + * + * @param keyNames The key names to use in the method + * @param keyTypes The key types to use in the method + * @param listener The listener object to use for callback from the publisher + * @throws java.lang.IllegalArgumentException If any supplied argument is invalid + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void register(org.ccsds.moims.mo.mal.structures.IdentifierList keyNames, + org.ccsds.moims.mo.mal.structures.AttributeTypeList keyTypes, + org.ccsds.moims.mo.mal.provider.MALPublishInteractionListener listener) throws java.lang.IllegalArgumentException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + publisherSet.register(keyNames, keyTypes, listener); + } + + /** + * Registers this provider implementation to the set of broker connections + * with the default subscription keys. + * + * @param listener The listener object to use for callback from the publisher + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void registerWithDefaultKeys(org.ccsds.moims.mo.mal.provider.MALPublishInteractionListener listener) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + org.ccsds.moims.mo.mal.structures.IdentifierList keyNames = new org.ccsds.moims.mo.mal.structures.IdentifierList(); + org.ccsds.moims.mo.mal.structures.AttributeTypeList keyTypes = new org.ccsds.moims.mo.mal.structures.AttributeTypeList(); + publisherSet.register(keyNames, keyTypes, listener); + } + + /** + * Asynchronously registers this provider implementation to the set of broker + * connections. + * + * @param keyNames The key names to use in the method + * @param keyTypes The key types to use in the method + * @param listener The listener object to use for callback from the publisher + * @throws java.lang.IllegalArgumentException If any supplied argument is invalid + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void asyncRegister(org.ccsds.moims.mo.mal.structures.IdentifierList keyNames, + org.ccsds.moims.mo.mal.structures.AttributeTypeList keyTypes, + org.ccsds.moims.mo.mal.provider.MALPublishInteractionListener listener) throws java.lang.IllegalArgumentException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + publisherSet.asyncRegister(keyNames, keyTypes, listener); + } + + /** + * Publishes updates to the set of registered broker connections. + * + * @param updateHeader The headers of the updates being added + * @param objId The MAL EntityKey.firstSubKey shall contain the parameter name. +The MAL EntityKey.secondSubKey shall contain the ParameterIdentity object instance identifier. +The MAL EntityKey.thirdSubKey shall contain the ParameterDefinition object instance identifier. +The MAL EntityKey.fourthSubKey shall contain the new ParameterValueInstance object instance identifier. +The timestamp of the ParameterValueInstance report shall be taken from the publish message and shall be the time of the parameter value update. +The publish message shall include the ObjectId of the source link of the report. +If no source link is needed then the ObjectId shall be replaced with a NULL. + * @param newValue The second part of the publish message shall be the ParameterValueInstance object value. + * @throws java.lang.IllegalArgumentException If any supplied argument is invalid + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void publish(org.ccsds.moims.mo.mal.structures.UpdateHeader updateHeader, + org.ccsds.moims.mo.com.structures.ObjectId objId, + org.ccsds.moims.mo.mc.parameter.structures.ParameterValue newValue) throws java.lang.IllegalArgumentException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + publisherSet.publish(updateHeader, objId, newValue); + } + + /** + * Deregisters this provider implementation from the set of broker connections. + * + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void deregister() throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + publisherSet.deregister(); + } + + /** + * Asynchronously deregisters this provider implementation from the set of + * broker connections. + * + * @param listener The listener object to use for callback from the publisher + * @throws java.lang.IllegalArgumentException If any supplied argument is invalid + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void asyncDeregister(org.ccsds.moims.mo.mal.provider.MALPublishInteractionListener listener) throws java.lang.IllegalArgumentException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + publisherSet.asyncDeregister(listener); + } + + /** + * Closes this publisher. + * + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void close() throws org.ccsds.moims.mo.mal.MALException { + publisherSet.close(); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/provider/ParameterHandler.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/provider/ParameterHandler.java new file mode 100644 index 00000000..34dd907a --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/provider/ParameterHandler.java @@ -0,0 +1,152 @@ +package org.ccsds.moims.mo.mc.parameter.provider; + +/** + * Interface that providers of the Parameter service must implement to handle + * the operations of that service. + */ +public interface ParameterHandler { + + /** + * Implements the operation getValue. + * + * @param paramInstIds The paramInstIds field shall provide the list of ParameterIdentity object instance identifiers. +The wildcard value of '0' shall be supported and matches all parameters of the provider. +The wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made. +If a requested parameter is unknown then an UNKNOWN error shall be returned. +If a parameter is being reported periodically, using the operation shall not reset the reportInterval timer. + * @param interaction The MAL object representing the interaction in the provider. + * @return The return value of the operation + * @throws org.ccsds.moims.mo.mal.UnknownException One or more of the requested parameters is unknown. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + org.ccsds.moims.mo.mc.parameter.structures.ParameterValueDetailsList getValue(org.ccsds.moims.mo.mal.structures.LongList paramInstIds, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mal.UnknownException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation setValue. + * + * @param newRawValues The submitted newRawValues shall hold a list of ParameterRawValues that contain the ParameterIdentity object instance identifier and the respective raw value to be set. +If the paramInstId field contains the wildcard value of '0' then an INVALID error shall be returned. +If a requested ParameterIdentity is unknown then an UNKNOWN error shall be returned. +If a request ParameterIdentity is not settable due to it being read only then a READONLY error shall be returned. +The rawValue shall contain the new parameter raw value to be set. +If the supplied new parameter raw value does not match the defined type for the ParameterIdentity then an INVALID error shall be returned. +If an error is raised then no modifications shall be made as a result of this operation call. +The parameter values shall be set concurrently, by this it is meant that all values are set at the same time without interleaving of other values being (ATOMIC behaviour). How this is implemented is an implementation detail. +The service provider shall create new ParameterValueInstance objects for the updated parameter values, store these in the COM Archive, and publish these new values. + * @param interaction The MAL object representing the interaction in the provider. + * @throws org.ccsds.moims.mo.mal.UnknownException One or more of the referenced parameters is unknown. + * @throws org.ccsds.moims.mo.mc.ReadonlyException One or more of the parameters being set is read only. + * @throws org.ccsds.moims.mo.com.InvalidException One of the supplied parameter values contains an invalid value. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + void setValue(org.ccsds.moims.mo.mc.parameter.structures.ParameterRawValueList newRawValues, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mal.UnknownException, org.ccsds.moims.mo.mc.ReadonlyException, org.ccsds.moims.mo.com.InvalidException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation enableGeneration. + * + * @param isGroupIds If the isGroupIds field is TRUE then the enableInstances field shall contain GroupIdentity object instance identifiers, otherwise the field contains ParameterIdentity object instance identifiers. +The ParameterIdentity objects referenced, either directly or indirectly via groups, by the enableInstances field shall be the ParameterIdentity objects to match. +The id of the enableInstances field shall support the wildcard value of '0' and matches all ParameterIdentity objects of the provider. +The service provider shall check for the wildcard value in the list of object instance identifiers in the enableInstances field first and if found no other checks of supplied object instance identifiers shall be made. +If the enableInstances field contains a value of TRUE then reports for matching ParameterIdentity objects shall be generated, a value of FALSE requests that reports will not be generated. +No error shall be raised if the enableInstances Boolean value supplied is the same as the current generationEnabled field of the definition for a matched ParameterIdentity object i.e. enabling an already enabled parameter will not result in an error. +If a requested ParameterIdentity or GroupIdentity object is unknown then an UNKNOWN error shall be returned. +If a requested Group, or the Group objects referenced by that Group, does not contain ParameterIdentity objects then an INVALID error shall be returned. +If an error is raised then no modifications shall be made as a result of this operation call. +The provider shall create and store a new ParameterDefinition object in the COM archive if the generationEnabled field is changed. +If a new ParameterDefinition object is created then that new object shall be the current ParameterDefinition used for the specific ParameterIdentity. + * @param enableInstances If the generation of reports is being enabled, and the parameter is defined as being periodic, then the provider shall generate a report immediately and start the report interval from that report. + * @param interaction The MAL object representing the interaction in the provider. + * @return The return value of the operation + * @throws org.ccsds.moims.mo.mal.UnknownException One or more of the requested parameters or groups is unknown. + * @throws org.ccsds.moims.mo.com.InvalidException One of the supplied groups is either not a group of groups or a group of ParameterIdentity objects. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + org.ccsds.moims.mo.mal.structures.LongList enableGeneration(Boolean isGroupIds, + org.ccsds.moims.mo.com.structures.InstanceBooleanPairList enableInstances, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mal.UnknownException, org.ccsds.moims.mo.com.InvalidException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation listDefinition. + * + * @param paramNames The paramNames field shall contain a list of parameter names to retrieve the ParameterIdentity and ParameterDefinition object instance identifiers for. +The paramNames field may contain the wildcard value of '*' to return all supported ParameterIdentity and ParameterDefinition objects. +The wildcard value should be checked for first, if found no other checks of supplied identifiers shall be made. +If a provided identifier does not include a wildcard and does not match an existing ParameterIdentity object then this operation shall fail with an UNKNOWN error. + * @param interaction The MAL object representing the interaction in the provider. + * @return The return value of the operation + * @throws org.ccsds.moims.mo.mal.UnknownException One of the supplied identifiers is unknown. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + org.ccsds.moims.mo.mc.structures.ObjectInstancePairList listDefinition(org.ccsds.moims.mo.mal.structures.IdentifierList paramNames, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mal.UnknownException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation addParameter. + * + * @param paramDefDetails The paramDefDetails field shall hold the name and the ParameterDefinitionDetails to be added. +The name field must not be the wildcard '*', or empty (an INVALID error shall be returned in this case). +If the supplied reportInterval value is not supported by the provider then an INVALID error shall be returned. +The supplied name must be unique among all ParameterIdentity objects for the domain of the provider otherwise a DUPLICATE error shall be raised. +If an error is raised then no new identities and definitions shall be added as a result of this operation call. +If the supplied name matches an existing, but removed, ParameterIdentity then that ParameterIdentity shall be reused otherwise a new ParameterIdentity shall be created. +The provider shall create a new ParameterDefinition object and store it, and any new ParameterIdentity objects, in the COM archive. + * @param interaction The MAL object representing the interaction in the provider. + * @return The return value of the operation + * @throws org.ccsds.moims.mo.com.InvalidException One of the supplied ParameterIdentity objects contains an invalid name or a supplied interval is not supported by the provider. + * @throws org.ccsds.moims.mo.com.DuplicateException One or more of the ParameterIdentity objects being added has supplied a parameter name that is already in use in the domain. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + org.ccsds.moims.mo.mc.structures.ObjectInstancePairList addParameter(org.ccsds.moims.mo.mc.parameter.structures.ParameterCreationRequestList paramDefDetails, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.com.InvalidException, org.ccsds.moims.mo.com.DuplicateException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation updateDefinition. + * + * @param paramInstIds The paramInstIds field shall contain the object instance identifiers of the ParameterIdentity objects to be updated. +The supplied object instance identifiers shall match existing identity objects, an UNKNOWN error shall be raised if this is not the case. +If the paramInstIds list contains either NULL or '0' an INVALID error shall be raised. + * @param paramDefDetails The paramDefDetails field shall contain the replacement ParameterDefinitionDetails. +The two lists shall be ordered the same. +The number of entries in the two lists shall be the same size otherwise an INVALID error shall be returned. +If the supplied reportInterval value is not supported by the provider then an INVALID error shall be returned. +If an error is raised then no definitions shall be updated as a result of this operation call. +The provider shall create a new ParameterDefinition object and store it in the COM archive. +The new ParameterDefinition object shall be the current ParameterDefinition used for the specific ParameterIdentity. + * @param interaction The MAL object representing the interaction in the provider. + * @return The return value of the operation + * @throws org.ccsds.moims.mo.com.InvalidException The supplied object instance identifiers list contains either a NULL or '0' or the two supplied lists are not the same length or a supplied interval is not supported by the provider. +If the two lists are not the same length then the extra information field shall contain the first index of the element in the largest list which does not have corresponding element in the other list. + * @throws org.ccsds.moims.mo.mal.UnknownException One of the supplied ParameterIdentity object instance identifiers is unknown. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + org.ccsds.moims.mo.mal.structures.LongList updateDefinition(org.ccsds.moims.mo.mal.structures.LongList paramInstIds, + org.ccsds.moims.mo.mc.parameter.structures.ParameterDefinitionDetailsList paramDefDetails, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.com.InvalidException, org.ccsds.moims.mo.mal.UnknownException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation removeParameter. + * + * @param paramInstIds The paramInstIds field shall hold the object instance identifiers of the ParameterIdentity objects to be removed from the provider. +The list may contain the wildcard value of '0'. +The wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made. +If a provided ParameterIdentity object instance identifier does not include a wildcard and does not match an existing parameter identity object then this operation shall fail with an UNKNOWN error. +Matched ParameterIdentity and ParameterDefinition objects shall not be removed from the COM archive only the list of ParameterIdentity and ParameterDefinition objects from the provider. +If an error is raised then no parameters shall be removed as a result of this operation call. +If the operation succeeds then the provider shall not publish parameter values for the deleted ParameterIdentity objects anymore. + * @param interaction The MAL object representing the interaction in the provider. + * @throws org.ccsds.moims.mo.mal.UnknownException One of the supplied ParameterIdentity object instance identifiers is unknown. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + void removeParameter(org.ccsds.moims.mo.mal.structures.LongList paramInstIds, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mal.UnknownException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Sets the skeleton to be used for creation of publishers. + * + * @param skeleton The skeleton to be used. + */ + void setSkeleton(org.ccsds.moims.mo.mc.parameter.provider.ParameterSkeleton skeleton); +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/provider/ParameterInheritanceSkeleton.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/provider/ParameterInheritanceSkeleton.java new file mode 100644 index 00000000..4337e427 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/provider/ParameterInheritanceSkeleton.java @@ -0,0 +1,152 @@ +package org.ccsds.moims.mo.mc.parameter.provider; + +/** + * Provider Inheritance skeleton for ParameterInheritanceSkeleton service. + */ +public abstract class ParameterInheritanceSkeleton implements org.ccsds.moims.mo.mal.provider.MALInteractionHandler, org.ccsds.moims.mo.mc.parameter.provider.ParameterSkeleton, org.ccsds.moims.mo.mc.parameter.provider.ParameterHandler { + + /** + * The providerSet field. + */ + private org.ccsds.moims.mo.mal.provider.MALProviderSet providerSet = new org.ccsds.moims.mo.mal.provider.MALProviderSet(org.ccsds.moims.mo.mc.parameter.ParameterHelper.PARAMETER_SERVICE); + + /** + * Returns the connection object for this provider. + * + * @return the connection object for this provider + * @throws java.io.IOException if the method was not implemented yet. + */ + public org.ccsds.moims.mo.mal.helpertools.connections.ConnectionProvider getConnection() throws java.io.IOException { + throw new java.io.IOException("This method needs to be overridden!"); + } + + @Override + public void setSkeleton(org.ccsds.moims.mo.mc.parameter.provider.ParameterSkeleton skeleton) { + // Not used in the inheritance pattern (the skeleton is 'this'); + } + + @Override + public void malInitialize(org.ccsds.moims.mo.mal.provider.MALProvider provider) throws org.ccsds.moims.mo.mal.MALException { + providerSet.addProvider(provider); + } + + @Override + public void malFinalize(org.ccsds.moims.mo.mal.provider.MALProvider provider) throws org.ccsds.moims.mo.mal.MALException { + providerSet.removeProvider(provider); + } + + @Override + public org.ccsds.moims.mo.mc.parameter.provider.MonitorValuePublisher createMonitorValuePublisher(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.Identifier networkZone, + org.ccsds.moims.mo.mal.structures.SessionType sessionType, + org.ccsds.moims.mo.mal.structures.Identifier sessionName, + org.ccsds.moims.mo.mal.structures.QoSLevel qos, + java.util.Map qosProps, + org.ccsds.moims.mo.mal.structures.UInteger priority) throws org.ccsds.moims.mo.mal.MALException { + return new org.ccsds.moims.mo.mc.parameter.provider.MonitorValuePublisher(providerSet.createPublisherSet(org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo.MONITORVALUE_OP, domain, sessionType, sessionName, qos, qosProps, null)); + } + + @Override + public void handleSend(org.ccsds.moims.mo.mal.provider.MALInteraction interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + switch (opNumber) { + default: + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } + + @Override + public void handleSubmit(org.ccsds.moims.mo.mal.provider.MALSubmit interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + try { + switch (opNumber) { + case org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo._SETVALUE_OP_NUMBER: + setValue((org.ccsds.moims.mo.mc.parameter.structures.ParameterRawValueList) body.getBodyElement(0, new org.ccsds.moims.mo.mc.parameter.structures.ParameterRawValueList()), + interaction); + interaction.sendAcknowledgement(); + break; + case org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo._REMOVEPARAMETER_OP_NUMBER: + removeParameter((org.ccsds.moims.mo.mal.structures.LongList) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.LongList()), + interaction); + interaction.sendAcknowledgement(); + break; + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } catch (org.ccsds.moims.mo.mal.MOErrorException error) { + throw new org.ccsds.moims.mo.mal.MALInteractionException(error); + } + } + + @Override + public void handleRequest(org.ccsds.moims.mo.mal.provider.MALRequest interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + try { + switch (opNumber) { + case org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo._GETVALUE_OP_NUMBER: + interaction.sendResponse(getValue((org.ccsds.moims.mo.mal.structures.LongList) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.LongList()), + interaction)); + break; + case org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo._ENABLEGENERATION_OP_NUMBER: + interaction.sendResponse(enableGeneration((body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.Union(Boolean.FALSE)) == null) ? null : ((org.ccsds.moims.mo.mal.structures.Union) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.Union(Boolean.FALSE))).getBooleanValue(), + (org.ccsds.moims.mo.com.structures.InstanceBooleanPairList) body.getBodyElement(1, new org.ccsds.moims.mo.com.structures.InstanceBooleanPairList()), + interaction)); + break; + case org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo._LISTDEFINITION_OP_NUMBER: + interaction.sendResponse(listDefinition((org.ccsds.moims.mo.mal.structures.IdentifierList) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.IdentifierList()), + interaction)); + break; + case org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo._ADDPARAMETER_OP_NUMBER: + interaction.sendResponse(addParameter((org.ccsds.moims.mo.mc.parameter.structures.ParameterCreationRequestList) body.getBodyElement(0, new org.ccsds.moims.mo.mc.parameter.structures.ParameterCreationRequestList()), + interaction)); + break; + case org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo._UPDATEDEFINITION_OP_NUMBER: + interaction.sendResponse(updateDefinition((org.ccsds.moims.mo.mal.structures.LongList) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.LongList()), + (org.ccsds.moims.mo.mc.parameter.structures.ParameterDefinitionDetailsList) body.getBodyElement(1, new org.ccsds.moims.mo.mc.parameter.structures.ParameterDefinitionDetailsList()), + interaction)); + break; + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } catch (org.ccsds.moims.mo.mal.MOErrorException error) { + throw new org.ccsds.moims.mo.mal.MALInteractionException(error); + } + } + + @Override + public void handleInvoke(org.ccsds.moims.mo.mal.provider.MALInvoke interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + switch (opNumber) { + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } + + @Override + public void handleProgress(org.ccsds.moims.mo.mal.provider.MALProgress interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + switch (opNumber) { + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/provider/ParameterSkeleton.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/provider/ParameterSkeleton.java new file mode 100644 index 00000000..e4139d18 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/provider/ParameterSkeleton.java @@ -0,0 +1,29 @@ +package org.ccsds.moims.mo.mc.parameter.provider; + +/** + * The skeleton interface for the Parameter service. + */ +public interface ParameterSkeleton { + + /** + * Creates a publisher object using the current registered provider set for + * the PubSub operation monitorValue. + * + * @param domain The domain used for publishing + * @param networkZone ~The network zone used for publishing + * @param sessionType The session used for publishing + * @param sessionName The session name used for publishing + * @param qos The QoS used for publishing + * @param qosProps The QoS properties used for publishing + * @param priority The priority used for publishing + * @return The new publisher object. + * @throws org.ccsds.moims.mo.mal.MALException if a problem is detected during creation of the publisher + */ + org.ccsds.moims.mo.mc.parameter.provider.MonitorValuePublisher createMonitorValuePublisher(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.Identifier networkZone, + org.ccsds.moims.mo.mal.structures.SessionType sessionType, + org.ccsds.moims.mo.mal.structures.Identifier sessionName, + org.ccsds.moims.mo.mal.structures.QoSLevel qos, + java.util.Map qosProps, + org.ccsds.moims.mo.mal.structures.UInteger priority) throws org.ccsds.moims.mo.mal.MALException; +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/provider/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/provider/package-info.java new file mode 100644 index 00000000..ba9d6be0 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/provider/package-info.java @@ -0,0 +1,4 @@ +/** + * Package containing the provider skeletons for the Parameter service. +*/ +package org.ccsds.moims.mo.mc.parameter.provider; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/structures/ParameterConversion.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/structures/ParameterConversion.java new file mode 100644 index 00000000..6cfbf5d3 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/structures/ParameterConversion.java @@ -0,0 +1,185 @@ +package org.ccsds.moims.mo.mc.parameter.structures; + +/** + * The ParameterConversion structure holds information about the conversions + * to be applied to a parameter. + */ +public final class ParameterConversion implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1125908513554435L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125908513554435L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Holds the attribute short form part of the converted type of the parameter, + * e.g., for a MAL::String parameter it shall hold 15. + */ + private Byte convertedType; + + /** + * The converted parameter unit. If NULL then converted type has no unit. + */ + private String convertedUnit; + + /** + * The conversions to be applied. Only the first TRUE conversion should be + * applied. + */ + private org.ccsds.moims.mo.mc.structures.ConditionalConversionList conditionalConversions; + + /** + * Default constructor for ParameterConversion. + * + */ + public ParameterConversion() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param convertedType Holds the attribute short form part of the converted type of the parameter, e.g., for a MAL::String parameter it shall hold 15. + * @param convertedUnit The converted parameter unit. If NULL then converted type has no unit. + * @param conditionalConversions The conversions to be applied. Only the first TRUE conversion should be applied. + */ + public ParameterConversion(Byte convertedType, + String convertedUnit, + org.ccsds.moims.mo.mc.structures.ConditionalConversionList conditionalConversions) { + this.convertedType = convertedType; + this.convertedUnit = convertedUnit; + this.conditionalConversions = conditionalConversions; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param convertedType Holds the attribute short form part of the converted type of the parameter, e.g., for a MAL::String parameter it shall hold 15. + * @param conditionalConversions The conversions to be applied. Only the first TRUE conversion should be applied. + */ + public ParameterConversion(Byte convertedType, + org.ccsds.moims.mo.mc.structures.ConditionalConversionList conditionalConversions) { + this.convertedType = convertedType; + this.convertedUnit = null; + this.conditionalConversions = conditionalConversions; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mc.parameter.structures.ParameterConversion(); + } + + /** + * Returns the field convertedType. + * + * @return The field convertedType + */ + public Byte getConvertedType() { + return convertedType; + } + + /** + * Returns the field convertedUnit. + * + * @return The field convertedUnit + */ + public String getConvertedUnit() { + return convertedUnit; + } + + /** + * Returns the field conditionalConversions. + * + * @return The field conditionalConversions + */ + public org.ccsds.moims.mo.mc.structures.ConditionalConversionList getConditionalConversions() { + return conditionalConversions; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ParameterConversion) { + ParameterConversion other = (ParameterConversion) obj; + if (convertedType == null) { + if (other.convertedType != null) { + return false; + } + } else { + if (! convertedType.equals(other.convertedType)) { + return false; + } + } + if (convertedUnit == null) { + if (other.convertedUnit != null) { + return false; + } + } else { + if (! convertedUnit.equals(other.convertedUnit)) { + return false; + } + } + if (conditionalConversions == null) { + if (other.conditionalConversions != null) { + return false; + } + } else { + if (! conditionalConversions.equals(other.conditionalConversions)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (convertedType != null ? convertedType.hashCode() : 0); + hash = 83 * hash + (convertedUnit != null ? convertedUnit.hashCode() : 0); + hash = 83 * hash + (conditionalConversions != null ? conditionalConversions.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(ParameterConversion: "); + buf.append("convertedType=").append(convertedType); + buf.append(", convertedUnit=").append(convertedUnit); + buf.append(", conditionalConversions=").append(conditionalConversions); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (convertedType == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'convertedType' cannot be null!"); + } + if (conditionalConversions == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'conditionalConversions' cannot be null!"); + } + encoder.encodeOctet(convertedType); + encoder.encodeNullableString(convertedUnit); + encoder.encodeElement(conditionalConversions); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + convertedType = decoder.decodeOctet(); + convertedUnit = decoder.decodeNullableString(); + conditionalConversions = (org.ccsds.moims.mo.mc.structures.ConditionalConversionList) decoder.decodeElement(new org.ccsds.moims.mo.mc.structures.ConditionalConversionList()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/structures/ParameterConversionList.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/structures/ParameterConversionList.java new file mode 100644 index 00000000..23d0a973 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/structures/ParameterConversionList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mc.parameter.structures; + +/** + * List class for ParameterConversion. + */ +public final class ParameterConversionList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1125908530331645L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125908530331645L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for ParameterConversionList. + * + */ + public ParameterConversionList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public ParameterConversionList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public ParameterConversionList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mc.parameter.structures.ParameterConversion element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mc.parameter.structures.ParameterConversion element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new ParameterConversionList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mc.parameter.structures.ParameterConversion(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/structures/ParameterCreationRequest.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/structures/ParameterCreationRequest.java new file mode 100644 index 00000000..ebf45e79 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/structures/ParameterCreationRequest.java @@ -0,0 +1,140 @@ +package org.ccsds.moims.mo.mc.parameter.structures; + +/** + * The ParameterCreationRequest contains all the fields required when creating + * a new parameter in a provider. + */ +public final class ParameterCreationRequest implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1125908513554437L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125908513554437L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * The name of the parameter. Must not be empty or the wildcard value. + */ + private org.ccsds.moims.mo.mal.structures.Identifier name; + + /** + * The parameter definition details. + */ + private org.ccsds.moims.mo.mc.parameter.structures.ParameterDefinitionDetails paramDefDetails; + + /** + * Default constructor for ParameterCreationRequest. + * + */ + public ParameterCreationRequest() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param name The name of the parameter. Must not be empty or the wildcard value. + * @param paramDefDetails The parameter definition details. + */ + public ParameterCreationRequest(org.ccsds.moims.mo.mal.structures.Identifier name, + org.ccsds.moims.mo.mc.parameter.structures.ParameterDefinitionDetails paramDefDetails) { + this.name = name; + this.paramDefDetails = paramDefDetails; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mc.parameter.structures.ParameterCreationRequest(); + } + + /** + * Returns the field name. + * + * @return The field name + */ + public org.ccsds.moims.mo.mal.structures.Identifier getName() { + return name; + } + + /** + * Returns the field paramDefDetails. + * + * @return The field paramDefDetails + */ + public org.ccsds.moims.mo.mc.parameter.structures.ParameterDefinitionDetails getParamDefDetails() { + return paramDefDetails; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ParameterCreationRequest) { + ParameterCreationRequest other = (ParameterCreationRequest) obj; + if (name == null) { + if (other.name != null) { + return false; + } + } else { + if (! name.equals(other.name)) { + return false; + } + } + if (paramDefDetails == null) { + if (other.paramDefDetails != null) { + return false; + } + } else { + if (! paramDefDetails.equals(other.paramDefDetails)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (name != null ? name.hashCode() : 0); + hash = 83 * hash + (paramDefDetails != null ? paramDefDetails.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(ParameterCreationRequest: "); + buf.append("name=").append(name); + buf.append(", paramDefDetails=").append(paramDefDetails); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (name == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'name' cannot be null!"); + } + if (paramDefDetails == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'paramDefDetails' cannot be null!"); + } + encoder.encodeIdentifier(name); + encoder.encodeElement(paramDefDetails); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + name = decoder.decodeIdentifier(); + paramDefDetails = (org.ccsds.moims.mo.mc.parameter.structures.ParameterDefinitionDetails) decoder.decodeElement(new org.ccsds.moims.mo.mc.parameter.structures.ParameterDefinitionDetails()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/structures/ParameterCreationRequestList.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/structures/ParameterCreationRequestList.java new file mode 100644 index 00000000..f26c3196 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/structures/ParameterCreationRequestList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mc.parameter.structures; + +/** + * List class for ParameterCreationRequest. + */ +public final class ParameterCreationRequestList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1125908530331643L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125908530331643L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for ParameterCreationRequestList. + * + */ + public ParameterCreationRequestList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public ParameterCreationRequestList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public ParameterCreationRequestList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mc.parameter.structures.ParameterCreationRequest element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mc.parameter.structures.ParameterCreationRequest element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new ParameterCreationRequestList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mc.parameter.structures.ParameterCreationRequest(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/structures/ParameterDefinitionDetails.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/structures/ParameterDefinitionDetails.java new file mode 100644 index 00000000..e8e75262 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/structures/ParameterDefinitionDetails.java @@ -0,0 +1,323 @@ +package org.ccsds.moims.mo.mc.parameter.structures; + +/** + * The ParameterDefinitionDetails structure holds a parameter definition. + * The conversion field defines the conditions where the relevant conversion + * is applied. For onboard parameters, the report interval should be a multiple + * of the minimum sampling interval of that parameter. + */ +public final class ParameterDefinitionDetails implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1125908513554433L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125908513554433L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * The description of the parameter. May be empty. + */ + private String description; + + /** + * Holds the attribute short form part of the raw type of the parameter, e.g., + * for a MAL::String parameter it shall hold 15. + */ + private Byte rawType; + + /** + * The unit for the raw value. If NULL then raw type has no unit. + */ + private String rawUnit; + + /** + * Controls whether reports for this parameter are to be generated. + */ + private Boolean generationEnabled; + + /** + * Periodic report interval. No periodic reports to be generated if this is + * set to "0". + */ + private org.ccsds.moims.mo.mal.structures.Duration reportInterval; + + /** + * Expression that determines this parameter"s validity state. Can be + * NULL if no validity check is required or validity is calculated by implementation-specific + * mechanisms. + */ + private org.ccsds.moims.mo.mc.structures.ParameterExpression validityExpression; + + /** + * If present then parameter has a converted type. + */ + private org.ccsds.moims.mo.mc.parameter.structures.ParameterConversion conversion; + + /** + * Default constructor for ParameterDefinitionDetails. + * + */ + public ParameterDefinitionDetails() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param description The description of the parameter. May be empty. + * @param rawType Holds the attribute short form part of the raw type of the parameter, e.g., for a MAL::String parameter it shall hold 15. + * @param rawUnit The unit for the raw value. If NULL then raw type has no unit. + * @param generationEnabled Controls whether reports for this parameter are to be generated. + * @param reportInterval Periodic report interval. No periodic reports to be generated if this is set to '0'. + * @param validityExpression Expression that determines this parameter's validity state. Can be NULL if no validity check is required or validity is calculated by implementation-specific mechanisms. + * @param conversion If present then parameter has a converted type. + */ + public ParameterDefinitionDetails(String description, + Byte rawType, + String rawUnit, + Boolean generationEnabled, + org.ccsds.moims.mo.mal.structures.Duration reportInterval, + org.ccsds.moims.mo.mc.structures.ParameterExpression validityExpression, + org.ccsds.moims.mo.mc.parameter.structures.ParameterConversion conversion) { + this.description = description; + this.rawType = rawType; + this.rawUnit = rawUnit; + this.generationEnabled = generationEnabled; + this.reportInterval = reportInterval; + this.validityExpression = validityExpression; + this.conversion = conversion; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param description The description of the parameter. May be empty. + * @param rawType Holds the attribute short form part of the raw type of the parameter, e.g., for a MAL::String parameter it shall hold 15. + * @param generationEnabled Controls whether reports for this parameter are to be generated. + * @param reportInterval Periodic report interval. No periodic reports to be generated if this is set to '0'. + */ + public ParameterDefinitionDetails(String description, + Byte rawType, + Boolean generationEnabled, + org.ccsds.moims.mo.mal.structures.Duration reportInterval) { + this.description = description; + this.rawType = rawType; + this.rawUnit = null; + this.generationEnabled = generationEnabled; + this.reportInterval = reportInterval; + this.validityExpression = null; + this.conversion = null; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mc.parameter.structures.ParameterDefinitionDetails(); + } + + /** + * Returns the field description. + * + * @return The field description + */ + public String getDescription() { + return description; + } + + /** + * Returns the field rawType. + * + * @return The field rawType + */ + public Byte getRawType() { + return rawType; + } + + /** + * Returns the field rawUnit. + * + * @return The field rawUnit + */ + public String getRawUnit() { + return rawUnit; + } + + /** + * Returns the field generationEnabled. + * + * @return The field generationEnabled + */ + public Boolean getGenerationEnabled() { + return generationEnabled; + } + + /** + * Returns the field reportInterval. + * + * @return The field reportInterval + */ + public org.ccsds.moims.mo.mal.structures.Duration getReportInterval() { + return reportInterval; + } + + /** + * Returns the field validityExpression. + * + * @return The field validityExpression + */ + public org.ccsds.moims.mo.mc.structures.ParameterExpression getValidityExpression() { + return validityExpression; + } + + /** + * Returns the field conversion. + * + * @return The field conversion + */ + public org.ccsds.moims.mo.mc.parameter.structures.ParameterConversion getConversion() { + return conversion; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ParameterDefinitionDetails) { + ParameterDefinitionDetails other = (ParameterDefinitionDetails) obj; + if (description == null) { + if (other.description != null) { + return false; + } + } else { + if (! description.equals(other.description)) { + return false; + } + } + if (rawType == null) { + if (other.rawType != null) { + return false; + } + } else { + if (! rawType.equals(other.rawType)) { + return false; + } + } + if (rawUnit == null) { + if (other.rawUnit != null) { + return false; + } + } else { + if (! rawUnit.equals(other.rawUnit)) { + return false; + } + } + if (generationEnabled == null) { + if (other.generationEnabled != null) { + return false; + } + } else { + if (! generationEnabled.equals(other.generationEnabled)) { + return false; + } + } + if (reportInterval == null) { + if (other.reportInterval != null) { + return false; + } + } else { + if (! reportInterval.equals(other.reportInterval)) { + return false; + } + } + if (validityExpression == null) { + if (other.validityExpression != null) { + return false; + } + } else { + if (! validityExpression.equals(other.validityExpression)) { + return false; + } + } + if (conversion == null) { + if (other.conversion != null) { + return false; + } + } else { + if (! conversion.equals(other.conversion)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (description != null ? description.hashCode() : 0); + hash = 83 * hash + (rawType != null ? rawType.hashCode() : 0); + hash = 83 * hash + (rawUnit != null ? rawUnit.hashCode() : 0); + hash = 83 * hash + (generationEnabled != null ? generationEnabled.hashCode() : 0); + hash = 83 * hash + (reportInterval != null ? reportInterval.hashCode() : 0); + hash = 83 * hash + (validityExpression != null ? validityExpression.hashCode() : 0); + hash = 83 * hash + (conversion != null ? conversion.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(ParameterDefinitionDetails: "); + buf.append("description=").append(description); + buf.append(", rawType=").append(rawType); + buf.append(", rawUnit=").append(rawUnit); + buf.append(", generationEnabled=").append(generationEnabled); + buf.append(", reportInterval=").append(reportInterval); + buf.append(", validityExpression=").append(validityExpression); + buf.append(", conversion=").append(conversion); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (description == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'description' cannot be null!"); + } + if (rawType == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'rawType' cannot be null!"); + } + if (generationEnabled == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'generationEnabled' cannot be null!"); + } + if (reportInterval == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'reportInterval' cannot be null!"); + } + encoder.encodeString(description); + encoder.encodeOctet(rawType); + encoder.encodeNullableString(rawUnit); + encoder.encodeBoolean(generationEnabled); + encoder.encodeDuration(reportInterval); + encoder.encodeNullableElement(validityExpression); + encoder.encodeNullableElement(conversion); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + description = decoder.decodeString(); + rawType = decoder.decodeOctet(); + rawUnit = decoder.decodeNullableString(); + generationEnabled = decoder.decodeBoolean(); + reportInterval = decoder.decodeDuration(); + validityExpression = (org.ccsds.moims.mo.mc.structures.ParameterExpression) decoder.decodeNullableElement(new org.ccsds.moims.mo.mc.structures.ParameterExpression()); + conversion = (org.ccsds.moims.mo.mc.parameter.structures.ParameterConversion) decoder.decodeNullableElement(new org.ccsds.moims.mo.mc.parameter.structures.ParameterConversion()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/structures/ParameterDefinitionDetailsList.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/structures/ParameterDefinitionDetailsList.java new file mode 100644 index 00000000..b053d1ea --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/structures/ParameterDefinitionDetailsList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mc.parameter.structures; + +/** + * List class for ParameterDefinitionDetails. + */ +public final class ParameterDefinitionDetailsList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1125908530331647L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125908530331647L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for ParameterDefinitionDetailsList. + * + */ + public ParameterDefinitionDetailsList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public ParameterDefinitionDetailsList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public ParameterDefinitionDetailsList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mc.parameter.structures.ParameterDefinitionDetails element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mc.parameter.structures.ParameterDefinitionDetails element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new ParameterDefinitionDetailsList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mc.parameter.structures.ParameterDefinitionDetails(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/structures/ParameterRawValue.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/structures/ParameterRawValue.java new file mode 100644 index 00000000..1ba393bd --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/structures/ParameterRawValue.java @@ -0,0 +1,147 @@ +package org.ccsds.moims.mo.mc.parameter.structures; + +/** + * The ParameterRawValue structure holds a new raw value for a specific parameter. + */ +public final class ParameterRawValue implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1125908513554438L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125908513554438L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * The object instance identifier of the parameter identity. + */ + private Long paramInstId; + + /** + * The parameter raw value. The value of NULL is a valid value and carries + * no special significance in the parameter service. + */ + private org.ccsds.moims.mo.mal.structures.Attribute rawValue; + + /** + * Default constructor for ParameterRawValue. + * + */ + public ParameterRawValue() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param paramInstId The object instance identifier of the parameter identity. + * @param rawValue The parameter raw value. The value of NULL is a valid value and carries no special significance in the parameter service. + */ + public ParameterRawValue(Long paramInstId, + org.ccsds.moims.mo.mal.structures.Attribute rawValue) { + this.paramInstId = paramInstId; + this.rawValue = rawValue; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param paramInstId The object instance identifier of the parameter identity. + */ + public ParameterRawValue(Long paramInstId) { + this.paramInstId = paramInstId; + this.rawValue = null; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mc.parameter.structures.ParameterRawValue(); + } + + /** + * Returns the field paramInstId. + * + * @return The field paramInstId + */ + public Long getParamInstId() { + return paramInstId; + } + + /** + * Returns the field rawValue. + * + * @return The field rawValue + */ + public org.ccsds.moims.mo.mal.structures.Attribute getRawValue() { + return rawValue; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ParameterRawValue) { + ParameterRawValue other = (ParameterRawValue) obj; + if (paramInstId == null) { + if (other.paramInstId != null) { + return false; + } + } else { + if (! paramInstId.equals(other.paramInstId)) { + return false; + } + } + if (rawValue == null) { + if (other.rawValue != null) { + return false; + } + } else { + if (! rawValue.equals(other.rawValue)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (paramInstId != null ? paramInstId.hashCode() : 0); + hash = 83 * hash + (rawValue != null ? rawValue.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(ParameterRawValue: "); + buf.append("paramInstId=").append(paramInstId); + buf.append(", rawValue=").append(rawValue); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (paramInstId == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'paramInstId' cannot be null!"); + } + encoder.encodeLong(paramInstId); + encoder.encodeNullableAttribute(rawValue); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + paramInstId = decoder.decodeLong(); + rawValue = (org.ccsds.moims.mo.mal.structures.Attribute) decoder.decodeNullableAttribute(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/structures/ParameterRawValueList.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/structures/ParameterRawValueList.java new file mode 100644 index 00000000..37be4529 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/structures/ParameterRawValueList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mc.parameter.structures; + +/** + * List class for ParameterRawValue. + */ +public final class ParameterRawValueList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1125908530331642L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125908530331642L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for ParameterRawValueList. + * + */ + public ParameterRawValueList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public ParameterRawValueList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public ParameterRawValueList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mc.parameter.structures.ParameterRawValue element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mc.parameter.structures.ParameterRawValue element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new ParameterRawValueList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mc.parameter.structures.ParameterRawValue(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/structures/ParameterValue.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/structures/ParameterValue.java new file mode 100644 index 00000000..46254f66 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/structures/ParameterValue.java @@ -0,0 +1,180 @@ +package org.ccsds.moims.mo.mc.parameter.structures; + +/** + * This structure holds a specific value of the parameter. The type of the + * value shall match that specified in the parameter definition. + */ +public final class ParameterValue implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1125908513554434L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125908513554434L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Holds the validity state for a parameter value. If the parameter is valid + * then this should be set to "0". + */ + private org.ccsds.moims.mo.mal.structures.UOctet validityState; + + /** + * The parameter raw value. The value of NULL is a valid value and carries + * no special significance in the parameter service. + */ + private org.ccsds.moims.mo.mal.structures.Attribute rawValue; + + /** + * The parameter converted value. + */ + private org.ccsds.moims.mo.mal.structures.Attribute convertedValue; + + /** + * Default constructor for ParameterValue. + * + */ + public ParameterValue() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param validityState Holds the validity state for a parameter value. If the parameter is valid then this should be set to '0'. + * @param rawValue The parameter raw value. The value of NULL is a valid value and carries no special significance in the parameter service. + * @param convertedValue The parameter converted value. + */ + public ParameterValue(org.ccsds.moims.mo.mal.structures.UOctet validityState, + org.ccsds.moims.mo.mal.structures.Attribute rawValue, + org.ccsds.moims.mo.mal.structures.Attribute convertedValue) { + this.validityState = validityState; + this.rawValue = rawValue; + this.convertedValue = convertedValue; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param validityState Holds the validity state for a parameter value. If the parameter is valid then this should be set to '0'. + */ + public ParameterValue(org.ccsds.moims.mo.mal.structures.UOctet validityState) { + this.validityState = validityState; + this.rawValue = null; + this.convertedValue = null; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mc.parameter.structures.ParameterValue(); + } + + /** + * Returns the field validityState. + * + * @return The field validityState + */ + public org.ccsds.moims.mo.mal.structures.UOctet getValidityState() { + return validityState; + } + + /** + * Returns the field rawValue. + * + * @return The field rawValue + */ + public org.ccsds.moims.mo.mal.structures.Attribute getRawValue() { + return rawValue; + } + + /** + * Returns the field convertedValue. + * + * @return The field convertedValue + */ + public org.ccsds.moims.mo.mal.structures.Attribute getConvertedValue() { + return convertedValue; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ParameterValue) { + ParameterValue other = (ParameterValue) obj; + if (validityState == null) { + if (other.validityState != null) { + return false; + } + } else { + if (! validityState.equals(other.validityState)) { + return false; + } + } + if (rawValue == null) { + if (other.rawValue != null) { + return false; + } + } else { + if (! rawValue.equals(other.rawValue)) { + return false; + } + } + if (convertedValue == null) { + if (other.convertedValue != null) { + return false; + } + } else { + if (! convertedValue.equals(other.convertedValue)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (validityState != null ? validityState.hashCode() : 0); + hash = 83 * hash + (rawValue != null ? rawValue.hashCode() : 0); + hash = 83 * hash + (convertedValue != null ? convertedValue.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(ParameterValue: "); + buf.append("validityState=").append(validityState); + buf.append(", rawValue=").append(rawValue); + buf.append(", convertedValue=").append(convertedValue); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (validityState == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'validityState' cannot be null!"); + } + encoder.encodeUOctet(validityState); + encoder.encodeNullableAttribute(rawValue); + encoder.encodeNullableAttribute(convertedValue); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + validityState = decoder.decodeUOctet(); + rawValue = (org.ccsds.moims.mo.mal.structures.Attribute) decoder.decodeNullableAttribute(); + convertedValue = (org.ccsds.moims.mo.mal.structures.Attribute) decoder.decodeNullableAttribute(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/structures/ParameterValueDetails.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/structures/ParameterValueDetails.java new file mode 100644 index 00000000..5a9ecdca --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/structures/ParameterValueDetails.java @@ -0,0 +1,206 @@ +package org.ccsds.moims.mo.mc.parameter.structures; + +/** + * This structure holds a specific time stamped value of the parameter. The + * type of the value shall match that specified in the parameter definition. + */ +public final class ParameterValueDetails implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1125908513554439L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125908513554439L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * The ParameterIdentity object instance identifier. + */ + private Long paramId; + + /** + * The ParameterDefinition object instance identifier. + */ + private Long defId; + + /** + * The timestamp of the value. + */ + private org.ccsds.moims.mo.mal.structures.Time timestamp; + + /** + * The parameter value. + */ + private org.ccsds.moims.mo.mc.parameter.structures.ParameterValue value; + + /** + * Default constructor for ParameterValueDetails. + * + */ + public ParameterValueDetails() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param paramId The ParameterIdentity object instance identifier. + * @param defId The ParameterDefinition object instance identifier. + * @param timestamp The timestamp of the value. + * @param value The parameter value. + */ + public ParameterValueDetails(Long paramId, + Long defId, + org.ccsds.moims.mo.mal.structures.Time timestamp, + org.ccsds.moims.mo.mc.parameter.structures.ParameterValue value) { + this.paramId = paramId; + this.defId = defId; + this.timestamp = timestamp; + this.value = value; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mc.parameter.structures.ParameterValueDetails(); + } + + /** + * Returns the field paramId. + * + * @return The field paramId + */ + public Long getParamId() { + return paramId; + } + + /** + * Returns the field defId. + * + * @return The field defId + */ + public Long getDefId() { + return defId; + } + + /** + * Returns the field timestamp. + * + * @return The field timestamp + */ + public org.ccsds.moims.mo.mal.structures.Time getTimestamp() { + return timestamp; + } + + /** + * Returns the field value. + * + * @return The field value + */ + public org.ccsds.moims.mo.mc.parameter.structures.ParameterValue getValue() { + return value; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ParameterValueDetails) { + ParameterValueDetails other = (ParameterValueDetails) obj; + if (paramId == null) { + if (other.paramId != null) { + return false; + } + } else { + if (! paramId.equals(other.paramId)) { + return false; + } + } + if (defId == null) { + if (other.defId != null) { + return false; + } + } else { + if (! defId.equals(other.defId)) { + return false; + } + } + if (timestamp == null) { + if (other.timestamp != null) { + return false; + } + } else { + if (! timestamp.equals(other.timestamp)) { + return false; + } + } + if (value == null) { + if (other.value != null) { + return false; + } + } else { + if (! value.equals(other.value)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (paramId != null ? paramId.hashCode() : 0); + hash = 83 * hash + (defId != null ? defId.hashCode() : 0); + hash = 83 * hash + (timestamp != null ? timestamp.hashCode() : 0); + hash = 83 * hash + (value != null ? value.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(ParameterValueDetails: "); + buf.append("paramId=").append(paramId); + buf.append(", defId=").append(defId); + buf.append(", timestamp=").append(timestamp); + buf.append(", value=").append(value); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (paramId == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'paramId' cannot be null!"); + } + if (defId == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'defId' cannot be null!"); + } + if (timestamp == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'timestamp' cannot be null!"); + } + if (value == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'value' cannot be null!"); + } + encoder.encodeLong(paramId); + encoder.encodeLong(defId); + encoder.encodeTime(timestamp); + encoder.encodeElement(value); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + paramId = decoder.decodeLong(); + defId = decoder.decodeLong(); + timestamp = decoder.decodeTime(); + value = (org.ccsds.moims.mo.mc.parameter.structures.ParameterValue) decoder.decodeElement(new org.ccsds.moims.mo.mc.parameter.structures.ParameterValue()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/structures/ParameterValueDetailsList.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/structures/ParameterValueDetailsList.java new file mode 100644 index 00000000..1039da12 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/structures/ParameterValueDetailsList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mc.parameter.structures; + +/** + * List class for ParameterValueDetails. + */ +public final class ParameterValueDetailsList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1125908530331641L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125908530331641L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for ParameterValueDetailsList. + * + */ + public ParameterValueDetailsList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public ParameterValueDetailsList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public ParameterValueDetailsList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mc.parameter.structures.ParameterValueDetails element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mc.parameter.structures.ParameterValueDetails element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new ParameterValueDetailsList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mc.parameter.structures.ParameterValueDetails(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/structures/ParameterValueList.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/structures/ParameterValueList.java new file mode 100644 index 00000000..3308d3fa --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/structures/ParameterValueList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mc.parameter.structures; + +/** + * List class for ParameterValue. + */ +public final class ParameterValueList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1125908530331646L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125908530331646L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for ParameterValueList. + * + */ + public ParameterValueList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public ParameterValueList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public ParameterValueList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mc.parameter.structures.ParameterValue element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mc.parameter.structures.ParameterValue element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new ParameterValueList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mc.parameter.structures.ParameterValue(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/structures/ValidityState.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/structures/ValidityState.java new file mode 100644 index 00000000..18e95f23 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/structures/ValidityState.java @@ -0,0 +1,182 @@ +package org.ccsds.moims.mo.mc.parameter.structures; + +/** + * Enumeration class for ValidityState. + */ +public final class ValidityState extends org.ccsds.moims.mo.mal.structures.Enumeration { + + private static final long serialVersionUID = 1125908513554436L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125908513554436L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Enumeration value for VALID. + */ + public static final int VALID_VALUE = 0; + + /** + * Enumeration singleton for value VALID. + */ + public static final org.ccsds.moims.mo.mc.parameter.structures.ValidityState VALID = new org.ccsds.moims.mo.mc.parameter.structures.ValidityState(org.ccsds.moims.mo.mc.parameter.structures.ValidityState.VALID_VALUE); + + /** + * Enumeration value for EXPIRED. + */ + public static final int EXPIRED_VALUE = 1; + + /** + * Enumeration singleton for value EXPIRED. + */ + public static final org.ccsds.moims.mo.mc.parameter.structures.ValidityState EXPIRED = new org.ccsds.moims.mo.mc.parameter.structures.ValidityState(org.ccsds.moims.mo.mc.parameter.structures.ValidityState.EXPIRED_VALUE); + + /** + * Enumeration value for INVALID_RAW. + */ + public static final int INVALID_RAW_VALUE = 2; + + /** + * Enumeration singleton for value INVALID_RAW. + */ + public static final org.ccsds.moims.mo.mc.parameter.structures.ValidityState INVALID_RAW = new org.ccsds.moims.mo.mc.parameter.structures.ValidityState(org.ccsds.moims.mo.mc.parameter.structures.ValidityState.INVALID_RAW_VALUE); + + /** + * Enumeration value for INVALID_CONVERSION. + */ + public static final int INVALID_CONVERSION_VALUE = 3; + + /** + * Enumeration singleton for value INVALID_CONVERSION. + */ + public static final org.ccsds.moims.mo.mc.parameter.structures.ValidityState INVALID_CONVERSION = new org.ccsds.moims.mo.mc.parameter.structures.ValidityState(org.ccsds.moims.mo.mc.parameter.structures.ValidityState.INVALID_CONVERSION_VALUE); + + /** + * Enumeration value for UNVERIFIED. + */ + public static final int UNVERIFIED_VALUE = 4; + + /** + * Enumeration singleton for value UNVERIFIED. + */ + public static final org.ccsds.moims.mo.mc.parameter.structures.ValidityState UNVERIFIED = new org.ccsds.moims.mo.mc.parameter.structures.ValidityState(org.ccsds.moims.mo.mc.parameter.structures.ValidityState.UNVERIFIED_VALUE); + + /** + * Enumeration value for INVALID. + */ + public static final int INVALID_VALUE = 5; + + /** + * Enumeration singleton for value INVALID. + */ + public static final org.ccsds.moims.mo.mc.parameter.structures.ValidityState INVALID = new org.ccsds.moims.mo.mc.parameter.structures.ValidityState(org.ccsds.moims.mo.mc.parameter.structures.ValidityState.INVALID_VALUE); + + /** + * Set of enumeration instances. + */ + private static final org.ccsds.moims.mo.mc.parameter.structures.ValidityState[] _ENUMERATIONS = { + VALID, EXPIRED, INVALID_RAW, INVALID_CONVERSION, UNVERIFIED, INVALID}; + + /** + * Convenience enumeration that holds the validity states and their numeric values. + */ + public ValidityState() { + super(-1); + } + + /** + * Convenience enumeration that holds the validity states and their numeric + * values. + * + * @param value The value of the Enumeration. + */ + public ValidityState(int value) { + super(value); + } + + @Override + public String toString() { + switch (getValue()) { + case VALID_VALUE: + return "VALID"; + case EXPIRED_VALUE: + return "EXPIRED"; + case INVALID_RAW_VALUE: + return "INVALID_RAW"; + case INVALID_CONVERSION_VALUE: + return "INVALID_CONVERSION"; + case UNVERIFIED_VALUE: + return "UNVERIFIED"; + case INVALID_VALUE: + return "INVALID"; + default: + throw new RuntimeException("Unknown ordinal!"); + } + } + + /** + * Returns the enumeration element represented by the supplied string, or + * null if not matched. + * + * @param s s The string to search for. + * @return The matched enumeration element, or null if not matched. + */ + public static org.ccsds.moims.mo.mc.parameter.structures.ValidityState fromString(String s) { + switch (s) { + case "VALID": + return ValidityState.VALID; + case "EXPIRED": + return ValidityState.EXPIRED; + case "INVALID_RAW": + return ValidityState.INVALID_RAW; + case "INVALID_CONVERSION": + return ValidityState.INVALID_CONVERSION; + case "UNVERIFIED": + return ValidityState.UNVERIFIED; + case "INVALID": + return ValidityState.INVALID; + default: + throw new RuntimeException("Unknown Enumeration for the provided string: " + s); + } + } + + @Override + public org.ccsds.moims.mo.mal.structures.Enumeration fromValue(Integer value) { + switch (value) { + case VALID_VALUE: + return ValidityState.VALID; + case EXPIRED_VALUE: + return ValidityState.EXPIRED; + case INVALID_RAW_VALUE: + return ValidityState.INVALID_RAW; + case INVALID_CONVERSION_VALUE: + return ValidityState.INVALID_CONVERSION; + case UNVERIFIED_VALUE: + return ValidityState.UNVERIFIED; + case INVALID_VALUE: + return ValidityState.INVALID; + default: + throw new RuntimeException("Unknown Enumeration for the provided value: " + value); + } + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return _ENUMERATIONS[0]; + } + + @Override + public int getEnumSize() { + return 6; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/structures/ValidityStateList.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/structures/ValidityStateList.java new file mode 100644 index 00000000..b003bbd3 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/structures/ValidityStateList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mc.parameter.structures; + +/** + * List class for ValidityState. + */ +public final class ValidityStateList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1125908530331644L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125908530331644L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for ValidityStateList. + * + */ + public ValidityStateList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public ValidityStateList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public ValidityStateList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mc.parameter.structures.ValidityState element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mc.parameter.structures.ValidityState element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new ValidityStateList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return org.ccsds.moims.mo.mc.parameter.structures.ValidityState.VALID; + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/structures/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/structures/package-info.java new file mode 100644 index 00000000..e28b90f3 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/parameter/structures/package-info.java @@ -0,0 +1,4 @@ +/** + * Package containing types defined in the Parameter service. +*/ +package org.ccsds.moims.mo.mc.parameter.structures; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/StatisticHelper.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/StatisticHelper.java new file mode 100644 index 00000000..b7670c65 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/StatisticHelper.java @@ -0,0 +1,17 @@ +package org.ccsds.moims.mo.mc.statistic; + +/** + * Helper class for Statistic service. + */ +public class StatisticHelper { + + /** + * Service singleton instance. + */ + public static final org.ccsds.moims.mo.mc.statistic.StatisticServiceInfo STATISTIC_SERVICE = new org.ccsds.moims.mo.mc.statistic.StatisticServiceInfo(); + + private StatisticHelper() { + // Utility class; not meant to be instantiated. + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/StatisticServiceInfo.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/StatisticServiceInfo.java new file mode 100644 index 00000000..1688890a --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/StatisticServiceInfo.java @@ -0,0 +1,443 @@ +package org.ccsds.moims.mo.mc.statistic; + +/** + * Helper class for Statistic service. + */ +public class StatisticServiceInfo extends org.ccsds.moims.mo.com.COMService { + + /** + * Service number literal. + */ + public static final int _STATISTIC_SERVICE_NUMBER = 5; + + /** + * Service number instance. + */ + public static final org.ccsds.moims.mo.mal.structures.UShort STATISTIC_SERVICE_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_STATISTIC_SERVICE_NUMBER); + + /** + * Service name constant. + */ + public static final org.ccsds.moims.mo.mal.structures.Identifier STATISTIC_SERVICE_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("Statistic"); + + /** + * The service key of this service. + */ + private static final org.ccsds.moims.mo.mal.ServiceKey SERVICE_KEY = new org.ccsds.moims.mo.mal.ServiceKey( + 4, 1, STATISTIC_SERVICE_NUMBER); + + /** + * Operation number literal for operation GETSTATISTICS. + */ + public static final int _GETSTATISTICS_OP_NUMBER = 1; + + /** + * Operation number instance for operation GETSTATISTICS. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort GETSTATISTICS_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_GETSTATISTICS_OP_NUMBER); + + /** + * Operation instance for operation GETSTATISTICS. + */ + public static final org.ccsds.moims.mo.mal.MALRequestOperation GETSTATISTICS_OP = new org.ccsds.moims.mo.mal.MALRequestOperation(SERVICE_KEY, + GETSTATISTICS_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("getStatistics"), + new org.ccsds.moims.mo.mal.structures.UShort(1), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("funcObjInstIds", true, org.ccsds.moims.mo.mal.structures.LongList.SHORT_FORM, "The funcObjInstIds field shall include a list of StatisticFunction object instance identifiers to match.\nThe funcObjInstIds field shall support the wildcard value of '0' and will match all functions of the provider.\nThe wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made."), + new org.ccsds.moims.mo.mal.OperationField("isGroup", true, org.ccsds.moims.mo.mal.structures.Attribute.BOOLEAN_SHORT_FORM, null), + new org.ccsds.moims.mo.mal.OperationField("paramObjInstIds", true, org.ccsds.moims.mo.com.structures.ObjectKeyList.SHORT_FORM, "If the isGroup field is TRUE then the paramObjInstIds field shall contain GroupIdentity object instance identifiers, otherwise the field shall contain ParameterIdentity object instance identifiers.\nIf the isGroup field is TRUE, the requested Group, or the Group objects referenced by that Group, must contain ParameterIdentity objects otherwise an INVALID error shall be returned.\nThe ParameterIdentity objects referenced, either directly or indirectly via groups, by the paramObjInstIds field shall be the parameters to match.\nThe paramObjInstIds field shall support the wildcard value of '0' and matches all parameters of the provider matched to the functions given in the funcObjInstIds field.\nThe wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made.\nIf a requested function, group or parameters is unknown then an UNKNOWN error shall be returned.\nThe sets of matched StatisticFunction objects and ParameterIdentity objects shall be matched to the set of existing StatisticLink objects to determine which StatisticLink objects to report on.")}, + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("evaluations", true, org.ccsds.moims.mo.mc.statistic.structures.StatisticEvaluationReportList.SHORT_FORM, "The response shall contain a list of matching statistics evaluation values.\nThe operation shall trigger an evaluation of the statistical functions matched and return the new evaluation values.\nIf it is not possible to return an evaluation value for a matched evaluation (for example not enough samples available) then no entry for that evaluation shall be included.\nThe evaluation shall not trigger a report via the monitorStatistics operation.\nRequesting an evaluation shall ignore the samplingInterval, reportingInterval, and collectionInterval fields and requests an immediate evaluation of the statistic.\nRequesting an evaluation during a periodic evaluation shall not influence the periodic evaluation (e.g. it does not reset the samplingInterval, reportingInterval, and collectionInterval timers or the current periodic collection value).")}, + "The getStatistics operation returns the latest value for a set of existing statistic evaluations."); + + /** + * Operation number literal for operation RESETEVALUATION. + */ + public static final int _RESETEVALUATION_OP_NUMBER = 2; + + /** + * Operation number instance for operation RESETEVALUATION. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort RESETEVALUATION_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_RESETEVALUATION_OP_NUMBER); + + /** + * Operation instance for operation RESETEVALUATION. + */ + public static final org.ccsds.moims.mo.mal.MALRequestOperation RESETEVALUATION_OP = new org.ccsds.moims.mo.mal.MALRequestOperation(SERVICE_KEY, + RESETEVALUATION_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("resetEvaluation"), + new org.ccsds.moims.mo.mal.structures.UShort(1), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("isStatLinkGroup", true, org.ccsds.moims.mo.mal.structures.Attribute.BOOLEAN_SHORT_FORM, "If the isStatLinkGroup field is TRUE then the objInstIds field shall contain GroupIdentity object instance identifiers, otherwise the field shall contain StatisticFunction object instance identifiers.\nIf the isStatLinkGroup field is TRUE, the requested Group, or the Group objects referenced by that Group, must contain StatisticLink objects otherwise an INVALID error shall be returned.\nThe StatisticLink objects referenced, either indirectly via statistic functions or indirectly via groups, by the objInstIds field shall be the StatisticLink objects to match."), + new org.ccsds.moims.mo.mal.OperationField("objInstIds", true, org.ccsds.moims.mo.mal.structures.LongList.SHORT_FORM, "The objInstIds field shall support the wildcard value of '0' and matches all StatisticLink objects of the provider.\nThe wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made.\nIf a requested function or group is unknown then an UNKNOWN error shall be returned."), + new org.ccsds.moims.mo.mal.OperationField("returnLatestEval", true, org.ccsds.moims.mo.mal.structures.Attribute.BOOLEAN_SHORT_FORM, "If the returnLatestEval Boolean field is TRUE then the latest evaluation result for each of the matched links shall be returned before resetting, otherwise a NULL is returned.\nIf an error is raised then no resetting of evaluations shall be made as a result of this operation call.")}, + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("evaluations", true, org.ccsds.moims.mo.mc.statistic.structures.StatisticEvaluationReportList.SHORT_FORM, null)}, + "The operation allows a consumer to reset the statistical evaluations so the evaluations restart from the current time (without changing the collection interval), optionally returning the evaluation up to that point. Resetting the evaluation will affect all consumers."); + + /** + * Operation number literal for operation MONITORSTATISTICS. + */ + public static final int _MONITORSTATISTICS_OP_NUMBER = 3; + + /** + * Operation number instance for operation MONITORSTATISTICS. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort MONITORSTATISTICS_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_MONITORSTATISTICS_OP_NUMBER); + + /** + * Operation instance for operation MONITORSTATISTICS. + */ + public static final org.ccsds.moims.mo.mal.MALPubSubOperation MONITORSTATISTICS_OP = new org.ccsds.moims.mo.mal.MALPubSubOperation(SERVICE_KEY, + MONITORSTATISTICS_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("monitorStatistics"), + new org.ccsds.moims.mo.mal.structures.UShort(2), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("relatedId", true, org.ccsds.moims.mo.mal.structures.Attribute.LONG_SHORT_FORM, "The MAL EntityKey.firstSubKey shall contain the statistic function name.\nThe MAL EntityKey.secondSubKey shall contain the StatisticLink object instance identifier.\nThe MAL EntityKey.thirdSubKey shall contain the ParameterIdentity object instance identifier.\nThe MAL EntityKey.fourthSubKey shall contain the new StatisticValueInstance object instance identifier.\nThe timestamp of the StatisticValueInstance report shall be taken from the publish message.\nThe related link of the update shall be held in the relatedId field."), + new org.ccsds.moims.mo.mal.OperationField("sourceId", true, org.ccsds.moims.mo.com.structures.ObjectId.SHORT_FORM, "The source link of the StatisticValueInstance shall be held in the sourceId field.\nIf no source link is needed then the sourceId shall be set to NULL."), + new org.ccsds.moims.mo.mal.OperationField("statisticValue", true, org.ccsds.moims.mo.mc.statistic.structures.StatisticValue.SHORT_FORM, "The second part of the publish message shall be the StatisticValueInstance object value.")}, + "The monitorStatistics operation allows a consumer to subscribe for statistical evaluation value reports.\nIt should be noted that no evaluation reports will be generated if the service provider has been disabled via the enableService operation."); + + /** + * Key names instance for MONITORSTATISTICS operation of pubsub interaction + * pattern. + */ + private static final org.ccsds.moims.mo.mal.structures.Identifier [] _MONITORSTATISTICS_OP_KEY_NAMES = {}; + + /** + * Key names instance for MONITORSTATISTICS operation of pubsub interaction + * pattern. + */ + private static final org.ccsds.moims.mo.mal.structures.IdentifierList MONITORSTATISTICS_OP_KEY_NAMES = new org.ccsds.moims.mo.mal.structures.IdentifierList(new java.util.ArrayList<>(java.util.Arrays.asList(_MONITORSTATISTICS_OP_KEY_NAMES))); + + /** + * Operation number literal for operation ENABLESERVICE. + */ + public static final int _ENABLESERVICE_OP_NUMBER = 4; + + /** + * Operation number instance for operation ENABLESERVICE. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort ENABLESERVICE_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_ENABLESERVICE_OP_NUMBER); + + /** + * Operation instance for operation ENABLESERVICE. + */ + public static final org.ccsds.moims.mo.mal.MALSubmitOperation ENABLESERVICE_OP = new org.ccsds.moims.mo.mal.MALSubmitOperation(SERVICE_KEY, + ENABLESERVICE_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("enableService"), + new org.ccsds.moims.mo.mal.structures.UShort(3), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("enableService", true, org.ccsds.moims.mo.mal.structures.Attribute.BOOLEAN_SHORT_FORM, "If enableService is set to TRUE the service shall be enabled and evaluation and reporting of statistics will be reset and commence.\nIf enableService is set to FALSE then all evaluation of statistics shall be suspended and no statistics will be reported.\nIf the enableService value matches the current enabled state of the service then no change shall be made and no error reported. Enabling an already enabled service has no effect.")}, + "The enableService operation allows a consumer to globally control whether evaluation of all statistics is performed or not."); + + /** + * Operation number literal for operation GETSERVICESTATUS. + */ + public static final int _GETSERVICESTATUS_OP_NUMBER = 5; + + /** + * Operation number instance for operation GETSERVICESTATUS. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort GETSERVICESTATUS_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_GETSERVICESTATUS_OP_NUMBER); + + /** + * Operation instance for operation GETSERVICESTATUS. + */ + public static final org.ccsds.moims.mo.mal.MALRequestOperation GETSERVICESTATUS_OP = new org.ccsds.moims.mo.mal.MALRequestOperation(SERVICE_KEY, + GETSERVICESTATUS_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("getServiceStatus"), + new org.ccsds.moims.mo.mal.structures.UShort(3), + new org.ccsds.moims.mo.mal.OperationField[] {}, + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("serviceEnabled", true, org.ccsds.moims.mo.mal.structures.Attribute.BOOLEAN_SHORT_FORM, "The operation shall return TRUE if the service is currently enabled or FALSE if the service is currently disabled.")}, + "The getServiceStatus operation allows a consumer to determine the global statistic service enabled status."); + + /** + * Operation number literal for operation ENABLEREPORTING. + */ + public static final int _ENABLEREPORTING_OP_NUMBER = 6; + + /** + * Operation number instance for operation ENABLEREPORTING. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort ENABLEREPORTING_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_ENABLEREPORTING_OP_NUMBER); + + /** + * Operation instance for operation ENABLEREPORTING. + */ + public static final org.ccsds.moims.mo.mal.MALSubmitOperation ENABLEREPORTING_OP = new org.ccsds.moims.mo.mal.MALSubmitOperation(SERVICE_KEY, + ENABLEREPORTING_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("enableReporting"), + new org.ccsds.moims.mo.mal.structures.UShort(4), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("isGroupIds", true, org.ccsds.moims.mo.mal.structures.Attribute.BOOLEAN_SHORT_FORM, "If the isGroupIds field is TRUE then the enableInstances field shall contain GroupIdentity object instance identifiers, otherwise the field contains StatisticFunction object instance identifiers.\nIf the isGroupIds field is TRUE, the requested Group, or the Group objects referenced by that Group, must contain StatisticLink objects otherwise an INVALID error shall be returned.\nThe StatisticLink objects referenced, either indirectly via StatisticFunction objects or indirectly via groups, by the enableInstances field shall be the StatisticLink objects to match.\nThe id of the enableInstances field shall support the wildcard value of '0' and matches all StatisticLink objects of the provider.\nThe service provider shall check for the wildcard value in the list of object instance identifiers in the enableInstances field first and if found no other checks of supplied object instance identifiers shall be made.\nIf the enableInstances field contains a value of TRUE then reports after the reporting and collection intervals for matching StatisticLink objects shall be generated, a value of FALSE requests that reports will not be generated.\nNo error shall be raised if the enableInstances Boolean value supplied is the same as the current reportingEnabled field for a StatisticLink object i.e. enabling an already enabled link will not result in an error.\nIf a requested StatisticFunction or GroupIdentity object is unknown then an UNKNOWN error shall be returned.\nIf an error is raised then no modifications shall be made as a result of this operation call.\nThe provider should create and store a new StatisticLinkDefinition object in the COM archive if the reportingEnabled field is changed."), + new org.ccsds.moims.mo.mal.OperationField("enableInstances", true, org.ccsds.moims.mo.com.structures.InstanceBooleanPairList.SHORT_FORM, "If the generation of reports is being enabled, then the provider shall generate a report immediately and start the report interval from that report.")}, + "The enableReporting operation allows a consumer to control whether reports for specific statistical functions are generated or not. The operation allows the consumer to select the functions directly or indirectly using groups."); + + /** + * Operation number literal for operation LISTPARAMETEREVALUATIONS. + */ + public static final int _LISTPARAMETEREVALUATIONS_OP_NUMBER = 7; + + /** + * Operation number instance for operation LISTPARAMETEREVALUATIONS. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort LISTPARAMETEREVALUATIONS_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_LISTPARAMETEREVALUATIONS_OP_NUMBER); + + /** + * Operation instance for operation LISTPARAMETEREVALUATIONS. + */ + public static final org.ccsds.moims.mo.mal.MALRequestOperation LISTPARAMETEREVALUATIONS_OP = new org.ccsds.moims.mo.mal.MALRequestOperation(SERVICE_KEY, + LISTPARAMETEREVALUATIONS_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("listParameterEvaluations"), + new org.ccsds.moims.mo.mal.structures.UShort(5), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("statObjInstIds", true, org.ccsds.moims.mo.mal.structures.LongList.SHORT_FORM, "The statObjInstIds field shall hold a list of StatisticFunction object instance identifiers to retrieve the StatisticLink object instance identifiers for.\nThe request may contain the wildcard value of '0' to return all supported statistic links.\nThe wildcard value should be checked for first, if found no other checks of supplied identifiers shall be made.\nIf a provided identifier does not include a wildcard and does not match an existing StatisticFunction object then this operation shall fail with an UNKNOWN error.")}, + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("statLinkObjInstIds", true, org.ccsds.moims.mo.mc.statistic.structures.StatisticLinkSummaryList.SHORT_FORM, "The response shall contain a list of StatisticLinkSummary that contain the object instance identifiers of the StatisticLink, StatisticFunction, and ParameterIdentity for the matched StatisticFunction objects.")}, + "The listParameterEvaluations operation allows a consumer to request the object instance identifiers of the StatisticLink objects for the evaluations of the provider."); + + /** + * Operation number literal for operation ADDPARAMETEREVALUATION. + */ + public static final int _ADDPARAMETEREVALUATION_OP_NUMBER = 8; + + /** + * Operation number instance for operation ADDPARAMETEREVALUATION. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort ADDPARAMETEREVALUATION_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_ADDPARAMETEREVALUATION_OP_NUMBER); + + /** + * Operation instance for operation ADDPARAMETEREVALUATION. + */ + public static final org.ccsds.moims.mo.mal.MALRequestOperation ADDPARAMETEREVALUATION_OP = new org.ccsds.moims.mo.mal.MALRequestOperation(SERVICE_KEY, + ADDPARAMETEREVALUATION_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("addParameterEvaluation"), + new org.ccsds.moims.mo.mal.structures.UShort(6), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("newDetails", true, org.ccsds.moims.mo.mc.statistic.structures.StatisticCreationRequestList.SHORT_FORM, "The newDetails field shall hold a StatisticCreationRequest for each new parameter to be sampled.\nThe statFuncInstId field of the StatisticCreationRequest shall reference the object instance identifier of the StatisticFunction to be used.\nIf the statFuncInstId field does not match an existing StatisticFunction then an UNKNOWN error shall be raised.\nThe parameterId shall reference the ParameterIdentity that the function is being applied to.\nIf the parameterId field does not match an existing ParameterIdentity then an UNKNOWN error shall be raised.\nIf the type of the matched parameter is not supported by the matched statistical function, for example Mean average of a String parameter, then an INVALID error shall be returned.\nThe samplingInterval field shall contain the sampling duration interval for the parameter.\nIf the supplied samplingInterval is not supported for the requested parameter then an INVALID error shall be returned.\nIf an error is raised then no new StatisticLink object shall be created and stored as a result of this operation call.\nIf no error is to be raised then StatisticLink and StatisticLinkDefinition objects shall be created for each function/parameter link and stored in the COM archive.\nThe referenced parameter shall be sampled immediately and the sampling, reporting and collection intervals started.")}, + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("newObjInstIds", true, org.ccsds.moims.mo.mc.structures.ObjectInstancePairList.SHORT_FORM, "The response shall contain the list of object instance identifiers for the new StatisticLink and StatisticLinkDefinition objects.\nThe object instance identifiers of the StatisticLink and StatisticLinkDefinition objects shall be held in the first and second fields of the ObjectInstancePair structure respectively.\nThe returned list shall maintain the same order as the submitted links.")}, + "The addParameterEvaluation operation allows a consumer to request that one or more parameters/function combinations are added to the list of parameters that are being evaluated.\nThe new StatisticLink and StatisticLinkDefinition objects are expected to be stored in the COM archive by the provider of the statistic service."); + + /** + * Operation number literal for operation UPDATEPARAMETEREVALUATION. + */ + public static final int _UPDATEPARAMETEREVALUATION_OP_NUMBER = 9; + + /** + * Operation number instance for operation UPDATEPARAMETEREVALUATION. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort UPDATEPARAMETEREVALUATION_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_UPDATEPARAMETEREVALUATION_OP_NUMBER); + + /** + * Operation instance for operation UPDATEPARAMETEREVALUATION. + */ + public static final org.ccsds.moims.mo.mal.MALRequestOperation UPDATEPARAMETEREVALUATION_OP = new org.ccsds.moims.mo.mal.MALRequestOperation(SERVICE_KEY, + UPDATEPARAMETEREVALUATION_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("updateParameterEvaluation"), + new org.ccsds.moims.mo.mal.structures.UShort(6), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("linkIds", true, org.ccsds.moims.mo.mal.structures.LongList.SHORT_FORM, "The linkIds field shall contain the object instance identifiers of the StatisticLink objects to be updated.\nIf the linkIds list contains either NULL or '0' an INVALID error shall be raised.\nThe supplied object instance identifiers shall match existing link objects, an UNKNOWN error shall be raised if this is not the case.\nIf the supplied samplingInterval is not supported for the requested parameter then an INVALID error shall be returned."), + new org.ccsds.moims.mo.mal.OperationField("newDetails", true, org.ccsds.moims.mo.mc.statistic.structures.StatisticLinkDetailsList.SHORT_FORM, "The newDetails field shall contain the replacement StatisticLinkDetails.\nThe two lists shall be ordered the same.\nThe number of entries in the two lists shall be the same size otherwise an INVALID error shall be returned.\nIf an error is raised then no links shall be updated as a result of this operation call.\nThe provider shall create a new StatisticLinkDefinition object and store it in the COM archive.\nIf any of the intervals are updated then the service shall reset the relevant timer and use the new intervals immediately.")}, + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("newLinkDefIds", true, org.ccsds.moims.mo.mal.structures.LongList.SHORT_FORM, "The response shall contain the list of object instance identifiers for the new StatisticLinkDefinition objects.\nThe returned list shall maintain the same order as the submitted links.")}, + "The updateParameterEvaluation operation allows a consumer to modify the intervals, reporting and reset Booleans for one or more statistical evaluation links.\nThe replacement StatisticLinkDefinition objects should be stored in the COM archive by the service provider. The operation does not remove the previous object from the COM archive, merely removes the object from the provider."); + + /** + * Operation number literal for operation REMOVEPARAMETEREVALUATION. + */ + public static final int _REMOVEPARAMETEREVALUATION_OP_NUMBER = 10; + + /** + * Operation number instance for operation REMOVEPARAMETEREVALUATION. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort REMOVEPARAMETEREVALUATION_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_REMOVEPARAMETEREVALUATION_OP_NUMBER); + + /** + * Operation instance for operation REMOVEPARAMETEREVALUATION. + */ + public static final org.ccsds.moims.mo.mal.MALSubmitOperation REMOVEPARAMETEREVALUATION_OP = new org.ccsds.moims.mo.mal.MALSubmitOperation(SERVICE_KEY, + REMOVEPARAMETEREVALUATION_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("removeParameterEvaluation"), + new org.ccsds.moims.mo.mal.structures.UShort(6), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("objInstIds", true, org.ccsds.moims.mo.mal.structures.LongList.SHORT_FORM, "The objInstIds field holds the object instance identifiers of the StatisticLink objects to be removed from the provider.\nThe list may contain the wildcard value of '0'.\nThe wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made.\nIf a provided StatisticLink object instance identifier does not include a wildcard and does not match an existing StatisticLink object then this operation shall fail with an UNKNOWN error.\nMatched StatisticLink objects shall not be removed from the COM archive only the list of evaluated StatisticLink objects in the provider.\nIf an error is raised then no StatisticLink objects shall be removed as a result of this operation call.\nIf the operation succeeds then the provider shall not evaluate those parameter/function definition combinations for the deleted StatisticLink objects anymore.")}, + "The removeParameterEvaluation operation allows a consumer to remove one or more parameters from the list of parameters being sampled by the statistic provider.\nThe operation does not remove the StatisticLink or StatisticLinkDefinition objects from the COM archive, merely removes them from the provider. This permits existing evaluation results to continue to reference the correct StatisticLink and StatisticLinkDefinition objects in the COM archive."); + + /** + * Area elements. + */ + public static final org.ccsds.moims.mo.mal.structures.Element[] STATISTIC_SERVICE_ELEMENTS = {}; + + /** + * The set of operations for this service. + */ + public static final org.ccsds.moims.mo.mal.MALOperation[] OPERATIONS = new org.ccsds.moims.mo.mal.MALOperation[]{GETSTATISTICS_OP, + RESETEVALUATION_OP, + MONITORSTATISTICS_OP, + ENABLESERVICE_OP, + GETSERVICESTATUS_OP, + ENABLEREPORTING_OP, + LISTPARAMETEREVALUATIONS_OP, + ADDPARAMETEREVALUATION_OP, + UPDATEPARAMETEREVALUATION_OP, + REMOVEPARAMETEREVALUATION_OP}; + + /** + * Literal for object STATISTICFUNCTION. + */ + @Deprecated + public static final int _STATISTICFUNCTION_OBJECT_NUMBER = 1; + + /** + * Instance for object STATISTICFUNCTION. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.UShort STATISTICFUNCTION_OBJECT_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_STATISTICFUNCTION_OBJECT_NUMBER); + + /** + * Object name constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.Identifier STATISTICFUNCTION_OBJECT_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("StatisticFunction"); + + /** + * Object type constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.com.structures.ObjectType STATISTICFUNCTION_OBJECT_TYPE = new org.ccsds.moims.mo.com.structures.ObjectType(new org.ccsds.moims.mo.mal.structures.UShort(4), STATISTIC_SERVICE_NUMBER, new org.ccsds.moims.mo.mal.structures.UOctet(1), STATISTICFUNCTION_OBJECT_NUMBER); + + /** + * Object instance. + */ + @Deprecated + public static org.ccsds.moims.mo.com.COMObject STATISTICFUNCTION_OBJECT = new org.ccsds.moims.mo.com.COMObject(STATISTICFUNCTION_OBJECT_TYPE, STATISTICFUNCTION_OBJECT_NAME, org.ccsds.moims.mo.mc.statistic.structures.StatisticFunctionDetails.SHORT_FORM, false, null, false, null, false); + + /** + * Literal for object STATISTICLINK. + */ + @Deprecated + public static final int _STATISTICLINK_OBJECT_NUMBER = 2; + + /** + * Instance for object STATISTICLINK. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.UShort STATISTICLINK_OBJECT_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_STATISTICLINK_OBJECT_NUMBER); + + /** + * Object name constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.Identifier STATISTICLINK_OBJECT_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("StatisticLink"); + + /** + * Object type constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.com.structures.ObjectType STATISTICLINK_OBJECT_TYPE = new org.ccsds.moims.mo.com.structures.ObjectType(new org.ccsds.moims.mo.mal.structures.UShort(4), STATISTIC_SERVICE_NUMBER, new org.ccsds.moims.mo.mal.structures.UOctet(1), STATISTICLINK_OBJECT_NUMBER); + + /** + * Object instance. + */ + @Deprecated + public static org.ccsds.moims.mo.com.COMObject STATISTICLINK_OBJECT = new org.ccsds.moims.mo.com.COMObject(STATISTICLINK_OBJECT_TYPE, STATISTICLINK_OBJECT_NAME, null, true, org.ccsds.moims.mo.mc.statistic.StatisticServiceInfo.STATISTICFUNCTION_OBJECT_TYPE, true, org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo.PARAMETERIDENTITY_OBJECT_TYPE, false); + + /** + * Literal for object STATISTICLINKDEFINITION. + */ + @Deprecated + public static final int _STATISTICLINKDEFINITION_OBJECT_NUMBER = 3; + + /** + * Instance for object STATISTICLINKDEFINITION. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.UShort STATISTICLINKDEFINITION_OBJECT_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_STATISTICLINKDEFINITION_OBJECT_NUMBER); + + /** + * Object name constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.Identifier STATISTICLINKDEFINITION_OBJECT_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("StatisticLinkDefinition"); + + /** + * Object type constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.com.structures.ObjectType STATISTICLINKDEFINITION_OBJECT_TYPE = new org.ccsds.moims.mo.com.structures.ObjectType(new org.ccsds.moims.mo.mal.structures.UShort(4), STATISTIC_SERVICE_NUMBER, new org.ccsds.moims.mo.mal.structures.UOctet(1), STATISTICLINKDEFINITION_OBJECT_NUMBER); + + /** + * Object instance. + */ + @Deprecated + public static org.ccsds.moims.mo.com.COMObject STATISTICLINKDEFINITION_OBJECT = new org.ccsds.moims.mo.com.COMObject(STATISTICLINKDEFINITION_OBJECT_TYPE, STATISTICLINKDEFINITION_OBJECT_NAME, org.ccsds.moims.mo.mc.statistic.structures.StatisticLinkDetails.SHORT_FORM, true, org.ccsds.moims.mo.mc.statistic.StatisticServiceInfo.STATISTICLINK_OBJECT_TYPE, false, null, false); + + /** + * Literal for object STATISTICVALUEINSTANCE. + */ + @Deprecated + public static final int _STATISTICVALUEINSTANCE_OBJECT_NUMBER = 4; + + /** + * Instance for object STATISTICVALUEINSTANCE. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.UShort STATISTICVALUEINSTANCE_OBJECT_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_STATISTICVALUEINSTANCE_OBJECT_NUMBER); + + /** + * Object name constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.mal.structures.Identifier STATISTICVALUEINSTANCE_OBJECT_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("StatisticValueInstance"); + + /** + * Object type constant. + */ + @Deprecated + public static final org.ccsds.moims.mo.com.structures.ObjectType STATISTICVALUEINSTANCE_OBJECT_TYPE = new org.ccsds.moims.mo.com.structures.ObjectType(new org.ccsds.moims.mo.mal.structures.UShort(4), STATISTIC_SERVICE_NUMBER, new org.ccsds.moims.mo.mal.structures.UOctet(1), STATISTICVALUEINSTANCE_OBJECT_NUMBER); + + /** + * Object instance. + */ + @Deprecated + public static org.ccsds.moims.mo.com.COMObject STATISTICVALUEINSTANCE_OBJECT = new org.ccsds.moims.mo.com.COMObject(STATISTICVALUEINSTANCE_OBJECT_TYPE, STATISTICVALUEINSTANCE_OBJECT_NAME, org.ccsds.moims.mo.mc.statistic.structures.StatisticValue.SHORT_FORM, true, org.ccsds.moims.mo.mc.statistic.StatisticServiceInfo.STATISTICLINKDEFINITION_OBJECT_TYPE, true, null, false); + + /** + * Object instance. + */ + public static final org.ccsds.moims.mo.com.COMObject[] COM_OBJECTS = { + STATISTICFUNCTION_OBJECT, + STATISTICLINK_OBJECT, + STATISTICLINKDEFINITION_OBJECT, + STATISTICVALUEINSTANCE_OBJECT,}; + + /** + * Creates an instance of the Statistic ServiceInfo. + * + */ + public StatisticServiceInfo() { + super(SERVICE_KEY, STATISTIC_SERVICE_NAME, STATISTIC_SERVICE_ELEMENTS, OPERATIONS, COM_OBJECTS); + } + + @Override + public org.ccsds.moims.mo.mal.MALArea getArea() { + return org.ccsds.moims.mo.mc.MCHelper.MC_AREA; + } + + @Override + public org.ccsds.moims.mo.mal.MOErrorException generateMOError(int errorNumber, + Object extraInfo) { + switch (errorNumber) { + case 70020: + return new org.ccsds.moims.mo.mc.ReadonlyException(extraInfo); + case 70021: + return new org.ccsds.moims.mo.mc.ReferencedException(extraInfo); + } + return null; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/consumer/MonitorStatisticsSubscriptionKeys.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/consumer/MonitorStatisticsSubscriptionKeys.java new file mode 100644 index 00000000..346a0db2 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/consumer/MonitorStatisticsSubscriptionKeys.java @@ -0,0 +1,69 @@ +package org.ccsds.moims.mo.mc.statistic.consumer; + +/** + * Typed accessors for the Subscription Keys of the monitorStatistics PubSub + * operation. + */ +public final class MonitorStatisticsSubscriptionKeys { + + /** + * The key values as received in the UpdateHeader. + */ + private org.ccsds.moims.mo.mal.structures.NullableAttributeList keyValues; + + /** + * The effective key names for the received key values. + */ + private org.ccsds.moims.mo.mal.structures.IdentifierList keyNames; + + /** + * The Subscription Key names defined by the operation, in order. + */ + private static final org.ccsds.moims.mo.mal.structures.IdentifierList CANONICAL_KEY_NAMES = new org.ccsds.moims.mo.mal.structures.IdentifierList(new java.util.ArrayList<>(java.util.Arrays.asList())); + + /** + * Creates an instance from the received UpdateHeader and the subscription + * selectedKeys. + * + * @param updateHeader The UpdateHeader received in the NOTIFY message + * @param selectedKeys The selectedKeys of the subscription, or null if trimming was not enabled + */ + public MonitorStatisticsSubscriptionKeys(org.ccsds.moims.mo.mal.structures.UpdateHeader updateHeader, + org.ccsds.moims.mo.mal.structures.IdentifierList selectedKeys) { + this.keyValues = (updateHeader == null) ? null : updateHeader.getKeyValues(); + this.keyNames = (selectedKeys != null) ? selectedKeys : CANONICAL_KEY_NAMES; + } + + /** + * Returns the Subscription Key value with the given name, or null if it is + * not present (for example when it was trimmed away or is a custom key that + * is not part of this subscription). + * + * @param name The Subscription Key name + * @return The key value, or null if not present + */ + public org.ccsds.moims.mo.mal.structures.Attribute getByName(String name) { + return valueByName(name); + } + + /** + * + * @param name The Subscription Key name + */ + private org.ccsds.moims.mo.mal.structures.Attribute valueByName(String name) { + if (keyNames == null || keyValues == null) { + return null; + } + for (int i = 0; i < keyNames.size(); i++) { + if (name.equals(keyNames.get(i).getValue())) { + if (i >= keyValues.size()) { + return null; + } + org.ccsds.moims.mo.mal.structures.NullableAttribute na = keyValues.get(i); + return (na == null) ? null : na.getValue(); + } + } + return null; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/consumer/StatisticAdapter.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/consumer/StatisticAdapter.java new file mode 100644 index 00000000..4a69ab54 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/consumer/StatisticAdapter.java @@ -0,0 +1,509 @@ +package org.ccsds.moims.mo.mc.statistic.consumer; + +/** + * Consumer adapter for Statistic service. + */ +public abstract class StatisticAdapter extends org.ccsds.moims.mo.mal.consumer.MALInteractionAdapter { + + /** + * Called by the MAL when a REQUEST response is received from a provider for + * the operation getStatistics. + * + * @param msgHeader msgHeader The header of the received message + * @param evaluations The response shall contain a list of matching statistics evaluation values. +The operation shall trigger an evaluation of the statistical functions matched and return the new evaluation values. +If it is not possible to return an evaluation value for a matched evaluation (for example not enough samples available) then no entry for that evaluation shall be included. +The evaluation shall not trigger a report via the monitorStatistics operation. +Requesting an evaluation shall ignore the samplingInterval, reportingInterval, and collectionInterval fields and requests an immediate evaluation of the statistic. +Requesting an evaluation during a periodic evaluation shall not influence the periodic evaluation (e.g. it does not reset the samplingInterval, reportingInterval, and collectionInterval timers or the current periodic collection value). + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void getStatisticsResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mc.statistic.structures.StatisticEvaluationReportList evaluations, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response error is received from a provider + * for the operation getStatistics. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void getStatisticsErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response is received from a provider for + * the operation resetEvaluation. + * + * @param msgHeader msgHeader The header of the received message + * @param evaluations evaluations Argument number 0 as defined by the service operation + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void resetEvaluationResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mc.statistic.structures.StatisticEvaluationReportList evaluations, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response error is received from a provider + * for the operation resetEvaluation. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void resetEvaluationErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PubSub register acknowledgement is received from + * a broker for the operation monitorStatistics. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void monitorStatisticsRegisterAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PubSub register acknowledgement error is received + * from a broker for the operation monitorStatistics. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void monitorStatisticsRegisterErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PubSub deregister acknowledgement is received + * from a broker for the operation monitorStatistics. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void monitorStatisticsDeregisterAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PubSub update is received from a broker for the + * operation monitorStatistics. + * + * @param msgHeader msgHeader The header of the received message + * @param subscriptionId The subscriptionId of the subscription. + * @param updateHeader The Update header. + * @param keys The typed Subscription Key accessors for this update + * @param relatedId The MAL EntityKey.firstSubKey shall contain the statistic function name. +The MAL EntityKey.secondSubKey shall contain the StatisticLink object instance identifier. +The MAL EntityKey.thirdSubKey shall contain the ParameterIdentity object instance identifier. +The MAL EntityKey.fourthSubKey shall contain the new StatisticValueInstance object instance identifier. +The timestamp of the StatisticValueInstance report shall be taken from the publish message. +The related link of the update shall be held in the relatedId field. + * @param sourceId The source link of the StatisticValueInstance shall be held in the sourceId field. +If no source link is needed then the sourceId shall be set to NULL. + * @param statisticValue The second part of the publish message shall be the StatisticValueInstance object value. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void monitorStatisticsNotifyReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.structures.Identifier subscriptionId, + org.ccsds.moims.mo.mal.structures.UpdateHeader updateHeader, + MonitorStatisticsSubscriptionKeys keys, + Long relatedId, + org.ccsds.moims.mo.com.structures.ObjectId sourceId, + org.ccsds.moims.mo.mc.statistic.structures.StatisticValue statisticValue, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PubSub update error is received from a broker + * for the operation monitorStatistics. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void monitorStatisticsNotifyErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a SUBMIT acknowledgement is received from a provider + * for the operation enableService. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void enableServiceAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a SUBMIT acknowledgement error is received from + * a provider for the operation enableService. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void enableServiceErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response is received from a provider for + * the operation getServiceStatus. + * + * @param msgHeader msgHeader The header of the received message + * @param serviceEnabled The operation shall return TRUE if the service is currently enabled or FALSE if the service is currently disabled. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void getServiceStatusResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + Boolean serviceEnabled, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response error is received from a provider + * for the operation getServiceStatus. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void getServiceStatusErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a SUBMIT acknowledgement is received from a provider + * for the operation enableReporting. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void enableReportingAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a SUBMIT acknowledgement error is received from + * a provider for the operation enableReporting. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void enableReportingErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response is received from a provider for + * the operation listParameterEvaluations. + * + * @param msgHeader msgHeader The header of the received message + * @param statLinkObjInstIds The response shall contain a list of StatisticLinkSummary that contain the object instance identifiers of the StatisticLink, StatisticFunction, and ParameterIdentity for the matched StatisticFunction objects. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void listParameterEvaluationsResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mc.statistic.structures.StatisticLinkSummaryList statLinkObjInstIds, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response error is received from a provider + * for the operation listParameterEvaluations. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void listParameterEvaluationsErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response is received from a provider for + * the operation addParameterEvaluation. + * + * @param msgHeader msgHeader The header of the received message + * @param newObjInstIds The response shall contain the list of object instance identifiers for the new StatisticLink and StatisticLinkDefinition objects. +The object instance identifiers of the StatisticLink and StatisticLinkDefinition objects shall be held in the first and second fields of the ObjectInstancePair structure respectively. +The returned list shall maintain the same order as the submitted links. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void addParameterEvaluationResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mc.structures.ObjectInstancePairList newObjInstIds, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response error is received from a provider + * for the operation addParameterEvaluation. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void addParameterEvaluationErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response is received from a provider for + * the operation updateParameterEvaluation. + * + * @param msgHeader msgHeader The header of the received message + * @param newLinkDefIds The response shall contain the list of object instance identifiers for the new StatisticLinkDefinition objects. +The returned list shall maintain the same order as the submitted links. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void updateParameterEvaluationResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.structures.LongList newLinkDefIds, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response error is received from a provider + * for the operation updateParameterEvaluation. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void updateParameterEvaluationErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a SUBMIT acknowledgement is received from a provider + * for the operation removeParameterEvaluation. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void removeParameterEvaluationAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a SUBMIT acknowledgement error is received from + * a provider for the operation removeParameterEvaluation. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void removeParameterEvaluationErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + @Override + public final void submitAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mc.statistic.StatisticServiceInfo._ENABLESERVICE_OP_NUMBER: + enableServiceAckReceived(msgHeader, qosProperties); + break; + case org.ccsds.moims.mo.mc.statistic.StatisticServiceInfo._ENABLEREPORTING_OP_NUMBER: + enableReportingAckReceived(msgHeader, qosProperties); + break; + case org.ccsds.moims.mo.mc.statistic.StatisticServiceInfo._REMOVEPARAMETEREVALUATION_OP_NUMBER: + removeParameterEvaluationAckReceived(msgHeader, qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void submitErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALErrorBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mc.statistic.StatisticServiceInfo._ENABLESERVICE_OP_NUMBER: + enableServiceErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mc.statistic.StatisticServiceInfo._ENABLEREPORTING_OP_NUMBER: + enableReportingErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mc.statistic.StatisticServiceInfo._REMOVEPARAMETEREVALUATION_OP_NUMBER: + removeParameterEvaluationErrorReceived(msgHeader, body.getError(), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void requestResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALMessageBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mc.statistic.StatisticServiceInfo._GETSTATISTICS_OP_NUMBER: + getStatisticsResponseReceived(msgHeader, + (org.ccsds.moims.mo.mc.statistic.structures.StatisticEvaluationReportList) body.getBodyElement(0, new org.ccsds.moims.mo.mc.statistic.structures.StatisticEvaluationReportList()), qosProperties); + break; + case org.ccsds.moims.mo.mc.statistic.StatisticServiceInfo._RESETEVALUATION_OP_NUMBER: + resetEvaluationResponseReceived(msgHeader, + (org.ccsds.moims.mo.mc.statistic.structures.StatisticEvaluationReportList) body.getBodyElement(0, new org.ccsds.moims.mo.mc.statistic.structures.StatisticEvaluationReportList()), qosProperties); + break; + case org.ccsds.moims.mo.mc.statistic.StatisticServiceInfo._GETSERVICESTATUS_OP_NUMBER: + getServiceStatusResponseReceived(msgHeader, + (body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.Union(Boolean.FALSE)) == null) ? null : ((org.ccsds.moims.mo.mal.structures.Union) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.Union(Boolean.FALSE))).getBooleanValue(), qosProperties); + break; + case org.ccsds.moims.mo.mc.statistic.StatisticServiceInfo._LISTPARAMETEREVALUATIONS_OP_NUMBER: + listParameterEvaluationsResponseReceived(msgHeader, + (org.ccsds.moims.mo.mc.statistic.structures.StatisticLinkSummaryList) body.getBodyElement(0, new org.ccsds.moims.mo.mc.statistic.structures.StatisticLinkSummaryList()), qosProperties); + break; + case org.ccsds.moims.mo.mc.statistic.StatisticServiceInfo._ADDPARAMETEREVALUATION_OP_NUMBER: + addParameterEvaluationResponseReceived(msgHeader, + (org.ccsds.moims.mo.mc.structures.ObjectInstancePairList) body.getBodyElement(0, new org.ccsds.moims.mo.mc.structures.ObjectInstancePairList()), qosProperties); + break; + case org.ccsds.moims.mo.mc.statistic.StatisticServiceInfo._UPDATEPARAMETEREVALUATION_OP_NUMBER: + updateParameterEvaluationResponseReceived(msgHeader, + (org.ccsds.moims.mo.mal.structures.LongList) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.LongList()), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void requestErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALErrorBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mc.statistic.StatisticServiceInfo._GETSTATISTICS_OP_NUMBER: + getStatisticsErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mc.statistic.StatisticServiceInfo._RESETEVALUATION_OP_NUMBER: + resetEvaluationErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mc.statistic.StatisticServiceInfo._GETSERVICESTATUS_OP_NUMBER: + getServiceStatusErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mc.statistic.StatisticServiceInfo._LISTPARAMETEREVALUATIONS_OP_NUMBER: + listParameterEvaluationsErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mc.statistic.StatisticServiceInfo._ADDPARAMETEREVALUATION_OP_NUMBER: + addParameterEvaluationErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mc.statistic.StatisticServiceInfo._UPDATEPARAMETEREVALUATION_OP_NUMBER: + updateParameterEvaluationErrorReceived(msgHeader, body.getError(), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void registerAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mc.statistic.StatisticServiceInfo._MONITORSTATISTICS_OP_NUMBER: + monitorStatisticsRegisterAckReceived(msgHeader, qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void registerErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALErrorBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mc.statistic.StatisticServiceInfo._MONITORSTATISTICS_OP_NUMBER: + monitorStatisticsRegisterErrorReceived(msgHeader, body.getError(), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void notifyReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALNotifyBody body, + org.ccsds.moims.mo.mal.structures.IdentifierList selectedKeys, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + if ((org.ccsds.moims.mo.mc.MCHelper.MC_AREA_NUMBER.equals(msgHeader.getServiceArea())) && (org.ccsds.moims.mo.mc.statistic.StatisticServiceInfo.STATISTIC_SERVICE_NUMBER.equals(msgHeader.getService()))) { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mc.statistic.StatisticServiceInfo._MONITORSTATISTICS_OP_NUMBER: + monitorStatisticsNotifyReceived(msgHeader, + (org.ccsds.moims.mo.mal.structures.Identifier) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.Identifier()), + (org.ccsds.moims.mo.mal.structures.UpdateHeader) body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.UpdateHeader()), + new MonitorStatisticsSubscriptionKeys((org.ccsds.moims.mo.mal.structures.UpdateHeader) body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.UpdateHeader()), selectedKeys), + (body.getBodyElement(2, new org.ccsds.moims.mo.mal.structures.Union(Long.MAX_VALUE)) == null) ? null : ((org.ccsds.moims.mo.mal.structures.Union) body.getBodyElement(2, new org.ccsds.moims.mo.mal.structures.Union(Long.MAX_VALUE))).getLongValue(), + (org.ccsds.moims.mo.com.structures.ObjectId) body.getBodyElement(3, new org.ccsds.moims.mo.com.structures.ObjectId()), + (org.ccsds.moims.mo.mc.statistic.structures.StatisticValue) body.getBodyElement(4, new org.ccsds.moims.mo.mc.statistic.structures.StatisticValue()), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + else { + notifyReceivedFromOtherService(msgHeader, body, qosProperties); + } + } + + @Override + public final void notifyErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALErrorBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mc.statistic.StatisticServiceInfo._MONITORSTATISTICS_OP_NUMBER: + monitorStatisticsNotifyErrorReceived(msgHeader, body.getError(), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void deregisterAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mc.statistic.StatisticServiceInfo._MONITORSTATISTICS_OP_NUMBER: + monitorStatisticsDeregisterAckReceived(msgHeader, qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + /** + * Called by the MAL when a PubSub update from another service is received + * from a broker. + * + * @param msgHeader msgHeader The header of the received message + * @param body body The body of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + * @throws org.ccsds.moims.mo.mal.MALException if an error is detected processing the message. + */ + public void notifyReceivedFromOtherService(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALNotifyBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/consumer/StatisticStub.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/consumer/StatisticStub.java new file mode 100644 index 00000000..5b453fba --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/consumer/StatisticStub.java @@ -0,0 +1,631 @@ +package org.ccsds.moims.mo.mc.statistic.consumer; + +/** + * Consumer stub for Statistic service. + */ +public class StatisticStub { + + /** + * The consumer field. + */ + private final org.ccsds.moims.mo.mal.consumer.MALConsumer consumer; + + /** + * Wraps a MALconsumer connection with service specific methods that map from + * the high level service API to the generic MAL API. + * + * @param consumer consumer The MALConsumer to use in this stub. + */ + public StatisticStub(org.ccsds.moims.mo.mal.consumer.MALConsumer consumer) { + this.consumer = consumer; + } + + /** + * Returns the internal MAL consumer object used for sending of messages from + * this interface. + * + * @return The MAL consumer object. + */ + public org.ccsds.moims.mo.mal.consumer.MALConsumer getConsumer() { + return consumer; + } + + /** + * The getStatistics operation returns the latest value for a set of existing + * statistic evaluations. + * + * @param funcObjInstIds The funcObjInstIds field shall include a list of StatisticFunction object instance identifiers to match. +The funcObjInstIds field shall support the wildcard value of '0' and will match all functions of the provider. +The wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made. + * @param isGroup isGroup Argument number 1 as defined by the service operation + * @param paramObjInstIds If the isGroup field is TRUE then the paramObjInstIds field shall contain GroupIdentity object instance identifiers, otherwise the field shall contain ParameterIdentity object instance identifiers. +If the isGroup field is TRUE, the requested Group, or the Group objects referenced by that Group, must contain ParameterIdentity objects otherwise an INVALID error shall be returned. +The ParameterIdentity objects referenced, either directly or indirectly via groups, by the paramObjInstIds field shall be the parameters to match. +The paramObjInstIds field shall support the wildcard value of '0' and matches all parameters of the provider matched to the functions given in the funcObjInstIds field. +The wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made. +If a requested function, group or parameters is unknown then an UNKNOWN error shall be returned. +The sets of matched StatisticFunction objects and ParameterIdentity objects shall be matched to the set of existing StatisticLink objects to determine which StatisticLink objects to report on. + * @return The return value of the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mc.statistic.structures.StatisticEvaluationReportList getStatistics(org.ccsds.moims.mo.mal.structures.LongList funcObjInstIds, + Boolean isGroup, + org.ccsds.moims.mo.com.structures.ObjectKeyList paramObjInstIds) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + org.ccsds.moims.mo.mal.transport.MALMessageBody body = consumer.request(org.ccsds.moims.mo.mc.statistic.StatisticServiceInfo.GETSTATISTICS_OP, funcObjInstIds, (isGroup == null) ? null : new org.ccsds.moims.mo.mal.structures.Union(isGroup), paramObjInstIds); + Object body0 = (Object) body.getBodyElement(0, new org.ccsds.moims.mo.mc.statistic.structures.StatisticEvaluationReportList()); + return (org.ccsds.moims.mo.mc.statistic.structures.StatisticEvaluationReportList) body0; + } + + /** + * Asynchronous version of method getStatistics. + * + * @param funcObjInstIds The funcObjInstIds field shall include a list of StatisticFunction object instance identifiers to match. +The funcObjInstIds field shall support the wildcard value of '0' and will match all functions of the provider. +The wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made. + * @param isGroup isGroup Argument number 1 as defined by the service operation + * @param paramObjInstIds If the isGroup field is TRUE then the paramObjInstIds field shall contain GroupIdentity object instance identifiers, otherwise the field shall contain ParameterIdentity object instance identifiers. +If the isGroup field is TRUE, the requested Group, or the Group objects referenced by that Group, must contain ParameterIdentity objects otherwise an INVALID error shall be returned. +The ParameterIdentity objects referenced, either directly or indirectly via groups, by the paramObjInstIds field shall be the parameters to match. +The paramObjInstIds field shall support the wildcard value of '0' and matches all parameters of the provider matched to the functions given in the funcObjInstIds field. +The wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made. +If a requested function, group or parameters is unknown then an UNKNOWN error shall be returned. +The sets of matched StatisticFunction objects and ParameterIdentity objects shall be matched to the set of existing StatisticLink objects to determine which StatisticLink objects to report on. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncGetStatistics(org.ccsds.moims.mo.mal.structures.LongList funcObjInstIds, + Boolean isGroup, + org.ccsds.moims.mo.com.structures.ObjectKeyList paramObjInstIds, + org.ccsds.moims.mo.mc.statistic.consumer.StatisticAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncRequest(org.ccsds.moims.mo.mc.statistic.StatisticServiceInfo.GETSTATISTICS_OP, adapter, funcObjInstIds, (isGroup == null) ? null : new org.ccsds.moims.mo.mal.structures.Union(isGroup), paramObjInstIds); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueGetStatistics(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mc.statistic.consumer.StatisticAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mc.statistic.StatisticServiceInfo.GETSTATISTICS_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The operation allows a consumer to reset the statistical evaluations so + * the evaluations restart from the current time (without changing the collection + * interval), optionally returning the evaluation up to that point. Resetting + * the evaluation will affect all consumers. + * + * @param isStatLinkGroup If the isStatLinkGroup field is TRUE then the objInstIds field shall contain GroupIdentity object instance identifiers, otherwise the field shall contain StatisticFunction object instance identifiers. +If the isStatLinkGroup field is TRUE, the requested Group, or the Group objects referenced by that Group, must contain StatisticLink objects otherwise an INVALID error shall be returned. +The StatisticLink objects referenced, either indirectly via statistic functions or indirectly via groups, by the objInstIds field shall be the StatisticLink objects to match. + * @param objInstIds The objInstIds field shall support the wildcard value of '0' and matches all StatisticLink objects of the provider. +The wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made. +If a requested function or group is unknown then an UNKNOWN error shall be returned. + * @param returnLatestEval If the returnLatestEval Boolean field is TRUE then the latest evaluation result for each of the matched links shall be returned before resetting, otherwise a NULL is returned. +If an error is raised then no resetting of evaluations shall be made as a result of this operation call. + * @return The return value of the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mc.statistic.structures.StatisticEvaluationReportList resetEvaluation(Boolean isStatLinkGroup, + org.ccsds.moims.mo.mal.structures.LongList objInstIds, + Boolean returnLatestEval) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + org.ccsds.moims.mo.mal.transport.MALMessageBody body = consumer.request(org.ccsds.moims.mo.mc.statistic.StatisticServiceInfo.RESETEVALUATION_OP, (isStatLinkGroup == null) ? null : new org.ccsds.moims.mo.mal.structures.Union(isStatLinkGroup), objInstIds, (returnLatestEval == null) ? null : new org.ccsds.moims.mo.mal.structures.Union(returnLatestEval)); + Object body0 = (Object) body.getBodyElement(0, new org.ccsds.moims.mo.mc.statistic.structures.StatisticEvaluationReportList()); + return (org.ccsds.moims.mo.mc.statistic.structures.StatisticEvaluationReportList) body0; + } + + /** + * Asynchronous version of method resetEvaluation. + * + * @param isStatLinkGroup If the isStatLinkGroup field is TRUE then the objInstIds field shall contain GroupIdentity object instance identifiers, otherwise the field shall contain StatisticFunction object instance identifiers. +If the isStatLinkGroup field is TRUE, the requested Group, or the Group objects referenced by that Group, must contain StatisticLink objects otherwise an INVALID error shall be returned. +The StatisticLink objects referenced, either indirectly via statistic functions or indirectly via groups, by the objInstIds field shall be the StatisticLink objects to match. + * @param objInstIds The objInstIds field shall support the wildcard value of '0' and matches all StatisticLink objects of the provider. +The wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made. +If a requested function or group is unknown then an UNKNOWN error shall be returned. + * @param returnLatestEval If the returnLatestEval Boolean field is TRUE then the latest evaluation result for each of the matched links shall be returned before resetting, otherwise a NULL is returned. +If an error is raised then no resetting of evaluations shall be made as a result of this operation call. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncResetEvaluation(Boolean isStatLinkGroup, + org.ccsds.moims.mo.mal.structures.LongList objInstIds, + Boolean returnLatestEval, + org.ccsds.moims.mo.mc.statistic.consumer.StatisticAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncRequest(org.ccsds.moims.mo.mc.statistic.StatisticServiceInfo.RESETEVALUATION_OP, adapter, (isStatLinkGroup == null) ? null : new org.ccsds.moims.mo.mal.structures.Union(isStatLinkGroup), objInstIds, (returnLatestEval == null) ? null : new org.ccsds.moims.mo.mal.structures.Union(returnLatestEval)); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueResetEvaluation(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mc.statistic.consumer.StatisticAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mc.statistic.StatisticServiceInfo.RESETEVALUATION_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * Register method for the monitorStatistics PubSub interaction. + * + * @param subscription subscription the subscription to register for + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void monitorStatisticsRegister(org.ccsds.moims.mo.mal.structures.Subscription subscription, + org.ccsds.moims.mo.mc.statistic.consumer.StatisticAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.register(org.ccsds.moims.mo.mc.statistic.StatisticServiceInfo.MONITORSTATISTICS_OP, subscription, adapter); + } + + /** + * Asynchronous version of method monitorStatisticsRegister. + * + * @param subscription subscription the subscription to register for + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncMonitorStatisticsRegister(org.ccsds.moims.mo.mal.structures.Subscription subscription, + org.ccsds.moims.mo.mc.statistic.consumer.StatisticAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncRegister(org.ccsds.moims.mo.mc.statistic.StatisticServiceInfo.MONITORSTATISTICS_OP, subscription, adapter); + } + + /** + * Deregister method for the monitorStatistics PubSub interaction. + * + * @param identifierList identifierList the subscription identifiers to deregister + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void monitorStatisticsDeregister(org.ccsds.moims.mo.mal.structures.IdentifierList identifierList) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.deregister(org.ccsds.moims.mo.mc.statistic.StatisticServiceInfo.MONITORSTATISTICS_OP, identifierList); + } + + /** + * Asynchronous version of method monitorStatisticsDeregister. + * + * @param identifierList identifierList the subscription identifiers to deregister + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncMonitorStatisticsDeregister(org.ccsds.moims.mo.mal.structures.IdentifierList identifierList, + org.ccsds.moims.mo.mc.statistic.consumer.StatisticAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncDeregister(org.ccsds.moims.mo.mc.statistic.StatisticServiceInfo.MONITORSTATISTICS_OP, identifierList, adapter); + } + + /** + * The enableService operation allows a consumer to globally control whether + * evaluation of all statistics is performed or not. + * + * @param enableService If enableService is set to TRUE the service shall be enabled and evaluation and reporting of statistics will be reset and commence. +If enableService is set to FALSE then all evaluation of statistics shall be suspended and no statistics will be reported. +If the enableService value matches the current enabled state of the service then no change shall be made and no error reported. Enabling an already enabled service has no effect. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void enableService(Boolean enableService) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.submit(org.ccsds.moims.mo.mc.statistic.StatisticServiceInfo.ENABLESERVICE_OP, (enableService == null) ? null : new org.ccsds.moims.mo.mal.structures.Union(enableService)); + } + + /** + * Asynchronous version of method enableService. + * + * @param enableService If enableService is set to TRUE the service shall be enabled and evaluation and reporting of statistics will be reset and commence. +If enableService is set to FALSE then all evaluation of statistics shall be suspended and no statistics will be reported. +If the enableService value matches the current enabled state of the service then no change shall be made and no error reported. Enabling an already enabled service has no effect. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncEnableService(Boolean enableService, + org.ccsds.moims.mo.mc.statistic.consumer.StatisticAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncSubmit(org.ccsds.moims.mo.mc.statistic.StatisticServiceInfo.ENABLESERVICE_OP, adapter, (enableService == null) ? null : new org.ccsds.moims.mo.mal.structures.Union(enableService)); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueEnableService(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mc.statistic.consumer.StatisticAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mc.statistic.StatisticServiceInfo.ENABLESERVICE_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The getServiceStatus operation allows a consumer to determine the global + * statistic service enabled status. + * + * @return The return value of the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public Boolean getServiceStatus() throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + org.ccsds.moims.mo.mal.transport.MALMessageBody body = consumer.request(org.ccsds.moims.mo.mc.statistic.StatisticServiceInfo.GETSERVICESTATUS_OP, (Object[]) null); + Object body0 = (Object) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.Union(Boolean.FALSE)); + return (body0 == null) ? null : ((org.ccsds.moims.mo.mal.structures.Union) body0).getBooleanValue(); + } + + /** + * Asynchronous version of method getServiceStatus. + * + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncGetServiceStatus(org.ccsds.moims.mo.mc.statistic.consumer.StatisticAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncRequest(org.ccsds.moims.mo.mc.statistic.StatisticServiceInfo.GETSERVICESTATUS_OP, adapter, (Object[]) null); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueGetServiceStatus(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mc.statistic.consumer.StatisticAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mc.statistic.StatisticServiceInfo.GETSERVICESTATUS_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The enableReporting operation allows a consumer to control whether reports + * for specific statistical functions are generated or not. The operation + * allows the consumer to select the functions directly or indirectly using + * groups. + * + * @param isGroupIds If the isGroupIds field is TRUE then the enableInstances field shall contain GroupIdentity object instance identifiers, otherwise the field contains StatisticFunction object instance identifiers. +If the isGroupIds field is TRUE, the requested Group, or the Group objects referenced by that Group, must contain StatisticLink objects otherwise an INVALID error shall be returned. +The StatisticLink objects referenced, either indirectly via StatisticFunction objects or indirectly via groups, by the enableInstances field shall be the StatisticLink objects to match. +The id of the enableInstances field shall support the wildcard value of '0' and matches all StatisticLink objects of the provider. +The service provider shall check for the wildcard value in the list of object instance identifiers in the enableInstances field first and if found no other checks of supplied object instance identifiers shall be made. +If the enableInstances field contains a value of TRUE then reports after the reporting and collection intervals for matching StatisticLink objects shall be generated, a value of FALSE requests that reports will not be generated. +No error shall be raised if the enableInstances Boolean value supplied is the same as the current reportingEnabled field for a StatisticLink object i.e. enabling an already enabled link will not result in an error. +If a requested StatisticFunction or GroupIdentity object is unknown then an UNKNOWN error shall be returned. +If an error is raised then no modifications shall be made as a result of this operation call. +The provider should create and store a new StatisticLinkDefinition object in the COM archive if the reportingEnabled field is changed. + * @param enableInstances If the generation of reports is being enabled, then the provider shall generate a report immediately and start the report interval from that report. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void enableReporting(Boolean isGroupIds, + org.ccsds.moims.mo.com.structures.InstanceBooleanPairList enableInstances) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.submit(org.ccsds.moims.mo.mc.statistic.StatisticServiceInfo.ENABLEREPORTING_OP, (isGroupIds == null) ? null : new org.ccsds.moims.mo.mal.structures.Union(isGroupIds), enableInstances); + } + + /** + * Asynchronous version of method enableReporting. + * + * @param isGroupIds If the isGroupIds field is TRUE then the enableInstances field shall contain GroupIdentity object instance identifiers, otherwise the field contains StatisticFunction object instance identifiers. +If the isGroupIds field is TRUE, the requested Group, or the Group objects referenced by that Group, must contain StatisticLink objects otherwise an INVALID error shall be returned. +The StatisticLink objects referenced, either indirectly via StatisticFunction objects or indirectly via groups, by the enableInstances field shall be the StatisticLink objects to match. +The id of the enableInstances field shall support the wildcard value of '0' and matches all StatisticLink objects of the provider. +The service provider shall check for the wildcard value in the list of object instance identifiers in the enableInstances field first and if found no other checks of supplied object instance identifiers shall be made. +If the enableInstances field contains a value of TRUE then reports after the reporting and collection intervals for matching StatisticLink objects shall be generated, a value of FALSE requests that reports will not be generated. +No error shall be raised if the enableInstances Boolean value supplied is the same as the current reportingEnabled field for a StatisticLink object i.e. enabling an already enabled link will not result in an error. +If a requested StatisticFunction or GroupIdentity object is unknown then an UNKNOWN error shall be returned. +If an error is raised then no modifications shall be made as a result of this operation call. +The provider should create and store a new StatisticLinkDefinition object in the COM archive if the reportingEnabled field is changed. + * @param enableInstances If the generation of reports is being enabled, then the provider shall generate a report immediately and start the report interval from that report. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncEnableReporting(Boolean isGroupIds, + org.ccsds.moims.mo.com.structures.InstanceBooleanPairList enableInstances, + org.ccsds.moims.mo.mc.statistic.consumer.StatisticAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncSubmit(org.ccsds.moims.mo.mc.statistic.StatisticServiceInfo.ENABLEREPORTING_OP, adapter, (isGroupIds == null) ? null : new org.ccsds.moims.mo.mal.structures.Union(isGroupIds), enableInstances); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueEnableReporting(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mc.statistic.consumer.StatisticAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mc.statistic.StatisticServiceInfo.ENABLEREPORTING_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The listParameterEvaluations operation allows a consumer to request the + * object instance identifiers of the StatisticLink objects for the evaluations + * of the provider. + * + * @param statObjInstIds The statObjInstIds field shall hold a list of StatisticFunction object instance identifiers to retrieve the StatisticLink object instance identifiers for. +The request may contain the wildcard value of '0' to return all supported statistic links. +The wildcard value should be checked for first, if found no other checks of supplied identifiers shall be made. +If a provided identifier does not include a wildcard and does not match an existing StatisticFunction object then this operation shall fail with an UNKNOWN error. + * @return The return value of the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mc.statistic.structures.StatisticLinkSummaryList listParameterEvaluations(org.ccsds.moims.mo.mal.structures.LongList statObjInstIds) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + org.ccsds.moims.mo.mal.transport.MALMessageBody body = consumer.request(org.ccsds.moims.mo.mc.statistic.StatisticServiceInfo.LISTPARAMETEREVALUATIONS_OP, statObjInstIds); + Object body0 = (Object) body.getBodyElement(0, new org.ccsds.moims.mo.mc.statistic.structures.StatisticLinkSummaryList()); + return (org.ccsds.moims.mo.mc.statistic.structures.StatisticLinkSummaryList) body0; + } + + /** + * Asynchronous version of method listParameterEvaluations. + * + * @param statObjInstIds The statObjInstIds field shall hold a list of StatisticFunction object instance identifiers to retrieve the StatisticLink object instance identifiers for. +The request may contain the wildcard value of '0' to return all supported statistic links. +The wildcard value should be checked for first, if found no other checks of supplied identifiers shall be made. +If a provided identifier does not include a wildcard and does not match an existing StatisticFunction object then this operation shall fail with an UNKNOWN error. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncListParameterEvaluations(org.ccsds.moims.mo.mal.structures.LongList statObjInstIds, + org.ccsds.moims.mo.mc.statistic.consumer.StatisticAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncRequest(org.ccsds.moims.mo.mc.statistic.StatisticServiceInfo.LISTPARAMETEREVALUATIONS_OP, adapter, statObjInstIds); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueListParameterEvaluations(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mc.statistic.consumer.StatisticAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mc.statistic.StatisticServiceInfo.LISTPARAMETEREVALUATIONS_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The addParameterEvaluation operation allows a consumer to request that + * one or more parameters/function combinations are added to the list of parameters + * that are being evaluated. + * The new StatisticLink and StatisticLinkDefinition objects are expected + * to be stored in the COM archive by the provider of the statistic service. + * + * @param newDetails The newDetails field shall hold a StatisticCreationRequest for each new parameter to be sampled. +The statFuncInstId field of the StatisticCreationRequest shall reference the object instance identifier of the StatisticFunction to be used. +If the statFuncInstId field does not match an existing StatisticFunction then an UNKNOWN error shall be raised. +The parameterId shall reference the ParameterIdentity that the function is being applied to. +If the parameterId field does not match an existing ParameterIdentity then an UNKNOWN error shall be raised. +If the type of the matched parameter is not supported by the matched statistical function, for example Mean average of a String parameter, then an INVALID error shall be returned. +The samplingInterval field shall contain the sampling duration interval for the parameter. +If the supplied samplingInterval is not supported for the requested parameter then an INVALID error shall be returned. +If an error is raised then no new StatisticLink object shall be created and stored as a result of this operation call. +If no error is to be raised then StatisticLink and StatisticLinkDefinition objects shall be created for each function/parameter link and stored in the COM archive. +The referenced parameter shall be sampled immediately and the sampling, reporting and collection intervals started. + * @return The return value of the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mc.structures.ObjectInstancePairList addParameterEvaluation(org.ccsds.moims.mo.mc.statistic.structures.StatisticCreationRequestList newDetails) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + org.ccsds.moims.mo.mal.transport.MALMessageBody body = consumer.request(org.ccsds.moims.mo.mc.statistic.StatisticServiceInfo.ADDPARAMETEREVALUATION_OP, newDetails); + Object body0 = (Object) body.getBodyElement(0, new org.ccsds.moims.mo.mc.structures.ObjectInstancePairList()); + return (org.ccsds.moims.mo.mc.structures.ObjectInstancePairList) body0; + } + + /** + * Asynchronous version of method addParameterEvaluation. + * + * @param newDetails The newDetails field shall hold a StatisticCreationRequest for each new parameter to be sampled. +The statFuncInstId field of the StatisticCreationRequest shall reference the object instance identifier of the StatisticFunction to be used. +If the statFuncInstId field does not match an existing StatisticFunction then an UNKNOWN error shall be raised. +The parameterId shall reference the ParameterIdentity that the function is being applied to. +If the parameterId field does not match an existing ParameterIdentity then an UNKNOWN error shall be raised. +If the type of the matched parameter is not supported by the matched statistical function, for example Mean average of a String parameter, then an INVALID error shall be returned. +The samplingInterval field shall contain the sampling duration interval for the parameter. +If the supplied samplingInterval is not supported for the requested parameter then an INVALID error shall be returned. +If an error is raised then no new StatisticLink object shall be created and stored as a result of this operation call. +If no error is to be raised then StatisticLink and StatisticLinkDefinition objects shall be created for each function/parameter link and stored in the COM archive. +The referenced parameter shall be sampled immediately and the sampling, reporting and collection intervals started. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncAddParameterEvaluation(org.ccsds.moims.mo.mc.statistic.structures.StatisticCreationRequestList newDetails, + org.ccsds.moims.mo.mc.statistic.consumer.StatisticAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncRequest(org.ccsds.moims.mo.mc.statistic.StatisticServiceInfo.ADDPARAMETEREVALUATION_OP, adapter, newDetails); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueAddParameterEvaluation(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mc.statistic.consumer.StatisticAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mc.statistic.StatisticServiceInfo.ADDPARAMETEREVALUATION_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The updateParameterEvaluation operation allows a consumer to modify the + * intervals, reporting and reset Booleans for one or more statistical evaluation + * links. + * The replacement StatisticLinkDefinition objects should be stored in the + * COM archive by the service provider. The operation does not remove the + * previous object from the COM archive, merely removes the object from the + * provider. + * + * @param linkIds The linkIds field shall contain the object instance identifiers of the StatisticLink objects to be updated. +If the linkIds list contains either NULL or '0' an INVALID error shall be raised. +The supplied object instance identifiers shall match existing link objects, an UNKNOWN error shall be raised if this is not the case. +If the supplied samplingInterval is not supported for the requested parameter then an INVALID error shall be returned. + * @param newDetails The newDetails field shall contain the replacement StatisticLinkDetails. +The two lists shall be ordered the same. +The number of entries in the two lists shall be the same size otherwise an INVALID error shall be returned. +If an error is raised then no links shall be updated as a result of this operation call. +The provider shall create a new StatisticLinkDefinition object and store it in the COM archive. +If any of the intervals are updated then the service shall reset the relevant timer and use the new intervals immediately. + * @return The return value of the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.structures.LongList updateParameterEvaluation(org.ccsds.moims.mo.mal.structures.LongList linkIds, + org.ccsds.moims.mo.mc.statistic.structures.StatisticLinkDetailsList newDetails) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + org.ccsds.moims.mo.mal.transport.MALMessageBody body = consumer.request(org.ccsds.moims.mo.mc.statistic.StatisticServiceInfo.UPDATEPARAMETEREVALUATION_OP, linkIds, newDetails); + Object body0 = (Object) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.LongList()); + return (org.ccsds.moims.mo.mal.structures.LongList) body0; + } + + /** + * Asynchronous version of method updateParameterEvaluation. + * + * @param linkIds The linkIds field shall contain the object instance identifiers of the StatisticLink objects to be updated. +If the linkIds list contains either NULL or '0' an INVALID error shall be raised. +The supplied object instance identifiers shall match existing link objects, an UNKNOWN error shall be raised if this is not the case. +If the supplied samplingInterval is not supported for the requested parameter then an INVALID error shall be returned. + * @param newDetails The newDetails field shall contain the replacement StatisticLinkDetails. +The two lists shall be ordered the same. +The number of entries in the two lists shall be the same size otherwise an INVALID error shall be returned. +If an error is raised then no links shall be updated as a result of this operation call. +The provider shall create a new StatisticLinkDefinition object and store it in the COM archive. +If any of the intervals are updated then the service shall reset the relevant timer and use the new intervals immediately. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncUpdateParameterEvaluation(org.ccsds.moims.mo.mal.structures.LongList linkIds, + org.ccsds.moims.mo.mc.statistic.structures.StatisticLinkDetailsList newDetails, + org.ccsds.moims.mo.mc.statistic.consumer.StatisticAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncRequest(org.ccsds.moims.mo.mc.statistic.StatisticServiceInfo.UPDATEPARAMETEREVALUATION_OP, adapter, linkIds, newDetails); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueUpdateParameterEvaluation(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mc.statistic.consumer.StatisticAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mc.statistic.StatisticServiceInfo.UPDATEPARAMETEREVALUATION_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The removeParameterEvaluation operation allows a consumer to remove one + * or more parameters from the list of parameters being sampled by the statistic + * provider. + * The operation does not remove the StatisticLink or StatisticLinkDefinition + * objects from the COM archive, merely removes them from the provider. This + * permits existing evaluation results to continue to reference the correct + * StatisticLink and StatisticLinkDefinition objects in the COM archive. + * + * @param objInstIds The objInstIds field holds the object instance identifiers of the StatisticLink objects to be removed from the provider. +The list may contain the wildcard value of '0'. +The wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made. +If a provided StatisticLink object instance identifier does not include a wildcard and does not match an existing StatisticLink object then this operation shall fail with an UNKNOWN error. +Matched StatisticLink objects shall not be removed from the COM archive only the list of evaluated StatisticLink objects in the provider. +If an error is raised then no StatisticLink objects shall be removed as a result of this operation call. +If the operation succeeds then the provider shall not evaluate those parameter/function definition combinations for the deleted StatisticLink objects anymore. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void removeParameterEvaluation(org.ccsds.moims.mo.mal.structures.LongList objInstIds) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.submit(org.ccsds.moims.mo.mc.statistic.StatisticServiceInfo.REMOVEPARAMETEREVALUATION_OP, objInstIds); + } + + /** + * Asynchronous version of method removeParameterEvaluation. + * + * @param objInstIds The objInstIds field holds the object instance identifiers of the StatisticLink objects to be removed from the provider. +The list may contain the wildcard value of '0'. +The wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made. +If a provided StatisticLink object instance identifier does not include a wildcard and does not match an existing StatisticLink object then this operation shall fail with an UNKNOWN error. +Matched StatisticLink objects shall not be removed from the COM archive only the list of evaluated StatisticLink objects in the provider. +If an error is raised then no StatisticLink objects shall be removed as a result of this operation call. +If the operation succeeds then the provider shall not evaluate those parameter/function definition combinations for the deleted StatisticLink objects anymore. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncRemoveParameterEvaluation(org.ccsds.moims.mo.mal.structures.LongList objInstIds, + org.ccsds.moims.mo.mc.statistic.consumer.StatisticAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncSubmit(org.ccsds.moims.mo.mc.statistic.StatisticServiceInfo.REMOVEPARAMETEREVALUATION_OP, adapter, objInstIds); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueRemoveParameterEvaluation(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mc.statistic.consumer.StatisticAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mc.statistic.StatisticServiceInfo.REMOVEPARAMETEREVALUATION_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/consumer/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/consumer/package-info.java new file mode 100644 index 00000000..0b199599 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/consumer/package-info.java @@ -0,0 +1,4 @@ +/** + * Package containing the consumer stubs for the Statistic service. +*/ +package org.ccsds.moims.mo.mc.statistic.consumer; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/package-info.java new file mode 100644 index 00000000..08fa10c6 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/package-info.java @@ -0,0 +1,54 @@ +/** + * The statistic service allows the consumer to monitor and control the statistical + * evaluation (e.g., average) of parameters. + * The statistic service allows the consumer to link the statistic function + * to a parameter to be evaluated. Figure 3-9 shows the nominal sequence of + * operations for the statistic service: + * ---- nominal sequence diag ---- + * Statistic service nominal sequence + * For each statistics link the service allows a consumer to specify a sampling + * interval, a reporting interval, and a collection interval. + * The sampling interval defines the interval between samples of the linked + * parameter, the reporting interval defines the interval between reports + * of the current statistic evaluation value, and the collection interval + * defines the period of time which parameter values are collected for the + * statistic function. + * A consumer can create several links to the same parameter with different + * intervals, for example for the function "Mean", a consumer might + * define two links with different collection intervals, one for an hour (D0) + * and one for four hours (D1). The consumer might also specify the reporting + * interval of half an hour for the first link and two hours for the second + * link. This would mean that the service provider would produce reports as + * shown in Figure 3-10. + * --- timeline chart --- + * Example Statistic interval reporting + * If a statistic is defined to reset on collection interval expiration the + * currently calculated value, and any input collection of values, for the + * parameter being sampled is reset every collection interval, so if an hourly + * collection interval is defined for the function "Mean" then every + * hour the current mean average value is reset (this does not affect the + * value reported by the Parameter service itself or any other links for the + * same function and parameter), the set of values used to calculate that + * mean average is cleared, and a report is generated containing the final + * value of the function just before the reset. + * If a statistic is defined not to reset every collection interval, then + * the statistic maintains a moving evaluation for the collection interval. + * For example, if a collection interval of an hour is defined with a reset + * Boolean of FALSE for the function "Maximum" then the evaluation + * will hold the maximum value obtained in the last hour. + * The consumer is also able to define the sampling interval of the parameter + * for a link. This is independent of both the collection interval and the + * reporting interval. It makes sense for the sampling interval to be smaller + * than both the collection and reporting interval however it is perfectly + * possible to specify other values, as this is a deployment decision. + * For the statistic service, the list of possible statistics functions is + * deployment-dependent, as any function would have to be implemented in the + * service provider. There are no operations for the creation, modification, + * or deletion of the statistic functions. The statistic service defines the + * evaluation of minimum, maximum, mean, and standard deviation functions, + * however the service supports the addition of other statistical functions + * by implementations. + * NOTE: To ensure deterministic behaviour, implementations should endeavour + * to respect Nyquist�s theorem. +*/ +package org.ccsds.moims.mo.mc.statistic; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/provider/MonitorStatisticsPublisher.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/provider/MonitorStatisticsPublisher.java new file mode 100644 index 00000000..55cba01e --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/provider/MonitorStatisticsPublisher.java @@ -0,0 +1,125 @@ +package org.ccsds.moims.mo.mc.statistic.provider; + +/** + * Publisher class for the monitorStatistics operation. + */ +public final class MonitorStatisticsPublisher { + + /** + * The publisherSet field. + */ + private org.ccsds.moims.mo.mal.provider.MALPublisherSet publisherSet; + + /** + * Creates an instance of this class using the supplied publisher set. + * + * @param publisherSet The set of broker connections to use when registering and publishing. + */ + public MonitorStatisticsPublisher(org.ccsds.moims.mo.mal.provider.MALPublisherSet publisherSet) { + this.publisherSet = publisherSet; + } + + /** + * Registers this provider implementation to the set of broker connections. + * + * @param keyNames The key names to use in the method + * @param keyTypes The key types to use in the method + * @param listener The listener object to use for callback from the publisher + * @throws java.lang.IllegalArgumentException If any supplied argument is invalid + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void register(org.ccsds.moims.mo.mal.structures.IdentifierList keyNames, + org.ccsds.moims.mo.mal.structures.AttributeTypeList keyTypes, + org.ccsds.moims.mo.mal.provider.MALPublishInteractionListener listener) throws java.lang.IllegalArgumentException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + publisherSet.register(keyNames, keyTypes, listener); + } + + /** + * Registers this provider implementation to the set of broker connections + * with the default subscription keys. + * + * @param listener The listener object to use for callback from the publisher + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void registerWithDefaultKeys(org.ccsds.moims.mo.mal.provider.MALPublishInteractionListener listener) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + org.ccsds.moims.mo.mal.structures.IdentifierList keyNames = new org.ccsds.moims.mo.mal.structures.IdentifierList(); + org.ccsds.moims.mo.mal.structures.AttributeTypeList keyTypes = new org.ccsds.moims.mo.mal.structures.AttributeTypeList(); + publisherSet.register(keyNames, keyTypes, listener); + } + + /** + * Asynchronously registers this provider implementation to the set of broker + * connections. + * + * @param keyNames The key names to use in the method + * @param keyTypes The key types to use in the method + * @param listener The listener object to use for callback from the publisher + * @throws java.lang.IllegalArgumentException If any supplied argument is invalid + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void asyncRegister(org.ccsds.moims.mo.mal.structures.IdentifierList keyNames, + org.ccsds.moims.mo.mal.structures.AttributeTypeList keyTypes, + org.ccsds.moims.mo.mal.provider.MALPublishInteractionListener listener) throws java.lang.IllegalArgumentException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + publisherSet.asyncRegister(keyNames, keyTypes, listener); + } + + /** + * Publishes updates to the set of registered broker connections. + * + * @param updateHeader The headers of the updates being added + * @param relatedId The MAL EntityKey.firstSubKey shall contain the statistic function name. +The MAL EntityKey.secondSubKey shall contain the StatisticLink object instance identifier. +The MAL EntityKey.thirdSubKey shall contain the ParameterIdentity object instance identifier. +The MAL EntityKey.fourthSubKey shall contain the new StatisticValueInstance object instance identifier. +The timestamp of the StatisticValueInstance report shall be taken from the publish message. +The related link of the update shall be held in the relatedId field. + * @param sourceId The source link of the StatisticValueInstance shall be held in the sourceId field. +If no source link is needed then the sourceId shall be set to NULL. + * @param statisticValue The second part of the publish message shall be the StatisticValueInstance object value. + * @throws java.lang.IllegalArgumentException If any supplied argument is invalid + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void publish(org.ccsds.moims.mo.mal.structures.UpdateHeader updateHeader, + Long relatedId, + org.ccsds.moims.mo.com.structures.ObjectId sourceId, + org.ccsds.moims.mo.mc.statistic.structures.StatisticValue statisticValue) throws java.lang.IllegalArgumentException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + publisherSet.publish(updateHeader, relatedId, sourceId, statisticValue); + } + + /** + * Deregisters this provider implementation from the set of broker connections. + * + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void deregister() throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + publisherSet.deregister(); + } + + /** + * Asynchronously deregisters this provider implementation from the set of + * broker connections. + * + * @param listener The listener object to use for callback from the publisher + * @throws java.lang.IllegalArgumentException If any supplied argument is invalid + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void asyncDeregister(org.ccsds.moims.mo.mal.provider.MALPublishInteractionListener listener) throws java.lang.IllegalArgumentException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + publisherSet.asyncDeregister(listener); + } + + /** + * Closes this publisher. + * + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void close() throws org.ccsds.moims.mo.mal.MALException { + publisherSet.close(); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/provider/StatisticHandler.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/provider/StatisticHandler.java new file mode 100644 index 00000000..3f9b7485 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/provider/StatisticHandler.java @@ -0,0 +1,185 @@ +package org.ccsds.moims.mo.mc.statistic.provider; + +/** + * Interface that providers of the Statistic service must implement to handle + * the operations of that service. + */ +public interface StatisticHandler { + + /** + * Implements the operation getStatistics. + * + * @param funcObjInstIds The funcObjInstIds field shall include a list of StatisticFunction object instance identifiers to match. +The funcObjInstIds field shall support the wildcard value of '0' and will match all functions of the provider. +The wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made. + * @param isGroup isGroup Argument number 1 as defined by the service operation + * @param paramObjInstIds If the isGroup field is TRUE then the paramObjInstIds field shall contain GroupIdentity object instance identifiers, otherwise the field shall contain ParameterIdentity object instance identifiers. +If the isGroup field is TRUE, the requested Group, or the Group objects referenced by that Group, must contain ParameterIdentity objects otherwise an INVALID error shall be returned. +The ParameterIdentity objects referenced, either directly or indirectly via groups, by the paramObjInstIds field shall be the parameters to match. +The paramObjInstIds field shall support the wildcard value of '0' and matches all parameters of the provider matched to the functions given in the funcObjInstIds field. +The wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made. +If a requested function, group or parameters is unknown then an UNKNOWN error shall be returned. +The sets of matched StatisticFunction objects and ParameterIdentity objects shall be matched to the set of existing StatisticLink objects to determine which StatisticLink objects to report on. + * @param interaction The MAL object representing the interaction in the provider. + * @return The return value of the operation + * @throws org.ccsds.moims.mo.mal.UnknownException One or more of the requested groups or parameters do not exist in the provider or statistic functions is not supported by the provider. + * @throws org.ccsds.moims.mo.com.InvalidException One of the supplied groups is not a group of groups or ParameterIdentity objects. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + org.ccsds.moims.mo.mc.statistic.structures.StatisticEvaluationReportList getStatistics(org.ccsds.moims.mo.mal.structures.LongList funcObjInstIds, + Boolean isGroup, + org.ccsds.moims.mo.com.structures.ObjectKeyList paramObjInstIds, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mal.UnknownException, org.ccsds.moims.mo.com.InvalidException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation resetEvaluation. + * + * @param isStatLinkGroup If the isStatLinkGroup field is TRUE then the objInstIds field shall contain GroupIdentity object instance identifiers, otherwise the field shall contain StatisticFunction object instance identifiers. +If the isStatLinkGroup field is TRUE, the requested Group, or the Group objects referenced by that Group, must contain StatisticLink objects otherwise an INVALID error shall be returned. +The StatisticLink objects referenced, either indirectly via statistic functions or indirectly via groups, by the objInstIds field shall be the StatisticLink objects to match. + * @param objInstIds The objInstIds field shall support the wildcard value of '0' and matches all StatisticLink objects of the provider. +The wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made. +If a requested function or group is unknown then an UNKNOWN error shall be returned. + * @param returnLatestEval If the returnLatestEval Boolean field is TRUE then the latest evaluation result for each of the matched links shall be returned before resetting, otherwise a NULL is returned. +If an error is raised then no resetting of evaluations shall be made as a result of this operation call. + * @param interaction The MAL object representing the interaction in the provider. + * @return The return value of the operation + * @throws org.ccsds.moims.mo.com.InvalidException One of the supplied groups is not a group of groups or StatisticLink objects. + * @throws org.ccsds.moims.mo.mal.UnknownException One or more of the requested groups or functions is unknown. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + org.ccsds.moims.mo.mc.statistic.structures.StatisticEvaluationReportList resetEvaluation(Boolean isStatLinkGroup, + org.ccsds.moims.mo.mal.structures.LongList objInstIds, + Boolean returnLatestEval, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.com.InvalidException, org.ccsds.moims.mo.mal.UnknownException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation enableService. + * + * @param enableService If enableService is set to TRUE the service shall be enabled and evaluation and reporting of statistics will be reset and commence. +If enableService is set to FALSE then all evaluation of statistics shall be suspended and no statistics will be reported. +If the enableService value matches the current enabled state of the service then no change shall be made and no error reported. Enabling an already enabled service has no effect. + * @param interaction The MAL object representing the interaction in the provider. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + void enableService(Boolean enableService, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation getServiceStatus. + * + * @param interaction The MAL object representing the interaction in the provider. + * @return The return value of the operation + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + Boolean getServiceStatus(org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation enableReporting. + * + * @param isGroupIds If the isGroupIds field is TRUE then the enableInstances field shall contain GroupIdentity object instance identifiers, otherwise the field contains StatisticFunction object instance identifiers. +If the isGroupIds field is TRUE, the requested Group, or the Group objects referenced by that Group, must contain StatisticLink objects otherwise an INVALID error shall be returned. +The StatisticLink objects referenced, either indirectly via StatisticFunction objects or indirectly via groups, by the enableInstances field shall be the StatisticLink objects to match. +The id of the enableInstances field shall support the wildcard value of '0' and matches all StatisticLink objects of the provider. +The service provider shall check for the wildcard value in the list of object instance identifiers in the enableInstances field first and if found no other checks of supplied object instance identifiers shall be made. +If the enableInstances field contains a value of TRUE then reports after the reporting and collection intervals for matching StatisticLink objects shall be generated, a value of FALSE requests that reports will not be generated. +No error shall be raised if the enableInstances Boolean value supplied is the same as the current reportingEnabled field for a StatisticLink object i.e. enabling an already enabled link will not result in an error. +If a requested StatisticFunction or GroupIdentity object is unknown then an UNKNOWN error shall be returned. +If an error is raised then no modifications shall be made as a result of this operation call. +The provider should create and store a new StatisticLinkDefinition object in the COM archive if the reportingEnabled field is changed. + * @param enableInstances If the generation of reports is being enabled, then the provider shall generate a report immediately and start the report interval from that report. + * @param interaction The MAL object representing the interaction in the provider. + * @throws org.ccsds.moims.mo.mal.UnknownException One or more of the requested StatisticFunction or Group objects is unknown. + * @throws org.ccsds.moims.mo.com.InvalidException One of the supplied groups is not a group of groups or StatisticLink objects. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + void enableReporting(Boolean isGroupIds, + org.ccsds.moims.mo.com.structures.InstanceBooleanPairList enableInstances, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mal.UnknownException, org.ccsds.moims.mo.com.InvalidException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation listParameterEvaluations. + * + * @param statObjInstIds The statObjInstIds field shall hold a list of StatisticFunction object instance identifiers to retrieve the StatisticLink object instance identifiers for. +The request may contain the wildcard value of '0' to return all supported statistic links. +The wildcard value should be checked for first, if found no other checks of supplied identifiers shall be made. +If a provided identifier does not include a wildcard and does not match an existing StatisticFunction object then this operation shall fail with an UNKNOWN error. + * @param interaction The MAL object representing the interaction in the provider. + * @return The return value of the operation + * @throws org.ccsds.moims.mo.mal.UnknownException One of the supplied identifiers is unknown. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + org.ccsds.moims.mo.mc.statistic.structures.StatisticLinkSummaryList listParameterEvaluations(org.ccsds.moims.mo.mal.structures.LongList statObjInstIds, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mal.UnknownException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation addParameterEvaluation. + * + * @param newDetails The newDetails field shall hold a StatisticCreationRequest for each new parameter to be sampled. +The statFuncInstId field of the StatisticCreationRequest shall reference the object instance identifier of the StatisticFunction to be used. +If the statFuncInstId field does not match an existing StatisticFunction then an UNKNOWN error shall be raised. +The parameterId shall reference the ParameterIdentity that the function is being applied to. +If the parameterId field does not match an existing ParameterIdentity then an UNKNOWN error shall be raised. +If the type of the matched parameter is not supported by the matched statistical function, for example Mean average of a String parameter, then an INVALID error shall be returned. +The samplingInterval field shall contain the sampling duration interval for the parameter. +If the supplied samplingInterval is not supported for the requested parameter then an INVALID error shall be returned. +If an error is raised then no new StatisticLink object shall be created and stored as a result of this operation call. +If no error is to be raised then StatisticLink and StatisticLinkDefinition objects shall be created for each function/parameter link and stored in the COM archive. +The referenced parameter shall be sampled immediately and the sampling, reporting and collection intervals started. + * @param interaction The MAL object representing the interaction in the provider. + * @return The return value of the operation + * @throws org.ccsds.moims.mo.com.InvalidException One or more of the supplied StatisticLink is either requesting an invalid sampling interval or invalid function for the request parameter. + * @throws org.ccsds.moims.mo.mal.UnknownException One of the requested StatisticLink objects references either an unknown StatisticFunction object or an unknown ParameterIdentity object. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + org.ccsds.moims.mo.mc.structures.ObjectInstancePairList addParameterEvaluation(org.ccsds.moims.mo.mc.statistic.structures.StatisticCreationRequestList newDetails, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.com.InvalidException, org.ccsds.moims.mo.mal.UnknownException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation updateParameterEvaluation. + * + * @param linkIds The linkIds field shall contain the object instance identifiers of the StatisticLink objects to be updated. +If the linkIds list contains either NULL or '0' an INVALID error shall be raised. +The supplied object instance identifiers shall match existing link objects, an UNKNOWN error shall be raised if this is not the case. +If the supplied samplingInterval is not supported for the requested parameter then an INVALID error shall be returned. + * @param newDetails The newDetails field shall contain the replacement StatisticLinkDetails. +The two lists shall be ordered the same. +The number of entries in the two lists shall be the same size otherwise an INVALID error shall be returned. +If an error is raised then no links shall be updated as a result of this operation call. +The provider shall create a new StatisticLinkDefinition object and store it in the COM archive. +If any of the intervals are updated then the service shall reset the relevant timer and use the new intervals immediately. + * @param interaction The MAL object representing the interaction in the provider. + * @return The return value of the operation + * @throws org.ccsds.moims.mo.mal.UnknownException One or more of the supplied StatisticLink object instance identifiers is unknown. + * @throws org.ccsds.moims.mo.com.InvalidException One or more of the supplied object instance identifiers list contains either a NULL or '0' or is requesting an invalid sampling interval for the request parameter or the two supplied lists are not the same length. +If the two lists are not the same length then the extra information field shall contain the first index of the element in the largest list which does not have corresponding element in the other list. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + org.ccsds.moims.mo.mal.structures.LongList updateParameterEvaluation(org.ccsds.moims.mo.mal.structures.LongList linkIds, + org.ccsds.moims.mo.mc.statistic.structures.StatisticLinkDetailsList newDetails, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mal.UnknownException, org.ccsds.moims.mo.com.InvalidException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation removeParameterEvaluation. + * + * @param objInstIds The objInstIds field holds the object instance identifiers of the StatisticLink objects to be removed from the provider. +The list may contain the wildcard value of '0'. +The wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made. +If a provided StatisticLink object instance identifier does not include a wildcard and does not match an existing StatisticLink object then this operation shall fail with an UNKNOWN error. +Matched StatisticLink objects shall not be removed from the COM archive only the list of evaluated StatisticLink objects in the provider. +If an error is raised then no StatisticLink objects shall be removed as a result of this operation call. +If the operation succeeds then the provider shall not evaluate those parameter/function definition combinations for the deleted StatisticLink objects anymore. + * @param interaction The MAL object representing the interaction in the provider. + * @throws org.ccsds.moims.mo.mal.UnknownException One or more of the supplied StatisticLink object instance identifiers is unknown. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + void removeParameterEvaluation(org.ccsds.moims.mo.mal.structures.LongList objInstIds, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mal.UnknownException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Sets the skeleton to be used for creation of publishers. + * + * @param skeleton The skeleton to be used. + */ + void setSkeleton(org.ccsds.moims.mo.mc.statistic.provider.StatisticSkeleton skeleton); +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/provider/StatisticInheritanceSkeleton.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/provider/StatisticInheritanceSkeleton.java new file mode 100644 index 00000000..7e10eb8f --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/provider/StatisticInheritanceSkeleton.java @@ -0,0 +1,165 @@ +package org.ccsds.moims.mo.mc.statistic.provider; + +/** + * Provider Inheritance skeleton for StatisticInheritanceSkeleton service. + */ +public abstract class StatisticInheritanceSkeleton implements org.ccsds.moims.mo.mal.provider.MALInteractionHandler, org.ccsds.moims.mo.mc.statistic.provider.StatisticSkeleton, org.ccsds.moims.mo.mc.statistic.provider.StatisticHandler { + + /** + * The providerSet field. + */ + private org.ccsds.moims.mo.mal.provider.MALProviderSet providerSet = new org.ccsds.moims.mo.mal.provider.MALProviderSet(org.ccsds.moims.mo.mc.statistic.StatisticHelper.STATISTIC_SERVICE); + + /** + * Returns the connection object for this provider. + * + * @return the connection object for this provider + * @throws java.io.IOException if the method was not implemented yet. + */ + public org.ccsds.moims.mo.mal.helpertools.connections.ConnectionProvider getConnection() throws java.io.IOException { + throw new java.io.IOException("This method needs to be overridden!"); + } + + @Override + public void setSkeleton(org.ccsds.moims.mo.mc.statistic.provider.StatisticSkeleton skeleton) { + // Not used in the inheritance pattern (the skeleton is 'this'); + } + + @Override + public void malInitialize(org.ccsds.moims.mo.mal.provider.MALProvider provider) throws org.ccsds.moims.mo.mal.MALException { + providerSet.addProvider(provider); + } + + @Override + public void malFinalize(org.ccsds.moims.mo.mal.provider.MALProvider provider) throws org.ccsds.moims.mo.mal.MALException { + providerSet.removeProvider(provider); + } + + @Override + public org.ccsds.moims.mo.mc.statistic.provider.MonitorStatisticsPublisher createMonitorStatisticsPublisher(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.Identifier networkZone, + org.ccsds.moims.mo.mal.structures.SessionType sessionType, + org.ccsds.moims.mo.mal.structures.Identifier sessionName, + org.ccsds.moims.mo.mal.structures.QoSLevel qos, + java.util.Map qosProps, + org.ccsds.moims.mo.mal.structures.UInteger priority) throws org.ccsds.moims.mo.mal.MALException { + return new org.ccsds.moims.mo.mc.statistic.provider.MonitorStatisticsPublisher(providerSet.createPublisherSet(org.ccsds.moims.mo.mc.statistic.StatisticServiceInfo.MONITORSTATISTICS_OP, domain, sessionType, sessionName, qos, qosProps, null)); + } + + @Override + public void handleSend(org.ccsds.moims.mo.mal.provider.MALInteraction interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + switch (opNumber) { + default: + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } + + @Override + public void handleSubmit(org.ccsds.moims.mo.mal.provider.MALSubmit interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + try { + switch (opNumber) { + case org.ccsds.moims.mo.mc.statistic.StatisticServiceInfo._ENABLESERVICE_OP_NUMBER: + enableService((body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.Union(Boolean.FALSE)) == null) ? null : ((org.ccsds.moims.mo.mal.structures.Union) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.Union(Boolean.FALSE))).getBooleanValue(), + interaction); + interaction.sendAcknowledgement(); + break; + case org.ccsds.moims.mo.mc.statistic.StatisticServiceInfo._ENABLEREPORTING_OP_NUMBER: + enableReporting((body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.Union(Boolean.FALSE)) == null) ? null : ((org.ccsds.moims.mo.mal.structures.Union) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.Union(Boolean.FALSE))).getBooleanValue(), + (org.ccsds.moims.mo.com.structures.InstanceBooleanPairList) body.getBodyElement(1, new org.ccsds.moims.mo.com.structures.InstanceBooleanPairList()), + interaction); + interaction.sendAcknowledgement(); + break; + case org.ccsds.moims.mo.mc.statistic.StatisticServiceInfo._REMOVEPARAMETEREVALUATION_OP_NUMBER: + removeParameterEvaluation((org.ccsds.moims.mo.mal.structures.LongList) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.LongList()), + interaction); + interaction.sendAcknowledgement(); + break; + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } catch (org.ccsds.moims.mo.mal.MOErrorException error) { + throw new org.ccsds.moims.mo.mal.MALInteractionException(error); + } + } + + @Override + public void handleRequest(org.ccsds.moims.mo.mal.provider.MALRequest interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + try { + switch (opNumber) { + case org.ccsds.moims.mo.mc.statistic.StatisticServiceInfo._GETSTATISTICS_OP_NUMBER: + interaction.sendResponse(getStatistics((org.ccsds.moims.mo.mal.structures.LongList) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.LongList()), + (body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.Union(Boolean.FALSE)) == null) ? null : ((org.ccsds.moims.mo.mal.structures.Union) body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.Union(Boolean.FALSE))).getBooleanValue(), + (org.ccsds.moims.mo.com.structures.ObjectKeyList) body.getBodyElement(2, new org.ccsds.moims.mo.com.structures.ObjectKeyList()), + interaction)); + break; + case org.ccsds.moims.mo.mc.statistic.StatisticServiceInfo._RESETEVALUATION_OP_NUMBER: + interaction.sendResponse(resetEvaluation((body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.Union(Boolean.FALSE)) == null) ? null : ((org.ccsds.moims.mo.mal.structures.Union) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.Union(Boolean.FALSE))).getBooleanValue(), + (org.ccsds.moims.mo.mal.structures.LongList) body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.LongList()), + (body.getBodyElement(2, new org.ccsds.moims.mo.mal.structures.Union(Boolean.FALSE)) == null) ? null : ((org.ccsds.moims.mo.mal.structures.Union) body.getBodyElement(2, new org.ccsds.moims.mo.mal.structures.Union(Boolean.FALSE))).getBooleanValue(), + interaction)); + break; + case org.ccsds.moims.mo.mc.statistic.StatisticServiceInfo._GETSERVICESTATUS_OP_NUMBER: + Boolean getServiceStatusRt = getServiceStatus(interaction); + interaction.sendResponse((getServiceStatusRt == null) ? null : new org.ccsds.moims.mo.mal.structures.Union(getServiceStatusRt)); + break; + case org.ccsds.moims.mo.mc.statistic.StatisticServiceInfo._LISTPARAMETEREVALUATIONS_OP_NUMBER: + interaction.sendResponse(listParameterEvaluations((org.ccsds.moims.mo.mal.structures.LongList) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.LongList()), + interaction)); + break; + case org.ccsds.moims.mo.mc.statistic.StatisticServiceInfo._ADDPARAMETEREVALUATION_OP_NUMBER: + interaction.sendResponse(addParameterEvaluation((org.ccsds.moims.mo.mc.statistic.structures.StatisticCreationRequestList) body.getBodyElement(0, new org.ccsds.moims.mo.mc.statistic.structures.StatisticCreationRequestList()), + interaction)); + break; + case org.ccsds.moims.mo.mc.statistic.StatisticServiceInfo._UPDATEPARAMETEREVALUATION_OP_NUMBER: + interaction.sendResponse(updateParameterEvaluation((org.ccsds.moims.mo.mal.structures.LongList) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.LongList()), + (org.ccsds.moims.mo.mc.statistic.structures.StatisticLinkDetailsList) body.getBodyElement(1, new org.ccsds.moims.mo.mc.statistic.structures.StatisticLinkDetailsList()), + interaction)); + break; + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } catch (org.ccsds.moims.mo.mal.MOErrorException error) { + throw new org.ccsds.moims.mo.mal.MALInteractionException(error); + } + } + + @Override + public void handleInvoke(org.ccsds.moims.mo.mal.provider.MALInvoke interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + switch (opNumber) { + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } + + @Override + public void handleProgress(org.ccsds.moims.mo.mal.provider.MALProgress interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + switch (opNumber) { + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/provider/StatisticSkeleton.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/provider/StatisticSkeleton.java new file mode 100644 index 00000000..f32e0a94 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/provider/StatisticSkeleton.java @@ -0,0 +1,29 @@ +package org.ccsds.moims.mo.mc.statistic.provider; + +/** + * The skeleton interface for the Statistic service. + */ +public interface StatisticSkeleton { + + /** + * Creates a publisher object using the current registered provider set for + * the PubSub operation monitorStatistics. + * + * @param domain The domain used for publishing + * @param networkZone ~The network zone used for publishing + * @param sessionType The session used for publishing + * @param sessionName The session name used for publishing + * @param qos The QoS used for publishing + * @param qosProps The QoS properties used for publishing + * @param priority The priority used for publishing + * @return The new publisher object. + * @throws org.ccsds.moims.mo.mal.MALException if a problem is detected during creation of the publisher + */ + org.ccsds.moims.mo.mc.statistic.provider.MonitorStatisticsPublisher createMonitorStatisticsPublisher(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.Identifier networkZone, + org.ccsds.moims.mo.mal.structures.SessionType sessionType, + org.ccsds.moims.mo.mal.structures.Identifier sessionName, + org.ccsds.moims.mo.mal.structures.QoSLevel qos, + java.util.Map qosProps, + org.ccsds.moims.mo.mal.structures.UInteger priority) throws org.ccsds.moims.mo.mal.MALException; +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/provider/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/provider/package-info.java new file mode 100644 index 00000000..f84a228e --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/provider/package-info.java @@ -0,0 +1,4 @@ +/** + * Package containing the provider skeletons for the Statistic service. +*/ +package org.ccsds.moims.mo.mc.statistic.provider; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/structures/StatisticCreationRequest.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/structures/StatisticCreationRequest.java new file mode 100644 index 00000000..2f67d036 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/structures/StatisticCreationRequest.java @@ -0,0 +1,173 @@ +package org.ccsds.moims.mo.mc.statistic.structures; + +/** + * The StatisticCreationRequest structure holds the link details for a specific + * parameter and function association. + */ +public final class StatisticCreationRequest implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1125921398456324L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125921398456324L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * The object instance identifier of the statistical function to be used. + */ + private Long statFuncInstId; + + /** + * The object key of the ParameterIdentity object being referenced. + */ + private org.ccsds.moims.mo.com.structures.ObjectKey parameterId; + + /** + * The collection, reporting, and sampling intervals. + */ + private org.ccsds.moims.mo.mc.statistic.structures.StatisticLinkDetails linkDetails; + + /** + * Default constructor for StatisticCreationRequest. + * + */ + public StatisticCreationRequest() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param statFuncInstId The object instance identifier of the statistical function to be used. + * @param parameterId The object key of the ParameterIdentity object being referenced. + * @param linkDetails The collection, reporting, and sampling intervals. + */ + public StatisticCreationRequest(Long statFuncInstId, + org.ccsds.moims.mo.com.structures.ObjectKey parameterId, + org.ccsds.moims.mo.mc.statistic.structures.StatisticLinkDetails linkDetails) { + this.statFuncInstId = statFuncInstId; + this.parameterId = parameterId; + this.linkDetails = linkDetails; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mc.statistic.structures.StatisticCreationRequest(); + } + + /** + * Returns the field statFuncInstId. + * + * @return The field statFuncInstId + */ + public Long getStatFuncInstId() { + return statFuncInstId; + } + + /** + * Returns the field parameterId. + * + * @return The field parameterId + */ + public org.ccsds.moims.mo.com.structures.ObjectKey getParameterId() { + return parameterId; + } + + /** + * Returns the field linkDetails. + * + * @return The field linkDetails + */ + public org.ccsds.moims.mo.mc.statistic.structures.StatisticLinkDetails getLinkDetails() { + return linkDetails; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof StatisticCreationRequest) { + StatisticCreationRequest other = (StatisticCreationRequest) obj; + if (statFuncInstId == null) { + if (other.statFuncInstId != null) { + return false; + } + } else { + if (! statFuncInstId.equals(other.statFuncInstId)) { + return false; + } + } + if (parameterId == null) { + if (other.parameterId != null) { + return false; + } + } else { + if (! parameterId.equals(other.parameterId)) { + return false; + } + } + if (linkDetails == null) { + if (other.linkDetails != null) { + return false; + } + } else { + if (! linkDetails.equals(other.linkDetails)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (statFuncInstId != null ? statFuncInstId.hashCode() : 0); + hash = 83 * hash + (parameterId != null ? parameterId.hashCode() : 0); + hash = 83 * hash + (linkDetails != null ? linkDetails.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(StatisticCreationRequest: "); + buf.append("statFuncInstId=").append(statFuncInstId); + buf.append(", parameterId=").append(parameterId); + buf.append(", linkDetails=").append(linkDetails); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (statFuncInstId == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'statFuncInstId' cannot be null!"); + } + if (parameterId == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'parameterId' cannot be null!"); + } + if (linkDetails == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'linkDetails' cannot be null!"); + } + encoder.encodeLong(statFuncInstId); + encoder.encodeElement(parameterId); + encoder.encodeElement(linkDetails); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + statFuncInstId = decoder.decodeLong(); + parameterId = (org.ccsds.moims.mo.com.structures.ObjectKey) decoder.decodeElement(new org.ccsds.moims.mo.com.structures.ObjectKey()); + linkDetails = (org.ccsds.moims.mo.mc.statistic.structures.StatisticLinkDetails) decoder.decodeElement(new org.ccsds.moims.mo.mc.statistic.structures.StatisticLinkDetails()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/structures/StatisticCreationRequestList.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/structures/StatisticCreationRequestList.java new file mode 100644 index 00000000..5469ab71 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/structures/StatisticCreationRequestList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mc.statistic.structures; + +/** + * List class for StatisticCreationRequest. + */ +public final class StatisticCreationRequestList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1125921415233532L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125921415233532L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for StatisticCreationRequestList. + * + */ + public StatisticCreationRequestList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public StatisticCreationRequestList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public StatisticCreationRequestList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mc.statistic.structures.StatisticCreationRequest element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mc.statistic.structures.StatisticCreationRequest element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new StatisticCreationRequestList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mc.statistic.structures.StatisticCreationRequest(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/structures/StatisticEvaluationReport.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/structures/StatisticEvaluationReport.java new file mode 100644 index 00000000..05f21557 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/structures/StatisticEvaluationReport.java @@ -0,0 +1,139 @@ +package org.ccsds.moims.mo.mc.statistic.structures; + +/** + * The StatisticEvaluationReport structure holds the set of statistical results. + */ +public final class StatisticEvaluationReport implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1125921398456326L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125921398456326L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * The statistic link object instance identifier. + */ + private Long linkId; + + /** + * The statistical evaluation value. + */ + private org.ccsds.moims.mo.mc.statistic.structures.StatisticValue value; + + /** + * Default constructor for StatisticEvaluationReport. + * + */ + public StatisticEvaluationReport() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param linkId The statistic link object instance identifier. + * @param value The statistical evaluation value. + */ + public StatisticEvaluationReport(Long linkId, + org.ccsds.moims.mo.mc.statistic.structures.StatisticValue value) { + this.linkId = linkId; + this.value = value; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mc.statistic.structures.StatisticEvaluationReport(); + } + + /** + * Returns the field linkId. + * + * @return The field linkId + */ + public Long getLinkId() { + return linkId; + } + + /** + * Returns the field value. + * + * @return The field value + */ + public org.ccsds.moims.mo.mc.statistic.structures.StatisticValue getValue() { + return value; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof StatisticEvaluationReport) { + StatisticEvaluationReport other = (StatisticEvaluationReport) obj; + if (linkId == null) { + if (other.linkId != null) { + return false; + } + } else { + if (! linkId.equals(other.linkId)) { + return false; + } + } + if (value == null) { + if (other.value != null) { + return false; + } + } else { + if (! value.equals(other.value)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (linkId != null ? linkId.hashCode() : 0); + hash = 83 * hash + (value != null ? value.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(StatisticEvaluationReport: "); + buf.append("linkId=").append(linkId); + buf.append(", value=").append(value); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (linkId == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'linkId' cannot be null!"); + } + if (value == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'value' cannot be null!"); + } + encoder.encodeLong(linkId); + encoder.encodeElement(value); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + linkId = decoder.decodeLong(); + value = (org.ccsds.moims.mo.mc.statistic.structures.StatisticValue) decoder.decodeElement(new org.ccsds.moims.mo.mc.statistic.structures.StatisticValue()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/structures/StatisticEvaluationReportList.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/structures/StatisticEvaluationReportList.java new file mode 100644 index 00000000..721cb8c6 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/structures/StatisticEvaluationReportList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mc.statistic.structures; + +/** + * List class for StatisticEvaluationReport. + */ +public final class StatisticEvaluationReportList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1125921415233530L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125921415233530L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for StatisticEvaluationReportList. + * + */ + public StatisticEvaluationReportList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public StatisticEvaluationReportList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public StatisticEvaluationReportList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mc.statistic.structures.StatisticEvaluationReport element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mc.statistic.structures.StatisticEvaluationReport element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new StatisticEvaluationReportList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mc.statistic.structures.StatisticEvaluationReport(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/structures/StatisticFunctionDetails.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/structures/StatisticFunctionDetails.java new file mode 100644 index 00000000..b0b17fbf --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/structures/StatisticFunctionDetails.java @@ -0,0 +1,139 @@ +package org.ccsds.moims.mo.mc.statistic.structures; + +/** + * The StatisticFunctionDetails structure holds the details of the function. + */ +public final class StatisticFunctionDetails implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1125921398456321L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125921398456321L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * The name of the statistical function. + */ + private org.ccsds.moims.mo.mal.structures.Identifier name; + + /** + * The description of the statistical function. + */ + private String description; + + /** + * Default constructor for StatisticFunctionDetails. + * + */ + public StatisticFunctionDetails() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param name The name of the statistical function. + * @param description The description of the statistical function. + */ + public StatisticFunctionDetails(org.ccsds.moims.mo.mal.structures.Identifier name, + String description) { + this.name = name; + this.description = description; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mc.statistic.structures.StatisticFunctionDetails(); + } + + /** + * Returns the field name. + * + * @return The field name + */ + public org.ccsds.moims.mo.mal.structures.Identifier getName() { + return name; + } + + /** + * Returns the field description. + * + * @return The field description + */ + public String getDescription() { + return description; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof StatisticFunctionDetails) { + StatisticFunctionDetails other = (StatisticFunctionDetails) obj; + if (name == null) { + if (other.name != null) { + return false; + } + } else { + if (! name.equals(other.name)) { + return false; + } + } + if (description == null) { + if (other.description != null) { + return false; + } + } else { + if (! description.equals(other.description)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (name != null ? name.hashCode() : 0); + hash = 83 * hash + (description != null ? description.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(StatisticFunctionDetails: "); + buf.append("name=").append(name); + buf.append(", description=").append(description); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (name == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'name' cannot be null!"); + } + if (description == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'description' cannot be null!"); + } + encoder.encodeIdentifier(name); + encoder.encodeString(description); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + name = decoder.decodeIdentifier(); + description = decoder.decodeString(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/structures/StatisticFunctionDetailsList.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/structures/StatisticFunctionDetailsList.java new file mode 100644 index 00000000..d4f6156d --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/structures/StatisticFunctionDetailsList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mc.statistic.structures; + +/** + * List class for StatisticFunctionDetails. + */ +public final class StatisticFunctionDetailsList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1125921415233535L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125921415233535L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for StatisticFunctionDetailsList. + * + */ + public StatisticFunctionDetailsList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public StatisticFunctionDetailsList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public StatisticFunctionDetailsList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mc.statistic.structures.StatisticFunctionDetails element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mc.statistic.structures.StatisticFunctionDetails element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new StatisticFunctionDetailsList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mc.statistic.structures.StatisticFunctionDetails(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/structures/StatisticLinkDetails.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/structures/StatisticLinkDetails.java new file mode 100644 index 00000000..93ea14b7 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/structures/StatisticLinkDetails.java @@ -0,0 +1,278 @@ +package org.ccsds.moims.mo.mc.statistic.structures; + +/** + * The StatisticLinkDetails structure holds the sampling, reporting, and collection + * intervals for one parameter statistic function link. + */ +public final class StatisticLinkDetails implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1125921398456322L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125921398456322L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * The interval between samples of the parameter. + */ + private org.ccsds.moims.mo.mal.structures.Duration samplingInterval; + + /** + * The interval between periodic reports being generated. If set to "0", + * then no periodic reports shall be sent. + */ + private org.ccsds.moims.mo.mal.structures.Duration reportingInterval; + + /** + * The collection and reset interval of the statistical evaluation for the + * linked parameter. If set to "0", then no periodic reset of the + * evaluation shall be performed. + */ + private org.ccsds.moims.mo.mal.structures.Duration collectionInterval; + + /** + * If TRUE the evaluation will reset its value every collection interval. + * If FALSE it will maintain a moving evaluation of the function for the collection + * interval. + */ + private Boolean resetEveryCollection; + + /** + * TRUE if reporting of the evaluation instance is enabled. + */ + private Boolean reportingEnabled; + + /** + * If TRUE then use the converted value of the Parameter, else use the raw + * value. + */ + private Boolean useConverted; + + /** + * Default constructor for StatisticLinkDetails. + * + */ + public StatisticLinkDetails() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param samplingInterval The interval between samples of the parameter. + * @param reportingInterval The interval between periodic reports being generated. If set to '0', then no periodic reports shall be sent. + * @param collectionInterval The collection and reset interval of the statistical evaluation for the linked parameter. If set to '0', then no periodic reset of the evaluation shall be performed. + * @param resetEveryCollection If TRUE the evaluation will reset its value every collection interval. If FALSE it will maintain a moving evaluation of the function for the collection interval. + * @param reportingEnabled TRUE if reporting of the evaluation instance is enabled. + * @param useConverted If TRUE then use the converted value of the Parameter, else use the raw value + */ + public StatisticLinkDetails(org.ccsds.moims.mo.mal.structures.Duration samplingInterval, + org.ccsds.moims.mo.mal.structures.Duration reportingInterval, + org.ccsds.moims.mo.mal.structures.Duration collectionInterval, + Boolean resetEveryCollection, + Boolean reportingEnabled, + Boolean useConverted) { + this.samplingInterval = samplingInterval; + this.reportingInterval = reportingInterval; + this.collectionInterval = collectionInterval; + this.resetEveryCollection = resetEveryCollection; + this.reportingEnabled = reportingEnabled; + this.useConverted = useConverted; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mc.statistic.structures.StatisticLinkDetails(); + } + + /** + * Returns the field samplingInterval. + * + * @return The field samplingInterval + */ + public org.ccsds.moims.mo.mal.structures.Duration getSamplingInterval() { + return samplingInterval; + } + + /** + * Returns the field reportingInterval. + * + * @return The field reportingInterval + */ + public org.ccsds.moims.mo.mal.structures.Duration getReportingInterval() { + return reportingInterval; + } + + /** + * Returns the field collectionInterval. + * + * @return The field collectionInterval + */ + public org.ccsds.moims.mo.mal.structures.Duration getCollectionInterval() { + return collectionInterval; + } + + /** + * Returns the field resetEveryCollection. + * + * @return The field resetEveryCollection + */ + public Boolean getResetEveryCollection() { + return resetEveryCollection; + } + + /** + * Returns the field reportingEnabled. + * + * @return The field reportingEnabled + */ + public Boolean getReportingEnabled() { + return reportingEnabled; + } + + /** + * Returns the field useConverted. + * + * @return The field useConverted + */ + public Boolean getUseConverted() { + return useConverted; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof StatisticLinkDetails) { + StatisticLinkDetails other = (StatisticLinkDetails) obj; + if (samplingInterval == null) { + if (other.samplingInterval != null) { + return false; + } + } else { + if (! samplingInterval.equals(other.samplingInterval)) { + return false; + } + } + if (reportingInterval == null) { + if (other.reportingInterval != null) { + return false; + } + } else { + if (! reportingInterval.equals(other.reportingInterval)) { + return false; + } + } + if (collectionInterval == null) { + if (other.collectionInterval != null) { + return false; + } + } else { + if (! collectionInterval.equals(other.collectionInterval)) { + return false; + } + } + if (resetEveryCollection == null) { + if (other.resetEveryCollection != null) { + return false; + } + } else { + if (! resetEveryCollection.equals(other.resetEveryCollection)) { + return false; + } + } + if (reportingEnabled == null) { + if (other.reportingEnabled != null) { + return false; + } + } else { + if (! reportingEnabled.equals(other.reportingEnabled)) { + return false; + } + } + if (useConverted == null) { + if (other.useConverted != null) { + return false; + } + } else { + if (! useConverted.equals(other.useConverted)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (samplingInterval != null ? samplingInterval.hashCode() : 0); + hash = 83 * hash + (reportingInterval != null ? reportingInterval.hashCode() : 0); + hash = 83 * hash + (collectionInterval != null ? collectionInterval.hashCode() : 0); + hash = 83 * hash + (resetEveryCollection != null ? resetEveryCollection.hashCode() : 0); + hash = 83 * hash + (reportingEnabled != null ? reportingEnabled.hashCode() : 0); + hash = 83 * hash + (useConverted != null ? useConverted.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(StatisticLinkDetails: "); + buf.append("samplingInterval=").append(samplingInterval); + buf.append(", reportingInterval=").append(reportingInterval); + buf.append(", collectionInterval=").append(collectionInterval); + buf.append(", resetEveryCollection=").append(resetEveryCollection); + buf.append(", reportingEnabled=").append(reportingEnabled); + buf.append(", useConverted=").append(useConverted); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (samplingInterval == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'samplingInterval' cannot be null!"); + } + if (reportingInterval == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'reportingInterval' cannot be null!"); + } + if (collectionInterval == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'collectionInterval' cannot be null!"); + } + if (resetEveryCollection == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'resetEveryCollection' cannot be null!"); + } + if (reportingEnabled == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'reportingEnabled' cannot be null!"); + } + if (useConverted == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'useConverted' cannot be null!"); + } + encoder.encodeDuration(samplingInterval); + encoder.encodeDuration(reportingInterval); + encoder.encodeDuration(collectionInterval); + encoder.encodeBoolean(resetEveryCollection); + encoder.encodeBoolean(reportingEnabled); + encoder.encodeBoolean(useConverted); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + samplingInterval = decoder.decodeDuration(); + reportingInterval = decoder.decodeDuration(); + collectionInterval = decoder.decodeDuration(); + resetEveryCollection = decoder.decodeBoolean(); + reportingEnabled = decoder.decodeBoolean(); + useConverted = decoder.decodeBoolean(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/structures/StatisticLinkDetailsList.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/structures/StatisticLinkDetailsList.java new file mode 100644 index 00000000..2a3e4150 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/structures/StatisticLinkDetailsList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mc.statistic.structures; + +/** + * List class for StatisticLinkDetails. + */ +public final class StatisticLinkDetailsList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1125921415233534L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125921415233534L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for StatisticLinkDetailsList. + * + */ + public StatisticLinkDetailsList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public StatisticLinkDetailsList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public StatisticLinkDetailsList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mc.statistic.structures.StatisticLinkDetails element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mc.statistic.structures.StatisticLinkDetails element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new StatisticLinkDetailsList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mc.statistic.structures.StatisticLinkDetails(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/structures/StatisticLinkSummary.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/structures/StatisticLinkSummary.java new file mode 100644 index 00000000..df4b58ee --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/structures/StatisticLinkSummary.java @@ -0,0 +1,240 @@ +package org.ccsds.moims.mo.mc.statistic.structures; + +/** + * The StatisticLinkSummary structure holds the ids of a specific statistic + * link and the function and parameter it links to. + */ +public final class StatisticLinkSummary implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1125921398456325L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125921398456325L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * The object instance identifier of the StatisticFunction object. + */ + private Long funcId; + + /** + * The object instance identifier of the StatisticLink object. + */ + private Long linkId; + + /** + * The object instance identifier of the StatisticLinkDefinition object. + */ + private Long linkDefId; + + /** + * TRUE if reporting of the evaluation instance is enabled. + */ + private Boolean reportingEnabled; + + /** + * The object instance identifier of the ParameterIdentity object for the + * statistic link. + */ + private org.ccsds.moims.mo.com.structures.ObjectKey parameterId; + + /** + * Default constructor for StatisticLinkSummary. + * + */ + public StatisticLinkSummary() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param funcId The object instance identifier of the StatisticFunction object. + * @param linkId The object instance identifier of the StatisticLink object. + * @param linkDefId The object instance identifier of the StatisticLinkDefinition object. + * @param reportingEnabled TRUE if reporting of the evaluation instance is enabled. + * @param parameterId The object instance identifier of the ParameterIdentity object for the statistic link. + */ + public StatisticLinkSummary(Long funcId, + Long linkId, + Long linkDefId, + Boolean reportingEnabled, + org.ccsds.moims.mo.com.structures.ObjectKey parameterId) { + this.funcId = funcId; + this.linkId = linkId; + this.linkDefId = linkDefId; + this.reportingEnabled = reportingEnabled; + this.parameterId = parameterId; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mc.statistic.structures.StatisticLinkSummary(); + } + + /** + * Returns the field funcId. + * + * @return The field funcId + */ + public Long getFuncId() { + return funcId; + } + + /** + * Returns the field linkId. + * + * @return The field linkId + */ + public Long getLinkId() { + return linkId; + } + + /** + * Returns the field linkDefId. + * + * @return The field linkDefId + */ + public Long getLinkDefId() { + return linkDefId; + } + + /** + * Returns the field reportingEnabled. + * + * @return The field reportingEnabled + */ + public Boolean getReportingEnabled() { + return reportingEnabled; + } + + /** + * Returns the field parameterId. + * + * @return The field parameterId + */ + public org.ccsds.moims.mo.com.structures.ObjectKey getParameterId() { + return parameterId; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof StatisticLinkSummary) { + StatisticLinkSummary other = (StatisticLinkSummary) obj; + if (funcId == null) { + if (other.funcId != null) { + return false; + } + } else { + if (! funcId.equals(other.funcId)) { + return false; + } + } + if (linkId == null) { + if (other.linkId != null) { + return false; + } + } else { + if (! linkId.equals(other.linkId)) { + return false; + } + } + if (linkDefId == null) { + if (other.linkDefId != null) { + return false; + } + } else { + if (! linkDefId.equals(other.linkDefId)) { + return false; + } + } + if (reportingEnabled == null) { + if (other.reportingEnabled != null) { + return false; + } + } else { + if (! reportingEnabled.equals(other.reportingEnabled)) { + return false; + } + } + if (parameterId == null) { + if (other.parameterId != null) { + return false; + } + } else { + if (! parameterId.equals(other.parameterId)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (funcId != null ? funcId.hashCode() : 0); + hash = 83 * hash + (linkId != null ? linkId.hashCode() : 0); + hash = 83 * hash + (linkDefId != null ? linkDefId.hashCode() : 0); + hash = 83 * hash + (reportingEnabled != null ? reportingEnabled.hashCode() : 0); + hash = 83 * hash + (parameterId != null ? parameterId.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(StatisticLinkSummary: "); + buf.append("funcId=").append(funcId); + buf.append(", linkId=").append(linkId); + buf.append(", linkDefId=").append(linkDefId); + buf.append(", reportingEnabled=").append(reportingEnabled); + buf.append(", parameterId=").append(parameterId); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (funcId == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'funcId' cannot be null!"); + } + if (linkId == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'linkId' cannot be null!"); + } + if (linkDefId == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'linkDefId' cannot be null!"); + } + if (reportingEnabled == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'reportingEnabled' cannot be null!"); + } + if (parameterId == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'parameterId' cannot be null!"); + } + encoder.encodeLong(funcId); + encoder.encodeLong(linkId); + encoder.encodeLong(linkDefId); + encoder.encodeBoolean(reportingEnabled); + encoder.encodeElement(parameterId); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + funcId = decoder.decodeLong(); + linkId = decoder.decodeLong(); + linkDefId = decoder.decodeLong(); + reportingEnabled = decoder.decodeBoolean(); + parameterId = (org.ccsds.moims.mo.com.structures.ObjectKey) decoder.decodeElement(new org.ccsds.moims.mo.com.structures.ObjectKey()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/structures/StatisticLinkSummaryList.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/structures/StatisticLinkSummaryList.java new file mode 100644 index 00000000..6c7a1d18 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/structures/StatisticLinkSummaryList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mc.statistic.structures; + +/** + * List class for StatisticLinkSummary. + */ +public final class StatisticLinkSummaryList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1125921415233531L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125921415233531L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for StatisticLinkSummaryList. + * + */ + public StatisticLinkSummaryList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public StatisticLinkSummaryList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public StatisticLinkSummaryList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mc.statistic.structures.StatisticLinkSummary element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mc.statistic.structures.StatisticLinkSummary element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new StatisticLinkSummaryList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mc.statistic.structures.StatisticLinkSummary(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/structures/StatisticValue.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/structures/StatisticValue.java new file mode 100644 index 00000000..47bd98c2 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/structures/StatisticValue.java @@ -0,0 +1,286 @@ +package org.ccsds.moims.mo.mc.statistic.structures; + +/** + * The StatisticValue structure holds the statistical result for a parameter. + */ +public final class StatisticValue implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1125921398456323L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125921398456323L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * The object instance identifier of the ParameterDefinition object used for + * the parameter. + */ + private Long paramDefInstId; + + /** + * Time the statistic calculations started. This value can be NULL if the + * start time can be derived by other means, e.g., other start times in a + * set of StatisticValue structures. + */ + private org.ccsds.moims.mo.mal.structures.Time startTime; + + /** + * Time the statistic calculations ended. This value can be NULL if the time + * can be derived by other means, e.g., other times in a set of StatisticValue + * structures. + */ + private org.ccsds.moims.mo.mal.structures.Time endTime; + + /** + * Time the statistic value was reached. The time is only applicable for particular + * statistic values such as min or max. Shall be NULL if not applicable for + * cases such as "mean average". + */ + private org.ccsds.moims.mo.mal.structures.Time valueTime; + + /** + * Value of the statistic. + */ + private org.ccsds.moims.mo.mal.structures.Attribute value; + + /** + * Holds the number of samples that contributed to the statistic value. For + * calculated values such as "mean average" this holds the number + * of samples that were used to calculate the value, for non-calculated values + * such as "min" then it is the number of samples that were in the + * set evaluated. + */ + private org.ccsds.moims.mo.mal.structures.UInteger sampleCount; + + /** + * Default constructor for StatisticValue. + * + */ + public StatisticValue() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param paramDefInstId The object instance identifier of the ParameterDefinition object used for the parameter. + * @param startTime Time the statistic calculations started. This value can be NULL if the start time can be derived by other means, e.g., other start times in a set of StatisticValue structures. + * @param endTime Time the statistic calculations ended. This value can be NULL if the time can be derived by other means, e.g., other times in a set of StatisticValue structures. + * @param valueTime Time the statistic value was reached. The time is only applicable for particular statistic values such as min or max. Shall be NULL if not applicable for cases such as 'mean average'. + * @param value Value of the statistic. + * @param sampleCount Holds the number of samples that contributed to the statistic value. For calculated values such as 'mean average' this holds the number of samples that were used to calculate the value, for non-calculated values such as 'min' then it is the number of samples that were in the set evaluated. + */ + public StatisticValue(Long paramDefInstId, + org.ccsds.moims.mo.mal.structures.Time startTime, + org.ccsds.moims.mo.mal.structures.Time endTime, + org.ccsds.moims.mo.mal.structures.Time valueTime, + org.ccsds.moims.mo.mal.structures.Attribute value, + org.ccsds.moims.mo.mal.structures.UInteger sampleCount) { + this.paramDefInstId = paramDefInstId; + this.startTime = startTime; + this.endTime = endTime; + this.valueTime = valueTime; + this.value = value; + this.sampleCount = sampleCount; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param paramDefInstId The object instance identifier of the ParameterDefinition object used for the parameter. + * @param sampleCount Holds the number of samples that contributed to the statistic value. For calculated values such as 'mean average' this holds the number of samples that were used to calculate the value, for non-calculated values such as 'min' then it is the number of samples that were in the set evaluated. + */ + public StatisticValue(Long paramDefInstId, + org.ccsds.moims.mo.mal.structures.UInteger sampleCount) { + this.paramDefInstId = paramDefInstId; + this.startTime = null; + this.endTime = null; + this.valueTime = null; + this.value = null; + this.sampleCount = sampleCount; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mc.statistic.structures.StatisticValue(); + } + + /** + * Returns the field paramDefInstId. + * + * @return The field paramDefInstId + */ + public Long getParamDefInstId() { + return paramDefInstId; + } + + /** + * Returns the field startTime. + * + * @return The field startTime + */ + public org.ccsds.moims.mo.mal.structures.Time getStartTime() { + return startTime; + } + + /** + * Returns the field endTime. + * + * @return The field endTime + */ + public org.ccsds.moims.mo.mal.structures.Time getEndTime() { + return endTime; + } + + /** + * Returns the field valueTime. + * + * @return The field valueTime + */ + public org.ccsds.moims.mo.mal.structures.Time getValueTime() { + return valueTime; + } + + /** + * Returns the field value. + * + * @return The field value + */ + public org.ccsds.moims.mo.mal.structures.Attribute getValue() { + return value; + } + + /** + * Returns the field sampleCount. + * + * @return The field sampleCount + */ + public org.ccsds.moims.mo.mal.structures.UInteger getSampleCount() { + return sampleCount; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof StatisticValue) { + StatisticValue other = (StatisticValue) obj; + if (paramDefInstId == null) { + if (other.paramDefInstId != null) { + return false; + } + } else { + if (! paramDefInstId.equals(other.paramDefInstId)) { + return false; + } + } + if (startTime == null) { + if (other.startTime != null) { + return false; + } + } else { + if (! startTime.equals(other.startTime)) { + return false; + } + } + if (endTime == null) { + if (other.endTime != null) { + return false; + } + } else { + if (! endTime.equals(other.endTime)) { + return false; + } + } + if (valueTime == null) { + if (other.valueTime != null) { + return false; + } + } else { + if (! valueTime.equals(other.valueTime)) { + return false; + } + } + if (value == null) { + if (other.value != null) { + return false; + } + } else { + if (! value.equals(other.value)) { + return false; + } + } + if (sampleCount == null) { + if (other.sampleCount != null) { + return false; + } + } else { + if (! sampleCount.equals(other.sampleCount)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (paramDefInstId != null ? paramDefInstId.hashCode() : 0); + hash = 83 * hash + (startTime != null ? startTime.hashCode() : 0); + hash = 83 * hash + (endTime != null ? endTime.hashCode() : 0); + hash = 83 * hash + (valueTime != null ? valueTime.hashCode() : 0); + hash = 83 * hash + (value != null ? value.hashCode() : 0); + hash = 83 * hash + (sampleCount != null ? sampleCount.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(StatisticValue: "); + buf.append("paramDefInstId=").append(paramDefInstId); + buf.append(", startTime=").append(startTime); + buf.append(", endTime=").append(endTime); + buf.append(", valueTime=").append(valueTime); + buf.append(", value=").append(value); + buf.append(", sampleCount=").append(sampleCount); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (paramDefInstId == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'paramDefInstId' cannot be null!"); + } + if (sampleCount == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'sampleCount' cannot be null!"); + } + encoder.encodeLong(paramDefInstId); + encoder.encodeNullableTime(startTime); + encoder.encodeNullableTime(endTime); + encoder.encodeNullableTime(valueTime); + encoder.encodeNullableAttribute(value); + encoder.encodeUInteger(sampleCount); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + paramDefInstId = decoder.decodeLong(); + startTime = decoder.decodeNullableTime(); + endTime = decoder.decodeNullableTime(); + valueTime = decoder.decodeNullableTime(); + value = (org.ccsds.moims.mo.mal.structures.Attribute) decoder.decodeNullableAttribute(); + sampleCount = decoder.decodeUInteger(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/structures/StatisticValueList.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/structures/StatisticValueList.java new file mode 100644 index 00000000..f937f46c --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/structures/StatisticValueList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mc.statistic.structures; + +/** + * List class for StatisticValue. + */ +public final class StatisticValueList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1125921415233533L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125921415233533L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for StatisticValueList. + * + */ + public StatisticValueList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public StatisticValueList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public StatisticValueList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mc.statistic.structures.StatisticValue element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mc.statistic.structures.StatisticValue element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new StatisticValueList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mc.statistic.structures.StatisticValue(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/structures/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/structures/package-info.java new file mode 100644 index 00000000..e2080766 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/statistic/structures/package-info.java @@ -0,0 +1,4 @@ +/** + * Package containing types defined in the Statistic service. +*/ +package org.ccsds.moims.mo.mc.statistic.structures; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/structures/ArgumentDefinitionDetails.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/structures/ArgumentDefinitionDetails.java new file mode 100644 index 00000000..251e3b6f --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/structures/ArgumentDefinitionDetails.java @@ -0,0 +1,313 @@ +package org.ccsds.moims.mo.mc.structures; + +/** + * The ArgumentDefinitionDetails structure holds the details of an argument + * definition with a set of associated attributes, such as conversion used. + * The conditionalConversions define the conditions where a referenced conversion + * is applied. Only the first TRUE conversion should be applied. + */ +public final class ArgumentDefinitionDetails implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1125899923619841L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125899923619841L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Holds the argument definition identifier. + */ + private org.ccsds.moims.mo.mal.structures.Identifier argId; + + /** + * Optional argument description. + */ + private String description; + + /** + * Holds the attribute short form part of the raw type of the argument, e.g., + * for a MAL::String argument it shall hold 15. + */ + private Byte rawType; + + /** + * The unit for the raw value. + */ + private String rawUnit; + + /** + * The conditional conversions to apply to the argument. Only the first TRUE + * conversion should be applied. + */ + private org.ccsds.moims.mo.mc.structures.ConditionalConversionList conditionalConversions; + + /** + * Holds the attribute short form part of the converted type of the argument, + * e.g., for a MAL::String argument it shall hold 15. Must not be NULL if + * a conversion condition is supplied. + */ + private Byte convertedType; + + /** + * The converted argument units. + */ + private String convertedUnit; + + /** + * Default constructor for ArgumentDefinitionDetails. + * + */ + public ArgumentDefinitionDetails() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param argId Holds the argument definition identifier. + * @param description Optional argument description. + * @param rawType Holds the attribute short form part of the raw type of the argument, e.g., for a MAL::String argument it shall hold 15. + * @param rawUnit The unit for the raw value. + * @param conditionalConversions The conditional conversions to apply to the argument. Only the first TRUE conversion should be applied. + * @param convertedType Holds the attribute short form part of the converted type of the argument, e.g., for a MAL::String argument it shall hold 15. Must not be NULL if a conversion condition is supplied. + * @param convertedUnit The converted argument units. + */ + public ArgumentDefinitionDetails(org.ccsds.moims.mo.mal.structures.Identifier argId, + String description, + Byte rawType, + String rawUnit, + org.ccsds.moims.mo.mc.structures.ConditionalConversionList conditionalConversions, + Byte convertedType, + String convertedUnit) { + this.argId = argId; + this.description = description; + this.rawType = rawType; + this.rawUnit = rawUnit; + this.conditionalConversions = conditionalConversions; + this.convertedType = convertedType; + this.convertedUnit = convertedUnit; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param argId Holds the argument definition identifier. + * @param rawType Holds the attribute short form part of the raw type of the argument, e.g., for a MAL::String argument it shall hold 15. + */ + public ArgumentDefinitionDetails(org.ccsds.moims.mo.mal.structures.Identifier argId, + Byte rawType) { + this.argId = argId; + this.description = null; + this.rawType = rawType; + this.rawUnit = null; + this.conditionalConversions = null; + this.convertedType = null; + this.convertedUnit = null; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mc.structures.ArgumentDefinitionDetails(); + } + + /** + * Returns the field argId. + * + * @return The field argId + */ + public org.ccsds.moims.mo.mal.structures.Identifier getArgId() { + return argId; + } + + /** + * Returns the field description. + * + * @return The field description + */ + public String getDescription() { + return description; + } + + /** + * Returns the field rawType. + * + * @return The field rawType + */ + public Byte getRawType() { + return rawType; + } + + /** + * Returns the field rawUnit. + * + * @return The field rawUnit + */ + public String getRawUnit() { + return rawUnit; + } + + /** + * Returns the field conditionalConversions. + * + * @return The field conditionalConversions + */ + public org.ccsds.moims.mo.mc.structures.ConditionalConversionList getConditionalConversions() { + return conditionalConversions; + } + + /** + * Returns the field convertedType. + * + * @return The field convertedType + */ + public Byte getConvertedType() { + return convertedType; + } + + /** + * Returns the field convertedUnit. + * + * @return The field convertedUnit + */ + public String getConvertedUnit() { + return convertedUnit; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ArgumentDefinitionDetails) { + ArgumentDefinitionDetails other = (ArgumentDefinitionDetails) obj; + if (argId == null) { + if (other.argId != null) { + return false; + } + } else { + if (! argId.equals(other.argId)) { + return false; + } + } + if (description == null) { + if (other.description != null) { + return false; + } + } else { + if (! description.equals(other.description)) { + return false; + } + } + if (rawType == null) { + if (other.rawType != null) { + return false; + } + } else { + if (! rawType.equals(other.rawType)) { + return false; + } + } + if (rawUnit == null) { + if (other.rawUnit != null) { + return false; + } + } else { + if (! rawUnit.equals(other.rawUnit)) { + return false; + } + } + if (conditionalConversions == null) { + if (other.conditionalConversions != null) { + return false; + } + } else { + if (! conditionalConversions.equals(other.conditionalConversions)) { + return false; + } + } + if (convertedType == null) { + if (other.convertedType != null) { + return false; + } + } else { + if (! convertedType.equals(other.convertedType)) { + return false; + } + } + if (convertedUnit == null) { + if (other.convertedUnit != null) { + return false; + } + } else { + if (! convertedUnit.equals(other.convertedUnit)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (argId != null ? argId.hashCode() : 0); + hash = 83 * hash + (description != null ? description.hashCode() : 0); + hash = 83 * hash + (rawType != null ? rawType.hashCode() : 0); + hash = 83 * hash + (rawUnit != null ? rawUnit.hashCode() : 0); + hash = 83 * hash + (conditionalConversions != null ? conditionalConversions.hashCode() : 0); + hash = 83 * hash + (convertedType != null ? convertedType.hashCode() : 0); + hash = 83 * hash + (convertedUnit != null ? convertedUnit.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(ArgumentDefinitionDetails: "); + buf.append("argId=").append(argId); + buf.append(", description=").append(description); + buf.append(", rawType=").append(rawType); + buf.append(", rawUnit=").append(rawUnit); + buf.append(", conditionalConversions=").append(conditionalConversions); + buf.append(", convertedType=").append(convertedType); + buf.append(", convertedUnit=").append(convertedUnit); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (argId == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'argId' cannot be null!"); + } + if (rawType == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'rawType' cannot be null!"); + } + encoder.encodeIdentifier(argId); + encoder.encodeNullableString(description); + encoder.encodeOctet(rawType); + encoder.encodeNullableString(rawUnit); + encoder.encodeNullableElement(conditionalConversions); + encoder.encodeNullableOctet(convertedType); + encoder.encodeNullableString(convertedUnit); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + argId = decoder.decodeIdentifier(); + description = decoder.decodeNullableString(); + rawType = decoder.decodeOctet(); + rawUnit = decoder.decodeNullableString(); + conditionalConversions = (org.ccsds.moims.mo.mc.structures.ConditionalConversionList) decoder.decodeNullableElement(new org.ccsds.moims.mo.mc.structures.ConditionalConversionList()); + convertedType = decoder.decodeNullableOctet(); + convertedUnit = decoder.decodeNullableString(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/structures/ArgumentDefinitionDetailsList.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/structures/ArgumentDefinitionDetailsList.java new file mode 100644 index 00000000..89b4213b --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/structures/ArgumentDefinitionDetailsList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mc.structures; + +/** + * List class for ArgumentDefinitionDetails. + */ +public final class ArgumentDefinitionDetailsList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1125899940397055L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125899940397055L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for ArgumentDefinitionDetailsList. + * + */ + public ArgumentDefinitionDetailsList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public ArgumentDefinitionDetailsList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public ArgumentDefinitionDetailsList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mc.structures.ArgumentDefinitionDetails element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mc.structures.ArgumentDefinitionDetails element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new ArgumentDefinitionDetailsList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mc.structures.ArgumentDefinitionDetails(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/structures/AttributeValue.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/structures/AttributeValue.java new file mode 100644 index 00000000..4f6a3197 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/structures/AttributeValue.java @@ -0,0 +1,109 @@ +package org.ccsds.moims.mo.mc.structures; + +/** + * The AttributeValue structure holds an Attribute value. It allows a list + * of different Attribute types to be created whereas List of Attribute would + * require the values to be all of the same type. + */ +public final class AttributeValue implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1125899923619842L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125899923619842L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * The argument value. Must not be NULL. NULL may be represented by having + * a NULL in place of the complete AttributeValue composite. + */ + private org.ccsds.moims.mo.mal.structures.Attribute value; + + /** + * Default constructor for AttributeValue. + * + */ + public AttributeValue() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param value The argument value. Must not be NULL. NULL may be represented by having a NULL in place of the complete AttributeValue composite. + */ + public AttributeValue(org.ccsds.moims.mo.mal.structures.Attribute value) { + this.value = value; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mc.structures.AttributeValue(); + } + + /** + * Returns the field value. + * + * @return The field value + */ + public org.ccsds.moims.mo.mal.structures.Attribute getValue() { + return value; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof AttributeValue) { + AttributeValue other = (AttributeValue) obj; + if (value == null) { + if (other.value != null) { + return false; + } + } else { + if (! value.equals(other.value)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (value != null ? value.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(AttributeValue: "); + buf.append("value=").append(value); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (value == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'value' cannot be null!"); + } + encoder.encodeAttribute(value); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + value = (org.ccsds.moims.mo.mal.structures.Attribute) decoder.decodeAttribute(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/structures/AttributeValueList.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/structures/AttributeValueList.java new file mode 100644 index 00000000..3ac464e1 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/structures/AttributeValueList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mc.structures; + +/** + * List class for AttributeValue. + */ +public final class AttributeValueList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1125899940397054L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125899940397054L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for AttributeValueList. + * + */ + public AttributeValueList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public AttributeValueList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public AttributeValueList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mc.structures.AttributeValue element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mc.structures.AttributeValue element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new AttributeValueList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mc.structures.AttributeValue(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/structures/ConditionalConversion.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/structures/ConditionalConversion.java new file mode 100644 index 00000000..75d515d6 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/structures/ConditionalConversion.java @@ -0,0 +1,151 @@ +package org.ccsds.moims.mo.mc.structures; + +/** + * The ConditionalConversion structure holds a condition expression to be + * evaluated to determine if a specific Conversion should be used. In the + * case that no test is required, i.e., the conversion should always be used, + * then the condition field should be set to NULL. + */ +public final class ConditionalConversion implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1125899923619843L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125899923619843L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * The expression indicates which entities are applicable for this check. + * If NULL, then the condition shall evaluate to TRUE. + */ + private org.ccsds.moims.mo.mc.structures.ParameterExpression condition; + + /** + * The object instance identifier of the ConversionIdentity object to be used + * if the condition evaluates to TRUE or is NULL. + */ + private org.ccsds.moims.mo.com.structures.ObjectKey conversionId; + + /** + * Default constructor for ConditionalConversion. + * + */ + public ConditionalConversion() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param condition The expression indicates which entities are applicable for this check. If NULL, then the condition shall evaluate to TRUE. + * @param conversionId The object instance identifier of the ConversionIdentity object to be used if the condition evaluates to TRUE or is NULL. + */ + public ConditionalConversion(org.ccsds.moims.mo.mc.structures.ParameterExpression condition, + org.ccsds.moims.mo.com.structures.ObjectKey conversionId) { + this.condition = condition; + this.conversionId = conversionId; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param conversionId The object instance identifier of the ConversionIdentity object to be used if the condition evaluates to TRUE or is NULL. + */ + public ConditionalConversion(org.ccsds.moims.mo.com.structures.ObjectKey conversionId) { + this.condition = null; + this.conversionId = conversionId; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mc.structures.ConditionalConversion(); + } + + /** + * Returns the field condition. + * + * @return The field condition + */ + public org.ccsds.moims.mo.mc.structures.ParameterExpression getCondition() { + return condition; + } + + /** + * Returns the field conversionId. + * + * @return The field conversionId + */ + public org.ccsds.moims.mo.com.structures.ObjectKey getConversionId() { + return conversionId; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ConditionalConversion) { + ConditionalConversion other = (ConditionalConversion) obj; + if (condition == null) { + if (other.condition != null) { + return false; + } + } else { + if (! condition.equals(other.condition)) { + return false; + } + } + if (conversionId == null) { + if (other.conversionId != null) { + return false; + } + } else { + if (! conversionId.equals(other.conversionId)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (condition != null ? condition.hashCode() : 0); + hash = 83 * hash + (conversionId != null ? conversionId.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(ConditionalConversion: "); + buf.append("condition=").append(condition); + buf.append(", conversionId=").append(conversionId); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (conversionId == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'conversionId' cannot be null!"); + } + encoder.encodeNullableElement(condition); + encoder.encodeElement(conversionId); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + condition = (org.ccsds.moims.mo.mc.structures.ParameterExpression) decoder.decodeNullableElement(new org.ccsds.moims.mo.mc.structures.ParameterExpression()); + conversionId = (org.ccsds.moims.mo.com.structures.ObjectKey) decoder.decodeElement(new org.ccsds.moims.mo.com.structures.ObjectKey()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/structures/ConditionalConversionList.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/structures/ConditionalConversionList.java new file mode 100644 index 00000000..492d6ce4 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/structures/ConditionalConversionList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mc.structures; + +/** + * List class for ConditionalConversion. + */ +public final class ConditionalConversionList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1125899940397053L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125899940397053L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for ConditionalConversionList. + * + */ + public ConditionalConversionList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public ConditionalConversionList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public ConditionalConversionList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mc.structures.ConditionalConversion element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mc.structures.ConditionalConversion element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new ConditionalConversionList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mc.structures.ConditionalConversion(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/structures/ObjectInstancePair.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/structures/ObjectInstancePair.java new file mode 100644 index 00000000..3d111122 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/structures/ObjectInstancePair.java @@ -0,0 +1,140 @@ +package org.ccsds.moims.mo.mc.structures; + +/** + * The ObjectInstancePair structure is used to hold the object instance identifier + * of an Identity object with its associated Definition object. + */ +public final class ObjectInstancePair implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1125899923619847L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125899923619847L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * The object instance identifier of the Identity object. + */ + private Long objIdentityInstanceId; + + /** + * The object instance identifier of the Definition object. + */ + private Long objDefInstanceId; + + /** + * Default constructor for ObjectInstancePair. + * + */ + public ObjectInstancePair() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param objIdentityInstanceId The object instance identifier of the Identity object. + * @param objDefInstanceId The object instance identifier of the Definition object. + */ + public ObjectInstancePair(Long objIdentityInstanceId, + Long objDefInstanceId) { + this.objIdentityInstanceId = objIdentityInstanceId; + this.objDefInstanceId = objDefInstanceId; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mc.structures.ObjectInstancePair(); + } + + /** + * Returns the field objIdentityInstanceId. + * + * @return The field objIdentityInstanceId + */ + public Long getObjIdentityInstanceId() { + return objIdentityInstanceId; + } + + /** + * Returns the field objDefInstanceId. + * + * @return The field objDefInstanceId + */ + public Long getObjDefInstanceId() { + return objDefInstanceId; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ObjectInstancePair) { + ObjectInstancePair other = (ObjectInstancePair) obj; + if (objIdentityInstanceId == null) { + if (other.objIdentityInstanceId != null) { + return false; + } + } else { + if (! objIdentityInstanceId.equals(other.objIdentityInstanceId)) { + return false; + } + } + if (objDefInstanceId == null) { + if (other.objDefInstanceId != null) { + return false; + } + } else { + if (! objDefInstanceId.equals(other.objDefInstanceId)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (objIdentityInstanceId != null ? objIdentityInstanceId.hashCode() : 0); + hash = 83 * hash + (objDefInstanceId != null ? objDefInstanceId.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(ObjectInstancePair: "); + buf.append("objIdentityInstanceId=").append(objIdentityInstanceId); + buf.append(", objDefInstanceId=").append(objDefInstanceId); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (objIdentityInstanceId == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'objIdentityInstanceId' cannot be null!"); + } + if (objDefInstanceId == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'objDefInstanceId' cannot be null!"); + } + encoder.encodeLong(objIdentityInstanceId); + encoder.encodeLong(objDefInstanceId); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + objIdentityInstanceId = decoder.decodeLong(); + objDefInstanceId = decoder.decodeLong(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/structures/ObjectInstancePairList.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/structures/ObjectInstancePairList.java new file mode 100644 index 00000000..ee30e7bd --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/structures/ObjectInstancePairList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mc.structures; + +/** + * List class for ObjectInstancePair. + */ +public final class ObjectInstancePairList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1125899940397049L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125899940397049L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for ObjectInstancePairList. + * + */ + public ObjectInstancePairList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public ObjectInstancePairList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public ObjectInstancePairList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mc.structures.ObjectInstancePair element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mc.structures.ObjectInstancePair element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new ObjectInstancePairList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mc.structures.ObjectInstancePair(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/structures/ParameterExpression.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/structures/ParameterExpression.java new file mode 100644 index 00000000..ea2ebd72 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/structures/ParameterExpression.java @@ -0,0 +1,221 @@ +package org.ccsds.moims.mo.mc.structures; + +/** + * The ParameterExpression structure represents a simple expression between + * a parameter and a value for that parameter. + */ +public final class ParameterExpression implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1125899923619844L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125899923619844L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Holds the object instance identifier of the ParameterIdentity object to + * be used in the expression. + */ + private org.ccsds.moims.mo.com.structures.ObjectKey parameterId; + + /** + * The expression operator. + */ + private org.ccsds.moims.mo.com.archive.structures.ExpressionOperator operator; + + /** + * If set to TRUE the converted value field of the parameter value should + * be used, otherwise the raw value field should be used. + */ + private Boolean useConverted; + + /** + * The value to be used in the expression. + */ + private org.ccsds.moims.mo.mal.structures.Attribute value; + + /** + * Default constructor for ParameterExpression. + * + */ + public ParameterExpression() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param parameterId Holds the object instance identifier of the ParameterIdentity object to be used in the expression. + * @param operator The expression operator. + * @param useConverted If set to TRUE the converted value field of the parameter value should be used, otherwise the raw value field should be used. + * @param value The value to be used in the expression. + */ + public ParameterExpression(org.ccsds.moims.mo.com.structures.ObjectKey parameterId, + org.ccsds.moims.mo.com.archive.structures.ExpressionOperator operator, + Boolean useConverted, + org.ccsds.moims.mo.mal.structures.Attribute value) { + this.parameterId = parameterId; + this.operator = operator; + this.useConverted = useConverted; + this.value = value; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param parameterId Holds the object instance identifier of the ParameterIdentity object to be used in the expression. + * @param operator The expression operator. + * @param useConverted If set to TRUE the converted value field of the parameter value should be used, otherwise the raw value field should be used. + */ + public ParameterExpression(org.ccsds.moims.mo.com.structures.ObjectKey parameterId, + org.ccsds.moims.mo.com.archive.structures.ExpressionOperator operator, + Boolean useConverted) { + this.parameterId = parameterId; + this.operator = operator; + this.useConverted = useConverted; + this.value = null; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mc.structures.ParameterExpression(); + } + + /** + * Returns the field parameterId. + * + * @return The field parameterId + */ + public org.ccsds.moims.mo.com.structures.ObjectKey getParameterId() { + return parameterId; + } + + /** + * Returns the field operator. + * + * @return The field operator + */ + public org.ccsds.moims.mo.com.archive.structures.ExpressionOperator getOperator() { + return operator; + } + + /** + * Returns the field useConverted. + * + * @return The field useConverted + */ + public Boolean getUseConverted() { + return useConverted; + } + + /** + * Returns the field value. + * + * @return The field value + */ + public org.ccsds.moims.mo.mal.structures.Attribute getValue() { + return value; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ParameterExpression) { + ParameterExpression other = (ParameterExpression) obj; + if (parameterId == null) { + if (other.parameterId != null) { + return false; + } + } else { + if (! parameterId.equals(other.parameterId)) { + return false; + } + } + if (operator == null) { + if (other.operator != null) { + return false; + } + } else { + if (! operator.equals(other.operator)) { + return false; + } + } + if (useConverted == null) { + if (other.useConverted != null) { + return false; + } + } else { + if (! useConverted.equals(other.useConverted)) { + return false; + } + } + if (value == null) { + if (other.value != null) { + return false; + } + } else { + if (! value.equals(other.value)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (parameterId != null ? parameterId.hashCode() : 0); + hash = 83 * hash + (operator != null ? operator.hashCode() : 0); + hash = 83 * hash + (useConverted != null ? useConverted.hashCode() : 0); + hash = 83 * hash + (value != null ? value.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(ParameterExpression: "); + buf.append("parameterId=").append(parameterId); + buf.append(", operator=").append(operator); + buf.append(", useConverted=").append(useConverted); + buf.append(", value=").append(value); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (parameterId == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'parameterId' cannot be null!"); + } + if (operator == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'operator' cannot be null!"); + } + if (useConverted == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'useConverted' cannot be null!"); + } + encoder.encodeElement(parameterId); + encoder.encodeElement(operator); + encoder.encodeBoolean(useConverted); + encoder.encodeNullableAttribute(value); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + parameterId = (org.ccsds.moims.mo.com.structures.ObjectKey) decoder.decodeElement(new org.ccsds.moims.mo.com.structures.ObjectKey()); + operator = (org.ccsds.moims.mo.com.archive.structures.ExpressionOperator) decoder.decodeElement(org.ccsds.moims.mo.com.archive.structures.ExpressionOperator.EQUAL); + useConverted = decoder.decodeBoolean(); + value = (org.ccsds.moims.mo.mal.structures.Attribute) decoder.decodeNullableAttribute(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/structures/ParameterExpressionList.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/structures/ParameterExpressionList.java new file mode 100644 index 00000000..f8c4e6c0 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/structures/ParameterExpressionList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mc.structures; + +/** + * List class for ParameterExpression. + */ +public final class ParameterExpressionList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1125899940397052L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125899940397052L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for ParameterExpressionList. + * + */ + public ParameterExpressionList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public ParameterExpressionList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public ParameterExpressionList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mc.structures.ParameterExpression element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mc.structures.ParameterExpression element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new ParameterExpressionList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mc.structures.ParameterExpression(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/structures/Severity.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/structures/Severity.java new file mode 100644 index 00000000..87058e0a --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/structures/Severity.java @@ -0,0 +1,169 @@ +package org.ccsds.moims.mo.mc.structures; + +/** + * Enumeration class for Severity. + */ +public final class Severity extends org.ccsds.moims.mo.mal.structures.Enumeration { + + private static final long serialVersionUID = 1125899923619846L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125899923619846L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Enumeration value for INFORMATIONAL. + */ + public static final int INFORMATIONAL_VALUE = 1; + + /** + * Enumeration singleton for value INFORMATIONAL. + */ + public static final org.ccsds.moims.mo.mc.structures.Severity INFORMATIONAL = new org.ccsds.moims.mo.mc.structures.Severity(org.ccsds.moims.mo.mc.structures.Severity.INFORMATIONAL_VALUE); + + /** + * Enumeration value for WARNING. + */ + public static final int WARNING_VALUE = 2; + + /** + * Enumeration singleton for value WARNING. + */ + public static final org.ccsds.moims.mo.mc.structures.Severity WARNING = new org.ccsds.moims.mo.mc.structures.Severity(org.ccsds.moims.mo.mc.structures.Severity.WARNING_VALUE); + + /** + * Enumeration value for ALARM. + */ + public static final int ALARM_VALUE = 3; + + /** + * Enumeration singleton for value ALARM. + */ + public static final org.ccsds.moims.mo.mc.structures.Severity ALARM = new org.ccsds.moims.mo.mc.structures.Severity(org.ccsds.moims.mo.mc.structures.Severity.ALARM_VALUE); + + /** + * Enumeration value for SEVERE. + */ + public static final int SEVERE_VALUE = 4; + + /** + * Enumeration singleton for value SEVERE. + */ + public static final org.ccsds.moims.mo.mc.structures.Severity SEVERE = new org.ccsds.moims.mo.mc.structures.Severity(org.ccsds.moims.mo.mc.structures.Severity.SEVERE_VALUE); + + /** + * Enumeration value for CRITICAL. + */ + public static final int CRITICAL_VALUE = 5; + + /** + * Enumeration singleton for value CRITICAL. + */ + public static final org.ccsds.moims.mo.mc.structures.Severity CRITICAL = new org.ccsds.moims.mo.mc.structures.Severity(org.ccsds.moims.mo.mc.structures.Severity.CRITICAL_VALUE); + + /** + * Set of enumeration instances. + */ + private static final org.ccsds.moims.mo.mc.structures.Severity[] _ENUMERATIONS = { + INFORMATIONAL, WARNING, ALARM, SEVERE, CRITICAL}; + + /** + * The severity enumeration holds the possible values for a severity. The numerical value represents the increasing severity, therefore CRITICAL is more severe than ALARM. Normally, for checks, only the Warning and Critical ranges are used: the colour yellow is associated with Warning, and the colour red is associated with Critical. + */ + public Severity() { + super(-1); + } + + /** + * The severity enumeration holds the possible values for a severity. The + * numerical value represents the increasing severity, therefore CRITICAL + * is more severe than ALARM. Normally, for checks, only the Warning and Critical + * ranges are used: the colour yellow is associated with Warning, and the + * colour red is associated with Critical. + * + * @param value The value of the Enumeration. + */ + public Severity(int value) { + super(value); + } + + @Override + public String toString() { + switch (getValue()) { + case INFORMATIONAL_VALUE: + return "INFORMATIONAL"; + case WARNING_VALUE: + return "WARNING"; + case ALARM_VALUE: + return "ALARM"; + case SEVERE_VALUE: + return "SEVERE"; + case CRITICAL_VALUE: + return "CRITICAL"; + default: + throw new RuntimeException("Unknown ordinal!"); + } + } + + /** + * Returns the enumeration element represented by the supplied string, or + * null if not matched. + * + * @param s s The string to search for. + * @return The matched enumeration element, or null if not matched. + */ + public static org.ccsds.moims.mo.mc.structures.Severity fromString(String s) { + switch (s) { + case "INFORMATIONAL": + return Severity.INFORMATIONAL; + case "WARNING": + return Severity.WARNING; + case "ALARM": + return Severity.ALARM; + case "SEVERE": + return Severity.SEVERE; + case "CRITICAL": + return Severity.CRITICAL; + default: + throw new RuntimeException("Unknown Enumeration for the provided string: " + s); + } + } + + @Override + public org.ccsds.moims.mo.mal.structures.Enumeration fromValue(Integer value) { + switch (value) { + case INFORMATIONAL_VALUE: + return Severity.INFORMATIONAL; + case WARNING_VALUE: + return Severity.WARNING; + case ALARM_VALUE: + return Severity.ALARM; + case SEVERE_VALUE: + return Severity.SEVERE; + case CRITICAL_VALUE: + return Severity.CRITICAL; + default: + throw new RuntimeException("Unknown Enumeration for the provided value: " + value); + } + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return _ENUMERATIONS[0]; + } + + @Override + public int getEnumSize() { + return 5; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/structures/SeverityList.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/structures/SeverityList.java new file mode 100644 index 00000000..2b5e77c6 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/structures/SeverityList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mc.structures; + +/** + * List class for Severity. + */ +public final class SeverityList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1125899940397050L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125899940397050L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for SeverityList. + * + */ + public SeverityList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public SeverityList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public SeverityList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mc.structures.Severity element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mc.structures.Severity element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new SeverityList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return org.ccsds.moims.mo.mc.structures.Severity.INFORMATIONAL; + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/structures/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/structures/package-info.java new file mode 100644 index 00000000..fc368c8b --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v001-mc/org/ccsds/moims/mo/mc/structures/package-info.java @@ -0,0 +1,4 @@ +/** + * Package containing types defined in the MC area. +*/ +package org.ccsds.moims.mo.mc.structures; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/AmbiguousException.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/AmbiguousException.java new file mode 100644 index 00000000..aec5acd7 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/AmbiguousException.java @@ -0,0 +1,28 @@ +package org.ccsds.moims.mo.mc; + +/** + * The AmbiguousException exception. The data or operation is ambiguous, requiring + * clarification to proceed. + */ +public final class AmbiguousException extends org.ccsds.moims.mo.mal.MOErrorException { + + private static final String MO_ERROR_NAME = "Ambiguous"; + + /** + * Constructs a new AmbiguousException exception. + * + */ + public AmbiguousException() { + super(MO_ERROR_NAME, MCHelper.AMBIGUOUS_ERROR_NUMBER, ""); + } + + /** + * Constructs a new AmbiguousException exception. + * + * @param extraInformation The extraInformation of the exception. + */ + public AmbiguousException(Object extraInformation) { + super(MO_ERROR_NAME, MCHelper.AMBIGUOUS_ERROR_NUMBER, extraInformation); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/DuplicateException.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/DuplicateException.java new file mode 100644 index 00000000..971b8369 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/DuplicateException.java @@ -0,0 +1,28 @@ +package org.ccsds.moims.mo.mc; + +/** + * The DuplicateException exception. The entry or operation is a duplicate + * of an existing record, violating uniqueness. + */ +public final class DuplicateException extends org.ccsds.moims.mo.mal.MOErrorException { + + private static final String MO_ERROR_NAME = "Duplicate"; + + /** + * Constructs a new DuplicateException exception. + * + */ + public DuplicateException() { + super(MO_ERROR_NAME, MCHelper.DUPLICATE_ERROR_NUMBER, ""); + } + + /** + * Constructs a new DuplicateException exception. + * + * @param extraInformation The extraInformation of the exception. + */ + public DuplicateException(Object extraInformation) { + super(MO_ERROR_NAME, MCHelper.DUPLICATE_ERROR_NUMBER, extraInformation); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/InvalidException.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/InvalidException.java new file mode 100644 index 00000000..e6422611 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/InvalidException.java @@ -0,0 +1,28 @@ +package org.ccsds.moims.mo.mc; + +/** + * The InvalidException exception. The input data or operation format is invalid + * and does not meet required criteria. + */ +public final class InvalidException extends org.ccsds.moims.mo.mal.MOErrorException { + + private static final String MO_ERROR_NAME = "Invalid"; + + /** + * Constructs a new InvalidException exception. + * + */ + public InvalidException() { + super(MO_ERROR_NAME, MCHelper.INVALID_ERROR_NUMBER, ""); + } + + /** + * Constructs a new InvalidException exception. + * + * @param extraInformation The extraInformation of the exception. + */ + public InvalidException(Object extraInformation) { + super(MO_ERROR_NAME, MCHelper.INVALID_ERROR_NUMBER, extraInformation); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/MCElementFactory.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/MCElementFactory.java new file mode 100644 index 00000000..2123e5e0 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/MCElementFactory.java @@ -0,0 +1,83 @@ +package org.ccsds.moims.mo.mc; + +/** + * Creates the Elements of the MC area, without holding an instance of each + * of them, so that the class of a type is only loaded once a message carries + * that type. + */ +public final class MCElementFactory implements org.ccsds.moims.mo.mal.AreaElementFactory { + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement(int serviceNumber, + int typeNumber) { + if (serviceNumber != 0) { + return null; // This Area declares no types under a service + } + switch (typeNumber) { + case -61: return new org.ccsds.moims.mo.mc.structures.AggregationValueList(); + case -60: return new org.ccsds.moims.mo.mc.structures.AggregationDefinitionList(); + case -32: return new org.ccsds.moims.mo.mc.structures.AlertConfigurationList(); + case -31: return new org.ccsds.moims.mo.mc.structures.AlertEventList(); + case -30: return new org.ccsds.moims.mo.mc.structures.AlertDefinitionList(); + case -24: return new org.ccsds.moims.mo.mc.structures.ReportConfigurationList(); + case -23: return new org.ccsds.moims.mo.mc.structures.ParameterValueList(); + case -22: return new org.ccsds.moims.mo.mc.structures.ParameterValueDataList(); + case -21: return new org.ccsds.moims.mo.mc.structures.ParameterDefinitionList(); + case -20: return new org.ccsds.moims.mo.mc.structures.ValidityStateList(); + case -15: return new org.ccsds.moims.mo.mc.structures.ActionCompleteEventList(); + case -14: return new org.ccsds.moims.mo.mc.structures.ActionInProgressEventList(); + case -13: return new org.ccsds.moims.mo.mc.structures.ActionStartEventList(); + case -12: return new org.ccsds.moims.mo.mc.structures.ActionExecutionRequestList(); + case -11: return new org.ccsds.moims.mo.mc.structures.ActionDefinitionList(); + case -10: return new org.ccsds.moims.mo.mc.structures.ActionCategoryList(); + case -6: return new org.ccsds.moims.mo.mc.structures.SeverityList(); + case -1: return new org.ccsds.moims.mo.mc.structures.ArgumentDefinitionList(); + case 1: return new org.ccsds.moims.mo.mc.structures.ArgumentDefinition(); + case 6: return new org.ccsds.moims.mo.mc.structures.Severity(); + case 10: return new org.ccsds.moims.mo.mc.structures.ActionCategory(); + case 11: return new org.ccsds.moims.mo.mc.structures.ActionDefinition(); + case 12: return new org.ccsds.moims.mo.mc.structures.ActionExecutionRequest(); + case 13: return new org.ccsds.moims.mo.mc.structures.ActionStartEvent(); + case 14: return new org.ccsds.moims.mo.mc.structures.ActionInProgressEvent(); + case 15: return new org.ccsds.moims.mo.mc.structures.ActionCompleteEvent(); + case 20: return new org.ccsds.moims.mo.mc.structures.ValidityState(); + case 21: return new org.ccsds.moims.mo.mc.structures.ParameterDefinition(); + case 22: return new org.ccsds.moims.mo.mc.structures.ParameterValueData(); + case 23: return new org.ccsds.moims.mo.mc.structures.ParameterValue(); + case 24: return new org.ccsds.moims.mo.mc.structures.ReportConfiguration(); + case 30: return new org.ccsds.moims.mo.mc.structures.AlertDefinition(); + case 31: return new org.ccsds.moims.mo.mc.structures.AlertEvent(); + case 32: return new org.ccsds.moims.mo.mc.structures.AlertConfiguration(); + case 60: return new org.ccsds.moims.mo.mc.structures.AggregationDefinition(); + case 61: return new org.ccsds.moims.mo.mc.structures.AggregationValue(); + default: return createAreaElementOutOfBand(typeNumber); + } + } + + @Override + public int getAreaNumber() { + return 4; + } + + @Override + public int getAreaVersion() { + return 2; + } + + /** + * Creates an Element whose type number lies too far out to be held in the + * jump table that is asked first. This says nothing about how often the type + * is asked for: the numbers of an Area are not handed out in the order of + * use. + * + * @param typeNumber The typeNumber field. + */ + private static org.ccsds.moims.mo.mal.structures.Element createAreaElementOutOfBand(int typeNumber) { + switch (typeNumber) { + case -90: return new org.ccsds.moims.mo.mc.structures.PacketValueList(); + case 90: return new org.ccsds.moims.mo.mc.structures.PacketValue(); + default: return null; + } + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/MCHelper.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/MCHelper.java new file mode 100644 index 00000000..59bd40f8 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/MCHelper.java @@ -0,0 +1,107 @@ +package org.ccsds.moims.mo.mc; + +/** + * Helper class for MC area. + */ +public class MCHelper { + + /** + * Area number literal. + */ + public static final int _MC_AREA_NUMBER = 4; + + /** + * Area number instance. + */ + public static final org.ccsds.moims.mo.mal.structures.UShort MC_AREA_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_MC_AREA_NUMBER); + + /** + * Area name constant. + */ + public static final org.ccsds.moims.mo.mal.structures.Identifier MC_AREA_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("MC"); + + /** + * Area version literal. + */ + public static final short _MC_AREA_VERSION = 2; + + /** + * Area version instance. + */ + public static final org.ccsds.moims.mo.mal.structures.UOctet MC_AREA_VERSION = new org.ccsds.moims.mo.mal.structures.UOctet(_MC_AREA_VERSION); + + /** + * Area Elements. + */ + public static final org.ccsds.moims.mo.mal.structures.Element[] MC_AREA_ELEMENTS = {}; + + /** + * Services in this Area. + */ + public static final org.ccsds.moims.mo.mal.ServiceInfo[] MC_AREA_SERVICES = { + org.ccsds.moims.mo.mc.action.ActionHelper.ACTION_SERVICE, + org.ccsds.moims.mo.mc.parameter.ParameterHelper.PARAMETER_SERVICE, + org.ccsds.moims.mo.mc.alert.AlertHelper.ALERT_SERVICE, + org.ccsds.moims.mo.mc.aggregation.AggregationHelper.AGGREGATION_SERVICE, + org.ccsds.moims.mo.mc.packet.PacketHelper.PACKET_SERVICE,}; + + /** + * Area singleton instance. + */ + public static final org.ccsds.moims.mo.mal.MALArea MC_AREA = new org.ccsds.moims.mo.mal.MALArea(MC_AREA_NUMBER, MC_AREA_NAME, MC_AREA_VERSION, MC_AREA_ELEMENTS, MC_AREA_SERVICES, new MCElementFactory()); + + /** + * Error literal for error READ_ONLY. + */ + public static final long _READ_ONLY_ERROR_NUMBER = 1; + + /** + * Error instance for error READ_ONLY. + */ + public static final org.ccsds.moims.mo.mal.structures.UInteger READ_ONLY_ERROR_NUMBER = new org.ccsds.moims.mo.mal.structures.UInteger(_READ_ONLY_ERROR_NUMBER); + + /** + * Error literal for error DUPLICATE. + */ + public static final long _DUPLICATE_ERROR_NUMBER = 2; + + /** + * Error instance for error DUPLICATE. + */ + public static final org.ccsds.moims.mo.mal.structures.UInteger DUPLICATE_ERROR_NUMBER = new org.ccsds.moims.mo.mal.structures.UInteger(_DUPLICATE_ERROR_NUMBER); + + /** + * Error literal for error INVALID. + */ + public static final long _INVALID_ERROR_NUMBER = 3; + + /** + * Error instance for error INVALID. + */ + public static final org.ccsds.moims.mo.mal.structures.UInteger INVALID_ERROR_NUMBER = new org.ccsds.moims.mo.mal.structures.UInteger(_INVALID_ERROR_NUMBER); + + /** + * Error literal for error REJECTED. + */ + public static final long _REJECTED_ERROR_NUMBER = 4; + + /** + * Error instance for error REJECTED. + */ + public static final org.ccsds.moims.mo.mal.structures.UInteger REJECTED_ERROR_NUMBER = new org.ccsds.moims.mo.mal.structures.UInteger(_REJECTED_ERROR_NUMBER); + + /** + * Error literal for error AMBIGUOUS. + */ + public static final long _AMBIGUOUS_ERROR_NUMBER = 5; + + /** + * Error instance for error AMBIGUOUS. + */ + public static final org.ccsds.moims.mo.mal.structures.UInteger AMBIGUOUS_ERROR_NUMBER = new org.ccsds.moims.mo.mal.structures.UInteger(_AMBIGUOUS_ERROR_NUMBER); + + private MCHelper() { + // Utility class; not meant to be instantiated. + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/ReadOnlyException.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/ReadOnlyException.java new file mode 100644 index 00000000..89185354 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/ReadOnlyException.java @@ -0,0 +1,28 @@ +package org.ccsds.moims.mo.mc; + +/** + * The ReadOnlyException exception. The operation attempted to modify read-only + * data, which cannot be changed. + */ +public final class ReadOnlyException extends org.ccsds.moims.mo.mal.MOErrorException { + + private static final String MO_ERROR_NAME = "Read Only"; + + /** + * Constructs a new ReadOnlyException exception. + * + */ + public ReadOnlyException() { + super(MO_ERROR_NAME, MCHelper.READ_ONLY_ERROR_NUMBER, ""); + } + + /** + * Constructs a new ReadOnlyException exception. + * + * @param extraInformation The extraInformation of the exception. + */ + public ReadOnlyException(Object extraInformation) { + super(MO_ERROR_NAME, MCHelper.READ_ONLY_ERROR_NUMBER, extraInformation); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/RejectedException.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/RejectedException.java new file mode 100644 index 00000000..5ae68ac1 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/RejectedException.java @@ -0,0 +1,28 @@ +package org.ccsds.moims.mo.mc; + +/** + * The RejectedException exception. The operation has been rejected due to + * policy or validation rules. + */ +public final class RejectedException extends org.ccsds.moims.mo.mal.MOErrorException { + + private static final String MO_ERROR_NAME = "Rejected"; + + /** + * Constructs a new RejectedException exception. + * + */ + public RejectedException() { + super(MO_ERROR_NAME, MCHelper.REJECTED_ERROR_NUMBER, ""); + } + + /** + * Constructs a new RejectedException exception. + * + * @param extraInformation The extraInformation of the exception. + */ + public RejectedException(Object extraInformation) { + super(MO_ERROR_NAME, MCHelper.REJECTED_ERROR_NUMBER, extraInformation); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/action/ActionHelper.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/action/ActionHelper.java new file mode 100644 index 00000000..f7d4a2ea --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/action/ActionHelper.java @@ -0,0 +1,17 @@ +package org.ccsds.moims.mo.mc.action; + +/** + * Helper class for Action service. + */ +public class ActionHelper { + + /** + * Service singleton instance. + */ + public static final org.ccsds.moims.mo.mc.action.ActionServiceInfo ACTION_SERVICE = new org.ccsds.moims.mo.mc.action.ActionServiceInfo(); + + private ActionHelper() { + // Utility class; not meant to be instantiated. + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/action/ActionServiceInfo.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/action/ActionServiceInfo.java new file mode 100644 index 00000000..f4584c2a --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/action/ActionServiceInfo.java @@ -0,0 +1,127 @@ +package org.ccsds.moims.mo.mc.action; + +/** + * Helper class for Action service. + */ +public class ActionServiceInfo extends org.ccsds.moims.mo.mal.ServiceInfo { + + /** + * Service number literal. + */ + public static final int _ACTION_SERVICE_NUMBER = 1; + + /** + * Service number instance. + */ + public static final org.ccsds.moims.mo.mal.structures.UShort ACTION_SERVICE_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_ACTION_SERVICE_NUMBER); + + /** + * Service name constant. + */ + public static final org.ccsds.moims.mo.mal.structures.Identifier ACTION_SERVICE_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("Action"); + + /** + * The service key of this service. + */ + private static final org.ccsds.moims.mo.mal.ServiceKey SERVICE_KEY = new org.ccsds.moims.mo.mal.ServiceKey( + 4, 2, ACTION_SERVICE_NUMBER); + + /** + * Operation number literal for operation EXECUTE. + */ + public static final int _EXECUTE_OP_NUMBER = 1; + + /** + * Operation number instance for operation EXECUTE. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort EXECUTE_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_EXECUTE_OP_NUMBER); + + /** + * Operation instance for operation EXECUTE. + */ + public static final org.ccsds.moims.mo.mal.MALSubmitOperation EXECUTE_OP = new org.ccsds.moims.mo.mal.MALSubmitOperation(SERVICE_KEY, + EXECUTE_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("execute"), + new org.ccsds.moims.mo.mal.structures.UShort(1), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("executionRequest", false, org.ccsds.moims.mo.mc.structures.ActionExecutionRequest.SHORT_FORM, "")}, + "The execute operation allows a consumer to request a provider to execute an action."); + + /** + * Operation number literal for operation MONITOREXECUTION. + */ + public static final int _MONITOREXECUTION_OP_NUMBER = 2; + + /** + * Operation number instance for operation MONITOREXECUTION. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort MONITOREXECUTION_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_MONITOREXECUTION_OP_NUMBER); + + /** + * Operation instance for operation MONITOREXECUTION. + */ + public static final org.ccsds.moims.mo.mal.MALPubSubOperation MONITOREXECUTION_OP = new org.ccsds.moims.mo.mal.MALPubSubOperation(SERVICE_KEY, + MONITOREXECUTION_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("monitorExecution"), + new org.ccsds.moims.mo.mal.structures.UShort(2), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("progressEvent", false, null, "")}, + "The monitorExecution operation allows a consumer to be informed of the progress in the execution of an action or a set of actions."); + + /** + * Key names instance for MONITOREXECUTION operation of pubsub interaction + * pattern. + */ + private static final org.ccsds.moims.mo.mal.structures.Identifier [] _MONITOREXECUTION_OP_KEY_NAMES = {new org.ccsds.moims.mo.mal.structures.Identifier("requestId"), + new org.ccsds.moims.mo.mal.structures.Identifier("actionKey"), + new org.ccsds.moims.mo.mal.structures.Identifier("actionCategory")}; + + /** + * Key names instance for MONITOREXECUTION operation of pubsub interaction + * pattern. + */ + private static final org.ccsds.moims.mo.mal.structures.IdentifierList MONITOREXECUTION_OP_KEY_NAMES = new org.ccsds.moims.mo.mal.structures.IdentifierList(new java.util.ArrayList<>(java.util.Arrays.asList(_MONITOREXECUTION_OP_KEY_NAMES))); + + /** + * Area elements. + */ + public static final org.ccsds.moims.mo.mal.structures.Element[] ACTION_SERVICE_ELEMENTS = {}; + + /** + * The set of operations for this service. + */ + public static final org.ccsds.moims.mo.mal.MALOperation[] OPERATIONS = new org.ccsds.moims.mo.mal.MALOperation[]{EXECUTE_OP, + MONITOREXECUTION_OP}; + + /** + * Creates an instance of the Action ServiceInfo. + * + */ + public ActionServiceInfo() { + super(SERVICE_KEY, ACTION_SERVICE_NAME, ACTION_SERVICE_ELEMENTS, OPERATIONS); + } + + @Override + public org.ccsds.moims.mo.mal.MALArea getArea() { + return org.ccsds.moims.mo.mc.MCHelper.MC_AREA; + } + + @Override + public org.ccsds.moims.mo.mal.MOErrorException generateMOError(int errorNumber, + Object extraInfo) { + switch (errorNumber) { + case 1: + return new org.ccsds.moims.mo.mc.ReadOnlyException(extraInfo); + case 2: + return new org.ccsds.moims.mo.mc.DuplicateException(extraInfo); + case 3: + return new org.ccsds.moims.mo.mc.InvalidException(extraInfo); + case 4: + return new org.ccsds.moims.mo.mc.RejectedException(extraInfo); + case 5: + return new org.ccsds.moims.mo.mc.AmbiguousException(extraInfo); + } + return null; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/action/consumer/ActionAdapter.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/action/consumer/ActionAdapter.java new file mode 100644 index 00000000..d02a6ebc --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/action/consumer/ActionAdapter.java @@ -0,0 +1,211 @@ +package org.ccsds.moims.mo.mc.action.consumer; + +/** + * Consumer adapter for Action service. + */ +public abstract class ActionAdapter extends org.ccsds.moims.mo.mal.consumer.MALInteractionAdapter { + + /** + * Called by the MAL when a SUBMIT acknowledgement is received from a provider + * for the operation execute. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void executeAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a SUBMIT acknowledgement error is received from + * a provider for the operation execute. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void executeErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PubSub register acknowledgement is received from + * a broker for the operation monitorExecution. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void monitorExecutionRegisterAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PubSub register acknowledgement error is received + * from a broker for the operation monitorExecution. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void monitorExecutionRegisterErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PubSub deregister acknowledgement is received + * from a broker for the operation monitorExecution. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void monitorExecutionDeregisterAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PubSub update is received from a broker for the + * operation monitorExecution. + * + * @param msgHeader msgHeader The header of the received message + * @param subscriptionId The subscriptionId of the subscription. + * @param updateHeader The Update header. + * @param keys The typed Subscription Key accessors for this update + * @param progressEvent The progressEvent field. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void monitorExecutionNotifyReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.structures.Identifier subscriptionId, + org.ccsds.moims.mo.mal.structures.UpdateHeader updateHeader, + MonitorExecutionSubscriptionKeys keys, + org.ccsds.moims.mo.mc.structures.ActionEvent progressEvent, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PubSub update error is received from a broker + * for the operation monitorExecution. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void monitorExecutionNotifyErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + @Override + public final void submitAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mc.action.ActionServiceInfo._EXECUTE_OP_NUMBER: + executeAckReceived(msgHeader, qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void submitErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALErrorBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mc.action.ActionServiceInfo._EXECUTE_OP_NUMBER: + executeErrorReceived(msgHeader, body.getError(), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void registerAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mc.action.ActionServiceInfo._MONITOREXECUTION_OP_NUMBER: + monitorExecutionRegisterAckReceived(msgHeader, qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void registerErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALErrorBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mc.action.ActionServiceInfo._MONITOREXECUTION_OP_NUMBER: + monitorExecutionRegisterErrorReceived(msgHeader, body.getError(), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void notifyReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALNotifyBody body, + org.ccsds.moims.mo.mal.structures.IdentifierList selectedKeys, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + if ((org.ccsds.moims.mo.mc.MCHelper.MC_AREA_NUMBER.equals(msgHeader.getServiceArea())) && (org.ccsds.moims.mo.mc.action.ActionServiceInfo.ACTION_SERVICE_NUMBER.equals(msgHeader.getService()))) { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mc.action.ActionServiceInfo._MONITOREXECUTION_OP_NUMBER: + monitorExecutionNotifyReceived(msgHeader, + (org.ccsds.moims.mo.mal.structures.Identifier) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.Identifier()), + (org.ccsds.moims.mo.mal.structures.UpdateHeader) body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.UpdateHeader()), + new MonitorExecutionSubscriptionKeys((org.ccsds.moims.mo.mal.structures.UpdateHeader) body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.UpdateHeader()), selectedKeys), + (org.ccsds.moims.mo.mc.structures.ActionEvent) body.getBodyElement(2, null), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + else { + notifyReceivedFromOtherService(msgHeader, body, qosProperties); + } + } + + @Override + public final void notifyErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALErrorBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mc.action.ActionServiceInfo._MONITOREXECUTION_OP_NUMBER: + monitorExecutionNotifyErrorReceived(msgHeader, body.getError(), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void deregisterAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mc.action.ActionServiceInfo._MONITOREXECUTION_OP_NUMBER: + monitorExecutionDeregisterAckReceived(msgHeader, qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + /** + * Called by the MAL when a PubSub update from another service is received + * from a broker. + * + * @param msgHeader msgHeader The header of the received message + * @param body body The body of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + * @throws org.ccsds.moims.mo.mal.MALException if an error is detected processing the message. + */ + public void notifyReceivedFromOtherService(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALNotifyBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/action/consumer/ActionStub.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/action/consumer/ActionStub.java new file mode 100644 index 00000000..5a157402 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/action/consumer/ActionStub.java @@ -0,0 +1,128 @@ +package org.ccsds.moims.mo.mc.action.consumer; + +/** + * Consumer stub for Action service. + */ +public class ActionStub { + + /** + * The consumer field. + */ + private final org.ccsds.moims.mo.mal.consumer.MALConsumer consumer; + + /** + * Wraps a MALconsumer connection with service specific methods that map from + * the high level service API to the generic MAL API. + * + * @param consumer consumer The MALConsumer to use in this stub. + */ + public ActionStub(org.ccsds.moims.mo.mal.consumer.MALConsumer consumer) { + this.consumer = consumer; + } + + /** + * Returns the internal MAL consumer object used for sending of messages from + * this interface. + * + * @return The MAL consumer object. + */ + public org.ccsds.moims.mo.mal.consumer.MALConsumer getConsumer() { + return consumer; + } + + /** + * The execute operation allows a consumer to request a provider to execute + * an action. + * + * @param executionRequest The executionRequest field. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void execute(org.ccsds.moims.mo.mc.structures.ActionExecutionRequest executionRequest) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.submit(org.ccsds.moims.mo.mc.action.ActionServiceInfo.EXECUTE_OP, executionRequest); + } + + /** + * Asynchronous version of method execute. + * + * @param executionRequest The executionRequest field. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncExecute(org.ccsds.moims.mo.mc.structures.ActionExecutionRequest executionRequest, + org.ccsds.moims.mo.mc.action.consumer.ActionAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncSubmit(org.ccsds.moims.mo.mc.action.ActionServiceInfo.EXECUTE_OP, adapter, executionRequest); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueExecute(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mc.action.consumer.ActionAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mc.action.ActionServiceInfo.EXECUTE_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * Register method for the monitorExecution PubSub interaction. + * + * @param subscription subscription the subscription to register for + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void monitorExecutionRegister(org.ccsds.moims.mo.mal.structures.Subscription subscription, + org.ccsds.moims.mo.mc.action.consumer.ActionAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.register(org.ccsds.moims.mo.mc.action.ActionServiceInfo.MONITOREXECUTION_OP, subscription, adapter); + } + + /** + * Asynchronous version of method monitorExecutionRegister. + * + * @param subscription subscription the subscription to register for + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncMonitorExecutionRegister(org.ccsds.moims.mo.mal.structures.Subscription subscription, + org.ccsds.moims.mo.mc.action.consumer.ActionAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncRegister(org.ccsds.moims.mo.mc.action.ActionServiceInfo.MONITOREXECUTION_OP, subscription, adapter); + } + + /** + * Deregister method for the monitorExecution PubSub interaction. + * + * @param identifierList identifierList the subscription identifiers to deregister + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void monitorExecutionDeregister(org.ccsds.moims.mo.mal.structures.IdentifierList identifierList) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.deregister(org.ccsds.moims.mo.mc.action.ActionServiceInfo.MONITOREXECUTION_OP, identifierList); + } + + /** + * Asynchronous version of method monitorExecutionDeregister. + * + * @param identifierList identifierList the subscription identifiers to deregister + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncMonitorExecutionDeregister(org.ccsds.moims.mo.mal.structures.IdentifierList identifierList, + org.ccsds.moims.mo.mc.action.consumer.ActionAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncDeregister(org.ccsds.moims.mo.mc.action.ActionServiceInfo.MONITOREXECUTION_OP, identifierList, adapter); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/action/consumer/MonitorExecutionSubscriptionKeys.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/action/consumer/MonitorExecutionSubscriptionKeys.java new file mode 100644 index 00000000..3e4eabc4 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/action/consumer/MonitorExecutionSubscriptionKeys.java @@ -0,0 +1,98 @@ +package org.ccsds.moims.mo.mc.action.consumer; + +/** + * Typed accessors for the Subscription Keys of the monitorExecution PubSub + * operation. + */ +public final class MonitorExecutionSubscriptionKeys { + + /** + * The key values as received in the UpdateHeader. + */ + private org.ccsds.moims.mo.mal.structures.NullableAttributeList keyValues; + + /** + * The effective key names for the received key values. + */ + private org.ccsds.moims.mo.mal.structures.IdentifierList keyNames; + + /** + * The Subscription Key names defined by the operation, in order. + */ + private static final org.ccsds.moims.mo.mal.structures.IdentifierList CANONICAL_KEY_NAMES = new org.ccsds.moims.mo.mal.structures.IdentifierList(new java.util.ArrayList<>(java.util.Arrays.asList(new org.ccsds.moims.mo.mal.structures.Identifier("requestId"), new org.ccsds.moims.mo.mal.structures.Identifier("actionKey"), new org.ccsds.moims.mo.mal.structures.Identifier("actionCategory")))); + + /** + * Creates an instance from the received UpdateHeader and the subscription + * selectedKeys. + * + * @param updateHeader The UpdateHeader received in the NOTIFY message + * @param selectedKeys The selectedKeys of the subscription, or null if trimming was not enabled + */ + public MonitorExecutionSubscriptionKeys(org.ccsds.moims.mo.mal.structures.UpdateHeader updateHeader, + org.ccsds.moims.mo.mal.structures.IdentifierList selectedKeys) { + this.keyValues = (updateHeader == null) ? null : updateHeader.getKeyValues(); + this.keyNames = (selectedKeys != null) ? selectedKeys : CANONICAL_KEY_NAMES; + } + + /** + * Returns the value of the "requestId" Subscription Key, or null if not present. + * + * @return The key value, or null if not present + */ + public Long getRequestId() { + org.ccsds.moims.mo.mal.structures.Attribute v = valueByName("requestId"); + return (v == null) ? null : (Long) org.ccsds.moims.mo.mal.structures.Attribute.attribute2JavaType(v); + } + + /** + * Returns the value of the "actionKey" Subscription Key, or null if not present. + * + * @return The key value, or null if not present + */ + public org.ccsds.moims.mo.mal.structures.Identifier getActionKey() { + return (org.ccsds.moims.mo.mal.structures.Identifier) valueByName("actionKey"); + } + + /** + * Returns the value of the "actionCategory" Subscription Key, or null if + * not present. + * + * @return The key value, or null if not present + */ + public org.ccsds.moims.mo.mal.structures.UOctet getActionCategory() { + return (org.ccsds.moims.mo.mal.structures.UOctet) valueByName("actionCategory"); + } + + /** + * Returns the Subscription Key value with the given name, or null if it is + * not present (for example when it was trimmed away or is a custom key that + * is not part of this subscription). + * + * @param name The Subscription Key name + * @return The key value, or null if not present + */ + public org.ccsds.moims.mo.mal.structures.Attribute getByName(String name) { + return valueByName(name); + } + + /** + * + * @param name The Subscription Key name + */ + private org.ccsds.moims.mo.mal.structures.Attribute valueByName(String name) { + if (keyNames == null || keyValues == null) { + return null; + } + for (int i = 0; i < keyNames.size(); i++) { + if (name.equals(keyNames.get(i).getValue())) { + if (i >= keyValues.size()) { + return null; + } + org.ccsds.moims.mo.mal.structures.NullableAttribute na = keyValues.get(i); + return (na == null) ? null : na.getValue(); + } + } + return null; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/action/consumer/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/action/consumer/package-info.java new file mode 100644 index 00000000..07ec24a1 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/action/consumer/package-info.java @@ -0,0 +1,4 @@ +/** + * Package containing the consumer stubs for the Action service. +*/ +package org.ccsds.moims.mo.mc.action.consumer; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/action/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/action/package-info.java new file mode 100644 index 00000000..25ff2147 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/action/package-info.java @@ -0,0 +1,5 @@ +/** + * The action service allows consumers to submit an action for execution and + * to subsequently monitor the execution progress of these actions. +*/ +package org.ccsds.moims.mo.mc.action; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/action/provider/ActionHandler.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/action/provider/ActionHandler.java new file mode 100644 index 00000000..3d0196cd --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/action/provider/ActionHandler.java @@ -0,0 +1,29 @@ +package org.ccsds.moims.mo.mc.action.provider; + +/** + * Interface that providers of the Action service must implement to handle + * the operations of that service. + */ +public interface ActionHandler { + + /** + * Implements the operation execute. + * + * @param executionRequest The executionRequest field. + * @param interaction The MAL object representing the interaction in the provider. + * @throws org.ccsds.moims.mo.mc.DuplicateException The entry or operation is a duplicate of an existing record, violating uniqueness. + * @throws org.ccsds.moims.mo.mc.InvalidException The input data or operation format is invalid and does not meet required criteria. + * @throws org.ccsds.moims.mo.mc.RejectedException The operation has been rejected due to policy or validation rules. + * @throws org.ccsds.moims.mo.mal.UnknownException Operation specific. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + void execute(org.ccsds.moims.mo.mc.structures.ActionExecutionRequest executionRequest, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mc.DuplicateException, org.ccsds.moims.mo.mc.InvalidException, org.ccsds.moims.mo.mc.RejectedException, org.ccsds.moims.mo.mal.UnknownException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Sets the skeleton to be used for creation of publishers. + * + * @param skeleton The skeleton to be used. + */ + void setSkeleton(org.ccsds.moims.mo.mc.action.provider.ActionSkeleton skeleton); +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/action/provider/ActionInheritanceSkeleton.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/action/provider/ActionInheritanceSkeleton.java new file mode 100644 index 00000000..a1e8f455 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/action/provider/ActionInheritanceSkeleton.java @@ -0,0 +1,121 @@ +package org.ccsds.moims.mo.mc.action.provider; + +/** + * Provider Inheritance skeleton for ActionInheritanceSkeleton service. + */ +public abstract class ActionInheritanceSkeleton implements org.ccsds.moims.mo.mal.provider.MALInteractionHandler, org.ccsds.moims.mo.mc.action.provider.ActionSkeleton, org.ccsds.moims.mo.mc.action.provider.ActionHandler { + + /** + * The providerSet field. + */ + private org.ccsds.moims.mo.mal.provider.MALProviderSet providerSet = new org.ccsds.moims.mo.mal.provider.MALProviderSet(org.ccsds.moims.mo.mc.action.ActionHelper.ACTION_SERVICE); + + /** + * Returns the connection object for this provider. + * + * @return the connection object for this provider + * @throws java.io.IOException if the method was not implemented yet. + */ + public org.ccsds.moims.mo.mal.helpertools.connections.ConnectionProvider getConnection() throws java.io.IOException { + throw new java.io.IOException("This method needs to be overridden!"); + } + + @Override + public void setSkeleton(org.ccsds.moims.mo.mc.action.provider.ActionSkeleton skeleton) { + // Not used in the inheritance pattern (the skeleton is 'this'); + } + + @Override + public void malInitialize(org.ccsds.moims.mo.mal.provider.MALProvider provider) throws org.ccsds.moims.mo.mal.MALException { + providerSet.addProvider(provider); + } + + @Override + public void malFinalize(org.ccsds.moims.mo.mal.provider.MALProvider provider) throws org.ccsds.moims.mo.mal.MALException { + providerSet.removeProvider(provider); + } + + @Override + public org.ccsds.moims.mo.mc.action.provider.MonitorExecutionPublisher createMonitorExecutionPublisher(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.Identifier networkZone, + org.ccsds.moims.mo.mal.structures.SessionType sessionType, + org.ccsds.moims.mo.mal.structures.Identifier sessionName, + org.ccsds.moims.mo.mal.structures.QoSLevel qos, + java.util.Map qosProps, + org.ccsds.moims.mo.mal.structures.UInteger priority) throws org.ccsds.moims.mo.mal.MALException { + return new org.ccsds.moims.mo.mc.action.provider.MonitorExecutionPublisher(providerSet.createPublisherSet(org.ccsds.moims.mo.mc.action.ActionServiceInfo.MONITOREXECUTION_OP, domain, sessionType, sessionName, qos, qosProps, null)); + } + + @Override + public void handleSend(org.ccsds.moims.mo.mal.provider.MALInteraction interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + switch (opNumber) { + default: + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } + + @Override + public void handleSubmit(org.ccsds.moims.mo.mal.provider.MALSubmit interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + try { + switch (opNumber) { + case org.ccsds.moims.mo.mc.action.ActionServiceInfo._EXECUTE_OP_NUMBER: + execute((org.ccsds.moims.mo.mc.structures.ActionExecutionRequest) body.getBodyElement(0, new org.ccsds.moims.mo.mc.structures.ActionExecutionRequest()), + interaction); + interaction.sendAcknowledgement(); + break; + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } catch (org.ccsds.moims.mo.mal.MOErrorException error) { + throw new org.ccsds.moims.mo.mal.MALInteractionException(error); + } + } + + @Override + public void handleRequest(org.ccsds.moims.mo.mal.provider.MALRequest interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + switch (opNumber) { + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } + + @Override + public void handleInvoke(org.ccsds.moims.mo.mal.provider.MALInvoke interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + switch (opNumber) { + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } + + @Override + public void handleProgress(org.ccsds.moims.mo.mal.provider.MALProgress interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + switch (opNumber) { + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/action/provider/ActionSkeleton.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/action/provider/ActionSkeleton.java new file mode 100644 index 00000000..20d1b01d --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/action/provider/ActionSkeleton.java @@ -0,0 +1,29 @@ +package org.ccsds.moims.mo.mc.action.provider; + +/** + * The skeleton interface for the Action service. + */ +public interface ActionSkeleton { + + /** + * Creates a publisher object using the current registered provider set for + * the PubSub operation monitorExecution. + * + * @param domain The domain used for publishing + * @param networkZone ~The network zone used for publishing + * @param sessionType The session used for publishing + * @param sessionName The session name used for publishing + * @param qos The QoS used for publishing + * @param qosProps The QoS properties used for publishing + * @param priority The priority used for publishing + * @return The new publisher object. + * @throws org.ccsds.moims.mo.mal.MALException if a problem is detected during creation of the publisher + */ + org.ccsds.moims.mo.mc.action.provider.MonitorExecutionPublisher createMonitorExecutionPublisher(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.Identifier networkZone, + org.ccsds.moims.mo.mal.structures.SessionType sessionType, + org.ccsds.moims.mo.mal.structures.Identifier sessionName, + org.ccsds.moims.mo.mal.structures.QoSLevel qos, + java.util.Map qosProps, + org.ccsds.moims.mo.mal.structures.UInteger priority) throws org.ccsds.moims.mo.mal.MALException; +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/action/provider/MonitorExecutionPublisher.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/action/provider/MonitorExecutionPublisher.java new file mode 100644 index 00000000..378a6c64 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/action/provider/MonitorExecutionPublisher.java @@ -0,0 +1,121 @@ +package org.ccsds.moims.mo.mc.action.provider; + +/** + * Publisher class for the monitorExecution operation. + */ +public final class MonitorExecutionPublisher { + + /** + * The publisherSet field. + */ + private org.ccsds.moims.mo.mal.provider.MALPublisherSet publisherSet; + + /** + * Creates an instance of this class using the supplied publisher set. + * + * @param publisherSet The set of broker connections to use when registering and publishing. + */ + public MonitorExecutionPublisher(org.ccsds.moims.mo.mal.provider.MALPublisherSet publisherSet) { + this.publisherSet = publisherSet; + } + + /** + * Registers this provider implementation to the set of broker connections. + * + * @param keyNames The key names to use in the method + * @param keyTypes The key types to use in the method + * @param listener The listener object to use for callback from the publisher + * @throws java.lang.IllegalArgumentException If any supplied argument is invalid + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void register(org.ccsds.moims.mo.mal.structures.IdentifierList keyNames, + org.ccsds.moims.mo.mal.structures.AttributeTypeList keyTypes, + org.ccsds.moims.mo.mal.provider.MALPublishInteractionListener listener) throws java.lang.IllegalArgumentException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + publisherSet.register(keyNames, keyTypes, listener); + } + + /** + * Registers this provider implementation to the set of broker connections + * with the default subscription keys. + * + * @param listener The listener object to use for callback from the publisher + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void registerWithDefaultKeys(org.ccsds.moims.mo.mal.provider.MALPublishInteractionListener listener) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + org.ccsds.moims.mo.mal.structures.IdentifierList keyNames = new org.ccsds.moims.mo.mal.structures.IdentifierList(); + org.ccsds.moims.mo.mal.structures.AttributeTypeList keyTypes = new org.ccsds.moims.mo.mal.structures.AttributeTypeList(); + keyNames.add(new org.ccsds.moims.mo.mal.structures.Identifier("requestId")); + keyTypes.add(org.ccsds.moims.mo.mal.structures.AttributeType.LONG); + keyNames.add(new org.ccsds.moims.mo.mal.structures.Identifier("actionKey")); + keyTypes.add(org.ccsds.moims.mo.mal.structures.AttributeType.IDENTIFIER); + keyNames.add(new org.ccsds.moims.mo.mal.structures.Identifier("actionCategory")); + keyTypes.add(org.ccsds.moims.mo.mal.structures.AttributeType.UOCTET); + publisherSet.register(keyNames, keyTypes, listener); + } + + /** + * Asynchronously registers this provider implementation to the set of broker + * connections. + * + * @param keyNames The key names to use in the method + * @param keyTypes The key types to use in the method + * @param listener The listener object to use for callback from the publisher + * @throws java.lang.IllegalArgumentException If any supplied argument is invalid + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void asyncRegister(org.ccsds.moims.mo.mal.structures.IdentifierList keyNames, + org.ccsds.moims.mo.mal.structures.AttributeTypeList keyTypes, + org.ccsds.moims.mo.mal.provider.MALPublishInteractionListener listener) throws java.lang.IllegalArgumentException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + publisherSet.asyncRegister(keyNames, keyTypes, listener); + } + + /** + * Publishes updates to the set of registered broker connections. + * + * @param updateHeader The headers of the updates being added + * @param progressEvent The progressEvent field. + * @throws java.lang.IllegalArgumentException If any supplied argument is invalid + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void publish(org.ccsds.moims.mo.mal.structures.UpdateHeader updateHeader, + org.ccsds.moims.mo.mc.structures.ActionEvent progressEvent) throws java.lang.IllegalArgumentException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + publisherSet.publish(updateHeader, progressEvent); + } + + /** + * Deregisters this provider implementation from the set of broker connections. + * + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void deregister() throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + publisherSet.deregister(); + } + + /** + * Asynchronously deregisters this provider implementation from the set of + * broker connections. + * + * @param listener The listener object to use for callback from the publisher + * @throws java.lang.IllegalArgumentException If any supplied argument is invalid + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void asyncDeregister(org.ccsds.moims.mo.mal.provider.MALPublishInteractionListener listener) throws java.lang.IllegalArgumentException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + publisherSet.asyncDeregister(listener); + } + + /** + * Closes this publisher. + * + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void close() throws org.ccsds.moims.mo.mal.MALException { + publisherSet.close(); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/action/provider/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/action/provider/package-info.java new file mode 100644 index 00000000..2e83766e --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/action/provider/package-info.java @@ -0,0 +1,4 @@ +/** + * Package containing the provider skeletons for the Action service. +*/ +package org.ccsds.moims.mo.mc.action.provider; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/aggregation/AggregationHelper.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/aggregation/AggregationHelper.java new file mode 100644 index 00000000..4c2088cc --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/aggregation/AggregationHelper.java @@ -0,0 +1,17 @@ +package org.ccsds.moims.mo.mc.aggregation; + +/** + * Helper class for Aggregation service. + */ +public class AggregationHelper { + + /** + * Service singleton instance. + */ + public static final org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo AGGREGATION_SERVICE = new org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo(); + + private AggregationHelper() { + // Utility class; not meant to be instantiated. + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/aggregation/AggregationServiceInfo.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/aggregation/AggregationServiceInfo.java new file mode 100644 index 00000000..f9573fd7 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/aggregation/AggregationServiceInfo.java @@ -0,0 +1,293 @@ +package org.ccsds.moims.mo.mc.aggregation; + +/** + * Helper class for Aggregation service. + */ +public class AggregationServiceInfo extends org.ccsds.moims.mo.mal.ServiceInfo { + + /** + * Service number literal. + */ + public static final int _AGGREGATION_SERVICE_NUMBER = 6; + + /** + * Service number instance. + */ + public static final org.ccsds.moims.mo.mal.structures.UShort AGGREGATION_SERVICE_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_AGGREGATION_SERVICE_NUMBER); + + /** + * Service name constant. + */ + public static final org.ccsds.moims.mo.mal.structures.Identifier AGGREGATION_SERVICE_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("Aggregation"); + + /** + * The service key of this service. + */ + private static final org.ccsds.moims.mo.mal.ServiceKey SERVICE_KEY = new org.ccsds.moims.mo.mal.ServiceKey( + 4, 2, AGGREGATION_SERVICE_NUMBER); + + /** + * Operation number literal for operation MONITORVALUE. + */ + public static final int _MONITORVALUE_OP_NUMBER = 1; + + /** + * Operation number instance for operation MONITORVALUE. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort MONITORVALUE_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_MONITORVALUE_OP_NUMBER); + + /** + * Operation instance for operation MONITORVALUE. + */ + public static final org.ccsds.moims.mo.mal.MALPubSubOperation MONITORVALUE_OP = new org.ccsds.moims.mo.mal.MALPubSubOperation(SERVICE_KEY, + MONITORVALUE_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("monitorValue"), + new org.ccsds.moims.mo.mal.structures.UShort(1), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("timestamp", false, org.ccsds.moims.mo.mal.structures.Attribute.TIME_SHORT_FORM, ""), + new org.ccsds.moims.mo.mal.OperationField("values", false, org.ccsds.moims.mo.mc.structures.ParameterValueDataList.SHORT_FORM, "")}, + "The monitorValue operation allows a consumer to subscribe for aggregation value reports."); + + /** + * Key names instance for MONITORVALUE operation of pubsub interaction pattern. + */ + private static final org.ccsds.moims.mo.mal.structures.Identifier [] _MONITORVALUE_OP_KEY_NAMES = {new org.ccsds.moims.mo.mal.structures.Identifier("aggregationKey"), + new org.ccsds.moims.mo.mal.structures.Identifier("aggregationVersion")}; + + /** + * Key names instance for MONITORVALUE operation of pubsub interaction pattern. + */ + private static final org.ccsds.moims.mo.mal.structures.IdentifierList MONITORVALUE_OP_KEY_NAMES = new org.ccsds.moims.mo.mal.structures.IdentifierList(new java.util.ArrayList<>(java.util.Arrays.asList(_MONITORVALUE_OP_KEY_NAMES))); + + /** + * Operation number literal for operation GETVALUE. + */ + public static final int _GETVALUE_OP_NUMBER = 2; + + /** + * Operation number instance for operation GETVALUE. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort GETVALUE_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_GETVALUE_OP_NUMBER); + + /** + * Operation instance for operation GETVALUE. + */ + public static final org.ccsds.moims.mo.mal.MALRequestOperation GETVALUE_OP = new org.ccsds.moims.mo.mal.MALRequestOperation(SERVICE_KEY, + GETVALUE_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("getValue"), + new org.ccsds.moims.mo.mal.structures.UShort(2), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("domain", true, org.ccsds.moims.mo.mal.structures.IdentifierList.SHORT_FORM, ""), + new org.ccsds.moims.mo.mal.OperationField("keys", false, org.ccsds.moims.mo.mal.structures.IdentifierList.SHORT_FORM, "")}, + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("aggregationValues", false, org.ccsds.moims.mo.mc.structures.AggregationValueList.SHORT_FORM, "")}, + "The getValue operation returns the latest received value for a requested aggregation."); + + /** + * Operation number literal for operation GETREPORTINGCONFIGURATION. + */ + public static final int _GETREPORTINGCONFIGURATION_OP_NUMBER = 3; + + /** + * Operation number instance for operation GETREPORTINGCONFIGURATION. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort GETREPORTINGCONFIGURATION_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_GETREPORTINGCONFIGURATION_OP_NUMBER); + + /** + * Operation instance for operation GETREPORTINGCONFIGURATION. + */ + public static final org.ccsds.moims.mo.mal.MALRequestOperation GETREPORTINGCONFIGURATION_OP = new org.ccsds.moims.mo.mal.MALRequestOperation(SERVICE_KEY, + GETREPORTINGCONFIGURATION_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("getReportingConfiguration"), + new org.ccsds.moims.mo.mal.structures.UShort(3), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("domain", true, org.ccsds.moims.mo.mal.structures.IdentifierList.SHORT_FORM, ""), + new org.ccsds.moims.mo.mal.OperationField("keys", false, org.ccsds.moims.mo.mal.structures.IdentifierList.SHORT_FORM, "")}, + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("reportConfigs", false, org.ccsds.moims.mo.mc.structures.ReportConfigurationList.SHORT_FORM, "")}, + "The getReportingConfiguration operation allows a consumer to retrieve the current configuration for the generation of reports for an aggregation."); + + /** + * Operation number literal for operation ENABLEREPORTING. + */ + public static final int _ENABLEREPORTING_OP_NUMBER = 4; + + /** + * Operation number instance for operation ENABLEREPORTING. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort ENABLEREPORTING_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_ENABLEREPORTING_OP_NUMBER); + + /** + * Operation instance for operation ENABLEREPORTING. + */ + public static final org.ccsds.moims.mo.mal.MALSubmitOperation ENABLEREPORTING_OP = new org.ccsds.moims.mo.mal.MALSubmitOperation(SERVICE_KEY, + ENABLEREPORTING_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("enableReporting"), + new org.ccsds.moims.mo.mal.structures.UShort(3), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("domain", true, org.ccsds.moims.mo.mal.structures.IdentifierList.SHORT_FORM, ""), + new org.ccsds.moims.mo.mal.OperationField("keys", true, org.ccsds.moims.mo.mal.structures.IdentifierList.SHORT_FORM, "")}, + "The enableReporting operation allows a consumer to request the generation of reports for specific aggregations."); + + /** + * Operation number literal for operation DISABLEREPORTING. + */ + public static final int _DISABLEREPORTING_OP_NUMBER = 5; + + /** + * Operation number instance for operation DISABLEREPORTING. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort DISABLEREPORTING_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_DISABLEREPORTING_OP_NUMBER); + + /** + * Operation instance for operation DISABLEREPORTING. + */ + public static final org.ccsds.moims.mo.mal.MALSubmitOperation DISABLEREPORTING_OP = new org.ccsds.moims.mo.mal.MALSubmitOperation(SERVICE_KEY, + DISABLEREPORTING_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("disableReporting"), + new org.ccsds.moims.mo.mal.structures.UShort(3), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("domain", true, org.ccsds.moims.mo.mal.structures.IdentifierList.SHORT_FORM, ""), + new org.ccsds.moims.mo.mal.OperationField("keys", true, org.ccsds.moims.mo.mal.structures.IdentifierList.SHORT_FORM, "")}, + "The disableReporting operation allows a consumer to stop the generation of reports for specific aggregations."); + + /** + * Operation number literal for operation SETREPORTINGPERIOD. + */ + public static final int _SETREPORTINGPERIOD_OP_NUMBER = 6; + + /** + * Operation number instance for operation SETREPORTINGPERIOD. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort SETREPORTINGPERIOD_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_SETREPORTINGPERIOD_OP_NUMBER); + + /** + * Operation instance for operation SETREPORTINGPERIOD. + */ + public static final org.ccsds.moims.mo.mal.MALSubmitOperation SETREPORTINGPERIOD_OP = new org.ccsds.moims.mo.mal.MALSubmitOperation(SERVICE_KEY, + SETREPORTINGPERIOD_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("setReportingPeriod"), + new org.ccsds.moims.mo.mal.structures.UShort(3), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("domain", true, org.ccsds.moims.mo.mal.structures.IdentifierList.SHORT_FORM, ""), + new org.ccsds.moims.mo.mal.OperationField("keys", false, org.ccsds.moims.mo.mal.structures.IdentifierList.SHORT_FORM, ""), + new org.ccsds.moims.mo.mal.OperationField("reportInterval", false, org.ccsds.moims.mo.mal.structures.Attribute.DURATION_SHORT_FORM, "")}, + "The setReportingPeriod operation allows a consumer to set the reporting interval for specific aggregations."); + + /** + * Operation number literal for operation LISTDEFINITION. + */ + public static final int _LISTDEFINITION_OP_NUMBER = 7; + + /** + * Operation number instance for operation LISTDEFINITION. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort LISTDEFINITION_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_LISTDEFINITION_OP_NUMBER); + + /** + * Operation instance for operation LISTDEFINITION. + */ + public static final org.ccsds.moims.mo.mal.MALRequestOperation LISTDEFINITION_OP = new org.ccsds.moims.mo.mal.MALRequestOperation(SERVICE_KEY, + LISTDEFINITION_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("listDefinition"), + new org.ccsds.moims.mo.mal.structures.UShort(4), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("domain", true, org.ccsds.moims.mo.mal.structures.IdentifierList.SHORT_FORM, ""), + new org.ccsds.moims.mo.mal.OperationField("keys", true, org.ccsds.moims.mo.mal.structures.IdentifierList.SHORT_FORM, "")}, + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("definitions", false, org.ccsds.moims.mo.mc.structures.AggregationDefinitionList.SHORT_FORM, "")}, + "The listDefinition operation allows a consumer to retrieve the AggregationDefinition objects for the supported aggregations of the provider."); + + /** + * Operation number literal for operation ADDAGGREGATION. + */ + public static final int _ADDAGGREGATION_OP_NUMBER = 8; + + /** + * Operation number instance for operation ADDAGGREGATION. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort ADDAGGREGATION_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_ADDAGGREGATION_OP_NUMBER); + + /** + * Operation instance for operation ADDAGGREGATION. + */ + public static final org.ccsds.moims.mo.mal.MALSubmitOperation ADDAGGREGATION_OP = new org.ccsds.moims.mo.mal.MALSubmitOperation(SERVICE_KEY, + ADDAGGREGATION_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("addAggregation"), + new org.ccsds.moims.mo.mal.structures.UShort(5), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("newObjects", false, org.ccsds.moims.mo.mc.structures.AggregationDefinitionList.SHORT_FORM, "")}, + "The addAggregation operation allows a consumer to define one or more aggregations that do not currently exist."); + + /** + * Operation number literal for operation REMOVEAGGREGATION. + */ + public static final int _REMOVEAGGREGATION_OP_NUMBER = 9; + + /** + * Operation number instance for operation REMOVEAGGREGATION. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort REMOVEAGGREGATION_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_REMOVEAGGREGATION_OP_NUMBER); + + /** + * Operation instance for operation REMOVEAGGREGATION. + */ + public static final org.ccsds.moims.mo.mal.MALSubmitOperation REMOVEAGGREGATION_OP = new org.ccsds.moims.mo.mal.MALSubmitOperation(SERVICE_KEY, + REMOVEAGGREGATION_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("removeAggregation"), + new org.ccsds.moims.mo.mal.structures.UShort(5), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("domain", true, org.ccsds.moims.mo.mal.structures.IdentifierList.SHORT_FORM, ""), + new org.ccsds.moims.mo.mal.OperationField("keys", false, org.ccsds.moims.mo.mal.structures.IdentifierList.SHORT_FORM, "")}, + "The removeAggregation operation allows a consumer to remove one or more aggregations from the list of aggregations supported by the aggregation provider."); + + /** + * Area elements. + */ + public static final org.ccsds.moims.mo.mal.structures.Element[] AGGREGATION_SERVICE_ELEMENTS = {}; + + /** + * The set of operations for this service. + */ + public static final org.ccsds.moims.mo.mal.MALOperation[] OPERATIONS = new org.ccsds.moims.mo.mal.MALOperation[]{MONITORVALUE_OP, + GETVALUE_OP, + GETREPORTINGCONFIGURATION_OP, + ENABLEREPORTING_OP, + DISABLEREPORTING_OP, + SETREPORTINGPERIOD_OP, + LISTDEFINITION_OP, + ADDAGGREGATION_OP, + REMOVEAGGREGATION_OP}; + + /** + * Creates an instance of the Aggregation ServiceInfo. + * + */ + public AggregationServiceInfo() { + super(SERVICE_KEY, AGGREGATION_SERVICE_NAME, AGGREGATION_SERVICE_ELEMENTS, OPERATIONS); + } + + @Override + public org.ccsds.moims.mo.mal.MALArea getArea() { + return org.ccsds.moims.mo.mc.MCHelper.MC_AREA; + } + + @Override + public org.ccsds.moims.mo.mal.MOErrorException generateMOError(int errorNumber, + Object extraInfo) { + switch (errorNumber) { + case 1: + return new org.ccsds.moims.mo.mc.ReadOnlyException(extraInfo); + case 2: + return new org.ccsds.moims.mo.mc.DuplicateException(extraInfo); + case 3: + return new org.ccsds.moims.mo.mc.InvalidException(extraInfo); + case 4: + return new org.ccsds.moims.mo.mc.RejectedException(extraInfo); + case 5: + return new org.ccsds.moims.mo.mc.AmbiguousException(extraInfo); + } + return null; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/aggregation/consumer/AggregationAdapter.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/aggregation/consumer/AggregationAdapter.java new file mode 100644 index 00000000..bb231409 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/aggregation/consumer/AggregationAdapter.java @@ -0,0 +1,453 @@ +package org.ccsds.moims.mo.mc.aggregation.consumer; + +/** + * Consumer adapter for Aggregation service. + */ +public abstract class AggregationAdapter extends org.ccsds.moims.mo.mal.consumer.MALInteractionAdapter { + + /** + * Called by the MAL when a PubSub register acknowledgement is received from + * a broker for the operation monitorValue. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void monitorValueRegisterAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PubSub register acknowledgement error is received + * from a broker for the operation monitorValue. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void monitorValueRegisterErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PubSub deregister acknowledgement is received + * from a broker for the operation monitorValue. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void monitorValueDeregisterAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PubSub update is received from a broker for the + * operation monitorValue. + * + * @param msgHeader msgHeader The header of the received message + * @param subscriptionId The subscriptionId of the subscription. + * @param updateHeader The Update header. + * @param keys The typed Subscription Key accessors for this update + * @param timestamp The timestamp field. + * @param values The values field. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void monitorValueNotifyReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.structures.Identifier subscriptionId, + org.ccsds.moims.mo.mal.structures.UpdateHeader updateHeader, + MonitorValueSubscriptionKeys keys, + org.ccsds.moims.mo.mal.structures.Time timestamp, + org.ccsds.moims.mo.mc.structures.ParameterValueDataList values, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PubSub update error is received from a broker + * for the operation monitorValue. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void monitorValueNotifyErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response is received from a provider for + * the operation getValue. + * + * @param msgHeader msgHeader The header of the received message + * @param aggregationValues The aggregationValues field. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void getValueResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mc.structures.AggregationValueList aggregationValues, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response error is received from a provider + * for the operation getValue. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void getValueErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response is received from a provider for + * the operation getReportingConfiguration. + * + * @param msgHeader msgHeader The header of the received message + * @param reportConfigs The reportConfigs field. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void getReportingConfigurationResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mc.structures.ReportConfigurationList reportConfigs, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response error is received from a provider + * for the operation getReportingConfiguration. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void getReportingConfigurationErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a SUBMIT acknowledgement is received from a provider + * for the operation enableReporting. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void enableReportingAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a SUBMIT acknowledgement error is received from + * a provider for the operation enableReporting. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void enableReportingErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a SUBMIT acknowledgement is received from a provider + * for the operation disableReporting. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void disableReportingAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a SUBMIT acknowledgement error is received from + * a provider for the operation disableReporting. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void disableReportingErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a SUBMIT acknowledgement is received from a provider + * for the operation setReportingPeriod. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void setReportingPeriodAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a SUBMIT acknowledgement error is received from + * a provider for the operation setReportingPeriod. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void setReportingPeriodErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response is received from a provider for + * the operation listDefinition. + * + * @param msgHeader msgHeader The header of the received message + * @param definitions The definitions field. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void listDefinitionResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mc.structures.AggregationDefinitionList definitions, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response error is received from a provider + * for the operation listDefinition. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void listDefinitionErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a SUBMIT acknowledgement is received from a provider + * for the operation addAggregation. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void addAggregationAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a SUBMIT acknowledgement error is received from + * a provider for the operation addAggregation. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void addAggregationErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a SUBMIT acknowledgement is received from a provider + * for the operation removeAggregation. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void removeAggregationAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a SUBMIT acknowledgement error is received from + * a provider for the operation removeAggregation. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void removeAggregationErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + @Override + public final void submitAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo._ENABLEREPORTING_OP_NUMBER: + enableReportingAckReceived(msgHeader, qosProperties); + break; + case org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo._DISABLEREPORTING_OP_NUMBER: + disableReportingAckReceived(msgHeader, qosProperties); + break; + case org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo._SETREPORTINGPERIOD_OP_NUMBER: + setReportingPeriodAckReceived(msgHeader, qosProperties); + break; + case org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo._ADDAGGREGATION_OP_NUMBER: + addAggregationAckReceived(msgHeader, qosProperties); + break; + case org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo._REMOVEAGGREGATION_OP_NUMBER: + removeAggregationAckReceived(msgHeader, qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void submitErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALErrorBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo._ENABLEREPORTING_OP_NUMBER: + enableReportingErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo._DISABLEREPORTING_OP_NUMBER: + disableReportingErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo._SETREPORTINGPERIOD_OP_NUMBER: + setReportingPeriodErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo._ADDAGGREGATION_OP_NUMBER: + addAggregationErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo._REMOVEAGGREGATION_OP_NUMBER: + removeAggregationErrorReceived(msgHeader, body.getError(), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void requestResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALMessageBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo._GETVALUE_OP_NUMBER: + getValueResponseReceived(msgHeader, + (org.ccsds.moims.mo.mc.structures.AggregationValueList) body.getBodyElement(0, new org.ccsds.moims.mo.mc.structures.AggregationValueList()), qosProperties); + break; + case org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo._GETREPORTINGCONFIGURATION_OP_NUMBER: + getReportingConfigurationResponseReceived(msgHeader, + (org.ccsds.moims.mo.mc.structures.ReportConfigurationList) body.getBodyElement(0, new org.ccsds.moims.mo.mc.structures.ReportConfigurationList()), qosProperties); + break; + case org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo._LISTDEFINITION_OP_NUMBER: + listDefinitionResponseReceived(msgHeader, + (org.ccsds.moims.mo.mc.structures.AggregationDefinitionList) body.getBodyElement(0, new org.ccsds.moims.mo.mc.structures.AggregationDefinitionList()), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void requestErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALErrorBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo._GETVALUE_OP_NUMBER: + getValueErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo._GETREPORTINGCONFIGURATION_OP_NUMBER: + getReportingConfigurationErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo._LISTDEFINITION_OP_NUMBER: + listDefinitionErrorReceived(msgHeader, body.getError(), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void registerAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo._MONITORVALUE_OP_NUMBER: + monitorValueRegisterAckReceived(msgHeader, qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void registerErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALErrorBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo._MONITORVALUE_OP_NUMBER: + monitorValueRegisterErrorReceived(msgHeader, body.getError(), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void notifyReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALNotifyBody body, + org.ccsds.moims.mo.mal.structures.IdentifierList selectedKeys, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + if ((org.ccsds.moims.mo.mc.MCHelper.MC_AREA_NUMBER.equals(msgHeader.getServiceArea())) && (org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo.AGGREGATION_SERVICE_NUMBER.equals(msgHeader.getService()))) { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo._MONITORVALUE_OP_NUMBER: + monitorValueNotifyReceived(msgHeader, + (org.ccsds.moims.mo.mal.structures.Identifier) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.Identifier()), + (org.ccsds.moims.mo.mal.structures.UpdateHeader) body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.UpdateHeader()), + new MonitorValueSubscriptionKeys((org.ccsds.moims.mo.mal.structures.UpdateHeader) body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.UpdateHeader()), selectedKeys), + (org.ccsds.moims.mo.mal.structures.Time) body.getBodyElement(2, new org.ccsds.moims.mo.mal.structures.Time()), + (org.ccsds.moims.mo.mc.structures.ParameterValueDataList) body.getBodyElement(3, new org.ccsds.moims.mo.mc.structures.ParameterValueDataList()), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + else { + notifyReceivedFromOtherService(msgHeader, body, qosProperties); + } + } + + @Override + public final void notifyErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALErrorBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo._MONITORVALUE_OP_NUMBER: + monitorValueNotifyErrorReceived(msgHeader, body.getError(), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void deregisterAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo._MONITORVALUE_OP_NUMBER: + monitorValueDeregisterAckReceived(msgHeader, qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + /** + * Called by the MAL when a PubSub update from another service is received + * from a broker. + * + * @param msgHeader msgHeader The header of the received message + * @param body body The body of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + * @throws org.ccsds.moims.mo.mal.MALException if an error is detected processing the message. + */ + public void notifyReceivedFromOtherService(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALNotifyBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/aggregation/consumer/AggregationStub.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/aggregation/consumer/AggregationStub.java new file mode 100644 index 00000000..e6751cf3 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/aggregation/consumer/AggregationStub.java @@ -0,0 +1,471 @@ +package org.ccsds.moims.mo.mc.aggregation.consumer; + +/** + * Consumer stub for Aggregation service. + */ +public class AggregationStub { + + /** + * The consumer field. + */ + private final org.ccsds.moims.mo.mal.consumer.MALConsumer consumer; + + /** + * Wraps a MALconsumer connection with service specific methods that map from + * the high level service API to the generic MAL API. + * + * @param consumer consumer The MALConsumer to use in this stub. + */ + public AggregationStub(org.ccsds.moims.mo.mal.consumer.MALConsumer consumer) { + this.consumer = consumer; + } + + /** + * Returns the internal MAL consumer object used for sending of messages from + * this interface. + * + * @return The MAL consumer object. + */ + public org.ccsds.moims.mo.mal.consumer.MALConsumer getConsumer() { + return consumer; + } + + /** + * Register method for the monitorValue PubSub interaction. + * + * @param subscription subscription the subscription to register for + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void monitorValueRegister(org.ccsds.moims.mo.mal.structures.Subscription subscription, + org.ccsds.moims.mo.mc.aggregation.consumer.AggregationAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.register(org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo.MONITORVALUE_OP, subscription, adapter); + } + + /** + * Asynchronous version of method monitorValueRegister. + * + * @param subscription subscription the subscription to register for + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncMonitorValueRegister(org.ccsds.moims.mo.mal.structures.Subscription subscription, + org.ccsds.moims.mo.mc.aggregation.consumer.AggregationAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncRegister(org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo.MONITORVALUE_OP, subscription, adapter); + } + + /** + * Deregister method for the monitorValue PubSub interaction. + * + * @param identifierList identifierList the subscription identifiers to deregister + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void monitorValueDeregister(org.ccsds.moims.mo.mal.structures.IdentifierList identifierList) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.deregister(org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo.MONITORVALUE_OP, identifierList); + } + + /** + * Asynchronous version of method monitorValueDeregister. + * + * @param identifierList identifierList the subscription identifiers to deregister + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncMonitorValueDeregister(org.ccsds.moims.mo.mal.structures.IdentifierList identifierList, + org.ccsds.moims.mo.mc.aggregation.consumer.AggregationAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncDeregister(org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo.MONITORVALUE_OP, identifierList, adapter); + } + + /** + * The getValue operation returns the latest received value for a requested + * aggregation. + * + * @param domain The domain field. + * @param keys The keys field. + * @return The return value of the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mc.structures.AggregationValueList getValue(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.IdentifierList keys) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + org.ccsds.moims.mo.mal.transport.MALMessageBody body = consumer.request(org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo.GETVALUE_OP, domain, keys); + Object body0 = (Object) body.getBodyElement(0, new org.ccsds.moims.mo.mc.structures.AggregationValueList()); + return (org.ccsds.moims.mo.mc.structures.AggregationValueList) body0; + } + + /** + * Asynchronous version of method getValue. + * + * @param domain The domain field. + * @param keys The keys field. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncGetValue(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.IdentifierList keys, + org.ccsds.moims.mo.mc.aggregation.consumer.AggregationAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncRequest(org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo.GETVALUE_OP, adapter, domain, keys); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueGetValue(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mc.aggregation.consumer.AggregationAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo.GETVALUE_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The getReportingConfiguration operation allows a consumer to retrieve the + * current configuration for the generation of reports for an aggregation. + * + * @param domain The domain field. + * @param keys The keys field. + * @return The return value of the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mc.structures.ReportConfigurationList getReportingConfiguration(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.IdentifierList keys) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + org.ccsds.moims.mo.mal.transport.MALMessageBody body = consumer.request(org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo.GETREPORTINGCONFIGURATION_OP, domain, keys); + Object body0 = (Object) body.getBodyElement(0, new org.ccsds.moims.mo.mc.structures.ReportConfigurationList()); + return (org.ccsds.moims.mo.mc.structures.ReportConfigurationList) body0; + } + + /** + * Asynchronous version of method getReportingConfiguration. + * + * @param domain The domain field. + * @param keys The keys field. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncGetReportingConfiguration(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.IdentifierList keys, + org.ccsds.moims.mo.mc.aggregation.consumer.AggregationAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncRequest(org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo.GETREPORTINGCONFIGURATION_OP, adapter, domain, keys); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueGetReportingConfiguration(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mc.aggregation.consumer.AggregationAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo.GETREPORTINGCONFIGURATION_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The enableReporting operation allows a consumer to request the generation + * of reports for specific aggregations. + * + * @param domain The domain field. + * @param keys The keys field. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void enableReporting(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.IdentifierList keys) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.submit(org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo.ENABLEREPORTING_OP, domain, keys); + } + + /** + * Asynchronous version of method enableReporting. + * + * @param domain The domain field. + * @param keys The keys field. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncEnableReporting(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.IdentifierList keys, + org.ccsds.moims.mo.mc.aggregation.consumer.AggregationAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncSubmit(org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo.ENABLEREPORTING_OP, adapter, domain, keys); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueEnableReporting(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mc.aggregation.consumer.AggregationAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo.ENABLEREPORTING_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The disableReporting operation allows a consumer to stop the generation + * of reports for specific aggregations. + * + * @param domain The domain field. + * @param keys The keys field. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void disableReporting(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.IdentifierList keys) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.submit(org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo.DISABLEREPORTING_OP, domain, keys); + } + + /** + * Asynchronous version of method disableReporting. + * + * @param domain The domain field. + * @param keys The keys field. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncDisableReporting(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.IdentifierList keys, + org.ccsds.moims.mo.mc.aggregation.consumer.AggregationAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncSubmit(org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo.DISABLEREPORTING_OP, adapter, domain, keys); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueDisableReporting(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mc.aggregation.consumer.AggregationAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo.DISABLEREPORTING_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The setReportingPeriod operation allows a consumer to set the reporting + * interval for specific aggregations. + * + * @param domain The domain field. + * @param keys The keys field. + * @param reportInterval The reportInterval field. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void setReportingPeriod(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.IdentifierList keys, + org.ccsds.moims.mo.mal.structures.Duration reportInterval) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.submit(org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo.SETREPORTINGPERIOD_OP, domain, keys, reportInterval); + } + + /** + * Asynchronous version of method setReportingPeriod. + * + * @param domain The domain field. + * @param keys The keys field. + * @param reportInterval The reportInterval field. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncSetReportingPeriod(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.IdentifierList keys, + org.ccsds.moims.mo.mal.structures.Duration reportInterval, + org.ccsds.moims.mo.mc.aggregation.consumer.AggregationAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncSubmit(org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo.SETREPORTINGPERIOD_OP, adapter, domain, keys, reportInterval); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueSetReportingPeriod(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mc.aggregation.consumer.AggregationAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo.SETREPORTINGPERIOD_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The listDefinition operation allows a consumer to retrieve the AggregationDefinition + * objects for the supported aggregations of the provider. + * + * @param domain The domain field. + * @param keys The keys field. + * @return The return value of the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mc.structures.AggregationDefinitionList listDefinition(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.IdentifierList keys) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + org.ccsds.moims.mo.mal.transport.MALMessageBody body = consumer.request(org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo.LISTDEFINITION_OP, domain, keys); + Object body0 = (Object) body.getBodyElement(0, new org.ccsds.moims.mo.mc.structures.AggregationDefinitionList()); + return (org.ccsds.moims.mo.mc.structures.AggregationDefinitionList) body0; + } + + /** + * Asynchronous version of method listDefinition. + * + * @param domain The domain field. + * @param keys The keys field. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncListDefinition(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.IdentifierList keys, + org.ccsds.moims.mo.mc.aggregation.consumer.AggregationAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncRequest(org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo.LISTDEFINITION_OP, adapter, domain, keys); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueListDefinition(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mc.aggregation.consumer.AggregationAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo.LISTDEFINITION_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The addAggregation operation allows a consumer to define one or more aggregations + * that do not currently exist. + * + * @param newObjects The newObjects field. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void addAggregation(org.ccsds.moims.mo.mc.structures.AggregationDefinitionList newObjects) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.submit(org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo.ADDAGGREGATION_OP, newObjects); + } + + /** + * Asynchronous version of method addAggregation. + * + * @param newObjects The newObjects field. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncAddAggregation(org.ccsds.moims.mo.mc.structures.AggregationDefinitionList newObjects, + org.ccsds.moims.mo.mc.aggregation.consumer.AggregationAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncSubmit(org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo.ADDAGGREGATION_OP, adapter, newObjects); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueAddAggregation(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mc.aggregation.consumer.AggregationAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo.ADDAGGREGATION_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The removeAggregation operation allows a consumer to remove one or more + * aggregations from the list of aggregations supported by the aggregation + * provider. + * + * @param domain The domain field. + * @param keys The keys field. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void removeAggregation(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.IdentifierList keys) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.submit(org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo.REMOVEAGGREGATION_OP, domain, keys); + } + + /** + * Asynchronous version of method removeAggregation. + * + * @param domain The domain field. + * @param keys The keys field. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncRemoveAggregation(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.IdentifierList keys, + org.ccsds.moims.mo.mc.aggregation.consumer.AggregationAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncSubmit(org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo.REMOVEAGGREGATION_OP, adapter, domain, keys); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueRemoveAggregation(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mc.aggregation.consumer.AggregationAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo.REMOVEAGGREGATION_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/aggregation/consumer/MonitorValueSubscriptionKeys.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/aggregation/consumer/MonitorValueSubscriptionKeys.java new file mode 100644 index 00000000..8a394f24 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/aggregation/consumer/MonitorValueSubscriptionKeys.java @@ -0,0 +1,88 @@ +package org.ccsds.moims.mo.mc.aggregation.consumer; + +/** + * Typed accessors for the Subscription Keys of the monitorValue PubSub operation. + */ +public final class MonitorValueSubscriptionKeys { + + /** + * The key values as received in the UpdateHeader. + */ + private org.ccsds.moims.mo.mal.structures.NullableAttributeList keyValues; + + /** + * The effective key names for the received key values. + */ + private org.ccsds.moims.mo.mal.structures.IdentifierList keyNames; + + /** + * The Subscription Key names defined by the operation, in order. + */ + private static final org.ccsds.moims.mo.mal.structures.IdentifierList CANONICAL_KEY_NAMES = new org.ccsds.moims.mo.mal.structures.IdentifierList(new java.util.ArrayList<>(java.util.Arrays.asList(new org.ccsds.moims.mo.mal.structures.Identifier("aggregationKey"), new org.ccsds.moims.mo.mal.structures.Identifier("aggregationVersion")))); + + /** + * Creates an instance from the received UpdateHeader and the subscription + * selectedKeys. + * + * @param updateHeader The UpdateHeader received in the NOTIFY message + * @param selectedKeys The selectedKeys of the subscription, or null if trimming was not enabled + */ + public MonitorValueSubscriptionKeys(org.ccsds.moims.mo.mal.structures.UpdateHeader updateHeader, + org.ccsds.moims.mo.mal.structures.IdentifierList selectedKeys) { + this.keyValues = (updateHeader == null) ? null : updateHeader.getKeyValues(); + this.keyNames = (selectedKeys != null) ? selectedKeys : CANONICAL_KEY_NAMES; + } + + /** + * Returns the value of the "aggregationKey" Subscription Key, or null if + * not present. + * + * @return The key value, or null if not present + */ + public org.ccsds.moims.mo.mal.structures.Identifier getAggregationKey() { + return (org.ccsds.moims.mo.mal.structures.Identifier) valueByName("aggregationKey"); + } + + /** + * Returns the value of the "aggregationVersion" Subscription Key, or null + * if not present. + * + * @return The key value, or null if not present + */ + public org.ccsds.moims.mo.mal.structures.UInteger getAggregationVersion() { + return (org.ccsds.moims.mo.mal.structures.UInteger) valueByName("aggregationVersion"); + } + + /** + * Returns the Subscription Key value with the given name, or null if it is + * not present (for example when it was trimmed away or is a custom key that + * is not part of this subscription). + * + * @param name The Subscription Key name + * @return The key value, or null if not present + */ + public org.ccsds.moims.mo.mal.structures.Attribute getByName(String name) { + return valueByName(name); + } + + /** + * + * @param name The Subscription Key name + */ + private org.ccsds.moims.mo.mal.structures.Attribute valueByName(String name) { + if (keyNames == null || keyValues == null) { + return null; + } + for (int i = 0; i < keyNames.size(); i++) { + if (name.equals(keyNames.get(i).getValue())) { + if (i >= keyValues.size()) { + return null; + } + org.ccsds.moims.mo.mal.structures.NullableAttribute na = keyValues.get(i); + return (na == null) ? null : na.getValue(); + } + } + return null; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/aggregation/consumer/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/aggregation/consumer/package-info.java new file mode 100644 index 00000000..1ead61ae --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/aggregation/consumer/package-info.java @@ -0,0 +1,4 @@ +/** + * Package containing the consumer stubs for the Aggregation service. +*/ +package org.ccsds.moims.mo.mc.aggregation.consumer; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/aggregation/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/aggregation/package-info.java new file mode 100644 index 00000000..530cb265 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/aggregation/package-info.java @@ -0,0 +1,5 @@ +/** + * The aggregation service allows the user to acquire several parameter values + * in a single request. +*/ +package org.ccsds.moims.mo.mc.aggregation; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/aggregation/provider/AggregationHandler.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/aggregation/provider/AggregationHandler.java new file mode 100644 index 00000000..9ea2abcf --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/aggregation/provider/AggregationHandler.java @@ -0,0 +1,131 @@ +package org.ccsds.moims.mo.mc.aggregation.provider; + +/** + * Interface that providers of the Aggregation service must implement to handle + * the operations of that service. + */ +public interface AggregationHandler { + + /** + * Implements the operation getValue. + * + * @param domain The domain field. + * @param keys The keys field. + * @param interaction The MAL object representing the interaction in the provider. + * @return The return value of the operation + * @throws org.ccsds.moims.mo.mal.UnknownException Operation specific. + * @throws org.ccsds.moims.mo.mc.AmbiguousException The data or operation is ambiguous, requiring clarification to proceed. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + org.ccsds.moims.mo.mc.structures.AggregationValueList getValue(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.IdentifierList keys, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mal.UnknownException, org.ccsds.moims.mo.mc.AmbiguousException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation getReportingConfiguration. + * + * @param domain The domain field. + * @param keys The keys field. + * @param interaction The MAL object representing the interaction in the provider. + * @return The return value of the operation + * @throws org.ccsds.moims.mo.mal.UnknownException Operation specific. + * @throws org.ccsds.moims.mo.mc.AmbiguousException The data or operation is ambiguous, requiring clarification to proceed. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + org.ccsds.moims.mo.mc.structures.ReportConfigurationList getReportingConfiguration(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.IdentifierList keys, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mal.UnknownException, org.ccsds.moims.mo.mc.AmbiguousException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation enableReporting. + * + * @param domain The domain field. + * @param keys The keys field. + * @param interaction The MAL object representing the interaction in the provider. + * @throws org.ccsds.moims.mo.mal.UnknownException Operation specific. + * @throws org.ccsds.moims.mo.mc.AmbiguousException The data or operation is ambiguous, requiring clarification to proceed. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + void enableReporting(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.IdentifierList keys, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mal.UnknownException, org.ccsds.moims.mo.mc.AmbiguousException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation disableReporting. + * + * @param domain The domain field. + * @param keys The keys field. + * @param interaction The MAL object representing the interaction in the provider. + * @throws org.ccsds.moims.mo.mal.UnknownException Operation specific. + * @throws org.ccsds.moims.mo.mc.AmbiguousException The data or operation is ambiguous, requiring clarification to proceed. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + void disableReporting(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.IdentifierList keys, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mal.UnknownException, org.ccsds.moims.mo.mc.AmbiguousException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation setReportingPeriod. + * + * @param domain The domain field. + * @param keys The keys field. + * @param reportInterval The reportInterval field. + * @param interaction The MAL object representing the interaction in the provider. + * @throws org.ccsds.moims.mo.mal.UnknownException Operation specific. + * @throws org.ccsds.moims.mo.mc.AmbiguousException The data or operation is ambiguous, requiring clarification to proceed. + * @throws org.ccsds.moims.mo.mc.InvalidException The input data or operation format is invalid and does not meet required criteria. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + void setReportingPeriod(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.IdentifierList keys, + org.ccsds.moims.mo.mal.structures.Duration reportInterval, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mal.UnknownException, org.ccsds.moims.mo.mc.AmbiguousException, org.ccsds.moims.mo.mc.InvalidException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation listDefinition. + * + * @param domain The domain field. + * @param keys The keys field. + * @param interaction The MAL object representing the interaction in the provider. + * @return The return value of the operation + * @throws org.ccsds.moims.mo.mal.UnknownException Operation specific. + * @throws org.ccsds.moims.mo.mc.AmbiguousException The data or operation is ambiguous, requiring clarification to proceed. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + org.ccsds.moims.mo.mc.structures.AggregationDefinitionList listDefinition(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.IdentifierList keys, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mal.UnknownException, org.ccsds.moims.mo.mc.AmbiguousException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation addAggregation. + * + * @param newObjects The newObjects field. + * @param interaction The MAL object representing the interaction in the provider. + * @throws org.ccsds.moims.mo.mc.DuplicateException The entry or operation is a duplicate of an existing record, violating uniqueness. + * @throws org.ccsds.moims.mo.mc.InvalidException The input data or operation format is invalid and does not meet required criteria. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + void addAggregation(org.ccsds.moims.mo.mc.structures.AggregationDefinitionList newObjects, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mc.DuplicateException, org.ccsds.moims.mo.mc.InvalidException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation removeAggregation. + * + * @param domain The domain field. + * @param keys The keys field. + * @param interaction The MAL object representing the interaction in the provider. + * @throws org.ccsds.moims.mo.mal.UnknownException Operation specific. + * @throws org.ccsds.moims.mo.mc.AmbiguousException The data or operation is ambiguous, requiring clarification to proceed. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + void removeAggregation(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.IdentifierList keys, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mal.UnknownException, org.ccsds.moims.mo.mc.AmbiguousException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Sets the skeleton to be used for creation of publishers. + * + * @param skeleton The skeleton to be used. + */ + void setSkeleton(org.ccsds.moims.mo.mc.aggregation.provider.AggregationSkeleton skeleton); +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/aggregation/provider/AggregationInheritanceSkeleton.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/aggregation/provider/AggregationInheritanceSkeleton.java new file mode 100644 index 00000000..700c0662 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/aggregation/provider/AggregationInheritanceSkeleton.java @@ -0,0 +1,165 @@ +package org.ccsds.moims.mo.mc.aggregation.provider; + +/** + * Provider Inheritance skeleton for AggregationInheritanceSkeleton service. + */ +public abstract class AggregationInheritanceSkeleton implements org.ccsds.moims.mo.mal.provider.MALInteractionHandler, org.ccsds.moims.mo.mc.aggregation.provider.AggregationSkeleton, org.ccsds.moims.mo.mc.aggregation.provider.AggregationHandler { + + /** + * The providerSet field. + */ + private org.ccsds.moims.mo.mal.provider.MALProviderSet providerSet = new org.ccsds.moims.mo.mal.provider.MALProviderSet(org.ccsds.moims.mo.mc.aggregation.AggregationHelper.AGGREGATION_SERVICE); + + /** + * Returns the connection object for this provider. + * + * @return the connection object for this provider + * @throws java.io.IOException if the method was not implemented yet. + */ + public org.ccsds.moims.mo.mal.helpertools.connections.ConnectionProvider getConnection() throws java.io.IOException { + throw new java.io.IOException("This method needs to be overridden!"); + } + + @Override + public void setSkeleton(org.ccsds.moims.mo.mc.aggregation.provider.AggregationSkeleton skeleton) { + // Not used in the inheritance pattern (the skeleton is 'this'); + } + + @Override + public void malInitialize(org.ccsds.moims.mo.mal.provider.MALProvider provider) throws org.ccsds.moims.mo.mal.MALException { + providerSet.addProvider(provider); + } + + @Override + public void malFinalize(org.ccsds.moims.mo.mal.provider.MALProvider provider) throws org.ccsds.moims.mo.mal.MALException { + providerSet.removeProvider(provider); + } + + @Override + public org.ccsds.moims.mo.mc.aggregation.provider.MonitorValuePublisher createMonitorValuePublisher(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.Identifier networkZone, + org.ccsds.moims.mo.mal.structures.SessionType sessionType, + org.ccsds.moims.mo.mal.structures.Identifier sessionName, + org.ccsds.moims.mo.mal.structures.QoSLevel qos, + java.util.Map qosProps, + org.ccsds.moims.mo.mal.structures.UInteger priority) throws org.ccsds.moims.mo.mal.MALException { + return new org.ccsds.moims.mo.mc.aggregation.provider.MonitorValuePublisher(providerSet.createPublisherSet(org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo.MONITORVALUE_OP, domain, sessionType, sessionName, qos, qosProps, null)); + } + + @Override + public void handleSend(org.ccsds.moims.mo.mal.provider.MALInteraction interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + switch (opNumber) { + default: + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } + + @Override + public void handleSubmit(org.ccsds.moims.mo.mal.provider.MALSubmit interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + try { + switch (opNumber) { + case org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo._ENABLEREPORTING_OP_NUMBER: + enableReporting((org.ccsds.moims.mo.mal.structures.IdentifierList) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.IdentifierList()), + (org.ccsds.moims.mo.mal.structures.IdentifierList) body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.IdentifierList()), + interaction); + interaction.sendAcknowledgement(); + break; + case org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo._DISABLEREPORTING_OP_NUMBER: + disableReporting((org.ccsds.moims.mo.mal.structures.IdentifierList) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.IdentifierList()), + (org.ccsds.moims.mo.mal.structures.IdentifierList) body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.IdentifierList()), + interaction); + interaction.sendAcknowledgement(); + break; + case org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo._SETREPORTINGPERIOD_OP_NUMBER: + setReportingPeriod((org.ccsds.moims.mo.mal.structures.IdentifierList) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.IdentifierList()), + (org.ccsds.moims.mo.mal.structures.IdentifierList) body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.IdentifierList()), + (org.ccsds.moims.mo.mal.structures.Duration) body.getBodyElement(2, new org.ccsds.moims.mo.mal.structures.Duration()), + interaction); + interaction.sendAcknowledgement(); + break; + case org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo._ADDAGGREGATION_OP_NUMBER: + addAggregation((org.ccsds.moims.mo.mc.structures.AggregationDefinitionList) body.getBodyElement(0, new org.ccsds.moims.mo.mc.structures.AggregationDefinitionList()), + interaction); + interaction.sendAcknowledgement(); + break; + case org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo._REMOVEAGGREGATION_OP_NUMBER: + removeAggregation((org.ccsds.moims.mo.mal.structures.IdentifierList) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.IdentifierList()), + (org.ccsds.moims.mo.mal.structures.IdentifierList) body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.IdentifierList()), + interaction); + interaction.sendAcknowledgement(); + break; + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } catch (org.ccsds.moims.mo.mal.MOErrorException error) { + throw new org.ccsds.moims.mo.mal.MALInteractionException(error); + } + } + + @Override + public void handleRequest(org.ccsds.moims.mo.mal.provider.MALRequest interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + try { + switch (opNumber) { + case org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo._GETVALUE_OP_NUMBER: + interaction.sendResponse(getValue((org.ccsds.moims.mo.mal.structures.IdentifierList) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.IdentifierList()), + (org.ccsds.moims.mo.mal.structures.IdentifierList) body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.IdentifierList()), + interaction)); + break; + case org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo._GETREPORTINGCONFIGURATION_OP_NUMBER: + interaction.sendResponse(getReportingConfiguration((org.ccsds.moims.mo.mal.structures.IdentifierList) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.IdentifierList()), + (org.ccsds.moims.mo.mal.structures.IdentifierList) body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.IdentifierList()), + interaction)); + break; + case org.ccsds.moims.mo.mc.aggregation.AggregationServiceInfo._LISTDEFINITION_OP_NUMBER: + interaction.sendResponse(listDefinition((org.ccsds.moims.mo.mal.structures.IdentifierList) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.IdentifierList()), + (org.ccsds.moims.mo.mal.structures.IdentifierList) body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.IdentifierList()), + interaction)); + break; + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } catch (org.ccsds.moims.mo.mal.MOErrorException error) { + throw new org.ccsds.moims.mo.mal.MALInteractionException(error); + } + } + + @Override + public void handleInvoke(org.ccsds.moims.mo.mal.provider.MALInvoke interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + switch (opNumber) { + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } + + @Override + public void handleProgress(org.ccsds.moims.mo.mal.provider.MALProgress interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + switch (opNumber) { + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/aggregation/provider/AggregationSkeleton.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/aggregation/provider/AggregationSkeleton.java new file mode 100644 index 00000000..36098cb2 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/aggregation/provider/AggregationSkeleton.java @@ -0,0 +1,29 @@ +package org.ccsds.moims.mo.mc.aggregation.provider; + +/** + * The skeleton interface for the Aggregation service. + */ +public interface AggregationSkeleton { + + /** + * Creates a publisher object using the current registered provider set for + * the PubSub operation monitorValue. + * + * @param domain The domain used for publishing + * @param networkZone ~The network zone used for publishing + * @param sessionType The session used for publishing + * @param sessionName The session name used for publishing + * @param qos The QoS used for publishing + * @param qosProps The QoS properties used for publishing + * @param priority The priority used for publishing + * @return The new publisher object. + * @throws org.ccsds.moims.mo.mal.MALException if a problem is detected during creation of the publisher + */ + org.ccsds.moims.mo.mc.aggregation.provider.MonitorValuePublisher createMonitorValuePublisher(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.Identifier networkZone, + org.ccsds.moims.mo.mal.structures.SessionType sessionType, + org.ccsds.moims.mo.mal.structures.Identifier sessionName, + org.ccsds.moims.mo.mal.structures.QoSLevel qos, + java.util.Map qosProps, + org.ccsds.moims.mo.mal.structures.UInteger priority) throws org.ccsds.moims.mo.mal.MALException; +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/aggregation/provider/MonitorValuePublisher.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/aggregation/provider/MonitorValuePublisher.java new file mode 100644 index 00000000..587c0a62 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/aggregation/provider/MonitorValuePublisher.java @@ -0,0 +1,121 @@ +package org.ccsds.moims.mo.mc.aggregation.provider; + +/** + * Publisher class for the monitorValue operation. + */ +public final class MonitorValuePublisher { + + /** + * The publisherSet field. + */ + private org.ccsds.moims.mo.mal.provider.MALPublisherSet publisherSet; + + /** + * Creates an instance of this class using the supplied publisher set. + * + * @param publisherSet The set of broker connections to use when registering and publishing. + */ + public MonitorValuePublisher(org.ccsds.moims.mo.mal.provider.MALPublisherSet publisherSet) { + this.publisherSet = publisherSet; + } + + /** + * Registers this provider implementation to the set of broker connections. + * + * @param keyNames The key names to use in the method + * @param keyTypes The key types to use in the method + * @param listener The listener object to use for callback from the publisher + * @throws java.lang.IllegalArgumentException If any supplied argument is invalid + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void register(org.ccsds.moims.mo.mal.structures.IdentifierList keyNames, + org.ccsds.moims.mo.mal.structures.AttributeTypeList keyTypes, + org.ccsds.moims.mo.mal.provider.MALPublishInteractionListener listener) throws java.lang.IllegalArgumentException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + publisherSet.register(keyNames, keyTypes, listener); + } + + /** + * Registers this provider implementation to the set of broker connections + * with the default subscription keys. + * + * @param listener The listener object to use for callback from the publisher + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void registerWithDefaultKeys(org.ccsds.moims.mo.mal.provider.MALPublishInteractionListener listener) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + org.ccsds.moims.mo.mal.structures.IdentifierList keyNames = new org.ccsds.moims.mo.mal.structures.IdentifierList(); + org.ccsds.moims.mo.mal.structures.AttributeTypeList keyTypes = new org.ccsds.moims.mo.mal.structures.AttributeTypeList(); + keyNames.add(new org.ccsds.moims.mo.mal.structures.Identifier("aggregationKey")); + keyTypes.add(org.ccsds.moims.mo.mal.structures.AttributeType.IDENTIFIER); + keyNames.add(new org.ccsds.moims.mo.mal.structures.Identifier("aggregationVersion")); + keyTypes.add(org.ccsds.moims.mo.mal.structures.AttributeType.UINTEGER); + publisherSet.register(keyNames, keyTypes, listener); + } + + /** + * Asynchronously registers this provider implementation to the set of broker + * connections. + * + * @param keyNames The key names to use in the method + * @param keyTypes The key types to use in the method + * @param listener The listener object to use for callback from the publisher + * @throws java.lang.IllegalArgumentException If any supplied argument is invalid + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void asyncRegister(org.ccsds.moims.mo.mal.structures.IdentifierList keyNames, + org.ccsds.moims.mo.mal.structures.AttributeTypeList keyTypes, + org.ccsds.moims.mo.mal.provider.MALPublishInteractionListener listener) throws java.lang.IllegalArgumentException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + publisherSet.asyncRegister(keyNames, keyTypes, listener); + } + + /** + * Publishes updates to the set of registered broker connections. + * + * @param updateHeader The headers of the updates being added + * @param timestamp The timestamp field. + * @param values The values field. + * @throws java.lang.IllegalArgumentException If any supplied argument is invalid + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void publish(org.ccsds.moims.mo.mal.structures.UpdateHeader updateHeader, + org.ccsds.moims.mo.mal.structures.Time timestamp, + org.ccsds.moims.mo.mc.structures.ParameterValueDataList values) throws java.lang.IllegalArgumentException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + publisherSet.publish(updateHeader, timestamp, values); + } + + /** + * Deregisters this provider implementation from the set of broker connections. + * + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void deregister() throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + publisherSet.deregister(); + } + + /** + * Asynchronously deregisters this provider implementation from the set of + * broker connections. + * + * @param listener The listener object to use for callback from the publisher + * @throws java.lang.IllegalArgumentException If any supplied argument is invalid + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void asyncDeregister(org.ccsds.moims.mo.mal.provider.MALPublishInteractionListener listener) throws java.lang.IllegalArgumentException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + publisherSet.asyncDeregister(listener); + } + + /** + * Closes this publisher. + * + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void close() throws org.ccsds.moims.mo.mal.MALException { + publisherSet.close(); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/aggregation/provider/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/aggregation/provider/package-info.java new file mode 100644 index 00000000..8285fad9 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/aggregation/provider/package-info.java @@ -0,0 +1,4 @@ +/** + * Package containing the provider skeletons for the Aggregation service. +*/ +package org.ccsds.moims.mo.mc.aggregation.provider; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/alert/AlertHelper.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/alert/AlertHelper.java new file mode 100644 index 00000000..76b35fc6 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/alert/AlertHelper.java @@ -0,0 +1,17 @@ +package org.ccsds.moims.mo.mc.alert; + +/** + * Helper class for Alert service. + */ +public class AlertHelper { + + /** + * Service singleton instance. + */ + public static final org.ccsds.moims.mo.mc.alert.AlertServiceInfo ALERT_SERVICE = new org.ccsds.moims.mo.mc.alert.AlertServiceInfo(); + + private AlertHelper() { + // Utility class; not meant to be instantiated. + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/alert/AlertServiceInfo.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/alert/AlertServiceInfo.java new file mode 100644 index 00000000..3d95dc29 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/alert/AlertServiceInfo.java @@ -0,0 +1,175 @@ +package org.ccsds.moims.mo.mc.alert; + +/** + * Helper class for Alert service. + */ +public class AlertServiceInfo extends org.ccsds.moims.mo.mal.ServiceInfo { + + /** + * Service number literal. + */ + public static final int _ALERT_SERVICE_NUMBER = 3; + + /** + * Service number instance. + */ + public static final org.ccsds.moims.mo.mal.structures.UShort ALERT_SERVICE_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_ALERT_SERVICE_NUMBER); + + /** + * Service name constant. + */ + public static final org.ccsds.moims.mo.mal.structures.Identifier ALERT_SERVICE_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("Alert"); + + /** + * The service key of this service. + */ + private static final org.ccsds.moims.mo.mal.ServiceKey SERVICE_KEY = new org.ccsds.moims.mo.mal.ServiceKey( + 4, 2, ALERT_SERVICE_NUMBER); + + /** + * Operation number literal for operation MONITORALERT. + */ + public static final int _MONITORALERT_OP_NUMBER = 1; + + /** + * Operation number instance for operation MONITORALERT. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort MONITORALERT_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_MONITORALERT_OP_NUMBER); + + /** + * Operation instance for operation MONITORALERT. + */ + public static final org.ccsds.moims.mo.mal.MALPubSubOperation MONITORALERT_OP = new org.ccsds.moims.mo.mal.MALPubSubOperation(SERVICE_KEY, + MONITORALERT_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("monitorAlert"), + new org.ccsds.moims.mo.mal.structures.UShort(1), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("timestamp", false, org.ccsds.moims.mo.mal.structures.Attribute.TIME_SHORT_FORM, ""), + new org.ccsds.moims.mo.mal.OperationField("arguments", true, org.ccsds.moims.mo.mal.structures.NullableAttributeList.SHORT_FORM, "")}, + "The monitorAlert operation allows a consumer to subscribe for alerts."); + + /** + * Key names instance for MONITORALERT operation of pubsub interaction pattern. + */ + private static final org.ccsds.moims.mo.mal.structures.Identifier [] _MONITORALERT_OP_KEY_NAMES = {new org.ccsds.moims.mo.mal.structures.Identifier("alertKey"), + new org.ccsds.moims.mo.mal.structures.Identifier("alertVersion"), + new org.ccsds.moims.mo.mal.structures.Identifier("alertSeverity")}; + + /** + * Key names instance for MONITORALERT operation of pubsub interaction pattern. + */ + private static final org.ccsds.moims.mo.mal.structures.IdentifierList MONITORALERT_OP_KEY_NAMES = new org.ccsds.moims.mo.mal.structures.IdentifierList(new java.util.ArrayList<>(java.util.Arrays.asList(_MONITORALERT_OP_KEY_NAMES))); + + /** + * Operation number literal for operation GETALERTCONFIGURATION. + */ + public static final int _GETALERTCONFIGURATION_OP_NUMBER = 2; + + /** + * Operation number instance for operation GETALERTCONFIGURATION. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort GETALERTCONFIGURATION_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_GETALERTCONFIGURATION_OP_NUMBER); + + /** + * Operation instance for operation GETALERTCONFIGURATION. + */ + public static final org.ccsds.moims.mo.mal.MALRequestOperation GETALERTCONFIGURATION_OP = new org.ccsds.moims.mo.mal.MALRequestOperation(SERVICE_KEY, + GETALERTCONFIGURATION_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("getAlertConfiguration"), + new org.ccsds.moims.mo.mal.structures.UShort(2), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("domain", true, org.ccsds.moims.mo.mal.structures.IdentifierList.SHORT_FORM, ""), + new org.ccsds.moims.mo.mal.OperationField("keys", false, org.ccsds.moims.mo.mal.structures.IdentifierList.SHORT_FORM, "")}, + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("alertConfigs", false, org.ccsds.moims.mo.mc.structures.AlertConfigurationList.SHORT_FORM, "")}, + "The getAlertConfiguration operation allows a consumer to retrieve the current configuration for the generation of an alert."); + + /** + * Operation number literal for operation ENABLEGENERATION. + */ + public static final int _ENABLEGENERATION_OP_NUMBER = 3; + + /** + * Operation number instance for operation ENABLEGENERATION. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort ENABLEGENERATION_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_ENABLEGENERATION_OP_NUMBER); + + /** + * Operation instance for operation ENABLEGENERATION. + */ + public static final org.ccsds.moims.mo.mal.MALSubmitOperation ENABLEGENERATION_OP = new org.ccsds.moims.mo.mal.MALSubmitOperation(SERVICE_KEY, + ENABLEGENERATION_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("enableGeneration"), + new org.ccsds.moims.mo.mal.structures.UShort(2), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("domain", true, org.ccsds.moims.mo.mal.structures.IdentifierList.SHORT_FORM, ""), + new org.ccsds.moims.mo.mal.OperationField("keys", true, org.ccsds.moims.mo.mal.structures.IdentifierList.SHORT_FORM, "")}, + "The enableGeneration operation allows a consumer to control whether instances of specific alerts are generated or not."); + + /** + * Operation number literal for operation DISABLEGENERATION. + */ + public static final int _DISABLEGENERATION_OP_NUMBER = 4; + + /** + * Operation number instance for operation DISABLEGENERATION. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort DISABLEGENERATION_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_DISABLEGENERATION_OP_NUMBER); + + /** + * Operation instance for operation DISABLEGENERATION. + */ + public static final org.ccsds.moims.mo.mal.MALSubmitOperation DISABLEGENERATION_OP = new org.ccsds.moims.mo.mal.MALSubmitOperation(SERVICE_KEY, + DISABLEGENERATION_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("disableGeneration"), + new org.ccsds.moims.mo.mal.structures.UShort(2), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("domain", true, org.ccsds.moims.mo.mal.structures.IdentifierList.SHORT_FORM, ""), + new org.ccsds.moims.mo.mal.OperationField("keys", true, org.ccsds.moims.mo.mal.structures.IdentifierList.SHORT_FORM, "")}, + "The disableGeneration operation allows a consumer to stop the generation of instances of specific alerts."); + + /** + * Area elements. + */ + public static final org.ccsds.moims.mo.mal.structures.Element[] ALERT_SERVICE_ELEMENTS = {}; + + /** + * The set of operations for this service. + */ + public static final org.ccsds.moims.mo.mal.MALOperation[] OPERATIONS = new org.ccsds.moims.mo.mal.MALOperation[]{MONITORALERT_OP, + GETALERTCONFIGURATION_OP, + ENABLEGENERATION_OP, + DISABLEGENERATION_OP}; + + /** + * Creates an instance of the Alert ServiceInfo. + * + */ + public AlertServiceInfo() { + super(SERVICE_KEY, ALERT_SERVICE_NAME, ALERT_SERVICE_ELEMENTS, OPERATIONS); + } + + @Override + public org.ccsds.moims.mo.mal.MALArea getArea() { + return org.ccsds.moims.mo.mc.MCHelper.MC_AREA; + } + + @Override + public org.ccsds.moims.mo.mal.MOErrorException generateMOError(int errorNumber, + Object extraInfo) { + switch (errorNumber) { + case 1: + return new org.ccsds.moims.mo.mc.ReadOnlyException(extraInfo); + case 2: + return new org.ccsds.moims.mo.mc.DuplicateException(extraInfo); + case 3: + return new org.ccsds.moims.mo.mc.InvalidException(extraInfo); + case 4: + return new org.ccsds.moims.mo.mc.RejectedException(extraInfo); + case 5: + return new org.ccsds.moims.mo.mc.AmbiguousException(extraInfo); + } + return null; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/alert/consumer/AlertAdapter.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/alert/consumer/AlertAdapter.java new file mode 100644 index 00000000..44628bab --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/alert/consumer/AlertAdapter.java @@ -0,0 +1,297 @@ +package org.ccsds.moims.mo.mc.alert.consumer; + +/** + * Consumer adapter for Alert service. + */ +public abstract class AlertAdapter extends org.ccsds.moims.mo.mal.consumer.MALInteractionAdapter { + + /** + * Called by the MAL when a PubSub register acknowledgement is received from + * a broker for the operation monitorAlert. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void monitorAlertRegisterAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PubSub register acknowledgement error is received + * from a broker for the operation monitorAlert. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void monitorAlertRegisterErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PubSub deregister acknowledgement is received + * from a broker for the operation monitorAlert. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void monitorAlertDeregisterAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PubSub update is received from a broker for the + * operation monitorAlert. + * + * @param msgHeader msgHeader The header of the received message + * @param subscriptionId The subscriptionId of the subscription. + * @param updateHeader The Update header. + * @param keys The typed Subscription Key accessors for this update + * @param timestamp The timestamp field. + * @param arguments The arguments field. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void monitorAlertNotifyReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.structures.Identifier subscriptionId, + org.ccsds.moims.mo.mal.structures.UpdateHeader updateHeader, + MonitorAlertSubscriptionKeys keys, + org.ccsds.moims.mo.mal.structures.Time timestamp, + org.ccsds.moims.mo.mal.structures.NullableAttributeList arguments, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PubSub update error is received from a broker + * for the operation monitorAlert. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void monitorAlertNotifyErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response is received from a provider for + * the operation getAlertConfiguration. + * + * @param msgHeader msgHeader The header of the received message + * @param alertConfigs The alertConfigs field. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void getAlertConfigurationResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mc.structures.AlertConfigurationList alertConfigs, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response error is received from a provider + * for the operation getAlertConfiguration. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void getAlertConfigurationErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a SUBMIT acknowledgement is received from a provider + * for the operation enableGeneration. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void enableGenerationAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a SUBMIT acknowledgement error is received from + * a provider for the operation enableGeneration. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void enableGenerationErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a SUBMIT acknowledgement is received from a provider + * for the operation disableGeneration. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void disableGenerationAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a SUBMIT acknowledgement error is received from + * a provider for the operation disableGeneration. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void disableGenerationErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + @Override + public final void submitAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mc.alert.AlertServiceInfo._ENABLEGENERATION_OP_NUMBER: + enableGenerationAckReceived(msgHeader, qosProperties); + break; + case org.ccsds.moims.mo.mc.alert.AlertServiceInfo._DISABLEGENERATION_OP_NUMBER: + disableGenerationAckReceived(msgHeader, qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void submitErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALErrorBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mc.alert.AlertServiceInfo._ENABLEGENERATION_OP_NUMBER: + enableGenerationErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mc.alert.AlertServiceInfo._DISABLEGENERATION_OP_NUMBER: + disableGenerationErrorReceived(msgHeader, body.getError(), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void requestResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALMessageBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mc.alert.AlertServiceInfo._GETALERTCONFIGURATION_OP_NUMBER: + getAlertConfigurationResponseReceived(msgHeader, + (org.ccsds.moims.mo.mc.structures.AlertConfigurationList) body.getBodyElement(0, new org.ccsds.moims.mo.mc.structures.AlertConfigurationList()), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void requestErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALErrorBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mc.alert.AlertServiceInfo._GETALERTCONFIGURATION_OP_NUMBER: + getAlertConfigurationErrorReceived(msgHeader, body.getError(), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void registerAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mc.alert.AlertServiceInfo._MONITORALERT_OP_NUMBER: + monitorAlertRegisterAckReceived(msgHeader, qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void registerErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALErrorBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mc.alert.AlertServiceInfo._MONITORALERT_OP_NUMBER: + monitorAlertRegisterErrorReceived(msgHeader, body.getError(), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void notifyReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALNotifyBody body, + org.ccsds.moims.mo.mal.structures.IdentifierList selectedKeys, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + if ((org.ccsds.moims.mo.mc.MCHelper.MC_AREA_NUMBER.equals(msgHeader.getServiceArea())) && (org.ccsds.moims.mo.mc.alert.AlertServiceInfo.ALERT_SERVICE_NUMBER.equals(msgHeader.getService()))) { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mc.alert.AlertServiceInfo._MONITORALERT_OP_NUMBER: + monitorAlertNotifyReceived(msgHeader, + (org.ccsds.moims.mo.mal.structures.Identifier) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.Identifier()), + (org.ccsds.moims.mo.mal.structures.UpdateHeader) body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.UpdateHeader()), + new MonitorAlertSubscriptionKeys((org.ccsds.moims.mo.mal.structures.UpdateHeader) body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.UpdateHeader()), selectedKeys), + (org.ccsds.moims.mo.mal.structures.Time) body.getBodyElement(2, new org.ccsds.moims.mo.mal.structures.Time()), + (org.ccsds.moims.mo.mal.structures.NullableAttributeList) body.getBodyElement(3, new org.ccsds.moims.mo.mal.structures.NullableAttributeList()), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + else { + notifyReceivedFromOtherService(msgHeader, body, qosProperties); + } + } + + @Override + public final void notifyErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALErrorBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mc.alert.AlertServiceInfo._MONITORALERT_OP_NUMBER: + monitorAlertNotifyErrorReceived(msgHeader, body.getError(), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void deregisterAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mc.alert.AlertServiceInfo._MONITORALERT_OP_NUMBER: + monitorAlertDeregisterAckReceived(msgHeader, qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + /** + * Called by the MAL when a PubSub update from another service is received + * from a broker. + * + * @param msgHeader msgHeader The header of the received message + * @param body body The body of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + * @throws org.ccsds.moims.mo.mal.MALException if an error is detected processing the message. + */ + public void notifyReceivedFromOtherService(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALNotifyBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/alert/consumer/AlertStub.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/alert/consumer/AlertStub.java new file mode 100644 index 00000000..b1eff60a --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/alert/consumer/AlertStub.java @@ -0,0 +1,229 @@ +package org.ccsds.moims.mo.mc.alert.consumer; + +/** + * Consumer stub for Alert service. + */ +public class AlertStub { + + /** + * The consumer field. + */ + private final org.ccsds.moims.mo.mal.consumer.MALConsumer consumer; + + /** + * Wraps a MALconsumer connection with service specific methods that map from + * the high level service API to the generic MAL API. + * + * @param consumer consumer The MALConsumer to use in this stub. + */ + public AlertStub(org.ccsds.moims.mo.mal.consumer.MALConsumer consumer) { + this.consumer = consumer; + } + + /** + * Returns the internal MAL consumer object used for sending of messages from + * this interface. + * + * @return The MAL consumer object. + */ + public org.ccsds.moims.mo.mal.consumer.MALConsumer getConsumer() { + return consumer; + } + + /** + * Register method for the monitorAlert PubSub interaction. + * + * @param subscription subscription the subscription to register for + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void monitorAlertRegister(org.ccsds.moims.mo.mal.structures.Subscription subscription, + org.ccsds.moims.mo.mc.alert.consumer.AlertAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.register(org.ccsds.moims.mo.mc.alert.AlertServiceInfo.MONITORALERT_OP, subscription, adapter); + } + + /** + * Asynchronous version of method monitorAlertRegister. + * + * @param subscription subscription the subscription to register for + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncMonitorAlertRegister(org.ccsds.moims.mo.mal.structures.Subscription subscription, + org.ccsds.moims.mo.mc.alert.consumer.AlertAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncRegister(org.ccsds.moims.mo.mc.alert.AlertServiceInfo.MONITORALERT_OP, subscription, adapter); + } + + /** + * Deregister method for the monitorAlert PubSub interaction. + * + * @param identifierList identifierList the subscription identifiers to deregister + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void monitorAlertDeregister(org.ccsds.moims.mo.mal.structures.IdentifierList identifierList) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.deregister(org.ccsds.moims.mo.mc.alert.AlertServiceInfo.MONITORALERT_OP, identifierList); + } + + /** + * Asynchronous version of method monitorAlertDeregister. + * + * @param identifierList identifierList the subscription identifiers to deregister + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncMonitorAlertDeregister(org.ccsds.moims.mo.mal.structures.IdentifierList identifierList, + org.ccsds.moims.mo.mc.alert.consumer.AlertAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncDeregister(org.ccsds.moims.mo.mc.alert.AlertServiceInfo.MONITORALERT_OP, identifierList, adapter); + } + + /** + * The getAlertConfiguration operation allows a consumer to retrieve the current + * configuration for the generation of an alert. + * + * @param domain The domain field. + * @param keys The keys field. + * @return The return value of the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mc.structures.AlertConfigurationList getAlertConfiguration(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.IdentifierList keys) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + org.ccsds.moims.mo.mal.transport.MALMessageBody body = consumer.request(org.ccsds.moims.mo.mc.alert.AlertServiceInfo.GETALERTCONFIGURATION_OP, domain, keys); + Object body0 = (Object) body.getBodyElement(0, new org.ccsds.moims.mo.mc.structures.AlertConfigurationList()); + return (org.ccsds.moims.mo.mc.structures.AlertConfigurationList) body0; + } + + /** + * Asynchronous version of method getAlertConfiguration. + * + * @param domain The domain field. + * @param keys The keys field. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncGetAlertConfiguration(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.IdentifierList keys, + org.ccsds.moims.mo.mc.alert.consumer.AlertAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncRequest(org.ccsds.moims.mo.mc.alert.AlertServiceInfo.GETALERTCONFIGURATION_OP, adapter, domain, keys); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueGetAlertConfiguration(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mc.alert.consumer.AlertAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mc.alert.AlertServiceInfo.GETALERTCONFIGURATION_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The enableGeneration operation allows a consumer to control whether instances + * of specific alerts are generated or not. + * + * @param domain The domain field. + * @param keys The keys field. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void enableGeneration(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.IdentifierList keys) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.submit(org.ccsds.moims.mo.mc.alert.AlertServiceInfo.ENABLEGENERATION_OP, domain, keys); + } + + /** + * Asynchronous version of method enableGeneration. + * + * @param domain The domain field. + * @param keys The keys field. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncEnableGeneration(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.IdentifierList keys, + org.ccsds.moims.mo.mc.alert.consumer.AlertAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncSubmit(org.ccsds.moims.mo.mc.alert.AlertServiceInfo.ENABLEGENERATION_OP, adapter, domain, keys); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueEnableGeneration(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mc.alert.consumer.AlertAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mc.alert.AlertServiceInfo.ENABLEGENERATION_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The disableGeneration operation allows a consumer to stop the generation + * of instances of specific alerts. + * + * @param domain The domain field. + * @param keys The keys field. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void disableGeneration(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.IdentifierList keys) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.submit(org.ccsds.moims.mo.mc.alert.AlertServiceInfo.DISABLEGENERATION_OP, domain, keys); + } + + /** + * Asynchronous version of method disableGeneration. + * + * @param domain The domain field. + * @param keys The keys field. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncDisableGeneration(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.IdentifierList keys, + org.ccsds.moims.mo.mc.alert.consumer.AlertAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncSubmit(org.ccsds.moims.mo.mc.alert.AlertServiceInfo.DISABLEGENERATION_OP, adapter, domain, keys); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueDisableGeneration(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mc.alert.consumer.AlertAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mc.alert.AlertServiceInfo.DISABLEGENERATION_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/alert/consumer/MonitorAlertSubscriptionKeys.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/alert/consumer/MonitorAlertSubscriptionKeys.java new file mode 100644 index 00000000..47a82f9e --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/alert/consumer/MonitorAlertSubscriptionKeys.java @@ -0,0 +1,97 @@ +package org.ccsds.moims.mo.mc.alert.consumer; + +/** + * Typed accessors for the Subscription Keys of the monitorAlert PubSub operation. + */ +public final class MonitorAlertSubscriptionKeys { + + /** + * The key values as received in the UpdateHeader. + */ + private org.ccsds.moims.mo.mal.structures.NullableAttributeList keyValues; + + /** + * The effective key names for the received key values. + */ + private org.ccsds.moims.mo.mal.structures.IdentifierList keyNames; + + /** + * The Subscription Key names defined by the operation, in order. + */ + private static final org.ccsds.moims.mo.mal.structures.IdentifierList CANONICAL_KEY_NAMES = new org.ccsds.moims.mo.mal.structures.IdentifierList(new java.util.ArrayList<>(java.util.Arrays.asList(new org.ccsds.moims.mo.mal.structures.Identifier("alertKey"), new org.ccsds.moims.mo.mal.structures.Identifier("alertVersion"), new org.ccsds.moims.mo.mal.structures.Identifier("alertSeverity")))); + + /** + * Creates an instance from the received UpdateHeader and the subscription + * selectedKeys. + * + * @param updateHeader The UpdateHeader received in the NOTIFY message + * @param selectedKeys The selectedKeys of the subscription, or null if trimming was not enabled + */ + public MonitorAlertSubscriptionKeys(org.ccsds.moims.mo.mal.structures.UpdateHeader updateHeader, + org.ccsds.moims.mo.mal.structures.IdentifierList selectedKeys) { + this.keyValues = (updateHeader == null) ? null : updateHeader.getKeyValues(); + this.keyNames = (selectedKeys != null) ? selectedKeys : CANONICAL_KEY_NAMES; + } + + /** + * Returns the value of the "alertKey" Subscription Key, or null if not present. + * + * @return The key value, or null if not present + */ + public org.ccsds.moims.mo.mal.structures.Identifier getAlertKey() { + return (org.ccsds.moims.mo.mal.structures.Identifier) valueByName("alertKey"); + } + + /** + * Returns the value of the "alertVersion" Subscription Key, or null if not + * present. + * + * @return The key value, or null if not present + */ + public org.ccsds.moims.mo.mal.structures.UInteger getAlertVersion() { + return (org.ccsds.moims.mo.mal.structures.UInteger) valueByName("alertVersion"); + } + + /** + * Returns the value of the "alertSeverity" Subscription Key, or null if not + * present. + * + * @return The key value, or null if not present + */ + public org.ccsds.moims.mo.mal.structures.UOctet getAlertSeverity() { + return (org.ccsds.moims.mo.mal.structures.UOctet) valueByName("alertSeverity"); + } + + /** + * Returns the Subscription Key value with the given name, or null if it is + * not present (for example when it was trimmed away or is a custom key that + * is not part of this subscription). + * + * @param name The Subscription Key name + * @return The key value, or null if not present + */ + public org.ccsds.moims.mo.mal.structures.Attribute getByName(String name) { + return valueByName(name); + } + + /** + * + * @param name The Subscription Key name + */ + private org.ccsds.moims.mo.mal.structures.Attribute valueByName(String name) { + if (keyNames == null || keyValues == null) { + return null; + } + for (int i = 0; i < keyNames.size(); i++) { + if (name.equals(keyNames.get(i).getValue())) { + if (i >= keyValues.size()) { + return null; + } + org.ccsds.moims.mo.mal.structures.NullableAttribute na = keyValues.get(i); + return (na == null) ? null : na.getValue(); + } + } + return null; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/alert/consumer/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/alert/consumer/package-info.java new file mode 100644 index 00000000..2b2ee49f --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/alert/consumer/package-info.java @@ -0,0 +1,4 @@ +/** + * Package containing the consumer stubs for the Alert service. +*/ +package org.ccsds.moims.mo.mc.alert.consumer; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/alert/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/alert/package-info.java new file mode 100644 index 00000000..8b01ad98 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/alert/package-info.java @@ -0,0 +1,5 @@ +/** + * The alert service defines the structures and patterns for the publishing + * and monitoring of alerts. +*/ +package org.ccsds.moims.mo.mc.alert; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/alert/provider/AlertHandler.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/alert/provider/AlertHandler.java new file mode 100644 index 00000000..8e1aeae4 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/alert/provider/AlertHandler.java @@ -0,0 +1,58 @@ +package org.ccsds.moims.mo.mc.alert.provider; + +/** + * Interface that providers of the Alert service must implement to handle + * the operations of that service. + */ +public interface AlertHandler { + + /** + * Implements the operation getAlertConfiguration. + * + * @param domain The domain field. + * @param keys The keys field. + * @param interaction The MAL object representing the interaction in the provider. + * @return The return value of the operation + * @throws org.ccsds.moims.mo.mal.UnknownException Operation specific. + * @throws org.ccsds.moims.mo.mc.AmbiguousException The data or operation is ambiguous, requiring clarification to proceed. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + org.ccsds.moims.mo.mc.structures.AlertConfigurationList getAlertConfiguration(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.IdentifierList keys, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mal.UnknownException, org.ccsds.moims.mo.mc.AmbiguousException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation enableGeneration. + * + * @param domain The domain field. + * @param keys The keys field. + * @param interaction The MAL object representing the interaction in the provider. + * @throws org.ccsds.moims.mo.mal.UnknownException Operation specific. + * @throws org.ccsds.moims.mo.mc.AmbiguousException The data or operation is ambiguous, requiring clarification to proceed. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + void enableGeneration(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.IdentifierList keys, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mal.UnknownException, org.ccsds.moims.mo.mc.AmbiguousException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation disableGeneration. + * + * @param domain The domain field. + * @param keys The keys field. + * @param interaction The MAL object representing the interaction in the provider. + * @throws org.ccsds.moims.mo.mal.UnknownException Operation specific. + * @throws org.ccsds.moims.mo.mc.AmbiguousException The data or operation is ambiguous, requiring clarification to proceed. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + void disableGeneration(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.IdentifierList keys, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mal.UnknownException, org.ccsds.moims.mo.mc.AmbiguousException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Sets the skeleton to be used for creation of publishers. + * + * @param skeleton The skeleton to be used. + */ + void setSkeleton(org.ccsds.moims.mo.mc.alert.provider.AlertSkeleton skeleton); +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/alert/provider/AlertInheritanceSkeleton.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/alert/provider/AlertInheritanceSkeleton.java new file mode 100644 index 00000000..cbeb501c --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/alert/provider/AlertInheritanceSkeleton.java @@ -0,0 +1,137 @@ +package org.ccsds.moims.mo.mc.alert.provider; + +/** + * Provider Inheritance skeleton for AlertInheritanceSkeleton service. + */ +public abstract class AlertInheritanceSkeleton implements org.ccsds.moims.mo.mal.provider.MALInteractionHandler, org.ccsds.moims.mo.mc.alert.provider.AlertSkeleton, org.ccsds.moims.mo.mc.alert.provider.AlertHandler { + + /** + * The providerSet field. + */ + private org.ccsds.moims.mo.mal.provider.MALProviderSet providerSet = new org.ccsds.moims.mo.mal.provider.MALProviderSet(org.ccsds.moims.mo.mc.alert.AlertHelper.ALERT_SERVICE); + + /** + * Returns the connection object for this provider. + * + * @return the connection object for this provider + * @throws java.io.IOException if the method was not implemented yet. + */ + public org.ccsds.moims.mo.mal.helpertools.connections.ConnectionProvider getConnection() throws java.io.IOException { + throw new java.io.IOException("This method needs to be overridden!"); + } + + @Override + public void setSkeleton(org.ccsds.moims.mo.mc.alert.provider.AlertSkeleton skeleton) { + // Not used in the inheritance pattern (the skeleton is 'this'); + } + + @Override + public void malInitialize(org.ccsds.moims.mo.mal.provider.MALProvider provider) throws org.ccsds.moims.mo.mal.MALException { + providerSet.addProvider(provider); + } + + @Override + public void malFinalize(org.ccsds.moims.mo.mal.provider.MALProvider provider) throws org.ccsds.moims.mo.mal.MALException { + providerSet.removeProvider(provider); + } + + @Override + public org.ccsds.moims.mo.mc.alert.provider.MonitorAlertPublisher createMonitorAlertPublisher(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.Identifier networkZone, + org.ccsds.moims.mo.mal.structures.SessionType sessionType, + org.ccsds.moims.mo.mal.structures.Identifier sessionName, + org.ccsds.moims.mo.mal.structures.QoSLevel qos, + java.util.Map qosProps, + org.ccsds.moims.mo.mal.structures.UInteger priority) throws org.ccsds.moims.mo.mal.MALException { + return new org.ccsds.moims.mo.mc.alert.provider.MonitorAlertPublisher(providerSet.createPublisherSet(org.ccsds.moims.mo.mc.alert.AlertServiceInfo.MONITORALERT_OP, domain, sessionType, sessionName, qos, qosProps, null)); + } + + @Override + public void handleSend(org.ccsds.moims.mo.mal.provider.MALInteraction interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + switch (opNumber) { + default: + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } + + @Override + public void handleSubmit(org.ccsds.moims.mo.mal.provider.MALSubmit interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + try { + switch (opNumber) { + case org.ccsds.moims.mo.mc.alert.AlertServiceInfo._ENABLEGENERATION_OP_NUMBER: + enableGeneration((org.ccsds.moims.mo.mal.structures.IdentifierList) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.IdentifierList()), + (org.ccsds.moims.mo.mal.structures.IdentifierList) body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.IdentifierList()), + interaction); + interaction.sendAcknowledgement(); + break; + case org.ccsds.moims.mo.mc.alert.AlertServiceInfo._DISABLEGENERATION_OP_NUMBER: + disableGeneration((org.ccsds.moims.mo.mal.structures.IdentifierList) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.IdentifierList()), + (org.ccsds.moims.mo.mal.structures.IdentifierList) body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.IdentifierList()), + interaction); + interaction.sendAcknowledgement(); + break; + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } catch (org.ccsds.moims.mo.mal.MOErrorException error) { + throw new org.ccsds.moims.mo.mal.MALInteractionException(error); + } + } + + @Override + public void handleRequest(org.ccsds.moims.mo.mal.provider.MALRequest interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + try { + switch (opNumber) { + case org.ccsds.moims.mo.mc.alert.AlertServiceInfo._GETALERTCONFIGURATION_OP_NUMBER: + interaction.sendResponse(getAlertConfiguration((org.ccsds.moims.mo.mal.structures.IdentifierList) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.IdentifierList()), + (org.ccsds.moims.mo.mal.structures.IdentifierList) body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.IdentifierList()), + interaction)); + break; + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } catch (org.ccsds.moims.mo.mal.MOErrorException error) { + throw new org.ccsds.moims.mo.mal.MALInteractionException(error); + } + } + + @Override + public void handleInvoke(org.ccsds.moims.mo.mal.provider.MALInvoke interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + switch (opNumber) { + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } + + @Override + public void handleProgress(org.ccsds.moims.mo.mal.provider.MALProgress interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + switch (opNumber) { + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/alert/provider/AlertSkeleton.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/alert/provider/AlertSkeleton.java new file mode 100644 index 00000000..3ea1284e --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/alert/provider/AlertSkeleton.java @@ -0,0 +1,29 @@ +package org.ccsds.moims.mo.mc.alert.provider; + +/** + * The skeleton interface for the Alert service. + */ +public interface AlertSkeleton { + + /** + * Creates a publisher object using the current registered provider set for + * the PubSub operation monitorAlert. + * + * @param domain The domain used for publishing + * @param networkZone ~The network zone used for publishing + * @param sessionType The session used for publishing + * @param sessionName The session name used for publishing + * @param qos The QoS used for publishing + * @param qosProps The QoS properties used for publishing + * @param priority The priority used for publishing + * @return The new publisher object. + * @throws org.ccsds.moims.mo.mal.MALException if a problem is detected during creation of the publisher + */ + org.ccsds.moims.mo.mc.alert.provider.MonitorAlertPublisher createMonitorAlertPublisher(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.Identifier networkZone, + org.ccsds.moims.mo.mal.structures.SessionType sessionType, + org.ccsds.moims.mo.mal.structures.Identifier sessionName, + org.ccsds.moims.mo.mal.structures.QoSLevel qos, + java.util.Map qosProps, + org.ccsds.moims.mo.mal.structures.UInteger priority) throws org.ccsds.moims.mo.mal.MALException; +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/alert/provider/MonitorAlertPublisher.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/alert/provider/MonitorAlertPublisher.java new file mode 100644 index 00000000..93e1ab58 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/alert/provider/MonitorAlertPublisher.java @@ -0,0 +1,123 @@ +package org.ccsds.moims.mo.mc.alert.provider; + +/** + * Publisher class for the monitorAlert operation. + */ +public final class MonitorAlertPublisher { + + /** + * The publisherSet field. + */ + private org.ccsds.moims.mo.mal.provider.MALPublisherSet publisherSet; + + /** + * Creates an instance of this class using the supplied publisher set. + * + * @param publisherSet The set of broker connections to use when registering and publishing. + */ + public MonitorAlertPublisher(org.ccsds.moims.mo.mal.provider.MALPublisherSet publisherSet) { + this.publisherSet = publisherSet; + } + + /** + * Registers this provider implementation to the set of broker connections. + * + * @param keyNames The key names to use in the method + * @param keyTypes The key types to use in the method + * @param listener The listener object to use for callback from the publisher + * @throws java.lang.IllegalArgumentException If any supplied argument is invalid + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void register(org.ccsds.moims.mo.mal.structures.IdentifierList keyNames, + org.ccsds.moims.mo.mal.structures.AttributeTypeList keyTypes, + org.ccsds.moims.mo.mal.provider.MALPublishInteractionListener listener) throws java.lang.IllegalArgumentException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + publisherSet.register(keyNames, keyTypes, listener); + } + + /** + * Registers this provider implementation to the set of broker connections + * with the default subscription keys. + * + * @param listener The listener object to use for callback from the publisher + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void registerWithDefaultKeys(org.ccsds.moims.mo.mal.provider.MALPublishInteractionListener listener) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + org.ccsds.moims.mo.mal.structures.IdentifierList keyNames = new org.ccsds.moims.mo.mal.structures.IdentifierList(); + org.ccsds.moims.mo.mal.structures.AttributeTypeList keyTypes = new org.ccsds.moims.mo.mal.structures.AttributeTypeList(); + keyNames.add(new org.ccsds.moims.mo.mal.structures.Identifier("alertKey")); + keyTypes.add(org.ccsds.moims.mo.mal.structures.AttributeType.IDENTIFIER); + keyNames.add(new org.ccsds.moims.mo.mal.structures.Identifier("alertVersion")); + keyTypes.add(org.ccsds.moims.mo.mal.structures.AttributeType.UINTEGER); + keyNames.add(new org.ccsds.moims.mo.mal.structures.Identifier("alertSeverity")); + keyTypes.add(org.ccsds.moims.mo.mal.structures.AttributeType.UOCTET); + publisherSet.register(keyNames, keyTypes, listener); + } + + /** + * Asynchronously registers this provider implementation to the set of broker + * connections. + * + * @param keyNames The key names to use in the method + * @param keyTypes The key types to use in the method + * @param listener The listener object to use for callback from the publisher + * @throws java.lang.IllegalArgumentException If any supplied argument is invalid + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void asyncRegister(org.ccsds.moims.mo.mal.structures.IdentifierList keyNames, + org.ccsds.moims.mo.mal.structures.AttributeTypeList keyTypes, + org.ccsds.moims.mo.mal.provider.MALPublishInteractionListener listener) throws java.lang.IllegalArgumentException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + publisherSet.asyncRegister(keyNames, keyTypes, listener); + } + + /** + * Publishes updates to the set of registered broker connections. + * + * @param updateHeader The headers of the updates being added + * @param timestamp The timestamp field. + * @param arguments The arguments field. + * @throws java.lang.IllegalArgumentException If any supplied argument is invalid + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void publish(org.ccsds.moims.mo.mal.structures.UpdateHeader updateHeader, + org.ccsds.moims.mo.mal.structures.Time timestamp, + org.ccsds.moims.mo.mal.structures.NullableAttributeList arguments) throws java.lang.IllegalArgumentException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + publisherSet.publish(updateHeader, timestamp, arguments); + } + + /** + * Deregisters this provider implementation from the set of broker connections. + * + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void deregister() throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + publisherSet.deregister(); + } + + /** + * Asynchronously deregisters this provider implementation from the set of + * broker connections. + * + * @param listener The listener object to use for callback from the publisher + * @throws java.lang.IllegalArgumentException If any supplied argument is invalid + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void asyncDeregister(org.ccsds.moims.mo.mal.provider.MALPublishInteractionListener listener) throws java.lang.IllegalArgumentException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + publisherSet.asyncDeregister(listener); + } + + /** + * Closes this publisher. + * + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void close() throws org.ccsds.moims.mo.mal.MALException { + publisherSet.close(); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/alert/provider/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/alert/provider/package-info.java new file mode 100644 index 00000000..b8e46511 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/alert/provider/package-info.java @@ -0,0 +1,4 @@ +/** + * Package containing the provider skeletons for the Alert service. +*/ +package org.ccsds.moims.mo.mc.alert.provider; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/package-info.java new file mode 100644 index 00000000..d2eb8663 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/package-info.java @@ -0,0 +1,5 @@ +/** + * The M&C services provide operations for generic monitoring and control + * of a remote service provider (e.g., a spacecraft or ground system component). +*/ +package org.ccsds.moims.mo.mc; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/packet/PacketHelper.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/packet/PacketHelper.java new file mode 100644 index 00000000..8f052603 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/packet/PacketHelper.java @@ -0,0 +1,17 @@ +package org.ccsds.moims.mo.mc.packet; + +/** + * Helper class for Packet service. + */ +public class PacketHelper { + + /** + * Service singleton instance. + */ + public static final org.ccsds.moims.mo.mc.packet.PacketServiceInfo PACKET_SERVICE = new org.ccsds.moims.mo.mc.packet.PacketServiceInfo(); + + private PacketHelper() { + // Utility class; not meant to be instantiated. + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/packet/PacketServiceInfo.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/packet/PacketServiceInfo.java new file mode 100644 index 00000000..1b0ae3f9 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/packet/PacketServiceInfo.java @@ -0,0 +1,102 @@ +package org.ccsds.moims.mo.mc.packet; + +/** + * Helper class for Packet service. + */ +public class PacketServiceInfo extends org.ccsds.moims.mo.mal.ServiceInfo { + + /** + * Service number literal. + */ + public static final int _PACKET_SERVICE_NUMBER = 9; + + /** + * Service number instance. + */ + public static final org.ccsds.moims.mo.mal.structures.UShort PACKET_SERVICE_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_PACKET_SERVICE_NUMBER); + + /** + * Service name constant. + */ + public static final org.ccsds.moims.mo.mal.structures.Identifier PACKET_SERVICE_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("Packet"); + + /** + * The service key of this service. + */ + private static final org.ccsds.moims.mo.mal.ServiceKey SERVICE_KEY = new org.ccsds.moims.mo.mal.ServiceKey( + 4, 2, PACKET_SERVICE_NUMBER); + + /** + * Operation number literal for operation DELIVERPACKET. + */ + public static final int _DELIVERPACKET_OP_NUMBER = 1; + + /** + * Operation number instance for operation DELIVERPACKET. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort DELIVERPACKET_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_DELIVERPACKET_OP_NUMBER); + + /** + * Operation instance for operation DELIVERPACKET. + */ + public static final org.ccsds.moims.mo.mal.MALPubSubOperation DELIVERPACKET_OP = new org.ccsds.moims.mo.mal.MALPubSubOperation(SERVICE_KEY, + DELIVERPACKET_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("deliverPacket"), + new org.ccsds.moims.mo.mal.structures.UShort(1), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("timestamp", false, org.ccsds.moims.mo.mal.structures.Attribute.TIME_SHORT_FORM, ""), + new org.ccsds.moims.mo.mal.OperationField("spacePacket", false, org.ccsds.moims.mo.mal.structures.Attribute.BLOB_SHORT_FORM, "")}, + "The deliverPacket operation allows a provider to publish space packets with associated metadata, and a consumer to receive a filtered set of those packets."); + + /** + * Key names instance for DELIVERPACKET operation of pubsub interaction pattern. + */ + private static final org.ccsds.moims.mo.mal.structures.Identifier [] _DELIVERPACKET_OP_KEY_NAMES = {new org.ccsds.moims.mo.mal.structures.Identifier("apid")}; + + /** + * Key names instance for DELIVERPACKET operation of pubsub interaction pattern. + */ + private static final org.ccsds.moims.mo.mal.structures.IdentifierList DELIVERPACKET_OP_KEY_NAMES = new org.ccsds.moims.mo.mal.structures.IdentifierList(new java.util.ArrayList<>(java.util.Arrays.asList(_DELIVERPACKET_OP_KEY_NAMES))); + + /** + * Area elements. + */ + public static final org.ccsds.moims.mo.mal.structures.Element[] PACKET_SERVICE_ELEMENTS = {}; + + /** + * The set of operations for this service. + */ + public static final org.ccsds.moims.mo.mal.MALOperation[] OPERATIONS = new org.ccsds.moims.mo.mal.MALOperation[]{DELIVERPACKET_OP}; + + /** + * Creates an instance of the Packet ServiceInfo. + * + */ + public PacketServiceInfo() { + super(SERVICE_KEY, PACKET_SERVICE_NAME, PACKET_SERVICE_ELEMENTS, OPERATIONS); + } + + @Override + public org.ccsds.moims.mo.mal.MALArea getArea() { + return org.ccsds.moims.mo.mc.MCHelper.MC_AREA; + } + + @Override + public org.ccsds.moims.mo.mal.MOErrorException generateMOError(int errorNumber, + Object extraInfo) { + switch (errorNumber) { + case 1: + return new org.ccsds.moims.mo.mc.ReadOnlyException(extraInfo); + case 2: + return new org.ccsds.moims.mo.mc.DuplicateException(extraInfo); + case 3: + return new org.ccsds.moims.mo.mc.InvalidException(extraInfo); + case 4: + return new org.ccsds.moims.mo.mc.RejectedException(extraInfo); + case 5: + return new org.ccsds.moims.mo.mc.AmbiguousException(extraInfo); + } + return null; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/packet/consumer/DeliverPacketSubscriptionKeys.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/packet/consumer/DeliverPacketSubscriptionKeys.java new file mode 100644 index 00000000..18b02183 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/packet/consumer/DeliverPacketSubscriptionKeys.java @@ -0,0 +1,77 @@ +package org.ccsds.moims.mo.mc.packet.consumer; + +/** + * Typed accessors for the Subscription Keys of the deliverPacket PubSub operation. + */ +public final class DeliverPacketSubscriptionKeys { + + /** + * The key values as received in the UpdateHeader. + */ + private org.ccsds.moims.mo.mal.structures.NullableAttributeList keyValues; + + /** + * The effective key names for the received key values. + */ + private org.ccsds.moims.mo.mal.structures.IdentifierList keyNames; + + /** + * The Subscription Key names defined by the operation, in order. + */ + private static final org.ccsds.moims.mo.mal.structures.IdentifierList CANONICAL_KEY_NAMES = new org.ccsds.moims.mo.mal.structures.IdentifierList(new java.util.ArrayList<>(java.util.Arrays.asList(new org.ccsds.moims.mo.mal.structures.Identifier("apid")))); + + /** + * Creates an instance from the received UpdateHeader and the subscription + * selectedKeys. + * + * @param updateHeader The UpdateHeader received in the NOTIFY message + * @param selectedKeys The selectedKeys of the subscription, or null if trimming was not enabled + */ + public DeliverPacketSubscriptionKeys(org.ccsds.moims.mo.mal.structures.UpdateHeader updateHeader, + org.ccsds.moims.mo.mal.structures.IdentifierList selectedKeys) { + this.keyValues = (updateHeader == null) ? null : updateHeader.getKeyValues(); + this.keyNames = (selectedKeys != null) ? selectedKeys : CANONICAL_KEY_NAMES; + } + + /** + * Returns the value of the "apid" Subscription Key, or null if not present. + * + * @return The key value, or null if not present + */ + public org.ccsds.moims.mo.mal.structures.UShort getApid() { + return (org.ccsds.moims.mo.mal.structures.UShort) valueByName("apid"); + } + + /** + * Returns the Subscription Key value with the given name, or null if it is + * not present (for example when it was trimmed away or is a custom key that + * is not part of this subscription). + * + * @param name The Subscription Key name + * @return The key value, or null if not present + */ + public org.ccsds.moims.mo.mal.structures.Attribute getByName(String name) { + return valueByName(name); + } + + /** + * + * @param name The Subscription Key name + */ + private org.ccsds.moims.mo.mal.structures.Attribute valueByName(String name) { + if (keyNames == null || keyValues == null) { + return null; + } + for (int i = 0; i < keyNames.size(); i++) { + if (name.equals(keyNames.get(i).getValue())) { + if (i >= keyValues.size()) { + return null; + } + org.ccsds.moims.mo.mal.structures.NullableAttribute na = keyValues.get(i); + return (na == null) ? null : na.getValue(); + } + } + return null; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/packet/consumer/PacketAdapter.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/packet/consumer/PacketAdapter.java new file mode 100644 index 00000000..7ee84cd3 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/packet/consumer/PacketAdapter.java @@ -0,0 +1,165 @@ +package org.ccsds.moims.mo.mc.packet.consumer; + +/** + * Consumer adapter for Packet service. + */ +public abstract class PacketAdapter extends org.ccsds.moims.mo.mal.consumer.MALInteractionAdapter { + + /** + * Called by the MAL when a PubSub register acknowledgement is received from + * a broker for the operation deliverPacket. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void deliverPacketRegisterAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PubSub register acknowledgement error is received + * from a broker for the operation deliverPacket. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void deliverPacketRegisterErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PubSub deregister acknowledgement is received + * from a broker for the operation deliverPacket. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void deliverPacketDeregisterAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PubSub update is received from a broker for the + * operation deliverPacket. + * + * @param msgHeader msgHeader The header of the received message + * @param subscriptionId The subscriptionId of the subscription. + * @param updateHeader The Update header. + * @param keys The typed Subscription Key accessors for this update + * @param timestamp The timestamp field. + * @param spacePacket The spacePacket field. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void deliverPacketNotifyReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.structures.Identifier subscriptionId, + org.ccsds.moims.mo.mal.structures.UpdateHeader updateHeader, + DeliverPacketSubscriptionKeys keys, + org.ccsds.moims.mo.mal.structures.Time timestamp, + org.ccsds.moims.mo.mal.structures.Blob spacePacket, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PubSub update error is received from a broker + * for the operation deliverPacket. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void deliverPacketNotifyErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + @Override + public final void registerAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mc.packet.PacketServiceInfo._DELIVERPACKET_OP_NUMBER: + deliverPacketRegisterAckReceived(msgHeader, qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void registerErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALErrorBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mc.packet.PacketServiceInfo._DELIVERPACKET_OP_NUMBER: + deliverPacketRegisterErrorReceived(msgHeader, body.getError(), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void notifyReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALNotifyBody body, + org.ccsds.moims.mo.mal.structures.IdentifierList selectedKeys, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + if ((org.ccsds.moims.mo.mc.MCHelper.MC_AREA_NUMBER.equals(msgHeader.getServiceArea())) && (org.ccsds.moims.mo.mc.packet.PacketServiceInfo.PACKET_SERVICE_NUMBER.equals(msgHeader.getService()))) { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mc.packet.PacketServiceInfo._DELIVERPACKET_OP_NUMBER: + deliverPacketNotifyReceived(msgHeader, + (org.ccsds.moims.mo.mal.structures.Identifier) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.Identifier()), + (org.ccsds.moims.mo.mal.structures.UpdateHeader) body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.UpdateHeader()), + new DeliverPacketSubscriptionKeys((org.ccsds.moims.mo.mal.structures.UpdateHeader) body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.UpdateHeader()), selectedKeys), + (org.ccsds.moims.mo.mal.structures.Time) body.getBodyElement(2, new org.ccsds.moims.mo.mal.structures.Time()), + (org.ccsds.moims.mo.mal.structures.Blob) body.getBodyElement(3, new org.ccsds.moims.mo.mal.structures.Blob()), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + else { + notifyReceivedFromOtherService(msgHeader, body, qosProperties); + } + } + + @Override + public final void notifyErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALErrorBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mc.packet.PacketServiceInfo._DELIVERPACKET_OP_NUMBER: + deliverPacketNotifyErrorReceived(msgHeader, body.getError(), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void deregisterAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mc.packet.PacketServiceInfo._DELIVERPACKET_OP_NUMBER: + deliverPacketDeregisterAckReceived(msgHeader, qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + /** + * Called by the MAL when a PubSub update from another service is received + * from a broker. + * + * @param msgHeader msgHeader The header of the received message + * @param body body The body of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + * @throws org.ccsds.moims.mo.mal.MALException if an error is detected processing the message. + */ + public void notifyReceivedFromOtherService(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALNotifyBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/packet/consumer/PacketStub.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/packet/consumer/PacketStub.java new file mode 100644 index 00000000..d2c8578e --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/packet/consumer/PacketStub.java @@ -0,0 +1,85 @@ +package org.ccsds.moims.mo.mc.packet.consumer; + +/** + * Consumer stub for Packet service. + */ +public class PacketStub { + + /** + * The consumer field. + */ + private final org.ccsds.moims.mo.mal.consumer.MALConsumer consumer; + + /** + * Wraps a MALconsumer connection with service specific methods that map from + * the high level service API to the generic MAL API. + * + * @param consumer consumer The MALConsumer to use in this stub. + */ + public PacketStub(org.ccsds.moims.mo.mal.consumer.MALConsumer consumer) { + this.consumer = consumer; + } + + /** + * Returns the internal MAL consumer object used for sending of messages from + * this interface. + * + * @return The MAL consumer object. + */ + public org.ccsds.moims.mo.mal.consumer.MALConsumer getConsumer() { + return consumer; + } + + /** + * Register method for the deliverPacket PubSub interaction. + * + * @param subscription subscription the subscription to register for + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void deliverPacketRegister(org.ccsds.moims.mo.mal.structures.Subscription subscription, + org.ccsds.moims.mo.mc.packet.consumer.PacketAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.register(org.ccsds.moims.mo.mc.packet.PacketServiceInfo.DELIVERPACKET_OP, subscription, adapter); + } + + /** + * Asynchronous version of method deliverPacketRegister. + * + * @param subscription subscription the subscription to register for + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncDeliverPacketRegister(org.ccsds.moims.mo.mal.structures.Subscription subscription, + org.ccsds.moims.mo.mc.packet.consumer.PacketAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncRegister(org.ccsds.moims.mo.mc.packet.PacketServiceInfo.DELIVERPACKET_OP, subscription, adapter); + } + + /** + * Deregister method for the deliverPacket PubSub interaction. + * + * @param identifierList identifierList the subscription identifiers to deregister + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void deliverPacketDeregister(org.ccsds.moims.mo.mal.structures.IdentifierList identifierList) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.deregister(org.ccsds.moims.mo.mc.packet.PacketServiceInfo.DELIVERPACKET_OP, identifierList); + } + + /** + * Asynchronous version of method deliverPacketDeregister. + * + * @param identifierList identifierList the subscription identifiers to deregister + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncDeliverPacketDeregister(org.ccsds.moims.mo.mal.structures.IdentifierList identifierList, + org.ccsds.moims.mo.mc.packet.consumer.PacketAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncDeregister(org.ccsds.moims.mo.mc.packet.PacketServiceInfo.DELIVERPACKET_OP, identifierList, adapter); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/packet/consumer/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/packet/consumer/package-info.java new file mode 100644 index 00000000..2fa9a590 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/packet/consumer/package-info.java @@ -0,0 +1,4 @@ +/** + * Package containing the consumer stubs for the Packet service. +*/ +package org.ccsds.moims.mo.mc.packet.consumer; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/packet/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/packet/package-info.java new file mode 100644 index 00000000..b2346b25 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/packet/package-info.java @@ -0,0 +1,5 @@ +/** + * The packet service allows a consumer to subscribe to a subset of the space + * packets, with filtering capabilities based on packets metadata. +*/ +package org.ccsds.moims.mo.mc.packet; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/packet/provider/DeliverPacketPublisher.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/packet/provider/DeliverPacketPublisher.java new file mode 100644 index 00000000..15313085 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/packet/provider/DeliverPacketPublisher.java @@ -0,0 +1,119 @@ +package org.ccsds.moims.mo.mc.packet.provider; + +/** + * Publisher class for the deliverPacket operation. + */ +public final class DeliverPacketPublisher { + + /** + * The publisherSet field. + */ + private org.ccsds.moims.mo.mal.provider.MALPublisherSet publisherSet; + + /** + * Creates an instance of this class using the supplied publisher set. + * + * @param publisherSet The set of broker connections to use when registering and publishing. + */ + public DeliverPacketPublisher(org.ccsds.moims.mo.mal.provider.MALPublisherSet publisherSet) { + this.publisherSet = publisherSet; + } + + /** + * Registers this provider implementation to the set of broker connections. + * + * @param keyNames The key names to use in the method + * @param keyTypes The key types to use in the method + * @param listener The listener object to use for callback from the publisher + * @throws java.lang.IllegalArgumentException If any supplied argument is invalid + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void register(org.ccsds.moims.mo.mal.structures.IdentifierList keyNames, + org.ccsds.moims.mo.mal.structures.AttributeTypeList keyTypes, + org.ccsds.moims.mo.mal.provider.MALPublishInteractionListener listener) throws java.lang.IllegalArgumentException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + publisherSet.register(keyNames, keyTypes, listener); + } + + /** + * Registers this provider implementation to the set of broker connections + * with the default subscription keys. + * + * @param listener The listener object to use for callback from the publisher + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void registerWithDefaultKeys(org.ccsds.moims.mo.mal.provider.MALPublishInteractionListener listener) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + org.ccsds.moims.mo.mal.structures.IdentifierList keyNames = new org.ccsds.moims.mo.mal.structures.IdentifierList(); + org.ccsds.moims.mo.mal.structures.AttributeTypeList keyTypes = new org.ccsds.moims.mo.mal.structures.AttributeTypeList(); + keyNames.add(new org.ccsds.moims.mo.mal.structures.Identifier("apid")); + keyTypes.add(org.ccsds.moims.mo.mal.structures.AttributeType.USHORT); + publisherSet.register(keyNames, keyTypes, listener); + } + + /** + * Asynchronously registers this provider implementation to the set of broker + * connections. + * + * @param keyNames The key names to use in the method + * @param keyTypes The key types to use in the method + * @param listener The listener object to use for callback from the publisher + * @throws java.lang.IllegalArgumentException If any supplied argument is invalid + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void asyncRegister(org.ccsds.moims.mo.mal.structures.IdentifierList keyNames, + org.ccsds.moims.mo.mal.structures.AttributeTypeList keyTypes, + org.ccsds.moims.mo.mal.provider.MALPublishInteractionListener listener) throws java.lang.IllegalArgumentException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + publisherSet.asyncRegister(keyNames, keyTypes, listener); + } + + /** + * Publishes updates to the set of registered broker connections. + * + * @param updateHeader The headers of the updates being added + * @param timestamp The timestamp field. + * @param spacePacket The spacePacket field. + * @throws java.lang.IllegalArgumentException If any supplied argument is invalid + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void publish(org.ccsds.moims.mo.mal.structures.UpdateHeader updateHeader, + org.ccsds.moims.mo.mal.structures.Time timestamp, + org.ccsds.moims.mo.mal.structures.Blob spacePacket) throws java.lang.IllegalArgumentException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + publisherSet.publish(updateHeader, timestamp, spacePacket); + } + + /** + * Deregisters this provider implementation from the set of broker connections. + * + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void deregister() throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + publisherSet.deregister(); + } + + /** + * Asynchronously deregisters this provider implementation from the set of + * broker connections. + * + * @param listener The listener object to use for callback from the publisher + * @throws java.lang.IllegalArgumentException If any supplied argument is invalid + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void asyncDeregister(org.ccsds.moims.mo.mal.provider.MALPublishInteractionListener listener) throws java.lang.IllegalArgumentException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + publisherSet.asyncDeregister(listener); + } + + /** + * Closes this publisher. + * + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void close() throws org.ccsds.moims.mo.mal.MALException { + publisherSet.close(); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/packet/provider/PacketHandler.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/packet/provider/PacketHandler.java new file mode 100644 index 00000000..940c69cc --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/packet/provider/PacketHandler.java @@ -0,0 +1,15 @@ +package org.ccsds.moims.mo.mc.packet.provider; + +/** + * Interface that providers of the Packet service must implement to handle + * the operations of that service. + */ +public interface PacketHandler { + + /** + * Sets the skeleton to be used for creation of publishers. + * + * @param skeleton The skeleton to be used. + */ + void setSkeleton(org.ccsds.moims.mo.mc.packet.provider.PacketSkeleton skeleton); +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/packet/provider/PacketInheritanceSkeleton.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/packet/provider/PacketInheritanceSkeleton.java new file mode 100644 index 00000000..a9a398f1 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/packet/provider/PacketInheritanceSkeleton.java @@ -0,0 +1,112 @@ +package org.ccsds.moims.mo.mc.packet.provider; + +/** + * Provider Inheritance skeleton for PacketInheritanceSkeleton service. + */ +public abstract class PacketInheritanceSkeleton implements org.ccsds.moims.mo.mal.provider.MALInteractionHandler, org.ccsds.moims.mo.mc.packet.provider.PacketSkeleton, org.ccsds.moims.mo.mc.packet.provider.PacketHandler { + + /** + * The providerSet field. + */ + private org.ccsds.moims.mo.mal.provider.MALProviderSet providerSet = new org.ccsds.moims.mo.mal.provider.MALProviderSet(org.ccsds.moims.mo.mc.packet.PacketHelper.PACKET_SERVICE); + + /** + * Returns the connection object for this provider. + * + * @return the connection object for this provider + * @throws java.io.IOException if the method was not implemented yet. + */ + public org.ccsds.moims.mo.mal.helpertools.connections.ConnectionProvider getConnection() throws java.io.IOException { + throw new java.io.IOException("This method needs to be overridden!"); + } + + @Override + public void setSkeleton(org.ccsds.moims.mo.mc.packet.provider.PacketSkeleton skeleton) { + // Not used in the inheritance pattern (the skeleton is 'this'); + } + + @Override + public void malInitialize(org.ccsds.moims.mo.mal.provider.MALProvider provider) throws org.ccsds.moims.mo.mal.MALException { + providerSet.addProvider(provider); + } + + @Override + public void malFinalize(org.ccsds.moims.mo.mal.provider.MALProvider provider) throws org.ccsds.moims.mo.mal.MALException { + providerSet.removeProvider(provider); + } + + @Override + public org.ccsds.moims.mo.mc.packet.provider.DeliverPacketPublisher createDeliverPacketPublisher(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.Identifier networkZone, + org.ccsds.moims.mo.mal.structures.SessionType sessionType, + org.ccsds.moims.mo.mal.structures.Identifier sessionName, + org.ccsds.moims.mo.mal.structures.QoSLevel qos, + java.util.Map qosProps, + org.ccsds.moims.mo.mal.structures.UInteger priority) throws org.ccsds.moims.mo.mal.MALException { + return new org.ccsds.moims.mo.mc.packet.provider.DeliverPacketPublisher(providerSet.createPublisherSet(org.ccsds.moims.mo.mc.packet.PacketServiceInfo.DELIVERPACKET_OP, domain, sessionType, sessionName, qos, qosProps, null)); + } + + @Override + public void handleSend(org.ccsds.moims.mo.mal.provider.MALInteraction interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + switch (opNumber) { + default: + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } + + @Override + public void handleSubmit(org.ccsds.moims.mo.mal.provider.MALSubmit interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + switch (opNumber) { + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } + + @Override + public void handleRequest(org.ccsds.moims.mo.mal.provider.MALRequest interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + switch (opNumber) { + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } + + @Override + public void handleInvoke(org.ccsds.moims.mo.mal.provider.MALInvoke interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + switch (opNumber) { + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } + + @Override + public void handleProgress(org.ccsds.moims.mo.mal.provider.MALProgress interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + switch (opNumber) { + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/packet/provider/PacketSkeleton.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/packet/provider/PacketSkeleton.java new file mode 100644 index 00000000..572eff9b --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/packet/provider/PacketSkeleton.java @@ -0,0 +1,29 @@ +package org.ccsds.moims.mo.mc.packet.provider; + +/** + * The skeleton interface for the Packet service. + */ +public interface PacketSkeleton { + + /** + * Creates a publisher object using the current registered provider set for + * the PubSub operation deliverPacket. + * + * @param domain The domain used for publishing + * @param networkZone ~The network zone used for publishing + * @param sessionType The session used for publishing + * @param sessionName The session name used for publishing + * @param qos The QoS used for publishing + * @param qosProps The QoS properties used for publishing + * @param priority The priority used for publishing + * @return The new publisher object. + * @throws org.ccsds.moims.mo.mal.MALException if a problem is detected during creation of the publisher + */ + org.ccsds.moims.mo.mc.packet.provider.DeliverPacketPublisher createDeliverPacketPublisher(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.Identifier networkZone, + org.ccsds.moims.mo.mal.structures.SessionType sessionType, + org.ccsds.moims.mo.mal.structures.Identifier sessionName, + org.ccsds.moims.mo.mal.structures.QoSLevel qos, + java.util.Map qosProps, + org.ccsds.moims.mo.mal.structures.UInteger priority) throws org.ccsds.moims.mo.mal.MALException; +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/packet/provider/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/packet/provider/package-info.java new file mode 100644 index 00000000..a49f94d4 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/packet/provider/package-info.java @@ -0,0 +1,4 @@ +/** + * Package containing the provider skeletons for the Packet service. +*/ +package org.ccsds.moims.mo.mc.packet.provider; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/parameter/ParameterHelper.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/parameter/ParameterHelper.java new file mode 100644 index 00000000..adc55a0e --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/parameter/ParameterHelper.java @@ -0,0 +1,17 @@ +package org.ccsds.moims.mo.mc.parameter; + +/** + * Helper class for Parameter service. + */ +public class ParameterHelper { + + /** + * Service singleton instance. + */ + public static final org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo PARAMETER_SERVICE = new org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo(); + + private ParameterHelper() { + // Utility class; not meant to be instantiated. + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/parameter/ParameterServiceInfo.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/parameter/ParameterServiceInfo.java new file mode 100644 index 00000000..03f09f12 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/parameter/ParameterServiceInfo.java @@ -0,0 +1,248 @@ +package org.ccsds.moims.mo.mc.parameter; + +/** + * Helper class for Parameter service. + */ +public class ParameterServiceInfo extends org.ccsds.moims.mo.mal.ServiceInfo { + + /** + * Service number literal. + */ + public static final int _PARAMETER_SERVICE_NUMBER = 2; + + /** + * Service number instance. + */ + public static final org.ccsds.moims.mo.mal.structures.UShort PARAMETER_SERVICE_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_PARAMETER_SERVICE_NUMBER); + + /** + * Service name constant. + */ + public static final org.ccsds.moims.mo.mal.structures.Identifier PARAMETER_SERVICE_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("Parameter"); + + /** + * The service key of this service. + */ + private static final org.ccsds.moims.mo.mal.ServiceKey SERVICE_KEY = new org.ccsds.moims.mo.mal.ServiceKey( + 4, 2, PARAMETER_SERVICE_NUMBER); + + /** + * Operation number literal for operation MONITORVALUE. + */ + public static final int _MONITORVALUE_OP_NUMBER = 1; + + /** + * Operation number instance for operation MONITORVALUE. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort MONITORVALUE_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_MONITORVALUE_OP_NUMBER); + + /** + * Operation instance for operation MONITORVALUE. + */ + public static final org.ccsds.moims.mo.mal.MALPubSubOperation MONITORVALUE_OP = new org.ccsds.moims.mo.mal.MALPubSubOperation(SERVICE_KEY, + MONITORVALUE_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("monitorValue"), + new org.ccsds.moims.mo.mal.structures.UShort(1), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("timestamp", false, org.ccsds.moims.mo.mal.structures.Attribute.TIME_SHORT_FORM, ""), + new org.ccsds.moims.mo.mal.OperationField("samplingTime", true, org.ccsds.moims.mo.mal.structures.Attribute.TIME_SHORT_FORM, ""), + new org.ccsds.moims.mo.mal.OperationField("newValue", false, org.ccsds.moims.mo.mc.structures.ParameterValueData.SHORT_FORM, "")}, + "The monitorValue operation allows a consumer to subscribe for parameter value reports."); + + /** + * Key names instance for MONITORVALUE operation of pubsub interaction pattern. + */ + private static final org.ccsds.moims.mo.mal.structures.Identifier [] _MONITORVALUE_OP_KEY_NAMES = {new org.ccsds.moims.mo.mal.structures.Identifier("parameterKey"), + new org.ccsds.moims.mo.mal.structures.Identifier("parameterVersion")}; + + /** + * Key names instance for MONITORVALUE operation of pubsub interaction pattern. + */ + private static final org.ccsds.moims.mo.mal.structures.IdentifierList MONITORVALUE_OP_KEY_NAMES = new org.ccsds.moims.mo.mal.structures.IdentifierList(new java.util.ArrayList<>(java.util.Arrays.asList(_MONITORVALUE_OP_KEY_NAMES))); + + /** + * Operation number literal for operation GETVALUE. + */ + public static final int _GETVALUE_OP_NUMBER = 2; + + /** + * Operation number instance for operation GETVALUE. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort GETVALUE_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_GETVALUE_OP_NUMBER); + + /** + * Operation instance for operation GETVALUE. + */ + public static final org.ccsds.moims.mo.mal.MALRequestOperation GETVALUE_OP = new org.ccsds.moims.mo.mal.MALRequestOperation(SERVICE_KEY, + GETVALUE_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("getValue"), + new org.ccsds.moims.mo.mal.structures.UShort(2), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("domain", true, org.ccsds.moims.mo.mal.structures.IdentifierList.SHORT_FORM, ""), + new org.ccsds.moims.mo.mal.OperationField("keys", false, org.ccsds.moims.mo.mal.structures.IdentifierList.SHORT_FORM, "")}, + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("parameterValues", false, org.ccsds.moims.mo.mc.structures.ParameterValueList.SHORT_FORM, "")}, + "The getValue operation returns the latest received value for a requested parameter."); + + /** + * Operation number literal for operation SETVALUE. + */ + public static final int _SETVALUE_OP_NUMBER = 3; + + /** + * Operation number instance for operation SETVALUE. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort SETVALUE_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_SETVALUE_OP_NUMBER); + + /** + * Operation instance for operation SETVALUE. + */ + public static final org.ccsds.moims.mo.mal.MALSubmitOperation SETVALUE_OP = new org.ccsds.moims.mo.mal.MALSubmitOperation(SERVICE_KEY, + SETVALUE_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("setValue"), + new org.ccsds.moims.mo.mal.structures.UShort(3), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("domain", true, org.ccsds.moims.mo.mal.structures.IdentifierList.SHORT_FORM, ""), + new org.ccsds.moims.mo.mal.OperationField("keys", false, org.ccsds.moims.mo.mal.structures.IdentifierList.SHORT_FORM, ""), + new org.ccsds.moims.mo.mal.OperationField("newRawValues", false, org.ccsds.moims.mo.mal.structures.NullableAttributeList.SHORT_FORM, "")}, + "The setValue operation allows a consumer to set the raw value for one or more parameters."); + + /** + * Operation number literal for operation GETREPORTINGCONFIGURATION. + */ + public static final int _GETREPORTINGCONFIGURATION_OP_NUMBER = 4; + + /** + * Operation number instance for operation GETREPORTINGCONFIGURATION. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort GETREPORTINGCONFIGURATION_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_GETREPORTINGCONFIGURATION_OP_NUMBER); + + /** + * Operation instance for operation GETREPORTINGCONFIGURATION. + */ + public static final org.ccsds.moims.mo.mal.MALRequestOperation GETREPORTINGCONFIGURATION_OP = new org.ccsds.moims.mo.mal.MALRequestOperation(SERVICE_KEY, + GETREPORTINGCONFIGURATION_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("getReportingConfiguration"), + new org.ccsds.moims.mo.mal.structures.UShort(4), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("domain", true, org.ccsds.moims.mo.mal.structures.IdentifierList.SHORT_FORM, ""), + new org.ccsds.moims.mo.mal.OperationField("keys", false, org.ccsds.moims.mo.mal.structures.IdentifierList.SHORT_FORM, "")}, + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("reportConfigs", false, org.ccsds.moims.mo.mc.structures.ReportConfigurationList.SHORT_FORM, "")}, + "The getReportingConfiguration operation allows a consumer to retrieve the current configuration for the generation of reports for a parameter."); + + /** + * Operation number literal for operation ENABLEREPORTING. + */ + public static final int _ENABLEREPORTING_OP_NUMBER = 5; + + /** + * Operation number instance for operation ENABLEREPORTING. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort ENABLEREPORTING_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_ENABLEREPORTING_OP_NUMBER); + + /** + * Operation instance for operation ENABLEREPORTING. + */ + public static final org.ccsds.moims.mo.mal.MALSubmitOperation ENABLEREPORTING_OP = new org.ccsds.moims.mo.mal.MALSubmitOperation(SERVICE_KEY, + ENABLEREPORTING_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("enableReporting"), + new org.ccsds.moims.mo.mal.structures.UShort(4), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("domain", true, org.ccsds.moims.mo.mal.structures.IdentifierList.SHORT_FORM, ""), + new org.ccsds.moims.mo.mal.OperationField("keys", true, org.ccsds.moims.mo.mal.structures.IdentifierList.SHORT_FORM, "")}, + "The enableReporting operation allows a consumer to request the generation of reports for specific parameters."); + + /** + * Operation number literal for operation DISABLEREPORTING. + */ + public static final int _DISABLEREPORTING_OP_NUMBER = 6; + + /** + * Operation number instance for operation DISABLEREPORTING. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort DISABLEREPORTING_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_DISABLEREPORTING_OP_NUMBER); + + /** + * Operation instance for operation DISABLEREPORTING. + */ + public static final org.ccsds.moims.mo.mal.MALSubmitOperation DISABLEREPORTING_OP = new org.ccsds.moims.mo.mal.MALSubmitOperation(SERVICE_KEY, + DISABLEREPORTING_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("disableReporting"), + new org.ccsds.moims.mo.mal.structures.UShort(4), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("domain", true, org.ccsds.moims.mo.mal.structures.IdentifierList.SHORT_FORM, ""), + new org.ccsds.moims.mo.mal.OperationField("keys", true, org.ccsds.moims.mo.mal.structures.IdentifierList.SHORT_FORM, "")}, + "The disableReporting operation allows a consumer to stop the generation of reports for specific parameters."); + + /** + * Operation number literal for operation SETREPORTINGPERIOD. + */ + public static final int _SETREPORTINGPERIOD_OP_NUMBER = 7; + + /** + * Operation number instance for operation SETREPORTINGPERIOD. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort SETREPORTINGPERIOD_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_SETREPORTINGPERIOD_OP_NUMBER); + + /** + * Operation instance for operation SETREPORTINGPERIOD. + */ + public static final org.ccsds.moims.mo.mal.MALSubmitOperation SETREPORTINGPERIOD_OP = new org.ccsds.moims.mo.mal.MALSubmitOperation(SERVICE_KEY, + SETREPORTINGPERIOD_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("setReportingPeriod"), + new org.ccsds.moims.mo.mal.structures.UShort(4), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("domain", true, org.ccsds.moims.mo.mal.structures.IdentifierList.SHORT_FORM, ""), + new org.ccsds.moims.mo.mal.OperationField("keys", false, org.ccsds.moims.mo.mal.structures.IdentifierList.SHORT_FORM, ""), + new org.ccsds.moims.mo.mal.OperationField("reportInterval", false, org.ccsds.moims.mo.mal.structures.Attribute.DURATION_SHORT_FORM, "")}, + "The setReportingPeriod operation allows a consumer to set the reporting interval for specific parameters."); + + /** + * Area elements. + */ + public static final org.ccsds.moims.mo.mal.structures.Element[] PARAMETER_SERVICE_ELEMENTS = {}; + + /** + * The set of operations for this service. + */ + public static final org.ccsds.moims.mo.mal.MALOperation[] OPERATIONS = new org.ccsds.moims.mo.mal.MALOperation[]{MONITORVALUE_OP, + GETVALUE_OP, + SETVALUE_OP, + GETREPORTINGCONFIGURATION_OP, + ENABLEREPORTING_OP, + DISABLEREPORTING_OP, + SETREPORTINGPERIOD_OP}; + + /** + * Creates an instance of the Parameter ServiceInfo. + * + */ + public ParameterServiceInfo() { + super(SERVICE_KEY, PARAMETER_SERVICE_NAME, PARAMETER_SERVICE_ELEMENTS, OPERATIONS); + } + + @Override + public org.ccsds.moims.mo.mal.MALArea getArea() { + return org.ccsds.moims.mo.mc.MCHelper.MC_AREA; + } + + @Override + public org.ccsds.moims.mo.mal.MOErrorException generateMOError(int errorNumber, + Object extraInfo) { + switch (errorNumber) { + case 1: + return new org.ccsds.moims.mo.mc.ReadOnlyException(extraInfo); + case 2: + return new org.ccsds.moims.mo.mc.DuplicateException(extraInfo); + case 3: + return new org.ccsds.moims.mo.mc.InvalidException(extraInfo); + case 4: + return new org.ccsds.moims.mo.mc.RejectedException(extraInfo); + case 5: + return new org.ccsds.moims.mo.mc.AmbiguousException(extraInfo); + } + return null; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/parameter/consumer/MonitorValueSubscriptionKeys.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/parameter/consumer/MonitorValueSubscriptionKeys.java new file mode 100644 index 00000000..31822678 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/parameter/consumer/MonitorValueSubscriptionKeys.java @@ -0,0 +1,88 @@ +package org.ccsds.moims.mo.mc.parameter.consumer; + +/** + * Typed accessors for the Subscription Keys of the monitorValue PubSub operation. + */ +public final class MonitorValueSubscriptionKeys { + + /** + * The key values as received in the UpdateHeader. + */ + private org.ccsds.moims.mo.mal.structures.NullableAttributeList keyValues; + + /** + * The effective key names for the received key values. + */ + private org.ccsds.moims.mo.mal.structures.IdentifierList keyNames; + + /** + * The Subscription Key names defined by the operation, in order. + */ + private static final org.ccsds.moims.mo.mal.structures.IdentifierList CANONICAL_KEY_NAMES = new org.ccsds.moims.mo.mal.structures.IdentifierList(new java.util.ArrayList<>(java.util.Arrays.asList(new org.ccsds.moims.mo.mal.structures.Identifier("parameterKey"), new org.ccsds.moims.mo.mal.structures.Identifier("parameterVersion")))); + + /** + * Creates an instance from the received UpdateHeader and the subscription + * selectedKeys. + * + * @param updateHeader The UpdateHeader received in the NOTIFY message + * @param selectedKeys The selectedKeys of the subscription, or null if trimming was not enabled + */ + public MonitorValueSubscriptionKeys(org.ccsds.moims.mo.mal.structures.UpdateHeader updateHeader, + org.ccsds.moims.mo.mal.structures.IdentifierList selectedKeys) { + this.keyValues = (updateHeader == null) ? null : updateHeader.getKeyValues(); + this.keyNames = (selectedKeys != null) ? selectedKeys : CANONICAL_KEY_NAMES; + } + + /** + * Returns the value of the "parameterKey" Subscription Key, or null if not + * present. + * + * @return The key value, or null if not present + */ + public org.ccsds.moims.mo.mal.structures.Identifier getParameterKey() { + return (org.ccsds.moims.mo.mal.structures.Identifier) valueByName("parameterKey"); + } + + /** + * Returns the value of the "parameterVersion" Subscription Key, or null if + * not present. + * + * @return The key value, or null if not present + */ + public org.ccsds.moims.mo.mal.structures.UInteger getParameterVersion() { + return (org.ccsds.moims.mo.mal.structures.UInteger) valueByName("parameterVersion"); + } + + /** + * Returns the Subscription Key value with the given name, or null if it is + * not present (for example when it was trimmed away or is a custom key that + * is not part of this subscription). + * + * @param name The Subscription Key name + * @return The key value, or null if not present + */ + public org.ccsds.moims.mo.mal.structures.Attribute getByName(String name) { + return valueByName(name); + } + + /** + * + * @param name The Subscription Key name + */ + private org.ccsds.moims.mo.mal.structures.Attribute valueByName(String name) { + if (keyNames == null || keyValues == null) { + return null; + } + for (int i = 0; i < keyNames.size(); i++) { + if (name.equals(keyNames.get(i).getValue())) { + if (i >= keyValues.size()) { + return null; + } + org.ccsds.moims.mo.mal.structures.NullableAttribute na = keyValues.get(i); + return (na == null) ? null : na.getValue(); + } + } + return null; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/parameter/consumer/ParameterAdapter.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/parameter/consumer/ParameterAdapter.java new file mode 100644 index 00000000..de868823 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/parameter/consumer/ParameterAdapter.java @@ -0,0 +1,393 @@ +package org.ccsds.moims.mo.mc.parameter.consumer; + +/** + * Consumer adapter for Parameter service. + */ +public abstract class ParameterAdapter extends org.ccsds.moims.mo.mal.consumer.MALInteractionAdapter { + + /** + * Called by the MAL when a PubSub register acknowledgement is received from + * a broker for the operation monitorValue. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void monitorValueRegisterAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PubSub register acknowledgement error is received + * from a broker for the operation monitorValue. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void monitorValueRegisterErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PubSub deregister acknowledgement is received + * from a broker for the operation monitorValue. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void monitorValueDeregisterAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PubSub update is received from a broker for the + * operation monitorValue. + * + * @param msgHeader msgHeader The header of the received message + * @param subscriptionId The subscriptionId of the subscription. + * @param updateHeader The Update header. + * @param keys The typed Subscription Key accessors for this update + * @param timestamp The timestamp field. + * @param samplingTime The samplingTime field. + * @param newValue The newValue field. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void monitorValueNotifyReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.structures.Identifier subscriptionId, + org.ccsds.moims.mo.mal.structures.UpdateHeader updateHeader, + MonitorValueSubscriptionKeys keys, + org.ccsds.moims.mo.mal.structures.Time timestamp, + org.ccsds.moims.mo.mal.structures.Time samplingTime, + org.ccsds.moims.mo.mc.structures.ParameterValueData newValue, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PubSub update error is received from a broker + * for the operation monitorValue. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void monitorValueNotifyErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response is received from a provider for + * the operation getValue. + * + * @param msgHeader msgHeader The header of the received message + * @param parameterValues The parameterValues field. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void getValueResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mc.structures.ParameterValueList parameterValues, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response error is received from a provider + * for the operation getValue. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void getValueErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a SUBMIT acknowledgement is received from a provider + * for the operation setValue. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void setValueAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a SUBMIT acknowledgement error is received from + * a provider for the operation setValue. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void setValueErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response is received from a provider for + * the operation getReportingConfiguration. + * + * @param msgHeader msgHeader The header of the received message + * @param reportConfigs The reportConfigs field. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void getReportingConfigurationResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mc.structures.ReportConfigurationList reportConfigs, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response error is received from a provider + * for the operation getReportingConfiguration. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void getReportingConfigurationErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a SUBMIT acknowledgement is received from a provider + * for the operation enableReporting. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void enableReportingAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a SUBMIT acknowledgement error is received from + * a provider for the operation enableReporting. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void enableReportingErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a SUBMIT acknowledgement is received from a provider + * for the operation disableReporting. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void disableReportingAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a SUBMIT acknowledgement error is received from + * a provider for the operation disableReporting. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void disableReportingErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a SUBMIT acknowledgement is received from a provider + * for the operation setReportingPeriod. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void setReportingPeriodAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a SUBMIT acknowledgement error is received from + * a provider for the operation setReportingPeriod. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void setReportingPeriodErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + @Override + public final void submitAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo._SETVALUE_OP_NUMBER: + setValueAckReceived(msgHeader, qosProperties); + break; + case org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo._ENABLEREPORTING_OP_NUMBER: + enableReportingAckReceived(msgHeader, qosProperties); + break; + case org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo._DISABLEREPORTING_OP_NUMBER: + disableReportingAckReceived(msgHeader, qosProperties); + break; + case org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo._SETREPORTINGPERIOD_OP_NUMBER: + setReportingPeriodAckReceived(msgHeader, qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void submitErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALErrorBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo._SETVALUE_OP_NUMBER: + setValueErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo._ENABLEREPORTING_OP_NUMBER: + enableReportingErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo._DISABLEREPORTING_OP_NUMBER: + disableReportingErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo._SETREPORTINGPERIOD_OP_NUMBER: + setReportingPeriodErrorReceived(msgHeader, body.getError(), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void requestResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALMessageBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo._GETVALUE_OP_NUMBER: + getValueResponseReceived(msgHeader, + (org.ccsds.moims.mo.mc.structures.ParameterValueList) body.getBodyElement(0, new org.ccsds.moims.mo.mc.structures.ParameterValueList()), qosProperties); + break; + case org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo._GETREPORTINGCONFIGURATION_OP_NUMBER: + getReportingConfigurationResponseReceived(msgHeader, + (org.ccsds.moims.mo.mc.structures.ReportConfigurationList) body.getBodyElement(0, new org.ccsds.moims.mo.mc.structures.ReportConfigurationList()), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void requestErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALErrorBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo._GETVALUE_OP_NUMBER: + getValueErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo._GETREPORTINGCONFIGURATION_OP_NUMBER: + getReportingConfigurationErrorReceived(msgHeader, body.getError(), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void registerAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo._MONITORVALUE_OP_NUMBER: + monitorValueRegisterAckReceived(msgHeader, qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void registerErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALErrorBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo._MONITORVALUE_OP_NUMBER: + monitorValueRegisterErrorReceived(msgHeader, body.getError(), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void notifyReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALNotifyBody body, + org.ccsds.moims.mo.mal.structures.IdentifierList selectedKeys, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + if ((org.ccsds.moims.mo.mc.MCHelper.MC_AREA_NUMBER.equals(msgHeader.getServiceArea())) && (org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo.PARAMETER_SERVICE_NUMBER.equals(msgHeader.getService()))) { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo._MONITORVALUE_OP_NUMBER: + monitorValueNotifyReceived(msgHeader, + (org.ccsds.moims.mo.mal.structures.Identifier) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.Identifier()), + (org.ccsds.moims.mo.mal.structures.UpdateHeader) body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.UpdateHeader()), + new MonitorValueSubscriptionKeys((org.ccsds.moims.mo.mal.structures.UpdateHeader) body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.UpdateHeader()), selectedKeys), + (org.ccsds.moims.mo.mal.structures.Time) body.getBodyElement(2, new org.ccsds.moims.mo.mal.structures.Time()), + (org.ccsds.moims.mo.mal.structures.Time) body.getBodyElement(3, new org.ccsds.moims.mo.mal.structures.Time()), + (org.ccsds.moims.mo.mc.structures.ParameterValueData) body.getBodyElement(4, new org.ccsds.moims.mo.mc.structures.ParameterValueData()), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + else { + notifyReceivedFromOtherService(msgHeader, body, qosProperties); + } + } + + @Override + public final void notifyErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALErrorBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo._MONITORVALUE_OP_NUMBER: + monitorValueNotifyErrorReceived(msgHeader, body.getError(), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void deregisterAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo._MONITORVALUE_OP_NUMBER: + monitorValueDeregisterAckReceived(msgHeader, qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + /** + * Called by the MAL when a PubSub update from another service is received + * from a broker. + * + * @param msgHeader msgHeader The header of the received message + * @param body body The body of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + * @throws org.ccsds.moims.mo.mal.MALException if an error is detected processing the message. + */ + public void notifyReceivedFromOtherService(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALNotifyBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/parameter/consumer/ParameterStub.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/parameter/consumer/ParameterStub.java new file mode 100644 index 00000000..bdc1b40b --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/parameter/consumer/ParameterStub.java @@ -0,0 +1,381 @@ +package org.ccsds.moims.mo.mc.parameter.consumer; + +/** + * Consumer stub for Parameter service. + */ +public class ParameterStub { + + /** + * The consumer field. + */ + private final org.ccsds.moims.mo.mal.consumer.MALConsumer consumer; + + /** + * Wraps a MALconsumer connection with service specific methods that map from + * the high level service API to the generic MAL API. + * + * @param consumer consumer The MALConsumer to use in this stub. + */ + public ParameterStub(org.ccsds.moims.mo.mal.consumer.MALConsumer consumer) { + this.consumer = consumer; + } + + /** + * Returns the internal MAL consumer object used for sending of messages from + * this interface. + * + * @return The MAL consumer object. + */ + public org.ccsds.moims.mo.mal.consumer.MALConsumer getConsumer() { + return consumer; + } + + /** + * Register method for the monitorValue PubSub interaction. + * + * @param subscription subscription the subscription to register for + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void monitorValueRegister(org.ccsds.moims.mo.mal.structures.Subscription subscription, + org.ccsds.moims.mo.mc.parameter.consumer.ParameterAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.register(org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo.MONITORVALUE_OP, subscription, adapter); + } + + /** + * Asynchronous version of method monitorValueRegister. + * + * @param subscription subscription the subscription to register for + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncMonitorValueRegister(org.ccsds.moims.mo.mal.structures.Subscription subscription, + org.ccsds.moims.mo.mc.parameter.consumer.ParameterAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncRegister(org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo.MONITORVALUE_OP, subscription, adapter); + } + + /** + * Deregister method for the monitorValue PubSub interaction. + * + * @param identifierList identifierList the subscription identifiers to deregister + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void monitorValueDeregister(org.ccsds.moims.mo.mal.structures.IdentifierList identifierList) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.deregister(org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo.MONITORVALUE_OP, identifierList); + } + + /** + * Asynchronous version of method monitorValueDeregister. + * + * @param identifierList identifierList the subscription identifiers to deregister + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncMonitorValueDeregister(org.ccsds.moims.mo.mal.structures.IdentifierList identifierList, + org.ccsds.moims.mo.mc.parameter.consumer.ParameterAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncDeregister(org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo.MONITORVALUE_OP, identifierList, adapter); + } + + /** + * The getValue operation returns the latest received value for a requested + * parameter. + * + * @param domain The domain field. + * @param keys The keys field. + * @return The return value of the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mc.structures.ParameterValueList getValue(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.IdentifierList keys) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + org.ccsds.moims.mo.mal.transport.MALMessageBody body = consumer.request(org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo.GETVALUE_OP, domain, keys); + Object body0 = (Object) body.getBodyElement(0, new org.ccsds.moims.mo.mc.structures.ParameterValueList()); + return (org.ccsds.moims.mo.mc.structures.ParameterValueList) body0; + } + + /** + * Asynchronous version of method getValue. + * + * @param domain The domain field. + * @param keys The keys field. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncGetValue(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.IdentifierList keys, + org.ccsds.moims.mo.mc.parameter.consumer.ParameterAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncRequest(org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo.GETVALUE_OP, adapter, domain, keys); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueGetValue(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mc.parameter.consumer.ParameterAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo.GETVALUE_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The setValue operation allows a consumer to set the raw value for one or + * more parameters. + * + * @param domain The domain field. + * @param keys The keys field. + * @param newRawValues The newRawValues field. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void setValue(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.IdentifierList keys, + org.ccsds.moims.mo.mal.structures.NullableAttributeList newRawValues) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.submit(org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo.SETVALUE_OP, domain, keys, newRawValues); + } + + /** + * Asynchronous version of method setValue. + * + * @param domain The domain field. + * @param keys The keys field. + * @param newRawValues The newRawValues field. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncSetValue(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.IdentifierList keys, + org.ccsds.moims.mo.mal.structures.NullableAttributeList newRawValues, + org.ccsds.moims.mo.mc.parameter.consumer.ParameterAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncSubmit(org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo.SETVALUE_OP, adapter, domain, keys, newRawValues); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueSetValue(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mc.parameter.consumer.ParameterAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo.SETVALUE_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The getReportingConfiguration operation allows a consumer to retrieve the + * current configuration for the generation of reports for a parameter. + * + * @param domain The domain field. + * @param keys The keys field. + * @return The return value of the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mc.structures.ReportConfigurationList getReportingConfiguration(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.IdentifierList keys) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + org.ccsds.moims.mo.mal.transport.MALMessageBody body = consumer.request(org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo.GETREPORTINGCONFIGURATION_OP, domain, keys); + Object body0 = (Object) body.getBodyElement(0, new org.ccsds.moims.mo.mc.structures.ReportConfigurationList()); + return (org.ccsds.moims.mo.mc.structures.ReportConfigurationList) body0; + } + + /** + * Asynchronous version of method getReportingConfiguration. + * + * @param domain The domain field. + * @param keys The keys field. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncGetReportingConfiguration(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.IdentifierList keys, + org.ccsds.moims.mo.mc.parameter.consumer.ParameterAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncRequest(org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo.GETREPORTINGCONFIGURATION_OP, adapter, domain, keys); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueGetReportingConfiguration(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mc.parameter.consumer.ParameterAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo.GETREPORTINGCONFIGURATION_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The enableReporting operation allows a consumer to request the generation + * of reports for specific parameters. + * + * @param domain The domain field. + * @param keys The keys field. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void enableReporting(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.IdentifierList keys) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.submit(org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo.ENABLEREPORTING_OP, domain, keys); + } + + /** + * Asynchronous version of method enableReporting. + * + * @param domain The domain field. + * @param keys The keys field. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncEnableReporting(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.IdentifierList keys, + org.ccsds.moims.mo.mc.parameter.consumer.ParameterAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncSubmit(org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo.ENABLEREPORTING_OP, adapter, domain, keys); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueEnableReporting(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mc.parameter.consumer.ParameterAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo.ENABLEREPORTING_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The disableReporting operation allows a consumer to stop the generation + * of reports for specific parameters. + * + * @param domain The domain field. + * @param keys The keys field. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void disableReporting(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.IdentifierList keys) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.submit(org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo.DISABLEREPORTING_OP, domain, keys); + } + + /** + * Asynchronous version of method disableReporting. + * + * @param domain The domain field. + * @param keys The keys field. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncDisableReporting(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.IdentifierList keys, + org.ccsds.moims.mo.mc.parameter.consumer.ParameterAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncSubmit(org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo.DISABLEREPORTING_OP, adapter, domain, keys); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueDisableReporting(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mc.parameter.consumer.ParameterAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo.DISABLEREPORTING_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The setReportingPeriod operation allows a consumer to set the reporting + * interval for specific parameters. + * + * @param domain The domain field. + * @param keys The keys field. + * @param reportInterval The reportInterval field. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void setReportingPeriod(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.IdentifierList keys, + org.ccsds.moims.mo.mal.structures.Duration reportInterval) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.submit(org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo.SETREPORTINGPERIOD_OP, domain, keys, reportInterval); + } + + /** + * Asynchronous version of method setReportingPeriod. + * + * @param domain The domain field. + * @param keys The keys field. + * @param reportInterval The reportInterval field. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncSetReportingPeriod(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.IdentifierList keys, + org.ccsds.moims.mo.mal.structures.Duration reportInterval, + org.ccsds.moims.mo.mc.parameter.consumer.ParameterAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncSubmit(org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo.SETREPORTINGPERIOD_OP, adapter, domain, keys, reportInterval); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueSetReportingPeriod(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mc.parameter.consumer.ParameterAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo.SETREPORTINGPERIOD_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/parameter/consumer/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/parameter/consumer/package-info.java new file mode 100644 index 00000000..14095fbf --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/parameter/consumer/package-info.java @@ -0,0 +1,4 @@ +/** + * Package containing the consumer stubs for the Parameter service. +*/ +package org.ccsds.moims.mo.mc.parameter.consumer; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/parameter/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/parameter/package-info.java new file mode 100644 index 00000000..a8430f70 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/parameter/package-info.java @@ -0,0 +1,5 @@ +/** + * The parameter service allows the user to subscribe to parameter value report + * and optionally be able to set new values. +*/ +package org.ccsds.moims.mo.mc.parameter; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/parameter/provider/MonitorValuePublisher.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/parameter/provider/MonitorValuePublisher.java new file mode 100644 index 00000000..6479fdb6 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/parameter/provider/MonitorValuePublisher.java @@ -0,0 +1,123 @@ +package org.ccsds.moims.mo.mc.parameter.provider; + +/** + * Publisher class for the monitorValue operation. + */ +public final class MonitorValuePublisher { + + /** + * The publisherSet field. + */ + private org.ccsds.moims.mo.mal.provider.MALPublisherSet publisherSet; + + /** + * Creates an instance of this class using the supplied publisher set. + * + * @param publisherSet The set of broker connections to use when registering and publishing. + */ + public MonitorValuePublisher(org.ccsds.moims.mo.mal.provider.MALPublisherSet publisherSet) { + this.publisherSet = publisherSet; + } + + /** + * Registers this provider implementation to the set of broker connections. + * + * @param keyNames The key names to use in the method + * @param keyTypes The key types to use in the method + * @param listener The listener object to use for callback from the publisher + * @throws java.lang.IllegalArgumentException If any supplied argument is invalid + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void register(org.ccsds.moims.mo.mal.structures.IdentifierList keyNames, + org.ccsds.moims.mo.mal.structures.AttributeTypeList keyTypes, + org.ccsds.moims.mo.mal.provider.MALPublishInteractionListener listener) throws java.lang.IllegalArgumentException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + publisherSet.register(keyNames, keyTypes, listener); + } + + /** + * Registers this provider implementation to the set of broker connections + * with the default subscription keys. + * + * @param listener The listener object to use for callback from the publisher + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void registerWithDefaultKeys(org.ccsds.moims.mo.mal.provider.MALPublishInteractionListener listener) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + org.ccsds.moims.mo.mal.structures.IdentifierList keyNames = new org.ccsds.moims.mo.mal.structures.IdentifierList(); + org.ccsds.moims.mo.mal.structures.AttributeTypeList keyTypes = new org.ccsds.moims.mo.mal.structures.AttributeTypeList(); + keyNames.add(new org.ccsds.moims.mo.mal.structures.Identifier("parameterKey")); + keyTypes.add(org.ccsds.moims.mo.mal.structures.AttributeType.IDENTIFIER); + keyNames.add(new org.ccsds.moims.mo.mal.structures.Identifier("parameterVersion")); + keyTypes.add(org.ccsds.moims.mo.mal.structures.AttributeType.UINTEGER); + publisherSet.register(keyNames, keyTypes, listener); + } + + /** + * Asynchronously registers this provider implementation to the set of broker + * connections. + * + * @param keyNames The key names to use in the method + * @param keyTypes The key types to use in the method + * @param listener The listener object to use for callback from the publisher + * @throws java.lang.IllegalArgumentException If any supplied argument is invalid + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void asyncRegister(org.ccsds.moims.mo.mal.structures.IdentifierList keyNames, + org.ccsds.moims.mo.mal.structures.AttributeTypeList keyTypes, + org.ccsds.moims.mo.mal.provider.MALPublishInteractionListener listener) throws java.lang.IllegalArgumentException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + publisherSet.asyncRegister(keyNames, keyTypes, listener); + } + + /** + * Publishes updates to the set of registered broker connections. + * + * @param updateHeader The headers of the updates being added + * @param timestamp The timestamp field. + * @param samplingTime The samplingTime field. + * @param newValue The newValue field. + * @throws java.lang.IllegalArgumentException If any supplied argument is invalid + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void publish(org.ccsds.moims.mo.mal.structures.UpdateHeader updateHeader, + org.ccsds.moims.mo.mal.structures.Time timestamp, + org.ccsds.moims.mo.mal.structures.Time samplingTime, + org.ccsds.moims.mo.mc.structures.ParameterValueData newValue) throws java.lang.IllegalArgumentException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + publisherSet.publish(updateHeader, timestamp, samplingTime, newValue); + } + + /** + * Deregisters this provider implementation from the set of broker connections. + * + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void deregister() throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + publisherSet.deregister(); + } + + /** + * Asynchronously deregisters this provider implementation from the set of + * broker connections. + * + * @param listener The listener object to use for callback from the publisher + * @throws java.lang.IllegalArgumentException If any supplied argument is invalid + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void asyncDeregister(org.ccsds.moims.mo.mal.provider.MALPublishInteractionListener listener) throws java.lang.IllegalArgumentException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + publisherSet.asyncDeregister(listener); + } + + /** + * Closes this publisher. + * + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void close() throws org.ccsds.moims.mo.mal.MALException { + publisherSet.close(); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/parameter/provider/ParameterHandler.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/parameter/provider/ParameterHandler.java new file mode 100644 index 00000000..6dd52299 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/parameter/provider/ParameterHandler.java @@ -0,0 +1,108 @@ +package org.ccsds.moims.mo.mc.parameter.provider; + +/** + * Interface that providers of the Parameter service must implement to handle + * the operations of that service. + */ +public interface ParameterHandler { + + /** + * Implements the operation getValue. + * + * @param domain The domain field. + * @param keys The keys field. + * @param interaction The MAL object representing the interaction in the provider. + * @return The return value of the operation + * @throws org.ccsds.moims.mo.mal.UnknownException Operation specific. + * @throws org.ccsds.moims.mo.mc.AmbiguousException The data or operation is ambiguous, requiring clarification to proceed. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + org.ccsds.moims.mo.mc.structures.ParameterValueList getValue(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.IdentifierList keys, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mal.UnknownException, org.ccsds.moims.mo.mc.AmbiguousException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation setValue. + * + * @param domain The domain field. + * @param keys The keys field. + * @param newRawValues The newRawValues field. + * @param interaction The MAL object representing the interaction in the provider. + * @throws org.ccsds.moims.mo.mal.UnknownException Operation specific. + * @throws org.ccsds.moims.mo.mc.InvalidException The input data or operation format is invalid and does not meet required criteria. + * @throws org.ccsds.moims.mo.mc.ReadOnlyException The operation attempted to modify read-only data, which cannot be changed. + * @throws org.ccsds.moims.mo.mc.AmbiguousException The data or operation is ambiguous, requiring clarification to proceed. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + void setValue(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.IdentifierList keys, + org.ccsds.moims.mo.mal.structures.NullableAttributeList newRawValues, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mal.UnknownException, org.ccsds.moims.mo.mc.InvalidException, org.ccsds.moims.mo.mc.ReadOnlyException, org.ccsds.moims.mo.mc.AmbiguousException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation getReportingConfiguration. + * + * @param domain The domain field. + * @param keys The keys field. + * @param interaction The MAL object representing the interaction in the provider. + * @return The return value of the operation + * @throws org.ccsds.moims.mo.mal.UnknownException Operation specific. + * @throws org.ccsds.moims.mo.mc.AmbiguousException The data or operation is ambiguous, requiring clarification to proceed. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + org.ccsds.moims.mo.mc.structures.ReportConfigurationList getReportingConfiguration(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.IdentifierList keys, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mal.UnknownException, org.ccsds.moims.mo.mc.AmbiguousException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation enableReporting. + * + * @param domain The domain field. + * @param keys The keys field. + * @param interaction The MAL object representing the interaction in the provider. + * @throws org.ccsds.moims.mo.mal.UnknownException Operation specific. + * @throws org.ccsds.moims.mo.mc.AmbiguousException The data or operation is ambiguous, requiring clarification to proceed. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + void enableReporting(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.IdentifierList keys, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mal.UnknownException, org.ccsds.moims.mo.mc.AmbiguousException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation disableReporting. + * + * @param domain The domain field. + * @param keys The keys field. + * @param interaction The MAL object representing the interaction in the provider. + * @throws org.ccsds.moims.mo.mal.UnknownException Operation specific. + * @throws org.ccsds.moims.mo.mc.AmbiguousException The data or operation is ambiguous, requiring clarification to proceed. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + void disableReporting(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.IdentifierList keys, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mal.UnknownException, org.ccsds.moims.mo.mc.AmbiguousException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation setReportingPeriod. + * + * @param domain The domain field. + * @param keys The keys field. + * @param reportInterval The reportInterval field. + * @param interaction The MAL object representing the interaction in the provider. + * @throws org.ccsds.moims.mo.mal.UnknownException Operation specific. + * @throws org.ccsds.moims.mo.mc.InvalidException The input data or operation format is invalid and does not meet required criteria. + * @throws org.ccsds.moims.mo.mc.AmbiguousException The data or operation is ambiguous, requiring clarification to proceed. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + void setReportingPeriod(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.IdentifierList keys, + org.ccsds.moims.mo.mal.structures.Duration reportInterval, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mal.UnknownException, org.ccsds.moims.mo.mc.InvalidException, org.ccsds.moims.mo.mc.AmbiguousException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Sets the skeleton to be used for creation of publishers. + * + * @param skeleton The skeleton to be used. + */ + void setSkeleton(org.ccsds.moims.mo.mc.parameter.provider.ParameterSkeleton skeleton); +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/parameter/provider/ParameterInheritanceSkeleton.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/parameter/provider/ParameterInheritanceSkeleton.java new file mode 100644 index 00000000..fb09eee3 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/parameter/provider/ParameterInheritanceSkeleton.java @@ -0,0 +1,156 @@ +package org.ccsds.moims.mo.mc.parameter.provider; + +/** + * Provider Inheritance skeleton for ParameterInheritanceSkeleton service. + */ +public abstract class ParameterInheritanceSkeleton implements org.ccsds.moims.mo.mal.provider.MALInteractionHandler, org.ccsds.moims.mo.mc.parameter.provider.ParameterSkeleton, org.ccsds.moims.mo.mc.parameter.provider.ParameterHandler { + + /** + * The providerSet field. + */ + private org.ccsds.moims.mo.mal.provider.MALProviderSet providerSet = new org.ccsds.moims.mo.mal.provider.MALProviderSet(org.ccsds.moims.mo.mc.parameter.ParameterHelper.PARAMETER_SERVICE); + + /** + * Returns the connection object for this provider. + * + * @return the connection object for this provider + * @throws java.io.IOException if the method was not implemented yet. + */ + public org.ccsds.moims.mo.mal.helpertools.connections.ConnectionProvider getConnection() throws java.io.IOException { + throw new java.io.IOException("This method needs to be overridden!"); + } + + @Override + public void setSkeleton(org.ccsds.moims.mo.mc.parameter.provider.ParameterSkeleton skeleton) { + // Not used in the inheritance pattern (the skeleton is 'this'); + } + + @Override + public void malInitialize(org.ccsds.moims.mo.mal.provider.MALProvider provider) throws org.ccsds.moims.mo.mal.MALException { + providerSet.addProvider(provider); + } + + @Override + public void malFinalize(org.ccsds.moims.mo.mal.provider.MALProvider provider) throws org.ccsds.moims.mo.mal.MALException { + providerSet.removeProvider(provider); + } + + @Override + public org.ccsds.moims.mo.mc.parameter.provider.MonitorValuePublisher createMonitorValuePublisher(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.Identifier networkZone, + org.ccsds.moims.mo.mal.structures.SessionType sessionType, + org.ccsds.moims.mo.mal.structures.Identifier sessionName, + org.ccsds.moims.mo.mal.structures.QoSLevel qos, + java.util.Map qosProps, + org.ccsds.moims.mo.mal.structures.UInteger priority) throws org.ccsds.moims.mo.mal.MALException { + return new org.ccsds.moims.mo.mc.parameter.provider.MonitorValuePublisher(providerSet.createPublisherSet(org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo.MONITORVALUE_OP, domain, sessionType, sessionName, qos, qosProps, null)); + } + + @Override + public void handleSend(org.ccsds.moims.mo.mal.provider.MALInteraction interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + switch (opNumber) { + default: + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } + + @Override + public void handleSubmit(org.ccsds.moims.mo.mal.provider.MALSubmit interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + try { + switch (opNumber) { + case org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo._SETVALUE_OP_NUMBER: + setValue((org.ccsds.moims.mo.mal.structures.IdentifierList) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.IdentifierList()), + (org.ccsds.moims.mo.mal.structures.IdentifierList) body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.IdentifierList()), + (org.ccsds.moims.mo.mal.structures.NullableAttributeList) body.getBodyElement(2, new org.ccsds.moims.mo.mal.structures.NullableAttributeList()), + interaction); + interaction.sendAcknowledgement(); + break; + case org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo._ENABLEREPORTING_OP_NUMBER: + enableReporting((org.ccsds.moims.mo.mal.structures.IdentifierList) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.IdentifierList()), + (org.ccsds.moims.mo.mal.structures.IdentifierList) body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.IdentifierList()), + interaction); + interaction.sendAcknowledgement(); + break; + case org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo._DISABLEREPORTING_OP_NUMBER: + disableReporting((org.ccsds.moims.mo.mal.structures.IdentifierList) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.IdentifierList()), + (org.ccsds.moims.mo.mal.structures.IdentifierList) body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.IdentifierList()), + interaction); + interaction.sendAcknowledgement(); + break; + case org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo._SETREPORTINGPERIOD_OP_NUMBER: + setReportingPeriod((org.ccsds.moims.mo.mal.structures.IdentifierList) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.IdentifierList()), + (org.ccsds.moims.mo.mal.structures.IdentifierList) body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.IdentifierList()), + (org.ccsds.moims.mo.mal.structures.Duration) body.getBodyElement(2, new org.ccsds.moims.mo.mal.structures.Duration()), + interaction); + interaction.sendAcknowledgement(); + break; + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } catch (org.ccsds.moims.mo.mal.MOErrorException error) { + throw new org.ccsds.moims.mo.mal.MALInteractionException(error); + } + } + + @Override + public void handleRequest(org.ccsds.moims.mo.mal.provider.MALRequest interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + try { + switch (opNumber) { + case org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo._GETVALUE_OP_NUMBER: + interaction.sendResponse(getValue((org.ccsds.moims.mo.mal.structures.IdentifierList) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.IdentifierList()), + (org.ccsds.moims.mo.mal.structures.IdentifierList) body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.IdentifierList()), + interaction)); + break; + case org.ccsds.moims.mo.mc.parameter.ParameterServiceInfo._GETREPORTINGCONFIGURATION_OP_NUMBER: + interaction.sendResponse(getReportingConfiguration((org.ccsds.moims.mo.mal.structures.IdentifierList) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.IdentifierList()), + (org.ccsds.moims.mo.mal.structures.IdentifierList) body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.IdentifierList()), + interaction)); + break; + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } catch (org.ccsds.moims.mo.mal.MOErrorException error) { + throw new org.ccsds.moims.mo.mal.MALInteractionException(error); + } + } + + @Override + public void handleInvoke(org.ccsds.moims.mo.mal.provider.MALInvoke interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + switch (opNumber) { + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } + + @Override + public void handleProgress(org.ccsds.moims.mo.mal.provider.MALProgress interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + switch (opNumber) { + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/parameter/provider/ParameterSkeleton.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/parameter/provider/ParameterSkeleton.java new file mode 100644 index 00000000..e4139d18 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/parameter/provider/ParameterSkeleton.java @@ -0,0 +1,29 @@ +package org.ccsds.moims.mo.mc.parameter.provider; + +/** + * The skeleton interface for the Parameter service. + */ +public interface ParameterSkeleton { + + /** + * Creates a publisher object using the current registered provider set for + * the PubSub operation monitorValue. + * + * @param domain The domain used for publishing + * @param networkZone ~The network zone used for publishing + * @param sessionType The session used for publishing + * @param sessionName The session name used for publishing + * @param qos The QoS used for publishing + * @param qosProps The QoS properties used for publishing + * @param priority The priority used for publishing + * @return The new publisher object. + * @throws org.ccsds.moims.mo.mal.MALException if a problem is detected during creation of the publisher + */ + org.ccsds.moims.mo.mc.parameter.provider.MonitorValuePublisher createMonitorValuePublisher(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.Identifier networkZone, + org.ccsds.moims.mo.mal.structures.SessionType sessionType, + org.ccsds.moims.mo.mal.structures.Identifier sessionName, + org.ccsds.moims.mo.mal.structures.QoSLevel qos, + java.util.Map qosProps, + org.ccsds.moims.mo.mal.structures.UInteger priority) throws org.ccsds.moims.mo.mal.MALException; +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/parameter/provider/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/parameter/provider/package-info.java new file mode 100644 index 00000000..ba9d6be0 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/parameter/provider/package-info.java @@ -0,0 +1,4 @@ +/** + * Package containing the provider skeletons for the Parameter service. +*/ +package org.ccsds.moims.mo.mc.parameter.provider; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ActionCategory.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ActionCategory.java new file mode 100644 index 00000000..db0380f3 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ActionCategory.java @@ -0,0 +1,133 @@ +package org.ccsds.moims.mo.mc.structures; + +/** + * Enumeration class for ActionCategory. + */ +public final class ActionCategory extends org.ccsds.moims.mo.mal.structures.Enumeration { + + private static final long serialVersionUID = 1125899940397066L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125899940397066L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Enumeration value for DEFAULT. + */ + public static final int DEFAULT_VALUE = 1; + + /** + * Enumeration singleton for value DEFAULT. + */ + public static final org.ccsds.moims.mo.mc.structures.ActionCategory DEFAULT = new org.ccsds.moims.mo.mc.structures.ActionCategory(org.ccsds.moims.mo.mc.structures.ActionCategory.DEFAULT_VALUE); + + /** + * Enumeration value for HIPRIORITY. + */ + public static final int HIPRIORITY_VALUE = 2; + + /** + * Enumeration singleton for value HIPRIORITY. + */ + public static final org.ccsds.moims.mo.mc.structures.ActionCategory HIPRIORITY = new org.ccsds.moims.mo.mc.structures.ActionCategory(org.ccsds.moims.mo.mc.structures.ActionCategory.HIPRIORITY_VALUE); + + /** + * Enumeration value for CRITICAL. + */ + public static final int CRITICAL_VALUE = 3; + + /** + * Enumeration singleton for value CRITICAL. + */ + public static final org.ccsds.moims.mo.mc.structures.ActionCategory CRITICAL = new org.ccsds.moims.mo.mc.structures.ActionCategory(org.ccsds.moims.mo.mc.structures.ActionCategory.CRITICAL_VALUE); + + /** + * Set of enumeration instances. + */ + private static final org.ccsds.moims.mo.mc.structures.ActionCategory[] _ENUMERATIONS = { + DEFAULT, HIPRIORITY, CRITICAL}; + + /** + * Contains the default Action category values. + */ + public ActionCategory() { + super(-1); + } + + /** + * Contains the default Action category values. + * + * @param value The value of the Enumeration. + */ + public ActionCategory(int value) { + super(value); + } + + @Override + public String toString() { + switch (getValue()) { + case DEFAULT_VALUE: + return "DEFAULT"; + case HIPRIORITY_VALUE: + return "HIPRIORITY"; + case CRITICAL_VALUE: + return "CRITICAL"; + default: + throw new RuntimeException("Unknown ordinal!"); + } + } + + /** + * Returns the enumeration element represented by the supplied string, or + * null if not matched. + * + * @param s s The string to search for. + * @return The matched enumeration element, or null if not matched. + */ + public static org.ccsds.moims.mo.mc.structures.ActionCategory fromString(String s) { + switch (s) { + case "DEFAULT": + return ActionCategory.DEFAULT; + case "HIPRIORITY": + return ActionCategory.HIPRIORITY; + case "CRITICAL": + return ActionCategory.CRITICAL; + default: + throw new RuntimeException("Unknown Enumeration for the provided string: " + s); + } + } + + @Override + public org.ccsds.moims.mo.mal.structures.Enumeration fromValue(Integer value) { + switch (value) { + case DEFAULT_VALUE: + return ActionCategory.DEFAULT; + case HIPRIORITY_VALUE: + return ActionCategory.HIPRIORITY; + case CRITICAL_VALUE: + return ActionCategory.CRITICAL; + default: + throw new RuntimeException("Unknown Enumeration for the provided value: " + value); + } + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return _ENUMERATIONS[0]; + } + + @Override + public int getEnumSize() { + return 3; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ActionCategoryList.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ActionCategoryList.java new file mode 100644 index 00000000..ace1e35f --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ActionCategoryList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mc.structures; + +/** + * List class for ActionCategory. + */ +public final class ActionCategoryList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1125899957174262L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125899957174262L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for ActionCategoryList. + * + */ + public ActionCategoryList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public ActionCategoryList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public ActionCategoryList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mc.structures.ActionCategory element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mc.structures.ActionCategory element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new ActionCategoryList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return org.ccsds.moims.mo.mc.structures.ActionCategory.DEFAULT; + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ActionCompleteEvent.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ActionCompleteEvent.java new file mode 100644 index 00000000..416d0fe9 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ActionCompleteEvent.java @@ -0,0 +1,94 @@ +package org.ccsds.moims.mo.mc.structures; + +/** + * The ActionCompleteEvent type is used for publishing an action execution + * reaching the completion stage. + */ +public final class ActionCompleteEvent extends org.ccsds.moims.mo.mc.structures.ActionEvent { + + private static final long serialVersionUID = 1125899940397071L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125899940397071L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for ActionCompleteEvent. + * + */ + public ActionCompleteEvent() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param success The success field. + * @param comment The comment field. + */ + public ActionCompleteEvent(Boolean success, + String comment) { + super(success, + comment); + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param success The success field. + */ + public ActionCompleteEvent(Boolean success) { + super(success); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mc.structures.ActionCompleteEvent(); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ActionCompleteEvent) { + if (! super.equals(obj)) { + return false; + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = super.hashCode(); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(ActionCompleteEvent: "); + buf.append(super.toString()); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + super.encode(encoder); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + super.decode(decoder); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ActionCompleteEventList.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ActionCompleteEventList.java new file mode 100644 index 00000000..3b6828da --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ActionCompleteEventList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mc.structures; + +/** + * List class for ActionCompleteEvent. + */ +public final class ActionCompleteEventList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1125899957174257L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125899957174257L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for ActionCompleteEventList. + * + */ + public ActionCompleteEventList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public ActionCompleteEventList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public ActionCompleteEventList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mc.structures.ActionCompleteEvent element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mc.structures.ActionCompleteEvent element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new ActionCompleteEventList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mc.structures.ActionCompleteEvent(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ActionDefinition.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ActionDefinition.java new file mode 100644 index 00000000..378b3a5c --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ActionDefinition.java @@ -0,0 +1,230 @@ +package org.ccsds.moims.mo.mc.structures; + +/** + * The ActionDefinition structure holds the definition information of an action. + */ +public final class ActionDefinition extends org.ccsds.moims.mo.mal.structures.MOObject { + + private static final long serialVersionUID = 1125899940397067L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125899940397067L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * The description field. + */ + private String description; + + /** + * The category field. + */ + private org.ccsds.moims.mo.mc.structures.ActionCategory category; + + /** + * The progressStepCount field. + */ + private org.ccsds.moims.mo.mal.structures.UShort progressStepCount; + + /** + * The arguments field. + */ + private org.ccsds.moims.mo.mc.structures.ArgumentDefinitionList arguments; + + /** + * Default constructor for ActionDefinition. + * + */ + public ActionDefinition() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param objectIdentity The identity of the MO Object. + * @param description The description field. + * @param category The category field. + * @param progressStepCount The progressStepCount field. + * @param arguments The arguments field. + */ + public ActionDefinition(org.ccsds.moims.mo.mal.structures.ObjectIdentity objectIdentity, + String description, + org.ccsds.moims.mo.mc.structures.ActionCategory category, + org.ccsds.moims.mo.mal.structures.UShort progressStepCount, + org.ccsds.moims.mo.mc.structures.ArgumentDefinitionList arguments) { + super(objectIdentity); + this.description = description; + this.category = category; + this.progressStepCount = progressStepCount; + this.arguments = arguments; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param objectIdentity The identity of the MO Object. + * @param description The description field. + * @param category The category field. + * @param progressStepCount The progressStepCount field. + */ + public ActionDefinition(org.ccsds.moims.mo.mal.structures.ObjectIdentity objectIdentity, + String description, + org.ccsds.moims.mo.mc.structures.ActionCategory category, + org.ccsds.moims.mo.mal.structures.UShort progressStepCount) { + super(objectIdentity); + this.description = description; + this.category = category; + this.progressStepCount = progressStepCount; + this.arguments = null; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mc.structures.ActionDefinition(); + } + + /** + * Returns the field description. + * + * @return The field description + */ + public String getDescription() { + return description; + } + + /** + * Returns the field category. + * + * @return The field category + */ + public org.ccsds.moims.mo.mc.structures.ActionCategory getCategory() { + return category; + } + + /** + * Returns the field progressStepCount. + * + * @return The field progressStepCount + */ + public org.ccsds.moims.mo.mal.structures.UShort getProgressStepCount() { + return progressStepCount; + } + + /** + * Returns the field arguments. + * + * @return The field arguments + */ + public org.ccsds.moims.mo.mc.structures.ArgumentDefinitionList getArguments() { + return arguments; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ActionDefinition) { + if (! super.equals(obj)) { + return false; + } + ActionDefinition other = (ActionDefinition) obj; + if (description == null) { + if (other.description != null) { + return false; + } + } else { + if (! description.equals(other.description)) { + return false; + } + } + if (category == null) { + if (other.category != null) { + return false; + } + } else { + if (! category.equals(other.category)) { + return false; + } + } + if (progressStepCount == null) { + if (other.progressStepCount != null) { + return false; + } + } else { + if (! progressStepCount.equals(other.progressStepCount)) { + return false; + } + } + if (arguments == null) { + if (other.arguments != null) { + return false; + } + } else { + if (! arguments.equals(other.arguments)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = super.hashCode(); + hash = 83 * hash + (description != null ? description.hashCode() : 0); + hash = 83 * hash + (category != null ? category.hashCode() : 0); + hash = 83 * hash + (progressStepCount != null ? progressStepCount.hashCode() : 0); + hash = 83 * hash + (arguments != null ? arguments.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(ActionDefinition: "); + buf.append(super.toString()); + buf.append(", description=").append(description); + buf.append(", category=").append(category); + buf.append(", progressStepCount=").append(progressStepCount); + buf.append(", arguments=").append(arguments); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + super.encode(encoder); + if (description == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'description' cannot be null!"); + } + if (category == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'category' cannot be null!"); + } + if (progressStepCount == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'progressStepCount' cannot be null!"); + } + encoder.encodeString(description); + encoder.encodeElement(category); + encoder.encodeUShort(progressStepCount); + encoder.encodeNullableElement(arguments); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + super.decode(decoder); + description = decoder.decodeString(); + category = (org.ccsds.moims.mo.mc.structures.ActionCategory) decoder.decodeElement(org.ccsds.moims.mo.mc.structures.ActionCategory.DEFAULT); + progressStepCount = decoder.decodeUShort(); + arguments = (org.ccsds.moims.mo.mc.structures.ArgumentDefinitionList) decoder.decodeNullableElement(new org.ccsds.moims.mo.mc.structures.ArgumentDefinitionList()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ActionDefinitionList.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ActionDefinitionList.java new file mode 100644 index 00000000..b7791ac8 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ActionDefinitionList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mc.structures; + +/** + * List class for ActionDefinition. + */ +public final class ActionDefinitionList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1125899957174261L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125899957174261L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for ActionDefinitionList. + * + */ + public ActionDefinitionList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public ActionDefinitionList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public ActionDefinitionList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mc.structures.ActionDefinition element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mc.structures.ActionDefinition element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new ActionDefinitionList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mc.structures.ActionDefinition(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ActionEvent.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ActionEvent.java new file mode 100644 index 00000000..c165438a --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ActionEvent.java @@ -0,0 +1,128 @@ +package org.ccsds.moims.mo.mc.structures; + +/** + * The ActionEvent is the base type of all events used by the monitorActionExec + * operation to publish a new execution stage reached by the execution of + * an action. + */ +public abstract class ActionEvent implements org.ccsds.moims.mo.mal.structures.Composite { + + /** + * The success field. + */ + private Boolean success; + + /** + * The comment field. + */ + private String comment; + + /** + * Default constructor for ActionEvent. + * + */ + public ActionEvent() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param success The success field. + * @param comment The comment field. + */ + public ActionEvent(Boolean success, + String comment) { + this.success = success; + this.comment = comment; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param success The success field. + */ + public ActionEvent(Boolean success) { + this.success = success; + this.comment = null; + } + + /** + * Returns the field success. + * + * @return The field success + */ + public Boolean getSuccess() { + return success; + } + + /** + * Returns the field comment. + * + * @return The field comment + */ + public String getComment() { + return comment; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ActionEvent) { + ActionEvent other = (ActionEvent) obj; + if (success == null) { + if (other.success != null) { + return false; + } + } else { + if (! success.equals(other.success)) { + return false; + } + } + if (comment == null) { + if (other.comment != null) { + return false; + } + } else { + if (! comment.equals(other.comment)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (success != null ? success.hashCode() : 0); + hash = 83 * hash + (comment != null ? comment.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(ActionEvent: "); + buf.append("success=").append(success); + buf.append(", comment=").append(comment); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (success == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'success' cannot be null!"); + } + encoder.encodeBoolean(success); + encoder.encodeNullableString(comment); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + success = decoder.decodeBoolean(); + comment = decoder.decodeNullableString(); + return this; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ActionEventList.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ActionEventList.java new file mode 100644 index 00000000..d0ad49bf --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ActionEventList.java @@ -0,0 +1,23 @@ +package org.ccsds.moims.mo.mc.structures; + +/** + * List class for ActionEvent. + */ +public final class ActionEventList extends org.ccsds.moims.mo.mal.structures.HeterogeneousList { + + /** + * Default constructor for ActionEventList. + * + */ + public ActionEventList() { + } + + @Override + public boolean add(org.ccsds.moims.mo.mal.structures.Element element) { + if (element != null && !(element instanceof ActionEvent)) { + throw new java.lang.ClassCastException("The added element does not extend the type: ActionEvent"); + } + return super.add(element); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ActionExecutionRequest.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ActionExecutionRequest.java new file mode 100644 index 00000000..4c615794 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ActionExecutionRequest.java @@ -0,0 +1,322 @@ +package org.ccsds.moims.mo.mc.structures; + +/** + * The ActionExecutionRequest structure holds the information required for + * a specific execution of an action. + */ +public final class ActionExecutionRequest implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1125899940397068L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125899940397068L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * The requestId field. + */ + private Long requestId; + + /** + * The actionRef field. + */ + private org.ccsds.moims.mo.mal.structures.ObjectRef actionRef; + + /** + * The source field. + */ + private org.ccsds.moims.mo.mal.structures.ObjectRef source; + + /** + * The stageStartedRequired field. + */ + private Boolean stageStartedRequired; + + /** + * The stageProgressRequired field. + */ + private Boolean stageProgressRequired; + + /** + * The stageCompletedRequired field. + */ + private Boolean stageCompletedRequired; + + /** + * The argumentValues field. + */ + private org.ccsds.moims.mo.mal.structures.NullableAttributeList argumentValues; + + /** + * Default constructor for ActionExecutionRequest. + * + */ + public ActionExecutionRequest() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param requestId The requestId field. + * @param actionRef The actionRef field. + * @param source The source field. + * @param stageStartedRequired The stageStartedRequired field. + * @param stageProgressRequired The stageProgressRequired field. + * @param stageCompletedRequired The stageCompletedRequired field. + * @param argumentValues The argumentValues field. + */ + public ActionExecutionRequest(Long requestId, + org.ccsds.moims.mo.mal.structures.ObjectRef actionRef, + org.ccsds.moims.mo.mal.structures.ObjectRef source, + Boolean stageStartedRequired, + Boolean stageProgressRequired, + Boolean stageCompletedRequired, + org.ccsds.moims.mo.mal.structures.NullableAttributeList argumentValues) { + this.requestId = requestId; + this.actionRef = actionRef; + this.source = source; + this.stageStartedRequired = stageStartedRequired; + this.stageProgressRequired = stageProgressRequired; + this.stageCompletedRequired = stageCompletedRequired; + this.argumentValues = argumentValues; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param requestId The requestId field. + * @param actionRef The actionRef field. + * @param stageStartedRequired The stageStartedRequired field. + * @param stageProgressRequired The stageProgressRequired field. + * @param stageCompletedRequired The stageCompletedRequired field. + */ + public ActionExecutionRequest(Long requestId, + org.ccsds.moims.mo.mal.structures.ObjectRef actionRef, + Boolean stageStartedRequired, + Boolean stageProgressRequired, + Boolean stageCompletedRequired) { + this.requestId = requestId; + this.actionRef = actionRef; + this.source = null; + this.stageStartedRequired = stageStartedRequired; + this.stageProgressRequired = stageProgressRequired; + this.stageCompletedRequired = stageCompletedRequired; + this.argumentValues = null; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mc.structures.ActionExecutionRequest(); + } + + /** + * Returns the field requestId. + * + * @return The field requestId + */ + public Long getRequestId() { + return requestId; + } + + /** + * Returns the field actionRef. + * + * @return The field actionRef + */ + public org.ccsds.moims.mo.mal.structures.ObjectRef getActionRef() { + return actionRef; + } + + /** + * Returns the field source. + * + * @return The field source + */ + public org.ccsds.moims.mo.mal.structures.ObjectRef getSource() { + return source; + } + + /** + * Returns the field stageStartedRequired. + * + * @return The field stageStartedRequired + */ + public Boolean getStageStartedRequired() { + return stageStartedRequired; + } + + /** + * Returns the field stageProgressRequired. + * + * @return The field stageProgressRequired + */ + public Boolean getStageProgressRequired() { + return stageProgressRequired; + } + + /** + * Returns the field stageCompletedRequired. + * + * @return The field stageCompletedRequired + */ + public Boolean getStageCompletedRequired() { + return stageCompletedRequired; + } + + /** + * Returns the field argumentValues. + * + * @return The field argumentValues + */ + public org.ccsds.moims.mo.mal.structures.NullableAttributeList getArgumentValues() { + return argumentValues; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ActionExecutionRequest) { + ActionExecutionRequest other = (ActionExecutionRequest) obj; + if (requestId == null) { + if (other.requestId != null) { + return false; + } + } else { + if (! requestId.equals(other.requestId)) { + return false; + } + } + if (actionRef == null) { + if (other.actionRef != null) { + return false; + } + } else { + if (! actionRef.equals(other.actionRef)) { + return false; + } + } + if (source == null) { + if (other.source != null) { + return false; + } + } else { + if (! source.equals(other.source)) { + return false; + } + } + if (stageStartedRequired == null) { + if (other.stageStartedRequired != null) { + return false; + } + } else { + if (! stageStartedRequired.equals(other.stageStartedRequired)) { + return false; + } + } + if (stageProgressRequired == null) { + if (other.stageProgressRequired != null) { + return false; + } + } else { + if (! stageProgressRequired.equals(other.stageProgressRequired)) { + return false; + } + } + if (stageCompletedRequired == null) { + if (other.stageCompletedRequired != null) { + return false; + } + } else { + if (! stageCompletedRequired.equals(other.stageCompletedRequired)) { + return false; + } + } + if (argumentValues == null) { + if (other.argumentValues != null) { + return false; + } + } else { + if (! argumentValues.equals(other.argumentValues)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (requestId != null ? requestId.hashCode() : 0); + hash = 83 * hash + (actionRef != null ? actionRef.hashCode() : 0); + hash = 83 * hash + (source != null ? source.hashCode() : 0); + hash = 83 * hash + (stageStartedRequired != null ? stageStartedRequired.hashCode() : 0); + hash = 83 * hash + (stageProgressRequired != null ? stageProgressRequired.hashCode() : 0); + hash = 83 * hash + (stageCompletedRequired != null ? stageCompletedRequired.hashCode() : 0); + hash = 83 * hash + (argumentValues != null ? argumentValues.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(ActionExecutionRequest: "); + buf.append("requestId=").append(requestId); + buf.append(", actionRef=").append(actionRef); + buf.append(", source=").append(source); + buf.append(", stageStartedRequired=").append(stageStartedRequired); + buf.append(", stageProgressRequired=").append(stageProgressRequired); + buf.append(", stageCompletedRequired=").append(stageCompletedRequired); + buf.append(", argumentValues=").append(argumentValues); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (requestId == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'requestId' cannot be null!"); + } + if (actionRef == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'actionRef' cannot be null!"); + } + if (stageStartedRequired == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'stageStartedRequired' cannot be null!"); + } + if (stageProgressRequired == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'stageProgressRequired' cannot be null!"); + } + if (stageCompletedRequired == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'stageCompletedRequired' cannot be null!"); + } + encoder.encodeLong(requestId); + encoder.encodeElement(actionRef); + encoder.encodeNullableAbstractElement(source); + encoder.encodeBoolean(stageStartedRequired); + encoder.encodeBoolean(stageProgressRequired); + encoder.encodeBoolean(stageCompletedRequired); + encoder.encodeNullableElement(argumentValues); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + requestId = decoder.decodeLong(); + actionRef = (org.ccsds.moims.mo.mal.structures.ObjectRef) decoder.decodeElement(new org.ccsds.moims.mo.mal.structures.ObjectRef()); + source = (org.ccsds.moims.mo.mal.structures.ObjectRef) decoder.decodeNullableAbstractElement(); + stageStartedRequired = decoder.decodeBoolean(); + stageProgressRequired = decoder.decodeBoolean(); + stageCompletedRequired = decoder.decodeBoolean(); + argumentValues = (org.ccsds.moims.mo.mal.structures.NullableAttributeList) decoder.decodeNullableElement(new org.ccsds.moims.mo.mal.structures.NullableAttributeList()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ActionExecutionRequestList.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ActionExecutionRequestList.java new file mode 100644 index 00000000..ff74e2e2 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ActionExecutionRequestList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mc.structures; + +/** + * List class for ActionExecutionRequest. + */ +public final class ActionExecutionRequestList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1125899957174260L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125899957174260L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for ActionExecutionRequestList. + * + */ + public ActionExecutionRequestList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public ActionExecutionRequestList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public ActionExecutionRequestList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mc.structures.ActionExecutionRequest element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mc.structures.ActionExecutionRequest element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new ActionExecutionRequestList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mc.structures.ActionExecutionRequest(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ActionInProgressEvent.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ActionInProgressEvent.java new file mode 100644 index 00000000..3d8dc668 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ActionInProgressEvent.java @@ -0,0 +1,167 @@ +package org.ccsds.moims.mo.mc.structures; + +/** + * The ActionInProgressEvent type is used for publishing an action execution + * reaching a new execution stage. + */ +public final class ActionInProgressEvent extends org.ccsds.moims.mo.mc.structures.ActionEvent { + + private static final long serialVersionUID = 1125899940397070L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125899940397070L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * The stageCount field. + */ + private org.ccsds.moims.mo.mal.structures.UInteger stageCount; + + /** + * The executionStage field. + */ + private org.ccsds.moims.mo.mal.structures.UInteger executionStage; + + /** + * Default constructor for ActionInProgressEvent. + * + */ + public ActionInProgressEvent() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param success The success field. + * @param comment The comment field. + * @param stageCount The stageCount field. + * @param executionStage The executionStage field. + */ + public ActionInProgressEvent(Boolean success, + String comment, + org.ccsds.moims.mo.mal.structures.UInteger stageCount, + org.ccsds.moims.mo.mal.structures.UInteger executionStage) { + super(success, + comment); + this.stageCount = stageCount; + this.executionStage = executionStage; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param success The success field. + * @param stageCount The stageCount field. + * @param executionStage The executionStage field. + */ + public ActionInProgressEvent(Boolean success, + org.ccsds.moims.mo.mal.structures.UInteger stageCount, + org.ccsds.moims.mo.mal.structures.UInteger executionStage) { + super(success); + this.stageCount = stageCount; + this.executionStage = executionStage; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mc.structures.ActionInProgressEvent(); + } + + /** + * Returns the field stageCount. + * + * @return The field stageCount + */ + public org.ccsds.moims.mo.mal.structures.UInteger getStageCount() { + return stageCount; + } + + /** + * Returns the field executionStage. + * + * @return The field executionStage + */ + public org.ccsds.moims.mo.mal.structures.UInteger getExecutionStage() { + return executionStage; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ActionInProgressEvent) { + if (! super.equals(obj)) { + return false; + } + ActionInProgressEvent other = (ActionInProgressEvent) obj; + if (stageCount == null) { + if (other.stageCount != null) { + return false; + } + } else { + if (! stageCount.equals(other.stageCount)) { + return false; + } + } + if (executionStage == null) { + if (other.executionStage != null) { + return false; + } + } else { + if (! executionStage.equals(other.executionStage)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = super.hashCode(); + hash = 83 * hash + (stageCount != null ? stageCount.hashCode() : 0); + hash = 83 * hash + (executionStage != null ? executionStage.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(ActionInProgressEvent: "); + buf.append(super.toString()); + buf.append(", stageCount=").append(stageCount); + buf.append(", executionStage=").append(executionStage); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + super.encode(encoder); + if (stageCount == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'stageCount' cannot be null!"); + } + if (executionStage == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'executionStage' cannot be null!"); + } + encoder.encodeUInteger(stageCount); + encoder.encodeUInteger(executionStage); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + super.decode(decoder); + stageCount = decoder.decodeUInteger(); + executionStage = decoder.decodeUInteger(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ActionInProgressEventList.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ActionInProgressEventList.java new file mode 100644 index 00000000..7eac7ae3 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ActionInProgressEventList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mc.structures; + +/** + * List class for ActionInProgressEvent. + */ +public final class ActionInProgressEventList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1125899957174258L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125899957174258L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for ActionInProgressEventList. + * + */ + public ActionInProgressEventList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public ActionInProgressEventList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public ActionInProgressEventList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mc.structures.ActionInProgressEvent element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mc.structures.ActionInProgressEvent element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new ActionInProgressEventList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mc.structures.ActionInProgressEvent(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ActionStartEvent.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ActionStartEvent.java new file mode 100644 index 00000000..8f4ed236 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ActionStartEvent.java @@ -0,0 +1,94 @@ +package org.ccsds.moims.mo.mc.structures; + +/** + * The ActionStartEvent type is used for publishing an action execution reaching + * the started stage. + */ +public final class ActionStartEvent extends org.ccsds.moims.mo.mc.structures.ActionEvent { + + private static final long serialVersionUID = 1125899940397069L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125899940397069L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for ActionStartEvent. + * + */ + public ActionStartEvent() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param success The success field. + * @param comment The comment field. + */ + public ActionStartEvent(Boolean success, + String comment) { + super(success, + comment); + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param success The success field. + */ + public ActionStartEvent(Boolean success) { + super(success); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mc.structures.ActionStartEvent(); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ActionStartEvent) { + if (! super.equals(obj)) { + return false; + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = super.hashCode(); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(ActionStartEvent: "); + buf.append(super.toString()); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + super.encode(encoder); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + super.decode(decoder); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ActionStartEventList.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ActionStartEventList.java new file mode 100644 index 00000000..0d551de7 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ActionStartEventList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mc.structures; + +/** + * List class for ActionStartEvent. + */ +public final class ActionStartEventList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1125899957174259L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125899957174259L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for ActionStartEventList. + * + */ + public ActionStartEventList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public ActionStartEventList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public ActionStartEventList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mc.structures.ActionStartEvent element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mc.structures.ActionStartEvent element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new ActionStartEventList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mc.structures.ActionStartEvent(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/AggregationDefinition.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/AggregationDefinition.java new file mode 100644 index 00000000..a05e8533 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/AggregationDefinition.java @@ -0,0 +1,195 @@ +package org.ccsds.moims.mo.mc.structures; + +/** + * The AggregationDefinition structure shall be used to hold definition details + * of an aggregation. + */ +public final class AggregationDefinition extends org.ccsds.moims.mo.mal.structures.MOObject { + + private static final long serialVersionUID = 1125899940397116L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125899940397116L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * The description field. + */ + private String description; + + /** + * The category field. + */ + private org.ccsds.moims.mo.mal.structures.Identifier category; + + /** + * The parameters field. + */ + private org.ccsds.moims.mo.mal.structures.ObjectRefList parameters; + + /** + * Default constructor for AggregationDefinition. + * + */ + public AggregationDefinition() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param objectIdentity The identity of the MO Object. + * @param description The description field. + * @param category The category field. + * @param parameters The parameters field. + */ + public AggregationDefinition(org.ccsds.moims.mo.mal.structures.ObjectIdentity objectIdentity, + String description, + org.ccsds.moims.mo.mal.structures.Identifier category, + org.ccsds.moims.mo.mal.structures.ObjectRefList parameters) { + super(objectIdentity); + this.description = description; + this.category = category; + this.parameters = parameters; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param objectIdentity The identity of the MO Object. + * @param description The description field. + * @param parameters The parameters field. + */ + public AggregationDefinition(org.ccsds.moims.mo.mal.structures.ObjectIdentity objectIdentity, + String description, + org.ccsds.moims.mo.mal.structures.ObjectRefList parameters) { + super(objectIdentity); + this.description = description; + this.category = null; + this.parameters = parameters; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mc.structures.AggregationDefinition(); + } + + /** + * Returns the field description. + * + * @return The field description + */ + public String getDescription() { + return description; + } + + /** + * Returns the field category. + * + * @return The field category + */ + public org.ccsds.moims.mo.mal.structures.Identifier getCategory() { + return category; + } + + /** + * Returns the field parameters. + * + * @return The field parameters + */ + public org.ccsds.moims.mo.mal.structures.ObjectRefList getParameters() { + return parameters; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof AggregationDefinition) { + if (! super.equals(obj)) { + return false; + } + AggregationDefinition other = (AggregationDefinition) obj; + if (description == null) { + if (other.description != null) { + return false; + } + } else { + if (! description.equals(other.description)) { + return false; + } + } + if (category == null) { + if (other.category != null) { + return false; + } + } else { + if (! category.equals(other.category)) { + return false; + } + } + if (parameters == null) { + if (other.parameters != null) { + return false; + } + } else { + if (! parameters.equals(other.parameters)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = super.hashCode(); + hash = 83 * hash + (description != null ? description.hashCode() : 0); + hash = 83 * hash + (category != null ? category.hashCode() : 0); + hash = 83 * hash + (parameters != null ? parameters.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(AggregationDefinition: "); + buf.append(super.toString()); + buf.append(", description=").append(description); + buf.append(", category=").append(category); + buf.append(", parameters=").append(parameters); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + super.encode(encoder); + if (description == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'description' cannot be null!"); + } + if (parameters == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'parameters' cannot be null!"); + } + encoder.encodeString(description); + encoder.encodeNullableIdentifier(category); + encoder.encodeElement(parameters); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + super.decode(decoder); + description = decoder.decodeString(); + category = decoder.decodeNullableIdentifier(); + parameters = (org.ccsds.moims.mo.mal.structures.ObjectRefList) decoder.decodeElement(new org.ccsds.moims.mo.mal.structures.ObjectRefList()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/AggregationDefinitionList.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/AggregationDefinitionList.java new file mode 100644 index 00000000..edf19cb9 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/AggregationDefinitionList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mc.structures; + +/** + * List class for AggregationDefinition. + */ +public final class AggregationDefinitionList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1125899957174212L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125899957174212L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for AggregationDefinitionList. + * + */ + public AggregationDefinitionList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public AggregationDefinitionList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public AggregationDefinitionList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mc.structures.AggregationDefinition element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mc.structures.AggregationDefinition element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new AggregationDefinitionList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mc.structures.AggregationDefinition(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/AggregationValue.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/AggregationValue.java new file mode 100644 index 00000000..527ed8c1 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/AggregationValue.java @@ -0,0 +1,173 @@ +package org.ccsds.moims.mo.mc.structures; + +/** + * The AggregationValue structure shall be used to hold the values of the + * aggregation parameters. + */ +public final class AggregationValue implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1125899940397117L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125899940397117L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * The aggregationRef field. + */ + private org.ccsds.moims.mo.mal.structures.ObjectRef aggregationRef; + + /** + * The timestamp field. + */ + private org.ccsds.moims.mo.mal.structures.Time timestamp; + + /** + * The parameterValues field. + */ + private org.ccsds.moims.mo.mc.structures.ParameterValueDataList parameterValues; + + /** + * Default constructor for AggregationValue. + * + */ + public AggregationValue() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param aggregationRef The aggregationRef field. + * @param timestamp The timestamp field. + * @param parameterValues The parameterValues field. + */ + public AggregationValue(org.ccsds.moims.mo.mal.structures.ObjectRef aggregationRef, + org.ccsds.moims.mo.mal.structures.Time timestamp, + org.ccsds.moims.mo.mc.structures.ParameterValueDataList parameterValues) { + this.aggregationRef = aggregationRef; + this.timestamp = timestamp; + this.parameterValues = parameterValues; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mc.structures.AggregationValue(); + } + + /** + * Returns the field aggregationRef. + * + * @return The field aggregationRef + */ + public org.ccsds.moims.mo.mal.structures.ObjectRef getAggregationRef() { + return aggregationRef; + } + + /** + * Returns the field timestamp. + * + * @return The field timestamp + */ + public org.ccsds.moims.mo.mal.structures.Time getTimestamp() { + return timestamp; + } + + /** + * Returns the field parameterValues. + * + * @return The field parameterValues + */ + public org.ccsds.moims.mo.mc.structures.ParameterValueDataList getParameterValues() { + return parameterValues; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof AggregationValue) { + AggregationValue other = (AggregationValue) obj; + if (aggregationRef == null) { + if (other.aggregationRef != null) { + return false; + } + } else { + if (! aggregationRef.equals(other.aggregationRef)) { + return false; + } + } + if (timestamp == null) { + if (other.timestamp != null) { + return false; + } + } else { + if (! timestamp.equals(other.timestamp)) { + return false; + } + } + if (parameterValues == null) { + if (other.parameterValues != null) { + return false; + } + } else { + if (! parameterValues.equals(other.parameterValues)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (aggregationRef != null ? aggregationRef.hashCode() : 0); + hash = 83 * hash + (timestamp != null ? timestamp.hashCode() : 0); + hash = 83 * hash + (parameterValues != null ? parameterValues.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(AggregationValue: "); + buf.append("aggregationRef=").append(aggregationRef); + buf.append(", timestamp=").append(timestamp); + buf.append(", parameterValues=").append(parameterValues); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (aggregationRef == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'aggregationRef' cannot be null!"); + } + if (timestamp == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'timestamp' cannot be null!"); + } + if (parameterValues == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'parameterValues' cannot be null!"); + } + encoder.encodeElement(aggregationRef); + encoder.encodeTime(timestamp); + encoder.encodeElement(parameterValues); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + aggregationRef = (org.ccsds.moims.mo.mal.structures.ObjectRef) decoder.decodeElement(new org.ccsds.moims.mo.mal.structures.ObjectRef()); + timestamp = decoder.decodeTime(); + parameterValues = (org.ccsds.moims.mo.mc.structures.ParameterValueDataList) decoder.decodeElement(new org.ccsds.moims.mo.mc.structures.ParameterValueDataList()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/AggregationValueList.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/AggregationValueList.java new file mode 100644 index 00000000..551d852d --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/AggregationValueList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mc.structures; + +/** + * List class for AggregationValue. + */ +public final class AggregationValueList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1125899957174211L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125899957174211L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for AggregationValueList. + * + */ + public AggregationValueList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public AggregationValueList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public AggregationValueList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mc.structures.AggregationValue element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mc.structures.AggregationValue element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new AggregationValueList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mc.structures.AggregationValue(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/AlertConfiguration.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/AlertConfiguration.java new file mode 100644 index 00000000..d6cce838 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/AlertConfiguration.java @@ -0,0 +1,107 @@ +package org.ccsds.moims.mo.mc.structures; + +/** + * The AlertConfiguration structure is used to retrieve the configuration + * of the generation of an alert. + */ +public final class AlertConfiguration implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1125899940397088L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125899940397088L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * The generationEnabled field. + */ + private Boolean generationEnabled; + + /** + * Default constructor for AlertConfiguration. + * + */ + public AlertConfiguration() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param generationEnabled The generationEnabled field. + */ + public AlertConfiguration(Boolean generationEnabled) { + this.generationEnabled = generationEnabled; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mc.structures.AlertConfiguration(); + } + + /** + * Returns the field generationEnabled. + * + * @return The field generationEnabled + */ + public Boolean getGenerationEnabled() { + return generationEnabled; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof AlertConfiguration) { + AlertConfiguration other = (AlertConfiguration) obj; + if (generationEnabled == null) { + if (other.generationEnabled != null) { + return false; + } + } else { + if (! generationEnabled.equals(other.generationEnabled)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (generationEnabled != null ? generationEnabled.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(AlertConfiguration: "); + buf.append("generationEnabled=").append(generationEnabled); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (generationEnabled == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'generationEnabled' cannot be null!"); + } + encoder.encodeBoolean(generationEnabled); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + generationEnabled = decoder.decodeBoolean(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/AlertConfigurationList.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/AlertConfigurationList.java new file mode 100644 index 00000000..49f36635 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/AlertConfigurationList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mc.structures; + +/** + * List class for AlertConfiguration. + */ +public final class AlertConfigurationList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1125899957174240L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125899957174240L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for AlertConfigurationList. + * + */ + public AlertConfigurationList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public AlertConfigurationList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public AlertConfigurationList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mc.structures.AlertConfiguration element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mc.structures.AlertConfiguration element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new AlertConfigurationList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mc.structures.AlertConfiguration(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/AlertDefinition.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/AlertDefinition.java new file mode 100644 index 00000000..be6d3d5c --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/AlertDefinition.java @@ -0,0 +1,195 @@ +package org.ccsds.moims.mo.mc.structures; + +/** + * The AlertDefinition structure shall be used to provide the definition of + * an alert including any argument definitions. + */ +public final class AlertDefinition extends org.ccsds.moims.mo.mal.structures.MOObject { + + private static final long serialVersionUID = 1125899940397086L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125899940397086L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * The description field. + */ + private String description; + + /** + * The severity field. + */ + private org.ccsds.moims.mo.mc.structures.Severity severity; + + /** + * The arguments field. + */ + private org.ccsds.moims.mo.mc.structures.ArgumentDefinitionList arguments; + + /** + * Default constructor for AlertDefinition. + * + */ + public AlertDefinition() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param objectIdentity The identity of the MO Object. + * @param description The description field. + * @param severity The severity field. + * @param arguments The arguments field. + */ + public AlertDefinition(org.ccsds.moims.mo.mal.structures.ObjectIdentity objectIdentity, + String description, + org.ccsds.moims.mo.mc.structures.Severity severity, + org.ccsds.moims.mo.mc.structures.ArgumentDefinitionList arguments) { + super(objectIdentity); + this.description = description; + this.severity = severity; + this.arguments = arguments; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param objectIdentity The identity of the MO Object. + * @param description The description field. + * @param severity The severity field. + */ + public AlertDefinition(org.ccsds.moims.mo.mal.structures.ObjectIdentity objectIdentity, + String description, + org.ccsds.moims.mo.mc.structures.Severity severity) { + super(objectIdentity); + this.description = description; + this.severity = severity; + this.arguments = null; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mc.structures.AlertDefinition(); + } + + /** + * Returns the field description. + * + * @return The field description + */ + public String getDescription() { + return description; + } + + /** + * Returns the field severity. + * + * @return The field severity + */ + public org.ccsds.moims.mo.mc.structures.Severity getSeverity() { + return severity; + } + + /** + * Returns the field arguments. + * + * @return The field arguments + */ + public org.ccsds.moims.mo.mc.structures.ArgumentDefinitionList getArguments() { + return arguments; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof AlertDefinition) { + if (! super.equals(obj)) { + return false; + } + AlertDefinition other = (AlertDefinition) obj; + if (description == null) { + if (other.description != null) { + return false; + } + } else { + if (! description.equals(other.description)) { + return false; + } + } + if (severity == null) { + if (other.severity != null) { + return false; + } + } else { + if (! severity.equals(other.severity)) { + return false; + } + } + if (arguments == null) { + if (other.arguments != null) { + return false; + } + } else { + if (! arguments.equals(other.arguments)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = super.hashCode(); + hash = 83 * hash + (description != null ? description.hashCode() : 0); + hash = 83 * hash + (severity != null ? severity.hashCode() : 0); + hash = 83 * hash + (arguments != null ? arguments.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(AlertDefinition: "); + buf.append(super.toString()); + buf.append(", description=").append(description); + buf.append(", severity=").append(severity); + buf.append(", arguments=").append(arguments); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + super.encode(encoder); + if (description == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'description' cannot be null!"); + } + if (severity == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'severity' cannot be null!"); + } + encoder.encodeString(description); + encoder.encodeElement(severity); + encoder.encodeNullableElement(arguments); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + super.decode(decoder); + description = decoder.decodeString(); + severity = (org.ccsds.moims.mo.mc.structures.Severity) decoder.decodeElement(org.ccsds.moims.mo.mc.structures.Severity.INFORMATIONAL); + arguments = (org.ccsds.moims.mo.mc.structures.ArgumentDefinitionList) decoder.decodeNullableElement(new org.ccsds.moims.mo.mc.structures.ArgumentDefinitionList()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/AlertDefinitionList.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/AlertDefinitionList.java new file mode 100644 index 00000000..2f48179f --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/AlertDefinitionList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mc.structures; + +/** + * List class for AlertDefinition. + */ +public final class AlertDefinitionList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1125899957174242L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125899957174242L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for AlertDefinitionList. + * + */ + public AlertDefinitionList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public AlertDefinitionList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public AlertDefinitionList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mc.structures.AlertDefinition element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mc.structures.AlertDefinition element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new AlertDefinitionList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mc.structures.AlertDefinition(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/AlertEvent.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/AlertEvent.java new file mode 100644 index 00000000..75a34a7b --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/AlertEvent.java @@ -0,0 +1,183 @@ +package org.ccsds.moims.mo.mc.structures; + +/** + * The AlertEvent structure shall be used to hold the details of an instance + * of an alert. + */ +public final class AlertEvent implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1125899940397087L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125899940397087L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * The alertRef field. + */ + private org.ccsds.moims.mo.mal.structures.ObjectRef alertRef; + + /** + * The timestamp field. + */ + private org.ccsds.moims.mo.mal.structures.Time timestamp; + + /** + * The argumentValues field. + */ + private org.ccsds.moims.mo.mal.structures.NullableAttributeList argumentValues; + + /** + * Default constructor for AlertEvent. + * + */ + public AlertEvent() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param alertRef The alertRef field. + * @param timestamp The timestamp field. + * @param argumentValues The argumentValues field. + */ + public AlertEvent(org.ccsds.moims.mo.mal.structures.ObjectRef alertRef, + org.ccsds.moims.mo.mal.structures.Time timestamp, + org.ccsds.moims.mo.mal.structures.NullableAttributeList argumentValues) { + this.alertRef = alertRef; + this.timestamp = timestamp; + this.argumentValues = argumentValues; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param alertRef The alertRef field. + * @param timestamp The timestamp field. + */ + public AlertEvent(org.ccsds.moims.mo.mal.structures.ObjectRef alertRef, + org.ccsds.moims.mo.mal.structures.Time timestamp) { + this.alertRef = alertRef; + this.timestamp = timestamp; + this.argumentValues = null; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mc.structures.AlertEvent(); + } + + /** + * Returns the field alertRef. + * + * @return The field alertRef + */ + public org.ccsds.moims.mo.mal.structures.ObjectRef getAlertRef() { + return alertRef; + } + + /** + * Returns the field timestamp. + * + * @return The field timestamp + */ + public org.ccsds.moims.mo.mal.structures.Time getTimestamp() { + return timestamp; + } + + /** + * Returns the field argumentValues. + * + * @return The field argumentValues + */ + public org.ccsds.moims.mo.mal.structures.NullableAttributeList getArgumentValues() { + return argumentValues; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof AlertEvent) { + AlertEvent other = (AlertEvent) obj; + if (alertRef == null) { + if (other.alertRef != null) { + return false; + } + } else { + if (! alertRef.equals(other.alertRef)) { + return false; + } + } + if (timestamp == null) { + if (other.timestamp != null) { + return false; + } + } else { + if (! timestamp.equals(other.timestamp)) { + return false; + } + } + if (argumentValues == null) { + if (other.argumentValues != null) { + return false; + } + } else { + if (! argumentValues.equals(other.argumentValues)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (alertRef != null ? alertRef.hashCode() : 0); + hash = 83 * hash + (timestamp != null ? timestamp.hashCode() : 0); + hash = 83 * hash + (argumentValues != null ? argumentValues.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(AlertEvent: "); + buf.append("alertRef=").append(alertRef); + buf.append(", timestamp=").append(timestamp); + buf.append(", argumentValues=").append(argumentValues); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (alertRef == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'alertRef' cannot be null!"); + } + if (timestamp == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'timestamp' cannot be null!"); + } + encoder.encodeElement(alertRef); + encoder.encodeTime(timestamp); + encoder.encodeNullableElement(argumentValues); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + alertRef = (org.ccsds.moims.mo.mal.structures.ObjectRef) decoder.decodeElement(new org.ccsds.moims.mo.mal.structures.ObjectRef()); + timestamp = decoder.decodeTime(); + argumentValues = (org.ccsds.moims.mo.mal.structures.NullableAttributeList) decoder.decodeNullableElement(new org.ccsds.moims.mo.mal.structures.NullableAttributeList()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/AlertEventList.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/AlertEventList.java new file mode 100644 index 00000000..aa2cecd8 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/AlertEventList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mc.structures; + +/** + * List class for AlertEvent. + */ +public final class AlertEventList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1125899957174241L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125899957174241L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for AlertEventList. + * + */ + public AlertEventList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public AlertEventList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public AlertEventList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mc.structures.AlertEvent element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mc.structures.AlertEvent element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new AlertEventList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mc.structures.AlertEvent(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ArgumentDefinition.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ArgumentDefinition.java new file mode 100644 index 00000000..6e63a025 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ArgumentDefinition.java @@ -0,0 +1,214 @@ +package org.ccsds.moims.mo.mc.structures; + +/** + * The ArgumentDefinition structure shall be used to hold the details of an + * argument definition. + */ +public final class ArgumentDefinition implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1125899940397057L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125899940397057L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * The argId field. + */ + private org.ccsds.moims.mo.mal.structures.Identifier argId; + + /** + * The description field. + */ + private String description; + + /** + * The type field. + */ + private org.ccsds.moims.mo.mal.structures.AttributeType type; + + /** + * The unit field. + */ + private String unit; + + /** + * Default constructor for ArgumentDefinition. + * + */ + public ArgumentDefinition() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param argId The argId field. + * @param description The description field. + * @param type The type field. + * @param unit The unit field. + */ + public ArgumentDefinition(org.ccsds.moims.mo.mal.structures.Identifier argId, + String description, + org.ccsds.moims.mo.mal.structures.AttributeType type, + String unit) { + this.argId = argId; + this.description = description; + this.type = type; + this.unit = unit; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param argId The argId field. + * @param type The type field. + */ + public ArgumentDefinition(org.ccsds.moims.mo.mal.structures.Identifier argId, + org.ccsds.moims.mo.mal.structures.AttributeType type) { + this.argId = argId; + this.description = null; + this.type = type; + this.unit = null; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mc.structures.ArgumentDefinition(); + } + + /** + * Returns the field argId. + * + * @return The field argId + */ + public org.ccsds.moims.mo.mal.structures.Identifier getArgId() { + return argId; + } + + /** + * Returns the field description. + * + * @return The field description + */ + public String getDescription() { + return description; + } + + /** + * Returns the field type. + * + * @return The field type + */ + public org.ccsds.moims.mo.mal.structures.AttributeType getType() { + return type; + } + + /** + * Returns the field unit. + * + * @return The field unit + */ + public String getUnit() { + return unit; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ArgumentDefinition) { + ArgumentDefinition other = (ArgumentDefinition) obj; + if (argId == null) { + if (other.argId != null) { + return false; + } + } else { + if (! argId.equals(other.argId)) { + return false; + } + } + if (description == null) { + if (other.description != null) { + return false; + } + } else { + if (! description.equals(other.description)) { + return false; + } + } + if (type == null) { + if (other.type != null) { + return false; + } + } else { + if (! type.equals(other.type)) { + return false; + } + } + if (unit == null) { + if (other.unit != null) { + return false; + } + } else { + if (! unit.equals(other.unit)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (argId != null ? argId.hashCode() : 0); + hash = 83 * hash + (description != null ? description.hashCode() : 0); + hash = 83 * hash + (type != null ? type.hashCode() : 0); + hash = 83 * hash + (unit != null ? unit.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(ArgumentDefinition: "); + buf.append("argId=").append(argId); + buf.append(", description=").append(description); + buf.append(", type=").append(type); + buf.append(", unit=").append(unit); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (argId == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'argId' cannot be null!"); + } + if (type == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'type' cannot be null!"); + } + encoder.encodeIdentifier(argId); + encoder.encodeNullableString(description); + encoder.encodeElement(type); + encoder.encodeNullableString(unit); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + argId = decoder.decodeIdentifier(); + description = decoder.decodeNullableString(); + type = (org.ccsds.moims.mo.mal.structures.AttributeType) decoder.decodeElement(org.ccsds.moims.mo.mal.structures.AttributeType.BLOB); + unit = decoder.decodeNullableString(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ArgumentDefinitionList.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ArgumentDefinitionList.java new file mode 100644 index 00000000..0fd89769 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ArgumentDefinitionList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mc.structures; + +/** + * List class for ArgumentDefinition. + */ +public final class ArgumentDefinitionList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1125899957174271L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125899957174271L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for ArgumentDefinitionList. + * + */ + public ArgumentDefinitionList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public ArgumentDefinitionList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public ArgumentDefinitionList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mc.structures.ArgumentDefinition element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mc.structures.ArgumentDefinition element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new ArgumentDefinitionList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mc.structures.ArgumentDefinition(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/PacketValue.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/PacketValue.java new file mode 100644 index 00000000..3cd8d1d7 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/PacketValue.java @@ -0,0 +1,219 @@ +package org.ccsds.moims.mo.mc.structures; + +/** + * The PacketValue structure is used to represent each space packet published + * by the provider. + */ +public final class PacketValue implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1125899940397146L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125899940397146L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * The payload field. + */ + private org.ccsds.moims.mo.mal.structures.Blob payload; + + /** + * The timestamp field. + */ + private org.ccsds.moims.mo.mal.structures.Time timestamp; + + /** + * The apid field. + */ + private org.ccsds.moims.mo.mal.structures.UShort apid; + + /** + * The keyValues field. + */ + private org.ccsds.moims.mo.mal.structures.NullableAttributeList keyValues; + + /** + * Default constructor for PacketValue. + * + */ + public PacketValue() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param payload The payload field. + * @param timestamp The timestamp field. + * @param apid The apid field. + * @param keyValues The keyValues field. + */ + public PacketValue(org.ccsds.moims.mo.mal.structures.Blob payload, + org.ccsds.moims.mo.mal.structures.Time timestamp, + org.ccsds.moims.mo.mal.structures.UShort apid, + org.ccsds.moims.mo.mal.structures.NullableAttributeList keyValues) { + this.payload = payload; + this.timestamp = timestamp; + this.apid = apid; + this.keyValues = keyValues; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param payload The payload field. + * @param timestamp The timestamp field. + * @param apid The apid field. + */ + public PacketValue(org.ccsds.moims.mo.mal.structures.Blob payload, + org.ccsds.moims.mo.mal.structures.Time timestamp, + org.ccsds.moims.mo.mal.structures.UShort apid) { + this.payload = payload; + this.timestamp = timestamp; + this.apid = apid; + this.keyValues = null; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mc.structures.PacketValue(); + } + + /** + * Returns the field payload. + * + * @return The field payload + */ + public org.ccsds.moims.mo.mal.structures.Blob getPayload() { + return payload; + } + + /** + * Returns the field timestamp. + * + * @return The field timestamp + */ + public org.ccsds.moims.mo.mal.structures.Time getTimestamp() { + return timestamp; + } + + /** + * Returns the field apid. + * + * @return The field apid + */ + public org.ccsds.moims.mo.mal.structures.UShort getApid() { + return apid; + } + + /** + * Returns the field keyValues. + * + * @return The field keyValues + */ + public org.ccsds.moims.mo.mal.structures.NullableAttributeList getKeyValues() { + return keyValues; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof PacketValue) { + PacketValue other = (PacketValue) obj; + if (payload == null) { + if (other.payload != null) { + return false; + } + } else { + if (! payload.equals(other.payload)) { + return false; + } + } + if (timestamp == null) { + if (other.timestamp != null) { + return false; + } + } else { + if (! timestamp.equals(other.timestamp)) { + return false; + } + } + if (apid == null) { + if (other.apid != null) { + return false; + } + } else { + if (! apid.equals(other.apid)) { + return false; + } + } + if (keyValues == null) { + if (other.keyValues != null) { + return false; + } + } else { + if (! keyValues.equals(other.keyValues)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (payload != null ? payload.hashCode() : 0); + hash = 83 * hash + (timestamp != null ? timestamp.hashCode() : 0); + hash = 83 * hash + (apid != null ? apid.hashCode() : 0); + hash = 83 * hash + (keyValues != null ? keyValues.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(PacketValue: "); + buf.append("payload=").append(payload); + buf.append(", timestamp=").append(timestamp); + buf.append(", apid=").append(apid); + buf.append(", keyValues=").append(keyValues); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (payload == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'payload' cannot be null!"); + } + if (timestamp == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'timestamp' cannot be null!"); + } + if (apid == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'apid' cannot be null!"); + } + encoder.encodeBlob(payload); + encoder.encodeTime(timestamp); + encoder.encodeUShort(apid); + encoder.encodeNullableElement(keyValues); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + payload = decoder.decodeBlob(); + timestamp = decoder.decodeTime(); + apid = decoder.decodeUShort(); + keyValues = (org.ccsds.moims.mo.mal.structures.NullableAttributeList) decoder.decodeNullableElement(new org.ccsds.moims.mo.mal.structures.NullableAttributeList()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/PacketValueList.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/PacketValueList.java new file mode 100644 index 00000000..271a8615 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/PacketValueList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mc.structures; + +/** + * List class for PacketValue. + */ +public final class PacketValueList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1125899957174182L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125899957174182L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for PacketValueList. + * + */ + public PacketValueList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public PacketValueList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public PacketValueList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mc.structures.PacketValue element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mc.structures.PacketValue element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new PacketValueList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mc.structures.PacketValue(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ParameterDefinition.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ParameterDefinition.java new file mode 100644 index 00000000..9521a1b1 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ParameterDefinition.java @@ -0,0 +1,256 @@ +package org.ccsds.moims.mo.mc.structures; + +/** + * The ParameterDefinition structure holds a parameter definition. + */ +public final class ParameterDefinition extends org.ccsds.moims.mo.mal.structures.MOObject { + + private static final long serialVersionUID = 1125899940397077L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125899940397077L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * The description field. + */ + private String description; + + /** + * The rawType field. + */ + private org.ccsds.moims.mo.mal.structures.AttributeType rawType; + + /** + * The rawUnit field. + */ + private String rawUnit; + + /** + * The convertedType field. + */ + private org.ccsds.moims.mo.mal.structures.AttributeType convertedType; + + /** + * The convertedUnit field. + */ + private String convertedUnit; + + /** + * Default constructor for ParameterDefinition. + * + */ + public ParameterDefinition() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param objectIdentity The identity of the MO Object. + * @param description The description field. + * @param rawType The rawType field. + * @param rawUnit The rawUnit field. + * @param convertedType The convertedType field. + * @param convertedUnit The convertedUnit field. + */ + public ParameterDefinition(org.ccsds.moims.mo.mal.structures.ObjectIdentity objectIdentity, + String description, + org.ccsds.moims.mo.mal.structures.AttributeType rawType, + String rawUnit, + org.ccsds.moims.mo.mal.structures.AttributeType convertedType, + String convertedUnit) { + super(objectIdentity); + this.description = description; + this.rawType = rawType; + this.rawUnit = rawUnit; + this.convertedType = convertedType; + this.convertedUnit = convertedUnit; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param objectIdentity The identity of the MO Object. + * @param description The description field. + * @param rawType The rawType field. + */ + public ParameterDefinition(org.ccsds.moims.mo.mal.structures.ObjectIdentity objectIdentity, + String description, + org.ccsds.moims.mo.mal.structures.AttributeType rawType) { + super(objectIdentity); + this.description = description; + this.rawType = rawType; + this.rawUnit = null; + this.convertedType = null; + this.convertedUnit = null; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mc.structures.ParameterDefinition(); + } + + /** + * Returns the field description. + * + * @return The field description + */ + public String getDescription() { + return description; + } + + /** + * Returns the field rawType. + * + * @return The field rawType + */ + public org.ccsds.moims.mo.mal.structures.AttributeType getRawType() { + return rawType; + } + + /** + * Returns the field rawUnit. + * + * @return The field rawUnit + */ + public String getRawUnit() { + return rawUnit; + } + + /** + * Returns the field convertedType. + * + * @return The field convertedType + */ + public org.ccsds.moims.mo.mal.structures.AttributeType getConvertedType() { + return convertedType; + } + + /** + * Returns the field convertedUnit. + * + * @return The field convertedUnit + */ + public String getConvertedUnit() { + return convertedUnit; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ParameterDefinition) { + if (! super.equals(obj)) { + return false; + } + ParameterDefinition other = (ParameterDefinition) obj; + if (description == null) { + if (other.description != null) { + return false; + } + } else { + if (! description.equals(other.description)) { + return false; + } + } + if (rawType == null) { + if (other.rawType != null) { + return false; + } + } else { + if (! rawType.equals(other.rawType)) { + return false; + } + } + if (rawUnit == null) { + if (other.rawUnit != null) { + return false; + } + } else { + if (! rawUnit.equals(other.rawUnit)) { + return false; + } + } + if (convertedType == null) { + if (other.convertedType != null) { + return false; + } + } else { + if (! convertedType.equals(other.convertedType)) { + return false; + } + } + if (convertedUnit == null) { + if (other.convertedUnit != null) { + return false; + } + } else { + if (! convertedUnit.equals(other.convertedUnit)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = super.hashCode(); + hash = 83 * hash + (description != null ? description.hashCode() : 0); + hash = 83 * hash + (rawType != null ? rawType.hashCode() : 0); + hash = 83 * hash + (rawUnit != null ? rawUnit.hashCode() : 0); + hash = 83 * hash + (convertedType != null ? convertedType.hashCode() : 0); + hash = 83 * hash + (convertedUnit != null ? convertedUnit.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(ParameterDefinition: "); + buf.append(super.toString()); + buf.append(", description=").append(description); + buf.append(", rawType=").append(rawType); + buf.append(", rawUnit=").append(rawUnit); + buf.append(", convertedType=").append(convertedType); + buf.append(", convertedUnit=").append(convertedUnit); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + super.encode(encoder); + if (description == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'description' cannot be null!"); + } + if (rawType == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'rawType' cannot be null!"); + } + encoder.encodeString(description); + encoder.encodeElement(rawType); + encoder.encodeNullableString(rawUnit); + encoder.encodeNullableElement(convertedType); + encoder.encodeNullableString(convertedUnit); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + super.decode(decoder); + description = decoder.decodeString(); + rawType = (org.ccsds.moims.mo.mal.structures.AttributeType) decoder.decodeElement(org.ccsds.moims.mo.mal.structures.AttributeType.BLOB); + rawUnit = decoder.decodeNullableString(); + convertedType = (org.ccsds.moims.mo.mal.structures.AttributeType) decoder.decodeNullableElement(org.ccsds.moims.mo.mal.structures.AttributeType.BLOB); + convertedUnit = decoder.decodeNullableString(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ParameterDefinitionList.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ParameterDefinitionList.java new file mode 100644 index 00000000..7975346b --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ParameterDefinitionList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mc.structures; + +/** + * List class for ParameterDefinition. + */ +public final class ParameterDefinitionList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1125899957174251L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125899957174251L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for ParameterDefinitionList. + * + */ + public ParameterDefinitionList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public ParameterDefinitionList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public ParameterDefinitionList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mc.structures.ParameterDefinition element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mc.structures.ParameterDefinition element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new ParameterDefinitionList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mc.structures.ParameterDefinition(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ParameterValue.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ParameterValue.java new file mode 100644 index 00000000..c1d16b58 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ParameterValue.java @@ -0,0 +1,220 @@ +package org.ccsds.moims.mo.mc.structures; + +/** + * The ParameterValue structure is a contextual object associated to the ParameterDefinition. + * It is uniquely identified by the timestamp field, relative to the ParameterDefinition + * object. It represents a specific time stamped value of the parameter. + */ +public final class ParameterValue implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1125899940397079L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125899940397079L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * The paramRef field. + */ + private org.ccsds.moims.mo.mal.structures.ObjectRef paramRef; + + /** + * The timestamp field. + */ + private org.ccsds.moims.mo.mal.structures.Time timestamp; + + /** + * The samplingTime field. + */ + private org.ccsds.moims.mo.mal.structures.Time samplingTime; + + /** + * The value field. + */ + private org.ccsds.moims.mo.mc.structures.ParameterValueData value; + + /** + * Default constructor for ParameterValue. + * + */ + public ParameterValue() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param paramRef The paramRef field. + * @param timestamp The timestamp field. + * @param samplingTime The samplingTime field. + * @param value The value field. + */ + public ParameterValue(org.ccsds.moims.mo.mal.structures.ObjectRef paramRef, + org.ccsds.moims.mo.mal.structures.Time timestamp, + org.ccsds.moims.mo.mal.structures.Time samplingTime, + org.ccsds.moims.mo.mc.structures.ParameterValueData value) { + this.paramRef = paramRef; + this.timestamp = timestamp; + this.samplingTime = samplingTime; + this.value = value; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param paramRef The paramRef field. + * @param timestamp The timestamp field. + * @param value The value field. + */ + public ParameterValue(org.ccsds.moims.mo.mal.structures.ObjectRef paramRef, + org.ccsds.moims.mo.mal.structures.Time timestamp, + org.ccsds.moims.mo.mc.structures.ParameterValueData value) { + this.paramRef = paramRef; + this.timestamp = timestamp; + this.samplingTime = null; + this.value = value; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mc.structures.ParameterValue(); + } + + /** + * Returns the field paramRef. + * + * @return The field paramRef + */ + public org.ccsds.moims.mo.mal.structures.ObjectRef getParamRef() { + return paramRef; + } + + /** + * Returns the field timestamp. + * + * @return The field timestamp + */ + public org.ccsds.moims.mo.mal.structures.Time getTimestamp() { + return timestamp; + } + + /** + * Returns the field samplingTime. + * + * @return The field samplingTime + */ + public org.ccsds.moims.mo.mal.structures.Time getSamplingTime() { + return samplingTime; + } + + /** + * Returns the field value. + * + * @return The field value + */ + public org.ccsds.moims.mo.mc.structures.ParameterValueData getValue() { + return value; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ParameterValue) { + ParameterValue other = (ParameterValue) obj; + if (paramRef == null) { + if (other.paramRef != null) { + return false; + } + } else { + if (! paramRef.equals(other.paramRef)) { + return false; + } + } + if (timestamp == null) { + if (other.timestamp != null) { + return false; + } + } else { + if (! timestamp.equals(other.timestamp)) { + return false; + } + } + if (samplingTime == null) { + if (other.samplingTime != null) { + return false; + } + } else { + if (! samplingTime.equals(other.samplingTime)) { + return false; + } + } + if (value == null) { + if (other.value != null) { + return false; + } + } else { + if (! value.equals(other.value)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (paramRef != null ? paramRef.hashCode() : 0); + hash = 83 * hash + (timestamp != null ? timestamp.hashCode() : 0); + hash = 83 * hash + (samplingTime != null ? samplingTime.hashCode() : 0); + hash = 83 * hash + (value != null ? value.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(ParameterValue: "); + buf.append("paramRef=").append(paramRef); + buf.append(", timestamp=").append(timestamp); + buf.append(", samplingTime=").append(samplingTime); + buf.append(", value=").append(value); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (paramRef == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'paramRef' cannot be null!"); + } + if (timestamp == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'timestamp' cannot be null!"); + } + if (value == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'value' cannot be null!"); + } + encoder.encodeElement(paramRef); + encoder.encodeTime(timestamp); + encoder.encodeNullableTime(samplingTime); + encoder.encodeElement(value); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + paramRef = (org.ccsds.moims.mo.mal.structures.ObjectRef) decoder.decodeElement(new org.ccsds.moims.mo.mal.structures.ObjectRef()); + timestamp = decoder.decodeTime(); + samplingTime = decoder.decodeNullableTime(); + value = (org.ccsds.moims.mo.mc.structures.ParameterValueData) decoder.decodeElement(new org.ccsds.moims.mo.mc.structures.ParameterValueData()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ParameterValueData.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ParameterValueData.java new file mode 100644 index 00000000..3fdc1a26 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ParameterValueData.java @@ -0,0 +1,178 @@ +package org.ccsds.moims.mo.mc.structures; + +/** + * The ParameterValueData structure shall be used to hold a specific value + * of the parameter. + */ +public final class ParameterValueData implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1125899940397078L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125899940397078L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * The validityState field. + */ + private org.ccsds.moims.mo.mc.structures.ValidityState validityState; + + /** + * The rawValue field. + */ + private org.ccsds.moims.mo.mal.structures.Attribute rawValue; + + /** + * The convertedValue field. + */ + private org.ccsds.moims.mo.mal.structures.Attribute convertedValue; + + /** + * Default constructor for ParameterValueData. + * + */ + public ParameterValueData() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param validityState The validityState field. + * @param rawValue The rawValue field. + * @param convertedValue The convertedValue field. + */ + public ParameterValueData(org.ccsds.moims.mo.mc.structures.ValidityState validityState, + org.ccsds.moims.mo.mal.structures.Attribute rawValue, + org.ccsds.moims.mo.mal.structures.Attribute convertedValue) { + this.validityState = validityState; + this.rawValue = rawValue; + this.convertedValue = convertedValue; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param validityState The validityState field. + */ + public ParameterValueData(org.ccsds.moims.mo.mc.structures.ValidityState validityState) { + this.validityState = validityState; + this.rawValue = null; + this.convertedValue = null; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mc.structures.ParameterValueData(); + } + + /** + * Returns the field validityState. + * + * @return The field validityState + */ + public org.ccsds.moims.mo.mc.structures.ValidityState getValidityState() { + return validityState; + } + + /** + * Returns the field rawValue. + * + * @return The field rawValue + */ + public org.ccsds.moims.mo.mal.structures.Attribute getRawValue() { + return rawValue; + } + + /** + * Returns the field convertedValue. + * + * @return The field convertedValue + */ + public org.ccsds.moims.mo.mal.structures.Attribute getConvertedValue() { + return convertedValue; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ParameterValueData) { + ParameterValueData other = (ParameterValueData) obj; + if (validityState == null) { + if (other.validityState != null) { + return false; + } + } else { + if (! validityState.equals(other.validityState)) { + return false; + } + } + if (rawValue == null) { + if (other.rawValue != null) { + return false; + } + } else { + if (! rawValue.equals(other.rawValue)) { + return false; + } + } + if (convertedValue == null) { + if (other.convertedValue != null) { + return false; + } + } else { + if (! convertedValue.equals(other.convertedValue)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (validityState != null ? validityState.hashCode() : 0); + hash = 83 * hash + (rawValue != null ? rawValue.hashCode() : 0); + hash = 83 * hash + (convertedValue != null ? convertedValue.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(ParameterValueData: "); + buf.append("validityState=").append(validityState); + buf.append(", rawValue=").append(rawValue); + buf.append(", convertedValue=").append(convertedValue); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (validityState == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'validityState' cannot be null!"); + } + encoder.encodeElement(validityState); + encoder.encodeNullableAttribute(rawValue); + encoder.encodeNullableAttribute(convertedValue); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + validityState = (org.ccsds.moims.mo.mc.structures.ValidityState) decoder.decodeElement(org.ccsds.moims.mo.mc.structures.ValidityState.VALID); + rawValue = (org.ccsds.moims.mo.mal.structures.Attribute) decoder.decodeNullableAttribute(); + convertedValue = (org.ccsds.moims.mo.mal.structures.Attribute) decoder.decodeNullableAttribute(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ParameterValueDataList.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ParameterValueDataList.java new file mode 100644 index 00000000..24684311 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ParameterValueDataList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mc.structures; + +/** + * List class for ParameterValueData. + */ +public final class ParameterValueDataList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1125899957174250L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125899957174250L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for ParameterValueDataList. + * + */ + public ParameterValueDataList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public ParameterValueDataList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public ParameterValueDataList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mc.structures.ParameterValueData element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mc.structures.ParameterValueData element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new ParameterValueDataList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mc.structures.ParameterValueData(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ParameterValueList.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ParameterValueList.java new file mode 100644 index 00000000..eb515fe3 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ParameterValueList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mc.structures; + +/** + * List class for ParameterValue. + */ +public final class ParameterValueList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1125899957174249L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125899957174249L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for ParameterValueList. + * + */ + public ParameterValueList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public ParameterValueList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public ParameterValueList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mc.structures.ParameterValue element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mc.structures.ParameterValue element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new ParameterValueList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mc.structures.ParameterValue(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ReportConfiguration.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ReportConfiguration.java new file mode 100644 index 00000000..998c3635 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ReportConfiguration.java @@ -0,0 +1,140 @@ +package org.ccsds.moims.mo.mc.structures; + +/** + * The ReportConfiguration structure is used to retrieve the configuration + * of the report generation of a parameter. + */ +public final class ReportConfiguration implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1125899940397080L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125899940397080L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * The generationEnabled field. + */ + private Boolean generationEnabled; + + /** + * The reportInterval field. + */ + private org.ccsds.moims.mo.mal.structures.Duration reportInterval; + + /** + * Default constructor for ReportConfiguration. + * + */ + public ReportConfiguration() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param generationEnabled The generationEnabled field. + * @param reportInterval The reportInterval field. + */ + public ReportConfiguration(Boolean generationEnabled, + org.ccsds.moims.mo.mal.structures.Duration reportInterval) { + this.generationEnabled = generationEnabled; + this.reportInterval = reportInterval; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mc.structures.ReportConfiguration(); + } + + /** + * Returns the field generationEnabled. + * + * @return The field generationEnabled + */ + public Boolean getGenerationEnabled() { + return generationEnabled; + } + + /** + * Returns the field reportInterval. + * + * @return The field reportInterval + */ + public org.ccsds.moims.mo.mal.structures.Duration getReportInterval() { + return reportInterval; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ReportConfiguration) { + ReportConfiguration other = (ReportConfiguration) obj; + if (generationEnabled == null) { + if (other.generationEnabled != null) { + return false; + } + } else { + if (! generationEnabled.equals(other.generationEnabled)) { + return false; + } + } + if (reportInterval == null) { + if (other.reportInterval != null) { + return false; + } + } else { + if (! reportInterval.equals(other.reportInterval)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (generationEnabled != null ? generationEnabled.hashCode() : 0); + hash = 83 * hash + (reportInterval != null ? reportInterval.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(ReportConfiguration: "); + buf.append("generationEnabled=").append(generationEnabled); + buf.append(", reportInterval=").append(reportInterval); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (generationEnabled == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'generationEnabled' cannot be null!"); + } + if (reportInterval == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'reportInterval' cannot be null!"); + } + encoder.encodeBoolean(generationEnabled); + encoder.encodeDuration(reportInterval); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + generationEnabled = decoder.decodeBoolean(); + reportInterval = decoder.decodeDuration(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ReportConfigurationList.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ReportConfigurationList.java new file mode 100644 index 00000000..fd972783 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ReportConfigurationList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mc.structures; + +/** + * List class for ReportConfiguration. + */ +public final class ReportConfigurationList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1125899957174248L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125899957174248L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for ReportConfigurationList. + * + */ + public ReportConfigurationList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public ReportConfigurationList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public ReportConfigurationList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mc.structures.ReportConfiguration element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mc.structures.ReportConfiguration element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new ReportConfigurationList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mc.structures.ReportConfiguration(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/Severity.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/Severity.java new file mode 100644 index 00000000..4d4ae27a --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/Severity.java @@ -0,0 +1,166 @@ +package org.ccsds.moims.mo.mc.structures; + +/** + * Enumeration class for Severity. + */ +public final class Severity extends org.ccsds.moims.mo.mal.structures.Enumeration { + + private static final long serialVersionUID = 1125899940397062L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125899940397062L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Enumeration value for INFORMATIONAL. + */ + public static final int INFORMATIONAL_VALUE = 1; + + /** + * Enumeration singleton for value INFORMATIONAL. + */ + public static final org.ccsds.moims.mo.mc.structures.Severity INFORMATIONAL = new org.ccsds.moims.mo.mc.structures.Severity(org.ccsds.moims.mo.mc.structures.Severity.INFORMATIONAL_VALUE); + + /** + * Enumeration value for WARNING. + */ + public static final int WARNING_VALUE = 2; + + /** + * Enumeration singleton for value WARNING. + */ + public static final org.ccsds.moims.mo.mc.structures.Severity WARNING = new org.ccsds.moims.mo.mc.structures.Severity(org.ccsds.moims.mo.mc.structures.Severity.WARNING_VALUE); + + /** + * Enumeration value for ALARM. + */ + public static final int ALARM_VALUE = 3; + + /** + * Enumeration singleton for value ALARM. + */ + public static final org.ccsds.moims.mo.mc.structures.Severity ALARM = new org.ccsds.moims.mo.mc.structures.Severity(org.ccsds.moims.mo.mc.structures.Severity.ALARM_VALUE); + + /** + * Enumeration value for SEVERE. + */ + public static final int SEVERE_VALUE = 4; + + /** + * Enumeration singleton for value SEVERE. + */ + public static final org.ccsds.moims.mo.mc.structures.Severity SEVERE = new org.ccsds.moims.mo.mc.structures.Severity(org.ccsds.moims.mo.mc.structures.Severity.SEVERE_VALUE); + + /** + * Enumeration value for CRITICAL. + */ + public static final int CRITICAL_VALUE = 5; + + /** + * Enumeration singleton for value CRITICAL. + */ + public static final org.ccsds.moims.mo.mc.structures.Severity CRITICAL = new org.ccsds.moims.mo.mc.structures.Severity(org.ccsds.moims.mo.mc.structures.Severity.CRITICAL_VALUE); + + /** + * Set of enumeration instances. + */ + private static final org.ccsds.moims.mo.mc.structures.Severity[] _ENUMERATIONS = { + INFORMATIONAL, WARNING, ALARM, SEVERE, CRITICAL}; + + /** + * The severity enumeration shall be used to hold the possible values for a severity. + */ + public Severity() { + super(-1); + } + + /** + * The severity enumeration shall be used to hold the possible values for + * a severity. + * + * @param value The value of the Enumeration. + */ + public Severity(int value) { + super(value); + } + + @Override + public String toString() { + switch (getValue()) { + case INFORMATIONAL_VALUE: + return "INFORMATIONAL"; + case WARNING_VALUE: + return "WARNING"; + case ALARM_VALUE: + return "ALARM"; + case SEVERE_VALUE: + return "SEVERE"; + case CRITICAL_VALUE: + return "CRITICAL"; + default: + throw new RuntimeException("Unknown ordinal!"); + } + } + + /** + * Returns the enumeration element represented by the supplied string, or + * null if not matched. + * + * @param s s The string to search for. + * @return The matched enumeration element, or null if not matched. + */ + public static org.ccsds.moims.mo.mc.structures.Severity fromString(String s) { + switch (s) { + case "INFORMATIONAL": + return Severity.INFORMATIONAL; + case "WARNING": + return Severity.WARNING; + case "ALARM": + return Severity.ALARM; + case "SEVERE": + return Severity.SEVERE; + case "CRITICAL": + return Severity.CRITICAL; + default: + throw new RuntimeException("Unknown Enumeration for the provided string: " + s); + } + } + + @Override + public org.ccsds.moims.mo.mal.structures.Enumeration fromValue(Integer value) { + switch (value) { + case INFORMATIONAL_VALUE: + return Severity.INFORMATIONAL; + case WARNING_VALUE: + return Severity.WARNING; + case ALARM_VALUE: + return Severity.ALARM; + case SEVERE_VALUE: + return Severity.SEVERE; + case CRITICAL_VALUE: + return Severity.CRITICAL; + default: + throw new RuntimeException("Unknown Enumeration for the provided value: " + value); + } + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return _ENUMERATIONS[0]; + } + + @Override + public int getEnumSize() { + return 5; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/SeverityList.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/SeverityList.java new file mode 100644 index 00000000..28134f47 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/SeverityList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mc.structures; + +/** + * List class for Severity. + */ +public final class SeverityList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1125899957174266L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125899957174266L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for SeverityList. + * + */ + public SeverityList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public SeverityList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public SeverityList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mc.structures.Severity element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mc.structures.Severity element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new SeverityList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return org.ccsds.moims.mo.mc.structures.Severity.INFORMATIONAL; + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ValidityState.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ValidityState.java new file mode 100644 index 00000000..bae69228 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ValidityState.java @@ -0,0 +1,182 @@ +package org.ccsds.moims.mo.mc.structures; + +/** + * Enumeration class for ValidityState. + */ +public final class ValidityState extends org.ccsds.moims.mo.mal.structures.Enumeration { + + private static final long serialVersionUID = 1125899940397076L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125899940397076L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Enumeration value for VALID. + */ + public static final int VALID_VALUE = 0; + + /** + * Enumeration singleton for value VALID. + */ + public static final org.ccsds.moims.mo.mc.structures.ValidityState VALID = new org.ccsds.moims.mo.mc.structures.ValidityState(org.ccsds.moims.mo.mc.structures.ValidityState.VALID_VALUE); + + /** + * Enumeration value for EXPIRED. + */ + public static final int EXPIRED_VALUE = 1; + + /** + * Enumeration singleton for value EXPIRED. + */ + public static final org.ccsds.moims.mo.mc.structures.ValidityState EXPIRED = new org.ccsds.moims.mo.mc.structures.ValidityState(org.ccsds.moims.mo.mc.structures.ValidityState.EXPIRED_VALUE); + + /** + * Enumeration value for INVALID_RAW. + */ + public static final int INVALID_RAW_VALUE = 2; + + /** + * Enumeration singleton for value INVALID_RAW. + */ + public static final org.ccsds.moims.mo.mc.structures.ValidityState INVALID_RAW = new org.ccsds.moims.mo.mc.structures.ValidityState(org.ccsds.moims.mo.mc.structures.ValidityState.INVALID_RAW_VALUE); + + /** + * Enumeration value for INVALID_CONVERSION. + */ + public static final int INVALID_CONVERSION_VALUE = 3; + + /** + * Enumeration singleton for value INVALID_CONVERSION. + */ + public static final org.ccsds.moims.mo.mc.structures.ValidityState INVALID_CONVERSION = new org.ccsds.moims.mo.mc.structures.ValidityState(org.ccsds.moims.mo.mc.structures.ValidityState.INVALID_CONVERSION_VALUE); + + /** + * Enumeration value for UNVERIFIED. + */ + public static final int UNVERIFIED_VALUE = 4; + + /** + * Enumeration singleton for value UNVERIFIED. + */ + public static final org.ccsds.moims.mo.mc.structures.ValidityState UNVERIFIED = new org.ccsds.moims.mo.mc.structures.ValidityState(org.ccsds.moims.mo.mc.structures.ValidityState.UNVERIFIED_VALUE); + + /** + * Enumeration value for INVALID. + */ + public static final int INVALID_VALUE = 5; + + /** + * Enumeration singleton for value INVALID. + */ + public static final org.ccsds.moims.mo.mc.structures.ValidityState INVALID = new org.ccsds.moims.mo.mc.structures.ValidityState(org.ccsds.moims.mo.mc.structures.ValidityState.INVALID_VALUE); + + /** + * Set of enumeration instances. + */ + private static final org.ccsds.moims.mo.mc.structures.ValidityState[] _ENUMERATIONS = { + VALID, EXPIRED, INVALID_RAW, INVALID_CONVERSION, UNVERIFIED, INVALID}; + + /** + * The ValidityState enumeration shall be used to hold the validity states and their numeric values. + */ + public ValidityState() { + super(-1); + } + + /** + * The ValidityState enumeration shall be used to hold the validity states + * and their numeric values. + * + * @param value The value of the Enumeration. + */ + public ValidityState(int value) { + super(value); + } + + @Override + public String toString() { + switch (getValue()) { + case VALID_VALUE: + return "VALID"; + case EXPIRED_VALUE: + return "EXPIRED"; + case INVALID_RAW_VALUE: + return "INVALID_RAW"; + case INVALID_CONVERSION_VALUE: + return "INVALID_CONVERSION"; + case UNVERIFIED_VALUE: + return "UNVERIFIED"; + case INVALID_VALUE: + return "INVALID"; + default: + throw new RuntimeException("Unknown ordinal!"); + } + } + + /** + * Returns the enumeration element represented by the supplied string, or + * null if not matched. + * + * @param s s The string to search for. + * @return The matched enumeration element, or null if not matched. + */ + public static org.ccsds.moims.mo.mc.structures.ValidityState fromString(String s) { + switch (s) { + case "VALID": + return ValidityState.VALID; + case "EXPIRED": + return ValidityState.EXPIRED; + case "INVALID_RAW": + return ValidityState.INVALID_RAW; + case "INVALID_CONVERSION": + return ValidityState.INVALID_CONVERSION; + case "UNVERIFIED": + return ValidityState.UNVERIFIED; + case "INVALID": + return ValidityState.INVALID; + default: + throw new RuntimeException("Unknown Enumeration for the provided string: " + s); + } + } + + @Override + public org.ccsds.moims.mo.mal.structures.Enumeration fromValue(Integer value) { + switch (value) { + case VALID_VALUE: + return ValidityState.VALID; + case EXPIRED_VALUE: + return ValidityState.EXPIRED; + case INVALID_RAW_VALUE: + return ValidityState.INVALID_RAW; + case INVALID_CONVERSION_VALUE: + return ValidityState.INVALID_CONVERSION; + case UNVERIFIED_VALUE: + return ValidityState.UNVERIFIED; + case INVALID_VALUE: + return ValidityState.INVALID; + default: + throw new RuntimeException("Unknown Enumeration for the provided value: " + value); + } + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return _ENUMERATIONS[0]; + } + + @Override + public int getEnumSize() { + return 6; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ValidityStateList.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ValidityStateList.java new file mode 100644 index 00000000..29c54636 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/ValidityStateList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mc.structures; + +/** + * List class for ValidityState. + */ +public final class ValidityStateList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1125899957174252L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1125899957174252L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for ValidityStateList. + * + */ + public ValidityStateList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public ValidityStateList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public ValidityStateList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mc.structures.ValidityState element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mc.structures.ValidityState element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new ValidityStateList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return org.ccsds.moims.mo.mc.structures.ValidityState.VALID; + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/package-info.java new file mode 100644 index 00000000..fc368c8b --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area004-v002-mc/org/ccsds/moims/mo/mc/structures/package-info.java @@ -0,0 +1,4 @@ +/** + * Package containing types defined in the MC area. +*/ +package org.ccsds.moims.mo.mc.structures; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/ActivateFailedException.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/ActivateFailedException.java new file mode 100644 index 00000000..4b7514fd --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/ActivateFailedException.java @@ -0,0 +1,29 @@ +package org.ccsds.moims.mo.mps; + +/** + * The ActivateFailedException exception. The activatePlan operation failed + * as the activation was outside the validity period of the Plan, or the start + * of the planPeriod had already passed. . + */ +public final class ActivateFailedException extends org.ccsds.moims.mo.mal.MOErrorException { + + private static final String MO_ERROR_NAME = "ACTIVATE_FAILED"; + + /** + * Constructs a new ActivateFailedException exception. + * + */ + public ActivateFailedException() { + super(MO_ERROR_NAME, MPSHelper.ACTIVATE_FAILED_ERROR_NUMBER, ""); + } + + /** + * Constructs a new ActivateFailedException exception. + * + * @param extraInformation The extraInformation of the exception. + */ + public ActivateFailedException(Object extraInformation) { + super(MO_ERROR_NAME, MPSHelper.ACTIVATE_FAILED_ERROR_NUMBER, extraInformation); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/ActivateSubplanFailedException.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/ActivateSubplanFailedException.java new file mode 100644 index 00000000..feae470c --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/ActivateSubplanFailedException.java @@ -0,0 +1,28 @@ +package org.ccsds.moims.mo.mps; + +/** + * The ActivateSubplanFailedException exception. The activateSubPlan operation + * failed. + */ +public final class ActivateSubplanFailedException extends org.ccsds.moims.mo.mal.MOErrorException { + + private static final String MO_ERROR_NAME = "ACTIVATE_SUBPLAN_FAILED"; + + /** + * Constructs a new ActivateSubplanFailedException exception. + * + */ + public ActivateSubplanFailedException() { + super(MO_ERROR_NAME, MPSHelper.ACTIVATE_SUBPLAN_FAILED_ERROR_NUMBER, ""); + } + + /** + * Constructs a new ActivateSubplanFailedException exception. + * + * @param extraInformation The extraInformation of the exception. + */ + public ActivateSubplanFailedException(Object extraInformation) { + super(MO_ERROR_NAME, MPSHelper.ACTIVATE_SUBPLAN_FAILED_ERROR_NUMBER, extraInformation); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/CancelFailedException.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/CancelFailedException.java new file mode 100644 index 00000000..9b73d757 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/CancelFailedException.java @@ -0,0 +1,28 @@ +package org.ccsds.moims.mo.mps; + +/** + * The CancelFailedException exception. The cancelRequest operation failed + * to cancel the referenced RequestInstance. + */ +public final class CancelFailedException extends org.ccsds.moims.mo.mal.MOErrorException { + + private static final String MO_ERROR_NAME = "CANCEL_FAILED"; + + /** + * Constructs a new CancelFailedException exception. + * + */ + public CancelFailedException() { + super(MO_ERROR_NAME, MPSHelper.CANCEL_FAILED_ERROR_NUMBER, ""); + } + + /** + * Constructs a new CancelFailedException exception. + * + * @param extraInformation The extraInformation of the exception. + */ + public CancelFailedException(Object extraInformation) { + super(MO_ERROR_NAME, MPSHelper.CANCEL_FAILED_ERROR_NUMBER, extraInformation); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/DeactivateFailedException.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/DeactivateFailedException.java new file mode 100644 index 00000000..91299fad --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/DeactivateFailedException.java @@ -0,0 +1,27 @@ +package org.ccsds.moims.mo.mps; + +/** + * The DeactivateFailedException exception. The deactivatePlan operation failed. + */ +public final class DeactivateFailedException extends org.ccsds.moims.mo.mal.MOErrorException { + + private static final String MO_ERROR_NAME = "DEACTIVATE_FAILED"; + + /** + * Constructs a new DeactivateFailedException exception. + * + */ + public DeactivateFailedException() { + super(MO_ERROR_NAME, MPSHelper.DEACTIVATE_FAILED_ERROR_NUMBER, ""); + } + + /** + * Constructs a new DeactivateFailedException exception. + * + * @param extraInformation The extraInformation of the exception. + */ + public DeactivateFailedException(Object extraInformation) { + super(MO_ERROR_NAME, MPSHelper.DEACTIVATE_FAILED_ERROR_NUMBER, extraInformation); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/DeactivateSubplanFailedException.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/DeactivateSubplanFailedException.java new file mode 100644 index 00000000..97b6fd8e --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/DeactivateSubplanFailedException.java @@ -0,0 +1,28 @@ +package org.ccsds.moims.mo.mps; + +/** + * The DeactivateSubplanFailedException exception. The deactivateSubPlan operation + * failed. + */ +public final class DeactivateSubplanFailedException extends org.ccsds.moims.mo.mal.MOErrorException { + + private static final String MO_ERROR_NAME = "DEACTIVATE_SUBPLAN_FAILED"; + + /** + * Constructs a new DeactivateSubplanFailedException exception. + * + */ + public DeactivateSubplanFailedException() { + super(MO_ERROR_NAME, MPSHelper.DEACTIVATE_SUBPLAN_FAILED_ERROR_NUMBER, ""); + } + + /** + * Constructs a new DeactivateSubplanFailedException exception. + * + * @param extraInformation The extraInformation of the exception. + */ + public DeactivateSubplanFailedException(Object extraInformation) { + super(MO_ERROR_NAME, MPSHelper.DEACTIVATE_SUBPLAN_FAILED_ERROR_NUMBER, extraInformation); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/DeleteFailedException.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/DeleteFailedException.java new file mode 100644 index 00000000..735baba3 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/DeleteFailedException.java @@ -0,0 +1,28 @@ +package org.ccsds.moims.mo.mps; + +/** + * The DeleteFailedException exception. The deleteActivity or deleteEvent + * operation failed to delete the requested object. + */ +public final class DeleteFailedException extends org.ccsds.moims.mo.mal.MOErrorException { + + private static final String MO_ERROR_NAME = "DELETE_FAILED"; + + /** + * Constructs a new DeleteFailedException exception. + * + */ + public DeleteFailedException() { + super(MO_ERROR_NAME, MPSHelper.DELETE_FAILED_ERROR_NUMBER, ""); + } + + /** + * Constructs a new DeleteFailedException exception. + * + * @param extraInformation The extraInformation of the exception. + */ + public DeleteFailedException(Object extraInformation) { + super(MO_ERROR_NAME, MPSHelper.DELETE_FAILED_ERROR_NUMBER, extraInformation); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/InsertFailedException.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/InsertFailedException.java new file mode 100644 index 00000000..03d1b2fc --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/InsertFailedException.java @@ -0,0 +1,28 @@ +package org.ccsds.moims.mo.mps; + +/** + * The InsertFailedException exception. The insertActivity or insertEvent + * operation failed to insert the requested object. + */ +public final class InsertFailedException extends org.ccsds.moims.mo.mal.MOErrorException { + + private static final String MO_ERROR_NAME = "INSERT_FAILED"; + + /** + * Constructs a new InsertFailedException exception. + * + */ + public InsertFailedException() { + super(MO_ERROR_NAME, MPSHelper.INSERT_FAILED_ERROR_NUMBER, ""); + } + + /** + * Constructs a new InsertFailedException exception. + * + * @param extraInformation The extraInformation of the exception. + */ + public InsertFailedException(Object extraInformation) { + super(MO_ERROR_NAME, MPSHelper.INSERT_FAILED_ERROR_NUMBER, extraInformation); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/InvalidException.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/InvalidException.java new file mode 100644 index 00000000..9f4561bc --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/InvalidException.java @@ -0,0 +1,28 @@ +package org.ccsds.moims.mo.mps; + +/** + * The InvalidException exception. One or more fields in the message contain + * invalid values. + */ +public final class InvalidException extends org.ccsds.moims.mo.mal.MOErrorException { + + private static final String MO_ERROR_NAME = "INVALID"; + + /** + * Constructs a new InvalidException exception. + * + */ + public InvalidException() { + super(MO_ERROR_NAME, MPSHelper.INVALID_ERROR_NUMBER, ""); + } + + /** + * Constructs a new InvalidException exception. + * + * @param extraInformation The extraInformation of the exception. + */ + public InvalidException(Object extraInformation) { + super(MO_ERROR_NAME, MPSHelper.INVALID_ERROR_NUMBER, extraInformation); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/MPSElementFactory.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/MPSElementFactory.java new file mode 100644 index 00000000..081e3d0b --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/MPSElementFactory.java @@ -0,0 +1,277 @@ +package org.ccsds.moims.mo.mps; + +/** + * Creates the Elements of the MPS area, without holding an instance of each + * of them, so that the class of a type is only loaded once a message carries + * that type. + */ +public final class MPSElementFactory implements org.ccsds.moims.mo.mal.AreaElementFactory { + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement(int serviceNumber, + int typeNumber) { + if (serviceNumber != 0) { + return null; // This Area declares no types under a service + } + switch (typeNumber) { + case -517: return new org.ccsds.moims.mo.mps.structures.PartialPlanFilterList(); + case -516: return new org.ccsds.moims.mo.mps.structures.PlanFilterList(); + case -515: return new org.ccsds.moims.mo.mps.structures.PartialPlanList(); + case -514: return new org.ccsds.moims.mo.mps.structures.PlanQueryList(); + case -513: return new org.ccsds.moims.mo.mps.structures.SubPlanActivationStatusList(); + case -512: return new org.ccsds.moims.mo.mps.structures.SubPlanStatusEnumList(); + case -511: return new org.ccsds.moims.mo.mps.structures.SubPlanUpdateList(); + case -510: return new org.ccsds.moims.mo.mps.structures.PlanActivationStatusList(); + case -509: return new org.ccsds.moims.mo.mps.structures.PlanSummaryStatusList(); + case -508: return new org.ccsds.moims.mo.mps.structures.PlanUpdateList(); + case -507: return new org.ccsds.moims.mo.mps.structures.RevisionStatusEnumList(); + case -506: return new org.ccsds.moims.mo.mps.structures.ItemRevisionList(); + case -505: return new org.ccsds.moims.mo.mps.structures.PlanRevisionList(); + case -504: return new org.ccsds.moims.mo.mps.structures.PlannedItemsList(); + case -503: return new org.ccsds.moims.mo.mps.structures.PlanInformationList(); + case -502: return new org.ccsds.moims.mo.mps.structures.PlanStatusEnumList(); + case -501: return new org.ccsds.moims.mo.mps.structures.PlanList(); + case -408: return new org.ccsds.moims.mo.mps.structures.RequestFilterList(); + case -407: return new org.ccsds.moims.mo.mps.structures.RequestSummaryStatusList(); + case -406: return new org.ccsds.moims.mo.mps.structures.PlanningRequestResponseList(); + case -405: return new org.ccsds.moims.mo.mps.structures.PlanningRequestDetailsList(); + case -404: return new org.ccsds.moims.mo.mps.structures.RequestStatusUpdateList(); + case -403: return new org.ccsds.moims.mo.mps.structures.RequestStatusEnumList(); + case -402: return new org.ccsds.moims.mo.mps.structures.RequestInstanceList(); + case -401: return new org.ccsds.moims.mo.mps.structures.RequestDefinitionList(); + case -310: return new org.ccsds.moims.mo.mps.structures.ResourceUpdateList(); + case -309: return new org.ccsds.moims.mo.mps.structures.RelativeProfileEntryList(); + case -308: return new org.ccsds.moims.mo.mps.structures.RelativeProfileSegmentList(); + case -307: return new org.ccsds.moims.mo.mps.structures.RelativeResourceProfileList(); + case -306: return new org.ccsds.moims.mo.mps.structures.ProfileEntryList(); + case -305: return new org.ccsds.moims.mo.mps.structures.InterpolationTypeEnumList(); + case -304: return new org.ccsds.moims.mo.mps.structures.ProfileSegmentList(); + case -303: return new org.ccsds.moims.mo.mps.structures.ResourceProfileList(); + case -302: return new org.ccsds.moims.mo.mps.structures.NumericResourceList(); + case -301: return new org.ccsds.moims.mo.mps.structures.ResourceList(); + case -206: return new org.ccsds.moims.mo.mps.structures.InsertedEventDetailsList(); + case -205: return new org.ccsds.moims.mo.mps.structures.EventUpdateList(); + case -204: return new org.ccsds.moims.mo.mps.structures.PredictabilityEnumList(); + case -203: return new org.ccsds.moims.mo.mps.structures.EventStatusEnumList(); + case -202: return new org.ccsds.moims.mo.mps.structures.EventInstanceList(); + case -201: return new org.ccsds.moims.mo.mps.structures.EventDefinitionList(); + case -108: return new org.ccsds.moims.mo.mps.structures.ActivitySuspensionStatusList(); + case -107: return new org.ccsds.moims.mo.mps.structures.InsertedActivityDetailsList(); + case -106: return new org.ccsds.moims.mo.mps.structures.ActivityUpdateList(); + case -105: return new org.ccsds.moims.mo.mps.structures.SimpleActivityDetailsList(); + case -104: return new org.ccsds.moims.mo.mps.structures.ActivityNodeList(); + case -103: return new org.ccsds.moims.mo.mps.structures.ActivityStatusEnumList(); + case -102: return new org.ccsds.moims.mo.mps.structures.ActivityInstanceList(); + case -101: return new org.ccsds.moims.mo.mps.structures.ActivityDefinitionList(); + case -64: return new org.ccsds.moims.mo.mps.structures.SecondaryErrorCodeEnumList(); + case -63: return new org.ccsds.moims.mo.mps.structures.EventRepetitionList(); + case -62: return new org.ccsds.moims.mo.mps.structures.AngleRepetitionList(); + case -61: return new org.ccsds.moims.mo.mps.structures.TemporalRepetitionList(); + case -60: return new org.ccsds.moims.mo.mps.structures.RevolutionRepetitionList(); + case -59: return new org.ccsds.moims.mo.mps.structures.DirectionRepetitionList(); + case -58: return new org.ccsds.moims.mo.mps.structures.OrbitRepetitionList(); + case -57: return new org.ccsds.moims.mo.mps.structures.PositionRepetitionList(); + case -56: return new org.ccsds.moims.mo.mps.structures.SeparationTypeEnumList(); + case -55: return new org.ccsds.moims.mo.mps.structures.EventTriggerList(); + case -54: return new org.ccsds.moims.mo.mps.structures.AngleTriggerList(); + case -53: return new org.ccsds.moims.mo.mps.structures.DirectionTriggerList(); + case -52: return new org.ccsds.moims.mo.mps.structures.PositionTriggerList(); + case -51: return new org.ccsds.moims.mo.mps.structures.TimeTriggerList(); + case -50: return new org.ccsds.moims.mo.mps.structures.ComplexEffectList(); + case -49: return new org.ccsds.moims.mo.mps.structures.EffectOperationEnumList(); + case -48: return new org.ccsds.moims.mo.mps.structures.SimpleEffectList(); + case -47: return new org.ccsds.moims.mo.mps.structures.FunctionConstraintList(); + case -46: return new org.ccsds.moims.mo.mps.structures.SeparationConstraintList(); + case -45: return new org.ccsds.moims.mo.mps.structures.SequentialConstraintList(); + case -44: return new org.ccsds.moims.mo.mps.structures.AngleConstraintList(); + case -43: return new org.ccsds.moims.mo.mps.structures.DistanceConstraintList(); + case -42: return new org.ccsds.moims.mo.mps.structures.RevolutionConstraintList(); + case -41: return new org.ccsds.moims.mo.mps.structures.PointingConstraintList(); + case -40: return new org.ccsds.moims.mo.mps.structures.EllipsoidalPositionConstraintList(); + case -39: return new org.ccsds.moims.mo.mps.structures.PositionConstraintList(); + case -38: return new org.ccsds.moims.mo.mps.structures.ComplexResourceConstraintList(); + case -37: return new org.ccsds.moims.mo.mps.structures.SimpleResourceConstraintList(); + case -36: return new org.ccsds.moims.mo.mps.structures.ExpressionOperatorEnumList(); + case -35: return new org.ccsds.moims.mo.mps.structures.ArgumentConstraintList(); + case -34: return new org.ccsds.moims.mo.mps.structures.DurationConstraintList(); + case -33: return new org.ccsds.moims.mo.mps.structures.TimeWindowConstraintList(); + case -32: return new org.ccsds.moims.mo.mps.structures.TimeConstraintList(); + case -31: return new org.ccsds.moims.mo.mps.structures.ConstraintExpressionList(); + case -30: return new org.ccsds.moims.mo.mps.structures.LogicOpEnumList(); + case -29: return new org.ccsds.moims.mo.mps.structures.ConstraintNodeList(); + case -28: return new org.ccsds.moims.mo.mps.structures.StatusValuesList(); + case -27: return new org.ccsds.moims.mo.mps.structures.StringPatternList(); + case -26: return new org.ccsds.moims.mo.mps.structures.NumericRangeList(); + case -25: return new org.ccsds.moims.mo.mps.structures.ArgSpecList(); + case -24: return new org.ccsds.moims.mo.mps.structures.ArgumentList(); + case -23: return new org.ccsds.moims.mo.mps.structures.ArgDefList(); + case -22: return new org.ccsds.moims.mo.mps.structures.ExternalExpressionList(); + case -21: return new org.ccsds.moims.mo.mps.structures.DistanceList(); + case -20: return new org.ccsds.moims.mo.mps.structures.AngularVelocityList(); + case -19: return new org.ccsds.moims.mo.mps.structures.AngleList(); + case -18: return new org.ccsds.moims.mo.mps.structures.DirectionReferenceList(); + case -17: return new org.ccsds.moims.mo.mps.structures.NamedTargetDirectionList(); + case -16: return new org.ccsds.moims.mo.mps.structures.RADecDirectionList(); + case -15: return new org.ccsds.moims.mo.mps.structures.SphericalDirectionList(); + case -14: return new org.ccsds.moims.mo.mps.structures.CartesianDirectionList(); + case -13: return new org.ccsds.moims.mo.mps.structures.PositionReferenceList(); + case -12: return new org.ccsds.moims.mo.mps.structures.ObjectPositionList(); + case -11: return new org.ccsds.moims.mo.mps.structures.OrbitalPositionList(); + case -10: return new org.ccsds.moims.mo.mps.structures.OrbitFilePositionList(); + case -9: return new org.ccsds.moims.mo.mps.structures.SurfacePositionList(); + case -8: return new org.ccsds.moims.mo.mps.structures.CartesianPositionList(); + case -7: return new org.ccsds.moims.mo.mps.structures.DefListEntryList(); + case -6: return new org.ccsds.moims.mo.mps.structures.EventWindowList(); + case -5: return new org.ccsds.moims.mo.mps.structures.TimeWindowList(); + case -4: return new org.ccsds.moims.mo.mps.structures.StateDefList(); + case -3: return new org.ccsds.moims.mo.mps.structures.SliderList(); + case -2: return new org.ccsds.moims.mo.mps.structures.NamedElementList(); + case -1: return new org.ccsds.moims.mo.mps.structures.ArgTypeEnumList(); + case 1: return new org.ccsds.moims.mo.mps.structures.ArgTypeEnum(); + case 2: return new org.ccsds.moims.mo.mps.structures.NamedElement(); + case 3: return new org.ccsds.moims.mo.mps.structures.Slider(); + case 4: return new org.ccsds.moims.mo.mps.structures.StateDef(); + case 5: return new org.ccsds.moims.mo.mps.structures.TimeWindow(); + case 6: return new org.ccsds.moims.mo.mps.structures.EventWindow(); + case 7: return new org.ccsds.moims.mo.mps.structures.DefListEntry(); + case 8: return new org.ccsds.moims.mo.mps.structures.CartesianPosition(); + case 9: return new org.ccsds.moims.mo.mps.structures.SurfacePosition(); + case 10: return new org.ccsds.moims.mo.mps.structures.OrbitFilePosition(); + case 11: return new org.ccsds.moims.mo.mps.structures.OrbitalPosition(); + case 12: return new org.ccsds.moims.mo.mps.structures.ObjectPosition(); + case 13: return new org.ccsds.moims.mo.mps.structures.PositionReference(); + case 14: return new org.ccsds.moims.mo.mps.structures.CartesianDirection(); + case 15: return new org.ccsds.moims.mo.mps.structures.SphericalDirection(); + case 16: return new org.ccsds.moims.mo.mps.structures.RADecDirection(); + case 17: return new org.ccsds.moims.mo.mps.structures.NamedTargetDirection(); + case 18: return new org.ccsds.moims.mo.mps.structures.DirectionReference(); + case 19: return new org.ccsds.moims.mo.mps.structures.Angle(); + case 20: return new org.ccsds.moims.mo.mps.structures.AngularVelocity(); + case 21: return new org.ccsds.moims.mo.mps.structures.Distance(); + case 22: return new org.ccsds.moims.mo.mps.structures.ExternalExpression(); + case 23: return new org.ccsds.moims.mo.mps.structures.ArgDef(); + case 24: return new org.ccsds.moims.mo.mps.structures.Argument(); + case 25: return new org.ccsds.moims.mo.mps.structures.ArgSpec(); + case 26: return new org.ccsds.moims.mo.mps.structures.NumericRange(); + case 27: return new org.ccsds.moims.mo.mps.structures.StringPattern(); + case 28: return new org.ccsds.moims.mo.mps.structures.StatusValues(); + case 29: return new org.ccsds.moims.mo.mps.structures.ConstraintNode(); + case 30: return new org.ccsds.moims.mo.mps.structures.LogicOpEnum(); + case 31: return new org.ccsds.moims.mo.mps.structures.ConstraintExpression(); + case 32: return new org.ccsds.moims.mo.mps.structures.TimeConstraint(); + case 33: return new org.ccsds.moims.mo.mps.structures.TimeWindowConstraint(); + case 34: return new org.ccsds.moims.mo.mps.structures.DurationConstraint(); + case 35: return new org.ccsds.moims.mo.mps.structures.ArgumentConstraint(); + case 36: return new org.ccsds.moims.mo.mps.structures.ExpressionOperatorEnum(); + case 37: return new org.ccsds.moims.mo.mps.structures.SimpleResourceConstraint(); + case 38: return new org.ccsds.moims.mo.mps.structures.ComplexResourceConstraint(); + case 39: return new org.ccsds.moims.mo.mps.structures.PositionConstraint(); + case 40: return new org.ccsds.moims.mo.mps.structures.EllipsoidalPositionConstraint(); + case 41: return new org.ccsds.moims.mo.mps.structures.PointingConstraint(); + case 42: return new org.ccsds.moims.mo.mps.structures.RevolutionConstraint(); + case 43: return new org.ccsds.moims.mo.mps.structures.DistanceConstraint(); + case 44: return new org.ccsds.moims.mo.mps.structures.AngleConstraint(); + case 45: return new org.ccsds.moims.mo.mps.structures.SequentialConstraint(); + case 46: return new org.ccsds.moims.mo.mps.structures.SeparationConstraint(); + case 47: return new org.ccsds.moims.mo.mps.structures.FunctionConstraint(); + case 48: return new org.ccsds.moims.mo.mps.structures.SimpleEffect(); + case 49: return new org.ccsds.moims.mo.mps.structures.EffectOperationEnum(); + case 50: return new org.ccsds.moims.mo.mps.structures.ComplexEffect(); + case 51: return new org.ccsds.moims.mo.mps.structures.TimeTrigger(); + case 52: return new org.ccsds.moims.mo.mps.structures.PositionTrigger(); + case 53: return new org.ccsds.moims.mo.mps.structures.DirectionTrigger(); + case 54: return new org.ccsds.moims.mo.mps.structures.AngleTrigger(); + case 55: return new org.ccsds.moims.mo.mps.structures.EventTrigger(); + case 56: return new org.ccsds.moims.mo.mps.structures.SeparationTypeEnum(); + case 57: return new org.ccsds.moims.mo.mps.structures.PositionRepetition(); + case 58: return new org.ccsds.moims.mo.mps.structures.OrbitRepetition(); + case 59: return new org.ccsds.moims.mo.mps.structures.DirectionRepetition(); + case 60: return new org.ccsds.moims.mo.mps.structures.RevolutionRepetition(); + case 61: return new org.ccsds.moims.mo.mps.structures.TemporalRepetition(); + case 62: return new org.ccsds.moims.mo.mps.structures.AngleRepetition(); + case 63: return new org.ccsds.moims.mo.mps.structures.EventRepetition(); + case 64: return new org.ccsds.moims.mo.mps.structures.SecondaryErrorCodeEnum(); + case 101: return new org.ccsds.moims.mo.mps.structures.ActivityDefinition(); + case 102: return new org.ccsds.moims.mo.mps.structures.ActivityInstance(); + case 103: return new org.ccsds.moims.mo.mps.structures.ActivityStatusEnum(); + case 104: return new org.ccsds.moims.mo.mps.structures.ActivityNode(); + case 105: return new org.ccsds.moims.mo.mps.structures.SimpleActivityDetails(); + case 106: return new org.ccsds.moims.mo.mps.structures.ActivityUpdate(); + case 107: return new org.ccsds.moims.mo.mps.structures.InsertedActivityDetails(); + case 108: return new org.ccsds.moims.mo.mps.structures.ActivitySuspensionStatus(); + case 201: return new org.ccsds.moims.mo.mps.structures.EventDefinition(); + case 202: return new org.ccsds.moims.mo.mps.structures.EventInstance(); + case 203: return new org.ccsds.moims.mo.mps.structures.EventStatusEnum(); + case 204: return new org.ccsds.moims.mo.mps.structures.PredictabilityEnum(); + case 205: return new org.ccsds.moims.mo.mps.structures.EventUpdate(); + case 206: return new org.ccsds.moims.mo.mps.structures.InsertedEventDetails(); + case 301: return new org.ccsds.moims.mo.mps.structures.Resource(); + case 302: return new org.ccsds.moims.mo.mps.structures.NumericResource(); + case 303: return new org.ccsds.moims.mo.mps.structures.ResourceProfile(); + case 304: return new org.ccsds.moims.mo.mps.structures.ProfileSegment(); + case 305: return new org.ccsds.moims.mo.mps.structures.InterpolationTypeEnum(); + case 306: return new org.ccsds.moims.mo.mps.structures.ProfileEntry(); + case 307: return new org.ccsds.moims.mo.mps.structures.RelativeResourceProfile(); + case 308: return new org.ccsds.moims.mo.mps.structures.RelativeProfileSegment(); + case 309: return new org.ccsds.moims.mo.mps.structures.RelativeProfileEntry(); + case 310: return new org.ccsds.moims.mo.mps.structures.ResourceUpdate(); + case 401: return new org.ccsds.moims.mo.mps.structures.RequestDefinition(); + case 402: return new org.ccsds.moims.mo.mps.structures.RequestInstance(); + case 403: return new org.ccsds.moims.mo.mps.structures.RequestStatusEnum(); + case 404: return new org.ccsds.moims.mo.mps.structures.RequestStatusUpdate(); + case 405: return new org.ccsds.moims.mo.mps.structures.PlanningRequestDetails(); + case 406: return new org.ccsds.moims.mo.mps.structures.PlanningRequestResponse(); + case 407: return new org.ccsds.moims.mo.mps.structures.RequestSummaryStatus(); + case 408: return new org.ccsds.moims.mo.mps.structures.RequestFilter(); + case 501: return new org.ccsds.moims.mo.mps.structures.Plan(); + case 502: return new org.ccsds.moims.mo.mps.structures.PlanStatusEnum(); + case 503: return new org.ccsds.moims.mo.mps.structures.PlanInformation(); + case 504: return new org.ccsds.moims.mo.mps.structures.PlannedItems(); + case 505: return new org.ccsds.moims.mo.mps.structures.PlanRevision(); + case 506: return new org.ccsds.moims.mo.mps.structures.ItemRevision(); + case 507: return new org.ccsds.moims.mo.mps.structures.RevisionStatusEnum(); + case 508: return new org.ccsds.moims.mo.mps.structures.PlanUpdate(); + case 509: return new org.ccsds.moims.mo.mps.structures.PlanSummaryStatus(); + case 510: return new org.ccsds.moims.mo.mps.structures.PlanActivationStatus(); + case 511: return new org.ccsds.moims.mo.mps.structures.SubPlanUpdate(); + case 512: return new org.ccsds.moims.mo.mps.structures.SubPlanStatusEnum(); + case 513: return new org.ccsds.moims.mo.mps.structures.SubPlanActivationStatus(); + case 514: return new org.ccsds.moims.mo.mps.structures.PlanQuery(); + case 515: return new org.ccsds.moims.mo.mps.structures.PartialPlan(); + case 516: return new org.ccsds.moims.mo.mps.structures.PlanFilter(); + case 517: return new org.ccsds.moims.mo.mps.structures.PartialPlanFilter(); + default: return createAreaElementOutOfBand(typeNumber); + } + } + + @Override + public int getAreaNumber() { + return 5; + } + + @Override + public int getAreaVersion() { + return 1; + } + + /** + * Creates an Element whose type number lies too far out to be held in the + * jump table that is asked first. This says nothing about how often the type + * is asked for: the numbers of an Area are not handed out in the order of + * use. + * + * @param typeNumber The typeNumber field. + */ + private static org.ccsds.moims.mo.mal.structures.Element createAreaElementOutOfBand(int typeNumber) { + switch (typeNumber) { + case -702: return new org.ccsds.moims.mo.mps.structures.FunctionDetailsList(); + case -701: return new org.ccsds.moims.mo.mps.structures.FunctionDefinitionDetailsList(); + case -601: return new org.ccsds.moims.mo.mps.structures.PlanningUserList(); + case 601: return new org.ccsds.moims.mo.mps.structures.PlanningUser(); + case 701: return new org.ccsds.moims.mo.mps.structures.FunctionDefinitionDetails(); + case 702: return new org.ccsds.moims.mo.mps.structures.FunctionDetails(); + default: return null; + } + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/MPSHelper.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/MPSHelper.java new file mode 100644 index 00000000..a8889ee7 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/MPSHelper.java @@ -0,0 +1,177 @@ +package org.ccsds.moims.mo.mps; + +/** + * Helper class for MPS area. + */ +public class MPSHelper { + + /** + * Area number literal. + */ + public static final int _MPS_AREA_NUMBER = 5; + + /** + * Area number instance. + */ + public static final org.ccsds.moims.mo.mal.structures.UShort MPS_AREA_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_MPS_AREA_NUMBER); + + /** + * Area name constant. + */ + public static final org.ccsds.moims.mo.mal.structures.Identifier MPS_AREA_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("MPS"); + + /** + * Area version literal. + */ + public static final short _MPS_AREA_VERSION = 1; + + /** + * Area version instance. + */ + public static final org.ccsds.moims.mo.mal.structures.UOctet MPS_AREA_VERSION = new org.ccsds.moims.mo.mal.structures.UOctet(_MPS_AREA_VERSION); + + /** + * Area Elements. + */ + public static final org.ccsds.moims.mo.mal.structures.Element[] MPS_AREA_ELEMENTS = {}; + + /** + * Services in this Area. + */ + public static final org.ccsds.moims.mo.mal.ServiceInfo[] MPS_AREA_SERVICES = { + org.ccsds.moims.mo.mps.planningrequest.PlanningRequestHelper.PLANNINGREQUEST_SERVICE, + org.ccsds.moims.mo.mps.plandistribution.PlanDistributionHelper.PLANDISTRIBUTION_SERVICE, + org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlHelper.PLANEXECUTIONCONTROL_SERVICE, + org.ccsds.moims.mo.mps.planinformationmanagement.PlanInformationManagementHelper.PLANINFORMATIONMANAGEMENT_SERVICE, + org.ccsds.moims.mo.mps.planedit.PlanEditHelper.PLANEDIT_SERVICE,}; + + /** + * Area singleton instance. + */ + public static final org.ccsds.moims.mo.mal.MALArea MPS_AREA = new org.ccsds.moims.mo.mal.MALArea(MPS_AREA_NUMBER, MPS_AREA_NAME, MPS_AREA_VERSION, MPS_AREA_ELEMENTS, MPS_AREA_SERVICES, new MPSElementFactory()); + + /** + * Error literal for error INVALID. + */ + public static final long _INVALID_ERROR_NUMBER = 1; + + /** + * Error instance for error INVALID. + */ + public static final org.ccsds.moims.mo.mal.structures.UInteger INVALID_ERROR_NUMBER = new org.ccsds.moims.mo.mal.structures.UInteger(_INVALID_ERROR_NUMBER); + + /** + * Error literal for error CANCEL_FAILED. + */ + public static final long _CANCEL_FAILED_ERROR_NUMBER = 2; + + /** + * Error instance for error CANCEL_FAILED. + */ + public static final org.ccsds.moims.mo.mal.structures.UInteger CANCEL_FAILED_ERROR_NUMBER = new org.ccsds.moims.mo.mal.structures.UInteger(_CANCEL_FAILED_ERROR_NUMBER); + + /** + * Error literal for error UPDATE_FAILED. + */ + public static final long _UPDATE_FAILED_ERROR_NUMBER = 3; + + /** + * Error instance for error UPDATE_FAILED. + */ + public static final org.ccsds.moims.mo.mal.structures.UInteger UPDATE_FAILED_ERROR_NUMBER = new org.ccsds.moims.mo.mal.structures.UInteger(_UPDATE_FAILED_ERROR_NUMBER); + + /** + * Error literal for error REVOKE_FAILED. + */ + public static final long _REVOKE_FAILED_ERROR_NUMBER = 4; + + /** + * Error instance for error REVOKE_FAILED. + */ + public static final org.ccsds.moims.mo.mal.structures.UInteger REVOKE_FAILED_ERROR_NUMBER = new org.ccsds.moims.mo.mal.structures.UInteger(_REVOKE_FAILED_ERROR_NUMBER); + + /** + * Error literal for error INSERT_FAILED. + */ + public static final long _INSERT_FAILED_ERROR_NUMBER = 5; + + /** + * Error instance for error INSERT_FAILED. + */ + public static final org.ccsds.moims.mo.mal.structures.UInteger INSERT_FAILED_ERROR_NUMBER = new org.ccsds.moims.mo.mal.structures.UInteger(_INSERT_FAILED_ERROR_NUMBER); + + /** + * Error literal for error DELETE_FAILED. + */ + public static final long _DELETE_FAILED_ERROR_NUMBER = 6; + + /** + * Error instance for error DELETE_FAILED. + */ + public static final org.ccsds.moims.mo.mal.structures.UInteger DELETE_FAILED_ERROR_NUMBER = new org.ccsds.moims.mo.mal.structures.UInteger(_DELETE_FAILED_ERROR_NUMBER); + + /** + * Error literal for error ACTIVATE_FAILED. + */ + public static final long _ACTIVATE_FAILED_ERROR_NUMBER = 7; + + /** + * Error instance for error ACTIVATE_FAILED. + */ + public static final org.ccsds.moims.mo.mal.structures.UInteger ACTIVATE_FAILED_ERROR_NUMBER = new org.ccsds.moims.mo.mal.structures.UInteger(_ACTIVATE_FAILED_ERROR_NUMBER); + + /** + * Error literal for error DEACTIVATE_FAILED. + */ + public static final long _DEACTIVATE_FAILED_ERROR_NUMBER = 8; + + /** + * Error instance for error DEACTIVATE_FAILED. + */ + public static final org.ccsds.moims.mo.mal.structures.UInteger DEACTIVATE_FAILED_ERROR_NUMBER = new org.ccsds.moims.mo.mal.structures.UInteger(_DEACTIVATE_FAILED_ERROR_NUMBER); + + /** + * Error literal for error SUBMIT_FAILED. + */ + public static final long _SUBMIT_FAILED_ERROR_NUMBER = 9; + + /** + * Error instance for error SUBMIT_FAILED. + */ + public static final org.ccsds.moims.mo.mal.structures.UInteger SUBMIT_FAILED_ERROR_NUMBER = new org.ccsds.moims.mo.mal.structures.UInteger(_SUBMIT_FAILED_ERROR_NUMBER); + + /** + * Error literal for error UNSUPPORTED. + */ + public static final long _UNSUPPORTED_ERROR_NUMBER = 10; + + /** + * Error instance for error UNSUPPORTED. + */ + public static final org.ccsds.moims.mo.mal.structures.UInteger UNSUPPORTED_ERROR_NUMBER = new org.ccsds.moims.mo.mal.structures.UInteger(_UNSUPPORTED_ERROR_NUMBER); + + /** + * Error literal for error ACTIVATE_SUBPLAN_FAILED. + */ + public static final long _ACTIVATE_SUBPLAN_FAILED_ERROR_NUMBER = 11; + + /** + * Error instance for error ACTIVATE_SUBPLAN_FAILED. + */ + public static final org.ccsds.moims.mo.mal.structures.UInteger ACTIVATE_SUBPLAN_FAILED_ERROR_NUMBER = new org.ccsds.moims.mo.mal.structures.UInteger(_ACTIVATE_SUBPLAN_FAILED_ERROR_NUMBER); + + /** + * Error literal for error DEACTIVATE_SUBPLAN_FAILED. + */ + public static final long _DEACTIVATE_SUBPLAN_FAILED_ERROR_NUMBER = 12; + + /** + * Error instance for error DEACTIVATE_SUBPLAN_FAILED. + */ + public static final org.ccsds.moims.mo.mal.structures.UInteger DEACTIVATE_SUBPLAN_FAILED_ERROR_NUMBER = new org.ccsds.moims.mo.mal.structures.UInteger(_DEACTIVATE_SUBPLAN_FAILED_ERROR_NUMBER); + + private MPSHelper() { + // Utility class; not meant to be instantiated. + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/RevokeFailedException.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/RevokeFailedException.java new file mode 100644 index 00000000..030f02da --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/RevokeFailedException.java @@ -0,0 +1,29 @@ +package org.ccsds.moims.mo.mps; + +/** + * The RevokeFailedException exception. The revokePlan operation failed to + * revoke the referenced Plan, for example because it has already started + * executing. + */ +public final class RevokeFailedException extends org.ccsds.moims.mo.mal.MOErrorException { + + private static final String MO_ERROR_NAME = "REVOKE_FAILED"; + + /** + * Constructs a new RevokeFailedException exception. + * + */ + public RevokeFailedException() { + super(MO_ERROR_NAME, MPSHelper.REVOKE_FAILED_ERROR_NUMBER, ""); + } + + /** + * Constructs a new RevokeFailedException exception. + * + * @param extraInformation The extraInformation of the exception. + */ + public RevokeFailedException(Object extraInformation) { + super(MO_ERROR_NAME, MPSHelper.REVOKE_FAILED_ERROR_NUMBER, extraInformation); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/SubmitFailedException.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/SubmitFailedException.java new file mode 100644 index 00000000..c9242148 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/SubmitFailedException.java @@ -0,0 +1,28 @@ +package org.ccsds.moims.mo.mps; + +/** + * The SubmitFailedException exception. The submitPlan operation failed as + * the submitted plan was already terminated. + */ +public final class SubmitFailedException extends org.ccsds.moims.mo.mal.MOErrorException { + + private static final String MO_ERROR_NAME = "SUBMIT_FAILED"; + + /** + * Constructs a new SubmitFailedException exception. + * + */ + public SubmitFailedException() { + super(MO_ERROR_NAME, MPSHelper.SUBMIT_FAILED_ERROR_NUMBER, ""); + } + + /** + * Constructs a new SubmitFailedException exception. + * + * @param extraInformation The extraInformation of the exception. + */ + public SubmitFailedException(Object extraInformation) { + super(MO_ERROR_NAME, MPSHelper.SUBMIT_FAILED_ERROR_NUMBER, extraInformation); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/UnsupportedException.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/UnsupportedException.java new file mode 100644 index 00000000..2444ad36 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/UnsupportedException.java @@ -0,0 +1,28 @@ +package org.ccsds.moims.mo.mps; + +/** + * The UnsupportedException exception. An optional data structure used in + * the message is not supported by the service provider. + */ +public final class UnsupportedException extends org.ccsds.moims.mo.mal.MOErrorException { + + private static final String MO_ERROR_NAME = "UNSUPPORTED"; + + /** + * Constructs a new UnsupportedException exception. + * + */ + public UnsupportedException() { + super(MO_ERROR_NAME, MPSHelper.UNSUPPORTED_ERROR_NUMBER, ""); + } + + /** + * Constructs a new UnsupportedException exception. + * + * @param extraInformation The extraInformation of the exception. + */ + public UnsupportedException(Object extraInformation) { + super(MO_ERROR_NAME, MPSHelper.UNSUPPORTED_ERROR_NUMBER, extraInformation); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/UpdateFailedException.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/UpdateFailedException.java new file mode 100644 index 00000000..68e3f5b2 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/UpdateFailedException.java @@ -0,0 +1,29 @@ +package org.ccsds.moims.mo.mps; + +/** + * The UpdateFailedException exception. The update operation (to Request, + * PlanStatus, Activity, Event or Resource) failed to update the referenced + * object. + */ +public final class UpdateFailedException extends org.ccsds.moims.mo.mal.MOErrorException { + + private static final String MO_ERROR_NAME = "UPDATE_FAILED"; + + /** + * Constructs a new UpdateFailedException exception. + * + */ + public UpdateFailedException() { + super(MO_ERROR_NAME, MPSHelper.UPDATE_FAILED_ERROR_NUMBER, ""); + } + + /** + * Constructs a new UpdateFailedException exception. + * + * @param extraInformation The extraInformation of the exception. + */ + public UpdateFailedException(Object extraInformation) { + super(MO_ERROR_NAME, MPSHelper.UPDATE_FAILED_ERROR_NUMBER, extraInformation); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/package-info.java new file mode 100644 index 00000000..f5249617 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/package-info.java @@ -0,0 +1,4 @@ +/** + * Mission Operations Mission Planning and Scheduling Services. +*/ +package org.ccsds.moims.mo.mps; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/plandistribution/PlanDistributionHelper.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/plandistribution/PlanDistributionHelper.java new file mode 100644 index 00000000..e36aa841 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/plandistribution/PlanDistributionHelper.java @@ -0,0 +1,17 @@ +package org.ccsds.moims.mo.mps.plandistribution; + +/** + * Helper class for PlanDistribution service. + */ +public class PlanDistributionHelper { + + /** + * Service singleton instance. + */ + public static final org.ccsds.moims.mo.mps.plandistribution.PlanDistributionServiceInfo PLANDISTRIBUTION_SERVICE = new org.ccsds.moims.mo.mps.plandistribution.PlanDistributionServiceInfo(); + + private PlanDistributionHelper() { + // Utility class; not meant to be instantiated. + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/plandistribution/PlanDistributionServiceInfo.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/plandistribution/PlanDistributionServiceInfo.java new file mode 100644 index 00000000..ab7eb65c --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/plandistribution/PlanDistributionServiceInfo.java @@ -0,0 +1,279 @@ +package org.ccsds.moims.mo.mps.plandistribution; + +/** + * Helper class for PlanDistribution service. + */ +public class PlanDistributionServiceInfo extends org.ccsds.moims.mo.mal.ServiceInfo { + + /** + * Service number literal. + */ + public static final int _PLANDISTRIBUTION_SERVICE_NUMBER = 2; + + /** + * Service number instance. + */ + public static final org.ccsds.moims.mo.mal.structures.UShort PLANDISTRIBUTION_SERVICE_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_PLANDISTRIBUTION_SERVICE_NUMBER); + + /** + * Service name constant. + */ + public static final org.ccsds.moims.mo.mal.structures.Identifier PLANDISTRIBUTION_SERVICE_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("PlanDistribution"); + + /** + * The service key of this service. + */ + private static final org.ccsds.moims.mo.mal.ServiceKey SERVICE_KEY = new org.ccsds.moims.mo.mal.ServiceKey( + 5, 1, PLANDISTRIBUTION_SERVICE_NUMBER); + + /** + * Operation number literal for operation GETPLANSUMMARIES. + */ + public static final int _GETPLANSUMMARIES_OP_NUMBER = 1; + + /** + * Operation number instance for operation GETPLANSUMMARIES. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort GETPLANSUMMARIES_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_GETPLANSUMMARIES_OP_NUMBER); + + /** + * Operation instance for operation GETPLANSUMMARIES. + */ + public static final org.ccsds.moims.mo.mal.MALRequestOperation GETPLANSUMMARIES_OP = new org.ccsds.moims.mo.mal.MALRequestOperation(SERVICE_KEY, + GETPLANSUMMARIES_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("getPlanSummaries"), + new org.ccsds.moims.mo.mal.structures.UShort(1), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("planFilter", false, org.ccsds.moims.mo.mps.structures.PlanFilter.SHORT_FORM, "")}, + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("planSummaries", false, org.ccsds.moims.mo.mps.structures.PlanSummaryStatusList.SHORT_FORM, "")}, + "The getPlanSummaries operation allows consumers to obtain a filtered list of currently available Plans. The request uses the PlanFilter structure to select the set of plans of interest, using the following keys: Domain of the Plan; Reference to the Plan; Reference to the precursor Plan of the Plan; Current status of the Plan; Originator of the Plan; Validity period of the Plan (as a time window). The response returns a list of PlanSummaryStatus structures containing references to the identities, descriptive header fields, and status of the Plans that match the filter."); + + /** + * Operation number literal for operation GETPLAN. + */ + public static final int _GETPLAN_OP_NUMBER = 2; + + /** + * Operation number instance for operation GETPLAN. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort GETPLAN_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_GETPLAN_OP_NUMBER); + + /** + * Operation instance for operation GETPLAN. + */ + public static final org.ccsds.moims.mo.mal.MALProgressOperation GETPLAN_OP = new org.ccsds.moims.mo.mal.MALProgressOperation(SERVICE_KEY, + GETPLAN_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("getPlan"), + new org.ccsds.moims.mo.mal.structures.UShort(1), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("planRefs", false, org.ccsds.moims.mo.mal.structures.ObjectRefList.SHORT_FORM, "")}, + new org.ccsds.moims.mo.mal.OperationField[] {}, + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("retrievedPlan", false, org.ccsds.moims.mo.mps.structures.Plan.SHORT_FORM, "")}, + new org.ccsds.moims.mo.mal.OperationField[] {}, + "The getPlan operation is used to obtain the full content of one or more known Plans. The operation uses the Progress interaction pattern, to allow the response to be spread across multiple messages."); + + /** + * Operation number literal for operation GETPLANSTATUS. + */ + public static final int _GETPLANSTATUS_OP_NUMBER = 3; + + /** + * Operation number instance for operation GETPLANSTATUS. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort GETPLANSTATUS_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_GETPLANSTATUS_OP_NUMBER); + + /** + * Operation instance for operation GETPLANSTATUS. + */ + public static final org.ccsds.moims.mo.mal.MALRequestOperation GETPLANSTATUS_OP = new org.ccsds.moims.mo.mal.MALRequestOperation(SERVICE_KEY, + GETPLANSTATUS_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("getPlanStatus"), + new org.ccsds.moims.mo.mal.structures.UShort(1), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("planRefs", false, org.ccsds.moims.mo.mal.structures.ObjectRefList.SHORT_FORM, "")}, + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("responsePlans", false, org.ccsds.moims.mo.mps.structures.PlanUpdateList.SHORT_FORM, "")}, + "The getPlanStatus operation is used to obtain the current status of one or more known Plans. The operation uses the Request interaction pattern."); + + /** + * Operation number literal for operation MONITORPLANSTATUS. + */ + public static final int _MONITORPLANSTATUS_OP_NUMBER = 4; + + /** + * Operation number instance for operation MONITORPLANSTATUS. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort MONITORPLANSTATUS_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_MONITORPLANSTATUS_OP_NUMBER); + + /** + * Operation instance for operation MONITORPLANSTATUS. + */ + public static final org.ccsds.moims.mo.mal.MALPubSubOperation MONITORPLANSTATUS_OP = new org.ccsds.moims.mo.mal.MALPubSubOperation(SERVICE_KEY, + MONITORPLANSTATUS_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("monitorPlanStatus"), + new org.ccsds.moims.mo.mal.structures.UShort(2), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("planUpdate", false, org.ccsds.moims.mo.mps.structures.PlanUpdate.SHORT_FORM, "")}, + "The monitorPlanStatus operation is used to subscribe to status updates for a filtered set of Plans. The operation uses the Publish-Subscribe interaction pattern, with the body of the notification message comprising a PlanUpdate for a subscribed Plan."); + + /** + * Key names instance for MONITORPLANSTATUS operation of pubsub interaction + * pattern. + */ + private static final org.ccsds.moims.mo.mal.structures.Identifier [] _MONITORPLANSTATUS_OP_KEY_NAMES = {new org.ccsds.moims.mo.mal.structures.Identifier("planID"), + new org.ccsds.moims.mo.mal.structures.Identifier("precursor"), + new org.ccsds.moims.mo.mal.structures.Identifier("status"), + new org.ccsds.moims.mo.mal.structures.Identifier("originator")}; + + /** + * Key names instance for MONITORPLANSTATUS operation of pubsub interaction + * pattern. + */ + private static final org.ccsds.moims.mo.mal.structures.IdentifierList MONITORPLANSTATUS_OP_KEY_NAMES = new org.ccsds.moims.mo.mal.structures.IdentifierList(new java.util.ArrayList<>(java.util.Arrays.asList(_MONITORPLANSTATUS_OP_KEY_NAMES))); + + /** + * Operation number literal for operation MONITORPLAN. + */ + public static final int _MONITORPLAN_OP_NUMBER = 5; + + /** + * Operation number instance for operation MONITORPLAN. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort MONITORPLAN_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_MONITORPLAN_OP_NUMBER); + + /** + * Operation instance for operation MONITORPLAN. + */ + public static final org.ccsds.moims.mo.mal.MALPubSubOperation MONITORPLAN_OP = new org.ccsds.moims.mo.mal.MALPubSubOperation(SERVICE_KEY, + MONITORPLAN_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("monitorPlan"), + new org.ccsds.moims.mo.mal.structures.UShort(3), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("plan", false, org.ccsds.moims.mo.mps.structures.Plan.SHORT_FORM, "")}, + "The monitorPlan operation is used by a consumer to subscribe to receive new Plans, or new versions of Plans, as they published. The operation uses the Publish-Subscribe interaction pattern, with the body of the notification message comprising a Plan."); + + /** + * Key names instance for MONITORPLAN operation of pubsub interaction pattern. + */ + private static final org.ccsds.moims.mo.mal.structures.Identifier [] _MONITORPLAN_OP_KEY_NAMES = {new org.ccsds.moims.mo.mal.structures.Identifier("planID"), + new org.ccsds.moims.mo.mal.structures.Identifier("precursor"), + new org.ccsds.moims.mo.mal.structures.Identifier("status"), + new org.ccsds.moims.mo.mal.structures.Identifier("originator")}; + + /** + * Key names instance for MONITORPLAN operation of pubsub interaction pattern. + */ + private static final org.ccsds.moims.mo.mal.structures.IdentifierList MONITORPLAN_OP_KEY_NAMES = new org.ccsds.moims.mo.mal.structures.IdentifierList(new java.util.ArrayList<>(java.util.Arrays.asList(_MONITORPLAN_OP_KEY_NAMES))); + + /** + * Operation number literal for operation QUERYPLAN. + */ + public static final int _QUERYPLAN_OP_NUMBER = 6; + + /** + * Operation number instance for operation QUERYPLAN. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort QUERYPLAN_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_QUERYPLAN_OP_NUMBER); + + /** + * Operation instance for operation QUERYPLAN. + */ + public static final org.ccsds.moims.mo.mal.MALProgressOperation QUERYPLAN_OP = new org.ccsds.moims.mo.mal.MALProgressOperation(SERVICE_KEY, + QUERYPLAN_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("queryPlan"), + new org.ccsds.moims.mo.mal.structures.UShort(4), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("query", false, org.ccsds.moims.mo.mps.structures.PlanQuery.SHORT_FORM, "")}, + new org.ccsds.moims.mo.mal.OperationField[] {}, + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("queriedPlan", false, org.ccsds.moims.mo.mps.structures.Plan.SHORT_FORM, "")}, + new org.ccsds.moims.mo.mal.OperationField[] {}, + "The queryPlan operation enables a consumer to retrieve a filtered set of plans, based on an extended set of filter criteria, including relevant fields of the plan information sections of the plan, as well as the type of planning activities and planning events contained within the plan."); + + /** + * Operation number literal for operation GETPARTIALPLAN. + */ + public static final int _GETPARTIALPLAN_OP_NUMBER = 7; + + /** + * Operation number instance for operation GETPARTIALPLAN. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort GETPARTIALPLAN_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_GETPARTIALPLAN_OP_NUMBER); + + /** + * Operation instance for operation GETPARTIALPLAN. + */ + public static final org.ccsds.moims.mo.mal.MALRequestOperation GETPARTIALPLAN_OP = new org.ccsds.moims.mo.mal.MALRequestOperation(SERVICE_KEY, + GETPARTIALPLAN_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("getPartialPlan"), + new org.ccsds.moims.mo.mal.structures.UShort(5), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("partialPlanFilter", false, org.ccsds.moims.mo.mps.structures.PartialPlanFilter.SHORT_FORM, "")}, + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("partialPlan", false, org.ccsds.moims.mo.mps.structures.PartialPlan.SHORT_FORM, "")}, + "The getPartialPlan operation enables a consumer to extract a subset of a Plan that meets the supplied partialPlanFilter. The filter can select the partial plan content based on: a shorter period than that covered by the plan, specified by time, position, or events; a subset of contained ActivityInstances, based on their domain, associated SubPlan or tags. The PartialPlan returned includes the filter criteria and a version of the plan containing only the ActivityInstances that match those criteria. It is implementation dependent what is returned in terms of events and resources, but it may be assumed that any related events and resources would be included in the returned partial plan."); + + /** + * Area elements. + */ + public static final org.ccsds.moims.mo.mal.structures.Element[] PLANDISTRIBUTION_SERVICE_ELEMENTS = {}; + + /** + * The set of operations for this service. + */ + public static final org.ccsds.moims.mo.mal.MALOperation[] OPERATIONS = new org.ccsds.moims.mo.mal.MALOperation[]{GETPLANSUMMARIES_OP, + GETPLAN_OP, + GETPLANSTATUS_OP, + MONITORPLANSTATUS_OP, + MONITORPLAN_OP, + QUERYPLAN_OP, + GETPARTIALPLAN_OP}; + + /** + * Creates an instance of the PlanDistribution ServiceInfo. + * + */ + public PlanDistributionServiceInfo() { + super(SERVICE_KEY, PLANDISTRIBUTION_SERVICE_NAME, PLANDISTRIBUTION_SERVICE_ELEMENTS, OPERATIONS); + } + + @Override + public org.ccsds.moims.mo.mal.MALArea getArea() { + return org.ccsds.moims.mo.mps.MPSHelper.MPS_AREA; + } + + @Override + public org.ccsds.moims.mo.mal.MOErrorException generateMOError(int errorNumber, + Object extraInfo) { + switch (errorNumber) { + case 1: + return new org.ccsds.moims.mo.mps.InvalidException(extraInfo); + case 2: + return new org.ccsds.moims.mo.mps.CancelFailedException(extraInfo); + case 3: + return new org.ccsds.moims.mo.mps.UpdateFailedException(extraInfo); + case 4: + return new org.ccsds.moims.mo.mps.RevokeFailedException(extraInfo); + case 5: + return new org.ccsds.moims.mo.mps.InsertFailedException(extraInfo); + case 6: + return new org.ccsds.moims.mo.mps.DeleteFailedException(extraInfo); + case 7: + return new org.ccsds.moims.mo.mps.ActivateFailedException(extraInfo); + case 8: + return new org.ccsds.moims.mo.mps.DeactivateFailedException(extraInfo); + case 9: + return new org.ccsds.moims.mo.mps.SubmitFailedException(extraInfo); + case 10: + return new org.ccsds.moims.mo.mps.UnsupportedException(extraInfo); + case 11: + return new org.ccsds.moims.mo.mps.ActivateSubplanFailedException(extraInfo); + case 12: + return new org.ccsds.moims.mo.mps.DeactivateSubplanFailedException(extraInfo); + } + return null; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/plandistribution/consumer/MonitorPlanStatusSubscriptionKeys.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/plandistribution/consumer/MonitorPlanStatusSubscriptionKeys.java new file mode 100644 index 00000000..7d27f6ef --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/plandistribution/consumer/MonitorPlanStatusSubscriptionKeys.java @@ -0,0 +1,106 @@ +package org.ccsds.moims.mo.mps.plandistribution.consumer; + +/** + * Typed accessors for the Subscription Keys of the monitorPlanStatus PubSub + * operation. + */ +public final class MonitorPlanStatusSubscriptionKeys { + + /** + * The key values as received in the UpdateHeader. + */ + private org.ccsds.moims.mo.mal.structures.NullableAttributeList keyValues; + + /** + * The effective key names for the received key values. + */ + private org.ccsds.moims.mo.mal.structures.IdentifierList keyNames; + + /** + * The Subscription Key names defined by the operation, in order. + */ + private static final org.ccsds.moims.mo.mal.structures.IdentifierList CANONICAL_KEY_NAMES = new org.ccsds.moims.mo.mal.structures.IdentifierList(new java.util.ArrayList<>(java.util.Arrays.asList(new org.ccsds.moims.mo.mal.structures.Identifier("planID"), new org.ccsds.moims.mo.mal.structures.Identifier("precursor"), new org.ccsds.moims.mo.mal.structures.Identifier("status"), new org.ccsds.moims.mo.mal.structures.Identifier("originator")))); + + /** + * Creates an instance from the received UpdateHeader and the subscription + * selectedKeys. + * + * @param updateHeader The UpdateHeader received in the NOTIFY message + * @param selectedKeys The selectedKeys of the subscription, or null if trimming was not enabled + */ + public MonitorPlanStatusSubscriptionKeys(org.ccsds.moims.mo.mal.structures.UpdateHeader updateHeader, + org.ccsds.moims.mo.mal.structures.IdentifierList selectedKeys) { + this.keyValues = (updateHeader == null) ? null : updateHeader.getKeyValues(); + this.keyNames = (selectedKeys != null) ? selectedKeys : CANONICAL_KEY_NAMES; + } + + /** + * Returns the value of the "planID" Subscription Key, or null if not present. + * + * @return The key value, or null if not present + */ + public org.ccsds.moims.mo.mal.structures.Identifier getPlanID() { + return (org.ccsds.moims.mo.mal.structures.Identifier) valueByName("planID"); + } + + /** + * Returns the value of the "precursor" Subscription Key, or null if not present. + * + * @return The key value, or null if not present + */ + public org.ccsds.moims.mo.mal.structures.Identifier getPrecursor() { + return (org.ccsds.moims.mo.mal.structures.Identifier) valueByName("precursor"); + } + + /** + * Returns the value of the "status" Subscription Key, or null if not present. + * + * @return The key value, or null if not present + */ + public org.ccsds.moims.mo.mal.structures.UShort getStatus() { + return (org.ccsds.moims.mo.mal.structures.UShort) valueByName("status"); + } + + /** + * Returns the value of the "originator" Subscription Key, or null if not + * present. + * + * @return The key value, or null if not present + */ + public org.ccsds.moims.mo.mal.structures.Identifier getOriginator() { + return (org.ccsds.moims.mo.mal.structures.Identifier) valueByName("originator"); + } + + /** + * Returns the Subscription Key value with the given name, or null if it is + * not present (for example when it was trimmed away or is a custom key that + * is not part of this subscription). + * + * @param name The Subscription Key name + * @return The key value, or null if not present + */ + public org.ccsds.moims.mo.mal.structures.Attribute getByName(String name) { + return valueByName(name); + } + + /** + * + * @param name The Subscription Key name + */ + private org.ccsds.moims.mo.mal.structures.Attribute valueByName(String name) { + if (keyNames == null || keyValues == null) { + return null; + } + for (int i = 0; i < keyNames.size(); i++) { + if (name.equals(keyNames.get(i).getValue())) { + if (i >= keyValues.size()) { + return null; + } + org.ccsds.moims.mo.mal.structures.NullableAttribute na = keyValues.get(i); + return (na == null) ? null : na.getValue(); + } + } + return null; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/plandistribution/consumer/MonitorPlanSubscriptionKeys.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/plandistribution/consumer/MonitorPlanSubscriptionKeys.java new file mode 100644 index 00000000..649f9dfa --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/plandistribution/consumer/MonitorPlanSubscriptionKeys.java @@ -0,0 +1,105 @@ +package org.ccsds.moims.mo.mps.plandistribution.consumer; + +/** + * Typed accessors for the Subscription Keys of the monitorPlan PubSub operation. + */ +public final class MonitorPlanSubscriptionKeys { + + /** + * The key values as received in the UpdateHeader. + */ + private org.ccsds.moims.mo.mal.structures.NullableAttributeList keyValues; + + /** + * The effective key names for the received key values. + */ + private org.ccsds.moims.mo.mal.structures.IdentifierList keyNames; + + /** + * The Subscription Key names defined by the operation, in order. + */ + private static final org.ccsds.moims.mo.mal.structures.IdentifierList CANONICAL_KEY_NAMES = new org.ccsds.moims.mo.mal.structures.IdentifierList(new java.util.ArrayList<>(java.util.Arrays.asList(new org.ccsds.moims.mo.mal.structures.Identifier("planID"), new org.ccsds.moims.mo.mal.structures.Identifier("precursor"), new org.ccsds.moims.mo.mal.structures.Identifier("status"), new org.ccsds.moims.mo.mal.structures.Identifier("originator")))); + + /** + * Creates an instance from the received UpdateHeader and the subscription + * selectedKeys. + * + * @param updateHeader The UpdateHeader received in the NOTIFY message + * @param selectedKeys The selectedKeys of the subscription, or null if trimming was not enabled + */ + public MonitorPlanSubscriptionKeys(org.ccsds.moims.mo.mal.structures.UpdateHeader updateHeader, + org.ccsds.moims.mo.mal.structures.IdentifierList selectedKeys) { + this.keyValues = (updateHeader == null) ? null : updateHeader.getKeyValues(); + this.keyNames = (selectedKeys != null) ? selectedKeys : CANONICAL_KEY_NAMES; + } + + /** + * Returns the value of the "planID" Subscription Key, or null if not present. + * + * @return The key value, or null if not present + */ + public org.ccsds.moims.mo.mal.structures.Identifier getPlanID() { + return (org.ccsds.moims.mo.mal.structures.Identifier) valueByName("planID"); + } + + /** + * Returns the value of the "precursor" Subscription Key, or null if not present. + * + * @return The key value, or null if not present + */ + public org.ccsds.moims.mo.mal.structures.Identifier getPrecursor() { + return (org.ccsds.moims.mo.mal.structures.Identifier) valueByName("precursor"); + } + + /** + * Returns the value of the "status" Subscription Key, or null if not present. + * + * @return The key value, or null if not present + */ + public org.ccsds.moims.mo.mal.structures.UShort getStatus() { + return (org.ccsds.moims.mo.mal.structures.UShort) valueByName("status"); + } + + /** + * Returns the value of the "originator" Subscription Key, or null if not + * present. + * + * @return The key value, or null if not present + */ + public org.ccsds.moims.mo.mal.structures.Identifier getOriginator() { + return (org.ccsds.moims.mo.mal.structures.Identifier) valueByName("originator"); + } + + /** + * Returns the Subscription Key value with the given name, or null if it is + * not present (for example when it was trimmed away or is a custom key that + * is not part of this subscription). + * + * @param name The Subscription Key name + * @return The key value, or null if not present + */ + public org.ccsds.moims.mo.mal.structures.Attribute getByName(String name) { + return valueByName(name); + } + + /** + * + * @param name The Subscription Key name + */ + private org.ccsds.moims.mo.mal.structures.Attribute valueByName(String name) { + if (keyNames == null || keyValues == null) { + return null; + } + for (int i = 0; i < keyNames.size(); i++) { + if (name.equals(keyNames.get(i).getValue())) { + if (i >= keyValues.size()) { + return null; + } + org.ccsds.moims.mo.mal.structures.NullableAttribute na = keyValues.get(i); + return (na == null) ? null : na.getValue(); + } + } + return null; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/plandistribution/consumer/PlanDistributionAdapter.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/plandistribution/consumer/PlanDistributionAdapter.java new file mode 100644 index 00000000..27b3dbce --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/plandistribution/consumer/PlanDistributionAdapter.java @@ -0,0 +1,613 @@ +package org.ccsds.moims.mo.mps.plandistribution.consumer; + +/** + * Consumer adapter for PlanDistribution service. + */ +public abstract class PlanDistributionAdapter extends org.ccsds.moims.mo.mal.consumer.MALInteractionAdapter { + + /** + * Called by the MAL when a REQUEST response is received from a provider for + * the operation getPlanSummaries. + * + * @param msgHeader msgHeader The header of the received message + * @param planSummaries The planSummaries field. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void getPlanSummariesResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mps.structures.PlanSummaryStatusList planSummaries, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response error is received from a provider + * for the operation getPlanSummaries. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void getPlanSummariesErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PROGRESS acknowledgement is received from a provider + * for the operation getPlan. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void getPlanAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PROGRESS update is received from a provider for + * the operation getPlan. + * + * @param msgHeader msgHeader The header of the received message + * @param retrievedPlan The retrievedPlan field. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void getPlanUpdateReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mps.structures.Plan retrievedPlan, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PROGRESS response is received from a provider + * for the operation getPlan. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void getPlanResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PROGRESS acknowledgement error is received from + * a provider for the operation getPlan. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void getPlanAckErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PROGRESS update error is received from a provider + * for the operation getPlan. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void getPlanUpdateErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PROGRESS response error is received from a provider + * for the operation getPlan. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void getPlanResponseErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response is received from a provider for + * the operation getPlanStatus. + * + * @param msgHeader msgHeader The header of the received message + * @param responsePlans The responsePlans field. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void getPlanStatusResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mps.structures.PlanUpdateList responsePlans, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response error is received from a provider + * for the operation getPlanStatus. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void getPlanStatusErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PubSub register acknowledgement is received from + * a broker for the operation monitorPlanStatus. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void monitorPlanStatusRegisterAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PubSub register acknowledgement error is received + * from a broker for the operation monitorPlanStatus. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void monitorPlanStatusRegisterErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PubSub deregister acknowledgement is received + * from a broker for the operation monitorPlanStatus. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void monitorPlanStatusDeregisterAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PubSub update is received from a broker for the + * operation monitorPlanStatus. + * + * @param msgHeader msgHeader The header of the received message + * @param subscriptionId The subscriptionId of the subscription. + * @param updateHeader The Update header. + * @param keys The typed Subscription Key accessors for this update + * @param planUpdate The planUpdate field. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void monitorPlanStatusNotifyReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.structures.Identifier subscriptionId, + org.ccsds.moims.mo.mal.structures.UpdateHeader updateHeader, + MonitorPlanStatusSubscriptionKeys keys, + org.ccsds.moims.mo.mps.structures.PlanUpdate planUpdate, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PubSub update error is received from a broker + * for the operation monitorPlanStatus. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void monitorPlanStatusNotifyErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PubSub register acknowledgement is received from + * a broker for the operation monitorPlan. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void monitorPlanRegisterAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PubSub register acknowledgement error is received + * from a broker for the operation monitorPlan. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void monitorPlanRegisterErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PubSub deregister acknowledgement is received + * from a broker for the operation monitorPlan. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void monitorPlanDeregisterAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PubSub update is received from a broker for the + * operation monitorPlan. + * + * @param msgHeader msgHeader The header of the received message + * @param subscriptionId The subscriptionId of the subscription. + * @param updateHeader The Update header. + * @param keys The typed Subscription Key accessors for this update + * @param plan The plan field. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void monitorPlanNotifyReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.structures.Identifier subscriptionId, + org.ccsds.moims.mo.mal.structures.UpdateHeader updateHeader, + MonitorPlanSubscriptionKeys keys, + org.ccsds.moims.mo.mps.structures.Plan plan, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PubSub update error is received from a broker + * for the operation monitorPlan. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void monitorPlanNotifyErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PROGRESS acknowledgement is received from a provider + * for the operation queryPlan. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void queryPlanAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PROGRESS update is received from a provider for + * the operation queryPlan. + * + * @param msgHeader msgHeader The header of the received message + * @param queriedPlan The queriedPlan field. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void queryPlanUpdateReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mps.structures.Plan queriedPlan, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PROGRESS response is received from a provider + * for the operation queryPlan. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void queryPlanResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PROGRESS acknowledgement error is received from + * a provider for the operation queryPlan. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void queryPlanAckErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PROGRESS update error is received from a provider + * for the operation queryPlan. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void queryPlanUpdateErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PROGRESS response error is received from a provider + * for the operation queryPlan. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void queryPlanResponseErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response is received from a provider for + * the operation getPartialPlan. + * + * @param msgHeader msgHeader The header of the received message + * @param partialPlan The partialPlan field. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void getPartialPlanResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mps.structures.PartialPlan partialPlan, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response error is received from a provider + * for the operation getPartialPlan. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void getPartialPlanErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + @Override + public final void requestResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALMessageBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mps.plandistribution.PlanDistributionServiceInfo._GETPLANSUMMARIES_OP_NUMBER: + getPlanSummariesResponseReceived(msgHeader, + (org.ccsds.moims.mo.mps.structures.PlanSummaryStatusList) body.getBodyElement(0, new org.ccsds.moims.mo.mps.structures.PlanSummaryStatusList()), qosProperties); + break; + case org.ccsds.moims.mo.mps.plandistribution.PlanDistributionServiceInfo._GETPLANSTATUS_OP_NUMBER: + getPlanStatusResponseReceived(msgHeader, + (org.ccsds.moims.mo.mps.structures.PlanUpdateList) body.getBodyElement(0, new org.ccsds.moims.mo.mps.structures.PlanUpdateList()), qosProperties); + break; + case org.ccsds.moims.mo.mps.plandistribution.PlanDistributionServiceInfo._GETPARTIALPLAN_OP_NUMBER: + getPartialPlanResponseReceived(msgHeader, + (org.ccsds.moims.mo.mps.structures.PartialPlan) body.getBodyElement(0, new org.ccsds.moims.mo.mps.structures.PartialPlan()), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void requestErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALErrorBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mps.plandistribution.PlanDistributionServiceInfo._GETPLANSUMMARIES_OP_NUMBER: + getPlanSummariesErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mps.plandistribution.PlanDistributionServiceInfo._GETPLANSTATUS_OP_NUMBER: + getPlanStatusErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mps.plandistribution.PlanDistributionServiceInfo._GETPARTIALPLAN_OP_NUMBER: + getPartialPlanErrorReceived(msgHeader, body.getError(), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void progressAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALMessageBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mps.plandistribution.PlanDistributionServiceInfo._GETPLAN_OP_NUMBER: + getPlanAckReceived(msgHeader, qosProperties); + break; + case org.ccsds.moims.mo.mps.plandistribution.PlanDistributionServiceInfo._QUERYPLAN_OP_NUMBER: + queryPlanAckReceived(msgHeader, qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void progressAckErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALErrorBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mps.plandistribution.PlanDistributionServiceInfo._GETPLAN_OP_NUMBER: + getPlanAckErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mps.plandistribution.PlanDistributionServiceInfo._QUERYPLAN_OP_NUMBER: + queryPlanAckErrorReceived(msgHeader, body.getError(), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void progressUpdateReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALMessageBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mps.plandistribution.PlanDistributionServiceInfo._GETPLAN_OP_NUMBER: + getPlanUpdateReceived(msgHeader, + (org.ccsds.moims.mo.mps.structures.Plan) body.getBodyElement(0, new org.ccsds.moims.mo.mps.structures.Plan()), qosProperties); + break; + case org.ccsds.moims.mo.mps.plandistribution.PlanDistributionServiceInfo._QUERYPLAN_OP_NUMBER: + queryPlanUpdateReceived(msgHeader, + (org.ccsds.moims.mo.mps.structures.Plan) body.getBodyElement(0, new org.ccsds.moims.mo.mps.structures.Plan()), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void progressUpdateErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALErrorBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mps.plandistribution.PlanDistributionServiceInfo._GETPLAN_OP_NUMBER: + getPlanUpdateErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mps.plandistribution.PlanDistributionServiceInfo._QUERYPLAN_OP_NUMBER: + queryPlanUpdateErrorReceived(msgHeader, body.getError(), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void progressResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALMessageBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mps.plandistribution.PlanDistributionServiceInfo._GETPLAN_OP_NUMBER: + getPlanResponseReceived(msgHeader, qosProperties); + break; + case org.ccsds.moims.mo.mps.plandistribution.PlanDistributionServiceInfo._QUERYPLAN_OP_NUMBER: + queryPlanResponseReceived(msgHeader, qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void progressResponseErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALErrorBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mps.plandistribution.PlanDistributionServiceInfo._GETPLAN_OP_NUMBER: + getPlanResponseErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mps.plandistribution.PlanDistributionServiceInfo._QUERYPLAN_OP_NUMBER: + queryPlanResponseErrorReceived(msgHeader, body.getError(), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void registerAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mps.plandistribution.PlanDistributionServiceInfo._MONITORPLANSTATUS_OP_NUMBER: + monitorPlanStatusRegisterAckReceived(msgHeader, qosProperties); + break; + case org.ccsds.moims.mo.mps.plandistribution.PlanDistributionServiceInfo._MONITORPLAN_OP_NUMBER: + monitorPlanRegisterAckReceived(msgHeader, qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void registerErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALErrorBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mps.plandistribution.PlanDistributionServiceInfo._MONITORPLANSTATUS_OP_NUMBER: + monitorPlanStatusRegisterErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mps.plandistribution.PlanDistributionServiceInfo._MONITORPLAN_OP_NUMBER: + monitorPlanRegisterErrorReceived(msgHeader, body.getError(), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void notifyReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALNotifyBody body, + org.ccsds.moims.mo.mal.structures.IdentifierList selectedKeys, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + if ((org.ccsds.moims.mo.mps.MPSHelper.MPS_AREA_NUMBER.equals(msgHeader.getServiceArea())) && (org.ccsds.moims.mo.mps.plandistribution.PlanDistributionServiceInfo.PLANDISTRIBUTION_SERVICE_NUMBER.equals(msgHeader.getService()))) { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mps.plandistribution.PlanDistributionServiceInfo._MONITORPLANSTATUS_OP_NUMBER: + monitorPlanStatusNotifyReceived(msgHeader, + (org.ccsds.moims.mo.mal.structures.Identifier) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.Identifier()), + (org.ccsds.moims.mo.mal.structures.UpdateHeader) body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.UpdateHeader()), + new MonitorPlanStatusSubscriptionKeys((org.ccsds.moims.mo.mal.structures.UpdateHeader) body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.UpdateHeader()), selectedKeys), + (org.ccsds.moims.mo.mps.structures.PlanUpdate) body.getBodyElement(2, new org.ccsds.moims.mo.mps.structures.PlanUpdate()), qosProperties); + break; + case org.ccsds.moims.mo.mps.plandistribution.PlanDistributionServiceInfo._MONITORPLAN_OP_NUMBER: + monitorPlanNotifyReceived(msgHeader, + (org.ccsds.moims.mo.mal.structures.Identifier) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.Identifier()), + (org.ccsds.moims.mo.mal.structures.UpdateHeader) body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.UpdateHeader()), + new MonitorPlanSubscriptionKeys((org.ccsds.moims.mo.mal.structures.UpdateHeader) body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.UpdateHeader()), selectedKeys), + (org.ccsds.moims.mo.mps.structures.Plan) body.getBodyElement(2, new org.ccsds.moims.mo.mps.structures.Plan()), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + else { + notifyReceivedFromOtherService(msgHeader, body, qosProperties); + } + } + + @Override + public final void notifyErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALErrorBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mps.plandistribution.PlanDistributionServiceInfo._MONITORPLANSTATUS_OP_NUMBER: + monitorPlanStatusNotifyErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mps.plandistribution.PlanDistributionServiceInfo._MONITORPLAN_OP_NUMBER: + monitorPlanNotifyErrorReceived(msgHeader, body.getError(), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void deregisterAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mps.plandistribution.PlanDistributionServiceInfo._MONITORPLANSTATUS_OP_NUMBER: + monitorPlanStatusDeregisterAckReceived(msgHeader, qosProperties); + break; + case org.ccsds.moims.mo.mps.plandistribution.PlanDistributionServiceInfo._MONITORPLAN_OP_NUMBER: + monitorPlanDeregisterAckReceived(msgHeader, qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + /** + * Called by the MAL when a PubSub update from another service is received + * from a broker. + * + * @param msgHeader msgHeader The header of the received message + * @param body body The body of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + * @throws org.ccsds.moims.mo.mal.MALException if an error is detected processing the message. + */ + public void notifyReceivedFromOtherService(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALNotifyBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/plandistribution/consumer/PlanDistributionStub.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/plandistribution/consumer/PlanDistributionStub.java new file mode 100644 index 00000000..7e29710d --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/plandistribution/consumer/PlanDistributionStub.java @@ -0,0 +1,382 @@ +package org.ccsds.moims.mo.mps.plandistribution.consumer; + +/** + * Consumer stub for PlanDistribution service. + */ +public class PlanDistributionStub { + + /** + * The consumer field. + */ + private final org.ccsds.moims.mo.mal.consumer.MALConsumer consumer; + + /** + * Wraps a MALconsumer connection with service specific methods that map from + * the high level service API to the generic MAL API. + * + * @param consumer consumer The MALConsumer to use in this stub. + */ + public PlanDistributionStub(org.ccsds.moims.mo.mal.consumer.MALConsumer consumer) { + this.consumer = consumer; + } + + /** + * Returns the internal MAL consumer object used for sending of messages from + * this interface. + * + * @return The MAL consumer object. + */ + public org.ccsds.moims.mo.mal.consumer.MALConsumer getConsumer() { + return consumer; + } + + /** + * The getPlanSummaries operation allows consumers to obtain a filtered list + * of currently available Plans. The request uses the PlanFilter structure + * to select the set of plans of interest, using the following keys: Domain + * of the Plan; Reference to the Plan; Reference to the precursor Plan of + * the Plan; Current status of the Plan; Originator of the Plan; Validity + * period of the Plan (as a time window). The response returns a list of PlanSummaryStatus + * structures containing references to the identities, descriptive header + * fields, and status of the Plans that match the filter. + * + * @param planFilter The planFilter field. + * @return The return value of the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mps.structures.PlanSummaryStatusList getPlanSummaries(org.ccsds.moims.mo.mps.structures.PlanFilter planFilter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + org.ccsds.moims.mo.mal.transport.MALMessageBody body = consumer.request(org.ccsds.moims.mo.mps.plandistribution.PlanDistributionServiceInfo.GETPLANSUMMARIES_OP, planFilter); + Object body0 = (Object) body.getBodyElement(0, new org.ccsds.moims.mo.mps.structures.PlanSummaryStatusList()); + return (org.ccsds.moims.mo.mps.structures.PlanSummaryStatusList) body0; + } + + /** + * Asynchronous version of method getPlanSummaries. + * + * @param planFilter The planFilter field. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncGetPlanSummaries(org.ccsds.moims.mo.mps.structures.PlanFilter planFilter, + org.ccsds.moims.mo.mps.plandistribution.consumer.PlanDistributionAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncRequest(org.ccsds.moims.mo.mps.plandistribution.PlanDistributionServiceInfo.GETPLANSUMMARIES_OP, adapter, planFilter); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueGetPlanSummaries(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mps.plandistribution.consumer.PlanDistributionAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mps.plandistribution.PlanDistributionServiceInfo.GETPLANSUMMARIES_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The getPlan operation is used to obtain the full content of one or more + * known Plans. The operation uses the Progress interaction pattern, to allow + * the response to be spread across multiple messages. + * + * @param planRefs The planRefs field. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void getPlan(org.ccsds.moims.mo.mal.structures.ObjectRefList planRefs, + org.ccsds.moims.mo.mps.plandistribution.consumer.PlanDistributionAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.progress(org.ccsds.moims.mo.mps.plandistribution.PlanDistributionServiceInfo.GETPLAN_OP, adapter, planRefs); + } + + /** + * Asynchronous version of method getPlan. + * + * @param planRefs The planRefs field. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncGetPlan(org.ccsds.moims.mo.mal.structures.ObjectRefList planRefs, + org.ccsds.moims.mo.mps.plandistribution.consumer.PlanDistributionAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncProgress(org.ccsds.moims.mo.mps.plandistribution.PlanDistributionServiceInfo.GETPLAN_OP, adapter, planRefs); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueGetPlan(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mps.plandistribution.consumer.PlanDistributionAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mps.plandistribution.PlanDistributionServiceInfo.GETPLAN_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The getPlanStatus operation is used to obtain the current status of one + * or more known Plans. The operation uses the Request interaction pattern. + * + * @param planRefs The planRefs field. + * @return The return value of the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mps.structures.PlanUpdateList getPlanStatus(org.ccsds.moims.mo.mal.structures.ObjectRefList planRefs) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + org.ccsds.moims.mo.mal.transport.MALMessageBody body = consumer.request(org.ccsds.moims.mo.mps.plandistribution.PlanDistributionServiceInfo.GETPLANSTATUS_OP, planRefs); + Object body0 = (Object) body.getBodyElement(0, new org.ccsds.moims.mo.mps.structures.PlanUpdateList()); + return (org.ccsds.moims.mo.mps.structures.PlanUpdateList) body0; + } + + /** + * Asynchronous version of method getPlanStatus. + * + * @param planRefs The planRefs field. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncGetPlanStatus(org.ccsds.moims.mo.mal.structures.ObjectRefList planRefs, + org.ccsds.moims.mo.mps.plandistribution.consumer.PlanDistributionAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncRequest(org.ccsds.moims.mo.mps.plandistribution.PlanDistributionServiceInfo.GETPLANSTATUS_OP, adapter, planRefs); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueGetPlanStatus(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mps.plandistribution.consumer.PlanDistributionAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mps.plandistribution.PlanDistributionServiceInfo.GETPLANSTATUS_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * Register method for the monitorPlanStatus PubSub interaction. + * + * @param subscription subscription the subscription to register for + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void monitorPlanStatusRegister(org.ccsds.moims.mo.mal.structures.Subscription subscription, + org.ccsds.moims.mo.mps.plandistribution.consumer.PlanDistributionAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.register(org.ccsds.moims.mo.mps.plandistribution.PlanDistributionServiceInfo.MONITORPLANSTATUS_OP, subscription, adapter); + } + + /** + * Asynchronous version of method monitorPlanStatusRegister. + * + * @param subscription subscription the subscription to register for + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncMonitorPlanStatusRegister(org.ccsds.moims.mo.mal.structures.Subscription subscription, + org.ccsds.moims.mo.mps.plandistribution.consumer.PlanDistributionAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncRegister(org.ccsds.moims.mo.mps.plandistribution.PlanDistributionServiceInfo.MONITORPLANSTATUS_OP, subscription, adapter); + } + + /** + * Deregister method for the monitorPlanStatus PubSub interaction. + * + * @param identifierList identifierList the subscription identifiers to deregister + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void monitorPlanStatusDeregister(org.ccsds.moims.mo.mal.structures.IdentifierList identifierList) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.deregister(org.ccsds.moims.mo.mps.plandistribution.PlanDistributionServiceInfo.MONITORPLANSTATUS_OP, identifierList); + } + + /** + * Asynchronous version of method monitorPlanStatusDeregister. + * + * @param identifierList identifierList the subscription identifiers to deregister + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncMonitorPlanStatusDeregister(org.ccsds.moims.mo.mal.structures.IdentifierList identifierList, + org.ccsds.moims.mo.mps.plandistribution.consumer.PlanDistributionAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncDeregister(org.ccsds.moims.mo.mps.plandistribution.PlanDistributionServiceInfo.MONITORPLANSTATUS_OP, identifierList, adapter); + } + + /** + * Register method for the monitorPlan PubSub interaction. + * + * @param subscription subscription the subscription to register for + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void monitorPlanRegister(org.ccsds.moims.mo.mal.structures.Subscription subscription, + org.ccsds.moims.mo.mps.plandistribution.consumer.PlanDistributionAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.register(org.ccsds.moims.mo.mps.plandistribution.PlanDistributionServiceInfo.MONITORPLAN_OP, subscription, adapter); + } + + /** + * Asynchronous version of method monitorPlanRegister. + * + * @param subscription subscription the subscription to register for + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncMonitorPlanRegister(org.ccsds.moims.mo.mal.structures.Subscription subscription, + org.ccsds.moims.mo.mps.plandistribution.consumer.PlanDistributionAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncRegister(org.ccsds.moims.mo.mps.plandistribution.PlanDistributionServiceInfo.MONITORPLAN_OP, subscription, adapter); + } + + /** + * Deregister method for the monitorPlan PubSub interaction. + * + * @param identifierList identifierList the subscription identifiers to deregister + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void monitorPlanDeregister(org.ccsds.moims.mo.mal.structures.IdentifierList identifierList) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.deregister(org.ccsds.moims.mo.mps.plandistribution.PlanDistributionServiceInfo.MONITORPLAN_OP, identifierList); + } + + /** + * Asynchronous version of method monitorPlanDeregister. + * + * @param identifierList identifierList the subscription identifiers to deregister + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncMonitorPlanDeregister(org.ccsds.moims.mo.mal.structures.IdentifierList identifierList, + org.ccsds.moims.mo.mps.plandistribution.consumer.PlanDistributionAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncDeregister(org.ccsds.moims.mo.mps.plandistribution.PlanDistributionServiceInfo.MONITORPLAN_OP, identifierList, adapter); + } + + /** + * The queryPlan operation enables a consumer to retrieve a filtered set of + * plans, based on an extended set of filter criteria, including relevant + * fields of the plan information sections of the plan, as well as the type + * of planning activities and planning events contained within the plan. + * + * @param query The query field. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void queryPlan(org.ccsds.moims.mo.mps.structures.PlanQuery query, + org.ccsds.moims.mo.mps.plandistribution.consumer.PlanDistributionAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.progress(org.ccsds.moims.mo.mps.plandistribution.PlanDistributionServiceInfo.QUERYPLAN_OP, adapter, query); + } + + /** + * Asynchronous version of method queryPlan. + * + * @param query The query field. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncQueryPlan(org.ccsds.moims.mo.mps.structures.PlanQuery query, + org.ccsds.moims.mo.mps.plandistribution.consumer.PlanDistributionAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncProgress(org.ccsds.moims.mo.mps.plandistribution.PlanDistributionServiceInfo.QUERYPLAN_OP, adapter, query); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueQueryPlan(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mps.plandistribution.consumer.PlanDistributionAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mps.plandistribution.PlanDistributionServiceInfo.QUERYPLAN_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The getPartialPlan operation enables a consumer to extract a subset of + * a Plan that meets the supplied partialPlanFilter. The filter can select + * the partial plan content based on: a shorter period than that covered by + * the plan, specified by time, position, or events; a subset of contained + * ActivityInstances, based on their domain, associated SubPlan or tags. The + * PartialPlan returned includes the filter criteria and a version of the + * plan containing only the ActivityInstances that match those criteria. + * It is implementation dependent what is returned in terms of events and + * resources, but it may be assumed that any related events and resources + * would be included in the returned partial plan. + * + * @param partialPlanFilter The partialPlanFilter field. + * @return The return value of the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mps.structures.PartialPlan getPartialPlan(org.ccsds.moims.mo.mps.structures.PartialPlanFilter partialPlanFilter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + org.ccsds.moims.mo.mal.transport.MALMessageBody body = consumer.request(org.ccsds.moims.mo.mps.plandistribution.PlanDistributionServiceInfo.GETPARTIALPLAN_OP, partialPlanFilter); + Object body0 = (Object) body.getBodyElement(0, new org.ccsds.moims.mo.mps.structures.PartialPlan()); + return (org.ccsds.moims.mo.mps.structures.PartialPlan) body0; + } + + /** + * Asynchronous version of method getPartialPlan. + * + * @param partialPlanFilter The partialPlanFilter field. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncGetPartialPlan(org.ccsds.moims.mo.mps.structures.PartialPlanFilter partialPlanFilter, + org.ccsds.moims.mo.mps.plandistribution.consumer.PlanDistributionAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncRequest(org.ccsds.moims.mo.mps.plandistribution.PlanDistributionServiceInfo.GETPARTIALPLAN_OP, adapter, partialPlanFilter); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueGetPartialPlan(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mps.plandistribution.consumer.PlanDistributionAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mps.plandistribution.PlanDistributionServiceInfo.GETPARTIALPLAN_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/plandistribution/consumer/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/plandistribution/consumer/package-info.java new file mode 100644 index 00000000..863ab1db --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/plandistribution/consumer/package-info.java @@ -0,0 +1,4 @@ +/** + * Package containing the consumer stubs for the PlanDistribution service. +*/ +package org.ccsds.moims.mo.mps.plandistribution.consumer; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/plandistribution/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/plandistribution/package-info.java new file mode 100644 index 00000000..7a624fa7 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/plandistribution/package-info.java @@ -0,0 +1,7 @@ +/** + * The Plan Distribution Service, introduced in 2.5.3, is provided by a planning + * function and enables its consumers to access generated plans and to receive + * updates on their status. It comprises the operations defined below, of + * which only those in capability set 1 are mandatory. +*/ +package org.ccsds.moims.mo.mps.plandistribution; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/plandistribution/provider/GetPlanInteraction.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/plandistribution/provider/GetPlanInteraction.java new file mode 100644 index 00000000..7d5d1f25 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/plandistribution/provider/GetPlanInteraction.java @@ -0,0 +1,91 @@ +package org.ccsds.moims.mo.mps.plandistribution.provider; + +/** + * Provider PROGRESS interaction class for PlanDistribution::getPlan operation. + */ +public class GetPlanInteraction { + + /** + * The interaction field. + */ + private org.ccsds.moims.mo.mal.provider.MALProgress interaction; + + /** + * Wraps the provided MAL interaction object with methods for sending responses + * to an PROGRESS interaction from a provider. + * + * @param interaction The MAL interaction action object to use. + */ + public GetPlanInteraction(org.ccsds.moims.mo.mal.provider.MALProgress interaction) { + this.interaction = interaction; + } + + /** + * Returns the MAL interaction object used for returning messages from the + * provider. + * + * @return The MAL interaction object provided in the constructor + */ + public org.ccsds.moims.mo.mal.provider.MALProgress getInteraction() { + return interaction; + } + + /** + * Sends a PROGRESS acknowledge to the consumer. + * + * @return Returns the MAL message created by the acknowledge + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage sendAcknowledgement() throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return interaction.sendAcknowledgement((Object[]) null); + } + + /** + * Sends a PROGRESS update to the consumer. + * + * @param retrievedPlan The retrievedPlan field. + * @return Returns the MAL message created by the update + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage sendUpdate(org.ccsds.moims.mo.mps.structures.Plan retrievedPlan) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return interaction.sendUpdate(retrievedPlan); + } + + /** + * Sends a PROGRESS response to the consumer. + * + * @return Returns the MAL message created by the response + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage sendResponse() throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return interaction.sendResponse((Object[]) null); + } + + /** + * Sends an error to the consumer. + * + * @param error error The MAL error to send to the consumer. + * @return Returns the MAL message created by the error + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage sendError(org.ccsds.moims.mo.mal.MOErrorException error) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return interaction.sendError(error); + } + + /** + * Sends an update error to the consumer. + * + * @param error error The MAL error to send to the consumer. + * @return Returns the MAL message created by the error + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage sendUpdateError(org.ccsds.moims.mo.mal.MOErrorException error) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return interaction.sendUpdateError(error); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/plandistribution/provider/MonitorPlanPublisher.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/plandistribution/provider/MonitorPlanPublisher.java new file mode 100644 index 00000000..9f056f8d --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/plandistribution/provider/MonitorPlanPublisher.java @@ -0,0 +1,123 @@ +package org.ccsds.moims.mo.mps.plandistribution.provider; + +/** + * Publisher class for the monitorPlan operation. + */ +public final class MonitorPlanPublisher { + + /** + * The publisherSet field. + */ + private org.ccsds.moims.mo.mal.provider.MALPublisherSet publisherSet; + + /** + * Creates an instance of this class using the supplied publisher set. + * + * @param publisherSet The set of broker connections to use when registering and publishing. + */ + public MonitorPlanPublisher(org.ccsds.moims.mo.mal.provider.MALPublisherSet publisherSet) { + this.publisherSet = publisherSet; + } + + /** + * Registers this provider implementation to the set of broker connections. + * + * @param keyNames The key names to use in the method + * @param keyTypes The key types to use in the method + * @param listener The listener object to use for callback from the publisher + * @throws java.lang.IllegalArgumentException If any supplied argument is invalid + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void register(org.ccsds.moims.mo.mal.structures.IdentifierList keyNames, + org.ccsds.moims.mo.mal.structures.AttributeTypeList keyTypes, + org.ccsds.moims.mo.mal.provider.MALPublishInteractionListener listener) throws java.lang.IllegalArgumentException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + publisherSet.register(keyNames, keyTypes, listener); + } + + /** + * Registers this provider implementation to the set of broker connections + * with the default subscription keys. + * + * @param listener The listener object to use for callback from the publisher + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void registerWithDefaultKeys(org.ccsds.moims.mo.mal.provider.MALPublishInteractionListener listener) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + org.ccsds.moims.mo.mal.structures.IdentifierList keyNames = new org.ccsds.moims.mo.mal.structures.IdentifierList(); + org.ccsds.moims.mo.mal.structures.AttributeTypeList keyTypes = new org.ccsds.moims.mo.mal.structures.AttributeTypeList(); + keyNames.add(new org.ccsds.moims.mo.mal.structures.Identifier("planID")); + keyTypes.add(org.ccsds.moims.mo.mal.structures.AttributeType.IDENTIFIER); + keyNames.add(new org.ccsds.moims.mo.mal.structures.Identifier("precursor")); + keyTypes.add(org.ccsds.moims.mo.mal.structures.AttributeType.IDENTIFIER); + keyNames.add(new org.ccsds.moims.mo.mal.structures.Identifier("status")); + keyTypes.add(org.ccsds.moims.mo.mal.structures.AttributeType.USHORT); + keyNames.add(new org.ccsds.moims.mo.mal.structures.Identifier("originator")); + keyTypes.add(org.ccsds.moims.mo.mal.structures.AttributeType.IDENTIFIER); + publisherSet.register(keyNames, keyTypes, listener); + } + + /** + * Asynchronously registers this provider implementation to the set of broker + * connections. + * + * @param keyNames The key names to use in the method + * @param keyTypes The key types to use in the method + * @param listener The listener object to use for callback from the publisher + * @throws java.lang.IllegalArgumentException If any supplied argument is invalid + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void asyncRegister(org.ccsds.moims.mo.mal.structures.IdentifierList keyNames, + org.ccsds.moims.mo.mal.structures.AttributeTypeList keyTypes, + org.ccsds.moims.mo.mal.provider.MALPublishInteractionListener listener) throws java.lang.IllegalArgumentException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + publisherSet.asyncRegister(keyNames, keyTypes, listener); + } + + /** + * Publishes updates to the set of registered broker connections. + * + * @param updateHeader The headers of the updates being added + * @param plan The plan field. + * @throws java.lang.IllegalArgumentException If any supplied argument is invalid + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void publish(org.ccsds.moims.mo.mal.structures.UpdateHeader updateHeader, + org.ccsds.moims.mo.mps.structures.Plan plan) throws java.lang.IllegalArgumentException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + publisherSet.publish(updateHeader, plan); + } + + /** + * Deregisters this provider implementation from the set of broker connections. + * + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void deregister() throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + publisherSet.deregister(); + } + + /** + * Asynchronously deregisters this provider implementation from the set of + * broker connections. + * + * @param listener The listener object to use for callback from the publisher + * @throws java.lang.IllegalArgumentException If any supplied argument is invalid + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void asyncDeregister(org.ccsds.moims.mo.mal.provider.MALPublishInteractionListener listener) throws java.lang.IllegalArgumentException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + publisherSet.asyncDeregister(listener); + } + + /** + * Closes this publisher. + * + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void close() throws org.ccsds.moims.mo.mal.MALException { + publisherSet.close(); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/plandistribution/provider/MonitorPlanStatusPublisher.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/plandistribution/provider/MonitorPlanStatusPublisher.java new file mode 100644 index 00000000..aed5f84a --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/plandistribution/provider/MonitorPlanStatusPublisher.java @@ -0,0 +1,123 @@ +package org.ccsds.moims.mo.mps.plandistribution.provider; + +/** + * Publisher class for the monitorPlanStatus operation. + */ +public final class MonitorPlanStatusPublisher { + + /** + * The publisherSet field. + */ + private org.ccsds.moims.mo.mal.provider.MALPublisherSet publisherSet; + + /** + * Creates an instance of this class using the supplied publisher set. + * + * @param publisherSet The set of broker connections to use when registering and publishing. + */ + public MonitorPlanStatusPublisher(org.ccsds.moims.mo.mal.provider.MALPublisherSet publisherSet) { + this.publisherSet = publisherSet; + } + + /** + * Registers this provider implementation to the set of broker connections. + * + * @param keyNames The key names to use in the method + * @param keyTypes The key types to use in the method + * @param listener The listener object to use for callback from the publisher + * @throws java.lang.IllegalArgumentException If any supplied argument is invalid + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void register(org.ccsds.moims.mo.mal.structures.IdentifierList keyNames, + org.ccsds.moims.mo.mal.structures.AttributeTypeList keyTypes, + org.ccsds.moims.mo.mal.provider.MALPublishInteractionListener listener) throws java.lang.IllegalArgumentException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + publisherSet.register(keyNames, keyTypes, listener); + } + + /** + * Registers this provider implementation to the set of broker connections + * with the default subscription keys. + * + * @param listener The listener object to use for callback from the publisher + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void registerWithDefaultKeys(org.ccsds.moims.mo.mal.provider.MALPublishInteractionListener listener) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + org.ccsds.moims.mo.mal.structures.IdentifierList keyNames = new org.ccsds.moims.mo.mal.structures.IdentifierList(); + org.ccsds.moims.mo.mal.structures.AttributeTypeList keyTypes = new org.ccsds.moims.mo.mal.structures.AttributeTypeList(); + keyNames.add(new org.ccsds.moims.mo.mal.structures.Identifier("planID")); + keyTypes.add(org.ccsds.moims.mo.mal.structures.AttributeType.IDENTIFIER); + keyNames.add(new org.ccsds.moims.mo.mal.structures.Identifier("precursor")); + keyTypes.add(org.ccsds.moims.mo.mal.structures.AttributeType.IDENTIFIER); + keyNames.add(new org.ccsds.moims.mo.mal.structures.Identifier("status")); + keyTypes.add(org.ccsds.moims.mo.mal.structures.AttributeType.USHORT); + keyNames.add(new org.ccsds.moims.mo.mal.structures.Identifier("originator")); + keyTypes.add(org.ccsds.moims.mo.mal.structures.AttributeType.IDENTIFIER); + publisherSet.register(keyNames, keyTypes, listener); + } + + /** + * Asynchronously registers this provider implementation to the set of broker + * connections. + * + * @param keyNames The key names to use in the method + * @param keyTypes The key types to use in the method + * @param listener The listener object to use for callback from the publisher + * @throws java.lang.IllegalArgumentException If any supplied argument is invalid + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void asyncRegister(org.ccsds.moims.mo.mal.structures.IdentifierList keyNames, + org.ccsds.moims.mo.mal.structures.AttributeTypeList keyTypes, + org.ccsds.moims.mo.mal.provider.MALPublishInteractionListener listener) throws java.lang.IllegalArgumentException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + publisherSet.asyncRegister(keyNames, keyTypes, listener); + } + + /** + * Publishes updates to the set of registered broker connections. + * + * @param updateHeader The headers of the updates being added + * @param planUpdate The planUpdate field. + * @throws java.lang.IllegalArgumentException If any supplied argument is invalid + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void publish(org.ccsds.moims.mo.mal.structures.UpdateHeader updateHeader, + org.ccsds.moims.mo.mps.structures.PlanUpdate planUpdate) throws java.lang.IllegalArgumentException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + publisherSet.publish(updateHeader, planUpdate); + } + + /** + * Deregisters this provider implementation from the set of broker connections. + * + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void deregister() throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + publisherSet.deregister(); + } + + /** + * Asynchronously deregisters this provider implementation from the set of + * broker connections. + * + * @param listener The listener object to use for callback from the publisher + * @throws java.lang.IllegalArgumentException If any supplied argument is invalid + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void asyncDeregister(org.ccsds.moims.mo.mal.provider.MALPublishInteractionListener listener) throws java.lang.IllegalArgumentException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + publisherSet.asyncDeregister(listener); + } + + /** + * Closes this publisher. + * + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void close() throws org.ccsds.moims.mo.mal.MALException { + publisherSet.close(); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/plandistribution/provider/PlanDistributionHandler.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/plandistribution/provider/PlanDistributionHandler.java new file mode 100644 index 00000000..cfcde983 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/plandistribution/provider/PlanDistributionHandler.java @@ -0,0 +1,73 @@ +package org.ccsds.moims.mo.mps.plandistribution.provider; + +/** + * Interface that providers of the PlanDistribution service must implement + * to handle the operations of that service. + */ +public interface PlanDistributionHandler { + + /** + * Implements the operation getPlanSummaries. + * + * @param planFilter The planFilter field. + * @param interaction The MAL object representing the interaction in the provider. + * @return The return value of the operation + * @throws org.ccsds.moims.mo.mps.InvalidException One or more fields in the message contain invalid values. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + org.ccsds.moims.mo.mps.structures.PlanSummaryStatusList getPlanSummaries(org.ccsds.moims.mo.mps.structures.PlanFilter planFilter, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mps.InvalidException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation getPlan. + * + * @param planRefs The planRefs field. + * @param interaction The MAL object representing the interaction in the provider. + * @throws org.ccsds.moims.mo.mps.InvalidException One or more fields in the message contain invalid values. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + void getPlan(org.ccsds.moims.mo.mal.structures.ObjectRefList planRefs, + org.ccsds.moims.mo.mps.plandistribution.provider.GetPlanInteraction interaction) throws org.ccsds.moims.mo.mps.InvalidException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation getPlanStatus. + * + * @param planRefs The planRefs field. + * @param interaction The MAL object representing the interaction in the provider. + * @return The return value of the operation + * @throws org.ccsds.moims.mo.mps.InvalidException One or more fields in the message contain invalid values. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + org.ccsds.moims.mo.mps.structures.PlanUpdateList getPlanStatus(org.ccsds.moims.mo.mal.structures.ObjectRefList planRefs, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mps.InvalidException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation queryPlan. + * + * @param query The query field. + * @param interaction The MAL object representing the interaction in the provider. + * @throws org.ccsds.moims.mo.mps.InvalidException One or more fields in the message contain invalid values. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + void queryPlan(org.ccsds.moims.mo.mps.structures.PlanQuery query, + org.ccsds.moims.mo.mps.plandistribution.provider.QueryPlanInteraction interaction) throws org.ccsds.moims.mo.mps.InvalidException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation getPartialPlan. + * + * @param partialPlanFilter The partialPlanFilter field. + * @param interaction The MAL object representing the interaction in the provider. + * @return The return value of the operation + * @throws org.ccsds.moims.mo.mps.InvalidException One or more fields in the message contain invalid values. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + org.ccsds.moims.mo.mps.structures.PartialPlan getPartialPlan(org.ccsds.moims.mo.mps.structures.PartialPlanFilter partialPlanFilter, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mps.InvalidException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Sets the skeleton to be used for creation of publishers. + * + * @param skeleton The skeleton to be used. + */ + void setSkeleton(org.ccsds.moims.mo.mps.plandistribution.provider.PlanDistributionSkeleton skeleton); +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/plandistribution/provider/PlanDistributionInheritanceSkeleton.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/plandistribution/provider/PlanDistributionInheritanceSkeleton.java new file mode 100644 index 00000000..374626b9 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/plandistribution/provider/PlanDistributionInheritanceSkeleton.java @@ -0,0 +1,151 @@ +package org.ccsds.moims.mo.mps.plandistribution.provider; + +/** + * Provider Inheritance skeleton for PlanDistributionInheritanceSkeleton service. + */ +public abstract class PlanDistributionInheritanceSkeleton implements org.ccsds.moims.mo.mal.provider.MALInteractionHandler, org.ccsds.moims.mo.mps.plandistribution.provider.PlanDistributionSkeleton, org.ccsds.moims.mo.mps.plandistribution.provider.PlanDistributionHandler { + + /** + * The providerSet field. + */ + private org.ccsds.moims.mo.mal.provider.MALProviderSet providerSet = new org.ccsds.moims.mo.mal.provider.MALProviderSet(org.ccsds.moims.mo.mps.plandistribution.PlanDistributionHelper.PLANDISTRIBUTION_SERVICE); + + /** + * Returns the connection object for this provider. + * + * @return the connection object for this provider + * @throws java.io.IOException if the method was not implemented yet. + */ + public org.ccsds.moims.mo.mal.helpertools.connections.ConnectionProvider getConnection() throws java.io.IOException { + throw new java.io.IOException("This method needs to be overridden!"); + } + + @Override + public void setSkeleton(org.ccsds.moims.mo.mps.plandistribution.provider.PlanDistributionSkeleton skeleton) { + // Not used in the inheritance pattern (the skeleton is 'this'); + } + + @Override + public void malInitialize(org.ccsds.moims.mo.mal.provider.MALProvider provider) throws org.ccsds.moims.mo.mal.MALException { + providerSet.addProvider(provider); + } + + @Override + public void malFinalize(org.ccsds.moims.mo.mal.provider.MALProvider provider) throws org.ccsds.moims.mo.mal.MALException { + providerSet.removeProvider(provider); + } + + @Override + public org.ccsds.moims.mo.mps.plandistribution.provider.MonitorPlanStatusPublisher createMonitorPlanStatusPublisher(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.Identifier networkZone, + org.ccsds.moims.mo.mal.structures.SessionType sessionType, + org.ccsds.moims.mo.mal.structures.Identifier sessionName, + org.ccsds.moims.mo.mal.structures.QoSLevel qos, + java.util.Map qosProps, + org.ccsds.moims.mo.mal.structures.UInteger priority) throws org.ccsds.moims.mo.mal.MALException { + return new org.ccsds.moims.mo.mps.plandistribution.provider.MonitorPlanStatusPublisher(providerSet.createPublisherSet(org.ccsds.moims.mo.mps.plandistribution.PlanDistributionServiceInfo.MONITORPLANSTATUS_OP, domain, sessionType, sessionName, qos, qosProps, null)); + } + + @Override + public org.ccsds.moims.mo.mps.plandistribution.provider.MonitorPlanPublisher createMonitorPlanPublisher(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.Identifier networkZone, + org.ccsds.moims.mo.mal.structures.SessionType sessionType, + org.ccsds.moims.mo.mal.structures.Identifier sessionName, + org.ccsds.moims.mo.mal.structures.QoSLevel qos, + java.util.Map qosProps, + org.ccsds.moims.mo.mal.structures.UInteger priority) throws org.ccsds.moims.mo.mal.MALException { + return new org.ccsds.moims.mo.mps.plandistribution.provider.MonitorPlanPublisher(providerSet.createPublisherSet(org.ccsds.moims.mo.mps.plandistribution.PlanDistributionServiceInfo.MONITORPLAN_OP, domain, sessionType, sessionName, qos, qosProps, null)); + } + + @Override + public void handleSend(org.ccsds.moims.mo.mal.provider.MALInteraction interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + switch (opNumber) { + default: + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } + + @Override + public void handleSubmit(org.ccsds.moims.mo.mal.provider.MALSubmit interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + switch (opNumber) { + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } + + @Override + public void handleRequest(org.ccsds.moims.mo.mal.provider.MALRequest interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + try { + switch (opNumber) { + case org.ccsds.moims.mo.mps.plandistribution.PlanDistributionServiceInfo._GETPLANSUMMARIES_OP_NUMBER: + interaction.sendResponse(getPlanSummaries((org.ccsds.moims.mo.mps.structures.PlanFilter) body.getBodyElement(0, new org.ccsds.moims.mo.mps.structures.PlanFilter()), + interaction)); + break; + case org.ccsds.moims.mo.mps.plandistribution.PlanDistributionServiceInfo._GETPLANSTATUS_OP_NUMBER: + interaction.sendResponse(getPlanStatus((org.ccsds.moims.mo.mal.structures.ObjectRefList) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.ObjectRefList()), + interaction)); + break; + case org.ccsds.moims.mo.mps.plandistribution.PlanDistributionServiceInfo._GETPARTIALPLAN_OP_NUMBER: + interaction.sendResponse(getPartialPlan((org.ccsds.moims.mo.mps.structures.PartialPlanFilter) body.getBodyElement(0, new org.ccsds.moims.mo.mps.structures.PartialPlanFilter()), + interaction)); + break; + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } catch (org.ccsds.moims.mo.mal.MOErrorException error) { + throw new org.ccsds.moims.mo.mal.MALInteractionException(error); + } + } + + @Override + public void handleInvoke(org.ccsds.moims.mo.mal.provider.MALInvoke interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + switch (opNumber) { + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } + + @Override + public void handleProgress(org.ccsds.moims.mo.mal.provider.MALProgress interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + try { + switch (opNumber) { + case org.ccsds.moims.mo.mps.plandistribution.PlanDistributionServiceInfo._GETPLAN_OP_NUMBER: + getPlan((org.ccsds.moims.mo.mal.structures.ObjectRefList) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.ObjectRefList()), + new GetPlanInteraction(interaction)); + break; + case org.ccsds.moims.mo.mps.plandistribution.PlanDistributionServiceInfo._QUERYPLAN_OP_NUMBER: + queryPlan((org.ccsds.moims.mo.mps.structures.PlanQuery) body.getBodyElement(0, new org.ccsds.moims.mo.mps.structures.PlanQuery()), + new QueryPlanInteraction(interaction)); + break; + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } catch (org.ccsds.moims.mo.mal.MOErrorException error) { + throw new org.ccsds.moims.mo.mal.MALInteractionException(error); + } + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/plandistribution/provider/PlanDistributionSkeleton.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/plandistribution/provider/PlanDistributionSkeleton.java new file mode 100644 index 00000000..6bff1edd --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/plandistribution/provider/PlanDistributionSkeleton.java @@ -0,0 +1,50 @@ +package org.ccsds.moims.mo.mps.plandistribution.provider; + +/** + * The skeleton interface for the PlanDistribution service. + */ +public interface PlanDistributionSkeleton { + + /** + * Creates a publisher object using the current registered provider set for + * the PubSub operation monitorPlanStatus. + * + * @param domain The domain used for publishing + * @param networkZone ~The network zone used for publishing + * @param sessionType The session used for publishing + * @param sessionName The session name used for publishing + * @param qos The QoS used for publishing + * @param qosProps The QoS properties used for publishing + * @param priority The priority used for publishing + * @return The new publisher object. + * @throws org.ccsds.moims.mo.mal.MALException if a problem is detected during creation of the publisher + */ + org.ccsds.moims.mo.mps.plandistribution.provider.MonitorPlanStatusPublisher createMonitorPlanStatusPublisher(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.Identifier networkZone, + org.ccsds.moims.mo.mal.structures.SessionType sessionType, + org.ccsds.moims.mo.mal.structures.Identifier sessionName, + org.ccsds.moims.mo.mal.structures.QoSLevel qos, + java.util.Map qosProps, + org.ccsds.moims.mo.mal.structures.UInteger priority) throws org.ccsds.moims.mo.mal.MALException; + /** + * Creates a publisher object using the current registered provider set for + * the PubSub operation monitorPlan. + * + * @param domain The domain used for publishing + * @param networkZone ~The network zone used for publishing + * @param sessionType The session used for publishing + * @param sessionName The session name used for publishing + * @param qos The QoS used for publishing + * @param qosProps The QoS properties used for publishing + * @param priority The priority used for publishing + * @return The new publisher object. + * @throws org.ccsds.moims.mo.mal.MALException if a problem is detected during creation of the publisher + */ + org.ccsds.moims.mo.mps.plandistribution.provider.MonitorPlanPublisher createMonitorPlanPublisher(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.Identifier networkZone, + org.ccsds.moims.mo.mal.structures.SessionType sessionType, + org.ccsds.moims.mo.mal.structures.Identifier sessionName, + org.ccsds.moims.mo.mal.structures.QoSLevel qos, + java.util.Map qosProps, + org.ccsds.moims.mo.mal.structures.UInteger priority) throws org.ccsds.moims.mo.mal.MALException; +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/plandistribution/provider/QueryPlanInteraction.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/plandistribution/provider/QueryPlanInteraction.java new file mode 100644 index 00000000..9c7913ea --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/plandistribution/provider/QueryPlanInteraction.java @@ -0,0 +1,91 @@ +package org.ccsds.moims.mo.mps.plandistribution.provider; + +/** + * Provider PROGRESS interaction class for PlanDistribution::queryPlan operation. + */ +public class QueryPlanInteraction { + + /** + * The interaction field. + */ + private org.ccsds.moims.mo.mal.provider.MALProgress interaction; + + /** + * Wraps the provided MAL interaction object with methods for sending responses + * to an PROGRESS interaction from a provider. + * + * @param interaction The MAL interaction action object to use. + */ + public QueryPlanInteraction(org.ccsds.moims.mo.mal.provider.MALProgress interaction) { + this.interaction = interaction; + } + + /** + * Returns the MAL interaction object used for returning messages from the + * provider. + * + * @return The MAL interaction object provided in the constructor + */ + public org.ccsds.moims.mo.mal.provider.MALProgress getInteraction() { + return interaction; + } + + /** + * Sends a PROGRESS acknowledge to the consumer. + * + * @return Returns the MAL message created by the acknowledge + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage sendAcknowledgement() throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return interaction.sendAcknowledgement((Object[]) null); + } + + /** + * Sends a PROGRESS update to the consumer. + * + * @param queriedPlan The queriedPlan field. + * @return Returns the MAL message created by the update + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage sendUpdate(org.ccsds.moims.mo.mps.structures.Plan queriedPlan) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return interaction.sendUpdate(queriedPlan); + } + + /** + * Sends a PROGRESS response to the consumer. + * + * @return Returns the MAL message created by the response + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage sendResponse() throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return interaction.sendResponse((Object[]) null); + } + + /** + * Sends an error to the consumer. + * + * @param error error The MAL error to send to the consumer. + * @return Returns the MAL message created by the error + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage sendError(org.ccsds.moims.mo.mal.MOErrorException error) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return interaction.sendError(error); + } + + /** + * Sends an update error to the consumer. + * + * @param error error The MAL error to send to the consumer. + * @return Returns the MAL message created by the error + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage sendUpdateError(org.ccsds.moims.mo.mal.MOErrorException error) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return interaction.sendUpdateError(error); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/plandistribution/provider/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/plandistribution/provider/package-info.java new file mode 100644 index 00000000..35cb52a7 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/plandistribution/provider/package-info.java @@ -0,0 +1,4 @@ +/** + * Package containing the provider skeletons for the PlanDistribution service. +*/ +package org.ccsds.moims.mo.mps.plandistribution.provider; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planedit/PlanEditHelper.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planedit/PlanEditHelper.java new file mode 100644 index 00000000..43d4e6c6 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planedit/PlanEditHelper.java @@ -0,0 +1,17 @@ +package org.ccsds.moims.mo.mps.planedit; + +/** + * Helper class for PlanEdit service. + */ +public class PlanEditHelper { + + /** + * Service singleton instance. + */ + public static final org.ccsds.moims.mo.mps.planedit.PlanEditServiceInfo PLANEDIT_SERVICE = new org.ccsds.moims.mo.mps.planedit.PlanEditServiceInfo(); + + private PlanEditHelper() { + // Utility class; not meant to be instantiated. + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planedit/PlanEditServiceInfo.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planedit/PlanEditServiceInfo.java new file mode 100644 index 00000000..3a3d3e25 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planedit/PlanEditServiceInfo.java @@ -0,0 +1,318 @@ +package org.ccsds.moims.mo.mps.planedit; + +/** + * Helper class for PlanEdit service. + */ +public class PlanEditServiceInfo extends org.ccsds.moims.mo.mal.ServiceInfo { + + /** + * Service number literal. + */ + public static final int _PLANEDIT_SERVICE_NUMBER = 5; + + /** + * Service number instance. + */ + public static final org.ccsds.moims.mo.mal.structures.UShort PLANEDIT_SERVICE_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_PLANEDIT_SERVICE_NUMBER); + + /** + * Service name constant. + */ + public static final org.ccsds.moims.mo.mal.structures.Identifier PLANEDIT_SERVICE_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("PlanEdit"); + + /** + * The service key of this service. + */ + private static final org.ccsds.moims.mo.mal.ServiceKey SERVICE_KEY = new org.ccsds.moims.mo.mal.ServiceKey( + 5, 1, PLANEDIT_SERVICE_NUMBER); + + /** + * Operation number literal for operation UPDATEPLANSTATUS. + */ + public static final int _UPDATEPLANSTATUS_OP_NUMBER = 1; + + /** + * Operation number instance for operation UPDATEPLANSTATUS. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort UPDATEPLANSTATUS_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_UPDATEPLANSTATUS_OP_NUMBER); + + /** + * Operation instance for operation UPDATEPLANSTATUS. + */ + public static final org.ccsds.moims.mo.mal.MALSubmitOperation UPDATEPLANSTATUS_OP = new org.ccsds.moims.mo.mal.MALSubmitOperation(SERVICE_KEY, + UPDATEPLANSTATUS_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("updatePlanStatus"), + new org.ccsds.moims.mo.mal.structures.UShort(1), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("planRef", false, org.ccsds.moims.mo.mal.structures.ObjectRef.OBJECTREF_SHORT_FORM, ""), + new org.ccsds.moims.mo.mal.OperationField("status", false, org.ccsds.moims.mo.mps.structures.PlanStatusEnum.SHORT_FORM, ""), + new org.ccsds.moims.mo.mal.OperationField("isAlternate", false, org.ccsds.moims.mo.mal.structures.Attribute.BOOLEAN_SHORT_FORM, "")}, + "The updatePlanStatus operation may be used to modify the status of a previously submitted Plan. Directly modifying the status field of a Plan may be used by a third party function to autonomously terminate (or activate) a Plan, but the operation also allows the isAlternate flag to be set or cleared. It is implementation dependent what action the service provider takes in response to a change of Plan status. The service provider may not permit certain state changes (for example to modify the status of a TERMINATED plan, which is inconsistent with the plan status model), in which case an UPDATE_FAILED error shall be returned. A set of Plans with a common precursor may be submitted to a plan execution function to cater for alternative or contingency scenarios. All but one of these Plans should have the isAlternate flag set, to inform the plan execution function (and the mission operations team) which is the nominal Plan. It is implementation dependent whether a plan execution control service provider will allow a Plan to be activated with the isAlternate flag set, but for operational safety reasons this may be blocked. In a contingency scenario, the updatePlanStatus operation can be used to set the flag on the nominal Plan, and reset the flag on the required contingency Plan, making it operational."); + + /** + * Operation number literal for operation INSERTACTIVITY. + */ + public static final int _INSERTACTIVITY_OP_NUMBER = 2; + + /** + * Operation number instance for operation INSERTACTIVITY. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort INSERTACTIVITY_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_INSERTACTIVITY_OP_NUMBER); + + /** + * Operation instance for operation INSERTACTIVITY. + */ + public static final org.ccsds.moims.mo.mal.MALRequestOperation INSERTACTIVITY_OP = new org.ccsds.moims.mo.mal.MALRequestOperation(SERVICE_KEY, + INSERTACTIVITY_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("insertActivity"), + new org.ccsds.moims.mo.mal.structures.UShort(2), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("activityDetails", false, org.ccsds.moims.mo.mps.structures.InsertedActivityDetails.SHORT_FORM, "")}, + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("activityRef", false, org.ccsds.moims.mo.mal.structures.ObjectRef.OBJECTREF_SHORT_FORM, "")}, + "The insertActivity operation sends an InsertedActivityDetails structure (an ActivityDetails structure with Plan reference and start/end triggers) to the provider, which then creates a corresponding ActivityInstance object in the referenced Plan and returns its identity to the consumer. It is up to the planning system, how to manage concurrent access to the plan. Insertion may fail if the Plan is already in the TERMINATED state, in which case an INSERT_FAILED error shall be returned."); + + /** + * Operation number literal for operation INSERTEVENT. + */ + public static final int _INSERTEVENT_OP_NUMBER = 3; + + /** + * Operation number instance for operation INSERTEVENT. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort INSERTEVENT_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_INSERTEVENT_OP_NUMBER); + + /** + * Operation instance for operation INSERTEVENT. + */ + public static final org.ccsds.moims.mo.mal.MALRequestOperation INSERTEVENT_OP = new org.ccsds.moims.mo.mal.MALRequestOperation(SERVICE_KEY, + INSERTEVENT_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("insertEvent"), + new org.ccsds.moims.mo.mal.structures.UShort(2), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("eventDetails", false, org.ccsds.moims.mo.mps.structures.InsertedEventDetails.SHORT_FORM, "")}, + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("eventRef", false, org.ccsds.moims.mo.mal.structures.ObjectRef.OBJECTREF_SHORT_FORM, "")}, + "The insertEvent operation sends an InsertedEventDetails structure, which includes a Plan reference, to the provider, which then creates a corresponding EventInstance object in the referenced Plan and returns its identity to the consumer. It is up to the planning system, how to manage concurrent access to the plan. Insertion may fail if the Plan is already in the TERMINATED state, in which case an INSERT_FAILED error shall be returned."); + + /** + * Operation number literal for operation DELETEACTIVITY. + */ + public static final int _DELETEACTIVITY_OP_NUMBER = 4; + + /** + * Operation number instance for operation DELETEACTIVITY. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort DELETEACTIVITY_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_DELETEACTIVITY_OP_NUMBER); + + /** + * Operation instance for operation DELETEACTIVITY. + */ + public static final org.ccsds.moims.mo.mal.MALSubmitOperation DELETEACTIVITY_OP = new org.ccsds.moims.mo.mal.MALSubmitOperation(SERVICE_KEY, + DELETEACTIVITY_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("deleteActivity"), + new org.ccsds.moims.mo.mal.structures.UShort(2), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("planRef", false, org.ccsds.moims.mo.mal.structures.ObjectRef.OBJECTREF_SHORT_FORM, ""), + new org.ccsds.moims.mo.mal.OperationField("activityRef", false, org.ccsds.moims.mo.mal.structures.ObjectRef.OBJECTREF_SHORT_FORM, "")}, + "The deleteActivity operation requests that a specified ActivityInstance within a Plan is deleted by the service provider. In practice, the activity is not removed, but transitioned to the TERMINATED state with deletion indicated in the statusInfo field. The ActivityInstance is not subsequently executed by the service provider, but it is implementation dependent what action is taken by the service provider if the ActivityInstance is in the EXECUTING state. It is up to the planning system, how to manage concurrent access to the plan. Deletion may fail if the referenced Plan or ActivityInstance is already in the TERMINATED state, in which case the DELETE_FAILED error shall be returned."); + + /** + * Operation number literal for operation DELETEEVENT. + */ + public static final int _DELETEEVENT_OP_NUMBER = 5; + + /** + * Operation number instance for operation DELETEEVENT. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort DELETEEVENT_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_DELETEEVENT_OP_NUMBER); + + /** + * Operation instance for operation DELETEEVENT. + */ + public static final org.ccsds.moims.mo.mal.MALSubmitOperation DELETEEVENT_OP = new org.ccsds.moims.mo.mal.MALSubmitOperation(SERVICE_KEY, + DELETEEVENT_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("deleteEvent"), + new org.ccsds.moims.mo.mal.structures.UShort(2), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("planRef", false, org.ccsds.moims.mo.mal.structures.ObjectRef.OBJECTREF_SHORT_FORM, ""), + new org.ccsds.moims.mo.mal.OperationField("eventRef", false, org.ccsds.moims.mo.mal.structures.ObjectRef.OBJECTREF_SHORT_FORM, "")}, + "The deleteEvent operation requests that a specified EventInstance within a Plan is deleted by the service provider. In practice, the event is not removed, but transitioned to the TERMINATED state with deletion indicated in the statusInfo field. The EventInstance is not subsequently triggered by the service provider. It is up to the planning system, how to manage concurrent access to the plan. Deletion may fail if the referenced Plan or EventInstance is already in the TERMINATED state, in which case the DELETE_FAILED error shall be returned."); + + /** + * Operation number literal for operation UPDATEACTIVITY. + */ + public static final int _UPDATEACTIVITY_OP_NUMBER = 6; + + /** + * Operation number instance for operation UPDATEACTIVITY. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort UPDATEACTIVITY_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_UPDATEACTIVITY_OP_NUMBER); + + /** + * Operation instance for operation UPDATEACTIVITY. + */ + public static final org.ccsds.moims.mo.mal.MALSubmitOperation UPDATEACTIVITY_OP = new org.ccsds.moims.mo.mal.MALSubmitOperation(SERVICE_KEY, + UPDATEACTIVITY_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("updateActivity"), + new org.ccsds.moims.mo.mal.structures.UShort(3), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("planRef", false, org.ccsds.moims.mo.mal.structures.ObjectRef.OBJECTREF_SHORT_FORM, ""), + new org.ccsds.moims.mo.mal.OperationField("activityUpdate", false, org.ccsds.moims.mo.mps.structures.ActivityUpdate.SHORT_FORM, "")}, + "The updateActivity operation may be used to modify an ActivityInstance in a Plan that has already been submitted to the service provider. The consumer submits an ActivityUpdate structure which is applied by the service provider to the referenced ActivityInstance. It is up to the planning system, how to manage concurrent access to the plan. Update may fail if the referenced Plan or ActivityInstance is already in the TERMINATED state, in which case the UPDATE_FAILED error shall be returned."); + + /** + * Operation number literal for operation UPDATEEVENT. + */ + public static final int _UPDATEEVENT_OP_NUMBER = 7; + + /** + * Operation number instance for operation UPDATEEVENT. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort UPDATEEVENT_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_UPDATEEVENT_OP_NUMBER); + + /** + * Operation instance for operation UPDATEEVENT. + */ + public static final org.ccsds.moims.mo.mal.MALSubmitOperation UPDATEEVENT_OP = new org.ccsds.moims.mo.mal.MALSubmitOperation(SERVICE_KEY, + UPDATEEVENT_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("updateEvent"), + new org.ccsds.moims.mo.mal.structures.UShort(3), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("planRef", false, org.ccsds.moims.mo.mal.structures.ObjectRef.OBJECTREF_SHORT_FORM, ""), + new org.ccsds.moims.mo.mal.OperationField("eventUpdate", false, org.ccsds.moims.mo.mps.structures.EventUpdate.SHORT_FORM, "")}, + "The updateEvent operation may be used to modify an EventInstance in a Plan that has already been submitted to the service provider. The consumer submits an EventUpdate structure which is applied by the service provider to the referenced EventInstance. It is up to the planning system, how to manage concurrent access to the plan. Update may fail if the referenced Plan or EventInstance is already in the TERMINATED state, in which case the UPDATE_FAILED error shall be returned."); + + /** + * Operation number literal for operation UPDATERESOURCEVALUE. + */ + public static final int _UPDATERESOURCEVALUE_OP_NUMBER = 8; + + /** + * Operation number instance for operation UPDATERESOURCEVALUE. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort UPDATERESOURCEVALUE_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_UPDATERESOURCEVALUE_OP_NUMBER); + + /** + * Operation instance for operation UPDATERESOURCEVALUE. + */ + public static final org.ccsds.moims.mo.mal.MALSubmitOperation UPDATERESOURCEVALUE_OP = new org.ccsds.moims.mo.mal.MALSubmitOperation(SERVICE_KEY, + UPDATERESOURCEVALUE_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("updateResourceValue"), + new org.ccsds.moims.mo.mal.structures.UShort(4), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("planRef", false, org.ccsds.moims.mo.mal.structures.ObjectRef.OBJECTREF_SHORT_FORM, ""), + new org.ccsds.moims.mo.mal.OperationField("resourceUpdate", false, org.ccsds.moims.mo.mps.structures.ResourceUpdate.SHORT_FORM, "")}, + "The updateResourceValue operation may be used to modify the value of a Resource at the specified point in time, in a Plan that has already been submitted to the service provider. The consumer submits a ResourceUpdate structure which is applied by the service provider to the referenced Resource. It is up to the planning system, how to manage concurrent access to the plan. Update may fail if the referenced Plan is already in the TERMINATED state, in which case the UPDATE_FAILED error shall be returned."); + + /** + * Operation number literal for operation UPDATERESOURCEPROFILE. + */ + public static final int _UPDATERESOURCEPROFILE_OP_NUMBER = 9; + + /** + * Operation number instance for operation UPDATERESOURCEPROFILE. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort UPDATERESOURCEPROFILE_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_UPDATERESOURCEPROFILE_OP_NUMBER); + + /** + * Operation instance for operation UPDATERESOURCEPROFILE. + */ + public static final org.ccsds.moims.mo.mal.MALSubmitOperation UPDATERESOURCEPROFILE_OP = new org.ccsds.moims.mo.mal.MALSubmitOperation(SERVICE_KEY, + UPDATERESOURCEPROFILE_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("updateResourceProfile"), + new org.ccsds.moims.mo.mal.structures.UShort(5), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("planRef", false, org.ccsds.moims.mo.mal.structures.ObjectRef.OBJECTREF_SHORT_FORM, ""), + new org.ccsds.moims.mo.mal.OperationField("resourceProfile", false, org.ccsds.moims.mo.mps.structures.ResourceProfile.SHORT_FORM, "")}, + "The updateResourceProfile operation may be used to modify the value of a Resource over a period of time, in a Plan that has already been submitted to the service provider. The consumer submits a ResourceProfile structure which is applied by the service provider to the referenced Resource. It is up to the planning system, how to manage concurrent access to the plan. Update may fail if the referenced Plan is already in the TERMINATED state, in which case the UPDATE_FAILED error shall be returned."); + + /** + * Operation number literal for operation APPLYTIMESHIFT. + */ + public static final int _APPLYTIMESHIFT_OP_NUMBER = 10; + + /** + * Operation number instance for operation APPLYTIMESHIFT. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort APPLYTIMESHIFT_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_APPLYTIMESHIFT_OP_NUMBER); + + /** + * Operation instance for operation APPLYTIMESHIFT. + */ + public static final org.ccsds.moims.mo.mal.MALSubmitOperation APPLYTIMESHIFT_OP = new org.ccsds.moims.mo.mal.MALSubmitOperation(SERVICE_KEY, + APPLYTIMESHIFT_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("applyTimeShift"), + new org.ccsds.moims.mo.mal.structures.UShort(6), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("planRef", false, org.ccsds.moims.mo.mal.structures.ObjectRef.OBJECTREF_SHORT_FORM, ""), + new org.ccsds.moims.mo.mal.OperationField("subPlans", true, org.ccsds.moims.mo.mal.structures.IdentifierList.SHORT_FORM, ""), + new org.ccsds.moims.mo.mal.OperationField("timePeriod", false, org.ccsds.moims.mo.mps.structures.TimeWindow.SHORT_FORM, ""), + new org.ccsds.moims.mo.mal.OperationField("offset", false, org.ccsds.moims.mo.mal.structures.Attribute.DURATION_SHORT_FORM, "")}, + "The applyTimeShift operation may be used to request a shift in the timing by a fixed offset of the ActivityInstances, EventInstances, and ResourceProfiles contained within a Plan that has previously been submitted to a plan execution function. The operation may also be restricted to one or more SubPlans within the referenced Plan and/or to a specified time period within the Plan. The service provider applies the time shift to the timing of ActivityInstances, EventInstances, and ResourceProfiles contained within the Plan or SubPlan(s). The time shift may fail if the referenced Plan is already in the TERMINATED state, in which case the UPDATE_FAILED error shall be returned. The operation is designed to support backward compatibility with simple time-based on-board schedules, and may not be appropriate for use with plans that include event or position-based triggers and resource profiles. What is shifted within the Plan is implementation dependent, but shall include time-based start and end triggers on ActivityInstances. EventInstances may also be shifted, but it is noted that some EventInstances correspond to predicted orbital events that cannot meaningfully be shifted. Similarly, where supported, resource profiles may reflect the ActivityInstances contained within the Plan and if those are shifted, the corresponding changes in Resource value should also be shifted. NOTE – ActivityInstances have duration which means they may overlap the start or end of the specified TimeWindow for the applicability of the time shift. It is implementation dependent how this is managed, but a reasonable assumption is that the start time of the ActivityInstances must be within the specified TimeWindow. Given the potential to introduce inconsistencies into a Plan, it must be assumed that users of this service operation understand both its operational implications and its specific implementation."); + + /** + * Area elements. + */ + public static final org.ccsds.moims.mo.mal.structures.Element[] PLANEDIT_SERVICE_ELEMENTS = {}; + + /** + * The set of operations for this service. + */ + public static final org.ccsds.moims.mo.mal.MALOperation[] OPERATIONS = new org.ccsds.moims.mo.mal.MALOperation[]{UPDATEPLANSTATUS_OP, + INSERTACTIVITY_OP, + INSERTEVENT_OP, + DELETEACTIVITY_OP, + DELETEEVENT_OP, + UPDATEACTIVITY_OP, + UPDATEEVENT_OP, + UPDATERESOURCEVALUE_OP, + UPDATERESOURCEPROFILE_OP, + APPLYTIMESHIFT_OP}; + + /** + * Creates an instance of the PlanEdit ServiceInfo. + * + */ + public PlanEditServiceInfo() { + super(SERVICE_KEY, PLANEDIT_SERVICE_NAME, PLANEDIT_SERVICE_ELEMENTS, OPERATIONS); + } + + @Override + public org.ccsds.moims.mo.mal.MALArea getArea() { + return org.ccsds.moims.mo.mps.MPSHelper.MPS_AREA; + } + + @Override + public org.ccsds.moims.mo.mal.MOErrorException generateMOError(int errorNumber, + Object extraInfo) { + switch (errorNumber) { + case 1: + return new org.ccsds.moims.mo.mps.InvalidException(extraInfo); + case 2: + return new org.ccsds.moims.mo.mps.CancelFailedException(extraInfo); + case 3: + return new org.ccsds.moims.mo.mps.UpdateFailedException(extraInfo); + case 4: + return new org.ccsds.moims.mo.mps.RevokeFailedException(extraInfo); + case 5: + return new org.ccsds.moims.mo.mps.InsertFailedException(extraInfo); + case 6: + return new org.ccsds.moims.mo.mps.DeleteFailedException(extraInfo); + case 7: + return new org.ccsds.moims.mo.mps.ActivateFailedException(extraInfo); + case 8: + return new org.ccsds.moims.mo.mps.DeactivateFailedException(extraInfo); + case 9: + return new org.ccsds.moims.mo.mps.SubmitFailedException(extraInfo); + case 10: + return new org.ccsds.moims.mo.mps.UnsupportedException(extraInfo); + case 11: + return new org.ccsds.moims.mo.mps.ActivateSubplanFailedException(extraInfo); + case 12: + return new org.ccsds.moims.mo.mps.DeactivateSubplanFailedException(extraInfo); + } + return null; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planedit/consumer/PlanEditAdapter.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planedit/consumer/PlanEditAdapter.java new file mode 100644 index 00000000..c340bc88 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planedit/consumer/PlanEditAdapter.java @@ -0,0 +1,353 @@ +package org.ccsds.moims.mo.mps.planedit.consumer; + +/** + * Consumer adapter for PlanEdit service. + */ +public abstract class PlanEditAdapter extends org.ccsds.moims.mo.mal.consumer.MALInteractionAdapter { + + /** + * Called by the MAL when a SUBMIT acknowledgement is received from a provider + * for the operation updatePlanStatus. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void updatePlanStatusAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a SUBMIT acknowledgement error is received from + * a provider for the operation updatePlanStatus. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void updatePlanStatusErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response is received from a provider for + * the operation insertActivity. + * + * @param msgHeader msgHeader The header of the received message + * @param activityRef The activityRef field. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void insertActivityResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.structures.ObjectRef activityRef, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response error is received from a provider + * for the operation insertActivity. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void insertActivityErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response is received from a provider for + * the operation insertEvent. + * + * @param msgHeader msgHeader The header of the received message + * @param eventRef The eventRef field. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void insertEventResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.structures.ObjectRef eventRef, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response error is received from a provider + * for the operation insertEvent. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void insertEventErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a SUBMIT acknowledgement is received from a provider + * for the operation deleteActivity. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void deleteActivityAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a SUBMIT acknowledgement error is received from + * a provider for the operation deleteActivity. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void deleteActivityErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a SUBMIT acknowledgement is received from a provider + * for the operation deleteEvent. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void deleteEventAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a SUBMIT acknowledgement error is received from + * a provider for the operation deleteEvent. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void deleteEventErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a SUBMIT acknowledgement is received from a provider + * for the operation updateActivity. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void updateActivityAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a SUBMIT acknowledgement error is received from + * a provider for the operation updateActivity. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void updateActivityErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a SUBMIT acknowledgement is received from a provider + * for the operation updateEvent. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void updateEventAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a SUBMIT acknowledgement error is received from + * a provider for the operation updateEvent. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void updateEventErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a SUBMIT acknowledgement is received from a provider + * for the operation updateResourceValue. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void updateResourceValueAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a SUBMIT acknowledgement error is received from + * a provider for the operation updateResourceValue. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void updateResourceValueErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a SUBMIT acknowledgement is received from a provider + * for the operation updateResourceProfile. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void updateResourceProfileAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a SUBMIT acknowledgement error is received from + * a provider for the operation updateResourceProfile. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void updateResourceProfileErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a SUBMIT acknowledgement is received from a provider + * for the operation applyTimeShift. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void applyTimeShiftAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a SUBMIT acknowledgement error is received from + * a provider for the operation applyTimeShift. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void applyTimeShiftErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + @Override + public final void submitAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mps.planedit.PlanEditServiceInfo._UPDATEPLANSTATUS_OP_NUMBER: + updatePlanStatusAckReceived(msgHeader, qosProperties); + break; + case org.ccsds.moims.mo.mps.planedit.PlanEditServiceInfo._DELETEACTIVITY_OP_NUMBER: + deleteActivityAckReceived(msgHeader, qosProperties); + break; + case org.ccsds.moims.mo.mps.planedit.PlanEditServiceInfo._DELETEEVENT_OP_NUMBER: + deleteEventAckReceived(msgHeader, qosProperties); + break; + case org.ccsds.moims.mo.mps.planedit.PlanEditServiceInfo._UPDATEACTIVITY_OP_NUMBER: + updateActivityAckReceived(msgHeader, qosProperties); + break; + case org.ccsds.moims.mo.mps.planedit.PlanEditServiceInfo._UPDATEEVENT_OP_NUMBER: + updateEventAckReceived(msgHeader, qosProperties); + break; + case org.ccsds.moims.mo.mps.planedit.PlanEditServiceInfo._UPDATERESOURCEVALUE_OP_NUMBER: + updateResourceValueAckReceived(msgHeader, qosProperties); + break; + case org.ccsds.moims.mo.mps.planedit.PlanEditServiceInfo._UPDATERESOURCEPROFILE_OP_NUMBER: + updateResourceProfileAckReceived(msgHeader, qosProperties); + break; + case org.ccsds.moims.mo.mps.planedit.PlanEditServiceInfo._APPLYTIMESHIFT_OP_NUMBER: + applyTimeShiftAckReceived(msgHeader, qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void submitErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALErrorBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mps.planedit.PlanEditServiceInfo._UPDATEPLANSTATUS_OP_NUMBER: + updatePlanStatusErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mps.planedit.PlanEditServiceInfo._DELETEACTIVITY_OP_NUMBER: + deleteActivityErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mps.planedit.PlanEditServiceInfo._DELETEEVENT_OP_NUMBER: + deleteEventErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mps.planedit.PlanEditServiceInfo._UPDATEACTIVITY_OP_NUMBER: + updateActivityErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mps.planedit.PlanEditServiceInfo._UPDATEEVENT_OP_NUMBER: + updateEventErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mps.planedit.PlanEditServiceInfo._UPDATERESOURCEVALUE_OP_NUMBER: + updateResourceValueErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mps.planedit.PlanEditServiceInfo._UPDATERESOURCEPROFILE_OP_NUMBER: + updateResourceProfileErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mps.planedit.PlanEditServiceInfo._APPLYTIMESHIFT_OP_NUMBER: + applyTimeShiftErrorReceived(msgHeader, body.getError(), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void requestResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALMessageBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mps.planedit.PlanEditServiceInfo._INSERTACTIVITY_OP_NUMBER: + insertActivityResponseReceived(msgHeader, + (org.ccsds.moims.mo.mal.structures.ObjectRef) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.ObjectRef()), qosProperties); + break; + case org.ccsds.moims.mo.mps.planedit.PlanEditServiceInfo._INSERTEVENT_OP_NUMBER: + insertEventResponseReceived(msgHeader, + (org.ccsds.moims.mo.mal.structures.ObjectRef) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.ObjectRef()), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void requestErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALErrorBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mps.planedit.PlanEditServiceInfo._INSERTACTIVITY_OP_NUMBER: + insertActivityErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mps.planedit.PlanEditServiceInfo._INSERTEVENT_OP_NUMBER: + insertEventErrorReceived(msgHeader, body.getError(), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planedit/consumer/PlanEditStub.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planedit/consumer/PlanEditStub.java new file mode 100644 index 00000000..ab40202f --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planedit/consumer/PlanEditStub.java @@ -0,0 +1,596 @@ +package org.ccsds.moims.mo.mps.planedit.consumer; + +/** + * Consumer stub for PlanEdit service. + */ +public class PlanEditStub { + + /** + * The consumer field. + */ + private final org.ccsds.moims.mo.mal.consumer.MALConsumer consumer; + + /** + * Wraps a MALconsumer connection with service specific methods that map from + * the high level service API to the generic MAL API. + * + * @param consumer consumer The MALConsumer to use in this stub. + */ + public PlanEditStub(org.ccsds.moims.mo.mal.consumer.MALConsumer consumer) { + this.consumer = consumer; + } + + /** + * Returns the internal MAL consumer object used for sending of messages from + * this interface. + * + * @return The MAL consumer object. + */ + public org.ccsds.moims.mo.mal.consumer.MALConsumer getConsumer() { + return consumer; + } + + /** + * The updatePlanStatus operation may be used to modify the status of a previously + * submitted Plan. Directly modifying the status field of a Plan may be used + * by a third party function to autonomously terminate (or activate) a Plan, + * but the operation also allows the isAlternate flag to be set or cleared. + * It is implementation dependent what action the service provider takes in + * response to a change of Plan status. The service provider may not permit + * certain state changes (for example to modify the status of a TERMINATED + * plan, which is inconsistent with the plan status model), in which case + * an UPDATE_FAILED error shall be returned. A set of Plans with a common + * precursor may be submitted to a plan execution function to cater for alternative + * or contingency scenarios. All but one of these Plans should have the isAlternate + * flag set, to inform the plan execution function (and the mission operations + * team) which is the nominal Plan. It is implementation dependent whether + * a plan execution control service provider will allow a Plan to be activated + * with the isAlternate flag set, but for operational safety reasons this + * may be blocked. In a contingency scenario, the updatePlanStatus operation + * can be used to set the flag on the nominal Plan, and reset the flag on + * the required contingency Plan, making it operational. + * + * @param planRef The planRef field. + * @param status The status field. + * @param isAlternate The isAlternate field. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void updatePlanStatus(org.ccsds.moims.mo.mal.structures.ObjectRef planRef, + org.ccsds.moims.mo.mps.structures.PlanStatusEnum status, + Boolean isAlternate) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.submit(org.ccsds.moims.mo.mps.planedit.PlanEditServiceInfo.UPDATEPLANSTATUS_OP, planRef, status, (isAlternate == null) ? null : new org.ccsds.moims.mo.mal.structures.Union(isAlternate)); + } + + /** + * Asynchronous version of method updatePlanStatus. + * + * @param planRef The planRef field. + * @param status The status field. + * @param isAlternate The isAlternate field. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncUpdatePlanStatus(org.ccsds.moims.mo.mal.structures.ObjectRef planRef, + org.ccsds.moims.mo.mps.structures.PlanStatusEnum status, + Boolean isAlternate, + org.ccsds.moims.mo.mps.planedit.consumer.PlanEditAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncSubmit(org.ccsds.moims.mo.mps.planedit.PlanEditServiceInfo.UPDATEPLANSTATUS_OP, adapter, planRef, status, (isAlternate == null) ? null : new org.ccsds.moims.mo.mal.structures.Union(isAlternate)); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueUpdatePlanStatus(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mps.planedit.consumer.PlanEditAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mps.planedit.PlanEditServiceInfo.UPDATEPLANSTATUS_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The insertActivity operation sends an InsertedActivityDetails structure + * (an ActivityDetails structure with Plan reference and start/end triggers) + * to the provider, which then creates a corresponding ActivityInstance object + * in the referenced Plan and returns its identity to the consumer. It is + * up to the planning system, how to manage concurrent access to the plan. + * Insertion may fail if the Plan is already in the TERMINATED state, in which + * case an INSERT_FAILED error shall be returned. + * + * @param activityDetails The activityDetails field. + * @return The return value of the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.structures.ObjectRef insertActivity(org.ccsds.moims.mo.mps.structures.InsertedActivityDetails activityDetails) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + org.ccsds.moims.mo.mal.transport.MALMessageBody body = consumer.request(org.ccsds.moims.mo.mps.planedit.PlanEditServiceInfo.INSERTACTIVITY_OP, activityDetails); + Object body0 = (Object) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.ObjectRef()); + return (org.ccsds.moims.mo.mal.structures.ObjectRef) body0; + } + + /** + * Asynchronous version of method insertActivity. + * + * @param activityDetails The activityDetails field. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncInsertActivity(org.ccsds.moims.mo.mps.structures.InsertedActivityDetails activityDetails, + org.ccsds.moims.mo.mps.planedit.consumer.PlanEditAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncRequest(org.ccsds.moims.mo.mps.planedit.PlanEditServiceInfo.INSERTACTIVITY_OP, adapter, activityDetails); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueInsertActivity(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mps.planedit.consumer.PlanEditAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mps.planedit.PlanEditServiceInfo.INSERTACTIVITY_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The insertEvent operation sends an InsertedEventDetails structure, which + * includes a Plan reference, to the provider, which then creates a corresponding + * EventInstance object in the referenced Plan and returns its identity to + * the consumer. It is up to the planning system, how to manage concurrent + * access to the plan. Insertion may fail if the Plan is already in the TERMINATED + * state, in which case an INSERT_FAILED error shall be returned. + * + * @param eventDetails The eventDetails field. + * @return The return value of the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.structures.ObjectRef insertEvent(org.ccsds.moims.mo.mps.structures.InsertedEventDetails eventDetails) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + org.ccsds.moims.mo.mal.transport.MALMessageBody body = consumer.request(org.ccsds.moims.mo.mps.planedit.PlanEditServiceInfo.INSERTEVENT_OP, eventDetails); + Object body0 = (Object) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.ObjectRef()); + return (org.ccsds.moims.mo.mal.structures.ObjectRef) body0; + } + + /** + * Asynchronous version of method insertEvent. + * + * @param eventDetails The eventDetails field. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncInsertEvent(org.ccsds.moims.mo.mps.structures.InsertedEventDetails eventDetails, + org.ccsds.moims.mo.mps.planedit.consumer.PlanEditAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncRequest(org.ccsds.moims.mo.mps.planedit.PlanEditServiceInfo.INSERTEVENT_OP, adapter, eventDetails); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueInsertEvent(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mps.planedit.consumer.PlanEditAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mps.planedit.PlanEditServiceInfo.INSERTEVENT_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The deleteActivity operation requests that a specified ActivityInstance + * within a Plan is deleted by the service provider. In practice, the activity + * is not removed, but transitioned to the TERMINATED state with deletion + * indicated in the statusInfo field. The ActivityInstance is not subsequently + * executed by the service provider, but it is implementation dependent what + * action is taken by the service provider if the ActivityInstance is in the + * EXECUTING state. It is up to the planning system, how to manage concurrent + * access to the plan. Deletion may fail if the referenced Plan or ActivityInstance + * is already in the TERMINATED state, in which case the DELETE_FAILED error + * shall be returned. + * + * @param planRef The planRef field. + * @param activityRef The activityRef field. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void deleteActivity(org.ccsds.moims.mo.mal.structures.ObjectRef planRef, + org.ccsds.moims.mo.mal.structures.ObjectRef activityRef) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.submit(org.ccsds.moims.mo.mps.planedit.PlanEditServiceInfo.DELETEACTIVITY_OP, planRef, activityRef); + } + + /** + * Asynchronous version of method deleteActivity. + * + * @param planRef The planRef field. + * @param activityRef The activityRef field. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncDeleteActivity(org.ccsds.moims.mo.mal.structures.ObjectRef planRef, + org.ccsds.moims.mo.mal.structures.ObjectRef activityRef, + org.ccsds.moims.mo.mps.planedit.consumer.PlanEditAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncSubmit(org.ccsds.moims.mo.mps.planedit.PlanEditServiceInfo.DELETEACTIVITY_OP, adapter, planRef, activityRef); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueDeleteActivity(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mps.planedit.consumer.PlanEditAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mps.planedit.PlanEditServiceInfo.DELETEACTIVITY_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The deleteEvent operation requests that a specified EventInstance within + * a Plan is deleted by the service provider. In practice, the event is not + * removed, but transitioned to the TERMINATED state with deletion indicated + * in the statusInfo field. The EventInstance is not subsequently triggered + * by the service provider. It is up to the planning system, how to manage + * concurrent access to the plan. Deletion may fail if the referenced Plan + * or EventInstance is already in the TERMINATED state, in which case the + * DELETE_FAILED error shall be returned. + * + * @param planRef The planRef field. + * @param eventRef The eventRef field. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void deleteEvent(org.ccsds.moims.mo.mal.structures.ObjectRef planRef, + org.ccsds.moims.mo.mal.structures.ObjectRef eventRef) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.submit(org.ccsds.moims.mo.mps.planedit.PlanEditServiceInfo.DELETEEVENT_OP, planRef, eventRef); + } + + /** + * Asynchronous version of method deleteEvent. + * + * @param planRef The planRef field. + * @param eventRef The eventRef field. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncDeleteEvent(org.ccsds.moims.mo.mal.structures.ObjectRef planRef, + org.ccsds.moims.mo.mal.structures.ObjectRef eventRef, + org.ccsds.moims.mo.mps.planedit.consumer.PlanEditAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncSubmit(org.ccsds.moims.mo.mps.planedit.PlanEditServiceInfo.DELETEEVENT_OP, adapter, planRef, eventRef); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueDeleteEvent(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mps.planedit.consumer.PlanEditAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mps.planedit.PlanEditServiceInfo.DELETEEVENT_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The updateActivity operation may be used to modify an ActivityInstance + * in a Plan that has already been submitted to the service provider. The + * consumer submits an ActivityUpdate structure which is applied by the service + * provider to the referenced ActivityInstance. It is up to the planning + * system, how to manage concurrent access to the plan. Update may fail if + * the referenced Plan or ActivityInstance is already in the TERMINATED state, + * in which case the UPDATE_FAILED error shall be returned. + * + * @param planRef The planRef field. + * @param activityUpdate The activityUpdate field. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void updateActivity(org.ccsds.moims.mo.mal.structures.ObjectRef planRef, + org.ccsds.moims.mo.mps.structures.ActivityUpdate activityUpdate) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.submit(org.ccsds.moims.mo.mps.planedit.PlanEditServiceInfo.UPDATEACTIVITY_OP, planRef, activityUpdate); + } + + /** + * Asynchronous version of method updateActivity. + * + * @param planRef The planRef field. + * @param activityUpdate The activityUpdate field. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncUpdateActivity(org.ccsds.moims.mo.mal.structures.ObjectRef planRef, + org.ccsds.moims.mo.mps.structures.ActivityUpdate activityUpdate, + org.ccsds.moims.mo.mps.planedit.consumer.PlanEditAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncSubmit(org.ccsds.moims.mo.mps.planedit.PlanEditServiceInfo.UPDATEACTIVITY_OP, adapter, planRef, activityUpdate); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueUpdateActivity(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mps.planedit.consumer.PlanEditAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mps.planedit.PlanEditServiceInfo.UPDATEACTIVITY_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The updateEvent operation may be used to modify an EventInstance in a Plan + * that has already been submitted to the service provider. The consumer + * submits an EventUpdate structure which is applied by the service provider + * to the referenced EventInstance. It is up to the planning system, how + * to manage concurrent access to the plan. Update may fail if the referenced + * Plan or EventInstance is already in the TERMINATED state, in which case + * the UPDATE_FAILED error shall be returned. + * + * @param planRef The planRef field. + * @param eventUpdate The eventUpdate field. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void updateEvent(org.ccsds.moims.mo.mal.structures.ObjectRef planRef, + org.ccsds.moims.mo.mps.structures.EventUpdate eventUpdate) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.submit(org.ccsds.moims.mo.mps.planedit.PlanEditServiceInfo.UPDATEEVENT_OP, planRef, eventUpdate); + } + + /** + * Asynchronous version of method updateEvent. + * + * @param planRef The planRef field. + * @param eventUpdate The eventUpdate field. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncUpdateEvent(org.ccsds.moims.mo.mal.structures.ObjectRef planRef, + org.ccsds.moims.mo.mps.structures.EventUpdate eventUpdate, + org.ccsds.moims.mo.mps.planedit.consumer.PlanEditAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncSubmit(org.ccsds.moims.mo.mps.planedit.PlanEditServiceInfo.UPDATEEVENT_OP, adapter, planRef, eventUpdate); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueUpdateEvent(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mps.planedit.consumer.PlanEditAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mps.planedit.PlanEditServiceInfo.UPDATEEVENT_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The updateResourceValue operation may be used to modify the value of a + * Resource at the specified point in time, in a Plan that has already been + * submitted to the service provider. The consumer submits a ResourceUpdate + * structure which is applied by the service provider to the referenced Resource. + * It is up to the planning system, how to manage concurrent access to the + * plan. Update may fail if the referenced Plan is already in the TERMINATED + * state, in which case the UPDATE_FAILED error shall be returned. + * + * @param planRef The planRef field. + * @param resourceUpdate The resourceUpdate field. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void updateResourceValue(org.ccsds.moims.mo.mal.structures.ObjectRef planRef, + org.ccsds.moims.mo.mps.structures.ResourceUpdate resourceUpdate) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.submit(org.ccsds.moims.mo.mps.planedit.PlanEditServiceInfo.UPDATERESOURCEVALUE_OP, planRef, resourceUpdate); + } + + /** + * Asynchronous version of method updateResourceValue. + * + * @param planRef The planRef field. + * @param resourceUpdate The resourceUpdate field. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncUpdateResourceValue(org.ccsds.moims.mo.mal.structures.ObjectRef planRef, + org.ccsds.moims.mo.mps.structures.ResourceUpdate resourceUpdate, + org.ccsds.moims.mo.mps.planedit.consumer.PlanEditAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncSubmit(org.ccsds.moims.mo.mps.planedit.PlanEditServiceInfo.UPDATERESOURCEVALUE_OP, adapter, planRef, resourceUpdate); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueUpdateResourceValue(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mps.planedit.consumer.PlanEditAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mps.planedit.PlanEditServiceInfo.UPDATERESOURCEVALUE_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The updateResourceProfile operation may be used to modify the value of + * a Resource over a period of time, in a Plan that has already been submitted + * to the service provider. The consumer submits a ResourceProfile structure + * which is applied by the service provider to the referenced Resource. It + * is up to the planning system, how to manage concurrent access to the plan. + * Update may fail if the referenced Plan is already in the TERMINATED state, + * in which case the UPDATE_FAILED error shall be returned. + * + * @param planRef The planRef field. + * @param resourceProfile The resourceProfile field. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void updateResourceProfile(org.ccsds.moims.mo.mal.structures.ObjectRef planRef, + org.ccsds.moims.mo.mps.structures.ResourceProfile resourceProfile) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.submit(org.ccsds.moims.mo.mps.planedit.PlanEditServiceInfo.UPDATERESOURCEPROFILE_OP, planRef, resourceProfile); + } + + /** + * Asynchronous version of method updateResourceProfile. + * + * @param planRef The planRef field. + * @param resourceProfile The resourceProfile field. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncUpdateResourceProfile(org.ccsds.moims.mo.mal.structures.ObjectRef planRef, + org.ccsds.moims.mo.mps.structures.ResourceProfile resourceProfile, + org.ccsds.moims.mo.mps.planedit.consumer.PlanEditAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncSubmit(org.ccsds.moims.mo.mps.planedit.PlanEditServiceInfo.UPDATERESOURCEPROFILE_OP, adapter, planRef, resourceProfile); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueUpdateResourceProfile(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mps.planedit.consumer.PlanEditAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mps.planedit.PlanEditServiceInfo.UPDATERESOURCEPROFILE_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The applyTimeShift operation may be used to request a shift in the timing + * by a fixed offset of the ActivityInstances, EventInstances, and ResourceProfiles + * contained within a Plan that has previously been submitted to a plan execution + * function. The operation may also be restricted to one or more SubPlans + * within the referenced Plan and/or to a specified time period within the + * Plan. The service provider applies the time shift to the timing of ActivityInstances, + * EventInstances, and ResourceProfiles contained within the Plan or SubPlan(s). + * The time shift may fail if the referenced Plan is already in the TERMINATED + * state, in which case the UPDATE_FAILED error shall be returned. The operation + * is designed to support backward compatibility with simple time-based on-board + * schedules, and may not be appropriate for use with plans that include event + * or position-based triggers and resource profiles. What is shifted within + * the Plan is implementation dependent, but shall include time-based start + * and end triggers on ActivityInstances. EventInstances may also be shifted, + * but it is noted that some EventInstances correspond to predicted orbital + * events that cannot meaningfully be shifted. Similarly, where supported, + * resource profiles may reflect the ActivityInstances contained within the + * Plan and if those are shifted, the corresponding changes in Resource value + * should also be shifted. NOTE – ActivityInstances have duration which means + * they may overlap the start or end of the specified TimeWindow for the applicability + * of the time shift. It is implementation dependent how this is managed, + * but a reasonable assumption is that the start time of the ActivityInstances + * must be within the specified TimeWindow. Given the potential to introduce + * inconsistencies into a Plan, it must be assumed that users of this service + * operation understand both its operational implications and its specific + * implementation. + * + * @param planRef The planRef field. + * @param subPlans The subPlans field. + * @param timePeriod The timePeriod field. + * @param offset The offset field. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void applyTimeShift(org.ccsds.moims.mo.mal.structures.ObjectRef planRef, + org.ccsds.moims.mo.mal.structures.IdentifierList subPlans, + org.ccsds.moims.mo.mps.structures.TimeWindow timePeriod, + org.ccsds.moims.mo.mal.structures.Duration offset) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.submit(org.ccsds.moims.mo.mps.planedit.PlanEditServiceInfo.APPLYTIMESHIFT_OP, planRef, subPlans, timePeriod, offset); + } + + /** + * Asynchronous version of method applyTimeShift. + * + * @param planRef The planRef field. + * @param subPlans The subPlans field. + * @param timePeriod The timePeriod field. + * @param offset The offset field. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncApplyTimeShift(org.ccsds.moims.mo.mal.structures.ObjectRef planRef, + org.ccsds.moims.mo.mal.structures.IdentifierList subPlans, + org.ccsds.moims.mo.mps.structures.TimeWindow timePeriod, + org.ccsds.moims.mo.mal.structures.Duration offset, + org.ccsds.moims.mo.mps.planedit.consumer.PlanEditAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncSubmit(org.ccsds.moims.mo.mps.planedit.PlanEditServiceInfo.APPLYTIMESHIFT_OP, adapter, planRef, subPlans, timePeriod, offset); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueApplyTimeShift(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mps.planedit.consumer.PlanEditAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mps.planedit.PlanEditServiceInfo.APPLYTIMESHIFT_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planedit/consumer/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planedit/consumer/package-info.java new file mode 100644 index 00000000..5556ec81 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planedit/consumer/package-info.java @@ -0,0 +1,4 @@ +/** + * Package containing the consumer stubs for the PlanEdit service. +*/ +package org.ccsds.moims.mo.mps.planedit.consumer; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planedit/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planedit/package-info.java new file mode 100644 index 00000000..a02fb0cd --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planedit/package-info.java @@ -0,0 +1,12 @@ +/** + * The Plan Edit Service, introduced in 2.5.6, is provided by a plan execution + * function and enables its consumers to modify Plans that have already been + * submitted for execution. It allows an external user or function to update + * the status of the Plan; insert, modify, or delete its constituent ActivityInstances + * and EventInstances; update the value of Resources; and apply a time shift + * to a Plan. It comprises the operations defined below, of which only those + * in capability set 1 are mandatory. In some deployments, the Plan Edit Service + * could also be provided by a planning function to enable users to make adjustments + * to their planned activities prior to submission of the plan for execution. +*/ +package org.ccsds.moims.mo.mps.planedit; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planedit/provider/PlanEditHandler.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planedit/provider/PlanEditHandler.java new file mode 100644 index 00000000..64e42449 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planedit/provider/PlanEditHandler.java @@ -0,0 +1,162 @@ +package org.ccsds.moims.mo.mps.planedit.provider; + +/** + * Interface that providers of the PlanEdit service must implement to handle + * the operations of that service. + */ +public interface PlanEditHandler { + + /** + * Implements the operation updatePlanStatus. + * + * @param planRef The planRef field. + * @param status The status field. + * @param isAlternate The isAlternate field. + * @param interaction The MAL object representing the interaction in the provider. + * @throws org.ccsds.moims.mo.mps.InvalidException One or more fields in the message contain invalid values. + * @throws org.ccsds.moims.mo.mps.UpdateFailedException The update operation (to Request, PlanStatus, Activity, Event or Resource) failed to update the referenced object. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + void updatePlanStatus(org.ccsds.moims.mo.mal.structures.ObjectRef planRef, + org.ccsds.moims.mo.mps.structures.PlanStatusEnum status, + Boolean isAlternate, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mps.InvalidException, org.ccsds.moims.mo.mps.UpdateFailedException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation insertActivity. + * + * @param activityDetails The activityDetails field. + * @param interaction The MAL object representing the interaction in the provider. + * @return The return value of the operation + * @throws org.ccsds.moims.mo.mps.InvalidException One or more fields in the message contain invalid values. + * @throws org.ccsds.moims.mo.mps.UnsupportedException An optional data structure used in the message is not supported by the service provider. + * @throws org.ccsds.moims.mo.mps.InsertFailedException The insertActivity or insertEvent operation failed to insert the requested object. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + org.ccsds.moims.mo.mal.structures.ObjectRef insertActivity(org.ccsds.moims.mo.mps.structures.InsertedActivityDetails activityDetails, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mps.InvalidException, org.ccsds.moims.mo.mps.UnsupportedException, org.ccsds.moims.mo.mps.InsertFailedException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation insertEvent. + * + * @param eventDetails The eventDetails field. + * @param interaction The MAL object representing the interaction in the provider. + * @return The return value of the operation + * @throws org.ccsds.moims.mo.mps.InvalidException One or more fields in the message contain invalid values. + * @throws org.ccsds.moims.mo.mps.InsertFailedException The insertActivity or insertEvent operation failed to insert the requested object. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + org.ccsds.moims.mo.mal.structures.ObjectRef insertEvent(org.ccsds.moims.mo.mps.structures.InsertedEventDetails eventDetails, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mps.InvalidException, org.ccsds.moims.mo.mps.InsertFailedException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation deleteActivity. + * + * @param planRef The planRef field. + * @param activityRef The activityRef field. + * @param interaction The MAL object representing the interaction in the provider. + * @throws org.ccsds.moims.mo.mps.InvalidException One or more fields in the message contain invalid values. + * @throws org.ccsds.moims.mo.mps.DeleteFailedException The deleteActivity or deleteEvent operation failed to delete the requested object. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + void deleteActivity(org.ccsds.moims.mo.mal.structures.ObjectRef planRef, + org.ccsds.moims.mo.mal.structures.ObjectRef activityRef, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mps.InvalidException, org.ccsds.moims.mo.mps.DeleteFailedException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation deleteEvent. + * + * @param planRef The planRef field. + * @param eventRef The eventRef field. + * @param interaction The MAL object representing the interaction in the provider. + * @throws org.ccsds.moims.mo.mps.InvalidException One or more fields in the message contain invalid values. + * @throws org.ccsds.moims.mo.mps.DeleteFailedException The deleteActivity or deleteEvent operation failed to delete the requested object. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + void deleteEvent(org.ccsds.moims.mo.mal.structures.ObjectRef planRef, + org.ccsds.moims.mo.mal.structures.ObjectRef eventRef, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mps.InvalidException, org.ccsds.moims.mo.mps.DeleteFailedException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation updateActivity. + * + * @param planRef The planRef field. + * @param activityUpdate The activityUpdate field. + * @param interaction The MAL object representing the interaction in the provider. + * @throws org.ccsds.moims.mo.mps.InvalidException One or more fields in the message contain invalid values. + * @throws org.ccsds.moims.mo.mps.UpdateFailedException The update operation (to Request, PlanStatus, Activity, Event or Resource) failed to update the referenced object. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + void updateActivity(org.ccsds.moims.mo.mal.structures.ObjectRef planRef, + org.ccsds.moims.mo.mps.structures.ActivityUpdate activityUpdate, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mps.InvalidException, org.ccsds.moims.mo.mps.UpdateFailedException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation updateEvent. + * + * @param planRef The planRef field. + * @param eventUpdate The eventUpdate field. + * @param interaction The MAL object representing the interaction in the provider. + * @throws org.ccsds.moims.mo.mps.InvalidException One or more fields in the message contain invalid values. + * @throws org.ccsds.moims.mo.mps.UpdateFailedException The update operation (to Request, PlanStatus, Activity, Event or Resource) failed to update the referenced object. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + void updateEvent(org.ccsds.moims.mo.mal.structures.ObjectRef planRef, + org.ccsds.moims.mo.mps.structures.EventUpdate eventUpdate, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mps.InvalidException, org.ccsds.moims.mo.mps.UpdateFailedException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation updateResourceValue. + * + * @param planRef The planRef field. + * @param resourceUpdate The resourceUpdate field. + * @param interaction The MAL object representing the interaction in the provider. + * @throws org.ccsds.moims.mo.mps.InvalidException One or more fields in the message contain invalid values. + * @throws org.ccsds.moims.mo.mps.UnsupportedException An optional data structure used in the message is not supported by the service provider. + * @throws org.ccsds.moims.mo.mps.UpdateFailedException The update operation (to Request, PlanStatus, Activity, Event or Resource) failed to update the referenced object. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + void updateResourceValue(org.ccsds.moims.mo.mal.structures.ObjectRef planRef, + org.ccsds.moims.mo.mps.structures.ResourceUpdate resourceUpdate, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mps.InvalidException, org.ccsds.moims.mo.mps.UnsupportedException, org.ccsds.moims.mo.mps.UpdateFailedException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation updateResourceProfile. + * + * @param planRef The planRef field. + * @param resourceProfile The resourceProfile field. + * @param interaction The MAL object representing the interaction in the provider. + * @throws org.ccsds.moims.mo.mps.InvalidException One or more fields in the message contain invalid values. + * @throws org.ccsds.moims.mo.mps.UnsupportedException An optional data structure used in the message is not supported by the service provider. + * @throws org.ccsds.moims.mo.mps.UpdateFailedException The update operation (to Request, PlanStatus, Activity, Event or Resource) failed to update the referenced object. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + void updateResourceProfile(org.ccsds.moims.mo.mal.structures.ObjectRef planRef, + org.ccsds.moims.mo.mps.structures.ResourceProfile resourceProfile, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mps.InvalidException, org.ccsds.moims.mo.mps.UnsupportedException, org.ccsds.moims.mo.mps.UpdateFailedException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation applyTimeShift. + * + * @param planRef The planRef field. + * @param subPlans The subPlans field. + * @param timePeriod The timePeriod field. + * @param offset The offset field. + * @param interaction The MAL object representing the interaction in the provider. + * @throws org.ccsds.moims.mo.mps.InvalidException One or more fields in the message contain invalid values. + * @throws org.ccsds.moims.mo.mps.UpdateFailedException The update operation (to Request, PlanStatus, Activity, Event or Resource) failed to update the referenced object. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + void applyTimeShift(org.ccsds.moims.mo.mal.structures.ObjectRef planRef, + org.ccsds.moims.mo.mal.structures.IdentifierList subPlans, + org.ccsds.moims.mo.mps.structures.TimeWindow timePeriod, + org.ccsds.moims.mo.mal.structures.Duration offset, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mps.InvalidException, org.ccsds.moims.mo.mps.UpdateFailedException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Sets the skeleton to be used for creation of publishers. + * + * @param skeleton The skeleton to be used. + */ + void setSkeleton(org.ccsds.moims.mo.mps.planedit.provider.PlanEditSkeleton skeleton); +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planedit/provider/PlanEditInheritanceSkeleton.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planedit/provider/PlanEditInheritanceSkeleton.java new file mode 100644 index 00000000..2c25ee74 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planedit/provider/PlanEditInheritanceSkeleton.java @@ -0,0 +1,168 @@ +package org.ccsds.moims.mo.mps.planedit.provider; + +/** + * Provider Inheritance skeleton for PlanEditInheritanceSkeleton service. + */ +public abstract class PlanEditInheritanceSkeleton implements org.ccsds.moims.mo.mal.provider.MALInteractionHandler, org.ccsds.moims.mo.mps.planedit.provider.PlanEditSkeleton, org.ccsds.moims.mo.mps.planedit.provider.PlanEditHandler { + + /** + * The providerSet field. + */ + private org.ccsds.moims.mo.mal.provider.MALProviderSet providerSet = new org.ccsds.moims.mo.mal.provider.MALProviderSet(org.ccsds.moims.mo.mps.planedit.PlanEditHelper.PLANEDIT_SERVICE); + + /** + * Returns the connection object for this provider. + * + * @return the connection object for this provider + * @throws java.io.IOException if the method was not implemented yet. + */ + public org.ccsds.moims.mo.mal.helpertools.connections.ConnectionProvider getConnection() throws java.io.IOException { + throw new java.io.IOException("This method needs to be overridden!"); + } + + @Override + public void setSkeleton(org.ccsds.moims.mo.mps.planedit.provider.PlanEditSkeleton skeleton) { + // Not used in the inheritance pattern (the skeleton is 'this'); + } + + @Override + public void malInitialize(org.ccsds.moims.mo.mal.provider.MALProvider provider) throws org.ccsds.moims.mo.mal.MALException { + providerSet.addProvider(provider); + } + + @Override + public void malFinalize(org.ccsds.moims.mo.mal.provider.MALProvider provider) throws org.ccsds.moims.mo.mal.MALException { + providerSet.removeProvider(provider); + } + + @Override + public void handleSend(org.ccsds.moims.mo.mal.provider.MALInteraction interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + switch (opNumber) { + default: + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } + + @Override + public void handleSubmit(org.ccsds.moims.mo.mal.provider.MALSubmit interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + try { + switch (opNumber) { + case org.ccsds.moims.mo.mps.planedit.PlanEditServiceInfo._UPDATEPLANSTATUS_OP_NUMBER: + updatePlanStatus((org.ccsds.moims.mo.mal.structures.ObjectRef) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.ObjectRef()), + (org.ccsds.moims.mo.mps.structures.PlanStatusEnum) body.getBodyElement(1, org.ccsds.moims.mo.mps.structures.PlanStatusEnum.DRAFT), + (body.getBodyElement(2, new org.ccsds.moims.mo.mal.structures.Union(Boolean.FALSE)) == null) ? null : ((org.ccsds.moims.mo.mal.structures.Union) body.getBodyElement(2, new org.ccsds.moims.mo.mal.structures.Union(Boolean.FALSE))).getBooleanValue(), + interaction); + interaction.sendAcknowledgement(); + break; + case org.ccsds.moims.mo.mps.planedit.PlanEditServiceInfo._DELETEACTIVITY_OP_NUMBER: + deleteActivity((org.ccsds.moims.mo.mal.structures.ObjectRef) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.ObjectRef()), + (org.ccsds.moims.mo.mal.structures.ObjectRef) body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.ObjectRef()), + interaction); + interaction.sendAcknowledgement(); + break; + case org.ccsds.moims.mo.mps.planedit.PlanEditServiceInfo._DELETEEVENT_OP_NUMBER: + deleteEvent((org.ccsds.moims.mo.mal.structures.ObjectRef) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.ObjectRef()), + (org.ccsds.moims.mo.mal.structures.ObjectRef) body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.ObjectRef()), + interaction); + interaction.sendAcknowledgement(); + break; + case org.ccsds.moims.mo.mps.planedit.PlanEditServiceInfo._UPDATEACTIVITY_OP_NUMBER: + updateActivity((org.ccsds.moims.mo.mal.structures.ObjectRef) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.ObjectRef()), + (org.ccsds.moims.mo.mps.structures.ActivityUpdate) body.getBodyElement(1, new org.ccsds.moims.mo.mps.structures.ActivityUpdate()), + interaction); + interaction.sendAcknowledgement(); + break; + case org.ccsds.moims.mo.mps.planedit.PlanEditServiceInfo._UPDATEEVENT_OP_NUMBER: + updateEvent((org.ccsds.moims.mo.mal.structures.ObjectRef) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.ObjectRef()), + (org.ccsds.moims.mo.mps.structures.EventUpdate) body.getBodyElement(1, new org.ccsds.moims.mo.mps.structures.EventUpdate()), + interaction); + interaction.sendAcknowledgement(); + break; + case org.ccsds.moims.mo.mps.planedit.PlanEditServiceInfo._UPDATERESOURCEVALUE_OP_NUMBER: + updateResourceValue((org.ccsds.moims.mo.mal.structures.ObjectRef) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.ObjectRef()), + (org.ccsds.moims.mo.mps.structures.ResourceUpdate) body.getBodyElement(1, new org.ccsds.moims.mo.mps.structures.ResourceUpdate()), + interaction); + interaction.sendAcknowledgement(); + break; + case org.ccsds.moims.mo.mps.planedit.PlanEditServiceInfo._UPDATERESOURCEPROFILE_OP_NUMBER: + updateResourceProfile((org.ccsds.moims.mo.mal.structures.ObjectRef) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.ObjectRef()), + (org.ccsds.moims.mo.mps.structures.ResourceProfile) body.getBodyElement(1, new org.ccsds.moims.mo.mps.structures.ResourceProfile()), + interaction); + interaction.sendAcknowledgement(); + break; + case org.ccsds.moims.mo.mps.planedit.PlanEditServiceInfo._APPLYTIMESHIFT_OP_NUMBER: + applyTimeShift((org.ccsds.moims.mo.mal.structures.ObjectRef) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.ObjectRef()), + (org.ccsds.moims.mo.mal.structures.IdentifierList) body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.IdentifierList()), + (org.ccsds.moims.mo.mps.structures.TimeWindow) body.getBodyElement(2, new org.ccsds.moims.mo.mps.structures.TimeWindow()), + (org.ccsds.moims.mo.mal.structures.Duration) body.getBodyElement(3, new org.ccsds.moims.mo.mal.structures.Duration()), + interaction); + interaction.sendAcknowledgement(); + break; + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } catch (org.ccsds.moims.mo.mal.MOErrorException error) { + throw new org.ccsds.moims.mo.mal.MALInteractionException(error); + } + } + + @Override + public void handleRequest(org.ccsds.moims.mo.mal.provider.MALRequest interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + try { + switch (opNumber) { + case org.ccsds.moims.mo.mps.planedit.PlanEditServiceInfo._INSERTACTIVITY_OP_NUMBER: + interaction.sendResponse(insertActivity((org.ccsds.moims.mo.mps.structures.InsertedActivityDetails) body.getBodyElement(0, new org.ccsds.moims.mo.mps.structures.InsertedActivityDetails()), + interaction)); + break; + case org.ccsds.moims.mo.mps.planedit.PlanEditServiceInfo._INSERTEVENT_OP_NUMBER: + interaction.sendResponse(insertEvent((org.ccsds.moims.mo.mps.structures.InsertedEventDetails) body.getBodyElement(0, new org.ccsds.moims.mo.mps.structures.InsertedEventDetails()), + interaction)); + break; + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } catch (org.ccsds.moims.mo.mal.MOErrorException error) { + throw new org.ccsds.moims.mo.mal.MALInteractionException(error); + } + } + + @Override + public void handleInvoke(org.ccsds.moims.mo.mal.provider.MALInvoke interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + switch (opNumber) { + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } + + @Override + public void handleProgress(org.ccsds.moims.mo.mal.provider.MALProgress interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + switch (opNumber) { + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planedit/provider/PlanEditSkeleton.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planedit/provider/PlanEditSkeleton.java new file mode 100644 index 00000000..f2f9e5c8 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planedit/provider/PlanEditSkeleton.java @@ -0,0 +1,8 @@ +package org.ccsds.moims.mo.mps.planedit.provider; + +/** + * The skeleton interface for the PlanEdit service. + */ +public interface PlanEditSkeleton { + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planedit/provider/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planedit/provider/package-info.java new file mode 100644 index 00000000..6f73f5fc --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planedit/provider/package-info.java @@ -0,0 +1,4 @@ +/** + * Package containing the provider skeletons for the PlanEdit service. +*/ +package org.ccsds.moims.mo.mps.planedit.provider; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planexecutioncontrol/PlanExecutionControlHelper.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planexecutioncontrol/PlanExecutionControlHelper.java new file mode 100644 index 00000000..c846e714 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planexecutioncontrol/PlanExecutionControlHelper.java @@ -0,0 +1,17 @@ +package org.ccsds.moims.mo.mps.planexecutioncontrol; + +/** + * Helper class for PlanExecutionControl service. + */ +public class PlanExecutionControlHelper { + + /** + * Service singleton instance. + */ + public static final org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo PLANEXECUTIONCONTROL_SERVICE = new org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo(); + + private PlanExecutionControlHelper() { + // Utility class; not meant to be instantiated. + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planexecutioncontrol/PlanExecutionControlServiceInfo.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planexecutioncontrol/PlanExecutionControlServiceInfo.java new file mode 100644 index 00000000..11a129ec --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planexecutioncontrol/PlanExecutionControlServiceInfo.java @@ -0,0 +1,461 @@ +package org.ccsds.moims.mo.mps.planexecutioncontrol; + +/** + * Helper class for PlanExecutionControl service. + */ +public class PlanExecutionControlServiceInfo extends org.ccsds.moims.mo.mal.ServiceInfo { + + /** + * Service number literal. + */ + public static final int _PLANEXECUTIONCONTROL_SERVICE_NUMBER = 3; + + /** + * Service number instance. + */ + public static final org.ccsds.moims.mo.mal.structures.UShort PLANEXECUTIONCONTROL_SERVICE_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_PLANEXECUTIONCONTROL_SERVICE_NUMBER); + + /** + * Service name constant. + */ + public static final org.ccsds.moims.mo.mal.structures.Identifier PLANEXECUTIONCONTROL_SERVICE_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("PlanExecutionControl"); + + /** + * The service key of this service. + */ + private static final org.ccsds.moims.mo.mal.ServiceKey SERVICE_KEY = new org.ccsds.moims.mo.mal.ServiceKey( + 5, 1, PLANEXECUTIONCONTROL_SERVICE_NUMBER); + + /** + * Operation number literal for operation SUBMITPLAN. + */ + public static final int _SUBMITPLAN_OP_NUMBER = 1; + + /** + * Operation number instance for operation SUBMITPLAN. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort SUBMITPLAN_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_SUBMITPLAN_OP_NUMBER); + + /** + * Operation instance for operation SUBMITPLAN. + */ + public static final org.ccsds.moims.mo.mal.MALSubmitOperation SUBMITPLAN_OP = new org.ccsds.moims.mo.mal.MALSubmitOperation(SERVICE_KEY, + SUBMITPLAN_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("submitPlan"), + new org.ccsds.moims.mo.mal.structures.UShort(1), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("plan", false, org.ccsds.moims.mo.mps.structures.Plan.SHORT_FORM, "")}, + "The submitPlan operation is used to send a plan to a plan execution function (the service provider), making it available for execution. The service provider acknowledges the reception of the plan or returns an error. NOTE – The submitted plan may be a full plan or a patch plan."); + + /** + * Operation number literal for operation REVOKEPLAN. + */ + public static final int _REVOKEPLAN_OP_NUMBER = 2; + + /** + * Operation number instance for operation REVOKEPLAN. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort REVOKEPLAN_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_REVOKEPLAN_OP_NUMBER); + + /** + * Operation instance for operation REVOKEPLAN. + */ + public static final org.ccsds.moims.mo.mal.MALSubmitOperation REVOKEPLAN_OP = new org.ccsds.moims.mo.mal.MALSubmitOperation(SERVICE_KEY, + REVOKEPLAN_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("revokePlan"), + new org.ccsds.moims.mo.mal.structures.UShort(1), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("planRef", false, org.ccsds.moims.mo.mal.structures.ObjectRef.OBJECTREF_SHORT_FORM, "")}, + "The revokePlan operation is used to request a plan execution function to revoke a previously submitted Plan, making it unavailable for execution. The service provider acknowledges the revocation of the Plan or returns an error."); + + /** + * Operation number literal for operation GETPLANSTATUS. + */ + public static final int _GETPLANSTATUS_OP_NUMBER = 3; + + /** + * Operation number instance for operation GETPLANSTATUS. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort GETPLANSTATUS_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_GETPLANSTATUS_OP_NUMBER); + + /** + * Operation instance for operation GETPLANSTATUS. + */ + public static final org.ccsds.moims.mo.mal.MALRequestOperation GETPLANSTATUS_OP = new org.ccsds.moims.mo.mal.MALRequestOperation(SERVICE_KEY, + GETPLANSTATUS_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("getPlanStatus"), + new org.ccsds.moims.mo.mal.structures.UShort(1), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("planRefs", false, org.ccsds.moims.mo.mal.structures.ObjectRefList.SHORT_FORM, "")}, + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("planStatus", false, org.ccsds.moims.mo.mps.structures.PlanUpdateList.SHORT_FORM, "")}, + "The getPlanStatus operation is used to obtain the current status of one or more known Plans that have been previously submitted to a plan execution function."); + + /** + * Operation number literal for operation ACTIVATEPLAN. + */ + public static final int _ACTIVATEPLAN_OP_NUMBER = 4; + + /** + * Operation number instance for operation ACTIVATEPLAN. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort ACTIVATEPLAN_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_ACTIVATEPLAN_OP_NUMBER); + + /** + * Operation instance for operation ACTIVATEPLAN. + */ + public static final org.ccsds.moims.mo.mal.MALRequestOperation ACTIVATEPLAN_OP = new org.ccsds.moims.mo.mal.MALRequestOperation(SERVICE_KEY, + ACTIVATEPLAN_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("activatePlan"), + new org.ccsds.moims.mo.mal.structures.UShort(2), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("planRefs", false, org.ccsds.moims.mo.mal.structures.ObjectRefList.SHORT_FORM, "")}, + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("activationStatus", false, org.ccsds.moims.mo.mps.structures.PlanActivationStatusList.SHORT_FORM, "")}, + "The activatePlan operation is used to request the execution of specified Plans that have previously been submitted to a plan execution function. The service provider enables the execution of the referenced Plans and the ActivityInstances contained within them, subject to the triggering constraints specified within the Plans. It is not possible to activate a Plan outside its validity period, or after the start of the Plan period. In this case, the operation will return an ACTIVATE_FAILED error. NOTES Multiple plans with a common precursor may have been submitted to a plan execution function. Usually only one of these is considered the nominal plan, the other alternative or contingency plans having the isAlternate flag set. It is implementation dependent whether the service provider will allow activation of Plans that have the isAlternate flag set, but this may be blocked for operational safety. Where this is the case, the plan edit service can be used to change the state of the isAlternate flag prior to activation (see 3.9.5). In order to activate a patch Plan, the precursor Plan on which it is based must also be activated. It is recommended that the activatePlan operation references the target Plan (the result of merging the patch Plan with its precursor), rather than the patch Plan itself (although this is allowed). It is implementation dependent how it is achieved (merge patch with precursor prior to activation, or activate precursor and then merge patch), but if the precursor Plan is not already activated, then activating a target or patch Plan implies that the precursor is also activated. If the precursor plan has not previously been submitted to the service provider (or has been revoked), then it is not possible to activate the target or patch Plan."); + + /** + * Operation number literal for operation DEACTIVATEPLAN. + */ + public static final int _DEACTIVATEPLAN_OP_NUMBER = 5; + + /** + * Operation number instance for operation DEACTIVATEPLAN. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort DEACTIVATEPLAN_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_DEACTIVATEPLAN_OP_NUMBER); + + /** + * Operation instance for operation DEACTIVATEPLAN. + */ + public static final org.ccsds.moims.mo.mal.MALRequestOperation DEACTIVATEPLAN_OP = new org.ccsds.moims.mo.mal.MALRequestOperation(SERVICE_KEY, + DEACTIVATEPLAN_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("deactivatePlan"), + new org.ccsds.moims.mo.mal.structures.UShort(2), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("planRefs", false, org.ccsds.moims.mo.mal.structures.ObjectRefList.SHORT_FORM, ""), + new org.ccsds.moims.mo.mal.OperationField("deactivationMode", false, org.ccsds.moims.mo.mal.structures.Attribute.IDENTIFIER_SHORT_FORM, "")}, + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("activationStatus", false, org.ccsds.moims.mo.mps.structures.PlanActivationStatusList.SHORT_FORM, "")}, + "The deactivatePlan operation is used to request deactivation of specified Plans that have previously been activated. The service provider disables the execution of the referenced Plans and the ActivityInstances contained within them, where it is possible to do so. The deactivationMode argument allows selection of the deactivation behavior. For example: Orderly (ceases execution of any new activities, but allows those already initiated to complete); Rapid (ceases execution of the Plan, but allows activities already initiated to continue until their next defined breakpoint); Immediate (ceases execution of the Plan and all activities currently in progress). It should be noted that it is dependent on the service provider implementation which deactivationModes are supported, and that the above list is not exhaustive. The service provider returns a list of PlanActivationStatus data structures comprising Plan status and activationInfo as a String for each Plan in the deactivation list. The activationInfo allows the return of deployment specific details on the deactivation, such as the deactivation mode applied or reasons for a failure to deactivate. If a Plan is deactivated prior to any of its constituent ActivityInstances being executed (or before the specified planPeriodStart), then all new ActivityInstances and EventInstances contained in the Plan are unloaded or removed, and the status of the Plan reverts to SUBMITTED. If a Plan is deactivated after any of its constituent ActivityInstances have been executed (or after the specified planPeriodStart), then the status of the Plan and the status of all contained ActivityInstances and EventInstances that will not be executed are set to TERMINATED with the additional statusInfo ‘CANCELLED’."); + + /** + * Operation number literal for operation MONITORPLANEXECUTION. + */ + public static final int _MONITORPLANEXECUTION_OP_NUMBER = 6; + + /** + * Operation number instance for operation MONITORPLANEXECUTION. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort MONITORPLANEXECUTION_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_MONITORPLANEXECUTION_OP_NUMBER); + + /** + * Operation instance for operation MONITORPLANEXECUTION. + */ + public static final org.ccsds.moims.mo.mal.MALPubSubOperation MONITORPLANEXECUTION_OP = new org.ccsds.moims.mo.mal.MALPubSubOperation(SERVICE_KEY, + MONITORPLANEXECUTION_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("monitorPlanExecution"), + new org.ccsds.moims.mo.mal.structures.UShort(3), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("planUpdate", false, org.ccsds.moims.mo.mps.structures.PlanUpdate.SHORT_FORM, "")}, + "The monitorPlanExecution operation is used to subscribe to status updates for a filtered set of Plans that have been submitted to a plan execution function. The operation uses the Publish-Subscribe interaction pattern, with the body of the notification message comprising a PlanUpdate for a subscribed Plan. The operation is equivalent to the monitorPlanStatus operation of the Plan Distribution Service, but only reports the status of plans currently being managed by a plan execution function."); + + /** + * Key names instance for MONITORPLANEXECUTION operation of pubsub interaction + * pattern. + */ + private static final org.ccsds.moims.mo.mal.structures.Identifier [] _MONITORPLANEXECUTION_OP_KEY_NAMES = {new org.ccsds.moims.mo.mal.structures.Identifier("planID"), + new org.ccsds.moims.mo.mal.structures.Identifier("precursor"), + new org.ccsds.moims.mo.mal.structures.Identifier("status"), + new org.ccsds.moims.mo.mal.structures.Identifier("originator")}; + + /** + * Key names instance for MONITORPLANEXECUTION operation of pubsub interaction + * pattern. + */ + private static final org.ccsds.moims.mo.mal.structures.IdentifierList MONITORPLANEXECUTION_OP_KEY_NAMES = new org.ccsds.moims.mo.mal.structures.IdentifierList(new java.util.ArrayList<>(java.util.Arrays.asList(_MONITORPLANEXECUTION_OP_KEY_NAMES))); + + /** + * Operation number literal for operation MONITORPLANEXECUTIONDETAIL. + */ + public static final int _MONITORPLANEXECUTIONDETAIL_OP_NUMBER = 7; + + /** + * Operation number instance for operation MONITORPLANEXECUTIONDETAIL. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort MONITORPLANEXECUTIONDETAIL_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_MONITORPLANEXECUTIONDETAIL_OP_NUMBER); + + /** + * Operation instance for operation MONITORPLANEXECUTIONDETAIL. + */ + public static final org.ccsds.moims.mo.mal.MALPubSubOperation MONITORPLANEXECUTIONDETAIL_OP = new org.ccsds.moims.mo.mal.MALPubSubOperation(SERVICE_KEY, + MONITORPLANEXECUTIONDETAIL_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("monitorPlanExecutionDetail"), + new org.ccsds.moims.mo.mal.structures.UShort(4), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("detailUpdate", false, null, "")}, + "The monitorPlanExecutionDetail operation is used to subscribe to updates that report changes in the detailed execution status for a filtered set of Plan contents at the level of planning activities, events and resources. A planning function requires feedback at the level of planning activities and events to be able to reconstitute the status of planning requests, as well to support re-planning. The operation uses the Publish-Subscribe interaction pattern. It is implementation dependent which details are reported on, but this may be any combination of planning activities, events, and resources. The notification message body comprises a single structure of the abstract class PlanDetailUpdate, which corresponds to one of the concrete classes ActivityUpdate, EventUpdate, or ResourceUpdate."); + + /** + * Key names instance for MONITORPLANEXECUTIONDETAIL operation of pubsub interaction + * pattern. + */ + private static final org.ccsds.moims.mo.mal.structures.Identifier [] _MONITORPLANEXECUTIONDETAIL_OP_KEY_NAMES = {new org.ccsds.moims.mo.mal.structures.Identifier("planID"), + new org.ccsds.moims.mo.mal.structures.Identifier("subPlan"), + new org.ccsds.moims.mo.mal.structures.Identifier("tag"), + new org.ccsds.moims.mo.mal.structures.Identifier("type")}; + + /** + * Key names instance for MONITORPLANEXECUTIONDETAIL operation of pubsub interaction + * pattern. + */ + private static final org.ccsds.moims.mo.mal.structures.IdentifierList MONITORPLANEXECUTIONDETAIL_OP_KEY_NAMES = new org.ccsds.moims.mo.mal.structures.IdentifierList(new java.util.ArrayList<>(java.util.Arrays.asList(_MONITORPLANEXECUTIONDETAIL_OP_KEY_NAMES))); + + /** + * Operation number literal for operation ACTIVATESUBPLAN. + */ + public static final int _ACTIVATESUBPLAN_OP_NUMBER = 8; + + /** + * Operation number instance for operation ACTIVATESUBPLAN. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort ACTIVATESUBPLAN_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_ACTIVATESUBPLAN_OP_NUMBER); + + /** + * Operation instance for operation ACTIVATESUBPLAN. + */ + public static final org.ccsds.moims.mo.mal.MALRequestOperation ACTIVATESUBPLAN_OP = new org.ccsds.moims.mo.mal.MALRequestOperation(SERVICE_KEY, + ACTIVATESUBPLAN_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("activateSubPlan"), + new org.ccsds.moims.mo.mal.structures.UShort(5), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("subPlanIDs", false, org.ccsds.moims.mo.mal.structures.IdentifierList.SHORT_FORM, "")}, + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("activationStatus", false, org.ccsds.moims.mo.mps.structures.SubPlanActivationStatusList.SHORT_FORM, "")}, + "The activateSubPlan operation is used to request that the service provider activates the referenced SubPlans and enables the execution of ActivityInstances that are contained in activated Plans and allocated to activated SubPlans. NOTES It is implementation dependent whether SubPlans are initially ACTIVATED and therefore do not require activation unless previously deactivated. Where the operation is directly supported by the service provider there is little reason for the activation to fail, but if the operation is delegated, for example to an on-board planning function, there is the potential for the operation to fail."); + + /** + * Operation number literal for operation DEACTIVATESUBPLAN. + */ + public static final int _DEACTIVATESUBPLAN_OP_NUMBER = 9; + + /** + * Operation number instance for operation DEACTIVATESUBPLAN. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort DEACTIVATESUBPLAN_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_DEACTIVATESUBPLAN_OP_NUMBER); + + /** + * Operation instance for operation DEACTIVATESUBPLAN. + */ + public static final org.ccsds.moims.mo.mal.MALRequestOperation DEACTIVATESUBPLAN_OP = new org.ccsds.moims.mo.mal.MALRequestOperation(SERVICE_KEY, + DEACTIVATESUBPLAN_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("deactivateSubPlan"), + new org.ccsds.moims.mo.mal.structures.UShort(5), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("subPlanIDs", false, org.ccsds.moims.mo.mal.structures.IdentifierList.SHORT_FORM, ""), + new org.ccsds.moims.mo.mal.OperationField("deactivationMode", false, org.ccsds.moims.mo.mal.structures.Attribute.STRING_SHORT_FORM, "")}, + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("activationStatus", false, org.ccsds.moims.mo.mps.structures.SubPlanActivationStatusList.SHORT_FORM, "")}, + "The deactivateSubPlan operation is used to request that the service provider deactivates the referenced SubPlans and disables the execution of ActivityInstances that are contained in activated Plans and allocated to the deactivated SubPlans, where it is possible to do so. The deactivationMode argument allows selection of the deactivation behavior. For example: Orderly (ceases execution of any new activities, but allows those already initiated to complete); Rapid (ceases execution of the Sub-plan, but allows activities already initiated to continue until their next defined breakpoint); Immediate (ceases execution of the Sub-plan and all activities currently in progress). It should be noted that it is dependent on the service provider implementation which deactivationModes are supported, and that the above list is not exhaustive. The service provider returns a list of SubPlanActivationStatus data structures comprising sub-plan status and activationInfo as a String for each sub-plan in the deactivation list. The activationInfo allows the return of deployment specific details on the deactivation, such as the deactivation mode applied or reasons for a failure to deactivate. NOTE – Where the operation is directly supported by the service provider there is little reason for the deactivation to fail, but if the operation is delegated, for example to an on-board planning function, there is the potential for the operation to fail."); + + /** + * Operation number literal for operation GETSUBPLANSTATUS. + */ + public static final int _GETSUBPLANSTATUS_OP_NUMBER = 10; + + /** + * Operation number instance for operation GETSUBPLANSTATUS. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort GETSUBPLANSTATUS_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_GETSUBPLANSTATUS_OP_NUMBER); + + /** + * Operation instance for operation GETSUBPLANSTATUS. + */ + public static final org.ccsds.moims.mo.mal.MALRequestOperation GETSUBPLANSTATUS_OP = new org.ccsds.moims.mo.mal.MALRequestOperation(SERVICE_KEY, + GETSUBPLANSTATUS_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("getSubPlanStatus"), + new org.ccsds.moims.mo.mal.structures.UShort(5), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("subPlanIDs", false, org.ccsds.moims.mo.mal.structures.IdentifierList.SHORT_FORM, "")}, + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("subPlanStatus", false, org.ccsds.moims.mo.mps.structures.SubPlanUpdateList.SHORT_FORM, "")}, + "The getSubPlanStatus operation is used to obtain the current status of one or more SubPlans."); + + /** + * Operation number literal for operation MONITORSUBPLANEXECUTION. + */ + public static final int _MONITORSUBPLANEXECUTION_OP_NUMBER = 11; + + /** + * Operation number instance for operation MONITORSUBPLANEXECUTION. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort MONITORSUBPLANEXECUTION_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_MONITORSUBPLANEXECUTION_OP_NUMBER); + + /** + * Operation instance for operation MONITORSUBPLANEXECUTION. + */ + public static final org.ccsds.moims.mo.mal.MALPubSubOperation MONITORSUBPLANEXECUTION_OP = new org.ccsds.moims.mo.mal.MALPubSubOperation(SERVICE_KEY, + MONITORSUBPLANEXECUTION_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("monitorSubPlanExecution"), + new org.ccsds.moims.mo.mal.structures.UShort(6), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("subPlanUpdate", false, org.ccsds.moims.mo.mps.structures.SubPlanUpdate.SHORT_FORM, "")}, + "The monitorSubPlanExecution operation is used to subscribe to status updates for a filtered set of SubPlans. The operation uses the Publish-Subscribe interaction pattern, with the body of the notification message comprising a SubPlanUpdate for a subscribed sub-plan."); + + /** + * Key names instance for MONITORSUBPLANEXECUTION operation of pubsub interaction + * pattern. + */ + private static final org.ccsds.moims.mo.mal.structures.Identifier [] _MONITORSUBPLANEXECUTION_OP_KEY_NAMES = {new org.ccsds.moims.mo.mal.structures.Identifier("subPlan")}; + + /** + * Key names instance for MONITORSUBPLANEXECUTION operation of pubsub interaction + * pattern. + */ + private static final org.ccsds.moims.mo.mal.structures.IdentifierList MONITORSUBPLANEXECUTION_OP_KEY_NAMES = new org.ccsds.moims.mo.mal.structures.IdentifierList(new java.util.ArrayList<>(java.util.Arrays.asList(_MONITORSUBPLANEXECUTION_OP_KEY_NAMES))); + + /** + * Operation number literal for operation SUSPENDACTIVITY. + */ + public static final int _SUSPENDACTIVITY_OP_NUMBER = 12; + + /** + * Operation number instance for operation SUSPENDACTIVITY. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort SUSPENDACTIVITY_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_SUSPENDACTIVITY_OP_NUMBER); + + /** + * Operation instance for operation SUSPENDACTIVITY. + */ + public static final org.ccsds.moims.mo.mal.MALRequestOperation SUSPENDACTIVITY_OP = new org.ccsds.moims.mo.mal.MALRequestOperation(SERVICE_KEY, + SUSPENDACTIVITY_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("suspendActivity"), + new org.ccsds.moims.mo.mal.structures.UShort(7), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("planRefs", true, org.ccsds.moims.mo.mal.structures.ObjectRefList.SHORT_FORM, ""), + new org.ccsds.moims.mo.mal.OperationField("activityRefs", true, org.ccsds.moims.mo.mal.structures.ObjectRefList.SHORT_FORM, ""), + new org.ccsds.moims.mo.mal.OperationField("tags", true, org.ccsds.moims.mo.mal.structures.StringList.SHORT_FORM, ""), + new org.ccsds.moims.mo.mal.OperationField("suspensionMode", false, org.ccsds.moims.mo.mal.structures.Attribute.STRING_SHORT_FORM, "")}, + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("suspensionStatus", false, org.ccsds.moims.mo.mps.structures.ActivitySuspensionStatusList.SHORT_FORM, "")}, + "The suspendActivity operation is used to request suspension of the execution of selected activities in one or more plans, without changing the state of the plan(s). The suspensionMode argument allows selection of the suspension behavior. For example: Orderly (suspends execution of any new activities, but allows those already initiated to complete); Rapid (suspends execution of any new activities, but allows any activities and their sub-activities already initiated to continue until their next defined breakpoint); Immediate (suspends execution of all activities, including those currently in progress). It should be noted that it is dependent on the service provider implementation which deactivationModes are supported, and that the above list is not exhaustive. The service provider responds with a list of ActivitySuspensionStatus data structures comprising activity status and suspensionInfo (as a String) for each activity subject to the suspension request. The suspensionInfo allows the return of deployment specific details on the suspension, such as the suspension mode applied or reasons for a failure to suspend."); + + /** + * Operation number literal for operation RESUMEACTIVITY. + */ + public static final int _RESUMEACTIVITY_OP_NUMBER = 13; + + /** + * Operation number instance for operation RESUMEACTIVITY. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort RESUMEACTIVITY_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_RESUMEACTIVITY_OP_NUMBER); + + /** + * Operation instance for operation RESUMEACTIVITY. + */ + public static final org.ccsds.moims.mo.mal.MALRequestOperation RESUMEACTIVITY_OP = new org.ccsds.moims.mo.mal.MALRequestOperation(SERVICE_KEY, + RESUMEACTIVITY_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("resumeActivity"), + new org.ccsds.moims.mo.mal.structures.UShort(7), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("planRefs", true, org.ccsds.moims.mo.mal.structures.ObjectRefList.SHORT_FORM, ""), + new org.ccsds.moims.mo.mal.OperationField("activityRefs", true, org.ccsds.moims.mo.mal.structures.ObjectRefList.SHORT_FORM, ""), + new org.ccsds.moims.mo.mal.OperationField("tags", true, org.ccsds.moims.mo.mal.structures.StringList.SHORT_FORM, "")}, + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("suspensionStatus", false, org.ccsds.moims.mo.mps.structures.ActivitySuspensionStatusList.SHORT_FORM, "")}, + "The resumeActivity operation is used to request resumption of the execution of selected activities in one or more plans, without changing the state of the plan(s). The service provider responds with a list of ActivitySuspensionStatus data structures comprising activity status and suspensionInfo (as a String) for each activity subject to the resumption request. The suspensionInfo allows the return of deployment specific details on the resumption, such as the reasons for a failure to resume."); + + /** + * Operation number literal for operation GETACTIVITYSTATUS. + */ + public static final int _GETACTIVITYSTATUS_OP_NUMBER = 14; + + /** + * Operation number instance for operation GETACTIVITYSTATUS. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort GETACTIVITYSTATUS_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_GETACTIVITYSTATUS_OP_NUMBER); + + /** + * Operation instance for operation GETACTIVITYSTATUS. + */ + public static final org.ccsds.moims.mo.mal.MALRequestOperation GETACTIVITYSTATUS_OP = new org.ccsds.moims.mo.mal.MALRequestOperation(SERVICE_KEY, + GETACTIVITYSTATUS_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("getActivityStatus"), + new org.ccsds.moims.mo.mal.structures.UShort(8), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("planRefs", true, org.ccsds.moims.mo.mal.structures.ObjectRefList.SHORT_FORM, ""), + new org.ccsds.moims.mo.mal.OperationField("activityRefs", true, org.ccsds.moims.mo.mal.structures.ObjectRefList.SHORT_FORM, ""), + new org.ccsds.moims.mo.mal.OperationField("subPlans", true, org.ccsds.moims.mo.mal.structures.IdentifierList.SHORT_FORM, ""), + new org.ccsds.moims.mo.mal.OperationField("tags", true, org.ccsds.moims.mo.mal.structures.StringList.SHORT_FORM, "")}, + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("activityStatus", false, org.ccsds.moims.mo.mps.structures.ActivityUpdateList.SHORT_FORM, "")}, + "The getActivityStatus operation is used to request a detailed report from the service provider on the current status of ActivityInstances, selected at activity, sub-plan, or tag levels."); + + /** + * Area elements. + */ + public static final org.ccsds.moims.mo.mal.structures.Element[] PLANEXECUTIONCONTROL_SERVICE_ELEMENTS = {}; + + /** + * The set of operations for this service. + */ + public static final org.ccsds.moims.mo.mal.MALOperation[] OPERATIONS = new org.ccsds.moims.mo.mal.MALOperation[]{SUBMITPLAN_OP, + REVOKEPLAN_OP, + GETPLANSTATUS_OP, + ACTIVATEPLAN_OP, + DEACTIVATEPLAN_OP, + MONITORPLANEXECUTION_OP, + MONITORPLANEXECUTIONDETAIL_OP, + ACTIVATESUBPLAN_OP, + DEACTIVATESUBPLAN_OP, + GETSUBPLANSTATUS_OP, + MONITORSUBPLANEXECUTION_OP, + SUSPENDACTIVITY_OP, + RESUMEACTIVITY_OP, + GETACTIVITYSTATUS_OP}; + + /** + * Creates an instance of the PlanExecutionControl ServiceInfo. + * + */ + public PlanExecutionControlServiceInfo() { + super(SERVICE_KEY, PLANEXECUTIONCONTROL_SERVICE_NAME, PLANEXECUTIONCONTROL_SERVICE_ELEMENTS, OPERATIONS); + } + + @Override + public org.ccsds.moims.mo.mal.MALArea getArea() { + return org.ccsds.moims.mo.mps.MPSHelper.MPS_AREA; + } + + @Override + public org.ccsds.moims.mo.mal.MOErrorException generateMOError(int errorNumber, + Object extraInfo) { + switch (errorNumber) { + case 1: + return new org.ccsds.moims.mo.mps.InvalidException(extraInfo); + case 2: + return new org.ccsds.moims.mo.mps.CancelFailedException(extraInfo); + case 3: + return new org.ccsds.moims.mo.mps.UpdateFailedException(extraInfo); + case 4: + return new org.ccsds.moims.mo.mps.RevokeFailedException(extraInfo); + case 5: + return new org.ccsds.moims.mo.mps.InsertFailedException(extraInfo); + case 6: + return new org.ccsds.moims.mo.mps.DeleteFailedException(extraInfo); + case 7: + return new org.ccsds.moims.mo.mps.ActivateFailedException(extraInfo); + case 8: + return new org.ccsds.moims.mo.mps.DeactivateFailedException(extraInfo); + case 9: + return new org.ccsds.moims.mo.mps.SubmitFailedException(extraInfo); + case 10: + return new org.ccsds.moims.mo.mps.UnsupportedException(extraInfo); + case 11: + return new org.ccsds.moims.mo.mps.ActivateSubplanFailedException(extraInfo); + case 12: + return new org.ccsds.moims.mo.mps.DeactivateSubplanFailedException(extraInfo); + } + return null; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planexecutioncontrol/consumer/MonitorPlanExecutionDetailSubscriptionKeys.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planexecutioncontrol/consumer/MonitorPlanExecutionDetailSubscriptionKeys.java new file mode 100644 index 00000000..ef44bee2 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planexecutioncontrol/consumer/MonitorPlanExecutionDetailSubscriptionKeys.java @@ -0,0 +1,106 @@ +package org.ccsds.moims.mo.mps.planexecutioncontrol.consumer; + +/** + * Typed accessors for the Subscription Keys of the monitorPlanExecutionDetail + * PubSub operation. + */ +public final class MonitorPlanExecutionDetailSubscriptionKeys { + + /** + * The key values as received in the UpdateHeader. + */ + private org.ccsds.moims.mo.mal.structures.NullableAttributeList keyValues; + + /** + * The effective key names for the received key values. + */ + private org.ccsds.moims.mo.mal.structures.IdentifierList keyNames; + + /** + * The Subscription Key names defined by the operation, in order. + */ + private static final org.ccsds.moims.mo.mal.structures.IdentifierList CANONICAL_KEY_NAMES = new org.ccsds.moims.mo.mal.structures.IdentifierList(new java.util.ArrayList<>(java.util.Arrays.asList(new org.ccsds.moims.mo.mal.structures.Identifier("planID"), new org.ccsds.moims.mo.mal.structures.Identifier("subPlan"), new org.ccsds.moims.mo.mal.structures.Identifier("tag"), new org.ccsds.moims.mo.mal.structures.Identifier("type")))); + + /** + * Creates an instance from the received UpdateHeader and the subscription + * selectedKeys. + * + * @param updateHeader The UpdateHeader received in the NOTIFY message + * @param selectedKeys The selectedKeys of the subscription, or null if trimming was not enabled + */ + public MonitorPlanExecutionDetailSubscriptionKeys(org.ccsds.moims.mo.mal.structures.UpdateHeader updateHeader, + org.ccsds.moims.mo.mal.structures.IdentifierList selectedKeys) { + this.keyValues = (updateHeader == null) ? null : updateHeader.getKeyValues(); + this.keyNames = (selectedKeys != null) ? selectedKeys : CANONICAL_KEY_NAMES; + } + + /** + * Returns the value of the "planID" Subscription Key, or null if not present. + * + * @return The key value, or null if not present + */ + public org.ccsds.moims.mo.mal.structures.Identifier getPlanID() { + return (org.ccsds.moims.mo.mal.structures.Identifier) valueByName("planID"); + } + + /** + * Returns the value of the "subPlan" Subscription Key, or null if not present. + * + * @return The key value, or null if not present + */ + public org.ccsds.moims.mo.mal.structures.Identifier getSubPlan() { + return (org.ccsds.moims.mo.mal.structures.Identifier) valueByName("subPlan"); + } + + /** + * Returns the value of the "tag" Subscription Key, or null if not present. + * + * @return The key value, or null if not present + */ + public String getTag() { + org.ccsds.moims.mo.mal.structures.Attribute v = valueByName("tag"); + return (v == null) ? null : (String) org.ccsds.moims.mo.mal.structures.Attribute.attribute2JavaType(v); + } + + /** + * Returns the value of the "type" Subscription Key, or null if not present. + * + * @return The key value, or null if not present + */ + public org.ccsds.moims.mo.mal.structures.Identifier getType() { + return (org.ccsds.moims.mo.mal.structures.Identifier) valueByName("type"); + } + + /** + * Returns the Subscription Key value with the given name, or null if it is + * not present (for example when it was trimmed away or is a custom key that + * is not part of this subscription). + * + * @param name The Subscription Key name + * @return The key value, or null if not present + */ + public org.ccsds.moims.mo.mal.structures.Attribute getByName(String name) { + return valueByName(name); + } + + /** + * + * @param name The Subscription Key name + */ + private org.ccsds.moims.mo.mal.structures.Attribute valueByName(String name) { + if (keyNames == null || keyValues == null) { + return null; + } + for (int i = 0; i < keyNames.size(); i++) { + if (name.equals(keyNames.get(i).getValue())) { + if (i >= keyValues.size()) { + return null; + } + org.ccsds.moims.mo.mal.structures.NullableAttribute na = keyValues.get(i); + return (na == null) ? null : na.getValue(); + } + } + return null; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planexecutioncontrol/consumer/MonitorPlanExecutionSubscriptionKeys.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planexecutioncontrol/consumer/MonitorPlanExecutionSubscriptionKeys.java new file mode 100644 index 00000000..3343cfdd --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planexecutioncontrol/consumer/MonitorPlanExecutionSubscriptionKeys.java @@ -0,0 +1,106 @@ +package org.ccsds.moims.mo.mps.planexecutioncontrol.consumer; + +/** + * Typed accessors for the Subscription Keys of the monitorPlanExecution PubSub + * operation. + */ +public final class MonitorPlanExecutionSubscriptionKeys { + + /** + * The key values as received in the UpdateHeader. + */ + private org.ccsds.moims.mo.mal.structures.NullableAttributeList keyValues; + + /** + * The effective key names for the received key values. + */ + private org.ccsds.moims.mo.mal.structures.IdentifierList keyNames; + + /** + * The Subscription Key names defined by the operation, in order. + */ + private static final org.ccsds.moims.mo.mal.structures.IdentifierList CANONICAL_KEY_NAMES = new org.ccsds.moims.mo.mal.structures.IdentifierList(new java.util.ArrayList<>(java.util.Arrays.asList(new org.ccsds.moims.mo.mal.structures.Identifier("planID"), new org.ccsds.moims.mo.mal.structures.Identifier("precursor"), new org.ccsds.moims.mo.mal.structures.Identifier("status"), new org.ccsds.moims.mo.mal.structures.Identifier("originator")))); + + /** + * Creates an instance from the received UpdateHeader and the subscription + * selectedKeys. + * + * @param updateHeader The UpdateHeader received in the NOTIFY message + * @param selectedKeys The selectedKeys of the subscription, or null if trimming was not enabled + */ + public MonitorPlanExecutionSubscriptionKeys(org.ccsds.moims.mo.mal.structures.UpdateHeader updateHeader, + org.ccsds.moims.mo.mal.structures.IdentifierList selectedKeys) { + this.keyValues = (updateHeader == null) ? null : updateHeader.getKeyValues(); + this.keyNames = (selectedKeys != null) ? selectedKeys : CANONICAL_KEY_NAMES; + } + + /** + * Returns the value of the "planID" Subscription Key, or null if not present. + * + * @return The key value, or null if not present + */ + public org.ccsds.moims.mo.mal.structures.Identifier getPlanID() { + return (org.ccsds.moims.mo.mal.structures.Identifier) valueByName("planID"); + } + + /** + * Returns the value of the "precursor" Subscription Key, or null if not present. + * + * @return The key value, or null if not present + */ + public org.ccsds.moims.mo.mal.structures.Identifier getPrecursor() { + return (org.ccsds.moims.mo.mal.structures.Identifier) valueByName("precursor"); + } + + /** + * Returns the value of the "status" Subscription Key, or null if not present. + * + * @return The key value, or null if not present + */ + public org.ccsds.moims.mo.mal.structures.UShort getStatus() { + return (org.ccsds.moims.mo.mal.structures.UShort) valueByName("status"); + } + + /** + * Returns the value of the "originator" Subscription Key, or null if not + * present. + * + * @return The key value, or null if not present + */ + public org.ccsds.moims.mo.mal.structures.Identifier getOriginator() { + return (org.ccsds.moims.mo.mal.structures.Identifier) valueByName("originator"); + } + + /** + * Returns the Subscription Key value with the given name, or null if it is + * not present (for example when it was trimmed away or is a custom key that + * is not part of this subscription). + * + * @param name The Subscription Key name + * @return The key value, or null if not present + */ + public org.ccsds.moims.mo.mal.structures.Attribute getByName(String name) { + return valueByName(name); + } + + /** + * + * @param name The Subscription Key name + */ + private org.ccsds.moims.mo.mal.structures.Attribute valueByName(String name) { + if (keyNames == null || keyValues == null) { + return null; + } + for (int i = 0; i < keyNames.size(); i++) { + if (name.equals(keyNames.get(i).getValue())) { + if (i >= keyValues.size()) { + return null; + } + org.ccsds.moims.mo.mal.structures.NullableAttribute na = keyValues.get(i); + return (na == null) ? null : na.getValue(); + } + } + return null; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planexecutioncontrol/consumer/MonitorSubPlanExecutionSubscriptionKeys.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planexecutioncontrol/consumer/MonitorSubPlanExecutionSubscriptionKeys.java new file mode 100644 index 00000000..26ea0680 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planexecutioncontrol/consumer/MonitorSubPlanExecutionSubscriptionKeys.java @@ -0,0 +1,78 @@ +package org.ccsds.moims.mo.mps.planexecutioncontrol.consumer; + +/** + * Typed accessors for the Subscription Keys of the monitorSubPlanExecution + * PubSub operation. + */ +public final class MonitorSubPlanExecutionSubscriptionKeys { + + /** + * The key values as received in the UpdateHeader. + */ + private org.ccsds.moims.mo.mal.structures.NullableAttributeList keyValues; + + /** + * The effective key names for the received key values. + */ + private org.ccsds.moims.mo.mal.structures.IdentifierList keyNames; + + /** + * The Subscription Key names defined by the operation, in order. + */ + private static final org.ccsds.moims.mo.mal.structures.IdentifierList CANONICAL_KEY_NAMES = new org.ccsds.moims.mo.mal.structures.IdentifierList(new java.util.ArrayList<>(java.util.Arrays.asList(new org.ccsds.moims.mo.mal.structures.Identifier("subPlan")))); + + /** + * Creates an instance from the received UpdateHeader and the subscription + * selectedKeys. + * + * @param updateHeader The UpdateHeader received in the NOTIFY message + * @param selectedKeys The selectedKeys of the subscription, or null if trimming was not enabled + */ + public MonitorSubPlanExecutionSubscriptionKeys(org.ccsds.moims.mo.mal.structures.UpdateHeader updateHeader, + org.ccsds.moims.mo.mal.structures.IdentifierList selectedKeys) { + this.keyValues = (updateHeader == null) ? null : updateHeader.getKeyValues(); + this.keyNames = (selectedKeys != null) ? selectedKeys : CANONICAL_KEY_NAMES; + } + + /** + * Returns the value of the "subPlan" Subscription Key, or null if not present. + * + * @return The key value, or null if not present + */ + public org.ccsds.moims.mo.mal.structures.Identifier getSubPlan() { + return (org.ccsds.moims.mo.mal.structures.Identifier) valueByName("subPlan"); + } + + /** + * Returns the Subscription Key value with the given name, or null if it is + * not present (for example when it was trimmed away or is a custom key that + * is not part of this subscription). + * + * @param name The Subscription Key name + * @return The key value, or null if not present + */ + public org.ccsds.moims.mo.mal.structures.Attribute getByName(String name) { + return valueByName(name); + } + + /** + * + * @param name The Subscription Key name + */ + private org.ccsds.moims.mo.mal.structures.Attribute valueByName(String name) { + if (keyNames == null || keyValues == null) { + return null; + } + for (int i = 0; i < keyNames.size(); i++) { + if (name.equals(keyNames.get(i).getValue())) { + if (i >= keyValues.size()) { + return null; + } + org.ccsds.moims.mo.mal.structures.NullableAttribute na = keyValues.get(i); + return (na == null) ? null : na.getValue(); + } + } + return null; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planexecutioncontrol/consumer/PlanExecutionControlAdapter.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planexecutioncontrol/consumer/PlanExecutionControlAdapter.java new file mode 100644 index 00000000..e4d1ca62 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planexecutioncontrol/consumer/PlanExecutionControlAdapter.java @@ -0,0 +1,730 @@ +package org.ccsds.moims.mo.mps.planexecutioncontrol.consumer; + +/** + * Consumer adapter for PlanExecutionControl service. + */ +public abstract class PlanExecutionControlAdapter extends org.ccsds.moims.mo.mal.consumer.MALInteractionAdapter { + + /** + * Called by the MAL when a SUBMIT acknowledgement is received from a provider + * for the operation submitPlan. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void submitPlanAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a SUBMIT acknowledgement error is received from + * a provider for the operation submitPlan. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void submitPlanErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a SUBMIT acknowledgement is received from a provider + * for the operation revokePlan. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void revokePlanAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a SUBMIT acknowledgement error is received from + * a provider for the operation revokePlan. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void revokePlanErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response is received from a provider for + * the operation getPlanStatus. + * + * @param msgHeader msgHeader The header of the received message + * @param planStatus The planStatus field. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void getPlanStatusResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mps.structures.PlanUpdateList planStatus, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response error is received from a provider + * for the operation getPlanStatus. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void getPlanStatusErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response is received from a provider for + * the operation activatePlan. + * + * @param msgHeader msgHeader The header of the received message + * @param activationStatus The activationStatus field. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void activatePlanResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mps.structures.PlanActivationStatusList activationStatus, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response error is received from a provider + * for the operation activatePlan. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void activatePlanErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response is received from a provider for + * the operation deactivatePlan. + * + * @param msgHeader msgHeader The header of the received message + * @param activationStatus The activationStatus field. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void deactivatePlanResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mps.structures.PlanActivationStatusList activationStatus, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response error is received from a provider + * for the operation deactivatePlan. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void deactivatePlanErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PubSub register acknowledgement is received from + * a broker for the operation monitorPlanExecution. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void monitorPlanExecutionRegisterAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PubSub register acknowledgement error is received + * from a broker for the operation monitorPlanExecution. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void monitorPlanExecutionRegisterErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PubSub deregister acknowledgement is received + * from a broker for the operation monitorPlanExecution. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void monitorPlanExecutionDeregisterAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PubSub update is received from a broker for the + * operation monitorPlanExecution. + * + * @param msgHeader msgHeader The header of the received message + * @param subscriptionId The subscriptionId of the subscription. + * @param updateHeader The Update header. + * @param keys The typed Subscription Key accessors for this update + * @param planUpdate The planUpdate field. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void monitorPlanExecutionNotifyReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.structures.Identifier subscriptionId, + org.ccsds.moims.mo.mal.structures.UpdateHeader updateHeader, + MonitorPlanExecutionSubscriptionKeys keys, + org.ccsds.moims.mo.mps.structures.PlanUpdate planUpdate, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PubSub update error is received from a broker + * for the operation monitorPlanExecution. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void monitorPlanExecutionNotifyErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PubSub register acknowledgement is received from + * a broker for the operation monitorPlanExecutionDetail. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void monitorPlanExecutionDetailRegisterAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PubSub register acknowledgement error is received + * from a broker for the operation monitorPlanExecutionDetail. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void monitorPlanExecutionDetailRegisterErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PubSub deregister acknowledgement is received + * from a broker for the operation monitorPlanExecutionDetail. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void monitorPlanExecutionDetailDeregisterAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PubSub update is received from a broker for the + * operation monitorPlanExecutionDetail. + * + * @param msgHeader msgHeader The header of the received message + * @param subscriptionId The subscriptionId of the subscription. + * @param updateHeader The Update header. + * @param keys The typed Subscription Key accessors for this update + * @param detailUpdate The detailUpdate field. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void monitorPlanExecutionDetailNotifyReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.structures.Identifier subscriptionId, + org.ccsds.moims.mo.mal.structures.UpdateHeader updateHeader, + MonitorPlanExecutionDetailSubscriptionKeys keys, + org.ccsds.moims.mo.mps.structures.PlanDetailUpdate detailUpdate, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PubSub update error is received from a broker + * for the operation monitorPlanExecutionDetail. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void monitorPlanExecutionDetailNotifyErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response is received from a provider for + * the operation activateSubPlan. + * + * @param msgHeader msgHeader The header of the received message + * @param activationStatus The activationStatus field. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void activateSubPlanResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mps.structures.SubPlanActivationStatusList activationStatus, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response error is received from a provider + * for the operation activateSubPlan. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void activateSubPlanErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response is received from a provider for + * the operation deactivateSubPlan. + * + * @param msgHeader msgHeader The header of the received message + * @param activationStatus The activationStatus field. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void deactivateSubPlanResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mps.structures.SubPlanActivationStatusList activationStatus, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response error is received from a provider + * for the operation deactivateSubPlan. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void deactivateSubPlanErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response is received from a provider for + * the operation getSubPlanStatus. + * + * @param msgHeader msgHeader The header of the received message + * @param subPlanStatus The subPlanStatus field. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void getSubPlanStatusResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mps.structures.SubPlanUpdateList subPlanStatus, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response error is received from a provider + * for the operation getSubPlanStatus. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void getSubPlanStatusErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PubSub register acknowledgement is received from + * a broker for the operation monitorSubPlanExecution. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void monitorSubPlanExecutionRegisterAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PubSub register acknowledgement error is received + * from a broker for the operation monitorSubPlanExecution. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void monitorSubPlanExecutionRegisterErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PubSub deregister acknowledgement is received + * from a broker for the operation monitorSubPlanExecution. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void monitorSubPlanExecutionDeregisterAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PubSub update is received from a broker for the + * operation monitorSubPlanExecution. + * + * @param msgHeader msgHeader The header of the received message + * @param subscriptionId The subscriptionId of the subscription. + * @param updateHeader The Update header. + * @param keys The typed Subscription Key accessors for this update + * @param subPlanUpdate The subPlanUpdate field. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void monitorSubPlanExecutionNotifyReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.structures.Identifier subscriptionId, + org.ccsds.moims.mo.mal.structures.UpdateHeader updateHeader, + MonitorSubPlanExecutionSubscriptionKeys keys, + org.ccsds.moims.mo.mps.structures.SubPlanUpdate subPlanUpdate, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PubSub update error is received from a broker + * for the operation monitorSubPlanExecution. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void monitorSubPlanExecutionNotifyErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response is received from a provider for + * the operation suspendActivity. + * + * @param msgHeader msgHeader The header of the received message + * @param suspensionStatus The suspensionStatus field. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void suspendActivityResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mps.structures.ActivitySuspensionStatusList suspensionStatus, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response error is received from a provider + * for the operation suspendActivity. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void suspendActivityErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response is received from a provider for + * the operation resumeActivity. + * + * @param msgHeader msgHeader The header of the received message + * @param suspensionStatus The suspensionStatus field. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void resumeActivityResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mps.structures.ActivitySuspensionStatusList suspensionStatus, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response error is received from a provider + * for the operation resumeActivity. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void resumeActivityErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response is received from a provider for + * the operation getActivityStatus. + * + * @param msgHeader msgHeader The header of the received message + * @param activityStatus The activityStatus field. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void getActivityStatusResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mps.structures.ActivityUpdateList activityStatus, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response error is received from a provider + * for the operation getActivityStatus. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void getActivityStatusErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + @Override + public final void submitAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo._SUBMITPLAN_OP_NUMBER: + submitPlanAckReceived(msgHeader, qosProperties); + break; + case org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo._REVOKEPLAN_OP_NUMBER: + revokePlanAckReceived(msgHeader, qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void submitErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALErrorBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo._SUBMITPLAN_OP_NUMBER: + submitPlanErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo._REVOKEPLAN_OP_NUMBER: + revokePlanErrorReceived(msgHeader, body.getError(), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void requestResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALMessageBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo._GETPLANSTATUS_OP_NUMBER: + getPlanStatusResponseReceived(msgHeader, + (org.ccsds.moims.mo.mps.structures.PlanUpdateList) body.getBodyElement(0, new org.ccsds.moims.mo.mps.structures.PlanUpdateList()), qosProperties); + break; + case org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo._ACTIVATEPLAN_OP_NUMBER: + activatePlanResponseReceived(msgHeader, + (org.ccsds.moims.mo.mps.structures.PlanActivationStatusList) body.getBodyElement(0, new org.ccsds.moims.mo.mps.structures.PlanActivationStatusList()), qosProperties); + break; + case org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo._DEACTIVATEPLAN_OP_NUMBER: + deactivatePlanResponseReceived(msgHeader, + (org.ccsds.moims.mo.mps.structures.PlanActivationStatusList) body.getBodyElement(0, new org.ccsds.moims.mo.mps.structures.PlanActivationStatusList()), qosProperties); + break; + case org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo._ACTIVATESUBPLAN_OP_NUMBER: + activateSubPlanResponseReceived(msgHeader, + (org.ccsds.moims.mo.mps.structures.SubPlanActivationStatusList) body.getBodyElement(0, new org.ccsds.moims.mo.mps.structures.SubPlanActivationStatusList()), qosProperties); + break; + case org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo._DEACTIVATESUBPLAN_OP_NUMBER: + deactivateSubPlanResponseReceived(msgHeader, + (org.ccsds.moims.mo.mps.structures.SubPlanActivationStatusList) body.getBodyElement(0, new org.ccsds.moims.mo.mps.structures.SubPlanActivationStatusList()), qosProperties); + break; + case org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo._GETSUBPLANSTATUS_OP_NUMBER: + getSubPlanStatusResponseReceived(msgHeader, + (org.ccsds.moims.mo.mps.structures.SubPlanUpdateList) body.getBodyElement(0, new org.ccsds.moims.mo.mps.structures.SubPlanUpdateList()), qosProperties); + break; + case org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo._SUSPENDACTIVITY_OP_NUMBER: + suspendActivityResponseReceived(msgHeader, + (org.ccsds.moims.mo.mps.structures.ActivitySuspensionStatusList) body.getBodyElement(0, new org.ccsds.moims.mo.mps.structures.ActivitySuspensionStatusList()), qosProperties); + break; + case org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo._RESUMEACTIVITY_OP_NUMBER: + resumeActivityResponseReceived(msgHeader, + (org.ccsds.moims.mo.mps.structures.ActivitySuspensionStatusList) body.getBodyElement(0, new org.ccsds.moims.mo.mps.structures.ActivitySuspensionStatusList()), qosProperties); + break; + case org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo._GETACTIVITYSTATUS_OP_NUMBER: + getActivityStatusResponseReceived(msgHeader, + (org.ccsds.moims.mo.mps.structures.ActivityUpdateList) body.getBodyElement(0, new org.ccsds.moims.mo.mps.structures.ActivityUpdateList()), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void requestErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALErrorBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo._GETPLANSTATUS_OP_NUMBER: + getPlanStatusErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo._ACTIVATEPLAN_OP_NUMBER: + activatePlanErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo._DEACTIVATEPLAN_OP_NUMBER: + deactivatePlanErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo._ACTIVATESUBPLAN_OP_NUMBER: + activateSubPlanErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo._DEACTIVATESUBPLAN_OP_NUMBER: + deactivateSubPlanErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo._GETSUBPLANSTATUS_OP_NUMBER: + getSubPlanStatusErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo._SUSPENDACTIVITY_OP_NUMBER: + suspendActivityErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo._RESUMEACTIVITY_OP_NUMBER: + resumeActivityErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo._GETACTIVITYSTATUS_OP_NUMBER: + getActivityStatusErrorReceived(msgHeader, body.getError(), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void registerAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo._MONITORPLANEXECUTION_OP_NUMBER: + monitorPlanExecutionRegisterAckReceived(msgHeader, qosProperties); + break; + case org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo._MONITORPLANEXECUTIONDETAIL_OP_NUMBER: + monitorPlanExecutionDetailRegisterAckReceived(msgHeader, qosProperties); + break; + case org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo._MONITORSUBPLANEXECUTION_OP_NUMBER: + monitorSubPlanExecutionRegisterAckReceived(msgHeader, qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void registerErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALErrorBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo._MONITORPLANEXECUTION_OP_NUMBER: + monitorPlanExecutionRegisterErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo._MONITORPLANEXECUTIONDETAIL_OP_NUMBER: + monitorPlanExecutionDetailRegisterErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo._MONITORSUBPLANEXECUTION_OP_NUMBER: + monitorSubPlanExecutionRegisterErrorReceived(msgHeader, body.getError(), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void notifyReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALNotifyBody body, + org.ccsds.moims.mo.mal.structures.IdentifierList selectedKeys, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + if ((org.ccsds.moims.mo.mps.MPSHelper.MPS_AREA_NUMBER.equals(msgHeader.getServiceArea())) && (org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo.PLANEXECUTIONCONTROL_SERVICE_NUMBER.equals(msgHeader.getService()))) { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo._MONITORPLANEXECUTION_OP_NUMBER: + monitorPlanExecutionNotifyReceived(msgHeader, + (org.ccsds.moims.mo.mal.structures.Identifier) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.Identifier()), + (org.ccsds.moims.mo.mal.structures.UpdateHeader) body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.UpdateHeader()), + new MonitorPlanExecutionSubscriptionKeys((org.ccsds.moims.mo.mal.structures.UpdateHeader) body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.UpdateHeader()), selectedKeys), + (org.ccsds.moims.mo.mps.structures.PlanUpdate) body.getBodyElement(2, new org.ccsds.moims.mo.mps.structures.PlanUpdate()), qosProperties); + break; + case org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo._MONITORPLANEXECUTIONDETAIL_OP_NUMBER: + monitorPlanExecutionDetailNotifyReceived(msgHeader, + (org.ccsds.moims.mo.mal.structures.Identifier) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.Identifier()), + (org.ccsds.moims.mo.mal.structures.UpdateHeader) body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.UpdateHeader()), + new MonitorPlanExecutionDetailSubscriptionKeys((org.ccsds.moims.mo.mal.structures.UpdateHeader) body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.UpdateHeader()), selectedKeys), + (org.ccsds.moims.mo.mps.structures.PlanDetailUpdate) body.getBodyElement(2, null), qosProperties); + break; + case org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo._MONITORSUBPLANEXECUTION_OP_NUMBER: + monitorSubPlanExecutionNotifyReceived(msgHeader, + (org.ccsds.moims.mo.mal.structures.Identifier) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.Identifier()), + (org.ccsds.moims.mo.mal.structures.UpdateHeader) body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.UpdateHeader()), + new MonitorSubPlanExecutionSubscriptionKeys((org.ccsds.moims.mo.mal.structures.UpdateHeader) body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.UpdateHeader()), selectedKeys), + (org.ccsds.moims.mo.mps.structures.SubPlanUpdate) body.getBodyElement(2, new org.ccsds.moims.mo.mps.structures.SubPlanUpdate()), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + else { + notifyReceivedFromOtherService(msgHeader, body, qosProperties); + } + } + + @Override + public final void notifyErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALErrorBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo._MONITORPLANEXECUTION_OP_NUMBER: + monitorPlanExecutionNotifyErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo._MONITORPLANEXECUTIONDETAIL_OP_NUMBER: + monitorPlanExecutionDetailNotifyErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo._MONITORSUBPLANEXECUTION_OP_NUMBER: + monitorSubPlanExecutionNotifyErrorReceived(msgHeader, body.getError(), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void deregisterAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo._MONITORPLANEXECUTION_OP_NUMBER: + monitorPlanExecutionDeregisterAckReceived(msgHeader, qosProperties); + break; + case org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo._MONITORPLANEXECUTIONDETAIL_OP_NUMBER: + monitorPlanExecutionDetailDeregisterAckReceived(msgHeader, qosProperties); + break; + case org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo._MONITORSUBPLANEXECUTION_OP_NUMBER: + monitorSubPlanExecutionDeregisterAckReceived(msgHeader, qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + /** + * Called by the MAL when a PubSub update from another service is received + * from a broker. + * + * @param msgHeader msgHeader The header of the received message + * @param body body The body of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + * @throws org.ccsds.moims.mo.mal.MALException if an error is detected processing the message. + */ + public void notifyReceivedFromOtherService(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALNotifyBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planexecutioncontrol/consumer/PlanExecutionControlStub.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planexecutioncontrol/consumer/PlanExecutionControlStub.java new file mode 100644 index 00000000..6df0c85b --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planexecutioncontrol/consumer/PlanExecutionControlStub.java @@ -0,0 +1,822 @@ +package org.ccsds.moims.mo.mps.planexecutioncontrol.consumer; + +/** + * Consumer stub for PlanExecutionControl service. + */ +public class PlanExecutionControlStub { + + /** + * The consumer field. + */ + private final org.ccsds.moims.mo.mal.consumer.MALConsumer consumer; + + /** + * Wraps a MALconsumer connection with service specific methods that map from + * the high level service API to the generic MAL API. + * + * @param consumer consumer The MALConsumer to use in this stub. + */ + public PlanExecutionControlStub(org.ccsds.moims.mo.mal.consumer.MALConsumer consumer) { + this.consumer = consumer; + } + + /** + * Returns the internal MAL consumer object used for sending of messages from + * this interface. + * + * @return The MAL consumer object. + */ + public org.ccsds.moims.mo.mal.consumer.MALConsumer getConsumer() { + return consumer; + } + + /** + * The submitPlan operation is used to send a plan to a plan execution function + * (the service provider), making it available for execution. The service + * provider acknowledges the reception of the plan or returns an error. NOTE + * – The submitted plan may be a full plan or a patch plan. + * + * @param plan The plan field. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void submitPlan(org.ccsds.moims.mo.mps.structures.Plan plan) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.submit(org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo.SUBMITPLAN_OP, plan); + } + + /** + * Asynchronous version of method submitPlan. + * + * @param plan The plan field. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncSubmitPlan(org.ccsds.moims.mo.mps.structures.Plan plan, + org.ccsds.moims.mo.mps.planexecutioncontrol.consumer.PlanExecutionControlAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncSubmit(org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo.SUBMITPLAN_OP, adapter, plan); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueSubmitPlan(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mps.planexecutioncontrol.consumer.PlanExecutionControlAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo.SUBMITPLAN_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The revokePlan operation is used to request a plan execution function to + * revoke a previously submitted Plan, making it unavailable for execution. + * The service provider acknowledges the revocation of the Plan or returns + * an error. + * + * @param planRef The planRef field. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void revokePlan(org.ccsds.moims.mo.mal.structures.ObjectRef planRef) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.submit(org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo.REVOKEPLAN_OP, planRef); + } + + /** + * Asynchronous version of method revokePlan. + * + * @param planRef The planRef field. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncRevokePlan(org.ccsds.moims.mo.mal.structures.ObjectRef planRef, + org.ccsds.moims.mo.mps.planexecutioncontrol.consumer.PlanExecutionControlAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncSubmit(org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo.REVOKEPLAN_OP, adapter, planRef); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueRevokePlan(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mps.planexecutioncontrol.consumer.PlanExecutionControlAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo.REVOKEPLAN_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The getPlanStatus operation is used to obtain the current status of one + * or more known Plans that have been previously submitted to a plan execution + * function. + * + * @param planRefs The planRefs field. + * @return The return value of the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mps.structures.PlanUpdateList getPlanStatus(org.ccsds.moims.mo.mal.structures.ObjectRefList planRefs) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + org.ccsds.moims.mo.mal.transport.MALMessageBody body = consumer.request(org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo.GETPLANSTATUS_OP, planRefs); + Object body0 = (Object) body.getBodyElement(0, new org.ccsds.moims.mo.mps.structures.PlanUpdateList()); + return (org.ccsds.moims.mo.mps.structures.PlanUpdateList) body0; + } + + /** + * Asynchronous version of method getPlanStatus. + * + * @param planRefs The planRefs field. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncGetPlanStatus(org.ccsds.moims.mo.mal.structures.ObjectRefList planRefs, + org.ccsds.moims.mo.mps.planexecutioncontrol.consumer.PlanExecutionControlAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncRequest(org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo.GETPLANSTATUS_OP, adapter, planRefs); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueGetPlanStatus(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mps.planexecutioncontrol.consumer.PlanExecutionControlAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo.GETPLANSTATUS_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The activatePlan operation is used to request the execution of specified + * Plans that have previously been submitted to a plan execution function. + * The service provider enables the execution of the referenced Plans and + * the ActivityInstances contained within them, subject to the triggering + * constraints specified within the Plans. It is not possible to activate + * a Plan outside its validity period, or after the start of the Plan period. + * In this case, the operation will return an ACTIVATE_FAILED error. NOTES + * Multiple plans with a common precursor may have been submitted to a plan + * execution function. Usually only one of these is considered the nominal + * plan, the other alternative or contingency plans having the isAlternate + * flag set. It is implementation dependent whether the service provider + * will allow activation of Plans that have the isAlternate flag set, but + * this may be blocked for operational safety. Where this is the case, the + * plan edit service can be used to change the state of the isAlternate flag + * prior to activation (see 3.9.5). In order to activate a patch Plan, the + * precursor Plan on which it is based must also be activated. It is recommended + * that the activatePlan operation references the target Plan (the result + * of merging the patch Plan with its precursor), rather than the patch Plan + * itself (although this is allowed). It is implementation dependent how + * it is achieved (merge patch with precursor prior to activation, or activate + * precursor and then merge patch), but if the precursor Plan is not already + * activated, then activating a target or patch Plan implies that the precursor + * is also activated. If the precursor plan has not previously been submitted + * to the service provider (or has been revoked), then it is not possible + * to activate the target or patch Plan. + * + * @param planRefs The planRefs field. + * @return The return value of the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mps.structures.PlanActivationStatusList activatePlan(org.ccsds.moims.mo.mal.structures.ObjectRefList planRefs) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + org.ccsds.moims.mo.mal.transport.MALMessageBody body = consumer.request(org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo.ACTIVATEPLAN_OP, planRefs); + Object body0 = (Object) body.getBodyElement(0, new org.ccsds.moims.mo.mps.structures.PlanActivationStatusList()); + return (org.ccsds.moims.mo.mps.structures.PlanActivationStatusList) body0; + } + + /** + * Asynchronous version of method activatePlan. + * + * @param planRefs The planRefs field. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncActivatePlan(org.ccsds.moims.mo.mal.structures.ObjectRefList planRefs, + org.ccsds.moims.mo.mps.planexecutioncontrol.consumer.PlanExecutionControlAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncRequest(org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo.ACTIVATEPLAN_OP, adapter, planRefs); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueActivatePlan(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mps.planexecutioncontrol.consumer.PlanExecutionControlAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo.ACTIVATEPLAN_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The deactivatePlan operation is used to request deactivation of specified + * Plans that have previously been activated. The service provider disables + * the execution of the referenced Plans and the ActivityInstances contained + * within them, where it is possible to do so. The deactivationMode argument + * allows selection of the deactivation behavior. For example: Orderly (ceases + * execution of any new activities, but allows those already initiated to + * complete); Rapid (ceases execution of the Plan, but allows activities already + * initiated to continue until their next defined breakpoint); Immediate (ceases + * execution of the Plan and all activities currently in progress). It should + * be noted that it is dependent on the service provider implementation which + * deactivationModes are supported, and that the above list is not exhaustive. + * The service provider returns a list of PlanActivationStatus data structures + * comprising Plan status and activationInfo as a String for each Plan in + * the deactivation list. The activationInfo allows the return of deployment + * specific details on the deactivation, such as the deactivation mode applied + * or reasons for a failure to deactivate. If a Plan is deactivated prior + * to any of its constituent ActivityInstances being executed (or before the + * specified planPeriodStart), then all new ActivityInstances and EventInstances + * contained in the Plan are unloaded or removed, and the status of the Plan + * reverts to SUBMITTED. If a Plan is deactivated after any of its constituent + * ActivityInstances have been executed (or after the specified planPeriodStart), + * then the status of the Plan and the status of all contained ActivityInstances + * and EventInstances that will not be executed are set to TERMINATED with + * the additional statusInfo ‘CANCELLED’. + * + * @param planRefs The planRefs field. + * @param deactivationMode The deactivationMode field. + * @return The return value of the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mps.structures.PlanActivationStatusList deactivatePlan(org.ccsds.moims.mo.mal.structures.ObjectRefList planRefs, + org.ccsds.moims.mo.mal.structures.Identifier deactivationMode) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + org.ccsds.moims.mo.mal.transport.MALMessageBody body = consumer.request(org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo.DEACTIVATEPLAN_OP, planRefs, deactivationMode); + Object body0 = (Object) body.getBodyElement(0, new org.ccsds.moims.mo.mps.structures.PlanActivationStatusList()); + return (org.ccsds.moims.mo.mps.structures.PlanActivationStatusList) body0; + } + + /** + * Asynchronous version of method deactivatePlan. + * + * @param planRefs The planRefs field. + * @param deactivationMode The deactivationMode field. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncDeactivatePlan(org.ccsds.moims.mo.mal.structures.ObjectRefList planRefs, + org.ccsds.moims.mo.mal.structures.Identifier deactivationMode, + org.ccsds.moims.mo.mps.planexecutioncontrol.consumer.PlanExecutionControlAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncRequest(org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo.DEACTIVATEPLAN_OP, adapter, planRefs, deactivationMode); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueDeactivatePlan(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mps.planexecutioncontrol.consumer.PlanExecutionControlAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo.DEACTIVATEPLAN_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * Register method for the monitorPlanExecution PubSub interaction. + * + * @param subscription subscription the subscription to register for + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void monitorPlanExecutionRegister(org.ccsds.moims.mo.mal.structures.Subscription subscription, + org.ccsds.moims.mo.mps.planexecutioncontrol.consumer.PlanExecutionControlAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.register(org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo.MONITORPLANEXECUTION_OP, subscription, adapter); + } + + /** + * Asynchronous version of method monitorPlanExecutionRegister. + * + * @param subscription subscription the subscription to register for + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncMonitorPlanExecutionRegister(org.ccsds.moims.mo.mal.structures.Subscription subscription, + org.ccsds.moims.mo.mps.planexecutioncontrol.consumer.PlanExecutionControlAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncRegister(org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo.MONITORPLANEXECUTION_OP, subscription, adapter); + } + + /** + * Deregister method for the monitorPlanExecution PubSub interaction. + * + * @param identifierList identifierList the subscription identifiers to deregister + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void monitorPlanExecutionDeregister(org.ccsds.moims.mo.mal.structures.IdentifierList identifierList) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.deregister(org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo.MONITORPLANEXECUTION_OP, identifierList); + } + + /** + * Asynchronous version of method monitorPlanExecutionDeregister. + * + * @param identifierList identifierList the subscription identifiers to deregister + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncMonitorPlanExecutionDeregister(org.ccsds.moims.mo.mal.structures.IdentifierList identifierList, + org.ccsds.moims.mo.mps.planexecutioncontrol.consumer.PlanExecutionControlAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncDeregister(org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo.MONITORPLANEXECUTION_OP, identifierList, adapter); + } + + /** + * Register method for the monitorPlanExecutionDetail PubSub interaction. + * + * @param subscription subscription the subscription to register for + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void monitorPlanExecutionDetailRegister(org.ccsds.moims.mo.mal.structures.Subscription subscription, + org.ccsds.moims.mo.mps.planexecutioncontrol.consumer.PlanExecutionControlAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.register(org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo.MONITORPLANEXECUTIONDETAIL_OP, subscription, adapter); + } + + /** + * Asynchronous version of method monitorPlanExecutionDetailRegister. + * + * @param subscription subscription the subscription to register for + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncMonitorPlanExecutionDetailRegister(org.ccsds.moims.mo.mal.structures.Subscription subscription, + org.ccsds.moims.mo.mps.planexecutioncontrol.consumer.PlanExecutionControlAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncRegister(org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo.MONITORPLANEXECUTIONDETAIL_OP, subscription, adapter); + } + + /** + * Deregister method for the monitorPlanExecutionDetail PubSub interaction. + * + * @param identifierList identifierList the subscription identifiers to deregister + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void monitorPlanExecutionDetailDeregister(org.ccsds.moims.mo.mal.structures.IdentifierList identifierList) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.deregister(org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo.MONITORPLANEXECUTIONDETAIL_OP, identifierList); + } + + /** + * Asynchronous version of method monitorPlanExecutionDetailDeregister. + * + * @param identifierList identifierList the subscription identifiers to deregister + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncMonitorPlanExecutionDetailDeregister(org.ccsds.moims.mo.mal.structures.IdentifierList identifierList, + org.ccsds.moims.mo.mps.planexecutioncontrol.consumer.PlanExecutionControlAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncDeregister(org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo.MONITORPLANEXECUTIONDETAIL_OP, identifierList, adapter); + } + + /** + * The activateSubPlan operation is used to request that the service provider + * activates the referenced SubPlans and enables the execution of ActivityInstances + * that are contained in activated Plans and allocated to activated SubPlans. + * NOTES It is implementation dependent whether SubPlans are initially ACTIVATED + * and therefore do not require activation unless previously deactivated. + * Where the operation is directly supported by the service provider there + * is little reason for the activation to fail, but if the operation is delegated, + * for example to an on-board planning function, there is the potential for + * the operation to fail. + * + * @param subPlanIDs The subPlanIDs field. + * @return The return value of the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mps.structures.SubPlanActivationStatusList activateSubPlan(org.ccsds.moims.mo.mal.structures.IdentifierList subPlanIDs) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + org.ccsds.moims.mo.mal.transport.MALMessageBody body = consumer.request(org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo.ACTIVATESUBPLAN_OP, subPlanIDs); + Object body0 = (Object) body.getBodyElement(0, new org.ccsds.moims.mo.mps.structures.SubPlanActivationStatusList()); + return (org.ccsds.moims.mo.mps.structures.SubPlanActivationStatusList) body0; + } + + /** + * Asynchronous version of method activateSubPlan. + * + * @param subPlanIDs The subPlanIDs field. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncActivateSubPlan(org.ccsds.moims.mo.mal.structures.IdentifierList subPlanIDs, + org.ccsds.moims.mo.mps.planexecutioncontrol.consumer.PlanExecutionControlAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncRequest(org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo.ACTIVATESUBPLAN_OP, adapter, subPlanIDs); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueActivateSubPlan(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mps.planexecutioncontrol.consumer.PlanExecutionControlAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo.ACTIVATESUBPLAN_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The deactivateSubPlan operation is used to request that the service provider + * deactivates the referenced SubPlans and disables the execution of ActivityInstances + * that are contained in activated Plans and allocated to the deactivated + * SubPlans, where it is possible to do so. The deactivationMode argument + * allows selection of the deactivation behavior. For example: Orderly (ceases + * execution of any new activities, but allows those already initiated to + * complete); Rapid (ceases execution of the Sub-plan, but allows activities + * already initiated to continue until their next defined breakpoint); Immediate + * (ceases execution of the Sub-plan and all activities currently in progress). + * It should be noted that it is dependent on the service provider implementation + * which deactivationModes are supported, and that the above list is not exhaustive. + * The service provider returns a list of SubPlanActivationStatus data structures + * comprising sub-plan status and activationInfo as a String for each sub-plan + * in the deactivation list. The activationInfo allows the return of deployment + * specific details on the deactivation, such as the deactivation mode applied + * or reasons for a failure to deactivate. NOTE – Where the operation is directly + * supported by the service provider there is little reason for the deactivation + * to fail, but if the operation is delegated, for example to an on-board + * planning function, there is the potential for the operation to fail. + * + * @param subPlanIDs The subPlanIDs field. + * @param deactivationMode The deactivationMode field. + * @return The return value of the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mps.structures.SubPlanActivationStatusList deactivateSubPlan(org.ccsds.moims.mo.mal.structures.IdentifierList subPlanIDs, + String deactivationMode) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + org.ccsds.moims.mo.mal.transport.MALMessageBody body = consumer.request(org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo.DEACTIVATESUBPLAN_OP, subPlanIDs, (deactivationMode == null) ? null : new org.ccsds.moims.mo.mal.structures.Union(deactivationMode)); + Object body0 = (Object) body.getBodyElement(0, new org.ccsds.moims.mo.mps.structures.SubPlanActivationStatusList()); + return (org.ccsds.moims.mo.mps.structures.SubPlanActivationStatusList) body0; + } + + /** + * Asynchronous version of method deactivateSubPlan. + * + * @param subPlanIDs The subPlanIDs field. + * @param deactivationMode The deactivationMode field. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncDeactivateSubPlan(org.ccsds.moims.mo.mal.structures.IdentifierList subPlanIDs, + String deactivationMode, + org.ccsds.moims.mo.mps.planexecutioncontrol.consumer.PlanExecutionControlAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncRequest(org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo.DEACTIVATESUBPLAN_OP, adapter, subPlanIDs, (deactivationMode == null) ? null : new org.ccsds.moims.mo.mal.structures.Union(deactivationMode)); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueDeactivateSubPlan(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mps.planexecutioncontrol.consumer.PlanExecutionControlAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo.DEACTIVATESUBPLAN_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The getSubPlanStatus operation is used to obtain the current status of + * one or more SubPlans. + * + * @param subPlanIDs The subPlanIDs field. + * @return The return value of the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mps.structures.SubPlanUpdateList getSubPlanStatus(org.ccsds.moims.mo.mal.structures.IdentifierList subPlanIDs) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + org.ccsds.moims.mo.mal.transport.MALMessageBody body = consumer.request(org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo.GETSUBPLANSTATUS_OP, subPlanIDs); + Object body0 = (Object) body.getBodyElement(0, new org.ccsds.moims.mo.mps.structures.SubPlanUpdateList()); + return (org.ccsds.moims.mo.mps.structures.SubPlanUpdateList) body0; + } + + /** + * Asynchronous version of method getSubPlanStatus. + * + * @param subPlanIDs The subPlanIDs field. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncGetSubPlanStatus(org.ccsds.moims.mo.mal.structures.IdentifierList subPlanIDs, + org.ccsds.moims.mo.mps.planexecutioncontrol.consumer.PlanExecutionControlAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncRequest(org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo.GETSUBPLANSTATUS_OP, adapter, subPlanIDs); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueGetSubPlanStatus(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mps.planexecutioncontrol.consumer.PlanExecutionControlAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo.GETSUBPLANSTATUS_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * Register method for the monitorSubPlanExecution PubSub interaction. + * + * @param subscription subscription the subscription to register for + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void monitorSubPlanExecutionRegister(org.ccsds.moims.mo.mal.structures.Subscription subscription, + org.ccsds.moims.mo.mps.planexecutioncontrol.consumer.PlanExecutionControlAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.register(org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo.MONITORSUBPLANEXECUTION_OP, subscription, adapter); + } + + /** + * Asynchronous version of method monitorSubPlanExecutionRegister. + * + * @param subscription subscription the subscription to register for + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncMonitorSubPlanExecutionRegister(org.ccsds.moims.mo.mal.structures.Subscription subscription, + org.ccsds.moims.mo.mps.planexecutioncontrol.consumer.PlanExecutionControlAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncRegister(org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo.MONITORSUBPLANEXECUTION_OP, subscription, adapter); + } + + /** + * Deregister method for the monitorSubPlanExecution PubSub interaction. + * + * @param identifierList identifierList the subscription identifiers to deregister + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void monitorSubPlanExecutionDeregister(org.ccsds.moims.mo.mal.structures.IdentifierList identifierList) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.deregister(org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo.MONITORSUBPLANEXECUTION_OP, identifierList); + } + + /** + * Asynchronous version of method monitorSubPlanExecutionDeregister. + * + * @param identifierList identifierList the subscription identifiers to deregister + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncMonitorSubPlanExecutionDeregister(org.ccsds.moims.mo.mal.structures.IdentifierList identifierList, + org.ccsds.moims.mo.mps.planexecutioncontrol.consumer.PlanExecutionControlAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncDeregister(org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo.MONITORSUBPLANEXECUTION_OP, identifierList, adapter); + } + + /** + * The suspendActivity operation is used to request suspension of the execution + * of selected activities in one or more plans, without changing the state + * of the plan(s). The suspensionMode argument allows selection of the suspension + * behavior. For example: Orderly (suspends execution of any new activities, + * but allows those already initiated to complete); Rapid (suspends execution + * of any new activities, but allows any activities and their sub-activities + * already initiated to continue until their next defined breakpoint); Immediate + * (suspends execution of all activities, including those currently in progress). + * It should be noted that it is dependent on the service provider implementation + * which deactivationModes are supported, and that the above list is not exhaustive. + * The service provider responds with a list of ActivitySuspensionStatus data + * structures comprising activity status and suspensionInfo (as a String) + * for each activity subject to the suspension request. The suspensionInfo + * allows the return of deployment specific details on the suspension, such + * as the suspension mode applied or reasons for a failure to suspend. + * + * @param planRefs The planRefs field. + * @param activityRefs The activityRefs field. + * @param tags The tags field. + * @param suspensionMode The suspensionMode field. + * @return The return value of the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mps.structures.ActivitySuspensionStatusList suspendActivity(org.ccsds.moims.mo.mal.structures.ObjectRefList planRefs, + org.ccsds.moims.mo.mal.structures.ObjectRefList activityRefs, + org.ccsds.moims.mo.mal.structures.StringList tags, + String suspensionMode) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + org.ccsds.moims.mo.mal.transport.MALMessageBody body = consumer.request(org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo.SUSPENDACTIVITY_OP, planRefs, activityRefs, tags, (suspensionMode == null) ? null : new org.ccsds.moims.mo.mal.structures.Union(suspensionMode)); + Object body0 = (Object) body.getBodyElement(0, new org.ccsds.moims.mo.mps.structures.ActivitySuspensionStatusList()); + return (org.ccsds.moims.mo.mps.structures.ActivitySuspensionStatusList) body0; + } + + /** + * Asynchronous version of method suspendActivity. + * + * @param planRefs The planRefs field. + * @param activityRefs The activityRefs field. + * @param tags The tags field. + * @param suspensionMode The suspensionMode field. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncSuspendActivity(org.ccsds.moims.mo.mal.structures.ObjectRefList planRefs, + org.ccsds.moims.mo.mal.structures.ObjectRefList activityRefs, + org.ccsds.moims.mo.mal.structures.StringList tags, + String suspensionMode, + org.ccsds.moims.mo.mps.planexecutioncontrol.consumer.PlanExecutionControlAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncRequest(org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo.SUSPENDACTIVITY_OP, adapter, planRefs, activityRefs, tags, (suspensionMode == null) ? null : new org.ccsds.moims.mo.mal.structures.Union(suspensionMode)); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueSuspendActivity(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mps.planexecutioncontrol.consumer.PlanExecutionControlAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo.SUSPENDACTIVITY_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The resumeActivity operation is used to request resumption of the execution + * of selected activities in one or more plans, without changing the state + * of the plan(s). The service provider responds with a list of ActivitySuspensionStatus + * data structures comprising activity status and suspensionInfo (as a String) + * for each activity subject to the resumption request. The suspensionInfo + * allows the return of deployment specific details on the resumption, such + * as the reasons for a failure to resume. + * + * @param planRefs The planRefs field. + * @param activityRefs The activityRefs field. + * @param tags The tags field. + * @return The return value of the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mps.structures.ActivitySuspensionStatusList resumeActivity(org.ccsds.moims.mo.mal.structures.ObjectRefList planRefs, + org.ccsds.moims.mo.mal.structures.ObjectRefList activityRefs, + org.ccsds.moims.mo.mal.structures.StringList tags) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + org.ccsds.moims.mo.mal.transport.MALMessageBody body = consumer.request(org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo.RESUMEACTIVITY_OP, planRefs, activityRefs, tags); + Object body0 = (Object) body.getBodyElement(0, new org.ccsds.moims.mo.mps.structures.ActivitySuspensionStatusList()); + return (org.ccsds.moims.mo.mps.structures.ActivitySuspensionStatusList) body0; + } + + /** + * Asynchronous version of method resumeActivity. + * + * @param planRefs The planRefs field. + * @param activityRefs The activityRefs field. + * @param tags The tags field. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncResumeActivity(org.ccsds.moims.mo.mal.structures.ObjectRefList planRefs, + org.ccsds.moims.mo.mal.structures.ObjectRefList activityRefs, + org.ccsds.moims.mo.mal.structures.StringList tags, + org.ccsds.moims.mo.mps.planexecutioncontrol.consumer.PlanExecutionControlAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncRequest(org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo.RESUMEACTIVITY_OP, adapter, planRefs, activityRefs, tags); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueResumeActivity(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mps.planexecutioncontrol.consumer.PlanExecutionControlAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo.RESUMEACTIVITY_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The getActivityStatus operation is used to request a detailed report from + * the service provider on the current status of ActivityInstances, selected + * at activity, sub-plan, or tag levels. + * + * @param planRefs The planRefs field. + * @param activityRefs The activityRefs field. + * @param subPlans The subPlans field. + * @param tags The tags field. + * @return The return value of the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mps.structures.ActivityUpdateList getActivityStatus(org.ccsds.moims.mo.mal.structures.ObjectRefList planRefs, + org.ccsds.moims.mo.mal.structures.ObjectRefList activityRefs, + org.ccsds.moims.mo.mal.structures.IdentifierList subPlans, + org.ccsds.moims.mo.mal.structures.StringList tags) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + org.ccsds.moims.mo.mal.transport.MALMessageBody body = consumer.request(org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo.GETACTIVITYSTATUS_OP, planRefs, activityRefs, subPlans, tags); + Object body0 = (Object) body.getBodyElement(0, new org.ccsds.moims.mo.mps.structures.ActivityUpdateList()); + return (org.ccsds.moims.mo.mps.structures.ActivityUpdateList) body0; + } + + /** + * Asynchronous version of method getActivityStatus. + * + * @param planRefs The planRefs field. + * @param activityRefs The activityRefs field. + * @param subPlans The subPlans field. + * @param tags The tags field. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncGetActivityStatus(org.ccsds.moims.mo.mal.structures.ObjectRefList planRefs, + org.ccsds.moims.mo.mal.structures.ObjectRefList activityRefs, + org.ccsds.moims.mo.mal.structures.IdentifierList subPlans, + org.ccsds.moims.mo.mal.structures.StringList tags, + org.ccsds.moims.mo.mps.planexecutioncontrol.consumer.PlanExecutionControlAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncRequest(org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo.GETACTIVITYSTATUS_OP, adapter, planRefs, activityRefs, subPlans, tags); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueGetActivityStatus(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mps.planexecutioncontrol.consumer.PlanExecutionControlAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo.GETACTIVITYSTATUS_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planexecutioncontrol/consumer/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planexecutioncontrol/consumer/package-info.java new file mode 100644 index 00000000..70016d8d --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planexecutioncontrol/consumer/package-info.java @@ -0,0 +1,4 @@ +/** + * Package containing the consumer stubs for the PlanExecutionControl service. +*/ +package org.ccsds.moims.mo.mps.planexecutioncontrol.consumer; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planexecutioncontrol/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planexecutioncontrol/package-info.java new file mode 100644 index 00000000..1d9b4001 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planexecutioncontrol/package-info.java @@ -0,0 +1,9 @@ +/** + * The Plan Execution Control Service, introduced in 2.5.4, is provided by + * a plan execution function and enables its consumers to submit (and revoke) + * Plans for execution; to control their execution at plan, sub-plan, and + * activity levels; and to receive feedback on their execution status. It + * comprises the operations defined below, of which only those in capability + * set 1 are mandatory. +*/ +package org.ccsds.moims.mo.mps.planexecutioncontrol; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planexecutioncontrol/provider/MonitorPlanExecutionDetailPublisher.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planexecutioncontrol/provider/MonitorPlanExecutionDetailPublisher.java new file mode 100644 index 00000000..81b24ee7 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planexecutioncontrol/provider/MonitorPlanExecutionDetailPublisher.java @@ -0,0 +1,123 @@ +package org.ccsds.moims.mo.mps.planexecutioncontrol.provider; + +/** + * Publisher class for the monitorPlanExecutionDetail operation. + */ +public final class MonitorPlanExecutionDetailPublisher { + + /** + * The publisherSet field. + */ + private org.ccsds.moims.mo.mal.provider.MALPublisherSet publisherSet; + + /** + * Creates an instance of this class using the supplied publisher set. + * + * @param publisherSet The set of broker connections to use when registering and publishing. + */ + public MonitorPlanExecutionDetailPublisher(org.ccsds.moims.mo.mal.provider.MALPublisherSet publisherSet) { + this.publisherSet = publisherSet; + } + + /** + * Registers this provider implementation to the set of broker connections. + * + * @param keyNames The key names to use in the method + * @param keyTypes The key types to use in the method + * @param listener The listener object to use for callback from the publisher + * @throws java.lang.IllegalArgumentException If any supplied argument is invalid + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void register(org.ccsds.moims.mo.mal.structures.IdentifierList keyNames, + org.ccsds.moims.mo.mal.structures.AttributeTypeList keyTypes, + org.ccsds.moims.mo.mal.provider.MALPublishInteractionListener listener) throws java.lang.IllegalArgumentException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + publisherSet.register(keyNames, keyTypes, listener); + } + + /** + * Registers this provider implementation to the set of broker connections + * with the default subscription keys. + * + * @param listener The listener object to use for callback from the publisher + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void registerWithDefaultKeys(org.ccsds.moims.mo.mal.provider.MALPublishInteractionListener listener) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + org.ccsds.moims.mo.mal.structures.IdentifierList keyNames = new org.ccsds.moims.mo.mal.structures.IdentifierList(); + org.ccsds.moims.mo.mal.structures.AttributeTypeList keyTypes = new org.ccsds.moims.mo.mal.structures.AttributeTypeList(); + keyNames.add(new org.ccsds.moims.mo.mal.structures.Identifier("planID")); + keyTypes.add(org.ccsds.moims.mo.mal.structures.AttributeType.IDENTIFIER); + keyNames.add(new org.ccsds.moims.mo.mal.structures.Identifier("subPlan")); + keyTypes.add(org.ccsds.moims.mo.mal.structures.AttributeType.IDENTIFIER); + keyNames.add(new org.ccsds.moims.mo.mal.structures.Identifier("tag")); + keyTypes.add(org.ccsds.moims.mo.mal.structures.AttributeType.STRING); + keyNames.add(new org.ccsds.moims.mo.mal.structures.Identifier("type")); + keyTypes.add(org.ccsds.moims.mo.mal.structures.AttributeType.IDENTIFIER); + publisherSet.register(keyNames, keyTypes, listener); + } + + /** + * Asynchronously registers this provider implementation to the set of broker + * connections. + * + * @param keyNames The key names to use in the method + * @param keyTypes The key types to use in the method + * @param listener The listener object to use for callback from the publisher + * @throws java.lang.IllegalArgumentException If any supplied argument is invalid + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void asyncRegister(org.ccsds.moims.mo.mal.structures.IdentifierList keyNames, + org.ccsds.moims.mo.mal.structures.AttributeTypeList keyTypes, + org.ccsds.moims.mo.mal.provider.MALPublishInteractionListener listener) throws java.lang.IllegalArgumentException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + publisherSet.asyncRegister(keyNames, keyTypes, listener); + } + + /** + * Publishes updates to the set of registered broker connections. + * + * @param updateHeader The headers of the updates being added + * @param detailUpdate The detailUpdate field. + * @throws java.lang.IllegalArgumentException If any supplied argument is invalid + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void publish(org.ccsds.moims.mo.mal.structures.UpdateHeader updateHeader, + org.ccsds.moims.mo.mps.structures.PlanDetailUpdate detailUpdate) throws java.lang.IllegalArgumentException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + publisherSet.publish(updateHeader, detailUpdate); + } + + /** + * Deregisters this provider implementation from the set of broker connections. + * + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void deregister() throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + publisherSet.deregister(); + } + + /** + * Asynchronously deregisters this provider implementation from the set of + * broker connections. + * + * @param listener The listener object to use for callback from the publisher + * @throws java.lang.IllegalArgumentException If any supplied argument is invalid + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void asyncDeregister(org.ccsds.moims.mo.mal.provider.MALPublishInteractionListener listener) throws java.lang.IllegalArgumentException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + publisherSet.asyncDeregister(listener); + } + + /** + * Closes this publisher. + * + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void close() throws org.ccsds.moims.mo.mal.MALException { + publisherSet.close(); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planexecutioncontrol/provider/MonitorPlanExecutionPublisher.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planexecutioncontrol/provider/MonitorPlanExecutionPublisher.java new file mode 100644 index 00000000..325203d3 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planexecutioncontrol/provider/MonitorPlanExecutionPublisher.java @@ -0,0 +1,123 @@ +package org.ccsds.moims.mo.mps.planexecutioncontrol.provider; + +/** + * Publisher class for the monitorPlanExecution operation. + */ +public final class MonitorPlanExecutionPublisher { + + /** + * The publisherSet field. + */ + private org.ccsds.moims.mo.mal.provider.MALPublisherSet publisherSet; + + /** + * Creates an instance of this class using the supplied publisher set. + * + * @param publisherSet The set of broker connections to use when registering and publishing. + */ + public MonitorPlanExecutionPublisher(org.ccsds.moims.mo.mal.provider.MALPublisherSet publisherSet) { + this.publisherSet = publisherSet; + } + + /** + * Registers this provider implementation to the set of broker connections. + * + * @param keyNames The key names to use in the method + * @param keyTypes The key types to use in the method + * @param listener The listener object to use for callback from the publisher + * @throws java.lang.IllegalArgumentException If any supplied argument is invalid + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void register(org.ccsds.moims.mo.mal.structures.IdentifierList keyNames, + org.ccsds.moims.mo.mal.structures.AttributeTypeList keyTypes, + org.ccsds.moims.mo.mal.provider.MALPublishInteractionListener listener) throws java.lang.IllegalArgumentException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + publisherSet.register(keyNames, keyTypes, listener); + } + + /** + * Registers this provider implementation to the set of broker connections + * with the default subscription keys. + * + * @param listener The listener object to use for callback from the publisher + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void registerWithDefaultKeys(org.ccsds.moims.mo.mal.provider.MALPublishInteractionListener listener) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + org.ccsds.moims.mo.mal.structures.IdentifierList keyNames = new org.ccsds.moims.mo.mal.structures.IdentifierList(); + org.ccsds.moims.mo.mal.structures.AttributeTypeList keyTypes = new org.ccsds.moims.mo.mal.structures.AttributeTypeList(); + keyNames.add(new org.ccsds.moims.mo.mal.structures.Identifier("planID")); + keyTypes.add(org.ccsds.moims.mo.mal.structures.AttributeType.IDENTIFIER); + keyNames.add(new org.ccsds.moims.mo.mal.structures.Identifier("precursor")); + keyTypes.add(org.ccsds.moims.mo.mal.structures.AttributeType.IDENTIFIER); + keyNames.add(new org.ccsds.moims.mo.mal.structures.Identifier("status")); + keyTypes.add(org.ccsds.moims.mo.mal.structures.AttributeType.USHORT); + keyNames.add(new org.ccsds.moims.mo.mal.structures.Identifier("originator")); + keyTypes.add(org.ccsds.moims.mo.mal.structures.AttributeType.IDENTIFIER); + publisherSet.register(keyNames, keyTypes, listener); + } + + /** + * Asynchronously registers this provider implementation to the set of broker + * connections. + * + * @param keyNames The key names to use in the method + * @param keyTypes The key types to use in the method + * @param listener The listener object to use for callback from the publisher + * @throws java.lang.IllegalArgumentException If any supplied argument is invalid + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void asyncRegister(org.ccsds.moims.mo.mal.structures.IdentifierList keyNames, + org.ccsds.moims.mo.mal.structures.AttributeTypeList keyTypes, + org.ccsds.moims.mo.mal.provider.MALPublishInteractionListener listener) throws java.lang.IllegalArgumentException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + publisherSet.asyncRegister(keyNames, keyTypes, listener); + } + + /** + * Publishes updates to the set of registered broker connections. + * + * @param updateHeader The headers of the updates being added + * @param planUpdate The planUpdate field. + * @throws java.lang.IllegalArgumentException If any supplied argument is invalid + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void publish(org.ccsds.moims.mo.mal.structures.UpdateHeader updateHeader, + org.ccsds.moims.mo.mps.structures.PlanUpdate planUpdate) throws java.lang.IllegalArgumentException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + publisherSet.publish(updateHeader, planUpdate); + } + + /** + * Deregisters this provider implementation from the set of broker connections. + * + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void deregister() throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + publisherSet.deregister(); + } + + /** + * Asynchronously deregisters this provider implementation from the set of + * broker connections. + * + * @param listener The listener object to use for callback from the publisher + * @throws java.lang.IllegalArgumentException If any supplied argument is invalid + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void asyncDeregister(org.ccsds.moims.mo.mal.provider.MALPublishInteractionListener listener) throws java.lang.IllegalArgumentException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + publisherSet.asyncDeregister(listener); + } + + /** + * Closes this publisher. + * + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void close() throws org.ccsds.moims.mo.mal.MALException { + publisherSet.close(); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planexecutioncontrol/provider/MonitorSubPlanExecutionPublisher.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planexecutioncontrol/provider/MonitorSubPlanExecutionPublisher.java new file mode 100644 index 00000000..4b67d898 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planexecutioncontrol/provider/MonitorSubPlanExecutionPublisher.java @@ -0,0 +1,117 @@ +package org.ccsds.moims.mo.mps.planexecutioncontrol.provider; + +/** + * Publisher class for the monitorSubPlanExecution operation. + */ +public final class MonitorSubPlanExecutionPublisher { + + /** + * The publisherSet field. + */ + private org.ccsds.moims.mo.mal.provider.MALPublisherSet publisherSet; + + /** + * Creates an instance of this class using the supplied publisher set. + * + * @param publisherSet The set of broker connections to use when registering and publishing. + */ + public MonitorSubPlanExecutionPublisher(org.ccsds.moims.mo.mal.provider.MALPublisherSet publisherSet) { + this.publisherSet = publisherSet; + } + + /** + * Registers this provider implementation to the set of broker connections. + * + * @param keyNames The key names to use in the method + * @param keyTypes The key types to use in the method + * @param listener The listener object to use for callback from the publisher + * @throws java.lang.IllegalArgumentException If any supplied argument is invalid + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void register(org.ccsds.moims.mo.mal.structures.IdentifierList keyNames, + org.ccsds.moims.mo.mal.structures.AttributeTypeList keyTypes, + org.ccsds.moims.mo.mal.provider.MALPublishInteractionListener listener) throws java.lang.IllegalArgumentException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + publisherSet.register(keyNames, keyTypes, listener); + } + + /** + * Registers this provider implementation to the set of broker connections + * with the default subscription keys. + * + * @param listener The listener object to use for callback from the publisher + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void registerWithDefaultKeys(org.ccsds.moims.mo.mal.provider.MALPublishInteractionListener listener) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + org.ccsds.moims.mo.mal.structures.IdentifierList keyNames = new org.ccsds.moims.mo.mal.structures.IdentifierList(); + org.ccsds.moims.mo.mal.structures.AttributeTypeList keyTypes = new org.ccsds.moims.mo.mal.structures.AttributeTypeList(); + keyNames.add(new org.ccsds.moims.mo.mal.structures.Identifier("subPlan")); + keyTypes.add(org.ccsds.moims.mo.mal.structures.AttributeType.IDENTIFIER); + publisherSet.register(keyNames, keyTypes, listener); + } + + /** + * Asynchronously registers this provider implementation to the set of broker + * connections. + * + * @param keyNames The key names to use in the method + * @param keyTypes The key types to use in the method + * @param listener The listener object to use for callback from the publisher + * @throws java.lang.IllegalArgumentException If any supplied argument is invalid + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void asyncRegister(org.ccsds.moims.mo.mal.structures.IdentifierList keyNames, + org.ccsds.moims.mo.mal.structures.AttributeTypeList keyTypes, + org.ccsds.moims.mo.mal.provider.MALPublishInteractionListener listener) throws java.lang.IllegalArgumentException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + publisherSet.asyncRegister(keyNames, keyTypes, listener); + } + + /** + * Publishes updates to the set of registered broker connections. + * + * @param updateHeader The headers of the updates being added + * @param subPlanUpdate The subPlanUpdate field. + * @throws java.lang.IllegalArgumentException If any supplied argument is invalid + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void publish(org.ccsds.moims.mo.mal.structures.UpdateHeader updateHeader, + org.ccsds.moims.mo.mps.structures.SubPlanUpdate subPlanUpdate) throws java.lang.IllegalArgumentException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + publisherSet.publish(updateHeader, subPlanUpdate); + } + + /** + * Deregisters this provider implementation from the set of broker connections. + * + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void deregister() throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + publisherSet.deregister(); + } + + /** + * Asynchronously deregisters this provider implementation from the set of + * broker connections. + * + * @param listener The listener object to use for callback from the publisher + * @throws java.lang.IllegalArgumentException If any supplied argument is invalid + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void asyncDeregister(org.ccsds.moims.mo.mal.provider.MALPublishInteractionListener listener) throws java.lang.IllegalArgumentException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + publisherSet.asyncDeregister(listener); + } + + /** + * Closes this publisher. + * + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void close() throws org.ccsds.moims.mo.mal.MALException { + publisherSet.close(); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planexecutioncontrol/provider/PlanExecutionControlHandler.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planexecutioncontrol/provider/PlanExecutionControlHandler.java new file mode 100644 index 00000000..7bcba0e3 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planexecutioncontrol/provider/PlanExecutionControlHandler.java @@ -0,0 +1,172 @@ +package org.ccsds.moims.mo.mps.planexecutioncontrol.provider; + +/** + * Interface that providers of the PlanExecutionControl service must implement + * to handle the operations of that service. + */ +public interface PlanExecutionControlHandler { + + /** + * Implements the operation submitPlan. + * + * @param plan The plan field. + * @param interaction The MAL object representing the interaction in the provider. + * @throws org.ccsds.moims.mo.mps.InvalidException One or more fields in the message contain invalid values. + * @throws org.ccsds.moims.mo.mps.SubmitFailedException The submitPlan operation failed as the submitted plan was already terminated. + * @throws org.ccsds.moims.mo.mps.UnsupportedException An optional data structure used in the message is not supported by the service provider. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + void submitPlan(org.ccsds.moims.mo.mps.structures.Plan plan, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mps.InvalidException, org.ccsds.moims.mo.mps.SubmitFailedException, org.ccsds.moims.mo.mps.UnsupportedException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation revokePlan. + * + * @param planRef The planRef field. + * @param interaction The MAL object representing the interaction in the provider. + * @throws org.ccsds.moims.mo.mps.InvalidException One or more fields in the message contain invalid values. + * @throws org.ccsds.moims.mo.mps.RevokeFailedException The revokePlan operation failed to revoke the referenced Plan, for example because it has already started executing. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + void revokePlan(org.ccsds.moims.mo.mal.structures.ObjectRef planRef, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mps.InvalidException, org.ccsds.moims.mo.mps.RevokeFailedException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation getPlanStatus. + * + * @param planRefs The planRefs field. + * @param interaction The MAL object representing the interaction in the provider. + * @return The return value of the operation + * @throws org.ccsds.moims.mo.mps.InvalidException One or more fields in the message contain invalid values. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + org.ccsds.moims.mo.mps.structures.PlanUpdateList getPlanStatus(org.ccsds.moims.mo.mal.structures.ObjectRefList planRefs, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mps.InvalidException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation activatePlan. + * + * @param planRefs The planRefs field. + * @param interaction The MAL object representing the interaction in the provider. + * @return The return value of the operation + * @throws org.ccsds.moims.mo.mps.InvalidException One or more fields in the message contain invalid values. + * @throws org.ccsds.moims.mo.mps.ActivateFailedException The activatePlan operation failed as the activation was outside the validity period of the Plan, or the start of the planPeriod had already passed. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + org.ccsds.moims.mo.mps.structures.PlanActivationStatusList activatePlan(org.ccsds.moims.mo.mal.structures.ObjectRefList planRefs, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mps.InvalidException, org.ccsds.moims.mo.mps.ActivateFailedException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation deactivatePlan. + * + * @param planRefs The planRefs field. + * @param deactivationMode The deactivationMode field. + * @param interaction The MAL object representing the interaction in the provider. + * @return The return value of the operation + * @throws org.ccsds.moims.mo.mps.InvalidException One or more fields in the message contain invalid values. + * @throws org.ccsds.moims.mo.mps.DeactivateFailedException The deactivatePlan operation failed. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + org.ccsds.moims.mo.mps.structures.PlanActivationStatusList deactivatePlan(org.ccsds.moims.mo.mal.structures.ObjectRefList planRefs, + org.ccsds.moims.mo.mal.structures.Identifier deactivationMode, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mps.InvalidException, org.ccsds.moims.mo.mps.DeactivateFailedException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation activateSubPlan. + * + * @param subPlanIDs The subPlanIDs field. + * @param interaction The MAL object representing the interaction in the provider. + * @return The return value of the operation + * @throws org.ccsds.moims.mo.mps.InvalidException One or more fields in the message contain invalid values. + * @throws org.ccsds.moims.mo.mps.ActivateSubplanFailedException The activateSubPlan operation failed. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + org.ccsds.moims.mo.mps.structures.SubPlanActivationStatusList activateSubPlan(org.ccsds.moims.mo.mal.structures.IdentifierList subPlanIDs, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mps.InvalidException, org.ccsds.moims.mo.mps.ActivateSubplanFailedException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation deactivateSubPlan. + * + * @param subPlanIDs The subPlanIDs field. + * @param deactivationMode The deactivationMode field. + * @param interaction The MAL object representing the interaction in the provider. + * @return The return value of the operation + * @throws org.ccsds.moims.mo.mps.InvalidException One or more fields in the message contain invalid values. + * @throws org.ccsds.moims.mo.mps.DeactivateSubplanFailedException The deactivateSubPlan operation failed. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + org.ccsds.moims.mo.mps.structures.SubPlanActivationStatusList deactivateSubPlan(org.ccsds.moims.mo.mal.structures.IdentifierList subPlanIDs, + String deactivationMode, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mps.InvalidException, org.ccsds.moims.mo.mps.DeactivateSubplanFailedException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation getSubPlanStatus. + * + * @param subPlanIDs The subPlanIDs field. + * @param interaction The MAL object representing the interaction in the provider. + * @return The return value of the operation + * @throws org.ccsds.moims.mo.mps.InvalidException One or more fields in the message contain invalid values. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + org.ccsds.moims.mo.mps.structures.SubPlanUpdateList getSubPlanStatus(org.ccsds.moims.mo.mal.structures.IdentifierList subPlanIDs, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mps.InvalidException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation suspendActivity. + * + * @param planRefs The planRefs field. + * @param activityRefs The activityRefs field. + * @param tags The tags field. + * @param suspensionMode The suspensionMode field. + * @param interaction The MAL object representing the interaction in the provider. + * @return The return value of the operation + * @throws org.ccsds.moims.mo.mps.InvalidException One or more fields in the message contain invalid values. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + org.ccsds.moims.mo.mps.structures.ActivitySuspensionStatusList suspendActivity(org.ccsds.moims.mo.mal.structures.ObjectRefList planRefs, + org.ccsds.moims.mo.mal.structures.ObjectRefList activityRefs, + org.ccsds.moims.mo.mal.structures.StringList tags, + String suspensionMode, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mps.InvalidException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation resumeActivity. + * + * @param planRefs The planRefs field. + * @param activityRefs The activityRefs field. + * @param tags The tags field. + * @param interaction The MAL object representing the interaction in the provider. + * @return The return value of the operation + * @throws org.ccsds.moims.mo.mps.InvalidException One or more fields in the message contain invalid values. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + org.ccsds.moims.mo.mps.structures.ActivitySuspensionStatusList resumeActivity(org.ccsds.moims.mo.mal.structures.ObjectRefList planRefs, + org.ccsds.moims.mo.mal.structures.ObjectRefList activityRefs, + org.ccsds.moims.mo.mal.structures.StringList tags, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mps.InvalidException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation getActivityStatus. + * + * @param planRefs The planRefs field. + * @param activityRefs The activityRefs field. + * @param subPlans The subPlans field. + * @param tags The tags field. + * @param interaction The MAL object representing the interaction in the provider. + * @return The return value of the operation + * @throws org.ccsds.moims.mo.mps.InvalidException One or more fields in the message contain invalid values. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + org.ccsds.moims.mo.mps.structures.ActivityUpdateList getActivityStatus(org.ccsds.moims.mo.mal.structures.ObjectRefList planRefs, + org.ccsds.moims.mo.mal.structures.ObjectRefList activityRefs, + org.ccsds.moims.mo.mal.structures.IdentifierList subPlans, + org.ccsds.moims.mo.mal.structures.StringList tags, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mps.InvalidException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Sets the skeleton to be used for creation of publishers. + * + * @param skeleton The skeleton to be used. + */ + void setSkeleton(org.ccsds.moims.mo.mps.planexecutioncontrol.provider.PlanExecutionControlSkeleton skeleton); +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planexecutioncontrol/provider/PlanExecutionControlInheritanceSkeleton.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planexecutioncontrol/provider/PlanExecutionControlInheritanceSkeleton.java new file mode 100644 index 00000000..4ac7e59d --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planexecutioncontrol/provider/PlanExecutionControlInheritanceSkeleton.java @@ -0,0 +1,199 @@ +package org.ccsds.moims.mo.mps.planexecutioncontrol.provider; + +/** + * Provider Inheritance skeleton for PlanExecutionControlInheritanceSkeleton + * service. + */ +public abstract class PlanExecutionControlInheritanceSkeleton implements org.ccsds.moims.mo.mal.provider.MALInteractionHandler, org.ccsds.moims.mo.mps.planexecutioncontrol.provider.PlanExecutionControlSkeleton, org.ccsds.moims.mo.mps.planexecutioncontrol.provider.PlanExecutionControlHandler { + + /** + * The providerSet field. + */ + private org.ccsds.moims.mo.mal.provider.MALProviderSet providerSet = new org.ccsds.moims.mo.mal.provider.MALProviderSet(org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlHelper.PLANEXECUTIONCONTROL_SERVICE); + + /** + * Returns the connection object for this provider. + * + * @return the connection object for this provider + * @throws java.io.IOException if the method was not implemented yet. + */ + public org.ccsds.moims.mo.mal.helpertools.connections.ConnectionProvider getConnection() throws java.io.IOException { + throw new java.io.IOException("This method needs to be overridden!"); + } + + @Override + public void setSkeleton(org.ccsds.moims.mo.mps.planexecutioncontrol.provider.PlanExecutionControlSkeleton skeleton) { + // Not used in the inheritance pattern (the skeleton is 'this'); + } + + @Override + public void malInitialize(org.ccsds.moims.mo.mal.provider.MALProvider provider) throws org.ccsds.moims.mo.mal.MALException { + providerSet.addProvider(provider); + } + + @Override + public void malFinalize(org.ccsds.moims.mo.mal.provider.MALProvider provider) throws org.ccsds.moims.mo.mal.MALException { + providerSet.removeProvider(provider); + } + + @Override + public org.ccsds.moims.mo.mps.planexecutioncontrol.provider.MonitorPlanExecutionPublisher createMonitorPlanExecutionPublisher(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.Identifier networkZone, + org.ccsds.moims.mo.mal.structures.SessionType sessionType, + org.ccsds.moims.mo.mal.structures.Identifier sessionName, + org.ccsds.moims.mo.mal.structures.QoSLevel qos, + java.util.Map qosProps, + org.ccsds.moims.mo.mal.structures.UInteger priority) throws org.ccsds.moims.mo.mal.MALException { + return new org.ccsds.moims.mo.mps.planexecutioncontrol.provider.MonitorPlanExecutionPublisher(providerSet.createPublisherSet(org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo.MONITORPLANEXECUTION_OP, domain, sessionType, sessionName, qos, qosProps, null)); + } + + @Override + public org.ccsds.moims.mo.mps.planexecutioncontrol.provider.MonitorPlanExecutionDetailPublisher createMonitorPlanExecutionDetailPublisher(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.Identifier networkZone, + org.ccsds.moims.mo.mal.structures.SessionType sessionType, + org.ccsds.moims.mo.mal.structures.Identifier sessionName, + org.ccsds.moims.mo.mal.structures.QoSLevel qos, + java.util.Map qosProps, + org.ccsds.moims.mo.mal.structures.UInteger priority) throws org.ccsds.moims.mo.mal.MALException { + return new org.ccsds.moims.mo.mps.planexecutioncontrol.provider.MonitorPlanExecutionDetailPublisher(providerSet.createPublisherSet(org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo.MONITORPLANEXECUTIONDETAIL_OP, domain, sessionType, sessionName, qos, qosProps, null)); + } + + @Override + public org.ccsds.moims.mo.mps.planexecutioncontrol.provider.MonitorSubPlanExecutionPublisher createMonitorSubPlanExecutionPublisher(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.Identifier networkZone, + org.ccsds.moims.mo.mal.structures.SessionType sessionType, + org.ccsds.moims.mo.mal.structures.Identifier sessionName, + org.ccsds.moims.mo.mal.structures.QoSLevel qos, + java.util.Map qosProps, + org.ccsds.moims.mo.mal.structures.UInteger priority) throws org.ccsds.moims.mo.mal.MALException { + return new org.ccsds.moims.mo.mps.planexecutioncontrol.provider.MonitorSubPlanExecutionPublisher(providerSet.createPublisherSet(org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo.MONITORSUBPLANEXECUTION_OP, domain, sessionType, sessionName, qos, qosProps, null)); + } + + @Override + public void handleSend(org.ccsds.moims.mo.mal.provider.MALInteraction interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + switch (opNumber) { + default: + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } + + @Override + public void handleSubmit(org.ccsds.moims.mo.mal.provider.MALSubmit interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + try { + switch (opNumber) { + case org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo._SUBMITPLAN_OP_NUMBER: + submitPlan((org.ccsds.moims.mo.mps.structures.Plan) body.getBodyElement(0, new org.ccsds.moims.mo.mps.structures.Plan()), + interaction); + interaction.sendAcknowledgement(); + break; + case org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo._REVOKEPLAN_OP_NUMBER: + revokePlan((org.ccsds.moims.mo.mal.structures.ObjectRef) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.ObjectRef()), + interaction); + interaction.sendAcknowledgement(); + break; + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } catch (org.ccsds.moims.mo.mal.MOErrorException error) { + throw new org.ccsds.moims.mo.mal.MALInteractionException(error); + } + } + + @Override + public void handleRequest(org.ccsds.moims.mo.mal.provider.MALRequest interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + try { + switch (opNumber) { + case org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo._GETPLANSTATUS_OP_NUMBER: + interaction.sendResponse(getPlanStatus((org.ccsds.moims.mo.mal.structures.ObjectRefList) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.ObjectRefList()), + interaction)); + break; + case org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo._ACTIVATEPLAN_OP_NUMBER: + interaction.sendResponse(activatePlan((org.ccsds.moims.mo.mal.structures.ObjectRefList) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.ObjectRefList()), + interaction)); + break; + case org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo._DEACTIVATEPLAN_OP_NUMBER: + interaction.sendResponse(deactivatePlan((org.ccsds.moims.mo.mal.structures.ObjectRefList) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.ObjectRefList()), + (org.ccsds.moims.mo.mal.structures.Identifier) body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.Identifier()), + interaction)); + break; + case org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo._ACTIVATESUBPLAN_OP_NUMBER: + interaction.sendResponse(activateSubPlan((org.ccsds.moims.mo.mal.structures.IdentifierList) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.IdentifierList()), + interaction)); + break; + case org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo._DEACTIVATESUBPLAN_OP_NUMBER: + interaction.sendResponse(deactivateSubPlan((org.ccsds.moims.mo.mal.structures.IdentifierList) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.IdentifierList()), + (body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.Union("")) == null) ? null : ((org.ccsds.moims.mo.mal.structures.Union) body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.Union(""))).getStringValue(), + interaction)); + break; + case org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo._GETSUBPLANSTATUS_OP_NUMBER: + interaction.sendResponse(getSubPlanStatus((org.ccsds.moims.mo.mal.structures.IdentifierList) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.IdentifierList()), + interaction)); + break; + case org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo._SUSPENDACTIVITY_OP_NUMBER: + interaction.sendResponse(suspendActivity((org.ccsds.moims.mo.mal.structures.ObjectRefList) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.ObjectRefList()), + (org.ccsds.moims.mo.mal.structures.ObjectRefList) body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.ObjectRefList()), + (org.ccsds.moims.mo.mal.structures.StringList) body.getBodyElement(2, new org.ccsds.moims.mo.mal.structures.StringList()), + (body.getBodyElement(3, new org.ccsds.moims.mo.mal.structures.Union("")) == null) ? null : ((org.ccsds.moims.mo.mal.structures.Union) body.getBodyElement(3, new org.ccsds.moims.mo.mal.structures.Union(""))).getStringValue(), + interaction)); + break; + case org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo._RESUMEACTIVITY_OP_NUMBER: + interaction.sendResponse(resumeActivity((org.ccsds.moims.mo.mal.structures.ObjectRefList) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.ObjectRefList()), + (org.ccsds.moims.mo.mal.structures.ObjectRefList) body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.ObjectRefList()), + (org.ccsds.moims.mo.mal.structures.StringList) body.getBodyElement(2, new org.ccsds.moims.mo.mal.structures.StringList()), + interaction)); + break; + case org.ccsds.moims.mo.mps.planexecutioncontrol.PlanExecutionControlServiceInfo._GETACTIVITYSTATUS_OP_NUMBER: + interaction.sendResponse(getActivityStatus((org.ccsds.moims.mo.mal.structures.ObjectRefList) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.ObjectRefList()), + (org.ccsds.moims.mo.mal.structures.ObjectRefList) body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.ObjectRefList()), + (org.ccsds.moims.mo.mal.structures.IdentifierList) body.getBodyElement(2, new org.ccsds.moims.mo.mal.structures.IdentifierList()), + (org.ccsds.moims.mo.mal.structures.StringList) body.getBodyElement(3, new org.ccsds.moims.mo.mal.structures.StringList()), + interaction)); + break; + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } catch (org.ccsds.moims.mo.mal.MOErrorException error) { + throw new org.ccsds.moims.mo.mal.MALInteractionException(error); + } + } + + @Override + public void handleInvoke(org.ccsds.moims.mo.mal.provider.MALInvoke interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + switch (opNumber) { + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } + + @Override + public void handleProgress(org.ccsds.moims.mo.mal.provider.MALProgress interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + switch (opNumber) { + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planexecutioncontrol/provider/PlanExecutionControlSkeleton.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planexecutioncontrol/provider/PlanExecutionControlSkeleton.java new file mode 100644 index 00000000..6eee1e4a --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planexecutioncontrol/provider/PlanExecutionControlSkeleton.java @@ -0,0 +1,71 @@ +package org.ccsds.moims.mo.mps.planexecutioncontrol.provider; + +/** + * The skeleton interface for the PlanExecutionControl service. + */ +public interface PlanExecutionControlSkeleton { + + /** + * Creates a publisher object using the current registered provider set for + * the PubSub operation monitorPlanExecution. + * + * @param domain The domain used for publishing + * @param networkZone ~The network zone used for publishing + * @param sessionType The session used for publishing + * @param sessionName The session name used for publishing + * @param qos The QoS used for publishing + * @param qosProps The QoS properties used for publishing + * @param priority The priority used for publishing + * @return The new publisher object. + * @throws org.ccsds.moims.mo.mal.MALException if a problem is detected during creation of the publisher + */ + org.ccsds.moims.mo.mps.planexecutioncontrol.provider.MonitorPlanExecutionPublisher createMonitorPlanExecutionPublisher(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.Identifier networkZone, + org.ccsds.moims.mo.mal.structures.SessionType sessionType, + org.ccsds.moims.mo.mal.structures.Identifier sessionName, + org.ccsds.moims.mo.mal.structures.QoSLevel qos, + java.util.Map qosProps, + org.ccsds.moims.mo.mal.structures.UInteger priority) throws org.ccsds.moims.mo.mal.MALException; + /** + * Creates a publisher object using the current registered provider set for + * the PubSub operation monitorPlanExecutionDetail. + * + * @param domain The domain used for publishing + * @param networkZone ~The network zone used for publishing + * @param sessionType The session used for publishing + * @param sessionName The session name used for publishing + * @param qos The QoS used for publishing + * @param qosProps The QoS properties used for publishing + * @param priority The priority used for publishing + * @return The new publisher object. + * @throws org.ccsds.moims.mo.mal.MALException if a problem is detected during creation of the publisher + */ + org.ccsds.moims.mo.mps.planexecutioncontrol.provider.MonitorPlanExecutionDetailPublisher createMonitorPlanExecutionDetailPublisher(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.Identifier networkZone, + org.ccsds.moims.mo.mal.structures.SessionType sessionType, + org.ccsds.moims.mo.mal.structures.Identifier sessionName, + org.ccsds.moims.mo.mal.structures.QoSLevel qos, + java.util.Map qosProps, + org.ccsds.moims.mo.mal.structures.UInteger priority) throws org.ccsds.moims.mo.mal.MALException; + /** + * Creates a publisher object using the current registered provider set for + * the PubSub operation monitorSubPlanExecution. + * + * @param domain The domain used for publishing + * @param networkZone ~The network zone used for publishing + * @param sessionType The session used for publishing + * @param sessionName The session name used for publishing + * @param qos The QoS used for publishing + * @param qosProps The QoS properties used for publishing + * @param priority The priority used for publishing + * @return The new publisher object. + * @throws org.ccsds.moims.mo.mal.MALException if a problem is detected during creation of the publisher + */ + org.ccsds.moims.mo.mps.planexecutioncontrol.provider.MonitorSubPlanExecutionPublisher createMonitorSubPlanExecutionPublisher(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.Identifier networkZone, + org.ccsds.moims.mo.mal.structures.SessionType sessionType, + org.ccsds.moims.mo.mal.structures.Identifier sessionName, + org.ccsds.moims.mo.mal.structures.QoSLevel qos, + java.util.Map qosProps, + org.ccsds.moims.mo.mal.structures.UInteger priority) throws org.ccsds.moims.mo.mal.MALException; +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planexecutioncontrol/provider/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planexecutioncontrol/provider/package-info.java new file mode 100644 index 00000000..4f4d1d25 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planexecutioncontrol/provider/package-info.java @@ -0,0 +1,5 @@ +/** + * Package containing the provider skeletons for the PlanExecutionControl + * service. +*/ +package org.ccsds.moims.mo.mps.planexecutioncontrol.provider; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planinformationmanagement/PlanInformationManagementHelper.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planinformationmanagement/PlanInformationManagementHelper.java new file mode 100644 index 00000000..06875da1 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planinformationmanagement/PlanInformationManagementHelper.java @@ -0,0 +1,17 @@ +package org.ccsds.moims.mo.mps.planinformationmanagement; + +/** + * Helper class for PlanInformationManagement service. + */ +public class PlanInformationManagementHelper { + + /** + * Service singleton instance. + */ + public static final org.ccsds.moims.mo.mps.planinformationmanagement.PlanInformationManagementServiceInfo PLANINFORMATIONMANAGEMENT_SERVICE = new org.ccsds.moims.mo.mps.planinformationmanagement.PlanInformationManagementServiceInfo(); + + private PlanInformationManagementHelper() { + // Utility class; not meant to be instantiated. + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planinformationmanagement/PlanInformationManagementServiceInfo.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planinformationmanagement/PlanInformationManagementServiceInfo.java new file mode 100644 index 00000000..a920ccef --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planinformationmanagement/PlanInformationManagementServiceInfo.java @@ -0,0 +1,288 @@ +package org.ccsds.moims.mo.mps.planinformationmanagement; + +/** + * Helper class for PlanInformationManagement service. + */ +public class PlanInformationManagementServiceInfo extends org.ccsds.moims.mo.mal.ServiceInfo { + + /** + * Service number literal. + */ + public static final int _PLANINFORMATIONMANAGEMENT_SERVICE_NUMBER = 4; + + /** + * Service number instance. + */ + public static final org.ccsds.moims.mo.mal.structures.UShort PLANINFORMATIONMANAGEMENT_SERVICE_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_PLANINFORMATIONMANAGEMENT_SERVICE_NUMBER); + + /** + * Service name constant. + */ + public static final org.ccsds.moims.mo.mal.structures.Identifier PLANINFORMATIONMANAGEMENT_SERVICE_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("PlanInformationManagement"); + + /** + * The service key of this service. + */ + private static final org.ccsds.moims.mo.mal.ServiceKey SERVICE_KEY = new org.ccsds.moims.mo.mal.ServiceKey( + 5, 1, PLANINFORMATIONMANAGEMENT_SERVICE_NUMBER); + + /** + * Operation number literal for operation LISTREQUESTDEFS. + */ + public static final int _LISTREQUESTDEFS_OP_NUMBER = 1; + + /** + * Operation number instance for operation LISTREQUESTDEFS. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort LISTREQUESTDEFS_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_LISTREQUESTDEFS_OP_NUMBER); + + /** + * Operation instance for operation LISTREQUESTDEFS. + */ + public static final org.ccsds.moims.mo.mal.MALProgressOperation LISTREQUESTDEFS_OP = new org.ccsds.moims.mo.mal.MALProgressOperation(SERVICE_KEY, + LISTREQUESTDEFS_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("listRequestDefs"), + new org.ccsds.moims.mo.mal.structures.UShort(1), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("domain", true, org.ccsds.moims.mo.mal.structures.IdentifierList.SHORT_FORM, ""), + new org.ccsds.moims.mo.mal.OperationField("requestDefs", true, org.ccsds.moims.mo.mal.structures.ObjectRefList.SHORT_FORM, "")}, + new org.ccsds.moims.mo.mal.OperationField[] {}, + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("requestDefs", false, org.ccsds.moims.mo.mps.structures.DefListEntryList.SHORT_FORM, "")}, + new org.ccsds.moims.mo.mal.OperationField[] {}, + "The listRequestDefs operation is used to obtain a list of available RequestDefinitions together with their descriptions. The list can be filtered by domain or restricted to specified definition IDs. All available versions are listed. The domain field is an ordered list of identifiers representing a domain hierarchy, any node of which can use ‘*’ as a wildcard (meaning any domain identifier at that level of the hierarchy). If a set of domains is required that cannot be represented through the use of wildcards, then the operation will need to be repeated using different domain filters."); + + /** + * Operation number literal for operation GETREQUESTDEFS. + */ + public static final int _GETREQUESTDEFS_OP_NUMBER = 2; + + /** + * Operation number instance for operation GETREQUESTDEFS. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort GETREQUESTDEFS_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_GETREQUESTDEFS_OP_NUMBER); + + /** + * Operation instance for operation GETREQUESTDEFS. + */ + public static final org.ccsds.moims.mo.mal.MALRequestOperation GETREQUESTDEFS_OP = new org.ccsds.moims.mo.mal.MALRequestOperation(SERVICE_KEY, + GETREQUESTDEFS_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("getRequestDefs"), + new org.ccsds.moims.mo.mal.structures.UShort(1), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("requestDefs", false, org.ccsds.moims.mo.mal.structures.ObjectRefList.SHORT_FORM, "")}, + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("definitions", false, org.ccsds.moims.mo.mps.structures.RequestDefinitionList.SHORT_FORM, "")}, + "The getRequestDefs operation is used to retrieve one or more available RequestDefinitions, whose identity is known to the consumer."); + + /** + * Operation number literal for operation LISTEVENTDEFS. + */ + public static final int _LISTEVENTDEFS_OP_NUMBER = 3; + + /** + * Operation number instance for operation LISTEVENTDEFS. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort LISTEVENTDEFS_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_LISTEVENTDEFS_OP_NUMBER); + + /** + * Operation instance for operation LISTEVENTDEFS. + */ + public static final org.ccsds.moims.mo.mal.MALProgressOperation LISTEVENTDEFS_OP = new org.ccsds.moims.mo.mal.MALProgressOperation(SERVICE_KEY, + LISTEVENTDEFS_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("listEventDefs"), + new org.ccsds.moims.mo.mal.structures.UShort(2), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("domain", true, org.ccsds.moims.mo.mal.structures.IdentifierList.SHORT_FORM, ""), + new org.ccsds.moims.mo.mal.OperationField("eventDefs", true, org.ccsds.moims.mo.mal.structures.ObjectRefList.SHORT_FORM, "")}, + new org.ccsds.moims.mo.mal.OperationField[] {}, + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("eventDefs", false, org.ccsds.moims.mo.mps.structures.DefListEntryList.SHORT_FORM, "")}, + new org.ccsds.moims.mo.mal.OperationField[] {}, + "The listEventDefs operation is used to obtain a list of available EventDefinitions together with their descriptions. The list can be filtered by domain or restricted to specified definition IDs. All available versions are listed. The domain field is an ordered list of identifiers representing a domain hierarchy, any node of which can use ‘*’ as a wildcard (meaning any domain identifier at that level of the hierarchy). If a set of domains is required that cannot be represented through the use of wildcards, then the operation will need to be repeated using different domain filters."); + + /** + * Operation number literal for operation GETEVENTDEFS. + */ + public static final int _GETEVENTDEFS_OP_NUMBER = 4; + + /** + * Operation number instance for operation GETEVENTDEFS. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort GETEVENTDEFS_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_GETEVENTDEFS_OP_NUMBER); + + /** + * Operation instance for operation GETEVENTDEFS. + */ + public static final org.ccsds.moims.mo.mal.MALRequestOperation GETEVENTDEFS_OP = new org.ccsds.moims.mo.mal.MALRequestOperation(SERVICE_KEY, + GETEVENTDEFS_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("getEventDefs"), + new org.ccsds.moims.mo.mal.structures.UShort(2), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("eventDefs", false, org.ccsds.moims.mo.mal.structures.ObjectRefList.SHORT_FORM, "")}, + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("definitions", false, org.ccsds.moims.mo.mps.structures.EventDefinitionList.SHORT_FORM, "")}, + "The getEventDefs operation is used to retrieve one or more available EventDefinitions, whose identity is known to the consumer."); + + /** + * Operation number literal for operation LISTACTIVITYDEFS. + */ + public static final int _LISTACTIVITYDEFS_OP_NUMBER = 5; + + /** + * Operation number instance for operation LISTACTIVITYDEFS. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort LISTACTIVITYDEFS_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_LISTACTIVITYDEFS_OP_NUMBER); + + /** + * Operation instance for operation LISTACTIVITYDEFS. + */ + public static final org.ccsds.moims.mo.mal.MALProgressOperation LISTACTIVITYDEFS_OP = new org.ccsds.moims.mo.mal.MALProgressOperation(SERVICE_KEY, + LISTACTIVITYDEFS_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("listActivityDefs"), + new org.ccsds.moims.mo.mal.structures.UShort(3), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("domain", true, org.ccsds.moims.mo.mal.structures.IdentifierList.SHORT_FORM, ""), + new org.ccsds.moims.mo.mal.OperationField("activityDefs", true, org.ccsds.moims.mo.mal.structures.ObjectRefList.SHORT_FORM, ""), + new org.ccsds.moims.mo.mal.OperationField("defaultTags", true, org.ccsds.moims.mo.mal.structures.StringList.SHORT_FORM, "")}, + new org.ccsds.moims.mo.mal.OperationField[] {}, + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("activitytDefs", false, org.ccsds.moims.mo.mps.structures.DefListEntryList.SHORT_FORM, "")}, + new org.ccsds.moims.mo.mal.OperationField[] {}, + "The listActivityDefs operation is used to obtain a list of available ActivityDefinitions together with their descriptions. The list can be filtered by domain or restricted to specified definition IDs. All available versions are listed. The domain field is an ordered list of identifiers representing a domain hierarchy, any node of which can use ‘*’ as a wildcard (meaning any domain identifier at that level of the hierarchy). If a set of domains is required that cannot be represented through the use of wildcards, then the operation will need to be repeated using different domain filters."); + + /** + * Operation number literal for operation GETACTIVITYDEFS. + */ + public static final int _GETACTIVITYDEFS_OP_NUMBER = 6; + + /** + * Operation number instance for operation GETACTIVITYDEFS. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort GETACTIVITYDEFS_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_GETACTIVITYDEFS_OP_NUMBER); + + /** + * Operation instance for operation GETACTIVITYDEFS. + */ + public static final org.ccsds.moims.mo.mal.MALRequestOperation GETACTIVITYDEFS_OP = new org.ccsds.moims.mo.mal.MALRequestOperation(SERVICE_KEY, + GETACTIVITYDEFS_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("getActivityDefs"), + new org.ccsds.moims.mo.mal.structures.UShort(3), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("activityDefs", false, org.ccsds.moims.mo.mal.structures.ObjectRefList.SHORT_FORM, "")}, + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("definitions", false, org.ccsds.moims.mo.mps.structures.ActivityDefinitionList.SHORT_FORM, "")}, + "The getActivityDefs operation is used to retrieve one or more available ActivityDefinitions, whose identity is known to the consumer."); + + /** + * Operation number literal for operation LISTRESOURCEDEFS. + */ + public static final int _LISTRESOURCEDEFS_OP_NUMBER = 7; + + /** + * Operation number instance for operation LISTRESOURCEDEFS. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort LISTRESOURCEDEFS_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_LISTRESOURCEDEFS_OP_NUMBER); + + /** + * Operation instance for operation LISTRESOURCEDEFS. + */ + public static final org.ccsds.moims.mo.mal.MALProgressOperation LISTRESOURCEDEFS_OP = new org.ccsds.moims.mo.mal.MALProgressOperation(SERVICE_KEY, + LISTRESOURCEDEFS_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("listResourceDefs"), + new org.ccsds.moims.mo.mal.structures.UShort(4), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("domain", true, org.ccsds.moims.mo.mal.structures.IdentifierList.SHORT_FORM, ""), + new org.ccsds.moims.mo.mal.OperationField("dataType", true, org.ccsds.moims.mo.mal.structures.AttributeTypeList.SHORT_FORM, "")}, + new org.ccsds.moims.mo.mal.OperationField[] {}, + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("resourceDefs", false, org.ccsds.moims.mo.mps.structures.DefListEntryList.SHORT_FORM, "")}, + new org.ccsds.moims.mo.mal.OperationField[] {}, + "The listResourceDefs operation is used to obtain a list of available Resources together with their descriptions. The list can be filtered by domain or restricted to data types. All available versions are listed. The domain field is an ordered list of identifiers representing a domain hierarchy, any node of which can use ‘*’ as a wildcard (meaning any domain identifier at that level of the hierarchy). If a set of domains is required that cannot be represented through the use of wildcards, then the operation will need to be repeated using different domain filters."); + + /** + * Operation number literal for operation GETRESOURCEDEFS. + */ + public static final int _GETRESOURCEDEFS_OP_NUMBER = 8; + + /** + * Operation number instance for operation GETRESOURCEDEFS. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort GETRESOURCEDEFS_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_GETRESOURCEDEFS_OP_NUMBER); + + /** + * Operation instance for operation GETRESOURCEDEFS. + */ + public static final org.ccsds.moims.mo.mal.MALRequestOperation GETRESOURCEDEFS_OP = new org.ccsds.moims.mo.mal.MALRequestOperation(SERVICE_KEY, + GETRESOURCEDEFS_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("getResourceDefs"), + new org.ccsds.moims.mo.mal.structures.UShort(4), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("resources", false, org.ccsds.moims.mo.mal.structures.ObjectRefList.SHORT_FORM, "")}, + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("definitions", false, org.ccsds.moims.mo.mps.structures.ResourceList.SHORT_FORM, "")}, + "The getResourceDefs operation is used to retrieve the definition of one or more available Resources, whose identity is known to the consumer. It should be noted that this operation is designed to retrieve the resource definition and not the current value of the resource (the value field may contain a default value for the resource)."); + + /** + * Area elements. + */ + public static final org.ccsds.moims.mo.mal.structures.Element[] PLANINFORMATIONMANAGEMENT_SERVICE_ELEMENTS = {}; + + /** + * The set of operations for this service. + */ + public static final org.ccsds.moims.mo.mal.MALOperation[] OPERATIONS = new org.ccsds.moims.mo.mal.MALOperation[]{LISTREQUESTDEFS_OP, + GETREQUESTDEFS_OP, + LISTEVENTDEFS_OP, + GETEVENTDEFS_OP, + LISTACTIVITYDEFS_OP, + GETACTIVITYDEFS_OP, + LISTRESOURCEDEFS_OP, + GETRESOURCEDEFS_OP}; + + /** + * Creates an instance of the PlanInformationManagement ServiceInfo. + * + */ + public PlanInformationManagementServiceInfo() { + super(SERVICE_KEY, PLANINFORMATIONMANAGEMENT_SERVICE_NAME, PLANINFORMATIONMANAGEMENT_SERVICE_ELEMENTS, OPERATIONS); + } + + @Override + public org.ccsds.moims.mo.mal.MALArea getArea() { + return org.ccsds.moims.mo.mps.MPSHelper.MPS_AREA; + } + + @Override + public org.ccsds.moims.mo.mal.MOErrorException generateMOError(int errorNumber, + Object extraInfo) { + switch (errorNumber) { + case 1: + return new org.ccsds.moims.mo.mps.InvalidException(extraInfo); + case 2: + return new org.ccsds.moims.mo.mps.CancelFailedException(extraInfo); + case 3: + return new org.ccsds.moims.mo.mps.UpdateFailedException(extraInfo); + case 4: + return new org.ccsds.moims.mo.mps.RevokeFailedException(extraInfo); + case 5: + return new org.ccsds.moims.mo.mps.InsertFailedException(extraInfo); + case 6: + return new org.ccsds.moims.mo.mps.DeleteFailedException(extraInfo); + case 7: + return new org.ccsds.moims.mo.mps.ActivateFailedException(extraInfo); + case 8: + return new org.ccsds.moims.mo.mps.DeactivateFailedException(extraInfo); + case 9: + return new org.ccsds.moims.mo.mps.SubmitFailedException(extraInfo); + case 10: + return new org.ccsds.moims.mo.mps.UnsupportedException(extraInfo); + case 11: + return new org.ccsds.moims.mo.mps.ActivateSubplanFailedException(extraInfo); + case 12: + return new org.ccsds.moims.mo.mps.DeactivateSubplanFailedException(extraInfo); + } + return null; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planinformationmanagement/consumer/PlanInformationManagementAdapter.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planinformationmanagement/consumer/PlanInformationManagementAdapter.java new file mode 100644 index 00000000..75d26474 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planinformationmanagement/consumer/PlanInformationManagementAdapter.java @@ -0,0 +1,592 @@ +package org.ccsds.moims.mo.mps.planinformationmanagement.consumer; + +/** + * Consumer adapter for PlanInformationManagement service. + */ +public abstract class PlanInformationManagementAdapter extends org.ccsds.moims.mo.mal.consumer.MALInteractionAdapter { + + /** + * Called by the MAL when a PROGRESS acknowledgement is received from a provider + * for the operation listRequestDefs. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void listRequestDefsAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PROGRESS update is received from a provider for + * the operation listRequestDefs. + * + * @param msgHeader msgHeader The header of the received message + * @param requestDefs The requestDefs field. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void listRequestDefsUpdateReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mps.structures.DefListEntryList requestDefs, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PROGRESS response is received from a provider + * for the operation listRequestDefs. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void listRequestDefsResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PROGRESS acknowledgement error is received from + * a provider for the operation listRequestDefs. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void listRequestDefsAckErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PROGRESS update error is received from a provider + * for the operation listRequestDefs. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void listRequestDefsUpdateErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PROGRESS response error is received from a provider + * for the operation listRequestDefs. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void listRequestDefsResponseErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response is received from a provider for + * the operation getRequestDefs. + * + * @param msgHeader msgHeader The header of the received message + * @param definitions The definitions field. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void getRequestDefsResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mps.structures.RequestDefinitionList definitions, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response error is received from a provider + * for the operation getRequestDefs. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void getRequestDefsErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PROGRESS acknowledgement is received from a provider + * for the operation listEventDefs. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void listEventDefsAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PROGRESS update is received from a provider for + * the operation listEventDefs. + * + * @param msgHeader msgHeader The header of the received message + * @param eventDefs The eventDefs field. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void listEventDefsUpdateReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mps.structures.DefListEntryList eventDefs, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PROGRESS response is received from a provider + * for the operation listEventDefs. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void listEventDefsResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PROGRESS acknowledgement error is received from + * a provider for the operation listEventDefs. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void listEventDefsAckErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PROGRESS update error is received from a provider + * for the operation listEventDefs. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void listEventDefsUpdateErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PROGRESS response error is received from a provider + * for the operation listEventDefs. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void listEventDefsResponseErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response is received from a provider for + * the operation getEventDefs. + * + * @param msgHeader msgHeader The header of the received message + * @param definitions The definitions field. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void getEventDefsResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mps.structures.EventDefinitionList definitions, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response error is received from a provider + * for the operation getEventDefs. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void getEventDefsErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PROGRESS acknowledgement is received from a provider + * for the operation listActivityDefs. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void listActivityDefsAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PROGRESS update is received from a provider for + * the operation listActivityDefs. + * + * @param msgHeader msgHeader The header of the received message + * @param activitytDefs The activitytDefs field. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void listActivityDefsUpdateReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mps.structures.DefListEntryList activitytDefs, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PROGRESS response is received from a provider + * for the operation listActivityDefs. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void listActivityDefsResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PROGRESS acknowledgement error is received from + * a provider for the operation listActivityDefs. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void listActivityDefsAckErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PROGRESS update error is received from a provider + * for the operation listActivityDefs. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void listActivityDefsUpdateErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PROGRESS response error is received from a provider + * for the operation listActivityDefs. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void listActivityDefsResponseErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response is received from a provider for + * the operation getActivityDefs. + * + * @param msgHeader msgHeader The header of the received message + * @param definitions The definitions field. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void getActivityDefsResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mps.structures.ActivityDefinitionList definitions, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response error is received from a provider + * for the operation getActivityDefs. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void getActivityDefsErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PROGRESS acknowledgement is received from a provider + * for the operation listResourceDefs. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void listResourceDefsAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PROGRESS update is received from a provider for + * the operation listResourceDefs. + * + * @param msgHeader msgHeader The header of the received message + * @param resourceDefs The resourceDefs field. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void listResourceDefsUpdateReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mps.structures.DefListEntryList resourceDefs, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PROGRESS response is received from a provider + * for the operation listResourceDefs. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void listResourceDefsResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PROGRESS acknowledgement error is received from + * a provider for the operation listResourceDefs. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void listResourceDefsAckErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PROGRESS update error is received from a provider + * for the operation listResourceDefs. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void listResourceDefsUpdateErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PROGRESS response error is received from a provider + * for the operation listResourceDefs. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void listResourceDefsResponseErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response is received from a provider for + * the operation getResourceDefs. + * + * @param msgHeader msgHeader The header of the received message + * @param definitions The definitions field. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void getResourceDefsResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mps.structures.ResourceList definitions, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response error is received from a provider + * for the operation getResourceDefs. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void getResourceDefsErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + @Override + public final void requestResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALMessageBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mps.planinformationmanagement.PlanInformationManagementServiceInfo._GETREQUESTDEFS_OP_NUMBER: + getRequestDefsResponseReceived(msgHeader, + (org.ccsds.moims.mo.mps.structures.RequestDefinitionList) body.getBodyElement(0, new org.ccsds.moims.mo.mps.structures.RequestDefinitionList()), qosProperties); + break; + case org.ccsds.moims.mo.mps.planinformationmanagement.PlanInformationManagementServiceInfo._GETEVENTDEFS_OP_NUMBER: + getEventDefsResponseReceived(msgHeader, + (org.ccsds.moims.mo.mps.structures.EventDefinitionList) body.getBodyElement(0, new org.ccsds.moims.mo.mps.structures.EventDefinitionList()), qosProperties); + break; + case org.ccsds.moims.mo.mps.planinformationmanagement.PlanInformationManagementServiceInfo._GETACTIVITYDEFS_OP_NUMBER: + getActivityDefsResponseReceived(msgHeader, + (org.ccsds.moims.mo.mps.structures.ActivityDefinitionList) body.getBodyElement(0, new org.ccsds.moims.mo.mps.structures.ActivityDefinitionList()), qosProperties); + break; + case org.ccsds.moims.mo.mps.planinformationmanagement.PlanInformationManagementServiceInfo._GETRESOURCEDEFS_OP_NUMBER: + getResourceDefsResponseReceived(msgHeader, + (org.ccsds.moims.mo.mps.structures.ResourceList) body.getBodyElement(0, new org.ccsds.moims.mo.mps.structures.ResourceList()), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void requestErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALErrorBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mps.planinformationmanagement.PlanInformationManagementServiceInfo._GETREQUESTDEFS_OP_NUMBER: + getRequestDefsErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mps.planinformationmanagement.PlanInformationManagementServiceInfo._GETEVENTDEFS_OP_NUMBER: + getEventDefsErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mps.planinformationmanagement.PlanInformationManagementServiceInfo._GETACTIVITYDEFS_OP_NUMBER: + getActivityDefsErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mps.planinformationmanagement.PlanInformationManagementServiceInfo._GETRESOURCEDEFS_OP_NUMBER: + getResourceDefsErrorReceived(msgHeader, body.getError(), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void progressAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALMessageBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mps.planinformationmanagement.PlanInformationManagementServiceInfo._LISTREQUESTDEFS_OP_NUMBER: + listRequestDefsAckReceived(msgHeader, qosProperties); + break; + case org.ccsds.moims.mo.mps.planinformationmanagement.PlanInformationManagementServiceInfo._LISTEVENTDEFS_OP_NUMBER: + listEventDefsAckReceived(msgHeader, qosProperties); + break; + case org.ccsds.moims.mo.mps.planinformationmanagement.PlanInformationManagementServiceInfo._LISTACTIVITYDEFS_OP_NUMBER: + listActivityDefsAckReceived(msgHeader, qosProperties); + break; + case org.ccsds.moims.mo.mps.planinformationmanagement.PlanInformationManagementServiceInfo._LISTRESOURCEDEFS_OP_NUMBER: + listResourceDefsAckReceived(msgHeader, qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void progressAckErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALErrorBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mps.planinformationmanagement.PlanInformationManagementServiceInfo._LISTREQUESTDEFS_OP_NUMBER: + listRequestDefsAckErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mps.planinformationmanagement.PlanInformationManagementServiceInfo._LISTEVENTDEFS_OP_NUMBER: + listEventDefsAckErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mps.planinformationmanagement.PlanInformationManagementServiceInfo._LISTACTIVITYDEFS_OP_NUMBER: + listActivityDefsAckErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mps.planinformationmanagement.PlanInformationManagementServiceInfo._LISTRESOURCEDEFS_OP_NUMBER: + listResourceDefsAckErrorReceived(msgHeader, body.getError(), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void progressUpdateReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALMessageBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mps.planinformationmanagement.PlanInformationManagementServiceInfo._LISTREQUESTDEFS_OP_NUMBER: + listRequestDefsUpdateReceived(msgHeader, + (org.ccsds.moims.mo.mps.structures.DefListEntryList) body.getBodyElement(0, new org.ccsds.moims.mo.mps.structures.DefListEntryList()), qosProperties); + break; + case org.ccsds.moims.mo.mps.planinformationmanagement.PlanInformationManagementServiceInfo._LISTEVENTDEFS_OP_NUMBER: + listEventDefsUpdateReceived(msgHeader, + (org.ccsds.moims.mo.mps.structures.DefListEntryList) body.getBodyElement(0, new org.ccsds.moims.mo.mps.structures.DefListEntryList()), qosProperties); + break; + case org.ccsds.moims.mo.mps.planinformationmanagement.PlanInformationManagementServiceInfo._LISTACTIVITYDEFS_OP_NUMBER: + listActivityDefsUpdateReceived(msgHeader, + (org.ccsds.moims.mo.mps.structures.DefListEntryList) body.getBodyElement(0, new org.ccsds.moims.mo.mps.structures.DefListEntryList()), qosProperties); + break; + case org.ccsds.moims.mo.mps.planinformationmanagement.PlanInformationManagementServiceInfo._LISTRESOURCEDEFS_OP_NUMBER: + listResourceDefsUpdateReceived(msgHeader, + (org.ccsds.moims.mo.mps.structures.DefListEntryList) body.getBodyElement(0, new org.ccsds.moims.mo.mps.structures.DefListEntryList()), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void progressUpdateErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALErrorBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mps.planinformationmanagement.PlanInformationManagementServiceInfo._LISTREQUESTDEFS_OP_NUMBER: + listRequestDefsUpdateErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mps.planinformationmanagement.PlanInformationManagementServiceInfo._LISTEVENTDEFS_OP_NUMBER: + listEventDefsUpdateErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mps.planinformationmanagement.PlanInformationManagementServiceInfo._LISTACTIVITYDEFS_OP_NUMBER: + listActivityDefsUpdateErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mps.planinformationmanagement.PlanInformationManagementServiceInfo._LISTRESOURCEDEFS_OP_NUMBER: + listResourceDefsUpdateErrorReceived(msgHeader, body.getError(), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void progressResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALMessageBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mps.planinformationmanagement.PlanInformationManagementServiceInfo._LISTREQUESTDEFS_OP_NUMBER: + listRequestDefsResponseReceived(msgHeader, qosProperties); + break; + case org.ccsds.moims.mo.mps.planinformationmanagement.PlanInformationManagementServiceInfo._LISTEVENTDEFS_OP_NUMBER: + listEventDefsResponseReceived(msgHeader, qosProperties); + break; + case org.ccsds.moims.mo.mps.planinformationmanagement.PlanInformationManagementServiceInfo._LISTACTIVITYDEFS_OP_NUMBER: + listActivityDefsResponseReceived(msgHeader, qosProperties); + break; + case org.ccsds.moims.mo.mps.planinformationmanagement.PlanInformationManagementServiceInfo._LISTRESOURCEDEFS_OP_NUMBER: + listResourceDefsResponseReceived(msgHeader, qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void progressResponseErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALErrorBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mps.planinformationmanagement.PlanInformationManagementServiceInfo._LISTREQUESTDEFS_OP_NUMBER: + listRequestDefsResponseErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mps.planinformationmanagement.PlanInformationManagementServiceInfo._LISTEVENTDEFS_OP_NUMBER: + listEventDefsResponseErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mps.planinformationmanagement.PlanInformationManagementServiceInfo._LISTACTIVITYDEFS_OP_NUMBER: + listActivityDefsResponseErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mps.planinformationmanagement.PlanInformationManagementServiceInfo._LISTRESOURCEDEFS_OP_NUMBER: + listResourceDefsResponseErrorReceived(msgHeader, body.getError(), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planinformationmanagement/consumer/PlanInformationManagementStub.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planinformationmanagement/consumer/PlanInformationManagementStub.java new file mode 100644 index 00000000..a2c52aef --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planinformationmanagement/consumer/PlanInformationManagementStub.java @@ -0,0 +1,444 @@ +package org.ccsds.moims.mo.mps.planinformationmanagement.consumer; + +/** + * Consumer stub for PlanInformationManagement service. + */ +public class PlanInformationManagementStub { + + /** + * The consumer field. + */ + private final org.ccsds.moims.mo.mal.consumer.MALConsumer consumer; + + /** + * Wraps a MALconsumer connection with service specific methods that map from + * the high level service API to the generic MAL API. + * + * @param consumer consumer The MALConsumer to use in this stub. + */ + public PlanInformationManagementStub(org.ccsds.moims.mo.mal.consumer.MALConsumer consumer) { + this.consumer = consumer; + } + + /** + * Returns the internal MAL consumer object used for sending of messages from + * this interface. + * + * @return The MAL consumer object. + */ + public org.ccsds.moims.mo.mal.consumer.MALConsumer getConsumer() { + return consumer; + } + + /** + * The listRequestDefs operation is used to obtain a list of available RequestDefinitions + * together with their descriptions. The list can be filtered by domain or + * restricted to specified definition IDs. All available versions are listed. + * The domain field is an ordered list of identifiers representing a domain + * hierarchy, any node of which can use ‘*’ as a wildcard (meaning any domain + * identifier at that level of the hierarchy). If a set of domains is required + * that cannot be represented through the use of wildcards, then the operation + * will need to be repeated using different domain filters. + * + * @param domain The domain field. + * @param requestDefs The requestDefs field. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void listRequestDefs(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.ObjectRefList requestDefs, + org.ccsds.moims.mo.mps.planinformationmanagement.consumer.PlanInformationManagementAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.progress(org.ccsds.moims.mo.mps.planinformationmanagement.PlanInformationManagementServiceInfo.LISTREQUESTDEFS_OP, adapter, domain, requestDefs); + } + + /** + * Asynchronous version of method listRequestDefs. + * + * @param domain The domain field. + * @param requestDefs The requestDefs field. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncListRequestDefs(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.ObjectRefList requestDefs, + org.ccsds.moims.mo.mps.planinformationmanagement.consumer.PlanInformationManagementAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncProgress(org.ccsds.moims.mo.mps.planinformationmanagement.PlanInformationManagementServiceInfo.LISTREQUESTDEFS_OP, adapter, domain, requestDefs); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueListRequestDefs(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mps.planinformationmanagement.consumer.PlanInformationManagementAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mps.planinformationmanagement.PlanInformationManagementServiceInfo.LISTREQUESTDEFS_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The getRequestDefs operation is used to retrieve one or more available + * RequestDefinitions, whose identity is known to the consumer. + * + * @param requestDefs The requestDefs field. + * @return The return value of the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mps.structures.RequestDefinitionList getRequestDefs(org.ccsds.moims.mo.mal.structures.ObjectRefList requestDefs) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + org.ccsds.moims.mo.mal.transport.MALMessageBody body = consumer.request(org.ccsds.moims.mo.mps.planinformationmanagement.PlanInformationManagementServiceInfo.GETREQUESTDEFS_OP, requestDefs); + Object body0 = (Object) body.getBodyElement(0, new org.ccsds.moims.mo.mps.structures.RequestDefinitionList()); + return (org.ccsds.moims.mo.mps.structures.RequestDefinitionList) body0; + } + + /** + * Asynchronous version of method getRequestDefs. + * + * @param requestDefs The requestDefs field. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncGetRequestDefs(org.ccsds.moims.mo.mal.structures.ObjectRefList requestDefs, + org.ccsds.moims.mo.mps.planinformationmanagement.consumer.PlanInformationManagementAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncRequest(org.ccsds.moims.mo.mps.planinformationmanagement.PlanInformationManagementServiceInfo.GETREQUESTDEFS_OP, adapter, requestDefs); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueGetRequestDefs(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mps.planinformationmanagement.consumer.PlanInformationManagementAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mps.planinformationmanagement.PlanInformationManagementServiceInfo.GETREQUESTDEFS_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The listEventDefs operation is used to obtain a list of available EventDefinitions + * together with their descriptions. The list can be filtered by domain or + * restricted to specified definition IDs. All available versions are listed. + * The domain field is an ordered list of identifiers representing a domain + * hierarchy, any node of which can use ‘*’ as a wildcard (meaning any domain + * identifier at that level of the hierarchy). If a set of domains is required + * that cannot be represented through the use of wildcards, then the operation + * will need to be repeated using different domain filters. + * + * @param domain The domain field. + * @param eventDefs The eventDefs field. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void listEventDefs(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.ObjectRefList eventDefs, + org.ccsds.moims.mo.mps.planinformationmanagement.consumer.PlanInformationManagementAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.progress(org.ccsds.moims.mo.mps.planinformationmanagement.PlanInformationManagementServiceInfo.LISTEVENTDEFS_OP, adapter, domain, eventDefs); + } + + /** + * Asynchronous version of method listEventDefs. + * + * @param domain The domain field. + * @param eventDefs The eventDefs field. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncListEventDefs(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.ObjectRefList eventDefs, + org.ccsds.moims.mo.mps.planinformationmanagement.consumer.PlanInformationManagementAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncProgress(org.ccsds.moims.mo.mps.planinformationmanagement.PlanInformationManagementServiceInfo.LISTEVENTDEFS_OP, adapter, domain, eventDefs); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueListEventDefs(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mps.planinformationmanagement.consumer.PlanInformationManagementAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mps.planinformationmanagement.PlanInformationManagementServiceInfo.LISTEVENTDEFS_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The getEventDefs operation is used to retrieve one or more available EventDefinitions, + * whose identity is known to the consumer. + * + * @param eventDefs The eventDefs field. + * @return The return value of the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mps.structures.EventDefinitionList getEventDefs(org.ccsds.moims.mo.mal.structures.ObjectRefList eventDefs) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + org.ccsds.moims.mo.mal.transport.MALMessageBody body = consumer.request(org.ccsds.moims.mo.mps.planinformationmanagement.PlanInformationManagementServiceInfo.GETEVENTDEFS_OP, eventDefs); + Object body0 = (Object) body.getBodyElement(0, new org.ccsds.moims.mo.mps.structures.EventDefinitionList()); + return (org.ccsds.moims.mo.mps.structures.EventDefinitionList) body0; + } + + /** + * Asynchronous version of method getEventDefs. + * + * @param eventDefs The eventDefs field. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncGetEventDefs(org.ccsds.moims.mo.mal.structures.ObjectRefList eventDefs, + org.ccsds.moims.mo.mps.planinformationmanagement.consumer.PlanInformationManagementAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncRequest(org.ccsds.moims.mo.mps.planinformationmanagement.PlanInformationManagementServiceInfo.GETEVENTDEFS_OP, adapter, eventDefs); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueGetEventDefs(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mps.planinformationmanagement.consumer.PlanInformationManagementAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mps.planinformationmanagement.PlanInformationManagementServiceInfo.GETEVENTDEFS_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The listActivityDefs operation is used to obtain a list of available ActivityDefinitions + * together with their descriptions. The list can be filtered by domain or + * restricted to specified definition IDs. All available versions are listed. + * The domain field is an ordered list of identifiers representing a domain + * hierarchy, any node of which can use ‘*’ as a wildcard (meaning any domain + * identifier at that level of the hierarchy). If a set of domains is required + * that cannot be represented through the use of wildcards, then the operation + * will need to be repeated using different domain filters. + * + * @param domain The domain field. + * @param activityDefs The activityDefs field. + * @param defaultTags The defaultTags field. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void listActivityDefs(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.ObjectRefList activityDefs, + org.ccsds.moims.mo.mal.structures.StringList defaultTags, + org.ccsds.moims.mo.mps.planinformationmanagement.consumer.PlanInformationManagementAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.progress(org.ccsds.moims.mo.mps.planinformationmanagement.PlanInformationManagementServiceInfo.LISTACTIVITYDEFS_OP, adapter, domain, activityDefs, defaultTags); + } + + /** + * Asynchronous version of method listActivityDefs. + * + * @param domain The domain field. + * @param activityDefs The activityDefs field. + * @param defaultTags The defaultTags field. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncListActivityDefs(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.ObjectRefList activityDefs, + org.ccsds.moims.mo.mal.structures.StringList defaultTags, + org.ccsds.moims.mo.mps.planinformationmanagement.consumer.PlanInformationManagementAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncProgress(org.ccsds.moims.mo.mps.planinformationmanagement.PlanInformationManagementServiceInfo.LISTACTIVITYDEFS_OP, adapter, domain, activityDefs, defaultTags); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueListActivityDefs(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mps.planinformationmanagement.consumer.PlanInformationManagementAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mps.planinformationmanagement.PlanInformationManagementServiceInfo.LISTACTIVITYDEFS_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The getActivityDefs operation is used to retrieve one or more available + * ActivityDefinitions, whose identity is known to the consumer. + * + * @param activityDefs The activityDefs field. + * @return The return value of the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mps.structures.ActivityDefinitionList getActivityDefs(org.ccsds.moims.mo.mal.structures.ObjectRefList activityDefs) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + org.ccsds.moims.mo.mal.transport.MALMessageBody body = consumer.request(org.ccsds.moims.mo.mps.planinformationmanagement.PlanInformationManagementServiceInfo.GETACTIVITYDEFS_OP, activityDefs); + Object body0 = (Object) body.getBodyElement(0, new org.ccsds.moims.mo.mps.structures.ActivityDefinitionList()); + return (org.ccsds.moims.mo.mps.structures.ActivityDefinitionList) body0; + } + + /** + * Asynchronous version of method getActivityDefs. + * + * @param activityDefs The activityDefs field. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncGetActivityDefs(org.ccsds.moims.mo.mal.structures.ObjectRefList activityDefs, + org.ccsds.moims.mo.mps.planinformationmanagement.consumer.PlanInformationManagementAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncRequest(org.ccsds.moims.mo.mps.planinformationmanagement.PlanInformationManagementServiceInfo.GETACTIVITYDEFS_OP, adapter, activityDefs); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueGetActivityDefs(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mps.planinformationmanagement.consumer.PlanInformationManagementAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mps.planinformationmanagement.PlanInformationManagementServiceInfo.GETACTIVITYDEFS_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The listResourceDefs operation is used to obtain a list of available Resources + * together with their descriptions. The list can be filtered by domain or + * restricted to data types. All available versions are listed. The domain + * field is an ordered list of identifiers representing a domain hierarchy, + * any node of which can use ‘*’ as a wildcard (meaning any domain identifier + * at that level of the hierarchy). If a set of domains is required that + * cannot be represented through the use of wildcards, then the operation + * will need to be repeated using different domain filters. + * + * @param domain The domain field. + * @param dataType The dataType field. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void listResourceDefs(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.AttributeTypeList dataType, + org.ccsds.moims.mo.mps.planinformationmanagement.consumer.PlanInformationManagementAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.progress(org.ccsds.moims.mo.mps.planinformationmanagement.PlanInformationManagementServiceInfo.LISTRESOURCEDEFS_OP, adapter, domain, dataType); + } + + /** + * Asynchronous version of method listResourceDefs. + * + * @param domain The domain field. + * @param dataType The dataType field. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncListResourceDefs(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.AttributeTypeList dataType, + org.ccsds.moims.mo.mps.planinformationmanagement.consumer.PlanInformationManagementAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncProgress(org.ccsds.moims.mo.mps.planinformationmanagement.PlanInformationManagementServiceInfo.LISTRESOURCEDEFS_OP, adapter, domain, dataType); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueListResourceDefs(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mps.planinformationmanagement.consumer.PlanInformationManagementAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mps.planinformationmanagement.PlanInformationManagementServiceInfo.LISTRESOURCEDEFS_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The getResourceDefs operation is used to retrieve the definition of one + * or more available Resources, whose identity is known to the consumer. It + * should be noted that this operation is designed to retrieve the resource + * definition and not the current value of the resource (the value field may + * contain a default value for the resource). + * + * @param resources The resources field. + * @return The return value of the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mps.structures.ResourceList getResourceDefs(org.ccsds.moims.mo.mal.structures.ObjectRefList resources) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + org.ccsds.moims.mo.mal.transport.MALMessageBody body = consumer.request(org.ccsds.moims.mo.mps.planinformationmanagement.PlanInformationManagementServiceInfo.GETRESOURCEDEFS_OP, resources); + Object body0 = (Object) body.getBodyElement(0, new org.ccsds.moims.mo.mps.structures.ResourceList()); + return (org.ccsds.moims.mo.mps.structures.ResourceList) body0; + } + + /** + * Asynchronous version of method getResourceDefs. + * + * @param resources The resources field. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncGetResourceDefs(org.ccsds.moims.mo.mal.structures.ObjectRefList resources, + org.ccsds.moims.mo.mps.planinformationmanagement.consumer.PlanInformationManagementAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncRequest(org.ccsds.moims.mo.mps.planinformationmanagement.PlanInformationManagementServiceInfo.GETRESOURCEDEFS_OP, adapter, resources); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueGetResourceDefs(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mps.planinformationmanagement.consumer.PlanInformationManagementAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mps.planinformationmanagement.PlanInformationManagementServiceInfo.GETRESOURCEDEFS_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planinformationmanagement/consumer/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planinformationmanagement/consumer/package-info.java new file mode 100644 index 00000000..c2cefb8f --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planinformationmanagement/consumer/package-info.java @@ -0,0 +1,5 @@ +/** + * Package containing the consumer stubs for the PlanInformationManagement + * service. +*/ +package org.ccsds.moims.mo.mps.planinformationmanagement.consumer; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planinformationmanagement/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planinformationmanagement/package-info.java new file mode 100644 index 00000000..f0bb6572 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planinformationmanagement/package-info.java @@ -0,0 +1,10 @@ +/** + * The Plan Information Management Service, introduced in 2.5.5, is provided + * by a planning function and enables its consumers to list and retrieve available + * MPS configuration data. This includes definitions for planning requests, + * planning activities, planning events and planning resources, and also MPS + * system configuration data. The service may also be provided by a plan + * execution function (excluding planning request definitions). It comprises + * the operations defined below, none of which are mandatory. +*/ +package org.ccsds.moims.mo.mps.planinformationmanagement; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planinformationmanagement/provider/ListActivityDefsInteraction.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planinformationmanagement/provider/ListActivityDefsInteraction.java new file mode 100644 index 00000000..0b4a48a5 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planinformationmanagement/provider/ListActivityDefsInteraction.java @@ -0,0 +1,92 @@ +package org.ccsds.moims.mo.mps.planinformationmanagement.provider; + +/** + * Provider PROGRESS interaction class for PlanInformationManagement::listActivityDefs + * operation. + */ +public class ListActivityDefsInteraction { + + /** + * The interaction field. + */ + private org.ccsds.moims.mo.mal.provider.MALProgress interaction; + + /** + * Wraps the provided MAL interaction object with methods for sending responses + * to an PROGRESS interaction from a provider. + * + * @param interaction The MAL interaction action object to use. + */ + public ListActivityDefsInteraction(org.ccsds.moims.mo.mal.provider.MALProgress interaction) { + this.interaction = interaction; + } + + /** + * Returns the MAL interaction object used for returning messages from the + * provider. + * + * @return The MAL interaction object provided in the constructor + */ + public org.ccsds.moims.mo.mal.provider.MALProgress getInteraction() { + return interaction; + } + + /** + * Sends a PROGRESS acknowledge to the consumer. + * + * @return Returns the MAL message created by the acknowledge + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage sendAcknowledgement() throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return interaction.sendAcknowledgement((Object[]) null); + } + + /** + * Sends a PROGRESS update to the consumer. + * + * @param activitytDefs The activitytDefs field. + * @return Returns the MAL message created by the update + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage sendUpdate(org.ccsds.moims.mo.mps.structures.DefListEntryList activitytDefs) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return interaction.sendUpdate(activitytDefs); + } + + /** + * Sends a PROGRESS response to the consumer. + * + * @return Returns the MAL message created by the response + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage sendResponse() throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return interaction.sendResponse((Object[]) null); + } + + /** + * Sends an error to the consumer. + * + * @param error error The MAL error to send to the consumer. + * @return Returns the MAL message created by the error + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage sendError(org.ccsds.moims.mo.mal.MOErrorException error) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return interaction.sendError(error); + } + + /** + * Sends an update error to the consumer. + * + * @param error error The MAL error to send to the consumer. + * @return Returns the MAL message created by the error + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage sendUpdateError(org.ccsds.moims.mo.mal.MOErrorException error) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return interaction.sendUpdateError(error); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planinformationmanagement/provider/ListEventDefsInteraction.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planinformationmanagement/provider/ListEventDefsInteraction.java new file mode 100644 index 00000000..af384c97 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planinformationmanagement/provider/ListEventDefsInteraction.java @@ -0,0 +1,92 @@ +package org.ccsds.moims.mo.mps.planinformationmanagement.provider; + +/** + * Provider PROGRESS interaction class for PlanInformationManagement::listEventDefs + * operation. + */ +public class ListEventDefsInteraction { + + /** + * The interaction field. + */ + private org.ccsds.moims.mo.mal.provider.MALProgress interaction; + + /** + * Wraps the provided MAL interaction object with methods for sending responses + * to an PROGRESS interaction from a provider. + * + * @param interaction The MAL interaction action object to use. + */ + public ListEventDefsInteraction(org.ccsds.moims.mo.mal.provider.MALProgress interaction) { + this.interaction = interaction; + } + + /** + * Returns the MAL interaction object used for returning messages from the + * provider. + * + * @return The MAL interaction object provided in the constructor + */ + public org.ccsds.moims.mo.mal.provider.MALProgress getInteraction() { + return interaction; + } + + /** + * Sends a PROGRESS acknowledge to the consumer. + * + * @return Returns the MAL message created by the acknowledge + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage sendAcknowledgement() throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return interaction.sendAcknowledgement((Object[]) null); + } + + /** + * Sends a PROGRESS update to the consumer. + * + * @param eventDefs The eventDefs field. + * @return Returns the MAL message created by the update + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage sendUpdate(org.ccsds.moims.mo.mps.structures.DefListEntryList eventDefs) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return interaction.sendUpdate(eventDefs); + } + + /** + * Sends a PROGRESS response to the consumer. + * + * @return Returns the MAL message created by the response + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage sendResponse() throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return interaction.sendResponse((Object[]) null); + } + + /** + * Sends an error to the consumer. + * + * @param error error The MAL error to send to the consumer. + * @return Returns the MAL message created by the error + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage sendError(org.ccsds.moims.mo.mal.MOErrorException error) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return interaction.sendError(error); + } + + /** + * Sends an update error to the consumer. + * + * @param error error The MAL error to send to the consumer. + * @return Returns the MAL message created by the error + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage sendUpdateError(org.ccsds.moims.mo.mal.MOErrorException error) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return interaction.sendUpdateError(error); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planinformationmanagement/provider/ListRequestDefsInteraction.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planinformationmanagement/provider/ListRequestDefsInteraction.java new file mode 100644 index 00000000..6365682f --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planinformationmanagement/provider/ListRequestDefsInteraction.java @@ -0,0 +1,92 @@ +package org.ccsds.moims.mo.mps.planinformationmanagement.provider; + +/** + * Provider PROGRESS interaction class for PlanInformationManagement::listRequestDefs + * operation. + */ +public class ListRequestDefsInteraction { + + /** + * The interaction field. + */ + private org.ccsds.moims.mo.mal.provider.MALProgress interaction; + + /** + * Wraps the provided MAL interaction object with methods for sending responses + * to an PROGRESS interaction from a provider. + * + * @param interaction The MAL interaction action object to use. + */ + public ListRequestDefsInteraction(org.ccsds.moims.mo.mal.provider.MALProgress interaction) { + this.interaction = interaction; + } + + /** + * Returns the MAL interaction object used for returning messages from the + * provider. + * + * @return The MAL interaction object provided in the constructor + */ + public org.ccsds.moims.mo.mal.provider.MALProgress getInteraction() { + return interaction; + } + + /** + * Sends a PROGRESS acknowledge to the consumer. + * + * @return Returns the MAL message created by the acknowledge + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage sendAcknowledgement() throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return interaction.sendAcknowledgement((Object[]) null); + } + + /** + * Sends a PROGRESS update to the consumer. + * + * @param requestDefs The requestDefs field. + * @return Returns the MAL message created by the update + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage sendUpdate(org.ccsds.moims.mo.mps.structures.DefListEntryList requestDefs) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return interaction.sendUpdate(requestDefs); + } + + /** + * Sends a PROGRESS response to the consumer. + * + * @return Returns the MAL message created by the response + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage sendResponse() throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return interaction.sendResponse((Object[]) null); + } + + /** + * Sends an error to the consumer. + * + * @param error error The MAL error to send to the consumer. + * @return Returns the MAL message created by the error + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage sendError(org.ccsds.moims.mo.mal.MOErrorException error) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return interaction.sendError(error); + } + + /** + * Sends an update error to the consumer. + * + * @param error error The MAL error to send to the consumer. + * @return Returns the MAL message created by the error + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage sendUpdateError(org.ccsds.moims.mo.mal.MOErrorException error) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return interaction.sendUpdateError(error); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planinformationmanagement/provider/ListResourceDefsInteraction.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planinformationmanagement/provider/ListResourceDefsInteraction.java new file mode 100644 index 00000000..d4f52d7d --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planinformationmanagement/provider/ListResourceDefsInteraction.java @@ -0,0 +1,92 @@ +package org.ccsds.moims.mo.mps.planinformationmanagement.provider; + +/** + * Provider PROGRESS interaction class for PlanInformationManagement::listResourceDefs + * operation. + */ +public class ListResourceDefsInteraction { + + /** + * The interaction field. + */ + private org.ccsds.moims.mo.mal.provider.MALProgress interaction; + + /** + * Wraps the provided MAL interaction object with methods for sending responses + * to an PROGRESS interaction from a provider. + * + * @param interaction The MAL interaction action object to use. + */ + public ListResourceDefsInteraction(org.ccsds.moims.mo.mal.provider.MALProgress interaction) { + this.interaction = interaction; + } + + /** + * Returns the MAL interaction object used for returning messages from the + * provider. + * + * @return The MAL interaction object provided in the constructor + */ + public org.ccsds.moims.mo.mal.provider.MALProgress getInteraction() { + return interaction; + } + + /** + * Sends a PROGRESS acknowledge to the consumer. + * + * @return Returns the MAL message created by the acknowledge + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage sendAcknowledgement() throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return interaction.sendAcknowledgement((Object[]) null); + } + + /** + * Sends a PROGRESS update to the consumer. + * + * @param resourceDefs The resourceDefs field. + * @return Returns the MAL message created by the update + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage sendUpdate(org.ccsds.moims.mo.mps.structures.DefListEntryList resourceDefs) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return interaction.sendUpdate(resourceDefs); + } + + /** + * Sends a PROGRESS response to the consumer. + * + * @return Returns the MAL message created by the response + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage sendResponse() throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return interaction.sendResponse((Object[]) null); + } + + /** + * Sends an error to the consumer. + * + * @param error error The MAL error to send to the consumer. + * @return Returns the MAL message created by the error + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage sendError(org.ccsds.moims.mo.mal.MOErrorException error) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return interaction.sendError(error); + } + + /** + * Sends an update error to the consumer. + * + * @param error error The MAL error to send to the consumer. + * @return Returns the MAL message created by the error + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage sendUpdateError(org.ccsds.moims.mo.mal.MOErrorException error) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return interaction.sendUpdateError(error); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planinformationmanagement/provider/PlanInformationManagementHandler.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planinformationmanagement/provider/PlanInformationManagementHandler.java new file mode 100644 index 00000000..4f918f00 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planinformationmanagement/provider/PlanInformationManagementHandler.java @@ -0,0 +1,117 @@ +package org.ccsds.moims.mo.mps.planinformationmanagement.provider; + +/** + * Interface that providers of the PlanInformationManagement service must + * implement to handle the operations of that service. + */ +public interface PlanInformationManagementHandler { + + /** + * Implements the operation listRequestDefs. + * + * @param domain The domain field. + * @param requestDefs The requestDefs field. + * @param interaction The MAL object representing the interaction in the provider. + * @throws org.ccsds.moims.mo.mps.InvalidException One or more fields in the message contain invalid values. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + void listRequestDefs(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.ObjectRefList requestDefs, + org.ccsds.moims.mo.mps.planinformationmanagement.provider.ListRequestDefsInteraction interaction) throws org.ccsds.moims.mo.mps.InvalidException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation getRequestDefs. + * + * @param requestDefs The requestDefs field. + * @param interaction The MAL object representing the interaction in the provider. + * @return The return value of the operation + * @throws org.ccsds.moims.mo.mps.InvalidException One or more fields in the message contain invalid values. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + org.ccsds.moims.mo.mps.structures.RequestDefinitionList getRequestDefs(org.ccsds.moims.mo.mal.structures.ObjectRefList requestDefs, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mps.InvalidException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation listEventDefs. + * + * @param domain The domain field. + * @param eventDefs The eventDefs field. + * @param interaction The MAL object representing the interaction in the provider. + * @throws org.ccsds.moims.mo.mps.InvalidException One or more fields in the message contain invalid values. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + void listEventDefs(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.ObjectRefList eventDefs, + org.ccsds.moims.mo.mps.planinformationmanagement.provider.ListEventDefsInteraction interaction) throws org.ccsds.moims.mo.mps.InvalidException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation getEventDefs. + * + * @param eventDefs The eventDefs field. + * @param interaction The MAL object representing the interaction in the provider. + * @return The return value of the operation + * @throws org.ccsds.moims.mo.mps.InvalidException One or more fields in the message contain invalid values. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + org.ccsds.moims.mo.mps.structures.EventDefinitionList getEventDefs(org.ccsds.moims.mo.mal.structures.ObjectRefList eventDefs, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mps.InvalidException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation listActivityDefs. + * + * @param domain The domain field. + * @param activityDefs The activityDefs field. + * @param defaultTags The defaultTags field. + * @param interaction The MAL object representing the interaction in the provider. + * @throws org.ccsds.moims.mo.mps.InvalidException One or more fields in the message contain invalid values. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + void listActivityDefs(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.ObjectRefList activityDefs, + org.ccsds.moims.mo.mal.structures.StringList defaultTags, + org.ccsds.moims.mo.mps.planinformationmanagement.provider.ListActivityDefsInteraction interaction) throws org.ccsds.moims.mo.mps.InvalidException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation getActivityDefs. + * + * @param activityDefs The activityDefs field. + * @param interaction The MAL object representing the interaction in the provider. + * @return The return value of the operation + * @throws org.ccsds.moims.mo.mps.InvalidException One or more fields in the message contain invalid values. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + org.ccsds.moims.mo.mps.structures.ActivityDefinitionList getActivityDefs(org.ccsds.moims.mo.mal.structures.ObjectRefList activityDefs, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mps.InvalidException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation listResourceDefs. + * + * @param domain The domain field. + * @param dataType The dataType field. + * @param interaction The MAL object representing the interaction in the provider. + * @throws org.ccsds.moims.mo.mps.InvalidException One or more fields in the message contain invalid values. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + void listResourceDefs(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.AttributeTypeList dataType, + org.ccsds.moims.mo.mps.planinformationmanagement.provider.ListResourceDefsInteraction interaction) throws org.ccsds.moims.mo.mps.InvalidException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation getResourceDefs. + * + * @param resources The resources field. + * @param interaction The MAL object representing the interaction in the provider. + * @return The return value of the operation + * @throws org.ccsds.moims.mo.mps.InvalidException One or more fields in the message contain invalid values. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + org.ccsds.moims.mo.mps.structures.ResourceList getResourceDefs(org.ccsds.moims.mo.mal.structures.ObjectRefList resources, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mps.InvalidException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Sets the skeleton to be used for creation of publishers. + * + * @param skeleton The skeleton to be used. + */ + void setSkeleton(org.ccsds.moims.mo.mps.planinformationmanagement.provider.PlanInformationManagementSkeleton skeleton); +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planinformationmanagement/provider/PlanInformationManagementInheritanceSkeleton.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planinformationmanagement/provider/PlanInformationManagementInheritanceSkeleton.java new file mode 100644 index 00000000..7a1bd672 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planinformationmanagement/provider/PlanInformationManagementInheritanceSkeleton.java @@ -0,0 +1,147 @@ +package org.ccsds.moims.mo.mps.planinformationmanagement.provider; + +/** + * Provider Inheritance skeleton for PlanInformationManagementInheritanceSkeleton + * service. + */ +public abstract class PlanInformationManagementInheritanceSkeleton implements org.ccsds.moims.mo.mal.provider.MALInteractionHandler, org.ccsds.moims.mo.mps.planinformationmanagement.provider.PlanInformationManagementSkeleton, org.ccsds.moims.mo.mps.planinformationmanagement.provider.PlanInformationManagementHandler { + + /** + * The providerSet field. + */ + private org.ccsds.moims.mo.mal.provider.MALProviderSet providerSet = new org.ccsds.moims.mo.mal.provider.MALProviderSet(org.ccsds.moims.mo.mps.planinformationmanagement.PlanInformationManagementHelper.PLANINFORMATIONMANAGEMENT_SERVICE); + + /** + * Returns the connection object for this provider. + * + * @return the connection object for this provider + * @throws java.io.IOException if the method was not implemented yet. + */ + public org.ccsds.moims.mo.mal.helpertools.connections.ConnectionProvider getConnection() throws java.io.IOException { + throw new java.io.IOException("This method needs to be overridden!"); + } + + @Override + public void setSkeleton(org.ccsds.moims.mo.mps.planinformationmanagement.provider.PlanInformationManagementSkeleton skeleton) { + // Not used in the inheritance pattern (the skeleton is 'this'); + } + + @Override + public void malInitialize(org.ccsds.moims.mo.mal.provider.MALProvider provider) throws org.ccsds.moims.mo.mal.MALException { + providerSet.addProvider(provider); + } + + @Override + public void malFinalize(org.ccsds.moims.mo.mal.provider.MALProvider provider) throws org.ccsds.moims.mo.mal.MALException { + providerSet.removeProvider(provider); + } + + @Override + public void handleSend(org.ccsds.moims.mo.mal.provider.MALInteraction interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + switch (opNumber) { + default: + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } + + @Override + public void handleSubmit(org.ccsds.moims.mo.mal.provider.MALSubmit interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + switch (opNumber) { + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } + + @Override + public void handleRequest(org.ccsds.moims.mo.mal.provider.MALRequest interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + try { + switch (opNumber) { + case org.ccsds.moims.mo.mps.planinformationmanagement.PlanInformationManagementServiceInfo._GETREQUESTDEFS_OP_NUMBER: + interaction.sendResponse(getRequestDefs((org.ccsds.moims.mo.mal.structures.ObjectRefList) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.ObjectRefList()), + interaction)); + break; + case org.ccsds.moims.mo.mps.planinformationmanagement.PlanInformationManagementServiceInfo._GETEVENTDEFS_OP_NUMBER: + interaction.sendResponse(getEventDefs((org.ccsds.moims.mo.mal.structures.ObjectRefList) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.ObjectRefList()), + interaction)); + break; + case org.ccsds.moims.mo.mps.planinformationmanagement.PlanInformationManagementServiceInfo._GETACTIVITYDEFS_OP_NUMBER: + interaction.sendResponse(getActivityDefs((org.ccsds.moims.mo.mal.structures.ObjectRefList) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.ObjectRefList()), + interaction)); + break; + case org.ccsds.moims.mo.mps.planinformationmanagement.PlanInformationManagementServiceInfo._GETRESOURCEDEFS_OP_NUMBER: + interaction.sendResponse(getResourceDefs((org.ccsds.moims.mo.mal.structures.ObjectRefList) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.ObjectRefList()), + interaction)); + break; + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } catch (org.ccsds.moims.mo.mal.MOErrorException error) { + throw new org.ccsds.moims.mo.mal.MALInteractionException(error); + } + } + + @Override + public void handleInvoke(org.ccsds.moims.mo.mal.provider.MALInvoke interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + switch (opNumber) { + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } + + @Override + public void handleProgress(org.ccsds.moims.mo.mal.provider.MALProgress interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + try { + switch (opNumber) { + case org.ccsds.moims.mo.mps.planinformationmanagement.PlanInformationManagementServiceInfo._LISTREQUESTDEFS_OP_NUMBER: + listRequestDefs((org.ccsds.moims.mo.mal.structures.IdentifierList) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.IdentifierList()), + (org.ccsds.moims.mo.mal.structures.ObjectRefList) body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.ObjectRefList()), + new ListRequestDefsInteraction(interaction)); + break; + case org.ccsds.moims.mo.mps.planinformationmanagement.PlanInformationManagementServiceInfo._LISTEVENTDEFS_OP_NUMBER: + listEventDefs((org.ccsds.moims.mo.mal.structures.IdentifierList) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.IdentifierList()), + (org.ccsds.moims.mo.mal.structures.ObjectRefList) body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.ObjectRefList()), + new ListEventDefsInteraction(interaction)); + break; + case org.ccsds.moims.mo.mps.planinformationmanagement.PlanInformationManagementServiceInfo._LISTACTIVITYDEFS_OP_NUMBER: + listActivityDefs((org.ccsds.moims.mo.mal.structures.IdentifierList) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.IdentifierList()), + (org.ccsds.moims.mo.mal.structures.ObjectRefList) body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.ObjectRefList()), + (org.ccsds.moims.mo.mal.structures.StringList) body.getBodyElement(2, new org.ccsds.moims.mo.mal.structures.StringList()), + new ListActivityDefsInteraction(interaction)); + break; + case org.ccsds.moims.mo.mps.planinformationmanagement.PlanInformationManagementServiceInfo._LISTRESOURCEDEFS_OP_NUMBER: + listResourceDefs((org.ccsds.moims.mo.mal.structures.IdentifierList) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.IdentifierList()), + (org.ccsds.moims.mo.mal.structures.AttributeTypeList) body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.AttributeTypeList()), + new ListResourceDefsInteraction(interaction)); + break; + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } catch (org.ccsds.moims.mo.mal.MOErrorException error) { + throw new org.ccsds.moims.mo.mal.MALInteractionException(error); + } + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planinformationmanagement/provider/PlanInformationManagementSkeleton.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planinformationmanagement/provider/PlanInformationManagementSkeleton.java new file mode 100644 index 00000000..d7d74415 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planinformationmanagement/provider/PlanInformationManagementSkeleton.java @@ -0,0 +1,8 @@ +package org.ccsds.moims.mo.mps.planinformationmanagement.provider; + +/** + * The skeleton interface for the PlanInformationManagement service. + */ +public interface PlanInformationManagementSkeleton { + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planinformationmanagement/provider/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planinformationmanagement/provider/package-info.java new file mode 100644 index 00000000..cefd182e --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planinformationmanagement/provider/package-info.java @@ -0,0 +1,5 @@ +/** + * Package containing the provider skeletons for the PlanInformationManagement + * service. +*/ +package org.ccsds.moims.mo.mps.planinformationmanagement.provider; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planningrequest/PlanningRequestHelper.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planningrequest/PlanningRequestHelper.java new file mode 100644 index 00000000..dd0aca53 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planningrequest/PlanningRequestHelper.java @@ -0,0 +1,17 @@ +package org.ccsds.moims.mo.mps.planningrequest; + +/** + * Helper class for PlanningRequest service. + */ +public class PlanningRequestHelper { + + /** + * Service singleton instance. + */ + public static final org.ccsds.moims.mo.mps.planningrequest.PlanningRequestServiceInfo PLANNINGREQUEST_SERVICE = new org.ccsds.moims.mo.mps.planningrequest.PlanningRequestServiceInfo(); + + private PlanningRequestHelper() { + // Utility class; not meant to be instantiated. + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planningrequest/PlanningRequestServiceInfo.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planningrequest/PlanningRequestServiceInfo.java new file mode 100644 index 00000000..94bd8fc7 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planningrequest/PlanningRequestServiceInfo.java @@ -0,0 +1,269 @@ +package org.ccsds.moims.mo.mps.planningrequest; + +/** + * Helper class for PlanningRequest service. + */ +public class PlanningRequestServiceInfo extends org.ccsds.moims.mo.mal.ServiceInfo { + + /** + * Service number literal. + */ + public static final int _PLANNINGREQUEST_SERVICE_NUMBER = 1; + + /** + * Service number instance. + */ + public static final org.ccsds.moims.mo.mal.structures.UShort PLANNINGREQUEST_SERVICE_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_PLANNINGREQUEST_SERVICE_NUMBER); + + /** + * Service name constant. + */ + public static final org.ccsds.moims.mo.mal.structures.Identifier PLANNINGREQUEST_SERVICE_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("PlanningRequest"); + + /** + * The service key of this service. + */ + private static final org.ccsds.moims.mo.mal.ServiceKey SERVICE_KEY = new org.ccsds.moims.mo.mal.ServiceKey( + 5, 1, PLANNINGREQUEST_SERVICE_NUMBER); + + /** + * Operation number literal for operation SUBMITREQUEST. + */ + public static final int _SUBMITREQUEST_OP_NUMBER = 1; + + /** + * Operation number instance for operation SUBMITREQUEST. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort SUBMITREQUEST_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_SUBMITREQUEST_OP_NUMBER); + + /** + * Operation instance for operation SUBMITREQUEST. + */ + public static final org.ccsds.moims.mo.mal.MALRequestOperation SUBMITREQUEST_OP = new org.ccsds.moims.mo.mal.MALRequestOperation(SERVICE_KEY, + SUBMITREQUEST_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("submitRequest"), + new org.ccsds.moims.mo.mal.structures.UShort(1), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("requestDetails", false, org.ccsds.moims.mo.mps.structures.PlanningRequestDetails.SHORT_FORM, "")}, + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("requestResponse", false, org.ccsds.moims.mo.mps.structures.PlanningRequestResponse.SHORT_FORM, "")}, + "The submitRequest operation sends a planning request to the provider, which then creates a corresponding RequestInstance object and returns its identity to the consumer."); + + /** + * Operation number literal for operation GETREQUESTSUMMARIES. + */ + public static final int _GETREQUESTSUMMARIES_OP_NUMBER = 2; + + /** + * Operation number instance for operation GETREQUESTSUMMARIES. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort GETREQUESTSUMMARIES_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_GETREQUESTSUMMARIES_OP_NUMBER); + + /** + * Operation instance for operation GETREQUESTSUMMARIES. + */ + public static final org.ccsds.moims.mo.mal.MALRequestOperation GETREQUESTSUMMARIES_OP = new org.ccsds.moims.mo.mal.MALRequestOperation(SERVICE_KEY, + GETREQUESTSUMMARIES_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("getRequestSummaries"), + new org.ccsds.moims.mo.mal.structures.UShort(1), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("requestFilter", false, org.ccsds.moims.mo.mps.structures.RequestFilter.SHORT_FORM, "")}, + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("requestSummaries", false, org.ccsds.moims.mo.mps.structures.RequestSummaryStatusList.SHORT_FORM, "")}, + "The getRequestSummaries operation allows consumers to obtain a filtered list of currently available RequestInstances. The request uses the RequestFilter structure to select the set of planning requests of interest, using the following keys: Domain of the RequestInstance; Reference to the RequestInstance; Creation date and time of the RequestInstance (as a time range); Reference to the RequestDefinition from which the RequestInstance was created; User ID of the PlanningUser who initiated the RequestInstance; User Reference supplied by the User when submitting the RequestInstance; Current status of the RequestInstance; Reference to the output Plan(s) generated in response to the RequestInstance. The response returns a list of RequestSummaryStatus structures containing references to the identities, descriptive header fields, and status of the RequestInstances that match the filter."); + + /** + * Operation number literal for operation GETREQUESTSTATUS. + */ + public static final int _GETREQUESTSTATUS_OP_NUMBER = 3; + + /** + * Operation number instance for operation GETREQUESTSTATUS. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort GETREQUESTSTATUS_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_GETREQUESTSTATUS_OP_NUMBER); + + /** + * Operation instance for operation GETREQUESTSTATUS. + */ + public static final org.ccsds.moims.mo.mal.MALProgressOperation GETREQUESTSTATUS_OP = new org.ccsds.moims.mo.mal.MALProgressOperation(SERVICE_KEY, + GETREQUESTSTATUS_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("getRequestStatus"), + new org.ccsds.moims.mo.mal.structures.UShort(1), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("requestRefs", false, org.ccsds.moims.mo.mal.structures.ObjectRefList.SHORT_FORM, "")}, + new org.ccsds.moims.mo.mal.OperationField[] {}, + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("requestStatuses", false, org.ccsds.moims.mo.mps.structures.RequestStatusUpdateList.SHORT_FORM, "")}, + new org.ccsds.moims.mo.mal.OperationField[] {}, + "The getRequestStatus operation is used to obtain the current status of one or more known RequestInstances. The operation uses the Progress interaction pattern, to allow the response to be spread across multiple messages."); + + /** + * Operation number literal for operation CANCELREQUEST. + */ + public static final int _CANCELREQUEST_OP_NUMBER = 4; + + /** + * Operation number instance for operation CANCELREQUEST. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort CANCELREQUEST_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_CANCELREQUEST_OP_NUMBER); + + /** + * Operation instance for operation CANCELREQUEST. + */ + public static final org.ccsds.moims.mo.mal.MALSubmitOperation CANCELREQUEST_OP = new org.ccsds.moims.mo.mal.MALSubmitOperation(SERVICE_KEY, + CANCELREQUEST_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("cancelRequest"), + new org.ccsds.moims.mo.mal.structures.UShort(2), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("requestRef", false, org.ccsds.moims.mo.mal.structures.ObjectRef.OBJECTREF_SHORT_FORM, "")}, + "The cancelRequest operation is used by a consumer to cancel a previously submitted planning request. The service provider acknowledges the cancellation of the RequestInstance or returns an error."); + + /** + * Operation number literal for operation UPDATEREQUEST. + */ + public static final int _UPDATEREQUEST_OP_NUMBER = 5; + + /** + * Operation number instance for operation UPDATEREQUEST. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort UPDATEREQUEST_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_UPDATEREQUEST_OP_NUMBER); + + /** + * Operation instance for operation UPDATEREQUEST. + */ + public static final org.ccsds.moims.mo.mal.MALRequestOperation UPDATEREQUEST_OP = new org.ccsds.moims.mo.mal.MALRequestOperation(SERVICE_KEY, + UPDATEREQUEST_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("updateRequest"), + new org.ccsds.moims.mo.mal.structures.UShort(3), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("requestRef", false, org.ccsds.moims.mo.mal.structures.ObjectRef.OBJECTREF_SHORT_FORM, ""), + new org.ccsds.moims.mo.mal.OperationField("requestDetails", false, org.ccsds.moims.mo.mps.structures.PlanningRequestDetails.SHORT_FORM, "")}, + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("requestResponse", false, org.ccsds.moims.mo.mps.structures.PlanningRequestResponse.SHORT_FORM, "")}, + "The updateRequest operation may be used to modify the PlanningRequestDetails associated with a previously submitted planning request. This results in the creation of a new version of the RequestInstance (with the same key) by the service provider, which returns a reference to the new version to the consumer."); + + /** + * Operation number literal for operation MONITORREQUESTSTATUS. + */ + public static final int _MONITORREQUESTSTATUS_OP_NUMBER = 6; + + /** + * Operation number instance for operation MONITORREQUESTSTATUS. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort MONITORREQUESTSTATUS_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_MONITORREQUESTSTATUS_OP_NUMBER); + + /** + * Operation instance for operation MONITORREQUESTSTATUS. + */ + public static final org.ccsds.moims.mo.mal.MALPubSubOperation MONITORREQUESTSTATUS_OP = new org.ccsds.moims.mo.mal.MALPubSubOperation(SERVICE_KEY, + MONITORREQUESTSTATUS_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("monitorRequestStatus"), + new org.ccsds.moims.mo.mal.structures.UShort(4), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("requestStatusUpdate", false, org.ccsds.moims.mo.mps.structures.RequestStatusUpdate.SHORT_FORM, "")}, + "The monitorRequestStatus operation is used to subscribe to status updates for a filtered set of planning RequestInstances. The operation uses the Publish-Subscribe interaction pattern, with the body of the notification message comprising a RequestStatusUpdate for a subscribed RequestInstance."); + + /** + * Key names instance for MONITORREQUESTSTATUS operation of pubsub interaction + * pattern. + */ + private static final org.ccsds.moims.mo.mal.structures.Identifier [] _MONITORREQUESTSTATUS_OP_KEY_NAMES = {new org.ccsds.moims.mo.mal.structures.Identifier("instanceID"), + new org.ccsds.moims.mo.mal.structures.Identifier("definitionID"), + new org.ccsds.moims.mo.mal.structures.Identifier("userID"), + new org.ccsds.moims.mo.mal.structures.Identifier("userReference"), + new org.ccsds.moims.mo.mal.structures.Identifier("status"), + new org.ccsds.moims.mo.mal.structures.Identifier("outputPlanID")}; + + /** + * Key names instance for MONITORREQUESTSTATUS operation of pubsub interaction + * pattern. + */ + private static final org.ccsds.moims.mo.mal.structures.IdentifierList MONITORREQUESTSTATUS_OP_KEY_NAMES = new org.ccsds.moims.mo.mal.structures.IdentifierList(new java.util.ArrayList<>(java.util.Arrays.asList(_MONITORREQUESTSTATUS_OP_KEY_NAMES))); + + /** + * Operation number literal for operation GETREQUEST. + */ + public static final int _GETREQUEST_OP_NUMBER = 7; + + /** + * Operation number instance for operation GETREQUEST. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort GETREQUEST_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_GETREQUEST_OP_NUMBER); + + /** + * Operation instance for operation GETREQUEST. + */ + public static final org.ccsds.moims.mo.mal.MALProgressOperation GETREQUEST_OP = new org.ccsds.moims.mo.mal.MALProgressOperation(SERVICE_KEY, + GETREQUEST_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("getRequest"), + new org.ccsds.moims.mo.mal.structures.UShort(5), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("requestRefs", false, org.ccsds.moims.mo.mal.structures.ObjectRefList.SHORT_FORM, "")}, + new org.ccsds.moims.mo.mal.OperationField[] {}, + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("requestInstances", false, org.ccsds.moims.mo.mps.structures.RequestInstanceList.SHORT_FORM, "")}, + new org.ccsds.moims.mo.mal.OperationField[] {}, + "The getRequest operation is used to obtain the full content of one or more known RequestInstances. The operation uses the Progress interaction pattern, to allow the response to be spread across multiple messages."); + + /** + * Area elements. + */ + public static final org.ccsds.moims.mo.mal.structures.Element[] PLANNINGREQUEST_SERVICE_ELEMENTS = {}; + + /** + * The set of operations for this service. + */ + public static final org.ccsds.moims.mo.mal.MALOperation[] OPERATIONS = new org.ccsds.moims.mo.mal.MALOperation[]{SUBMITREQUEST_OP, + GETREQUESTSUMMARIES_OP, + GETREQUESTSTATUS_OP, + CANCELREQUEST_OP, + UPDATEREQUEST_OP, + MONITORREQUESTSTATUS_OP, + GETREQUEST_OP}; + + /** + * Creates an instance of the PlanningRequest ServiceInfo. + * + */ + public PlanningRequestServiceInfo() { + super(SERVICE_KEY, PLANNINGREQUEST_SERVICE_NAME, PLANNINGREQUEST_SERVICE_ELEMENTS, OPERATIONS); + } + + @Override + public org.ccsds.moims.mo.mal.MALArea getArea() { + return org.ccsds.moims.mo.mps.MPSHelper.MPS_AREA; + } + + @Override + public org.ccsds.moims.mo.mal.MOErrorException generateMOError(int errorNumber, + Object extraInfo) { + switch (errorNumber) { + case 1: + return new org.ccsds.moims.mo.mps.InvalidException(extraInfo); + case 2: + return new org.ccsds.moims.mo.mps.CancelFailedException(extraInfo); + case 3: + return new org.ccsds.moims.mo.mps.UpdateFailedException(extraInfo); + case 4: + return new org.ccsds.moims.mo.mps.RevokeFailedException(extraInfo); + case 5: + return new org.ccsds.moims.mo.mps.InsertFailedException(extraInfo); + case 6: + return new org.ccsds.moims.mo.mps.DeleteFailedException(extraInfo); + case 7: + return new org.ccsds.moims.mo.mps.ActivateFailedException(extraInfo); + case 8: + return new org.ccsds.moims.mo.mps.DeactivateFailedException(extraInfo); + case 9: + return new org.ccsds.moims.mo.mps.SubmitFailedException(extraInfo); + case 10: + return new org.ccsds.moims.mo.mps.UnsupportedException(extraInfo); + case 11: + return new org.ccsds.moims.mo.mps.ActivateSubplanFailedException(extraInfo); + case 12: + return new org.ccsds.moims.mo.mps.DeactivateSubplanFailedException(extraInfo); + } + return null; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planningrequest/consumer/MonitorRequestStatusSubscriptionKeys.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planningrequest/consumer/MonitorRequestStatusSubscriptionKeys.java new file mode 100644 index 00000000..b2b93596 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planningrequest/consumer/MonitorRequestStatusSubscriptionKeys.java @@ -0,0 +1,127 @@ +package org.ccsds.moims.mo.mps.planningrequest.consumer; + +/** + * Typed accessors for the Subscription Keys of the monitorRequestStatus PubSub + * operation. + */ +public final class MonitorRequestStatusSubscriptionKeys { + + /** + * The key values as received in the UpdateHeader. + */ + private org.ccsds.moims.mo.mal.structures.NullableAttributeList keyValues; + + /** + * The effective key names for the received key values. + */ + private org.ccsds.moims.mo.mal.structures.IdentifierList keyNames; + + /** + * The Subscription Key names defined by the operation, in order. + */ + private static final org.ccsds.moims.mo.mal.structures.IdentifierList CANONICAL_KEY_NAMES = new org.ccsds.moims.mo.mal.structures.IdentifierList(new java.util.ArrayList<>(java.util.Arrays.asList(new org.ccsds.moims.mo.mal.structures.Identifier("instanceID"), new org.ccsds.moims.mo.mal.structures.Identifier("definitionID"), new org.ccsds.moims.mo.mal.structures.Identifier("userID"), new org.ccsds.moims.mo.mal.structures.Identifier("userReference"), new org.ccsds.moims.mo.mal.structures.Identifier("status"), new org.ccsds.moims.mo.mal.structures.Identifier("outputPlanID")))); + + /** + * Creates an instance from the received UpdateHeader and the subscription + * selectedKeys. + * + * @param updateHeader The UpdateHeader received in the NOTIFY message + * @param selectedKeys The selectedKeys of the subscription, or null if trimming was not enabled + */ + public MonitorRequestStatusSubscriptionKeys(org.ccsds.moims.mo.mal.structures.UpdateHeader updateHeader, + org.ccsds.moims.mo.mal.structures.IdentifierList selectedKeys) { + this.keyValues = (updateHeader == null) ? null : updateHeader.getKeyValues(); + this.keyNames = (selectedKeys != null) ? selectedKeys : CANONICAL_KEY_NAMES; + } + + /** + * Returns the value of the "instanceID" Subscription Key, or null if not + * present. + * + * @return The key value, or null if not present + */ + public org.ccsds.moims.mo.mal.structures.Identifier getInstanceID() { + return (org.ccsds.moims.mo.mal.structures.Identifier) valueByName("instanceID"); + } + + /** + * Returns the value of the "definitionID" Subscription Key, or null if not + * present. + * + * @return The key value, or null if not present + */ + public org.ccsds.moims.mo.mal.structures.Identifier getDefinitionID() { + return (org.ccsds.moims.mo.mal.structures.Identifier) valueByName("definitionID"); + } + + /** + * Returns the value of the "userID" Subscription Key, or null if not present. + * + * @return The key value, or null if not present + */ + public org.ccsds.moims.mo.mal.structures.Identifier getUserID() { + return (org.ccsds.moims.mo.mal.structures.Identifier) valueByName("userID"); + } + + /** + * Returns the value of the "userReference" Subscription Key, or null if not + * present. + * + * @return The key value, or null if not present + */ + public org.ccsds.moims.mo.mal.structures.Identifier getUserReference() { + return (org.ccsds.moims.mo.mal.structures.Identifier) valueByName("userReference"); + } + + /** + * Returns the value of the "status" Subscription Key, or null if not present. + * + * @return The key value, or null if not present + */ + public org.ccsds.moims.mo.mal.structures.UShort getStatus() { + return (org.ccsds.moims.mo.mal.structures.UShort) valueByName("status"); + } + + /** + * Returns the value of the "outputPlanID" Subscription Key, or null if not + * present. + * + * @return The key value, or null if not present + */ + public org.ccsds.moims.mo.mal.structures.Identifier getOutputPlanID() { + return (org.ccsds.moims.mo.mal.structures.Identifier) valueByName("outputPlanID"); + } + + /** + * Returns the Subscription Key value with the given name, or null if it is + * not present (for example when it was trimmed away or is a custom key that + * is not part of this subscription). + * + * @param name The Subscription Key name + * @return The key value, or null if not present + */ + public org.ccsds.moims.mo.mal.structures.Attribute getByName(String name) { + return valueByName(name); + } + + /** + * + * @param name The Subscription Key name + */ + private org.ccsds.moims.mo.mal.structures.Attribute valueByName(String name) { + if (keyNames == null || keyValues == null) { + return null; + } + for (int i = 0; i < keyNames.size(); i++) { + if (name.equals(keyNames.get(i).getValue())) { + if (i >= keyValues.size()) { + return null; + } + org.ccsds.moims.mo.mal.structures.NullableAttribute na = keyValues.get(i); + return (na == null) ? null : na.getValue(); + } + } + return null; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planningrequest/consumer/PlanningRequestAdapter.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planningrequest/consumer/PlanningRequestAdapter.java new file mode 100644 index 00000000..752c0f1e --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planningrequest/consumer/PlanningRequestAdapter.java @@ -0,0 +1,576 @@ +package org.ccsds.moims.mo.mps.planningrequest.consumer; + +/** + * Consumer adapter for PlanningRequest service. + */ +public abstract class PlanningRequestAdapter extends org.ccsds.moims.mo.mal.consumer.MALInteractionAdapter { + + /** + * Called by the MAL when a REQUEST response is received from a provider for + * the operation submitRequest. + * + * @param msgHeader msgHeader The header of the received message + * @param requestResponse The requestResponse field. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void submitRequestResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mps.structures.PlanningRequestResponse requestResponse, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response error is received from a provider + * for the operation submitRequest. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void submitRequestErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response is received from a provider for + * the operation getRequestSummaries. + * + * @param msgHeader msgHeader The header of the received message + * @param requestSummaries The requestSummaries field. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void getRequestSummariesResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mps.structures.RequestSummaryStatusList requestSummaries, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response error is received from a provider + * for the operation getRequestSummaries. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void getRequestSummariesErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PROGRESS acknowledgement is received from a provider + * for the operation getRequestStatus. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void getRequestStatusAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PROGRESS update is received from a provider for + * the operation getRequestStatus. + * + * @param msgHeader msgHeader The header of the received message + * @param requestStatuses The requestStatuses field. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void getRequestStatusUpdateReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mps.structures.RequestStatusUpdateList requestStatuses, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PROGRESS response is received from a provider + * for the operation getRequestStatus. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void getRequestStatusResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PROGRESS acknowledgement error is received from + * a provider for the operation getRequestStatus. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void getRequestStatusAckErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PROGRESS update error is received from a provider + * for the operation getRequestStatus. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void getRequestStatusUpdateErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PROGRESS response error is received from a provider + * for the operation getRequestStatus. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void getRequestStatusResponseErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a SUBMIT acknowledgement is received from a provider + * for the operation cancelRequest. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void cancelRequestAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a SUBMIT acknowledgement error is received from + * a provider for the operation cancelRequest. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void cancelRequestErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response is received from a provider for + * the operation updateRequest. + * + * @param msgHeader msgHeader The header of the received message + * @param requestResponse The requestResponse field. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void updateRequestResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mps.structures.PlanningRequestResponse requestResponse, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response error is received from a provider + * for the operation updateRequest. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void updateRequestErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PubSub register acknowledgement is received from + * a broker for the operation monitorRequestStatus. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void monitorRequestStatusRegisterAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PubSub register acknowledgement error is received + * from a broker for the operation monitorRequestStatus. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void monitorRequestStatusRegisterErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PubSub deregister acknowledgement is received + * from a broker for the operation monitorRequestStatus. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void monitorRequestStatusDeregisterAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PubSub update is received from a broker for the + * operation monitorRequestStatus. + * + * @param msgHeader msgHeader The header of the received message + * @param subscriptionId The subscriptionId of the subscription. + * @param updateHeader The Update header. + * @param keys The typed Subscription Key accessors for this update + * @param requestStatusUpdate The requestStatusUpdate field. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void monitorRequestStatusNotifyReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.structures.Identifier subscriptionId, + org.ccsds.moims.mo.mal.structures.UpdateHeader updateHeader, + MonitorRequestStatusSubscriptionKeys keys, + org.ccsds.moims.mo.mps.structures.RequestStatusUpdate requestStatusUpdate, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PubSub update error is received from a broker + * for the operation monitorRequestStatus. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void monitorRequestStatusNotifyErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PROGRESS acknowledgement is received from a provider + * for the operation getRequest. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void getRequestAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PROGRESS update is received from a provider for + * the operation getRequest. + * + * @param msgHeader msgHeader The header of the received message + * @param requestInstances The requestInstances field. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void getRequestUpdateReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mps.structures.RequestInstanceList requestInstances, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PROGRESS response is received from a provider + * for the operation getRequest. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void getRequestResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PROGRESS acknowledgement error is received from + * a provider for the operation getRequest. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void getRequestAckErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PROGRESS update error is received from a provider + * for the operation getRequest. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void getRequestUpdateErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PROGRESS response error is received from a provider + * for the operation getRequest. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void getRequestResponseErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + @Override + public final void submitAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mps.planningrequest.PlanningRequestServiceInfo._CANCELREQUEST_OP_NUMBER: + cancelRequestAckReceived(msgHeader, qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void submitErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALErrorBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mps.planningrequest.PlanningRequestServiceInfo._CANCELREQUEST_OP_NUMBER: + cancelRequestErrorReceived(msgHeader, body.getError(), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void requestResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALMessageBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mps.planningrequest.PlanningRequestServiceInfo._SUBMITREQUEST_OP_NUMBER: + submitRequestResponseReceived(msgHeader, + (org.ccsds.moims.mo.mps.structures.PlanningRequestResponse) body.getBodyElement(0, new org.ccsds.moims.mo.mps.structures.PlanningRequestResponse()), qosProperties); + break; + case org.ccsds.moims.mo.mps.planningrequest.PlanningRequestServiceInfo._GETREQUESTSUMMARIES_OP_NUMBER: + getRequestSummariesResponseReceived(msgHeader, + (org.ccsds.moims.mo.mps.structures.RequestSummaryStatusList) body.getBodyElement(0, new org.ccsds.moims.mo.mps.structures.RequestSummaryStatusList()), qosProperties); + break; + case org.ccsds.moims.mo.mps.planningrequest.PlanningRequestServiceInfo._UPDATEREQUEST_OP_NUMBER: + updateRequestResponseReceived(msgHeader, + (org.ccsds.moims.mo.mps.structures.PlanningRequestResponse) body.getBodyElement(0, new org.ccsds.moims.mo.mps.structures.PlanningRequestResponse()), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void requestErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALErrorBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mps.planningrequest.PlanningRequestServiceInfo._SUBMITREQUEST_OP_NUMBER: + submitRequestErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mps.planningrequest.PlanningRequestServiceInfo._GETREQUESTSUMMARIES_OP_NUMBER: + getRequestSummariesErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mps.planningrequest.PlanningRequestServiceInfo._UPDATEREQUEST_OP_NUMBER: + updateRequestErrorReceived(msgHeader, body.getError(), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void progressAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALMessageBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mps.planningrequest.PlanningRequestServiceInfo._GETREQUESTSTATUS_OP_NUMBER: + getRequestStatusAckReceived(msgHeader, qosProperties); + break; + case org.ccsds.moims.mo.mps.planningrequest.PlanningRequestServiceInfo._GETREQUEST_OP_NUMBER: + getRequestAckReceived(msgHeader, qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void progressAckErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALErrorBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mps.planningrequest.PlanningRequestServiceInfo._GETREQUESTSTATUS_OP_NUMBER: + getRequestStatusAckErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mps.planningrequest.PlanningRequestServiceInfo._GETREQUEST_OP_NUMBER: + getRequestAckErrorReceived(msgHeader, body.getError(), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void progressUpdateReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALMessageBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mps.planningrequest.PlanningRequestServiceInfo._GETREQUESTSTATUS_OP_NUMBER: + getRequestStatusUpdateReceived(msgHeader, + (org.ccsds.moims.mo.mps.structures.RequestStatusUpdateList) body.getBodyElement(0, new org.ccsds.moims.mo.mps.structures.RequestStatusUpdateList()), qosProperties); + break; + case org.ccsds.moims.mo.mps.planningrequest.PlanningRequestServiceInfo._GETREQUEST_OP_NUMBER: + getRequestUpdateReceived(msgHeader, + (org.ccsds.moims.mo.mps.structures.RequestInstanceList) body.getBodyElement(0, new org.ccsds.moims.mo.mps.structures.RequestInstanceList()), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void progressUpdateErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALErrorBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mps.planningrequest.PlanningRequestServiceInfo._GETREQUESTSTATUS_OP_NUMBER: + getRequestStatusUpdateErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mps.planningrequest.PlanningRequestServiceInfo._GETREQUEST_OP_NUMBER: + getRequestUpdateErrorReceived(msgHeader, body.getError(), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void progressResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALMessageBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mps.planningrequest.PlanningRequestServiceInfo._GETREQUESTSTATUS_OP_NUMBER: + getRequestStatusResponseReceived(msgHeader, qosProperties); + break; + case org.ccsds.moims.mo.mps.planningrequest.PlanningRequestServiceInfo._GETREQUEST_OP_NUMBER: + getRequestResponseReceived(msgHeader, qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void progressResponseErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALErrorBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mps.planningrequest.PlanningRequestServiceInfo._GETREQUESTSTATUS_OP_NUMBER: + getRequestStatusResponseErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mps.planningrequest.PlanningRequestServiceInfo._GETREQUEST_OP_NUMBER: + getRequestResponseErrorReceived(msgHeader, body.getError(), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void registerAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mps.planningrequest.PlanningRequestServiceInfo._MONITORREQUESTSTATUS_OP_NUMBER: + monitorRequestStatusRegisterAckReceived(msgHeader, qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void registerErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALErrorBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mps.planningrequest.PlanningRequestServiceInfo._MONITORREQUESTSTATUS_OP_NUMBER: + monitorRequestStatusRegisterErrorReceived(msgHeader, body.getError(), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void notifyReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALNotifyBody body, + org.ccsds.moims.mo.mal.structures.IdentifierList selectedKeys, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + if ((org.ccsds.moims.mo.mps.MPSHelper.MPS_AREA_NUMBER.equals(msgHeader.getServiceArea())) && (org.ccsds.moims.mo.mps.planningrequest.PlanningRequestServiceInfo.PLANNINGREQUEST_SERVICE_NUMBER.equals(msgHeader.getService()))) { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mps.planningrequest.PlanningRequestServiceInfo._MONITORREQUESTSTATUS_OP_NUMBER: + monitorRequestStatusNotifyReceived(msgHeader, + (org.ccsds.moims.mo.mal.structures.Identifier) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.Identifier()), + (org.ccsds.moims.mo.mal.structures.UpdateHeader) body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.UpdateHeader()), + new MonitorRequestStatusSubscriptionKeys((org.ccsds.moims.mo.mal.structures.UpdateHeader) body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.UpdateHeader()), selectedKeys), + (org.ccsds.moims.mo.mps.structures.RequestStatusUpdate) body.getBodyElement(2, new org.ccsds.moims.mo.mps.structures.RequestStatusUpdate()), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + else { + notifyReceivedFromOtherService(msgHeader, body, qosProperties); + } + } + + @Override + public final void notifyErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALErrorBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mps.planningrequest.PlanningRequestServiceInfo._MONITORREQUESTSTATUS_OP_NUMBER: + monitorRequestStatusNotifyErrorReceived(msgHeader, body.getError(), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void deregisterAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mps.planningrequest.PlanningRequestServiceInfo._MONITORREQUESTSTATUS_OP_NUMBER: + monitorRequestStatusDeregisterAckReceived(msgHeader, qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + /** + * Called by the MAL when a PubSub update from another service is received + * from a broker. + * + * @param msgHeader msgHeader The header of the received message + * @param body body The body of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + * @throws org.ccsds.moims.mo.mal.MALException if an error is detected processing the message. + */ + public void notifyReceivedFromOtherService(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALNotifyBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planningrequest/consumer/PlanningRequestStub.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planningrequest/consumer/PlanningRequestStub.java new file mode 100644 index 00000000..6461f702 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planningrequest/consumer/PlanningRequestStub.java @@ -0,0 +1,377 @@ +package org.ccsds.moims.mo.mps.planningrequest.consumer; + +/** + * Consumer stub for PlanningRequest service. + */ +public class PlanningRequestStub { + + /** + * The consumer field. + */ + private final org.ccsds.moims.mo.mal.consumer.MALConsumer consumer; + + /** + * Wraps a MALconsumer connection with service specific methods that map from + * the high level service API to the generic MAL API. + * + * @param consumer consumer The MALConsumer to use in this stub. + */ + public PlanningRequestStub(org.ccsds.moims.mo.mal.consumer.MALConsumer consumer) { + this.consumer = consumer; + } + + /** + * Returns the internal MAL consumer object used for sending of messages from + * this interface. + * + * @return The MAL consumer object. + */ + public org.ccsds.moims.mo.mal.consumer.MALConsumer getConsumer() { + return consumer; + } + + /** + * The submitRequest operation sends a planning request to the provider, which + * then creates a corresponding RequestInstance object and returns its identity + * to the consumer. + * + * @param requestDetails The requestDetails field. + * @return The return value of the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mps.structures.PlanningRequestResponse submitRequest(org.ccsds.moims.mo.mps.structures.PlanningRequestDetails requestDetails) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + org.ccsds.moims.mo.mal.transport.MALMessageBody body = consumer.request(org.ccsds.moims.mo.mps.planningrequest.PlanningRequestServiceInfo.SUBMITREQUEST_OP, requestDetails); + Object body0 = (Object) body.getBodyElement(0, new org.ccsds.moims.mo.mps.structures.PlanningRequestResponse()); + return (org.ccsds.moims.mo.mps.structures.PlanningRequestResponse) body0; + } + + /** + * Asynchronous version of method submitRequest. + * + * @param requestDetails The requestDetails field. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncSubmitRequest(org.ccsds.moims.mo.mps.structures.PlanningRequestDetails requestDetails, + org.ccsds.moims.mo.mps.planningrequest.consumer.PlanningRequestAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncRequest(org.ccsds.moims.mo.mps.planningrequest.PlanningRequestServiceInfo.SUBMITREQUEST_OP, adapter, requestDetails); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueSubmitRequest(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mps.planningrequest.consumer.PlanningRequestAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mps.planningrequest.PlanningRequestServiceInfo.SUBMITREQUEST_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The getRequestSummaries operation allows consumers to obtain a filtered + * list of currently available RequestInstances. The request uses the RequestFilter + * structure to select the set of planning requests of interest, using the + * following keys: Domain of the RequestInstance; Reference to the RequestInstance; + * Creation date and time of the RequestInstance (as a time range); Reference + * to the RequestDefinition from which the RequestInstance was created; User + * ID of the PlanningUser who initiated the RequestInstance; User Reference + * supplied by the User when submitting the RequestInstance; Current status + * of the RequestInstance; Reference to the output Plan(s) generated in response + * to the RequestInstance. The response returns a list of RequestSummaryStatus + * structures containing references to the identities, descriptive header + * fields, and status of the RequestInstances that match the filter. + * + * @param requestFilter The requestFilter field. + * @return The return value of the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mps.structures.RequestSummaryStatusList getRequestSummaries(org.ccsds.moims.mo.mps.structures.RequestFilter requestFilter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + org.ccsds.moims.mo.mal.transport.MALMessageBody body = consumer.request(org.ccsds.moims.mo.mps.planningrequest.PlanningRequestServiceInfo.GETREQUESTSUMMARIES_OP, requestFilter); + Object body0 = (Object) body.getBodyElement(0, new org.ccsds.moims.mo.mps.structures.RequestSummaryStatusList()); + return (org.ccsds.moims.mo.mps.structures.RequestSummaryStatusList) body0; + } + + /** + * Asynchronous version of method getRequestSummaries. + * + * @param requestFilter The requestFilter field. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncGetRequestSummaries(org.ccsds.moims.mo.mps.structures.RequestFilter requestFilter, + org.ccsds.moims.mo.mps.planningrequest.consumer.PlanningRequestAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncRequest(org.ccsds.moims.mo.mps.planningrequest.PlanningRequestServiceInfo.GETREQUESTSUMMARIES_OP, adapter, requestFilter); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueGetRequestSummaries(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mps.planningrequest.consumer.PlanningRequestAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mps.planningrequest.PlanningRequestServiceInfo.GETREQUESTSUMMARIES_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The getRequestStatus operation is used to obtain the current status of + * one or more known RequestInstances. The operation uses the Progress interaction + * pattern, to allow the response to be spread across multiple messages. + * + * @param requestRefs The requestRefs field. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void getRequestStatus(org.ccsds.moims.mo.mal.structures.ObjectRefList requestRefs, + org.ccsds.moims.mo.mps.planningrequest.consumer.PlanningRequestAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.progress(org.ccsds.moims.mo.mps.planningrequest.PlanningRequestServiceInfo.GETREQUESTSTATUS_OP, adapter, requestRefs); + } + + /** + * Asynchronous version of method getRequestStatus. + * + * @param requestRefs The requestRefs field. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncGetRequestStatus(org.ccsds.moims.mo.mal.structures.ObjectRefList requestRefs, + org.ccsds.moims.mo.mps.planningrequest.consumer.PlanningRequestAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncProgress(org.ccsds.moims.mo.mps.planningrequest.PlanningRequestServiceInfo.GETREQUESTSTATUS_OP, adapter, requestRefs); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueGetRequestStatus(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mps.planningrequest.consumer.PlanningRequestAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mps.planningrequest.PlanningRequestServiceInfo.GETREQUESTSTATUS_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The cancelRequest operation is used by a consumer to cancel a previously + * submitted planning request. The service provider acknowledges the cancellation + * of the RequestInstance or returns an error. + * + * @param requestRef The requestRef field. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void cancelRequest(org.ccsds.moims.mo.mal.structures.ObjectRef requestRef) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.submit(org.ccsds.moims.mo.mps.planningrequest.PlanningRequestServiceInfo.CANCELREQUEST_OP, requestRef); + } + + /** + * Asynchronous version of method cancelRequest. + * + * @param requestRef The requestRef field. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncCancelRequest(org.ccsds.moims.mo.mal.structures.ObjectRef requestRef, + org.ccsds.moims.mo.mps.planningrequest.consumer.PlanningRequestAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncSubmit(org.ccsds.moims.mo.mps.planningrequest.PlanningRequestServiceInfo.CANCELREQUEST_OP, adapter, requestRef); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueCancelRequest(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mps.planningrequest.consumer.PlanningRequestAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mps.planningrequest.PlanningRequestServiceInfo.CANCELREQUEST_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The updateRequest operation may be used to modify the PlanningRequestDetails + * associated with a previously submitted planning request. This results + * in the creation of a new version of the RequestInstance (with the same + * key) by the service provider, which returns a reference to the new version + * to the consumer. + * + * @param requestRef The requestRef field. + * @param requestDetails The requestDetails field. + * @return The return value of the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mps.structures.PlanningRequestResponse updateRequest(org.ccsds.moims.mo.mal.structures.ObjectRef requestRef, + org.ccsds.moims.mo.mps.structures.PlanningRequestDetails requestDetails) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + org.ccsds.moims.mo.mal.transport.MALMessageBody body = consumer.request(org.ccsds.moims.mo.mps.planningrequest.PlanningRequestServiceInfo.UPDATEREQUEST_OP, requestRef, requestDetails); + Object body0 = (Object) body.getBodyElement(0, new org.ccsds.moims.mo.mps.structures.PlanningRequestResponse()); + return (org.ccsds.moims.mo.mps.structures.PlanningRequestResponse) body0; + } + + /** + * Asynchronous version of method updateRequest. + * + * @param requestRef The requestRef field. + * @param requestDetails The requestDetails field. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncUpdateRequest(org.ccsds.moims.mo.mal.structures.ObjectRef requestRef, + org.ccsds.moims.mo.mps.structures.PlanningRequestDetails requestDetails, + org.ccsds.moims.mo.mps.planningrequest.consumer.PlanningRequestAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncRequest(org.ccsds.moims.mo.mps.planningrequest.PlanningRequestServiceInfo.UPDATEREQUEST_OP, adapter, requestRef, requestDetails); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueUpdateRequest(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mps.planningrequest.consumer.PlanningRequestAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mps.planningrequest.PlanningRequestServiceInfo.UPDATEREQUEST_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * Register method for the monitorRequestStatus PubSub interaction. + * + * @param subscription subscription the subscription to register for + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void monitorRequestStatusRegister(org.ccsds.moims.mo.mal.structures.Subscription subscription, + org.ccsds.moims.mo.mps.planningrequest.consumer.PlanningRequestAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.register(org.ccsds.moims.mo.mps.planningrequest.PlanningRequestServiceInfo.MONITORREQUESTSTATUS_OP, subscription, adapter); + } + + /** + * Asynchronous version of method monitorRequestStatusRegister. + * + * @param subscription subscription the subscription to register for + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncMonitorRequestStatusRegister(org.ccsds.moims.mo.mal.structures.Subscription subscription, + org.ccsds.moims.mo.mps.planningrequest.consumer.PlanningRequestAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncRegister(org.ccsds.moims.mo.mps.planningrequest.PlanningRequestServiceInfo.MONITORREQUESTSTATUS_OP, subscription, adapter); + } + + /** + * Deregister method for the monitorRequestStatus PubSub interaction. + * + * @param identifierList identifierList the subscription identifiers to deregister + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void monitorRequestStatusDeregister(org.ccsds.moims.mo.mal.structures.IdentifierList identifierList) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.deregister(org.ccsds.moims.mo.mps.planningrequest.PlanningRequestServiceInfo.MONITORREQUESTSTATUS_OP, identifierList); + } + + /** + * Asynchronous version of method monitorRequestStatusDeregister. + * + * @param identifierList identifierList the subscription identifiers to deregister + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncMonitorRequestStatusDeregister(org.ccsds.moims.mo.mal.structures.IdentifierList identifierList, + org.ccsds.moims.mo.mps.planningrequest.consumer.PlanningRequestAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncDeregister(org.ccsds.moims.mo.mps.planningrequest.PlanningRequestServiceInfo.MONITORREQUESTSTATUS_OP, identifierList, adapter); + } + + /** + * The getRequest operation is used to obtain the full content of one or more + * known RequestInstances. The operation uses the Progress interaction pattern, + * to allow the response to be spread across multiple messages. + * + * @param requestRefs The requestRefs field. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void getRequest(org.ccsds.moims.mo.mal.structures.ObjectRefList requestRefs, + org.ccsds.moims.mo.mps.planningrequest.consumer.PlanningRequestAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.progress(org.ccsds.moims.mo.mps.planningrequest.PlanningRequestServiceInfo.GETREQUEST_OP, adapter, requestRefs); + } + + /** + * Asynchronous version of method getRequest. + * + * @param requestRefs The requestRefs field. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncGetRequest(org.ccsds.moims.mo.mal.structures.ObjectRefList requestRefs, + org.ccsds.moims.mo.mps.planningrequest.consumer.PlanningRequestAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncProgress(org.ccsds.moims.mo.mps.planningrequest.PlanningRequestServiceInfo.GETREQUEST_OP, adapter, requestRefs); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueGetRequest(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mps.planningrequest.consumer.PlanningRequestAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mps.planningrequest.PlanningRequestServiceInfo.GETREQUEST_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planningrequest/consumer/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planningrequest/consumer/package-info.java new file mode 100644 index 00000000..876202ff --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planningrequest/consumer/package-info.java @@ -0,0 +1,4 @@ +/** + * Package containing the consumer stubs for the PlanningRequest service. +*/ +package org.ccsds.moims.mo.mps.planningrequest.consumer; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planningrequest/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planningrequest/package-info.java new file mode 100644 index 00000000..ef12ab58 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planningrequest/package-info.java @@ -0,0 +1,13 @@ +/** + * The Planning Request Service, introduced in 2.5.2, is provided by a planning + * function and enables its consumers to manage the submission of planning + * requests and to receive feedback on their status. It comprises the operations + * defined below, of which only those in capability set 1 are mandatory. In + * the context of a hierarchical or federated planning system, the Planning + * Request Service submitRequest operation can be used to submit a Plan (4.5.6) + * to a planning function, either embedding the Plan in the request itself + * or passing it by reference. If passed by reference, the Plan can be retrieved + * using the Plan Distribution Service (3.6). Patch plans are not permitted + * in the context of a planning request. +*/ +package org.ccsds.moims.mo.mps.planningrequest; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planningrequest/provider/GetRequestInteraction.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planningrequest/provider/GetRequestInteraction.java new file mode 100644 index 00000000..a37dbfde --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planningrequest/provider/GetRequestInteraction.java @@ -0,0 +1,91 @@ +package org.ccsds.moims.mo.mps.planningrequest.provider; + +/** + * Provider PROGRESS interaction class for PlanningRequest::getRequest operation. + */ +public class GetRequestInteraction { + + /** + * The interaction field. + */ + private org.ccsds.moims.mo.mal.provider.MALProgress interaction; + + /** + * Wraps the provided MAL interaction object with methods for sending responses + * to an PROGRESS interaction from a provider. + * + * @param interaction The MAL interaction action object to use. + */ + public GetRequestInteraction(org.ccsds.moims.mo.mal.provider.MALProgress interaction) { + this.interaction = interaction; + } + + /** + * Returns the MAL interaction object used for returning messages from the + * provider. + * + * @return The MAL interaction object provided in the constructor + */ + public org.ccsds.moims.mo.mal.provider.MALProgress getInteraction() { + return interaction; + } + + /** + * Sends a PROGRESS acknowledge to the consumer. + * + * @return Returns the MAL message created by the acknowledge + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage sendAcknowledgement() throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return interaction.sendAcknowledgement((Object[]) null); + } + + /** + * Sends a PROGRESS update to the consumer. + * + * @param requestInstances The requestInstances field. + * @return Returns the MAL message created by the update + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage sendUpdate(org.ccsds.moims.mo.mps.structures.RequestInstanceList requestInstances) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return interaction.sendUpdate(requestInstances); + } + + /** + * Sends a PROGRESS response to the consumer. + * + * @return Returns the MAL message created by the response + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage sendResponse() throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return interaction.sendResponse((Object[]) null); + } + + /** + * Sends an error to the consumer. + * + * @param error error The MAL error to send to the consumer. + * @return Returns the MAL message created by the error + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage sendError(org.ccsds.moims.mo.mal.MOErrorException error) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return interaction.sendError(error); + } + + /** + * Sends an update error to the consumer. + * + * @param error error The MAL error to send to the consumer. + * @return Returns the MAL message created by the error + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage sendUpdateError(org.ccsds.moims.mo.mal.MOErrorException error) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return interaction.sendUpdateError(error); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planningrequest/provider/GetRequestStatusInteraction.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planningrequest/provider/GetRequestStatusInteraction.java new file mode 100644 index 00000000..a9056b14 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planningrequest/provider/GetRequestStatusInteraction.java @@ -0,0 +1,92 @@ +package org.ccsds.moims.mo.mps.planningrequest.provider; + +/** + * Provider PROGRESS interaction class for PlanningRequest::getRequestStatus + * operation. + */ +public class GetRequestStatusInteraction { + + /** + * The interaction field. + */ + private org.ccsds.moims.mo.mal.provider.MALProgress interaction; + + /** + * Wraps the provided MAL interaction object with methods for sending responses + * to an PROGRESS interaction from a provider. + * + * @param interaction The MAL interaction action object to use. + */ + public GetRequestStatusInteraction(org.ccsds.moims.mo.mal.provider.MALProgress interaction) { + this.interaction = interaction; + } + + /** + * Returns the MAL interaction object used for returning messages from the + * provider. + * + * @return The MAL interaction object provided in the constructor + */ + public org.ccsds.moims.mo.mal.provider.MALProgress getInteraction() { + return interaction; + } + + /** + * Sends a PROGRESS acknowledge to the consumer. + * + * @return Returns the MAL message created by the acknowledge + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage sendAcknowledgement() throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return interaction.sendAcknowledgement((Object[]) null); + } + + /** + * Sends a PROGRESS update to the consumer. + * + * @param requestStatuses The requestStatuses field. + * @return Returns the MAL message created by the update + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage sendUpdate(org.ccsds.moims.mo.mps.structures.RequestStatusUpdateList requestStatuses) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return interaction.sendUpdate(requestStatuses); + } + + /** + * Sends a PROGRESS response to the consumer. + * + * @return Returns the MAL message created by the response + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage sendResponse() throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return interaction.sendResponse((Object[]) null); + } + + /** + * Sends an error to the consumer. + * + * @param error error The MAL error to send to the consumer. + * @return Returns the MAL message created by the error + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage sendError(org.ccsds.moims.mo.mal.MOErrorException error) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return interaction.sendError(error); + } + + /** + * Sends an update error to the consumer. + * + * @param error error The MAL error to send to the consumer. + * @return Returns the MAL message created by the error + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage sendUpdateError(org.ccsds.moims.mo.mal.MOErrorException error) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return interaction.sendUpdateError(error); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planningrequest/provider/MonitorRequestStatusPublisher.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planningrequest/provider/MonitorRequestStatusPublisher.java new file mode 100644 index 00000000..9a764ab0 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planningrequest/provider/MonitorRequestStatusPublisher.java @@ -0,0 +1,127 @@ +package org.ccsds.moims.mo.mps.planningrequest.provider; + +/** + * Publisher class for the monitorRequestStatus operation. + */ +public final class MonitorRequestStatusPublisher { + + /** + * The publisherSet field. + */ + private org.ccsds.moims.mo.mal.provider.MALPublisherSet publisherSet; + + /** + * Creates an instance of this class using the supplied publisher set. + * + * @param publisherSet The set of broker connections to use when registering and publishing. + */ + public MonitorRequestStatusPublisher(org.ccsds.moims.mo.mal.provider.MALPublisherSet publisherSet) { + this.publisherSet = publisherSet; + } + + /** + * Registers this provider implementation to the set of broker connections. + * + * @param keyNames The key names to use in the method + * @param keyTypes The key types to use in the method + * @param listener The listener object to use for callback from the publisher + * @throws java.lang.IllegalArgumentException If any supplied argument is invalid + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void register(org.ccsds.moims.mo.mal.structures.IdentifierList keyNames, + org.ccsds.moims.mo.mal.structures.AttributeTypeList keyTypes, + org.ccsds.moims.mo.mal.provider.MALPublishInteractionListener listener) throws java.lang.IllegalArgumentException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + publisherSet.register(keyNames, keyTypes, listener); + } + + /** + * Registers this provider implementation to the set of broker connections + * with the default subscription keys. + * + * @param listener The listener object to use for callback from the publisher + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void registerWithDefaultKeys(org.ccsds.moims.mo.mal.provider.MALPublishInteractionListener listener) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + org.ccsds.moims.mo.mal.structures.IdentifierList keyNames = new org.ccsds.moims.mo.mal.structures.IdentifierList(); + org.ccsds.moims.mo.mal.structures.AttributeTypeList keyTypes = new org.ccsds.moims.mo.mal.structures.AttributeTypeList(); + keyNames.add(new org.ccsds.moims.mo.mal.structures.Identifier("instanceID")); + keyTypes.add(org.ccsds.moims.mo.mal.structures.AttributeType.IDENTIFIER); + keyNames.add(new org.ccsds.moims.mo.mal.structures.Identifier("definitionID")); + keyTypes.add(org.ccsds.moims.mo.mal.structures.AttributeType.IDENTIFIER); + keyNames.add(new org.ccsds.moims.mo.mal.structures.Identifier("userID")); + keyTypes.add(org.ccsds.moims.mo.mal.structures.AttributeType.IDENTIFIER); + keyNames.add(new org.ccsds.moims.mo.mal.structures.Identifier("userReference")); + keyTypes.add(org.ccsds.moims.mo.mal.structures.AttributeType.IDENTIFIER); + keyNames.add(new org.ccsds.moims.mo.mal.structures.Identifier("status")); + keyTypes.add(org.ccsds.moims.mo.mal.structures.AttributeType.USHORT); + keyNames.add(new org.ccsds.moims.mo.mal.structures.Identifier("outputPlanID")); + keyTypes.add(org.ccsds.moims.mo.mal.structures.AttributeType.IDENTIFIER); + publisherSet.register(keyNames, keyTypes, listener); + } + + /** + * Asynchronously registers this provider implementation to the set of broker + * connections. + * + * @param keyNames The key names to use in the method + * @param keyTypes The key types to use in the method + * @param listener The listener object to use for callback from the publisher + * @throws java.lang.IllegalArgumentException If any supplied argument is invalid + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void asyncRegister(org.ccsds.moims.mo.mal.structures.IdentifierList keyNames, + org.ccsds.moims.mo.mal.structures.AttributeTypeList keyTypes, + org.ccsds.moims.mo.mal.provider.MALPublishInteractionListener listener) throws java.lang.IllegalArgumentException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + publisherSet.asyncRegister(keyNames, keyTypes, listener); + } + + /** + * Publishes updates to the set of registered broker connections. + * + * @param updateHeader The headers of the updates being added + * @param requestStatusUpdate The requestStatusUpdate field. + * @throws java.lang.IllegalArgumentException If any supplied argument is invalid + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void publish(org.ccsds.moims.mo.mal.structures.UpdateHeader updateHeader, + org.ccsds.moims.mo.mps.structures.RequestStatusUpdate requestStatusUpdate) throws java.lang.IllegalArgumentException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + publisherSet.publish(updateHeader, requestStatusUpdate); + } + + /** + * Deregisters this provider implementation from the set of broker connections. + * + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void deregister() throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + publisherSet.deregister(); + } + + /** + * Asynchronously deregisters this provider implementation from the set of + * broker connections. + * + * @param listener The listener object to use for callback from the publisher + * @throws java.lang.IllegalArgumentException If any supplied argument is invalid + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void asyncDeregister(org.ccsds.moims.mo.mal.provider.MALPublishInteractionListener listener) throws java.lang.IllegalArgumentException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + publisherSet.asyncDeregister(listener); + } + + /** + * Closes this publisher. + * + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void close() throws org.ccsds.moims.mo.mal.MALException { + publisherSet.close(); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planningrequest/provider/PlanningRequestHandler.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planningrequest/provider/PlanningRequestHandler.java new file mode 100644 index 00000000..644ee2db --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planningrequest/provider/PlanningRequestHandler.java @@ -0,0 +1,90 @@ +package org.ccsds.moims.mo.mps.planningrequest.provider; + +/** + * Interface that providers of the PlanningRequest service must implement + * to handle the operations of that service. + */ +public interface PlanningRequestHandler { + + /** + * Implements the operation submitRequest. + * + * @param requestDetails The requestDetails field. + * @param interaction The MAL object representing the interaction in the provider. + * @return The return value of the operation + * @throws org.ccsds.moims.mo.mps.InvalidException One or more fields in the message contain invalid values. + * @throws org.ccsds.moims.mo.mps.UnsupportedException An optional data structure used in the message is not supported by the service provider. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + org.ccsds.moims.mo.mps.structures.PlanningRequestResponse submitRequest(org.ccsds.moims.mo.mps.structures.PlanningRequestDetails requestDetails, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mps.InvalidException, org.ccsds.moims.mo.mps.UnsupportedException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation getRequestSummaries. + * + * @param requestFilter The requestFilter field. + * @param interaction The MAL object representing the interaction in the provider. + * @return The return value of the operation + * @throws org.ccsds.moims.mo.mps.InvalidException One or more fields in the message contain invalid values. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + org.ccsds.moims.mo.mps.structures.RequestSummaryStatusList getRequestSummaries(org.ccsds.moims.mo.mps.structures.RequestFilter requestFilter, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mps.InvalidException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation getRequestStatus. + * + * @param requestRefs The requestRefs field. + * @param interaction The MAL object representing the interaction in the provider. + * @throws org.ccsds.moims.mo.mps.InvalidException One or more fields in the message contain invalid values. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + void getRequestStatus(org.ccsds.moims.mo.mal.structures.ObjectRefList requestRefs, + org.ccsds.moims.mo.mps.planningrequest.provider.GetRequestStatusInteraction interaction) throws org.ccsds.moims.mo.mps.InvalidException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation cancelRequest. + * + * @param requestRef The requestRef field. + * @param interaction The MAL object representing the interaction in the provider. + * @throws org.ccsds.moims.mo.mps.InvalidException One or more fields in the message contain invalid values. + * @throws org.ccsds.moims.mo.mps.CancelFailedException The cancelRequest operation failed to cancel the referenced RequestInstance. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + void cancelRequest(org.ccsds.moims.mo.mal.structures.ObjectRef requestRef, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mps.InvalidException, org.ccsds.moims.mo.mps.CancelFailedException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation updateRequest. + * + * @param requestRef The requestRef field. + * @param requestDetails The requestDetails field. + * @param interaction The MAL object representing the interaction in the provider. + * @return The return value of the operation + * @throws org.ccsds.moims.mo.mps.InvalidException One or more fields in the message contain invalid values. + * @throws org.ccsds.moims.mo.mps.UnsupportedException An optional data structure used in the message is not supported by the service provider. + * @throws org.ccsds.moims.mo.mps.UpdateFailedException The update operation (to Request, PlanStatus, Activity, Event or Resource) failed to update the referenced object. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + org.ccsds.moims.mo.mps.structures.PlanningRequestResponse updateRequest(org.ccsds.moims.mo.mal.structures.ObjectRef requestRef, + org.ccsds.moims.mo.mps.structures.PlanningRequestDetails requestDetails, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mps.InvalidException, org.ccsds.moims.mo.mps.UnsupportedException, org.ccsds.moims.mo.mps.UpdateFailedException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation getRequest. + * + * @param requestRefs The requestRefs field. + * @param interaction The MAL object representing the interaction in the provider. + * @throws org.ccsds.moims.mo.mps.InvalidException One or more fields in the message contain invalid values. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + void getRequest(org.ccsds.moims.mo.mal.structures.ObjectRefList requestRefs, + org.ccsds.moims.mo.mps.planningrequest.provider.GetRequestInteraction interaction) throws org.ccsds.moims.mo.mps.InvalidException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Sets the skeleton to be used for creation of publishers. + * + * @param skeleton The skeleton to be used. + */ + void setSkeleton(org.ccsds.moims.mo.mps.planningrequest.provider.PlanningRequestSkeleton skeleton); +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planningrequest/provider/PlanningRequestInheritanceSkeleton.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planningrequest/provider/PlanningRequestInheritanceSkeleton.java new file mode 100644 index 00000000..ccc92df2 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planningrequest/provider/PlanningRequestInheritanceSkeleton.java @@ -0,0 +1,150 @@ +package org.ccsds.moims.mo.mps.planningrequest.provider; + +/** + * Provider Inheritance skeleton for PlanningRequestInheritanceSkeleton service. + */ +public abstract class PlanningRequestInheritanceSkeleton implements org.ccsds.moims.mo.mal.provider.MALInteractionHandler, org.ccsds.moims.mo.mps.planningrequest.provider.PlanningRequestSkeleton, org.ccsds.moims.mo.mps.planningrequest.provider.PlanningRequestHandler { + + /** + * The providerSet field. + */ + private org.ccsds.moims.mo.mal.provider.MALProviderSet providerSet = new org.ccsds.moims.mo.mal.provider.MALProviderSet(org.ccsds.moims.mo.mps.planningrequest.PlanningRequestHelper.PLANNINGREQUEST_SERVICE); + + /** + * Returns the connection object for this provider. + * + * @return the connection object for this provider + * @throws java.io.IOException if the method was not implemented yet. + */ + public org.ccsds.moims.mo.mal.helpertools.connections.ConnectionProvider getConnection() throws java.io.IOException { + throw new java.io.IOException("This method needs to be overridden!"); + } + + @Override + public void setSkeleton(org.ccsds.moims.mo.mps.planningrequest.provider.PlanningRequestSkeleton skeleton) { + // Not used in the inheritance pattern (the skeleton is 'this'); + } + + @Override + public void malInitialize(org.ccsds.moims.mo.mal.provider.MALProvider provider) throws org.ccsds.moims.mo.mal.MALException { + providerSet.addProvider(provider); + } + + @Override + public void malFinalize(org.ccsds.moims.mo.mal.provider.MALProvider provider) throws org.ccsds.moims.mo.mal.MALException { + providerSet.removeProvider(provider); + } + + @Override + public org.ccsds.moims.mo.mps.planningrequest.provider.MonitorRequestStatusPublisher createMonitorRequestStatusPublisher(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.Identifier networkZone, + org.ccsds.moims.mo.mal.structures.SessionType sessionType, + org.ccsds.moims.mo.mal.structures.Identifier sessionName, + org.ccsds.moims.mo.mal.structures.QoSLevel qos, + java.util.Map qosProps, + org.ccsds.moims.mo.mal.structures.UInteger priority) throws org.ccsds.moims.mo.mal.MALException { + return new org.ccsds.moims.mo.mps.planningrequest.provider.MonitorRequestStatusPublisher(providerSet.createPublisherSet(org.ccsds.moims.mo.mps.planningrequest.PlanningRequestServiceInfo.MONITORREQUESTSTATUS_OP, domain, sessionType, sessionName, qos, qosProps, null)); + } + + @Override + public void handleSend(org.ccsds.moims.mo.mal.provider.MALInteraction interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + switch (opNumber) { + default: + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } + + @Override + public void handleSubmit(org.ccsds.moims.mo.mal.provider.MALSubmit interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + try { + switch (opNumber) { + case org.ccsds.moims.mo.mps.planningrequest.PlanningRequestServiceInfo._CANCELREQUEST_OP_NUMBER: + cancelRequest((org.ccsds.moims.mo.mal.structures.ObjectRef) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.ObjectRef()), + interaction); + interaction.sendAcknowledgement(); + break; + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } catch (org.ccsds.moims.mo.mal.MOErrorException error) { + throw new org.ccsds.moims.mo.mal.MALInteractionException(error); + } + } + + @Override + public void handleRequest(org.ccsds.moims.mo.mal.provider.MALRequest interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + try { + switch (opNumber) { + case org.ccsds.moims.mo.mps.planningrequest.PlanningRequestServiceInfo._SUBMITREQUEST_OP_NUMBER: + interaction.sendResponse(submitRequest((org.ccsds.moims.mo.mps.structures.PlanningRequestDetails) body.getBodyElement(0, new org.ccsds.moims.mo.mps.structures.PlanningRequestDetails()), + interaction)); + break; + case org.ccsds.moims.mo.mps.planningrequest.PlanningRequestServiceInfo._GETREQUESTSUMMARIES_OP_NUMBER: + interaction.sendResponse(getRequestSummaries((org.ccsds.moims.mo.mps.structures.RequestFilter) body.getBodyElement(0, new org.ccsds.moims.mo.mps.structures.RequestFilter()), + interaction)); + break; + case org.ccsds.moims.mo.mps.planningrequest.PlanningRequestServiceInfo._UPDATEREQUEST_OP_NUMBER: + interaction.sendResponse(updateRequest((org.ccsds.moims.mo.mal.structures.ObjectRef) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.ObjectRef()), + (org.ccsds.moims.mo.mps.structures.PlanningRequestDetails) body.getBodyElement(1, new org.ccsds.moims.mo.mps.structures.PlanningRequestDetails()), + interaction)); + break; + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } catch (org.ccsds.moims.mo.mal.MOErrorException error) { + throw new org.ccsds.moims.mo.mal.MALInteractionException(error); + } + } + + @Override + public void handleInvoke(org.ccsds.moims.mo.mal.provider.MALInvoke interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + switch (opNumber) { + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } + + @Override + public void handleProgress(org.ccsds.moims.mo.mal.provider.MALProgress interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + try { + switch (opNumber) { + case org.ccsds.moims.mo.mps.planningrequest.PlanningRequestServiceInfo._GETREQUESTSTATUS_OP_NUMBER: + getRequestStatus((org.ccsds.moims.mo.mal.structures.ObjectRefList) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.ObjectRefList()), + new GetRequestStatusInteraction(interaction)); + break; + case org.ccsds.moims.mo.mps.planningrequest.PlanningRequestServiceInfo._GETREQUEST_OP_NUMBER: + getRequest((org.ccsds.moims.mo.mal.structures.ObjectRefList) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.ObjectRefList()), + new GetRequestInteraction(interaction)); + break; + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } catch (org.ccsds.moims.mo.mal.MOErrorException error) { + throw new org.ccsds.moims.mo.mal.MALInteractionException(error); + } + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planningrequest/provider/PlanningRequestSkeleton.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planningrequest/provider/PlanningRequestSkeleton.java new file mode 100644 index 00000000..056ad240 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planningrequest/provider/PlanningRequestSkeleton.java @@ -0,0 +1,29 @@ +package org.ccsds.moims.mo.mps.planningrequest.provider; + +/** + * The skeleton interface for the PlanningRequest service. + */ +public interface PlanningRequestSkeleton { + + /** + * Creates a publisher object using the current registered provider set for + * the PubSub operation monitorRequestStatus. + * + * @param domain The domain used for publishing + * @param networkZone ~The network zone used for publishing + * @param sessionType The session used for publishing + * @param sessionName The session name used for publishing + * @param qos The QoS used for publishing + * @param qosProps The QoS properties used for publishing + * @param priority The priority used for publishing + * @return The new publisher object. + * @throws org.ccsds.moims.mo.mal.MALException if a problem is detected during creation of the publisher + */ + org.ccsds.moims.mo.mps.planningrequest.provider.MonitorRequestStatusPublisher createMonitorRequestStatusPublisher(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.Identifier networkZone, + org.ccsds.moims.mo.mal.structures.SessionType sessionType, + org.ccsds.moims.mo.mal.structures.Identifier sessionName, + org.ccsds.moims.mo.mal.structures.QoSLevel qos, + java.util.Map qosProps, + org.ccsds.moims.mo.mal.structures.UInteger priority) throws org.ccsds.moims.mo.mal.MALException; +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planningrequest/provider/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planningrequest/provider/package-info.java new file mode 100644 index 00000000..8139f82b --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/planningrequest/provider/package-info.java @@ -0,0 +1,4 @@ +/** + * Package containing the provider skeletons for the PlanningRequest service. +*/ +package org.ccsds.moims.mo.mps.planningrequest.provider; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ActivityDefinition.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ActivityDefinition.java new file mode 100644 index 00000000..0f578e81 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ActivityDefinition.java @@ -0,0 +1,387 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E1: An ActivityDefinition is an MO object that contains static configuration + * data relating to multiple occurrences of a planning activity. Its identity + * is defined by a definitionID, which includes a constant key and an evolving + * version that is updated each time the definition is revised. ActivityDefinitions + * form part of the planning configuration data. + */ +public final class ActivityDefinition extends org.ccsds.moims.mo.mal.structures.MOObject { + + private static final long serialVersionUID = 1407374900330597L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330597L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Description of the Activity. + */ + private String description; + + /** + * List of Argument Definitions. + */ + private org.ccsds.moims.mo.mps.structures.ArgDefList argDefs; + + /** + * A single constraint or a constraint node that may contain multiple constraints, + * applicable to all instances of the Activity. + */ + private org.ccsds.moims.mo.mps.structures.Constraint constraints; + + /** + * Set of Effects applicable to all instances of the Activity. + */ + private org.ccsds.moims.mo.mps.structures.EffectList effects; + + /** + * Reference to the definition of an executable body for the Activity (procedure, + * action sequence, etc.). The manner in which this reference is interpreted + * is implementation specific. + */ + private org.ccsds.moims.mo.mal.structures.Identifier executionDefinition; + + /** + * Supports calculation of an estimated duration of an Activity Instance. + */ + private org.ccsds.moims.mo.mal.structures.Element durationSpec; + + /** + * Set of activity details specifying child activities. + */ + private org.ccsds.moims.mo.mps.structures.ActivityDetailsList children; + + /** + * Free-text field that can be used to categorize an activity into one of + * several arbitrary categories. Enables a planning system to customize behavior + * for activities, such as their presentation in displays, based on the specified + * value. + */ + private String activityType; + + /** + * Default set of Tags that may be used to associate the Activity with others, + * grouping activities by operational responsibility (controller/group/system) + * or other criteria. + */ + private org.ccsds.moims.mo.mal.structures.StringList defaultTags; + + /** + * Default constructor for ActivityDefinition. + * + */ + public ActivityDefinition() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param objectIdentity The identity of the MO Object. + * @param description Description of the Activity. + * @param argDefs List of Argument Definitions. + * @param constraints A single constraint or a constraint node that may contain multiple constraints, applicable to all instances of the Activity. + * @param effects Set of Effects applicable to all instances of the Activity. + * @param executionDefinition Reference to the definition of an executable body for the Activity (procedure, action sequence, etc.). The manner in which this reference is interpreted is implementation specific. + * @param durationSpec Supports calculation of an estimated duration of an Activity Instance. + * @param children Set of activity details specifying child activities. + * @param activityType Free-text field that can be used to categorize an activity into one of several arbitrary categories. Enables a planning system to customize behavior for activities, such as their presentation in displays, based on the specified value. + * @param defaultTags Default set of Tags that may be used to associate the Activity with others, grouping activities by operational responsibility (controller/group/system) or other criteria. + */ + public ActivityDefinition(org.ccsds.moims.mo.mal.structures.ObjectIdentity objectIdentity, + String description, + org.ccsds.moims.mo.mps.structures.ArgDefList argDefs, + org.ccsds.moims.mo.mps.structures.Constraint constraints, + org.ccsds.moims.mo.mps.structures.EffectList effects, + org.ccsds.moims.mo.mal.structures.Identifier executionDefinition, + org.ccsds.moims.mo.mal.structures.Element durationSpec, + org.ccsds.moims.mo.mps.structures.ActivityDetailsList children, + String activityType, + org.ccsds.moims.mo.mal.structures.StringList defaultTags) { + super(objectIdentity); + this.description = description; + this.argDefs = argDefs; + this.constraints = constraints; + this.effects = effects; + this.executionDefinition = executionDefinition; + this.durationSpec = durationSpec; + this.children = children; + this.activityType = activityType; + this.defaultTags = defaultTags; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param objectIdentity The identity of the MO Object. + * @param description Description of the Activity. + */ + public ActivityDefinition(org.ccsds.moims.mo.mal.structures.ObjectIdentity objectIdentity, + String description) { + super(objectIdentity); + this.description = description; + this.argDefs = null; + this.constraints = null; + this.effects = null; + this.executionDefinition = null; + this.durationSpec = null; + this.children = null; + this.activityType = null; + this.defaultTags = null; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.ActivityDefinition(); + } + + /** + * Returns the field description. + * + * @return The field description + */ + public String getDescription() { + return description; + } + + /** + * Returns the field argDefs. + * + * @return The field argDefs + */ + public org.ccsds.moims.mo.mps.structures.ArgDefList getArgDefs() { + return argDefs; + } + + /** + * Returns the field constraints. + * + * @return The field constraints + */ + public org.ccsds.moims.mo.mps.structures.Constraint getConstraints() { + return constraints; + } + + /** + * Returns the field effects. + * + * @return The field effects + */ + public org.ccsds.moims.mo.mps.structures.EffectList getEffects() { + return effects; + } + + /** + * Returns the field executionDefinition. + * + * @return The field executionDefinition + */ + public org.ccsds.moims.mo.mal.structures.Identifier getExecutionDefinition() { + return executionDefinition; + } + + /** + * Returns the field durationSpec. + * + * @return The field durationSpec + */ + public org.ccsds.moims.mo.mal.structures.Element getDurationSpec() { + return durationSpec; + } + + /** + * Returns the field children. + * + * @return The field children + */ + public org.ccsds.moims.mo.mps.structures.ActivityDetailsList getChildren() { + return children; + } + + /** + * Returns the field activityType. + * + * @return The field activityType + */ + public String getActivityType() { + return activityType; + } + + /** + * Returns the field defaultTags. + * + * @return The field defaultTags + */ + public org.ccsds.moims.mo.mal.structures.StringList getDefaultTags() { + return defaultTags; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ActivityDefinition) { + if (! super.equals(obj)) { + return false; + } + ActivityDefinition other = (ActivityDefinition) obj; + if (description == null) { + if (other.description != null) { + return false; + } + } else { + if (! description.equals(other.description)) { + return false; + } + } + if (argDefs == null) { + if (other.argDefs != null) { + return false; + } + } else { + if (! argDefs.equals(other.argDefs)) { + return false; + } + } + if (constraints == null) { + if (other.constraints != null) { + return false; + } + } else { + if (! constraints.equals(other.constraints)) { + return false; + } + } + if (effects == null) { + if (other.effects != null) { + return false; + } + } else { + if (! effects.equals(other.effects)) { + return false; + } + } + if (executionDefinition == null) { + if (other.executionDefinition != null) { + return false; + } + } else { + if (! executionDefinition.equals(other.executionDefinition)) { + return false; + } + } + if (durationSpec == null) { + if (other.durationSpec != null) { + return false; + } + } else { + if (! durationSpec.equals(other.durationSpec)) { + return false; + } + } + if (children == null) { + if (other.children != null) { + return false; + } + } else { + if (! children.equals(other.children)) { + return false; + } + } + if (activityType == null) { + if (other.activityType != null) { + return false; + } + } else { + if (! activityType.equals(other.activityType)) { + return false; + } + } + if (defaultTags == null) { + if (other.defaultTags != null) { + return false; + } + } else { + if (! defaultTags.equals(other.defaultTags)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = super.hashCode(); + hash = 83 * hash + (description != null ? description.hashCode() : 0); + hash = 83 * hash + (argDefs != null ? argDefs.hashCode() : 0); + hash = 83 * hash + (constraints != null ? constraints.hashCode() : 0); + hash = 83 * hash + (effects != null ? effects.hashCode() : 0); + hash = 83 * hash + (executionDefinition != null ? executionDefinition.hashCode() : 0); + hash = 83 * hash + (durationSpec != null ? durationSpec.hashCode() : 0); + hash = 83 * hash + (children != null ? children.hashCode() : 0); + hash = 83 * hash + (activityType != null ? activityType.hashCode() : 0); + hash = 83 * hash + (defaultTags != null ? defaultTags.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(ActivityDefinition: "); + buf.append(super.toString()); + buf.append(", description=").append(description); + buf.append(", argDefs=").append(argDefs); + buf.append(", constraints=").append(constraints); + buf.append(", effects=").append(effects); + buf.append(", executionDefinition=").append(executionDefinition); + buf.append(", durationSpec=").append(durationSpec); + buf.append(", children=").append(children); + buf.append(", activityType=").append(activityType); + buf.append(", defaultTags=").append(defaultTags); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + super.encode(encoder); + if (description == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'description' cannot be null!"); + } + encoder.encodeString(description); + encoder.encodeNullableElement(argDefs); + encoder.encodeNullableAbstractElement(constraints); + encoder.encodeNullableElement(effects); + encoder.encodeNullableIdentifier(executionDefinition); + encoder.encodeNullableAbstractElement(durationSpec); + encoder.encodeNullableElement(children); + encoder.encodeNullableString(activityType); + encoder.encodeNullableElement(defaultTags); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + super.decode(decoder); + description = decoder.decodeString(); + argDefs = (org.ccsds.moims.mo.mps.structures.ArgDefList) decoder.decodeNullableElement(new org.ccsds.moims.mo.mps.structures.ArgDefList()); + constraints = (org.ccsds.moims.mo.mps.structures.Constraint) decoder.decodeNullableAbstractElement(); + effects = (org.ccsds.moims.mo.mps.structures.EffectList) decoder.decodeNullableElement(new org.ccsds.moims.mo.mps.structures.EffectList()); + executionDefinition = decoder.decodeNullableIdentifier(); + durationSpec = (org.ccsds.moims.mo.mal.structures.Element) decoder.decodeNullableAbstractElement(); + children = (org.ccsds.moims.mo.mps.structures.ActivityDetailsList) decoder.decodeNullableElement(new org.ccsds.moims.mo.mps.structures.ActivityDetailsList()); + activityType = decoder.decodeNullableString(); + defaultTags = (org.ccsds.moims.mo.mal.structures.StringList) decoder.decodeNullableElement(new org.ccsds.moims.mo.mal.structures.StringList()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ActivityDefinitionList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ActivityDefinitionList.java new file mode 100644 index 00000000..74e03767 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ActivityDefinitionList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for ActivityDefinition. + */ +public final class ActivityDefinitionList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107611L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107611L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for ActivityDefinitionList. + * + */ + public ActivityDefinitionList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public ActivityDefinitionList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public ActivityDefinitionList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.ActivityDefinition element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.ActivityDefinition element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new ActivityDefinitionList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.ActivityDefinition(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ActivityDetails.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ActivityDetails.java new file mode 100644 index 00000000..64384bc7 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ActivityDetails.java @@ -0,0 +1,183 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E1: Contains the information required to create one or more ActivityInstances, + * including the specification of argument values and constraints. It should + * be noted that the activityRef and activityOffset fields are only relevant + * in the case that a Repetition has been specified in a parent ActivityNode. + * Temporal and sequential constraints associated with the ActivityInstance + * can be specified as constraints attached to a concrete SimpleActivityDetails + * structure. + */ +public abstract class ActivityDetails implements org.ccsds.moims.mo.mal.structures.Composite { + + /** + * Specifies how the ActivityInstance is placed with respect to any defined + * Repetition (0=Start; 1=End). Default is Start. + */ + private org.ccsds.moims.mo.mps.structures.Slider activityRef; + + /** + * Specifies an offset in time for the ActivityInstance from any defined Repetition. + * Default is no offset. + */ + private org.ccsds.moims.mo.mal.structures.Element activityOffset; + + /** + * Specifies a related Event (or Event Group) for the ActivityInstance. Argument + * specifications and constraints may reference arguments and fields of the + * RelatedEvent. + */ + private org.ccsds.moims.mo.mal.structures.Element relatedEvent; + + /** + * Any notes associated with the ActivityDetails. + */ + private String comments; + + /** + * Default constructor for ActivityDetails. + * + */ + public ActivityDetails() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param activityRef Specifies how the ActivityInstance is placed with respect to any defined Repetition (0=Start; 1=End). Default is Start. + * @param activityOffset Specifies an offset in time for the ActivityInstance from any defined Repetition. Default is no offset. + * @param relatedEvent Specifies a related Event (or Event Group) for the ActivityInstance. Argument specifications and constraints may reference arguments and fields of the RelatedEvent. + * @param comments Any notes associated with the ActivityDetails. + */ + public ActivityDetails(org.ccsds.moims.mo.mps.structures.Slider activityRef, + org.ccsds.moims.mo.mal.structures.Element activityOffset, + org.ccsds.moims.mo.mal.structures.Element relatedEvent, + String comments) { + this.activityRef = activityRef; + this.activityOffset = activityOffset; + this.relatedEvent = relatedEvent; + this.comments = comments; + } + + /** + * Returns the field activityRef. + * + * @return The field activityRef + */ + public org.ccsds.moims.mo.mps.structures.Slider getActivityRef() { + return activityRef; + } + + /** + * Returns the field activityOffset. + * + * @return The field activityOffset + */ + public org.ccsds.moims.mo.mal.structures.Element getActivityOffset() { + return activityOffset; + } + + /** + * Returns the field relatedEvent. + * + * @return The field relatedEvent + */ + public org.ccsds.moims.mo.mal.structures.Element getRelatedEvent() { + return relatedEvent; + } + + /** + * Returns the field comments. + * + * @return The field comments + */ + public String getComments() { + return comments; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ActivityDetails) { + ActivityDetails other = (ActivityDetails) obj; + if (activityRef == null) { + if (other.activityRef != null) { + return false; + } + } else { + if (! activityRef.equals(other.activityRef)) { + return false; + } + } + if (activityOffset == null) { + if (other.activityOffset != null) { + return false; + } + } else { + if (! activityOffset.equals(other.activityOffset)) { + return false; + } + } + if (relatedEvent == null) { + if (other.relatedEvent != null) { + return false; + } + } else { + if (! relatedEvent.equals(other.relatedEvent)) { + return false; + } + } + if (comments == null) { + if (other.comments != null) { + return false; + } + } else { + if (! comments.equals(other.comments)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (activityRef != null ? activityRef.hashCode() : 0); + hash = 83 * hash + (activityOffset != null ? activityOffset.hashCode() : 0); + hash = 83 * hash + (relatedEvent != null ? relatedEvent.hashCode() : 0); + hash = 83 * hash + (comments != null ? comments.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(ActivityDetails: "); + buf.append("activityRef=").append(activityRef); + buf.append(", activityOffset=").append(activityOffset); + buf.append(", relatedEvent=").append(relatedEvent); + buf.append(", comments=").append(comments); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeNullableElement(activityRef); + encoder.encodeNullableAbstractElement(activityOffset); + encoder.encodeNullableAbstractElement(relatedEvent); + encoder.encodeNullableString(comments); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + activityRef = (org.ccsds.moims.mo.mps.structures.Slider) decoder.decodeNullableElement(new org.ccsds.moims.mo.mps.structures.Slider()); + activityOffset = (org.ccsds.moims.mo.mal.structures.Element) decoder.decodeNullableAbstractElement(); + relatedEvent = (org.ccsds.moims.mo.mal.structures.Element) decoder.decodeNullableAbstractElement(); + comments = decoder.decodeNullableString(); + return this; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ActivityDetailsList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ActivityDetailsList.java new file mode 100644 index 00000000..01e0ae8d --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ActivityDetailsList.java @@ -0,0 +1,23 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for ActivityDetails. + */ +public final class ActivityDetailsList extends org.ccsds.moims.mo.mal.structures.HeterogeneousList { + + /** + * Default constructor for ActivityDetailsList. + * + */ + public ActivityDetailsList() { + } + + @Override + public boolean add(org.ccsds.moims.mo.mal.structures.Element element) { + if (element != null && !(element instanceof ActivityDetails)) { + throw new java.lang.ClassCastException("The added element does not extend the type: ActivityDetails"); + } + return super.add(element); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ActivityInstance.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ActivityInstance.java new file mode 100644 index 00000000..15f941b6 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ActivityInstance.java @@ -0,0 +1,724 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E1: An ActivityInstance is an MO object that contains the identity of a + * specific occurrence of a planning activity, together with both static and + * dynamic information associated with that occurrence. It supports relationships + * to its definition, source, a related planning event and any child activities. + * ActivityInstances may be contained within a Plan. NOTE – The start and + * end fields specify the trigger conditions (including time) that specify + * when the ActivityInstance starts and/or ends in the context of a Plan. + * The duration is an estimate of the time taken to execute the ActivityInstance + * rather than an offset, which may for example be used in the visualization + * of a Plan. Duration may be used in conjunction with a specified end trigger + * to determine the planned start time of an ActivityInstance. + */ +public final class ActivityInstance extends org.ccsds.moims.mo.mal.structures.MOObject { + + private static final long serialVersionUID = 1407374900330598L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330598L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Reference to the ActivityDefinition. + */ + private org.ccsds.moims.mo.mal.structures.ObjectRef definition; + + /** + * Object Type: RequestInstance | ActivityInstance | PlanningUser Reference + * to the source of the ActivityInstance, which is either its parent ActivityInstance, + * a RequestInstance if it is a root Activity, or a PlanningUser if directly + * inserted. + */ + private org.ccsds.moims.mo.mal.structures.ObjectRef source; + + /** + * Optional reference to an EventInstance that is specifically associated + * with this instance of the Activity. Typically, the Activity is placed + * in response to the Event. + */ + private org.ccsds.moims.mo.mal.structures.ObjectRef relatedEvent; + + /** + * References to any child ActivityInstances. + */ + private org.ccsds.moims.mo.mal.structures.ObjectRefList children; + + /** + * Any notes associated with this instance of the Activity. + */ + private String comments; + + /** + * A single constraint or a constraint node that may contain multiple constraints, + * applicable to this instance of the Activity. + */ + private org.ccsds.moims.mo.mps.structures.Constraint constraints; + + /** + * Set of Effects applicable to this instance of the Activity. + */ + private org.ccsds.moims.mo.mps.structures.EffectList effects; + + /** + * Argument values for each Argument defined in the Activity Definition. + */ + private org.ccsds.moims.mo.mps.structures.ArgumentList arguments; + + /** + * Optionally specifies the trigger that initiates the Activity: may be time, + * position or event based. + */ + private org.ccsds.moims.mo.mps.structures.Trigger start; + + /** + * Optionally specifies the trigger that ends the Activity. + */ + private org.ccsds.moims.mo.mps.structures.Trigger end; + + /** + * Optional duration of the Activity (estimated until execution, actual post + * execution). + */ + private org.ccsds.moims.mo.mal.structures.Duration duration; + + /** + * Optional association of the Activity with a defined sub-plan. + */ + private org.ccsds.moims.mo.mal.structures.Identifier subPlan; + + /** + * Set of Tags that may be used to associate the Activity with others, grouping + * activities by operational responsibility (controller/group/system) or other + * criteria. + */ + private org.ccsds.moims.mo.mal.structures.StringList tags; + + /** + * Current Status of the Activity Instance (see Activity State Model in 4.5.2.2). + */ + private org.ccsds.moims.mo.mps.structures.ActivityStatusEnum status; + + /** + * Reference to the instance of an executable body for the Activity (procedure, + * action sequence, etc.). The manner in which this reference is interpreted + * is implementation specific. + */ + private org.ccsds.moims.mo.mal.structures.Identifier executionInstance; + + /** + * Optional return data from the planning process, provided as a list of ID-Value + * pairs. This can be used to provide additional information required by + * the User to interpret the planned activity. + */ + private org.ccsds.moims.mo.mal.structures.NamedValueList returnData; + + /** + * StatusInfo provides the reason for entering the Terminated State and is + * customizable, but if the following conditions exist then the specified + * text shall be used: - Completed (nominal); - Expired (prior to Activation + * or during plan Suspension); - Deleted; - Failed (see ErrorCode/ErrorInfo). + */ + private String statusInfo; + + /** + * Error Code optional in the case of a failure status for the planning activity + * (for example Terminated state with statusInfo Failed). The codes are implementation + * specific. + */ + private Integer errorCode; + + /** + * Supplementary Error Information. + */ + private String errorInfo; + + /** + * Default constructor for ActivityInstance. + * + */ + public ActivityInstance() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param objectIdentity The identity of the MO Object. + * @param definition Reference to the ActivityDefinition. + * @param source Object Type: RequestInstance | ActivityInstance | PlanningUser Reference to the source of the ActivityInstance, which is either its parent ActivityInstance, a RequestInstance if it is a root Activity, or a PlanningUser if directly inserted. + * @param relatedEvent Optional reference to an EventInstance that is specifically associated with this instance of the Activity. Typically, the Activity is placed in response to the Event. + * @param children References to any child ActivityInstances. + * @param comments Any notes associated with this instance of the Activity. + * @param constraints A single constraint or a constraint node that may contain multiple constraints, applicable to this instance of the Activity. + * @param effects Set of Effects applicable to this instance of the Activity. + * @param arguments Argument values for each Argument defined in the Activity Definition. + * @param start Optionally specifies the trigger that initiates the Activity: may be time, position or event based. + * @param end Optionally specifies the trigger that ends the Activity. + * @param duration Optional duration of the Activity (estimated until execution, actual post execution). + * @param subPlan Optional association of the Activity with a defined sub-plan. + * @param tags Set of Tags that may be used to associate the Activity with others, grouping activities by operational responsibility (controller/group/system) or other criteria. + * @param status Current Status of the Activity Instance (see Activity State Model in 4.5.2.2). + * @param executionInstance Reference to the instance of an executable body for the Activity (procedure, action sequence, etc.). The manner in which this reference is interpreted is implementation specific. + * @param returnData Optional return data from the planning process, provided as a list of ID-Value pairs. This can be used to provide additional information required by the User to interpret the planned activity. + * @param statusInfo StatusInfo provides the reason for entering the Terminated State and is customizable, but if the following conditions exist then the specified text shall be used: - Completed (nominal); - Expired (prior to Activation or during plan Suspension); - Deleted; - Failed (see ErrorCode/ErrorInfo). + * @param errorCode Error Code optional in the case of a failure status for the planning activity (for example Terminated state with statusInfo Failed). The codes are implementation specific. + * @param errorInfo Supplementary Error Information. + */ + public ActivityInstance(org.ccsds.moims.mo.mal.structures.ObjectIdentity objectIdentity, + org.ccsds.moims.mo.mal.structures.ObjectRef definition, + org.ccsds.moims.mo.mal.structures.ObjectRef source, + org.ccsds.moims.mo.mal.structures.ObjectRef relatedEvent, + org.ccsds.moims.mo.mal.structures.ObjectRefList children, + String comments, + org.ccsds.moims.mo.mps.structures.Constraint constraints, + org.ccsds.moims.mo.mps.structures.EffectList effects, + org.ccsds.moims.mo.mps.structures.ArgumentList arguments, + org.ccsds.moims.mo.mps.structures.Trigger start, + org.ccsds.moims.mo.mps.structures.Trigger end, + org.ccsds.moims.mo.mal.structures.Duration duration, + org.ccsds.moims.mo.mal.structures.Identifier subPlan, + org.ccsds.moims.mo.mal.structures.StringList tags, + org.ccsds.moims.mo.mps.structures.ActivityStatusEnum status, + org.ccsds.moims.mo.mal.structures.Identifier executionInstance, + org.ccsds.moims.mo.mal.structures.NamedValueList returnData, + String statusInfo, + Integer errorCode, + String errorInfo) { + super(objectIdentity); + this.definition = definition; + this.source = source; + this.relatedEvent = relatedEvent; + this.children = children; + this.comments = comments; + this.constraints = constraints; + this.effects = effects; + this.arguments = arguments; + this.start = start; + this.end = end; + this.duration = duration; + this.subPlan = subPlan; + this.tags = tags; + this.status = status; + this.executionInstance = executionInstance; + this.returnData = returnData; + this.statusInfo = statusInfo; + this.errorCode = errorCode; + this.errorInfo = errorInfo; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param objectIdentity The identity of the MO Object. + * @param definition Reference to the ActivityDefinition. + * @param source Object Type: RequestInstance | ActivityInstance | PlanningUser Reference to the source of the ActivityInstance, which is either its parent ActivityInstance, a RequestInstance if it is a root Activity, or a PlanningUser if directly inserted. + * @param status Current Status of the Activity Instance (see Activity State Model in 4.5.2.2). + */ + public ActivityInstance(org.ccsds.moims.mo.mal.structures.ObjectIdentity objectIdentity, + org.ccsds.moims.mo.mal.structures.ObjectRef definition, + org.ccsds.moims.mo.mal.structures.ObjectRef source, + org.ccsds.moims.mo.mps.structures.ActivityStatusEnum status) { + super(objectIdentity); + this.definition = definition; + this.source = source; + this.relatedEvent = null; + this.children = null; + this.comments = null; + this.constraints = null; + this.effects = null; + this.arguments = null; + this.start = null; + this.end = null; + this.duration = null; + this.subPlan = null; + this.tags = null; + this.status = status; + this.executionInstance = null; + this.returnData = null; + this.statusInfo = null; + this.errorCode = null; + this.errorInfo = null; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.ActivityInstance(); + } + + /** + * Returns the field definition. + * + * @return The field definition + */ + public org.ccsds.moims.mo.mal.structures.ObjectRef getDefinition() { + return definition; + } + + /** + * Returns the field source. + * + * @return The field source + */ + public org.ccsds.moims.mo.mal.structures.ObjectRef getSource() { + return source; + } + + /** + * Returns the field relatedEvent. + * + * @return The field relatedEvent + */ + public org.ccsds.moims.mo.mal.structures.ObjectRef getRelatedEvent() { + return relatedEvent; + } + + /** + * Returns the field children. + * + * @return The field children + */ + public org.ccsds.moims.mo.mal.structures.ObjectRefList getChildren() { + return children; + } + + /** + * Returns the field comments. + * + * @return The field comments + */ + public String getComments() { + return comments; + } + + /** + * Returns the field constraints. + * + * @return The field constraints + */ + public org.ccsds.moims.mo.mps.structures.Constraint getConstraints() { + return constraints; + } + + /** + * Returns the field effects. + * + * @return The field effects + */ + public org.ccsds.moims.mo.mps.structures.EffectList getEffects() { + return effects; + } + + /** + * Returns the field arguments. + * + * @return The field arguments + */ + public org.ccsds.moims.mo.mps.structures.ArgumentList getArguments() { + return arguments; + } + + /** + * Returns the field start. + * + * @return The field start + */ + public org.ccsds.moims.mo.mps.structures.Trigger getStart() { + return start; + } + + /** + * Returns the field end. + * + * @return The field end + */ + public org.ccsds.moims.mo.mps.structures.Trigger getEnd() { + return end; + } + + /** + * Returns the field duration. + * + * @return The field duration + */ + public org.ccsds.moims.mo.mal.structures.Duration getDuration() { + return duration; + } + + /** + * Returns the field subPlan. + * + * @return The field subPlan + */ + public org.ccsds.moims.mo.mal.structures.Identifier getSubPlan() { + return subPlan; + } + + /** + * Returns the field tags. + * + * @return The field tags + */ + public org.ccsds.moims.mo.mal.structures.StringList getTags() { + return tags; + } + + /** + * Returns the field status. + * + * @return The field status + */ + public org.ccsds.moims.mo.mps.structures.ActivityStatusEnum getStatus() { + return status; + } + + /** + * Returns the field executionInstance. + * + * @return The field executionInstance + */ + public org.ccsds.moims.mo.mal.structures.Identifier getExecutionInstance() { + return executionInstance; + } + + /** + * Returns the field returnData. + * + * @return The field returnData + */ + public org.ccsds.moims.mo.mal.structures.NamedValueList getReturnData() { + return returnData; + } + + /** + * Returns the field statusInfo. + * + * @return The field statusInfo + */ + public String getStatusInfo() { + return statusInfo; + } + + /** + * Returns the field errorCode. + * + * @return The field errorCode + */ + public Integer getErrorCode() { + return errorCode; + } + + /** + * Returns the field errorInfo. + * + * @return The field errorInfo + */ + public String getErrorInfo() { + return errorInfo; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ActivityInstance) { + if (! super.equals(obj)) { + return false; + } + ActivityInstance other = (ActivityInstance) obj; + if (definition == null) { + if (other.definition != null) { + return false; + } + } else { + if (! definition.equals(other.definition)) { + return false; + } + } + if (source == null) { + if (other.source != null) { + return false; + } + } else { + if (! source.equals(other.source)) { + return false; + } + } + if (relatedEvent == null) { + if (other.relatedEvent != null) { + return false; + } + } else { + if (! relatedEvent.equals(other.relatedEvent)) { + return false; + } + } + if (children == null) { + if (other.children != null) { + return false; + } + } else { + if (! children.equals(other.children)) { + return false; + } + } + if (comments == null) { + if (other.comments != null) { + return false; + } + } else { + if (! comments.equals(other.comments)) { + return false; + } + } + if (constraints == null) { + if (other.constraints != null) { + return false; + } + } else { + if (! constraints.equals(other.constraints)) { + return false; + } + } + if (effects == null) { + if (other.effects != null) { + return false; + } + } else { + if (! effects.equals(other.effects)) { + return false; + } + } + if (arguments == null) { + if (other.arguments != null) { + return false; + } + } else { + if (! arguments.equals(other.arguments)) { + return false; + } + } + if (start == null) { + if (other.start != null) { + return false; + } + } else { + if (! start.equals(other.start)) { + return false; + } + } + if (end == null) { + if (other.end != null) { + return false; + } + } else { + if (! end.equals(other.end)) { + return false; + } + } + if (duration == null) { + if (other.duration != null) { + return false; + } + } else { + if (! duration.equals(other.duration)) { + return false; + } + } + if (subPlan == null) { + if (other.subPlan != null) { + return false; + } + } else { + if (! subPlan.equals(other.subPlan)) { + return false; + } + } + if (tags == null) { + if (other.tags != null) { + return false; + } + } else { + if (! tags.equals(other.tags)) { + return false; + } + } + if (status == null) { + if (other.status != null) { + return false; + } + } else { + if (! status.equals(other.status)) { + return false; + } + } + if (executionInstance == null) { + if (other.executionInstance != null) { + return false; + } + } else { + if (! executionInstance.equals(other.executionInstance)) { + return false; + } + } + if (returnData == null) { + if (other.returnData != null) { + return false; + } + } else { + if (! returnData.equals(other.returnData)) { + return false; + } + } + if (statusInfo == null) { + if (other.statusInfo != null) { + return false; + } + } else { + if (! statusInfo.equals(other.statusInfo)) { + return false; + } + } + if (errorCode == null) { + if (other.errorCode != null) { + return false; + } + } else { + if (! errorCode.equals(other.errorCode)) { + return false; + } + } + if (errorInfo == null) { + if (other.errorInfo != null) { + return false; + } + } else { + if (! errorInfo.equals(other.errorInfo)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = super.hashCode(); + hash = 83 * hash + (definition != null ? definition.hashCode() : 0); + hash = 83 * hash + (source != null ? source.hashCode() : 0); + hash = 83 * hash + (relatedEvent != null ? relatedEvent.hashCode() : 0); + hash = 83 * hash + (children != null ? children.hashCode() : 0); + hash = 83 * hash + (comments != null ? comments.hashCode() : 0); + hash = 83 * hash + (constraints != null ? constraints.hashCode() : 0); + hash = 83 * hash + (effects != null ? effects.hashCode() : 0); + hash = 83 * hash + (arguments != null ? arguments.hashCode() : 0); + hash = 83 * hash + (start != null ? start.hashCode() : 0); + hash = 83 * hash + (end != null ? end.hashCode() : 0); + hash = 83 * hash + (duration != null ? duration.hashCode() : 0); + hash = 83 * hash + (subPlan != null ? subPlan.hashCode() : 0); + hash = 83 * hash + (tags != null ? tags.hashCode() : 0); + hash = 83 * hash + (status != null ? status.hashCode() : 0); + hash = 83 * hash + (executionInstance != null ? executionInstance.hashCode() : 0); + hash = 83 * hash + (returnData != null ? returnData.hashCode() : 0); + hash = 83 * hash + (statusInfo != null ? statusInfo.hashCode() : 0); + hash = 83 * hash + (errorCode != null ? errorCode.hashCode() : 0); + hash = 83 * hash + (errorInfo != null ? errorInfo.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(ActivityInstance: "); + buf.append(super.toString()); + buf.append(", definition=").append(definition); + buf.append(", source=").append(source); + buf.append(", relatedEvent=").append(relatedEvent); + buf.append(", children=").append(children); + buf.append(", comments=").append(comments); + buf.append(", constraints=").append(constraints); + buf.append(", effects=").append(effects); + buf.append(", arguments=").append(arguments); + buf.append(", start=").append(start); + buf.append(", end=").append(end); + buf.append(", duration=").append(duration); + buf.append(", subPlan=").append(subPlan); + buf.append(", tags=").append(tags); + buf.append(", status=").append(status); + buf.append(", executionInstance=").append(executionInstance); + buf.append(", returnData=").append(returnData); + buf.append(", statusInfo=").append(statusInfo); + buf.append(", errorCode=").append(errorCode); + buf.append(", errorInfo=").append(errorInfo); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + super.encode(encoder); + if (definition == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'definition' cannot be null!"); + } + if (source == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'source' cannot be null!"); + } + if (status == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'status' cannot be null!"); + } + encoder.encodeElement(definition); + encoder.encodeAbstractElement(source); + encoder.encodeNullableElement(relatedEvent); + encoder.encodeNullableElement(children); + encoder.encodeNullableString(comments); + encoder.encodeNullableAbstractElement(constraints); + encoder.encodeNullableElement(effects); + encoder.encodeNullableElement(arguments); + encoder.encodeNullableAbstractElement(start); + encoder.encodeNullableAbstractElement(end); + encoder.encodeNullableDuration(duration); + encoder.encodeNullableIdentifier(subPlan); + encoder.encodeNullableElement(tags); + encoder.encodeElement(status); + encoder.encodeNullableIdentifier(executionInstance); + encoder.encodeNullableElement(returnData); + encoder.encodeNullableString(statusInfo); + encoder.encodeNullableInteger(errorCode); + encoder.encodeNullableString(errorInfo); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + super.decode(decoder); + definition = (org.ccsds.moims.mo.mal.structures.ObjectRef) decoder.decodeElement(new org.ccsds.moims.mo.mal.structures.ObjectRef()); + source = (org.ccsds.moims.mo.mal.structures.ObjectRef) decoder.decodeAbstractElement(); + relatedEvent = (org.ccsds.moims.mo.mal.structures.ObjectRef) decoder.decodeNullableElement(new org.ccsds.moims.mo.mal.structures.ObjectRef()); + children = (org.ccsds.moims.mo.mal.structures.ObjectRefList) decoder.decodeNullableElement(new org.ccsds.moims.mo.mal.structures.ObjectRefList()); + comments = decoder.decodeNullableString(); + constraints = (org.ccsds.moims.mo.mps.structures.Constraint) decoder.decodeNullableAbstractElement(); + effects = (org.ccsds.moims.mo.mps.structures.EffectList) decoder.decodeNullableElement(new org.ccsds.moims.mo.mps.structures.EffectList()); + arguments = (org.ccsds.moims.mo.mps.structures.ArgumentList) decoder.decodeNullableElement(new org.ccsds.moims.mo.mps.structures.ArgumentList()); + start = (org.ccsds.moims.mo.mps.structures.Trigger) decoder.decodeNullableAbstractElement(); + end = (org.ccsds.moims.mo.mps.structures.Trigger) decoder.decodeNullableAbstractElement(); + duration = decoder.decodeNullableDuration(); + subPlan = decoder.decodeNullableIdentifier(); + tags = (org.ccsds.moims.mo.mal.structures.StringList) decoder.decodeNullableElement(new org.ccsds.moims.mo.mal.structures.StringList()); + status = (org.ccsds.moims.mo.mps.structures.ActivityStatusEnum) decoder.decodeElement(org.ccsds.moims.mo.mps.structures.ActivityStatusEnum.PLANNED); + executionInstance = decoder.decodeNullableIdentifier(); + returnData = (org.ccsds.moims.mo.mal.structures.NamedValueList) decoder.decodeNullableElement(new org.ccsds.moims.mo.mal.structures.NamedValueList()); + statusInfo = decoder.decodeNullableString(); + errorCode = decoder.decodeNullableInteger(); + errorInfo = decoder.decodeNullableString(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ActivityInstanceList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ActivityInstanceList.java new file mode 100644 index 00000000..25f68615 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ActivityInstanceList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for ActivityInstance. + */ +public final class ActivityInstanceList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107610L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107610L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for ActivityInstanceList. + * + */ + public ActivityInstanceList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public ActivityInstanceList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public ActivityInstanceList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.ActivityInstance element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.ActivityInstance element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new ActivityInstanceList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.ActivityInstance(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ActivityNode.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ActivityNode.java new file mode 100644 index 00000000..184da328 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ActivityNode.java @@ -0,0 +1,153 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E1: A concrete sub-type of ActivityDetails, an ActivityNode is a container + * node for a set of ActivityDetails together with an optional Repetition + * specification. + */ +public final class ActivityNode extends org.ccsds.moims.mo.mps.structures.ActivityDetails { + + private static final long serialVersionUID = 1407374900330600L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330600L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Optional Repetition specification. + */ + private org.ccsds.moims.mo.mps.structures.Repetition repetition; + + /** + * Set of ActivityDetails. + */ + private org.ccsds.moims.mo.mps.structures.ActivityDetailsList activities; + + /** + * Default constructor for ActivityNode. + * + */ + public ActivityNode() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param activityRef Specifies how the ActivityInstance is placed with respect to any defined Repetition (0=Start; 1=End). Default is Start. + * @param activityOffset Specifies an offset in time for the ActivityInstance from any defined Repetition. Default is no offset. + * @param relatedEvent Specifies a related Event (or Event Group) for the ActivityInstance. Argument specifications and constraints may reference arguments and fields of the RelatedEvent. + * @param comments Any notes associated with the ActivityDetails. + * @param repetition Optional Repetition specification. + * @param activities Set of ActivityDetails. + */ + public ActivityNode(org.ccsds.moims.mo.mps.structures.Slider activityRef, + org.ccsds.moims.mo.mal.structures.Element activityOffset, + org.ccsds.moims.mo.mal.structures.Element relatedEvent, + String comments, + org.ccsds.moims.mo.mps.structures.Repetition repetition, + org.ccsds.moims.mo.mps.structures.ActivityDetailsList activities) { + super(activityRef, + activityOffset, + relatedEvent, + comments); + this.repetition = repetition; + this.activities = activities; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.ActivityNode(); + } + + /** + * Returns the field repetition. + * + * @return The field repetition + */ + public org.ccsds.moims.mo.mps.structures.Repetition getRepetition() { + return repetition; + } + + /** + * Returns the field activities. + * + * @return The field activities + */ + public org.ccsds.moims.mo.mps.structures.ActivityDetailsList getActivities() { + return activities; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ActivityNode) { + if (! super.equals(obj)) { + return false; + } + ActivityNode other = (ActivityNode) obj; + if (repetition == null) { + if (other.repetition != null) { + return false; + } + } else { + if (! repetition.equals(other.repetition)) { + return false; + } + } + if (activities == null) { + if (other.activities != null) { + return false; + } + } else { + if (! activities.equals(other.activities)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = super.hashCode(); + hash = 83 * hash + (repetition != null ? repetition.hashCode() : 0); + hash = 83 * hash + (activities != null ? activities.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(ActivityNode: "); + buf.append(super.toString()); + buf.append(", repetition=").append(repetition); + buf.append(", activities=").append(activities); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + super.encode(encoder); + encoder.encodeNullableAbstractElement(repetition); + encoder.encodeNullableElement(activities); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + super.decode(decoder); + repetition = (org.ccsds.moims.mo.mps.structures.Repetition) decoder.decodeNullableAbstractElement(); + activities = (org.ccsds.moims.mo.mps.structures.ActivityDetailsList) decoder.decodeNullableElement(new org.ccsds.moims.mo.mps.structures.ActivityDetailsList()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ActivityNodeList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ActivityNodeList.java new file mode 100644 index 00000000..51bd08ac --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ActivityNodeList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for ActivityNode. + */ +public final class ActivityNodeList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107608L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107608L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for ActivityNodeList. + * + */ + public ActivityNodeList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public ActivityNodeList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public ActivityNodeList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.ActivityNode element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.ActivityNode element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new ActivityNodeList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.ActivityNode(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ActivityStatusEnum.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ActivityStatusEnum.java new file mode 100644 index 00000000..efc2bb8f --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ActivityStatusEnum.java @@ -0,0 +1,166 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * Enumeration class for ActivityStatusEnum. + */ +public final class ActivityStatusEnum extends org.ccsds.moims.mo.mal.structures.Enumeration { + + private static final long serialVersionUID = 1407374900330599L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330599L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Enumeration value for PLANNED. + */ + public static final int PLANNED_VALUE = 1; + + /** + * Enumeration singleton for value PLANNED. + */ + public static final org.ccsds.moims.mo.mps.structures.ActivityStatusEnum PLANNED = new org.ccsds.moims.mo.mps.structures.ActivityStatusEnum(org.ccsds.moims.mo.mps.structures.ActivityStatusEnum.PLANNED_VALUE); + + /** + * Enumeration value for ACTIVATED. + */ + public static final int ACTIVATED_VALUE = 2; + + /** + * Enumeration singleton for value ACTIVATED. + */ + public static final org.ccsds.moims.mo.mps.structures.ActivityStatusEnum ACTIVATED = new org.ccsds.moims.mo.mps.structures.ActivityStatusEnum(org.ccsds.moims.mo.mps.structures.ActivityStatusEnum.ACTIVATED_VALUE); + + /** + * Enumeration value for EXECUTING. + */ + public static final int EXECUTING_VALUE = 3; + + /** + * Enumeration singleton for value EXECUTING. + */ + public static final org.ccsds.moims.mo.mps.structures.ActivityStatusEnum EXECUTING = new org.ccsds.moims.mo.mps.structures.ActivityStatusEnum(org.ccsds.moims.mo.mps.structures.ActivityStatusEnum.EXECUTING_VALUE); + + /** + * Enumeration value for SUSPENDED. + */ + public static final int SUSPENDED_VALUE = 4; + + /** + * Enumeration singleton for value SUSPENDED. + */ + public static final org.ccsds.moims.mo.mps.structures.ActivityStatusEnum SUSPENDED = new org.ccsds.moims.mo.mps.structures.ActivityStatusEnum(org.ccsds.moims.mo.mps.structures.ActivityStatusEnum.SUSPENDED_VALUE); + + /** + * Enumeration value for TERMINATED. + */ + public static final int TERMINATED_VALUE = 5; + + /** + * Enumeration singleton for value TERMINATED. + */ + public static final org.ccsds.moims.mo.mps.structures.ActivityStatusEnum TERMINATED = new org.ccsds.moims.mo.mps.structures.ActivityStatusEnum(org.ccsds.moims.mo.mps.structures.ActivityStatusEnum.TERMINATED_VALUE); + + /** + * Set of enumeration instances. + */ + private static final org.ccsds.moims.mo.mps.structures.ActivityStatusEnum[] _ENUMERATIONS = { + PLANNED, ACTIVATED, EXECUTING, SUSPENDED, TERMINATED}; + + /** + * E1: An ActivityStatusEnum represents the set of states possible for an ActivityInstance. + */ + public ActivityStatusEnum() { + super(-1); + } + + /** + * E1: An ActivityStatusEnum represents the set of states possible for an + * ActivityInstance. + * + * @param value The value of the Enumeration. + */ + public ActivityStatusEnum(int value) { + super(value); + } + + @Override + public String toString() { + switch (getValue()) { + case PLANNED_VALUE: + return "PLANNED"; + case ACTIVATED_VALUE: + return "ACTIVATED"; + case EXECUTING_VALUE: + return "EXECUTING"; + case SUSPENDED_VALUE: + return "SUSPENDED"; + case TERMINATED_VALUE: + return "TERMINATED"; + default: + throw new RuntimeException("Unknown ordinal!"); + } + } + + /** + * Returns the enumeration element represented by the supplied string, or + * null if not matched. + * + * @param s s The string to search for. + * @return The matched enumeration element, or null if not matched. + */ + public static org.ccsds.moims.mo.mps.structures.ActivityStatusEnum fromString(String s) { + switch (s) { + case "PLANNED": + return ActivityStatusEnum.PLANNED; + case "ACTIVATED": + return ActivityStatusEnum.ACTIVATED; + case "EXECUTING": + return ActivityStatusEnum.EXECUTING; + case "SUSPENDED": + return ActivityStatusEnum.SUSPENDED; + case "TERMINATED": + return ActivityStatusEnum.TERMINATED; + default: + throw new RuntimeException("Unknown Enumeration for the provided string: " + s); + } + } + + @Override + public org.ccsds.moims.mo.mal.structures.Enumeration fromValue(Integer value) { + switch (value) { + case PLANNED_VALUE: + return ActivityStatusEnum.PLANNED; + case ACTIVATED_VALUE: + return ActivityStatusEnum.ACTIVATED; + case EXECUTING_VALUE: + return ActivityStatusEnum.EXECUTING; + case SUSPENDED_VALUE: + return ActivityStatusEnum.SUSPENDED; + case TERMINATED_VALUE: + return ActivityStatusEnum.TERMINATED; + default: + throw new RuntimeException("Unknown Enumeration for the provided value: " + value); + } + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return _ENUMERATIONS[0]; + } + + @Override + public int getEnumSize() { + return 5; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ActivityStatusEnumList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ActivityStatusEnumList.java new file mode 100644 index 00000000..619d9ac7 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ActivityStatusEnumList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for ActivityStatusEnum. + */ +public final class ActivityStatusEnumList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107609L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107609L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for ActivityStatusEnumList. + * + */ + public ActivityStatusEnumList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public ActivityStatusEnumList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public ActivityStatusEnumList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.ActivityStatusEnum element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.ActivityStatusEnum element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new ActivityStatusEnumList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return org.ccsds.moims.mo.mps.structures.ActivityStatusEnum.PLANNED; + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ActivitySuspensionStatus.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ActivitySuspensionStatus.java new file mode 100644 index 00000000..9a37eb16 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ActivitySuspensionStatus.java @@ -0,0 +1,217 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E1: A data structure that returns the status and supplementary suspension + * information for an ActivityInstance affected by an MPS Plan Execution Control + * service suspendActivity or resumeActivity operation. + */ +public final class ActivitySuspensionStatus implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1407374900330604L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330604L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Reference to an ActivityInstance. + */ + private org.ccsds.moims.mo.mal.structures.ObjectRef activityInstance; + + /** + * Optional reference to the Plan containing the ActivityInstance. + */ + private org.ccsds.moims.mo.mal.structures.ObjectRef plan; + + /** + * Current Status of the ActivityInstance. + */ + private org.ccsds.moims.mo.mps.structures.ActivityStatusEnum status; + + /** + * Supplementary information on the suspension/resumption status of the ActivityInstance. + * This may detail the point of suspension, which may be specific to the suspension + * mode; or a reason why resumption was not possible. + */ + private String suspensionInfo; + + /** + * Default constructor for ActivitySuspensionStatus. + * + */ + public ActivitySuspensionStatus() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param activityInstance Reference to an ActivityInstance. + * @param plan Optional reference to the Plan containing the ActivityInstance. + * @param status Current Status of the ActivityInstance. + * @param suspensionInfo Supplementary information on the suspension/resumption status of the ActivityInstance. This may detail the point of suspension, which may be specific to the suspension mode; or a reason why resumption was not possible. + */ + public ActivitySuspensionStatus(org.ccsds.moims.mo.mal.structures.ObjectRef activityInstance, + org.ccsds.moims.mo.mal.structures.ObjectRef plan, + org.ccsds.moims.mo.mps.structures.ActivityStatusEnum status, + String suspensionInfo) { + this.activityInstance = activityInstance; + this.plan = plan; + this.status = status; + this.suspensionInfo = suspensionInfo; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param activityInstance Reference to an ActivityInstance. + * @param status Current Status of the ActivityInstance. + */ + public ActivitySuspensionStatus(org.ccsds.moims.mo.mal.structures.ObjectRef activityInstance, + org.ccsds.moims.mo.mps.structures.ActivityStatusEnum status) { + this.activityInstance = activityInstance; + this.plan = null; + this.status = status; + this.suspensionInfo = null; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.ActivitySuspensionStatus(); + } + + /** + * Returns the field activityInstance. + * + * @return The field activityInstance + */ + public org.ccsds.moims.mo.mal.structures.ObjectRef getActivityInstance() { + return activityInstance; + } + + /** + * Returns the field plan. + * + * @return The field plan + */ + public org.ccsds.moims.mo.mal.structures.ObjectRef getPlan() { + return plan; + } + + /** + * Returns the field status. + * + * @return The field status + */ + public org.ccsds.moims.mo.mps.structures.ActivityStatusEnum getStatus() { + return status; + } + + /** + * Returns the field suspensionInfo. + * + * @return The field suspensionInfo + */ + public String getSuspensionInfo() { + return suspensionInfo; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ActivitySuspensionStatus) { + ActivitySuspensionStatus other = (ActivitySuspensionStatus) obj; + if (activityInstance == null) { + if (other.activityInstance != null) { + return false; + } + } else { + if (! activityInstance.equals(other.activityInstance)) { + return false; + } + } + if (plan == null) { + if (other.plan != null) { + return false; + } + } else { + if (! plan.equals(other.plan)) { + return false; + } + } + if (status == null) { + if (other.status != null) { + return false; + } + } else { + if (! status.equals(other.status)) { + return false; + } + } + if (suspensionInfo == null) { + if (other.suspensionInfo != null) { + return false; + } + } else { + if (! suspensionInfo.equals(other.suspensionInfo)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (activityInstance != null ? activityInstance.hashCode() : 0); + hash = 83 * hash + (plan != null ? plan.hashCode() : 0); + hash = 83 * hash + (status != null ? status.hashCode() : 0); + hash = 83 * hash + (suspensionInfo != null ? suspensionInfo.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(ActivitySuspensionStatus: "); + buf.append("activityInstance=").append(activityInstance); + buf.append(", plan=").append(plan); + buf.append(", status=").append(status); + buf.append(", suspensionInfo=").append(suspensionInfo); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (activityInstance == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'activityInstance' cannot be null!"); + } + if (status == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'status' cannot be null!"); + } + encoder.encodeElement(activityInstance); + encoder.encodeNullableElement(plan); + encoder.encodeElement(status); + encoder.encodeNullableString(suspensionInfo); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + activityInstance = (org.ccsds.moims.mo.mal.structures.ObjectRef) decoder.decodeElement(new org.ccsds.moims.mo.mal.structures.ObjectRef()); + plan = (org.ccsds.moims.mo.mal.structures.ObjectRef) decoder.decodeNullableElement(new org.ccsds.moims.mo.mal.structures.ObjectRef()); + status = (org.ccsds.moims.mo.mps.structures.ActivityStatusEnum) decoder.decodeElement(org.ccsds.moims.mo.mps.structures.ActivityStatusEnum.PLANNED); + suspensionInfo = decoder.decodeNullableString(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ActivitySuspensionStatusList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ActivitySuspensionStatusList.java new file mode 100644 index 00000000..eceeec22 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ActivitySuspensionStatusList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for ActivitySuspensionStatus. + */ +public final class ActivitySuspensionStatusList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107604L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107604L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for ActivitySuspensionStatusList. + * + */ + public ActivitySuspensionStatusList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public ActivitySuspensionStatusList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public ActivitySuspensionStatusList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.ActivitySuspensionStatus element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.ActivitySuspensionStatus element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new ActivitySuspensionStatusList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.ActivitySuspensionStatus(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ActivityUpdate.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ActivityUpdate.java new file mode 100644 index 00000000..60cb3f4d --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ActivityUpdate.java @@ -0,0 +1,583 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E1: ActivityUpdate is a data structure that is used to report the dynamic + * status of an ActivityInstance in the context of the MPS Plan Execution + * Control service monitorPlanExecutionDetail and getActivityStatus operations. + * ActivityUpdates may be distributed to subscribing applications, including + * status displays, to inform them of the latest status of the activity. + * This may be particularly relevant in conjunction with a plan execution + * function. ActivityUpdates may be stored in activity history to provide + * a complete record of evolving status over time. + */ +public final class ActivityUpdate extends org.ccsds.moims.mo.mps.structures.PlanDetailUpdate { + + private static final long serialVersionUID = 1407374900330602L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330602L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Reference to the ActivityInstance to which the status update relates. + */ + private org.ccsds.moims.mo.mal.structures.ObjectRef activityInstance; + + /** + * Time of status update. Only nullable in the context of an updateActivity + * operation: the timestamp must be provided when reporting ActivityInstance + * status. + */ + private org.ccsds.moims.mo.mal.structures.Time timestamp; + + /** + * Optional reference to the Plan containing the ActivityInstance to which + * this update pertains. + */ + private org.ccsds.moims.mo.mal.structures.ObjectRef plan; + + /** + * Argument values. + */ + private org.ccsds.moims.mo.mps.structures.ArgumentList arguments; + + /** + * Optionally specifies the trigger that initiates the ActivityInstance: may + * be time, position, or event based. + */ + private org.ccsds.moims.mo.mps.structures.Trigger start; + + /** + * Optionally specifies the trigger that ends the ActivityInstance. + */ + private org.ccsds.moims.mo.mps.structures.Trigger end; + + /** + * Optional duration of the ActivityInstance (estimated until execution, actual + * post execution). + */ + private org.ccsds.moims.mo.mal.structures.Duration duration; + + /** + * Optional association of the ActivityInstance with a defined sub-plan. + */ + private org.ccsds.moims.mo.mal.structures.Identifier subPlan; + + /** + * Set of tags that may be used to associate the ActivityInstance with an + * identified subset of the Plan, grouping activities by operational responsibility + * (controller/group/system) or other criteria. + */ + private org.ccsds.moims.mo.mal.structures.StringList tags; + + /** + * Current status of the ActivityInstance. + */ + private org.ccsds.moims.mo.mps.structures.ActivityStatusEnum status; + + /** + * Reference to the instance of an executable body for the ActivityInstance + * (procedure, action sequence, etc.). The manner in which this reference + * is interpreted is implementation specific. + */ + private org.ccsds.moims.mo.mal.structures.Identifier executionInstance; + + /** + * Optional return data from the planning process, provided as a list of ID-Value + * pairs. This can be used to provide additional information required by + * the User to interpret the planned activity. + */ + private org.ccsds.moims.mo.mal.structures.NamedValueList returnData; + + /** + * StatusInfo provides the reason for entering the Terminated State and is + * customizable, but if the following conditions exist then the specified + * text shall be used: - Completed (nominal); - Expired (prior to Activation + * or during plan Suspension); - Deleted; - Failed (see ErrorCode/ErrorInfo). + */ + private String statusInfo; + + /** + * Error Code optional in the case of a failure status for the planning activity + * (for example Terminated state with statusInfo Failed). The codes are implementation + * specific. + */ + private Integer errorCode; + + /** + * Supplementary error information. + */ + private String errorInfo; + + /** + * Default constructor for ActivityUpdate. + * + */ + public ActivityUpdate() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param activityInstance Reference to the ActivityInstance to which the status update relates. + * @param timestamp Time of status update. Only nullable in the context of an updateActivity operation: the timestamp must be provided when reporting ActivityInstance status. + * @param plan Optional reference to the Plan containing the ActivityInstance to which this update pertains. + * @param arguments Argument values. + * @param start Optionally specifies the trigger that initiates the ActivityInstance: may be time, position, or event based. + * @param end Optionally specifies the trigger that ends the ActivityInstance. + * @param duration Optional duration of the ActivityInstance (estimated until execution, actual post execution). + * @param subPlan Optional association of the ActivityInstance with a defined sub-plan. + * @param tags Set of tags that may be used to associate the ActivityInstance with an identified subset of the Plan, grouping activities by operational responsibility (controller/group/system) or other criteria. + * @param status Current status of the ActivityInstance. + * @param executionInstance Reference to the instance of an executable body for the ActivityInstance (procedure, action sequence, etc.). The manner in which this reference is interpreted is implementation specific. + * @param returnData Optional return data from the planning process, provided as a list of ID-Value pairs. This can be used to provide additional information required by the User to interpret the planned activity. + * @param statusInfo StatusInfo provides the reason for entering the Terminated State and is customizable, but if the following conditions exist then the specified text shall be used: - Completed (nominal); - Expired (prior to Activation or during plan Suspension); - Deleted; - Failed (see ErrorCode/ErrorInfo). + * @param errorCode Error Code optional in the case of a failure status for the planning activity (for example Terminated state with statusInfo Failed). The codes are implementation specific. + * @param errorInfo Supplementary error information. + */ + public ActivityUpdate(org.ccsds.moims.mo.mal.structures.ObjectRef activityInstance, + org.ccsds.moims.mo.mal.structures.Time timestamp, + org.ccsds.moims.mo.mal.structures.ObjectRef plan, + org.ccsds.moims.mo.mps.structures.ArgumentList arguments, + org.ccsds.moims.mo.mps.structures.Trigger start, + org.ccsds.moims.mo.mps.structures.Trigger end, + org.ccsds.moims.mo.mal.structures.Duration duration, + org.ccsds.moims.mo.mal.structures.Identifier subPlan, + org.ccsds.moims.mo.mal.structures.StringList tags, + org.ccsds.moims.mo.mps.structures.ActivityStatusEnum status, + org.ccsds.moims.mo.mal.structures.Identifier executionInstance, + org.ccsds.moims.mo.mal.structures.NamedValueList returnData, + String statusInfo, + Integer errorCode, + String errorInfo) { + this.activityInstance = activityInstance; + this.timestamp = timestamp; + this.plan = plan; + this.arguments = arguments; + this.start = start; + this.end = end; + this.duration = duration; + this.subPlan = subPlan; + this.tags = tags; + this.status = status; + this.executionInstance = executionInstance; + this.returnData = returnData; + this.statusInfo = statusInfo; + this.errorCode = errorCode; + this.errorInfo = errorInfo; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param activityInstance Reference to the ActivityInstance to which the status update relates. + * @param status Current status of the ActivityInstance. + */ + public ActivityUpdate(org.ccsds.moims.mo.mal.structures.ObjectRef activityInstance, + org.ccsds.moims.mo.mps.structures.ActivityStatusEnum status) { + this.activityInstance = activityInstance; + this.timestamp = null; + this.plan = null; + this.arguments = null; + this.start = null; + this.end = null; + this.duration = null; + this.subPlan = null; + this.tags = null; + this.status = status; + this.executionInstance = null; + this.returnData = null; + this.statusInfo = null; + this.errorCode = null; + this.errorInfo = null; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.ActivityUpdate(); + } + + /** + * Returns the field activityInstance. + * + * @return The field activityInstance + */ + public org.ccsds.moims.mo.mal.structures.ObjectRef getActivityInstance() { + return activityInstance; + } + + /** + * Returns the field timestamp. + * + * @return The field timestamp + */ + public org.ccsds.moims.mo.mal.structures.Time getTimestamp() { + return timestamp; + } + + /** + * Returns the field plan. + * + * @return The field plan + */ + public org.ccsds.moims.mo.mal.structures.ObjectRef getPlan() { + return plan; + } + + /** + * Returns the field arguments. + * + * @return The field arguments + */ + public org.ccsds.moims.mo.mps.structures.ArgumentList getArguments() { + return arguments; + } + + /** + * Returns the field start. + * + * @return The field start + */ + public org.ccsds.moims.mo.mps.structures.Trigger getStart() { + return start; + } + + /** + * Returns the field end. + * + * @return The field end + */ + public org.ccsds.moims.mo.mps.structures.Trigger getEnd() { + return end; + } + + /** + * Returns the field duration. + * + * @return The field duration + */ + public org.ccsds.moims.mo.mal.structures.Duration getDuration() { + return duration; + } + + /** + * Returns the field subPlan. + * + * @return The field subPlan + */ + public org.ccsds.moims.mo.mal.structures.Identifier getSubPlan() { + return subPlan; + } + + /** + * Returns the field tags. + * + * @return The field tags + */ + public org.ccsds.moims.mo.mal.structures.StringList getTags() { + return tags; + } + + /** + * Returns the field status. + * + * @return The field status + */ + public org.ccsds.moims.mo.mps.structures.ActivityStatusEnum getStatus() { + return status; + } + + /** + * Returns the field executionInstance. + * + * @return The field executionInstance + */ + public org.ccsds.moims.mo.mal.structures.Identifier getExecutionInstance() { + return executionInstance; + } + + /** + * Returns the field returnData. + * + * @return The field returnData + */ + public org.ccsds.moims.mo.mal.structures.NamedValueList getReturnData() { + return returnData; + } + + /** + * Returns the field statusInfo. + * + * @return The field statusInfo + */ + public String getStatusInfo() { + return statusInfo; + } + + /** + * Returns the field errorCode. + * + * @return The field errorCode + */ + public Integer getErrorCode() { + return errorCode; + } + + /** + * Returns the field errorInfo. + * + * @return The field errorInfo + */ + public String getErrorInfo() { + return errorInfo; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ActivityUpdate) { + if (! super.equals(obj)) { + return false; + } + ActivityUpdate other = (ActivityUpdate) obj; + if (activityInstance == null) { + if (other.activityInstance != null) { + return false; + } + } else { + if (! activityInstance.equals(other.activityInstance)) { + return false; + } + } + if (timestamp == null) { + if (other.timestamp != null) { + return false; + } + } else { + if (! timestamp.equals(other.timestamp)) { + return false; + } + } + if (plan == null) { + if (other.plan != null) { + return false; + } + } else { + if (! plan.equals(other.plan)) { + return false; + } + } + if (arguments == null) { + if (other.arguments != null) { + return false; + } + } else { + if (! arguments.equals(other.arguments)) { + return false; + } + } + if (start == null) { + if (other.start != null) { + return false; + } + } else { + if (! start.equals(other.start)) { + return false; + } + } + if (end == null) { + if (other.end != null) { + return false; + } + } else { + if (! end.equals(other.end)) { + return false; + } + } + if (duration == null) { + if (other.duration != null) { + return false; + } + } else { + if (! duration.equals(other.duration)) { + return false; + } + } + if (subPlan == null) { + if (other.subPlan != null) { + return false; + } + } else { + if (! subPlan.equals(other.subPlan)) { + return false; + } + } + if (tags == null) { + if (other.tags != null) { + return false; + } + } else { + if (! tags.equals(other.tags)) { + return false; + } + } + if (status == null) { + if (other.status != null) { + return false; + } + } else { + if (! status.equals(other.status)) { + return false; + } + } + if (executionInstance == null) { + if (other.executionInstance != null) { + return false; + } + } else { + if (! executionInstance.equals(other.executionInstance)) { + return false; + } + } + if (returnData == null) { + if (other.returnData != null) { + return false; + } + } else { + if (! returnData.equals(other.returnData)) { + return false; + } + } + if (statusInfo == null) { + if (other.statusInfo != null) { + return false; + } + } else { + if (! statusInfo.equals(other.statusInfo)) { + return false; + } + } + if (errorCode == null) { + if (other.errorCode != null) { + return false; + } + } else { + if (! errorCode.equals(other.errorCode)) { + return false; + } + } + if (errorInfo == null) { + if (other.errorInfo != null) { + return false; + } + } else { + if (! errorInfo.equals(other.errorInfo)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = super.hashCode(); + hash = 83 * hash + (activityInstance != null ? activityInstance.hashCode() : 0); + hash = 83 * hash + (timestamp != null ? timestamp.hashCode() : 0); + hash = 83 * hash + (plan != null ? plan.hashCode() : 0); + hash = 83 * hash + (arguments != null ? arguments.hashCode() : 0); + hash = 83 * hash + (start != null ? start.hashCode() : 0); + hash = 83 * hash + (end != null ? end.hashCode() : 0); + hash = 83 * hash + (duration != null ? duration.hashCode() : 0); + hash = 83 * hash + (subPlan != null ? subPlan.hashCode() : 0); + hash = 83 * hash + (tags != null ? tags.hashCode() : 0); + hash = 83 * hash + (status != null ? status.hashCode() : 0); + hash = 83 * hash + (executionInstance != null ? executionInstance.hashCode() : 0); + hash = 83 * hash + (returnData != null ? returnData.hashCode() : 0); + hash = 83 * hash + (statusInfo != null ? statusInfo.hashCode() : 0); + hash = 83 * hash + (errorCode != null ? errorCode.hashCode() : 0); + hash = 83 * hash + (errorInfo != null ? errorInfo.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(ActivityUpdate: "); + buf.append(super.toString()); + buf.append(", activityInstance=").append(activityInstance); + buf.append(", timestamp=").append(timestamp); + buf.append(", plan=").append(plan); + buf.append(", arguments=").append(arguments); + buf.append(", start=").append(start); + buf.append(", end=").append(end); + buf.append(", duration=").append(duration); + buf.append(", subPlan=").append(subPlan); + buf.append(", tags=").append(tags); + buf.append(", status=").append(status); + buf.append(", executionInstance=").append(executionInstance); + buf.append(", returnData=").append(returnData); + buf.append(", statusInfo=").append(statusInfo); + buf.append(", errorCode=").append(errorCode); + buf.append(", errorInfo=").append(errorInfo); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + super.encode(encoder); + if (activityInstance == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'activityInstance' cannot be null!"); + } + if (status == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'status' cannot be null!"); + } + encoder.encodeElement(activityInstance); + encoder.encodeNullableTime(timestamp); + encoder.encodeNullableElement(plan); + encoder.encodeNullableElement(arguments); + encoder.encodeNullableAbstractElement(start); + encoder.encodeNullableAbstractElement(end); + encoder.encodeNullableDuration(duration); + encoder.encodeNullableIdentifier(subPlan); + encoder.encodeNullableElement(tags); + encoder.encodeElement(status); + encoder.encodeNullableIdentifier(executionInstance); + encoder.encodeNullableElement(returnData); + encoder.encodeNullableString(statusInfo); + encoder.encodeNullableInteger(errorCode); + encoder.encodeNullableString(errorInfo); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + super.decode(decoder); + activityInstance = (org.ccsds.moims.mo.mal.structures.ObjectRef) decoder.decodeElement(new org.ccsds.moims.mo.mal.structures.ObjectRef()); + timestamp = decoder.decodeNullableTime(); + plan = (org.ccsds.moims.mo.mal.structures.ObjectRef) decoder.decodeNullableElement(new org.ccsds.moims.mo.mal.structures.ObjectRef()); + arguments = (org.ccsds.moims.mo.mps.structures.ArgumentList) decoder.decodeNullableElement(new org.ccsds.moims.mo.mps.structures.ArgumentList()); + start = (org.ccsds.moims.mo.mps.structures.Trigger) decoder.decodeNullableAbstractElement(); + end = (org.ccsds.moims.mo.mps.structures.Trigger) decoder.decodeNullableAbstractElement(); + duration = decoder.decodeNullableDuration(); + subPlan = decoder.decodeNullableIdentifier(); + tags = (org.ccsds.moims.mo.mal.structures.StringList) decoder.decodeNullableElement(new org.ccsds.moims.mo.mal.structures.StringList()); + status = (org.ccsds.moims.mo.mps.structures.ActivityStatusEnum) decoder.decodeElement(org.ccsds.moims.mo.mps.structures.ActivityStatusEnum.PLANNED); + executionInstance = decoder.decodeNullableIdentifier(); + returnData = (org.ccsds.moims.mo.mal.structures.NamedValueList) decoder.decodeNullableElement(new org.ccsds.moims.mo.mal.structures.NamedValueList()); + statusInfo = decoder.decodeNullableString(); + errorCode = decoder.decodeNullableInteger(); + errorInfo = decoder.decodeNullableString(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ActivityUpdateList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ActivityUpdateList.java new file mode 100644 index 00000000..1b202f64 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ActivityUpdateList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for ActivityUpdate. + */ +public final class ActivityUpdateList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107606L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107606L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for ActivityUpdateList. + * + */ + public ActivityUpdateList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public ActivityUpdateList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public ActivityUpdateList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.ActivityUpdate element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.ActivityUpdate element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new ActivityUpdateList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.ActivityUpdate(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/Angle.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/Angle.java new file mode 100644 index 00000000..febe2475 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/Angle.java @@ -0,0 +1,93 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E6: Physical value with units of type Angle. + */ +public final class Angle extends org.ccsds.moims.mo.mps.structures.PhysicalValue { + + private static final long serialVersionUID = 1407374900330515L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330515L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for Angle. + * + */ + public Angle() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param value Physical value. + * @param units Optional units. The units for a single quantity. The unit type depends on the specific value type. + */ + public Angle(Double value, + String units) { + super(value, + units); + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param value Physical value. + */ + public Angle(Double value) { + super(value); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.Angle(); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Angle) { + if (! super.equals(obj)) { + return false; + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = super.hashCode(); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(Angle: "); + buf.append(super.toString()); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + super.encode(encoder); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + super.decode(decoder); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/AngleConstraint.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/AngleConstraint.java new file mode 100644 index 00000000..da4a4e49 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/AngleConstraint.java @@ -0,0 +1,281 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E7: Specifies a range of values for the angle subtended between three physical + * objects. . + */ +public final class AngleConstraint extends org.ccsds.moims.mo.mps.structures.GeometricConstraint { + + private static final long serialVersionUID = 1407374900330540L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330540L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Position of the center object. + */ + private org.ccsds.moims.mo.mal.structures.Element centerObject; + + /** + * Position of target object 1. + */ + private org.ccsds.moims.mo.mal.structures.Element targetObject1; + + /** + * Position of target object 2. + */ + private org.ccsds.moims.mo.mal.structures.Element targetObject2; + + /** + * Minimum angle subtended at the center object by target objects 1 and 2. + */ + private org.ccsds.moims.mo.mal.structures.Element minAngle; + + /** + * Maximum angle subtended at the center object by target objects 1 and 2. + */ + private org.ccsds.moims.mo.mal.structures.Element maxAngle; + + /** + * Default constructor for AngleConstraint. + * + */ + public AngleConstraint() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param negate Specifies whether the result of combining the Constraints is to be inverted (NOT function). Default = False. + * @param startRef Identifies the point in the duration of the applicable planning activity to which the start of the constraint period relates. Default is the start of the planning activity. + * @param endRef Identifies the point in the duration of the applicable planning activity to which the end of the constraint period relates. Default is the end of the planning activity. + * @param startOffset Offset from startRef that specifies the start of the constraint period. A positive offset implies a shift later in time. Default is no offset. + * @param endOffset Offset from endRef that specifies the end of the constraint period. A positive offset implies a shift later in time. Default is no offset. + * @param centerObject Position of the center object. + * @param targetObject1 Position of target object 1. + * @param targetObject2 Position of target object 2. + * @param minAngle Minimum angle subtended at the center object by target objects 1 and 2. + * @param maxAngle Maximum angle subtended at the center object by target objects 1 and 2. + */ + public AngleConstraint(Boolean negate, + org.ccsds.moims.mo.mps.structures.Slider startRef, + org.ccsds.moims.mo.mps.structures.Slider endRef, + org.ccsds.moims.mo.mal.structures.Element startOffset, + org.ccsds.moims.mo.mal.structures.Element endOffset, + org.ccsds.moims.mo.mal.structures.Element centerObject, + org.ccsds.moims.mo.mal.structures.Element targetObject1, + org.ccsds.moims.mo.mal.structures.Element targetObject2, + org.ccsds.moims.mo.mal.structures.Element minAngle, + org.ccsds.moims.mo.mal.structures.Element maxAngle) { + super(negate, + startRef, + endRef, + startOffset, + endOffset); + this.centerObject = centerObject; + this.targetObject1 = targetObject1; + this.targetObject2 = targetObject2; + this.minAngle = minAngle; + this.maxAngle = maxAngle; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param centerObject Position of the center object. + * @param targetObject1 Position of target object 1. + * @param targetObject2 Position of target object 2. + * @param minAngle Minimum angle subtended at the center object by target objects 1 and 2. + * @param maxAngle Maximum angle subtended at the center object by target objects 1 and 2. + */ + public AngleConstraint(org.ccsds.moims.mo.mal.structures.Element centerObject, + org.ccsds.moims.mo.mal.structures.Element targetObject1, + org.ccsds.moims.mo.mal.structures.Element targetObject2, + org.ccsds.moims.mo.mal.structures.Element minAngle, + org.ccsds.moims.mo.mal.structures.Element maxAngle) { + this.centerObject = centerObject; + this.targetObject1 = targetObject1; + this.targetObject2 = targetObject2; + this.minAngle = minAngle; + this.maxAngle = maxAngle; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.AngleConstraint(); + } + + /** + * Returns the field centerObject. + * + * @return The field centerObject + */ + public org.ccsds.moims.mo.mal.structures.Element getCenterObject() { + return centerObject; + } + + /** + * Returns the field targetObject1. + * + * @return The field targetObject1 + */ + public org.ccsds.moims.mo.mal.structures.Element getTargetObject1() { + return targetObject1; + } + + /** + * Returns the field targetObject2. + * + * @return The field targetObject2 + */ + public org.ccsds.moims.mo.mal.structures.Element getTargetObject2() { + return targetObject2; + } + + /** + * Returns the field minAngle. + * + * @return The field minAngle + */ + public org.ccsds.moims.mo.mal.structures.Element getMinAngle() { + return minAngle; + } + + /** + * Returns the field maxAngle. + * + * @return The field maxAngle + */ + public org.ccsds.moims.mo.mal.structures.Element getMaxAngle() { + return maxAngle; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof AngleConstraint) { + if (! super.equals(obj)) { + return false; + } + AngleConstraint other = (AngleConstraint) obj; + if (centerObject == null) { + if (other.centerObject != null) { + return false; + } + } else { + if (! centerObject.equals(other.centerObject)) { + return false; + } + } + if (targetObject1 == null) { + if (other.targetObject1 != null) { + return false; + } + } else { + if (! targetObject1.equals(other.targetObject1)) { + return false; + } + } + if (targetObject2 == null) { + if (other.targetObject2 != null) { + return false; + } + } else { + if (! targetObject2.equals(other.targetObject2)) { + return false; + } + } + if (minAngle == null) { + if (other.minAngle != null) { + return false; + } + } else { + if (! minAngle.equals(other.minAngle)) { + return false; + } + } + if (maxAngle == null) { + if (other.maxAngle != null) { + return false; + } + } else { + if (! maxAngle.equals(other.maxAngle)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = super.hashCode(); + hash = 83 * hash + (centerObject != null ? centerObject.hashCode() : 0); + hash = 83 * hash + (targetObject1 != null ? targetObject1.hashCode() : 0); + hash = 83 * hash + (targetObject2 != null ? targetObject2.hashCode() : 0); + hash = 83 * hash + (minAngle != null ? minAngle.hashCode() : 0); + hash = 83 * hash + (maxAngle != null ? maxAngle.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(AngleConstraint: "); + buf.append(super.toString()); + buf.append(", centerObject=").append(centerObject); + buf.append(", targetObject1=").append(targetObject1); + buf.append(", targetObject2=").append(targetObject2); + buf.append(", minAngle=").append(minAngle); + buf.append(", maxAngle=").append(maxAngle); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + super.encode(encoder); + if (centerObject == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'centerObject' cannot be null!"); + } + if (targetObject1 == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'targetObject1' cannot be null!"); + } + if (targetObject2 == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'targetObject2' cannot be null!"); + } + if (minAngle == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'minAngle' cannot be null!"); + } + if (maxAngle == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'maxAngle' cannot be null!"); + } + encoder.encodeAbstractElement(centerObject); + encoder.encodeAbstractElement(targetObject1); + encoder.encodeAbstractElement(targetObject2); + encoder.encodeAbstractElement(minAngle); + encoder.encodeAbstractElement(maxAngle); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + super.decode(decoder); + centerObject = (org.ccsds.moims.mo.mal.structures.Element) decoder.decodeAbstractElement(); + targetObject1 = (org.ccsds.moims.mo.mal.structures.Element) decoder.decodeAbstractElement(); + targetObject2 = (org.ccsds.moims.mo.mal.structures.Element) decoder.decodeAbstractElement(); + minAngle = (org.ccsds.moims.mo.mal.structures.Element) decoder.decodeAbstractElement(); + maxAngle = (org.ccsds.moims.mo.mal.structures.Element) decoder.decodeAbstractElement(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/AngleConstraintList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/AngleConstraintList.java new file mode 100644 index 00000000..7f66a4a8 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/AngleConstraintList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for AngleConstraint. + */ +public final class AngleConstraintList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107668L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107668L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for AngleConstraintList. + * + */ + public AngleConstraintList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public AngleConstraintList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public AngleConstraintList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.AngleConstraint element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.AngleConstraint element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new AngleConstraintList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.AngleConstraint(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/AngleList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/AngleList.java new file mode 100644 index 00000000..13b1eb5b --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/AngleList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for Angle. + */ +public final class AngleList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107693L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107693L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for AngleList. + * + */ + public AngleList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public AngleList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public AngleList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.Angle element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.Angle element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new AngleList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.Angle(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/AngleRepetition.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/AngleRepetition.java new file mode 100644 index 00000000..75812ade --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/AngleRepetition.java @@ -0,0 +1,316 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E6: A sub-type of Repetition based on the angle subtended between three + * physical objects. + */ +public final class AngleRepetition extends org.ccsds.moims.mo.mps.structures.Repetition { + + private static final long serialVersionUID = 1407374900330558L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330558L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Position of the center object. + */ + private org.ccsds.moims.mo.mal.structures.Element centerObject; + + /** + * Position of target object 1. + */ + private org.ccsds.moims.mo.mal.structures.Element targetObject1; + + /** + * Position of target object 2. + */ + private org.ccsds.moims.mo.mal.structures.Element targetObject2; + + /** + * Initial angle subtended at the center object by target objects 1 and 2. + */ + private org.ccsds.moims.mo.mal.structures.Element initialAngle; + + /** + * The required angle between occurrences. If this is zero, this implies that + * repetition is between multiple occurrences of the initialAngle. + */ + private org.ccsds.moims.mo.mal.structures.Element separation; + + /** + * The allowed tolerance (+/-) in the required angle between occurrences, + * the interpretation of which is dependent on the separationType. + */ + private org.ccsds.moims.mo.mal.structures.Element tolerance; + + /** + * Default constructor for AngleRepetition. + * + */ + public AngleRepetition() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param count Maximum number of repeat cycles/instances. If not specified there is no limit to the number of repetitions. + * @param timeWindow Time period over which the repetition is applicable. If not specified repetition continues indefinitely. + * @param separationType Specifies whether the repetition interval is Relative to the previous occurrence, or Absolute for all occurrences. + * @param centerObject Position of the center object. + * @param targetObject1 Position of target object 1. + * @param targetObject2 Position of target object 2. + * @param initialAngle Initial angle subtended at the center object by target objects 1 and 2. + * @param separation The required angle between occurrences. If this is zero, this implies that repetition is between multiple occurrences of the initialAngle. + * @param tolerance The allowed tolerance (+/-) in the required angle between occurrences, the interpretation of which is dependent on the separationType. + */ + public AngleRepetition(Integer count, + org.ccsds.moims.mo.mps.structures.TimeWindow timeWindow, + org.ccsds.moims.mo.mps.structures.SeparationTypeEnum separationType, + org.ccsds.moims.mo.mal.structures.Element centerObject, + org.ccsds.moims.mo.mal.structures.Element targetObject1, + org.ccsds.moims.mo.mal.structures.Element targetObject2, + org.ccsds.moims.mo.mal.structures.Element initialAngle, + org.ccsds.moims.mo.mal.structures.Element separation, + org.ccsds.moims.mo.mal.structures.Element tolerance) { + super(count, + timeWindow, + separationType); + this.centerObject = centerObject; + this.targetObject1 = targetObject1; + this.targetObject2 = targetObject2; + this.initialAngle = initialAngle; + this.separation = separation; + this.tolerance = tolerance; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param separationType Specifies whether the repetition interval is Relative to the previous occurrence, or Absolute for all occurrences. + * @param centerObject Position of the center object. + * @param targetObject1 Position of target object 1. + * @param targetObject2 Position of target object 2. + * @param initialAngle Initial angle subtended at the center object by target objects 1 and 2. + * @param separation The required angle between occurrences. If this is zero, this implies that repetition is between multiple occurrences of the initialAngle. + * @param tolerance The allowed tolerance (+/-) in the required angle between occurrences, the interpretation of which is dependent on the separationType. + */ + public AngleRepetition(org.ccsds.moims.mo.mps.structures.SeparationTypeEnum separationType, + org.ccsds.moims.mo.mal.structures.Element centerObject, + org.ccsds.moims.mo.mal.structures.Element targetObject1, + org.ccsds.moims.mo.mal.structures.Element targetObject2, + org.ccsds.moims.mo.mal.structures.Element initialAngle, + org.ccsds.moims.mo.mal.structures.Element separation, + org.ccsds.moims.mo.mal.structures.Element tolerance) { + super(separationType); + this.centerObject = centerObject; + this.targetObject1 = targetObject1; + this.targetObject2 = targetObject2; + this.initialAngle = initialAngle; + this.separation = separation; + this.tolerance = tolerance; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.AngleRepetition(); + } + + /** + * Returns the field centerObject. + * + * @return The field centerObject + */ + public org.ccsds.moims.mo.mal.structures.Element getCenterObject() { + return centerObject; + } + + /** + * Returns the field targetObject1. + * + * @return The field targetObject1 + */ + public org.ccsds.moims.mo.mal.structures.Element getTargetObject1() { + return targetObject1; + } + + /** + * Returns the field targetObject2. + * + * @return The field targetObject2 + */ + public org.ccsds.moims.mo.mal.structures.Element getTargetObject2() { + return targetObject2; + } + + /** + * Returns the field initialAngle. + * + * @return The field initialAngle + */ + public org.ccsds.moims.mo.mal.structures.Element getInitialAngle() { + return initialAngle; + } + + /** + * Returns the field separation. + * + * @return The field separation + */ + public org.ccsds.moims.mo.mal.structures.Element getSeparation() { + return separation; + } + + /** + * Returns the field tolerance. + * + * @return The field tolerance + */ + public org.ccsds.moims.mo.mal.structures.Element getTolerance() { + return tolerance; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof AngleRepetition) { + if (! super.equals(obj)) { + return false; + } + AngleRepetition other = (AngleRepetition) obj; + if (centerObject == null) { + if (other.centerObject != null) { + return false; + } + } else { + if (! centerObject.equals(other.centerObject)) { + return false; + } + } + if (targetObject1 == null) { + if (other.targetObject1 != null) { + return false; + } + } else { + if (! targetObject1.equals(other.targetObject1)) { + return false; + } + } + if (targetObject2 == null) { + if (other.targetObject2 != null) { + return false; + } + } else { + if (! targetObject2.equals(other.targetObject2)) { + return false; + } + } + if (initialAngle == null) { + if (other.initialAngle != null) { + return false; + } + } else { + if (! initialAngle.equals(other.initialAngle)) { + return false; + } + } + if (separation == null) { + if (other.separation != null) { + return false; + } + } else { + if (! separation.equals(other.separation)) { + return false; + } + } + if (tolerance == null) { + if (other.tolerance != null) { + return false; + } + } else { + if (! tolerance.equals(other.tolerance)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = super.hashCode(); + hash = 83 * hash + (centerObject != null ? centerObject.hashCode() : 0); + hash = 83 * hash + (targetObject1 != null ? targetObject1.hashCode() : 0); + hash = 83 * hash + (targetObject2 != null ? targetObject2.hashCode() : 0); + hash = 83 * hash + (initialAngle != null ? initialAngle.hashCode() : 0); + hash = 83 * hash + (separation != null ? separation.hashCode() : 0); + hash = 83 * hash + (tolerance != null ? tolerance.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(AngleRepetition: "); + buf.append(super.toString()); + buf.append(", centerObject=").append(centerObject); + buf.append(", targetObject1=").append(targetObject1); + buf.append(", targetObject2=").append(targetObject2); + buf.append(", initialAngle=").append(initialAngle); + buf.append(", separation=").append(separation); + buf.append(", tolerance=").append(tolerance); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + super.encode(encoder); + if (centerObject == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'centerObject' cannot be null!"); + } + if (targetObject1 == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'targetObject1' cannot be null!"); + } + if (targetObject2 == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'targetObject2' cannot be null!"); + } + if (initialAngle == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'initialAngle' cannot be null!"); + } + if (separation == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'separation' cannot be null!"); + } + if (tolerance == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'tolerance' cannot be null!"); + } + encoder.encodeAbstractElement(centerObject); + encoder.encodeAbstractElement(targetObject1); + encoder.encodeAbstractElement(targetObject2); + encoder.encodeAbstractElement(initialAngle); + encoder.encodeAbstractElement(separation); + encoder.encodeAbstractElement(tolerance); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + super.decode(decoder); + centerObject = (org.ccsds.moims.mo.mal.structures.Element) decoder.decodeAbstractElement(); + targetObject1 = (org.ccsds.moims.mo.mal.structures.Element) decoder.decodeAbstractElement(); + targetObject2 = (org.ccsds.moims.mo.mal.structures.Element) decoder.decodeAbstractElement(); + initialAngle = (org.ccsds.moims.mo.mal.structures.Element) decoder.decodeAbstractElement(); + separation = (org.ccsds.moims.mo.mal.structures.Element) decoder.decodeAbstractElement(); + tolerance = (org.ccsds.moims.mo.mal.structures.Element) decoder.decodeAbstractElement(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/AngleRepetitionList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/AngleRepetitionList.java new file mode 100644 index 00000000..306536d4 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/AngleRepetitionList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for AngleRepetition. + */ +public final class AngleRepetitionList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107650L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107650L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for AngleRepetitionList. + * + */ + public AngleRepetitionList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public AngleRepetitionList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public AngleRepetitionList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.AngleRepetition element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.AngleRepetition element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new AngleRepetitionList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.AngleRepetition(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/AngleTrigger.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/AngleTrigger.java new file mode 100644 index 00000000..3bc371c2 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/AngleTrigger.java @@ -0,0 +1,249 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E6: Sub-type of Trigger based on the angle subtended between three physical + * objects. + */ +public final class AngleTrigger extends org.ccsds.moims.mo.mps.structures.Trigger { + + private static final long serialVersionUID = 1407374900330550L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330550L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Position of the center object. The trigger angle is that subtended at + * the center object by target objects 1 and 2. + */ + private org.ccsds.moims.mo.mps.structures.Position centerObject; + + /** + * Position of target object 1. + */ + private org.ccsds.moims.mo.mps.structures.Position targetObject1; + + /** + * Position of target object 2. + */ + private org.ccsds.moims.mo.mps.structures.Position targetObject2; + + /** + * Minimum angle subtended at the center object by target objects 1 and 2. + */ + private org.ccsds.moims.mo.mps.structures.Angle minAngle; + + /** + * Maximum angle subtended at the center object by target objects 1 and 2. + */ + private org.ccsds.moims.mo.mps.structures.Angle maxAngle; + + /** + * Default constructor for AngleTrigger. + * + */ + public AngleTrigger() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param time Predicted or actual time of Trigger. The predicted time may evolve during the planning process up to the time of execution. The actual time is only available post execution, and hence can only be provided by a plan execution function. + * @param centerObject Position of the center object. The trigger angle is that subtended at the center object by target objects 1 and 2. + * @param targetObject1 Position of target object 1. + * @param targetObject2 Position of target object 2. + * @param minAngle Minimum angle subtended at the center object by target objects 1 and 2. + * @param maxAngle Maximum angle subtended at the center object by target objects 1 and 2. + */ + public AngleTrigger(org.ccsds.moims.mo.mal.structures.Time time, + org.ccsds.moims.mo.mps.structures.Position centerObject, + org.ccsds.moims.mo.mps.structures.Position targetObject1, + org.ccsds.moims.mo.mps.structures.Position targetObject2, + org.ccsds.moims.mo.mps.structures.Angle minAngle, + org.ccsds.moims.mo.mps.structures.Angle maxAngle) { + super(time); + this.centerObject = centerObject; + this.targetObject1 = targetObject1; + this.targetObject2 = targetObject2; + this.minAngle = minAngle; + this.maxAngle = maxAngle; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.AngleTrigger(); + } + + /** + * Returns the field centerObject. + * + * @return The field centerObject + */ + public org.ccsds.moims.mo.mps.structures.Position getCenterObject() { + return centerObject; + } + + /** + * Returns the field targetObject1. + * + * @return The field targetObject1 + */ + public org.ccsds.moims.mo.mps.structures.Position getTargetObject1() { + return targetObject1; + } + + /** + * Returns the field targetObject2. + * + * @return The field targetObject2 + */ + public org.ccsds.moims.mo.mps.structures.Position getTargetObject2() { + return targetObject2; + } + + /** + * Returns the field minAngle. + * + * @return The field minAngle + */ + public org.ccsds.moims.mo.mps.structures.Angle getMinAngle() { + return minAngle; + } + + /** + * Returns the field maxAngle. + * + * @return The field maxAngle + */ + public org.ccsds.moims.mo.mps.structures.Angle getMaxAngle() { + return maxAngle; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof AngleTrigger) { + if (! super.equals(obj)) { + return false; + } + AngleTrigger other = (AngleTrigger) obj; + if (centerObject == null) { + if (other.centerObject != null) { + return false; + } + } else { + if (! centerObject.equals(other.centerObject)) { + return false; + } + } + if (targetObject1 == null) { + if (other.targetObject1 != null) { + return false; + } + } else { + if (! targetObject1.equals(other.targetObject1)) { + return false; + } + } + if (targetObject2 == null) { + if (other.targetObject2 != null) { + return false; + } + } else { + if (! targetObject2.equals(other.targetObject2)) { + return false; + } + } + if (minAngle == null) { + if (other.minAngle != null) { + return false; + } + } else { + if (! minAngle.equals(other.minAngle)) { + return false; + } + } + if (maxAngle == null) { + if (other.maxAngle != null) { + return false; + } + } else { + if (! maxAngle.equals(other.maxAngle)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = super.hashCode(); + hash = 83 * hash + (centerObject != null ? centerObject.hashCode() : 0); + hash = 83 * hash + (targetObject1 != null ? targetObject1.hashCode() : 0); + hash = 83 * hash + (targetObject2 != null ? targetObject2.hashCode() : 0); + hash = 83 * hash + (minAngle != null ? minAngle.hashCode() : 0); + hash = 83 * hash + (maxAngle != null ? maxAngle.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(AngleTrigger: "); + buf.append(super.toString()); + buf.append(", centerObject=").append(centerObject); + buf.append(", targetObject1=").append(targetObject1); + buf.append(", targetObject2=").append(targetObject2); + buf.append(", minAngle=").append(minAngle); + buf.append(", maxAngle=").append(maxAngle); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + super.encode(encoder); + if (centerObject == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'centerObject' cannot be null!"); + } + if (targetObject1 == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'targetObject1' cannot be null!"); + } + if (targetObject2 == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'targetObject2' cannot be null!"); + } + if (minAngle == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'minAngle' cannot be null!"); + } + if (maxAngle == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'maxAngle' cannot be null!"); + } + encoder.encodeAbstractElement(centerObject); + encoder.encodeAbstractElement(targetObject1); + encoder.encodeAbstractElement(targetObject2); + encoder.encodeElement(minAngle); + encoder.encodeElement(maxAngle); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + super.decode(decoder); + centerObject = (org.ccsds.moims.mo.mps.structures.Position) decoder.decodeAbstractElement(); + targetObject1 = (org.ccsds.moims.mo.mps.structures.Position) decoder.decodeAbstractElement(); + targetObject2 = (org.ccsds.moims.mo.mps.structures.Position) decoder.decodeAbstractElement(); + minAngle = (org.ccsds.moims.mo.mps.structures.Angle) decoder.decodeElement(new org.ccsds.moims.mo.mps.structures.Angle()); + maxAngle = (org.ccsds.moims.mo.mps.structures.Angle) decoder.decodeElement(new org.ccsds.moims.mo.mps.structures.Angle()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/AngleTriggerList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/AngleTriggerList.java new file mode 100644 index 00000000..a51a9efd --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/AngleTriggerList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for AngleTrigger. + */ +public final class AngleTriggerList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107658L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107658L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for AngleTriggerList. + * + */ + public AngleTriggerList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public AngleTriggerList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public AngleTriggerList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.AngleTrigger element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.AngleTrigger element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new AngleTriggerList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.AngleTrigger(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/AngularVelocity.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/AngularVelocity.java new file mode 100644 index 00000000..d366b564 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/AngularVelocity.java @@ -0,0 +1,93 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E6: Physical value with units of type AngularVelocity. + */ +public final class AngularVelocity extends org.ccsds.moims.mo.mps.structures.PhysicalValue { + + private static final long serialVersionUID = 1407374900330516L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330516L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for AngularVelocity. + * + */ + public AngularVelocity() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param value Physical value. + * @param units Optional units. The units for a single quantity. The unit type depends on the specific value type. + */ + public AngularVelocity(Double value, + String units) { + super(value, + units); + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param value Physical value. + */ + public AngularVelocity(Double value) { + super(value); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.AngularVelocity(); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof AngularVelocity) { + if (! super.equals(obj)) { + return false; + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = super.hashCode(); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(AngularVelocity: "); + buf.append(super.toString()); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + super.encode(encoder); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + super.decode(decoder); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/AngularVelocityList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/AngularVelocityList.java new file mode 100644 index 00000000..2452b2fe --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/AngularVelocityList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for AngularVelocity. + */ +public final class AngularVelocityList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107692L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107692L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for AngularVelocityList. + * + */ + public AngularVelocityList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public AngularVelocityList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public AngularVelocityList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.AngularVelocity element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.AngularVelocity element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new AngularVelocityList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.AngularVelocity(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ArgDef.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ArgDef.java new file mode 100644 index 00000000..37308b66 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ArgDef.java @@ -0,0 +1,292 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E1: The definition of an argument is an ArgDef, a set of which may be contained + * within the definition MO object of a planning event, planning activity, + * or planning request. This defines the name and data type of the argument. + * Depending on the data type, the ArgDef may require additional type specific + * fields to support data validation.  Subtypes are identified for Numeric, + * String, and Status arguments. + */ +public final class ArgDef implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1407374900330519L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330519L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Name of the argument. + */ + private org.ccsds.moims.mo.mal.structures.Identifier argName; + + /** + * Extended description of the argument. + */ + private String description; + + /** + * Enumeration specifying the data type of the argument. + */ + private org.ccsds.moims.mo.mps.structures.ArgTypeEnum argType; + + /** + * The units of a single quantity, in which the argument value is expressed + * in. + */ + private String argUnits; + + /** + * If True, indicates that the argument is an array of values of type ArgTypeEnum. + */ + private Boolean isArray; + + /** + * Optional. Specifies the allowed range of values for the Argument, with + * concrete subtypes specific to the data type of the Argument. + */ + private org.ccsds.moims.mo.mps.structures.ValidationDetails validationData; + + /** + * Default constructor for ArgDef. + * + */ + public ArgDef() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param argName Name of the argument. + * @param description Extended description of the argument. + * @param argType Enumeration specifying the data type of the argument. + * @param argUnits The units of a single quantity, in which the argument value is expressed in. + * @param isArray If True, indicates that the argument is an array of values of type ArgTypeEnum. + * @param validationData Optional. Specifies the allowed range of values for the Argument, with concrete subtypes specific to the data type of the Argument. + */ + public ArgDef(org.ccsds.moims.mo.mal.structures.Identifier argName, + String description, + org.ccsds.moims.mo.mps.structures.ArgTypeEnum argType, + String argUnits, + Boolean isArray, + org.ccsds.moims.mo.mps.structures.ValidationDetails validationData) { + this.argName = argName; + this.description = description; + this.argType = argType; + this.argUnits = argUnits; + this.isArray = isArray; + this.validationData = validationData; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param argName Name of the argument. + * @param description Extended description of the argument. + * @param argType Enumeration specifying the data type of the argument. + * @param isArray If True, indicates that the argument is an array of values of type ArgTypeEnum. + */ + public ArgDef(org.ccsds.moims.mo.mal.structures.Identifier argName, + String description, + org.ccsds.moims.mo.mps.structures.ArgTypeEnum argType, + Boolean isArray) { + this.argName = argName; + this.description = description; + this.argType = argType; + this.argUnits = null; + this.isArray = isArray; + this.validationData = null; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.ArgDef(); + } + + /** + * Returns the field argName. + * + * @return The field argName + */ + public org.ccsds.moims.mo.mal.structures.Identifier getArgName() { + return argName; + } + + /** + * Returns the field description. + * + * @return The field description + */ + public String getDescription() { + return description; + } + + /** + * Returns the field argType. + * + * @return The field argType + */ + public org.ccsds.moims.mo.mps.structures.ArgTypeEnum getArgType() { + return argType; + } + + /** + * Returns the field argUnits. + * + * @return The field argUnits + */ + public String getArgUnits() { + return argUnits; + } + + /** + * Returns the field isArray. + * + * @return The field isArray + */ + public Boolean getIsArray() { + return isArray; + } + + /** + * Returns the field validationData. + * + * @return The field validationData + */ + public org.ccsds.moims.mo.mps.structures.ValidationDetails getValidationData() { + return validationData; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ArgDef) { + ArgDef other = (ArgDef) obj; + if (argName == null) { + if (other.argName != null) { + return false; + } + } else { + if (! argName.equals(other.argName)) { + return false; + } + } + if (description == null) { + if (other.description != null) { + return false; + } + } else { + if (! description.equals(other.description)) { + return false; + } + } + if (argType == null) { + if (other.argType != null) { + return false; + } + } else { + if (! argType.equals(other.argType)) { + return false; + } + } + if (argUnits == null) { + if (other.argUnits != null) { + return false; + } + } else { + if (! argUnits.equals(other.argUnits)) { + return false; + } + } + if (isArray == null) { + if (other.isArray != null) { + return false; + } + } else { + if (! isArray.equals(other.isArray)) { + return false; + } + } + if (validationData == null) { + if (other.validationData != null) { + return false; + } + } else { + if (! validationData.equals(other.validationData)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (argName != null ? argName.hashCode() : 0); + hash = 83 * hash + (description != null ? description.hashCode() : 0); + hash = 83 * hash + (argType != null ? argType.hashCode() : 0); + hash = 83 * hash + (argUnits != null ? argUnits.hashCode() : 0); + hash = 83 * hash + (isArray != null ? isArray.hashCode() : 0); + hash = 83 * hash + (validationData != null ? validationData.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(ArgDef: "); + buf.append("argName=").append(argName); + buf.append(", description=").append(description); + buf.append(", argType=").append(argType); + buf.append(", argUnits=").append(argUnits); + buf.append(", isArray=").append(isArray); + buf.append(", validationData=").append(validationData); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (argName == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'argName' cannot be null!"); + } + if (description == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'description' cannot be null!"); + } + if (argType == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'argType' cannot be null!"); + } + if (isArray == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'isArray' cannot be null!"); + } + encoder.encodeIdentifier(argName); + encoder.encodeString(description); + encoder.encodeElement(argType); + encoder.encodeNullableString(argUnits); + encoder.encodeBoolean(isArray); + encoder.encodeNullableAbstractElement(validationData); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + argName = decoder.decodeIdentifier(); + description = decoder.decodeString(); + argType = (org.ccsds.moims.mo.mps.structures.ArgTypeEnum) decoder.decodeElement(org.ccsds.moims.mo.mps.structures.ArgTypeEnum.BLOB); + argUnits = decoder.decodeNullableString(); + isArray = decoder.decodeBoolean(); + validationData = (org.ccsds.moims.mo.mps.structures.ValidationDetails) decoder.decodeNullableAbstractElement(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ArgDefList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ArgDefList.java new file mode 100644 index 00000000..99468c69 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ArgDefList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for ArgDef. + */ +public final class ArgDefList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107689L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107689L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for ArgDefList. + * + */ + public ArgDefList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public ArgDefList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public ArgDefList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.ArgDef element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.ArgDef element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new ArgDefList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.ArgDef(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ArgSpec.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ArgSpec.java new file mode 100644 index 00000000..28bf69dd --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ArgSpec.java @@ -0,0 +1,145 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E1: In the case of the planning activity, there is also an ArgSpec, a set + * of which may be contained within the ActivityDetails structure embedded + * within a planning request or parent planning activity definition. The + * ArgSpec defines how to derive the value of an Argument when instantiating + * it at run-time. . + */ +public final class ArgSpec implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1407374900330521L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330521L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Name of the argument. + */ + private org.ccsds.moims.mo.mal.structures.Identifier argName; + + /** + * Expression that can be evaluated at run-time to provide argument value(s) + * of appropriate. The MAL Element subtype(s) must match the argument type + * supplied in the corresponding ArgDef. + */ + private org.ccsds.moims.mo.mal.structures.HeterogeneousList argSpecValues; + + /** + * Default constructor for ArgSpec. + * + */ + public ArgSpec() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param argName Name of the argument. + * @param argSpecValues Expression that can be evaluated at run-time to provide argument value(s) of appropriate. The MAL Element subtype(s) must match the argument type supplied in the corresponding ArgDef. + */ + public ArgSpec(org.ccsds.moims.mo.mal.structures.Identifier argName, + org.ccsds.moims.mo.mal.structures.HeterogeneousList argSpecValues) { + this.argName = argName; + this.argSpecValues = argSpecValues; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.ArgSpec(); + } + + /** + * Returns the field argName. + * + * @return The field argName + */ + public org.ccsds.moims.mo.mal.structures.Identifier getArgName() { + return argName; + } + + /** + * Returns the field argSpecValues. + * + * @return The field argSpecValues + */ + public org.ccsds.moims.mo.mal.structures.HeterogeneousList getArgSpecValues() { + return argSpecValues; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ArgSpec) { + ArgSpec other = (ArgSpec) obj; + if (argName == null) { + if (other.argName != null) { + return false; + } + } else { + if (! argName.equals(other.argName)) { + return false; + } + } + if (argSpecValues == null) { + if (other.argSpecValues != null) { + return false; + } + } else { + if (! argSpecValues.equals(other.argSpecValues)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (argName != null ? argName.hashCode() : 0); + hash = 83 * hash + (argSpecValues != null ? argSpecValues.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(ArgSpec: "); + buf.append("argName=").append(argName); + buf.append(", argSpecValues=").append(argSpecValues); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (argName == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'argName' cannot be null!"); + } + if (argSpecValues == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'argSpecValues' cannot be null!"); + } + encoder.encodeIdentifier(argName); + encoder.encodeElement(argSpecValues); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + argName = decoder.decodeIdentifier(); + argSpecValues = (org.ccsds.moims.mo.mal.structures.HeterogeneousList) decoder.decodeElement(new org.ccsds.moims.mo.mal.structures.HeterogeneousList()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ArgSpecList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ArgSpecList.java new file mode 100644 index 00000000..be02a70b --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ArgSpecList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for ArgSpec. + */ +public final class ArgSpecList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107687L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107687L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for ArgSpecList. + * + */ + public ArgSpecList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public ArgSpecList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public ArgSpecList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.ArgSpec element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.ArgSpec element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new ArgSpecList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.ArgSpec(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ArgTypeEnum.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ArgTypeEnum.java new file mode 100644 index 00000000..2b4813ba --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ArgTypeEnum.java @@ -0,0 +1,489 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * Enumeration class for ArgTypeEnum. + */ +public final class ArgTypeEnum extends org.ccsds.moims.mo.mal.structures.Enumeration { + + private static final long serialVersionUID = 1407374900330497L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330497L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Enumeration value for BLOB. + */ + public static final int BLOB_VALUE = 1; + + /** + * Enumeration singleton for value BLOB. + */ + public static final org.ccsds.moims.mo.mps.structures.ArgTypeEnum BLOB = new org.ccsds.moims.mo.mps.structures.ArgTypeEnum(org.ccsds.moims.mo.mps.structures.ArgTypeEnum.BLOB_VALUE); + + /** + * Enumeration value for BOOLEAN. + */ + public static final int BOOLEAN_VALUE = 2; + + /** + * Enumeration singleton for value BOOLEAN. + */ + public static final org.ccsds.moims.mo.mps.structures.ArgTypeEnum BOOLEAN = new org.ccsds.moims.mo.mps.structures.ArgTypeEnum(org.ccsds.moims.mo.mps.structures.ArgTypeEnum.BOOLEAN_VALUE); + + /** + * Enumeration value for DURATION. + */ + public static final int DURATION_VALUE = 3; + + /** + * Enumeration singleton for value DURATION. + */ + public static final org.ccsds.moims.mo.mps.structures.ArgTypeEnum DURATION = new org.ccsds.moims.mo.mps.structures.ArgTypeEnum(org.ccsds.moims.mo.mps.structures.ArgTypeEnum.DURATION_VALUE); + + /** + * Enumeration value for FLOAT. + */ + public static final int FLOAT_VALUE = 4; + + /** + * Enumeration singleton for value FLOAT. + */ + public static final org.ccsds.moims.mo.mps.structures.ArgTypeEnum FLOAT = new org.ccsds.moims.mo.mps.structures.ArgTypeEnum(org.ccsds.moims.mo.mps.structures.ArgTypeEnum.FLOAT_VALUE); + + /** + * Enumeration value for DOUBLE. + */ + public static final int DOUBLE_VALUE = 5; + + /** + * Enumeration singleton for value DOUBLE. + */ + public static final org.ccsds.moims.mo.mps.structures.ArgTypeEnum DOUBLE = new org.ccsds.moims.mo.mps.structures.ArgTypeEnum(org.ccsds.moims.mo.mps.structures.ArgTypeEnum.DOUBLE_VALUE); + + /** + * Enumeration value for IDENTIFIER. + */ + public static final int IDENTIFIER_VALUE = 6; + + /** + * Enumeration singleton for value IDENTIFIER. + */ + public static final org.ccsds.moims.mo.mps.structures.ArgTypeEnum IDENTIFIER = new org.ccsds.moims.mo.mps.structures.ArgTypeEnum(org.ccsds.moims.mo.mps.structures.ArgTypeEnum.IDENTIFIER_VALUE); + + /** + * Enumeration value for OCTET. + */ + public static final int OCTET_VALUE = 7; + + /** + * Enumeration singleton for value OCTET. + */ + public static final org.ccsds.moims.mo.mps.structures.ArgTypeEnum OCTET = new org.ccsds.moims.mo.mps.structures.ArgTypeEnum(org.ccsds.moims.mo.mps.structures.ArgTypeEnum.OCTET_VALUE); + + /** + * Enumeration value for UOCTET. + */ + public static final int UOCTET_VALUE = 8; + + /** + * Enumeration singleton for value UOCTET. + */ + public static final org.ccsds.moims.mo.mps.structures.ArgTypeEnum UOCTET = new org.ccsds.moims.mo.mps.structures.ArgTypeEnum(org.ccsds.moims.mo.mps.structures.ArgTypeEnum.UOCTET_VALUE); + + /** + * Enumeration value for SHORT. + */ + public static final int SHORT_VALUE = 9; + + /** + * Enumeration singleton for value SHORT. + */ + public static final org.ccsds.moims.mo.mps.structures.ArgTypeEnum SHORT = new org.ccsds.moims.mo.mps.structures.ArgTypeEnum(org.ccsds.moims.mo.mps.structures.ArgTypeEnum.SHORT_VALUE); + + /** + * Enumeration value for USHORT. + */ + public static final int USHORT_VALUE = 10; + + /** + * Enumeration singleton for value USHORT. + */ + public static final org.ccsds.moims.mo.mps.structures.ArgTypeEnum USHORT = new org.ccsds.moims.mo.mps.structures.ArgTypeEnum(org.ccsds.moims.mo.mps.structures.ArgTypeEnum.USHORT_VALUE); + + /** + * Enumeration value for INTEGER. + */ + public static final int INTEGER_VALUE = 11; + + /** + * Enumeration singleton for value INTEGER. + */ + public static final org.ccsds.moims.mo.mps.structures.ArgTypeEnum INTEGER = new org.ccsds.moims.mo.mps.structures.ArgTypeEnum(org.ccsds.moims.mo.mps.structures.ArgTypeEnum.INTEGER_VALUE); + + /** + * Enumeration value for UINTEGER. + */ + public static final int UINTEGER_VALUE = 12; + + /** + * Enumeration singleton for value UINTEGER. + */ + public static final org.ccsds.moims.mo.mps.structures.ArgTypeEnum UINTEGER = new org.ccsds.moims.mo.mps.structures.ArgTypeEnum(org.ccsds.moims.mo.mps.structures.ArgTypeEnum.UINTEGER_VALUE); + + /** + * Enumeration value for LONG. + */ + public static final int LONG_VALUE = 13; + + /** + * Enumeration singleton for value LONG. + */ + public static final org.ccsds.moims.mo.mps.structures.ArgTypeEnum LONG = new org.ccsds.moims.mo.mps.structures.ArgTypeEnum(org.ccsds.moims.mo.mps.structures.ArgTypeEnum.LONG_VALUE); + + /** + * Enumeration value for ULONG. + */ + public static final int ULONG_VALUE = 14; + + /** + * Enumeration singleton for value ULONG. + */ + public static final org.ccsds.moims.mo.mps.structures.ArgTypeEnum ULONG = new org.ccsds.moims.mo.mps.structures.ArgTypeEnum(org.ccsds.moims.mo.mps.structures.ArgTypeEnum.ULONG_VALUE); + + /** + * Enumeration value for STRING. + */ + public static final int STRING_VALUE = 15; + + /** + * Enumeration singleton for value STRING. + */ + public static final org.ccsds.moims.mo.mps.structures.ArgTypeEnum STRING = new org.ccsds.moims.mo.mps.structures.ArgTypeEnum(org.ccsds.moims.mo.mps.structures.ArgTypeEnum.STRING_VALUE); + + /** + * Enumeration value for TIME. + */ + public static final int TIME_VALUE = 16; + + /** + * Enumeration singleton for value TIME. + */ + public static final org.ccsds.moims.mo.mps.structures.ArgTypeEnum TIME = new org.ccsds.moims.mo.mps.structures.ArgTypeEnum(org.ccsds.moims.mo.mps.structures.ArgTypeEnum.TIME_VALUE); + + /** + * Enumeration value for FINETIME. + */ + public static final int FINETIME_VALUE = 17; + + /** + * Enumeration singleton for value FINETIME. + */ + public static final org.ccsds.moims.mo.mps.structures.ArgTypeEnum FINETIME = new org.ccsds.moims.mo.mps.structures.ArgTypeEnum(org.ccsds.moims.mo.mps.structures.ArgTypeEnum.FINETIME_VALUE); + + /** + * Enumeration value for URI. + */ + public static final int URI_VALUE = 18; + + /** + * Enumeration singleton for value URI. + */ + public static final org.ccsds.moims.mo.mps.structures.ArgTypeEnum URI = new org.ccsds.moims.mo.mps.structures.ArgTypeEnum(org.ccsds.moims.mo.mps.structures.ArgTypeEnum.URI_VALUE); + + /** + * Enumeration value for OBJECTREF. + */ + public static final int OBJECTREF_VALUE = 19; + + /** + * Enumeration singleton for value OBJECTREF. + */ + public static final org.ccsds.moims.mo.mps.structures.ArgTypeEnum OBJECTREF = new org.ccsds.moims.mo.mps.structures.ArgTypeEnum(org.ccsds.moims.mo.mps.structures.ArgTypeEnum.OBJECTREF_VALUE); + + /** + * Enumeration value for POSITION. + */ + public static final int POSITION_VALUE = 129; + + /** + * Enumeration singleton for value POSITION. + */ + public static final org.ccsds.moims.mo.mps.structures.ArgTypeEnum POSITION = new org.ccsds.moims.mo.mps.structures.ArgTypeEnum(org.ccsds.moims.mo.mps.structures.ArgTypeEnum.POSITION_VALUE); + + /** + * Enumeration value for DIRECTION. + */ + public static final int DIRECTION_VALUE = 130; + + /** + * Enumeration singleton for value DIRECTION. + */ + public static final org.ccsds.moims.mo.mps.structures.ArgTypeEnum DIRECTION = new org.ccsds.moims.mo.mps.structures.ArgTypeEnum(org.ccsds.moims.mo.mps.structures.ArgTypeEnum.DIRECTION_VALUE); + + /** + * Enumeration value for ANGLE. + */ + public static final int ANGLE_VALUE = 131; + + /** + * Enumeration singleton for value ANGLE. + */ + public static final org.ccsds.moims.mo.mps.structures.ArgTypeEnum ANGLE = new org.ccsds.moims.mo.mps.structures.ArgTypeEnum(org.ccsds.moims.mo.mps.structures.ArgTypeEnum.ANGLE_VALUE); + + /** + * Enumeration value for ANGULAR_RATE. + */ + public static final int ANGULAR_RATE_VALUE = 132; + + /** + * Enumeration singleton for value ANGULAR_RATE. + */ + public static final org.ccsds.moims.mo.mps.structures.ArgTypeEnum ANGULAR_RATE = new org.ccsds.moims.mo.mps.structures.ArgTypeEnum(org.ccsds.moims.mo.mps.structures.ArgTypeEnum.ANGULAR_RATE_VALUE); + + /** + * Enumeration value for DISTANCE. + */ + public static final int DISTANCE_VALUE = 133; + + /** + * Enumeration singleton for value DISTANCE. + */ + public static final org.ccsds.moims.mo.mps.structures.ArgTypeEnum DISTANCE = new org.ccsds.moims.mo.mps.structures.ArgTypeEnum(org.ccsds.moims.mo.mps.structures.ArgTypeEnum.DISTANCE_VALUE); + + /** + * Enumeration value for ANY. + */ + public static final int ANY_VALUE = 134; + + /** + * Enumeration singleton for value ANY. + */ + public static final org.ccsds.moims.mo.mps.structures.ArgTypeEnum ANY = new org.ccsds.moims.mo.mps.structures.ArgTypeEnum(org.ccsds.moims.mo.mps.structures.ArgTypeEnum.ANY_VALUE); + + /** + * Set of enumeration instances. + */ + private static final org.ccsds.moims.mo.mps.structures.ArgTypeEnum[] _ENUMERATIONS = { + BLOB, BOOLEAN, DURATION, FLOAT, DOUBLE, IDENTIFIER, OCTET, UOCTET, SHORT, + USHORT, INTEGER, UINTEGER, LONG, ULONG, STRING, TIME, FINETIME, URI, OBJECTREF, + POSITION, DIRECTION, ANGLE, ANGULAR_RATE, DISTANCE, ANY}; + + /** + * E1: ArgTypeEnum is an MPS extension of the MAL::AttributeType enumeration (see reference [2] section 4.6.4) that also allows specification of the Geometric data types. + */ + public ArgTypeEnum() { + super(-1); + } + + /** + * E1: ArgTypeEnum is an MPS extension of the MAL::AttributeType enumeration + * (see reference [2] section 4.6.4) that also allows specification of the + * Geometric data types. + * + * @param value The value of the Enumeration. + */ + public ArgTypeEnum(int value) { + super(value); + } + + @Override + public String toString() { + switch (getValue()) { + case BLOB_VALUE: + return "BLOB"; + case BOOLEAN_VALUE: + return "BOOLEAN"; + case DURATION_VALUE: + return "DURATION"; + case FLOAT_VALUE: + return "FLOAT"; + case DOUBLE_VALUE: + return "DOUBLE"; + case IDENTIFIER_VALUE: + return "IDENTIFIER"; + case OCTET_VALUE: + return "OCTET"; + case UOCTET_VALUE: + return "UOCTET"; + case SHORT_VALUE: + return "SHORT"; + case USHORT_VALUE: + return "USHORT"; + case INTEGER_VALUE: + return "INTEGER"; + case UINTEGER_VALUE: + return "UINTEGER"; + case LONG_VALUE: + return "LONG"; + case ULONG_VALUE: + return "ULONG"; + case STRING_VALUE: + return "STRING"; + case TIME_VALUE: + return "TIME"; + case FINETIME_VALUE: + return "FINETIME"; + case URI_VALUE: + return "URI"; + case OBJECTREF_VALUE: + return "OBJECTREF"; + case POSITION_VALUE: + return "POSITION"; + case DIRECTION_VALUE: + return "DIRECTION"; + case ANGLE_VALUE: + return "ANGLE"; + case ANGULAR_RATE_VALUE: + return "ANGULAR_RATE"; + case DISTANCE_VALUE: + return "DISTANCE"; + case ANY_VALUE: + return "ANY"; + default: + throw new RuntimeException("Unknown ordinal!"); + } + } + + /** + * Returns the enumeration element represented by the supplied string, or + * null if not matched. + * + * @param s s The string to search for. + * @return The matched enumeration element, or null if not matched. + */ + public static org.ccsds.moims.mo.mps.structures.ArgTypeEnum fromString(String s) { + switch (s) { + case "BLOB": + return ArgTypeEnum.BLOB; + case "BOOLEAN": + return ArgTypeEnum.BOOLEAN; + case "DURATION": + return ArgTypeEnum.DURATION; + case "FLOAT": + return ArgTypeEnum.FLOAT; + case "DOUBLE": + return ArgTypeEnum.DOUBLE; + case "IDENTIFIER": + return ArgTypeEnum.IDENTIFIER; + case "OCTET": + return ArgTypeEnum.OCTET; + case "UOCTET": + return ArgTypeEnum.UOCTET; + case "SHORT": + return ArgTypeEnum.SHORT; + case "USHORT": + return ArgTypeEnum.USHORT; + case "INTEGER": + return ArgTypeEnum.INTEGER; + case "UINTEGER": + return ArgTypeEnum.UINTEGER; + case "LONG": + return ArgTypeEnum.LONG; + case "ULONG": + return ArgTypeEnum.ULONG; + case "STRING": + return ArgTypeEnum.STRING; + case "TIME": + return ArgTypeEnum.TIME; + case "FINETIME": + return ArgTypeEnum.FINETIME; + case "URI": + return ArgTypeEnum.URI; + case "OBJECTREF": + return ArgTypeEnum.OBJECTREF; + case "POSITION": + return ArgTypeEnum.POSITION; + case "DIRECTION": + return ArgTypeEnum.DIRECTION; + case "ANGLE": + return ArgTypeEnum.ANGLE; + case "ANGULAR_RATE": + return ArgTypeEnum.ANGULAR_RATE; + case "DISTANCE": + return ArgTypeEnum.DISTANCE; + case "ANY": + return ArgTypeEnum.ANY; + default: + throw new RuntimeException("Unknown Enumeration for the provided string: " + s); + } + } + + @Override + public org.ccsds.moims.mo.mal.structures.Enumeration fromValue(Integer value) { + switch (value) { + case BLOB_VALUE: + return ArgTypeEnum.BLOB; + case BOOLEAN_VALUE: + return ArgTypeEnum.BOOLEAN; + case DURATION_VALUE: + return ArgTypeEnum.DURATION; + case FLOAT_VALUE: + return ArgTypeEnum.FLOAT; + case DOUBLE_VALUE: + return ArgTypeEnum.DOUBLE; + case IDENTIFIER_VALUE: + return ArgTypeEnum.IDENTIFIER; + case OCTET_VALUE: + return ArgTypeEnum.OCTET; + case UOCTET_VALUE: + return ArgTypeEnum.UOCTET; + case SHORT_VALUE: + return ArgTypeEnum.SHORT; + case USHORT_VALUE: + return ArgTypeEnum.USHORT; + case INTEGER_VALUE: + return ArgTypeEnum.INTEGER; + case UINTEGER_VALUE: + return ArgTypeEnum.UINTEGER; + case LONG_VALUE: + return ArgTypeEnum.LONG; + case ULONG_VALUE: + return ArgTypeEnum.ULONG; + case STRING_VALUE: + return ArgTypeEnum.STRING; + case TIME_VALUE: + return ArgTypeEnum.TIME; + case FINETIME_VALUE: + return ArgTypeEnum.FINETIME; + case URI_VALUE: + return ArgTypeEnum.URI; + case OBJECTREF_VALUE: + return ArgTypeEnum.OBJECTREF; + case POSITION_VALUE: + return ArgTypeEnum.POSITION; + case DIRECTION_VALUE: + return ArgTypeEnum.DIRECTION; + case ANGLE_VALUE: + return ArgTypeEnum.ANGLE; + case ANGULAR_RATE_VALUE: + return ArgTypeEnum.ANGULAR_RATE; + case DISTANCE_VALUE: + return ArgTypeEnum.DISTANCE; + case ANY_VALUE: + return ArgTypeEnum.ANY; + default: + throw new RuntimeException("Unknown Enumeration for the provided value: " + value); + } + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return _ENUMERATIONS[0]; + } + + @Override + public int getEnumSize() { + return 25; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ArgTypeEnumList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ArgTypeEnumList.java new file mode 100644 index 00000000..1c58c785 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ArgTypeEnumList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for ArgTypeEnum. + */ +public final class ArgTypeEnumList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107711L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107711L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for ArgTypeEnumList. + * + */ + public ArgTypeEnumList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public ArgTypeEnumList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public ArgTypeEnumList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.ArgTypeEnum element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.ArgTypeEnum element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new ArgTypeEnumList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return org.ccsds.moims.mo.mps.structures.ArgTypeEnum.BLOB; + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/Argument.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/Argument.java new file mode 100644 index 00000000..0c9899a1 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/Argument.java @@ -0,0 +1,144 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E1: The instance of an argument is an Argument, a set of which may be contained + * within the instance MO object of a planning event or planning activity + * or within a planning request. This comprises the name and value of the + * argument, corresponding to the set of arguments defined in the ArgDef. + * Argument values are represented as a MAL Element of appropriate data type. + */ +public final class Argument implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1407374900330520L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330520L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Name of the argument. + */ + private org.ccsds.moims.mo.mal.structures.Identifier argName; + + /** + * Argument value (or values if it is an array). The MAL Element subtype(s) + * must match the argument type supplied in the corresponding ArgDef. + */ + private org.ccsds.moims.mo.mal.structures.HeterogeneousList argValues; + + /** + * Default constructor for Argument. + * + */ + public Argument() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param argName Name of the argument. + * @param argValues Argument value (or values if it is an array). The MAL Element subtype(s) must match the argument type supplied in the corresponding ArgDef. + */ + public Argument(org.ccsds.moims.mo.mal.structures.Identifier argName, + org.ccsds.moims.mo.mal.structures.HeterogeneousList argValues) { + this.argName = argName; + this.argValues = argValues; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.Argument(); + } + + /** + * Returns the field argName. + * + * @return The field argName + */ + public org.ccsds.moims.mo.mal.structures.Identifier getArgName() { + return argName; + } + + /** + * Returns the field argValues. + * + * @return The field argValues + */ + public org.ccsds.moims.mo.mal.structures.HeterogeneousList getArgValues() { + return argValues; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Argument) { + Argument other = (Argument) obj; + if (argName == null) { + if (other.argName != null) { + return false; + } + } else { + if (! argName.equals(other.argName)) { + return false; + } + } + if (argValues == null) { + if (other.argValues != null) { + return false; + } + } else { + if (! argValues.equals(other.argValues)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (argName != null ? argName.hashCode() : 0); + hash = 83 * hash + (argValues != null ? argValues.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(Argument: "); + buf.append("argName=").append(argName); + buf.append(", argValues=").append(argValues); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (argName == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'argName' cannot be null!"); + } + if (argValues == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'argValues' cannot be null!"); + } + encoder.encodeIdentifier(argName); + encoder.encodeElement(argValues); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + argName = decoder.decodeIdentifier(); + argValues = (org.ccsds.moims.mo.mal.structures.HeterogeneousList) decoder.decodeElement(new org.ccsds.moims.mo.mal.structures.HeterogeneousList()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ArgumentConstraint.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ArgumentConstraint.java new file mode 100644 index 00000000..73921578 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ArgumentConstraint.java @@ -0,0 +1,235 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E5: An argument constraint may be associated with a planning activity to + * restrict when it can be planned, based on the value of an argument of the + * planning activity itself or a related planning activity or event. + */ +public final class ArgumentConstraint extends org.ccsds.moims.mo.mps.structures.Constraint { + + private static final long serialVersionUID = 1407374900330531L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330531L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Object Type: ActivityDefinition | EventDefinition Specifies the definition + * (class) of the planning activity or planning event whose argument is to + * be referenced. If omitted the activity containing the constraint is assumed. + */ + private org.ccsds.moims.mo.mal.structures.Element objectRef; + + /** + * Identifies the specific argument of the referenced Object whose value is + * to be compared. + */ + private org.ccsds.moims.mo.mal.structures.Identifier argName; + + /** + * Comparison operator, which may be one of: =, !=, _, _=, _, _=, contains, + * icontains The contains operator only applies to strings and may be case + * sensitive or insensitive. + */ + private org.ccsds.moims.mo.mps.structures.ExpressionOperatorEnum comparator; + + /** + * Value to be compared against. The MAL Element subtype must match the argument + * type supplied in the corresponding ArgDef of the given Argument. + */ + private org.ccsds.moims.mo.mal.structures.Element value; + + /** + * Default constructor for ArgumentConstraint. + * + */ + public ArgumentConstraint() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param negate Specifies whether the result of combining the Constraints is to be inverted (NOT function). Default = False. + * @param objectRef Object Type: ActivityDefinition | EventDefinition Specifies the definition (class) of the planning activity or planning event whose argument is to be referenced. If omitted the activity containing the constraint is assumed. + * @param argName Identifies the specific argument of the referenced Object whose value is to be compared + * @param comparator Comparison operator, which may be one of: =, !=, _, _=, _, _=, contains, icontains The contains operator only applies to strings and may be case sensitive or insensitive. + * @param value Value to be compared against. The MAL Element subtype must match the argument type supplied in the corresponding ArgDef of the given Argument. + */ + public ArgumentConstraint(Boolean negate, + org.ccsds.moims.mo.mal.structures.Element objectRef, + org.ccsds.moims.mo.mal.structures.Identifier argName, + org.ccsds.moims.mo.mps.structures.ExpressionOperatorEnum comparator, + org.ccsds.moims.mo.mal.structures.Element value) { + super(negate); + this.objectRef = objectRef; + this.argName = argName; + this.comparator = comparator; + this.value = value; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param argName Identifies the specific argument of the referenced Object whose value is to be compared + * @param comparator Comparison operator, which may be one of: =, !=, _, _=, _, _=, contains, icontains The contains operator only applies to strings and may be case sensitive or insensitive. + * @param value Value to be compared against. The MAL Element subtype must match the argument type supplied in the corresponding ArgDef of the given Argument. + */ + public ArgumentConstraint(org.ccsds.moims.mo.mal.structures.Identifier argName, + org.ccsds.moims.mo.mps.structures.ExpressionOperatorEnum comparator, + org.ccsds.moims.mo.mal.structures.Element value) { + this.objectRef = null; + this.argName = argName; + this.comparator = comparator; + this.value = value; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.ArgumentConstraint(); + } + + /** + * Returns the field objectRef. + * + * @return The field objectRef + */ + public org.ccsds.moims.mo.mal.structures.Element getObjectRef() { + return objectRef; + } + + /** + * Returns the field argName. + * + * @return The field argName + */ + public org.ccsds.moims.mo.mal.structures.Identifier getArgName() { + return argName; + } + + /** + * Returns the field comparator. + * + * @return The field comparator + */ + public org.ccsds.moims.mo.mps.structures.ExpressionOperatorEnum getComparator() { + return comparator; + } + + /** + * Returns the field value. + * + * @return The field value + */ + public org.ccsds.moims.mo.mal.structures.Element getValue() { + return value; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ArgumentConstraint) { + if (! super.equals(obj)) { + return false; + } + ArgumentConstraint other = (ArgumentConstraint) obj; + if (objectRef == null) { + if (other.objectRef != null) { + return false; + } + } else { + if (! objectRef.equals(other.objectRef)) { + return false; + } + } + if (argName == null) { + if (other.argName != null) { + return false; + } + } else { + if (! argName.equals(other.argName)) { + return false; + } + } + if (comparator == null) { + if (other.comparator != null) { + return false; + } + } else { + if (! comparator.equals(other.comparator)) { + return false; + } + } + if (value == null) { + if (other.value != null) { + return false; + } + } else { + if (! value.equals(other.value)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = super.hashCode(); + hash = 83 * hash + (objectRef != null ? objectRef.hashCode() : 0); + hash = 83 * hash + (argName != null ? argName.hashCode() : 0); + hash = 83 * hash + (comparator != null ? comparator.hashCode() : 0); + hash = 83 * hash + (value != null ? value.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(ArgumentConstraint: "); + buf.append(super.toString()); + buf.append(", objectRef=").append(objectRef); + buf.append(", argName=").append(argName); + buf.append(", comparator=").append(comparator); + buf.append(", value=").append(value); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + super.encode(encoder); + if (argName == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'argName' cannot be null!"); + } + if (comparator == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'comparator' cannot be null!"); + } + if (value == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'value' cannot be null!"); + } + encoder.encodeNullableAbstractElement(objectRef); + encoder.encodeIdentifier(argName); + encoder.encodeElement(comparator); + encoder.encodeAbstractElement(value); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + super.decode(decoder); + objectRef = (org.ccsds.moims.mo.mal.structures.Element) decoder.decodeNullableAbstractElement(); + argName = decoder.decodeIdentifier(); + comparator = (org.ccsds.moims.mo.mps.structures.ExpressionOperatorEnum) decoder.decodeElement(org.ccsds.moims.mo.mps.structures.ExpressionOperatorEnum.EQUAL); + value = (org.ccsds.moims.mo.mal.structures.Element) decoder.decodeAbstractElement(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ArgumentConstraintList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ArgumentConstraintList.java new file mode 100644 index 00000000..3a14a046 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ArgumentConstraintList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for ArgumentConstraint. + */ +public final class ArgumentConstraintList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107677L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107677L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for ArgumentConstraintList. + * + */ + public ArgumentConstraintList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public ArgumentConstraintList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public ArgumentConstraintList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.ArgumentConstraint element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.ArgumentConstraint element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new ArgumentConstraintList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.ArgumentConstraint(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ArgumentList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ArgumentList.java new file mode 100644 index 00000000..b6eb220e --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ArgumentList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for Argument. + */ +public final class ArgumentList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107688L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107688L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for ArgumentList. + * + */ + public ArgumentList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public ArgumentList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public ArgumentList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.Argument element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.Argument element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new ArgumentList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.Argument(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/CartesianDirection.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/CartesianDirection.java new file mode 100644 index 00000000..460fde80 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/CartesianDirection.java @@ -0,0 +1,212 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E6: Dimensionless unit vector. Either a direction in the base frame or + * in a secondary frame may be defined. + */ +public final class CartesianDirection extends org.ccsds.moims.mo.mps.structures.Direction { + + private static final long serialVersionUID = 1407374900330510L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330510L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Cartesian x coordinate defined in the given frame. + */ + private Double x; + + /** + * Cartesian y coordinate defined in the given frame. + */ + private Double y; + + /** + * Cartesian z coordinate defined in the given frame. + */ + private Double z; + + /** + * Reference frame within which the direction is expressed (see 4.4.2). + */ + private org.ccsds.moims.mo.mal.structures.Identifier frame; + + /** + * Default constructor for CartesianDirection. + * + */ + public CartesianDirection() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param x Cartesian x coordinate defined in the given frame. + * @param y Cartesian y coordinate defined in the given frame. + * @param z Cartesian z coordinate defined in the given frame. + * @param frame Reference frame within which the direction is expressed (see 4.4.2). + */ + public CartesianDirection(Double x, + Double y, + Double z, + org.ccsds.moims.mo.mal.structures.Identifier frame) { + this.x = x; + this.y = y; + this.z = z; + this.frame = frame; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.CartesianDirection(); + } + + /** + * Returns the field x. + * + * @return The field x + */ + public Double getX() { + return x; + } + + /** + * Returns the field y. + * + * @return The field y + */ + public Double getY() { + return y; + } + + /** + * Returns the field z. + * + * @return The field z + */ + public Double getZ() { + return z; + } + + /** + * Returns the field frame. + * + * @return The field frame + */ + public org.ccsds.moims.mo.mal.structures.Identifier getFrame() { + return frame; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof CartesianDirection) { + if (! super.equals(obj)) { + return false; + } + CartesianDirection other = (CartesianDirection) obj; + if (x == null) { + if (other.x != null) { + return false; + } + } else { + if (! x.equals(other.x)) { + return false; + } + } + if (y == null) { + if (other.y != null) { + return false; + } + } else { + if (! y.equals(other.y)) { + return false; + } + } + if (z == null) { + if (other.z != null) { + return false; + } + } else { + if (! z.equals(other.z)) { + return false; + } + } + if (frame == null) { + if (other.frame != null) { + return false; + } + } else { + if (! frame.equals(other.frame)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = super.hashCode(); + hash = 83 * hash + (x != null ? x.hashCode() : 0); + hash = 83 * hash + (y != null ? y.hashCode() : 0); + hash = 83 * hash + (z != null ? z.hashCode() : 0); + hash = 83 * hash + (frame != null ? frame.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(CartesianDirection: "); + buf.append(super.toString()); + buf.append(", x=").append(x); + buf.append(", y=").append(y); + buf.append(", z=").append(z); + buf.append(", frame=").append(frame); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + super.encode(encoder); + if (x == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'x' cannot be null!"); + } + if (y == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'y' cannot be null!"); + } + if (z == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'z' cannot be null!"); + } + if (frame == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'frame' cannot be null!"); + } + encoder.encodeDouble(x); + encoder.encodeDouble(y); + encoder.encodeDouble(z); + encoder.encodeIdentifier(frame); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + super.decode(decoder); + x = decoder.decodeDouble(); + y = decoder.decodeDouble(); + z = decoder.decodeDouble(); + frame = decoder.decodeIdentifier(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/CartesianDirectionList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/CartesianDirectionList.java new file mode 100644 index 00000000..56ed8656 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/CartesianDirectionList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for CartesianDirection. + */ +public final class CartesianDirectionList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107698L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107698L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for CartesianDirectionList. + * + */ + public CartesianDirectionList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public CartesianDirectionList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public CartesianDirectionList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.CartesianDirection element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.CartesianDirection element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new CartesianDirectionList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.CartesianDirection(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/CartesianPosition.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/CartesianPosition.java new file mode 100644 index 00000000..d1f210b8 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/CartesianPosition.java @@ -0,0 +1,263 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E6: Concrete type representing a Position in Cartesian coordinates. + */ +public final class CartesianPosition extends org.ccsds.moims.mo.mps.structures.Position { + + private static final long serialVersionUID = 1407374900330504L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330504L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Cartesian x coordinate defined in the given frame and with value of the + * given unit. + */ + private Double x; + + /** + * Cartesian y coordinate defined in the given frame and with value of the + * given unit. + */ + private Double y; + + /** + * Cartesian z coordinate defined in the given frame and with value of the + * given unit. + */ + private Double z; + + /** + * Reference frame within which the position is expressed (see 4.4.2). + */ + private org.ccsds.moims.mo.mal.structures.Identifier frame; + + /** + * The units for the quantity of distance. Default = ‘km’. + */ + private String units; + + /** + * Default constructor for CartesianPosition. + * + */ + public CartesianPosition() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param x Cartesian x coordinate defined in the given frame and with value of the given unit. + * @param y Cartesian y coordinate defined in the given frame and with value of the given unit. + * @param z Cartesian z coordinate defined in the given frame and with value of the given unit. + * @param frame Reference frame within which the position is expressed (see 4.4.2). + * @param units The units for the quantity of distance. Default = ‘km’. + */ + public CartesianPosition(Double x, + Double y, + Double z, + org.ccsds.moims.mo.mal.structures.Identifier frame, + String units) { + this.x = x; + this.y = y; + this.z = z; + this.frame = frame; + this.units = units; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param x Cartesian x coordinate defined in the given frame and with value of the given unit. + * @param y Cartesian y coordinate defined in the given frame and with value of the given unit. + * @param z Cartesian z coordinate defined in the given frame and with value of the given unit. + * @param frame Reference frame within which the position is expressed (see 4.4.2). + */ + public CartesianPosition(Double x, + Double y, + Double z, + org.ccsds.moims.mo.mal.structures.Identifier frame) { + this.x = x; + this.y = y; + this.z = z; + this.frame = frame; + this.units = null; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.CartesianPosition(); + } + + /** + * Returns the field x. + * + * @return The field x + */ + public Double getX() { + return x; + } + + /** + * Returns the field y. + * + * @return The field y + */ + public Double getY() { + return y; + } + + /** + * Returns the field z. + * + * @return The field z + */ + public Double getZ() { + return z; + } + + /** + * Returns the field frame. + * + * @return The field frame + */ + public org.ccsds.moims.mo.mal.structures.Identifier getFrame() { + return frame; + } + + /** + * Returns the field units. + * + * @return The field units + */ + public String getUnits() { + return units; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof CartesianPosition) { + if (! super.equals(obj)) { + return false; + } + CartesianPosition other = (CartesianPosition) obj; + if (x == null) { + if (other.x != null) { + return false; + } + } else { + if (! x.equals(other.x)) { + return false; + } + } + if (y == null) { + if (other.y != null) { + return false; + } + } else { + if (! y.equals(other.y)) { + return false; + } + } + if (z == null) { + if (other.z != null) { + return false; + } + } else { + if (! z.equals(other.z)) { + return false; + } + } + if (frame == null) { + if (other.frame != null) { + return false; + } + } else { + if (! frame.equals(other.frame)) { + return false; + } + } + if (units == null) { + if (other.units != null) { + return false; + } + } else { + if (! units.equals(other.units)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = super.hashCode(); + hash = 83 * hash + (x != null ? x.hashCode() : 0); + hash = 83 * hash + (y != null ? y.hashCode() : 0); + hash = 83 * hash + (z != null ? z.hashCode() : 0); + hash = 83 * hash + (frame != null ? frame.hashCode() : 0); + hash = 83 * hash + (units != null ? units.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(CartesianPosition: "); + buf.append(super.toString()); + buf.append(", x=").append(x); + buf.append(", y=").append(y); + buf.append(", z=").append(z); + buf.append(", frame=").append(frame); + buf.append(", units=").append(units); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + super.encode(encoder); + if (x == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'x' cannot be null!"); + } + if (y == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'y' cannot be null!"); + } + if (z == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'z' cannot be null!"); + } + if (frame == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'frame' cannot be null!"); + } + encoder.encodeDouble(x); + encoder.encodeDouble(y); + encoder.encodeDouble(z); + encoder.encodeIdentifier(frame); + encoder.encodeNullableString(units); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + super.decode(decoder); + x = decoder.decodeDouble(); + y = decoder.decodeDouble(); + z = decoder.decodeDouble(); + frame = decoder.decodeIdentifier(); + units = decoder.decodeNullableString(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/CartesianPositionList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/CartesianPositionList.java new file mode 100644 index 00000000..a4abd96f --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/CartesianPositionList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for CartesianPosition. + */ +public final class CartesianPositionList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107704L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107704L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for CartesianPositionList. + * + */ + public CartesianPositionList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public CartesianPositionList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public CartesianPositionList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.CartesianPosition element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.CartesianPosition element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new CartesianPositionList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.CartesianPosition(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ComplexEffect.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ComplexEffect.java new file mode 100644 index 00000000..056674a9 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ComplexEffect.java @@ -0,0 +1,299 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E5: In the simple effect, the value of the impacted planning resource is + * set to the specified value at a single point in time. With the complex + * effect, the value of the impacted planning resource can be evolved over + * a specified time period in accordance with a defined RelativeResourceProfile. + */ +public final class ComplexEffect extends org.ccsds.moims.mo.mps.structures.Effect { + + private static final long serialVersionUID = 1407374900330546L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330546L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Identifies the point in the duration of the applicable planning activity + * to which the start of the effect period relates. Default is the start of + * the planning activity. + */ + private org.ccsds.moims.mo.mps.structures.Slider startRef; + + /** + * Identifies the point in the duration of the applicable planning activity + * to which the end of the effect period relates. Default is the end of the + * planning activity. + */ + private org.ccsds.moims.mo.mps.structures.Slider endRef; + + /** + * Offset from startRef that specifies the start of the effect period. A + * positive offset implies a shift later in time. Default is no offset. + */ + private org.ccsds.moims.mo.mal.structures.Element startOffset; + + /** + * Offset from endRef that specifies the end of the effect period. A positive + * offset implies a shift later in time. Default is no offset. + */ + private org.ccsds.moims.mo.mal.structures.Element endOffset; + + /** + * Operation to be performed on the planning resource. One of: SET, INCREASE, + * DECREASE. Increase and decrease are only applicable to numeric data types. + */ + private org.ccsds.moims.mo.mps.structures.EffectOperationEnum operator; + + /** + * Resource profile specifying an evolving value to which the value of the + * planning resource is to be set if the Effect operator is SET; or to be + * increased/decreased by if it is INCREASE or DECREASE (see 4.5.4.4). + */ + private org.ccsds.moims.mo.mps.structures.RelativeResourceProfile valueProfile; + + /** + * Default constructor for ComplexEffect. + * + */ + public ComplexEffect() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param resourceRef Identifies the planning resource that is constrained for the duration of the planning activity. + * @param startRef Identifies the point in the duration of the applicable planning activity to which the start of the effect period relates. Default is the start of the planning activity. + * @param endRef Identifies the point in the duration of the applicable planning activity to which the end of the effect period relates. Default is the end of the planning activity. + * @param startOffset Offset from startRef that specifies the start of the effect period. A positive offset implies a shift later in time. Default is no offset. + * @param endOffset Offset from endRef that specifies the end of the effect period. A positive offset implies a shift later in time. Default is no offset. + * @param operator Operation to be performed on the planning resource. One of: SET, INCREASE, DECREASE. Increase and decrease are only applicable to numeric data types. + * @param valueProfile Resource profile specifying an evolving value to which the value of the planning resource is to be set if the Effect operator is SET; or to be increased/decreased by if it is INCREASE or DECREASE (see 4.5.4.4). + */ + public ComplexEffect(org.ccsds.moims.mo.mal.structures.ObjectRef resourceRef, + org.ccsds.moims.mo.mps.structures.Slider startRef, + org.ccsds.moims.mo.mps.structures.Slider endRef, + org.ccsds.moims.mo.mal.structures.Element startOffset, + org.ccsds.moims.mo.mal.structures.Element endOffset, + org.ccsds.moims.mo.mps.structures.EffectOperationEnum operator, + org.ccsds.moims.mo.mps.structures.RelativeResourceProfile valueProfile) { + super(resourceRef); + this.startRef = startRef; + this.endRef = endRef; + this.startOffset = startOffset; + this.endOffset = endOffset; + this.operator = operator; + this.valueProfile = valueProfile; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param resourceRef Identifies the planning resource that is constrained for the duration of the planning activity. + * @param operator Operation to be performed on the planning resource. One of: SET, INCREASE, DECREASE. Increase and decrease are only applicable to numeric data types. + * @param valueProfile Resource profile specifying an evolving value to which the value of the planning resource is to be set if the Effect operator is SET; or to be increased/decreased by if it is INCREASE or DECREASE (see 4.5.4.4). + */ + public ComplexEffect(org.ccsds.moims.mo.mal.structures.ObjectRef resourceRef, + org.ccsds.moims.mo.mps.structures.EffectOperationEnum operator, + org.ccsds.moims.mo.mps.structures.RelativeResourceProfile valueProfile) { + super(resourceRef); + this.startRef = null; + this.endRef = null; + this.startOffset = null; + this.endOffset = null; + this.operator = operator; + this.valueProfile = valueProfile; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.ComplexEffect(); + } + + /** + * Returns the field startRef. + * + * @return The field startRef + */ + public org.ccsds.moims.mo.mps.structures.Slider getStartRef() { + return startRef; + } + + /** + * Returns the field endRef. + * + * @return The field endRef + */ + public org.ccsds.moims.mo.mps.structures.Slider getEndRef() { + return endRef; + } + + /** + * Returns the field startOffset. + * + * @return The field startOffset + */ + public org.ccsds.moims.mo.mal.structures.Element getStartOffset() { + return startOffset; + } + + /** + * Returns the field endOffset. + * + * @return The field endOffset + */ + public org.ccsds.moims.mo.mal.structures.Element getEndOffset() { + return endOffset; + } + + /** + * Returns the field operator. + * + * @return The field operator + */ + public org.ccsds.moims.mo.mps.structures.EffectOperationEnum getOperator() { + return operator; + } + + /** + * Returns the field valueProfile. + * + * @return The field valueProfile + */ + public org.ccsds.moims.mo.mps.structures.RelativeResourceProfile getValueProfile() { + return valueProfile; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ComplexEffect) { + if (! super.equals(obj)) { + return false; + } + ComplexEffect other = (ComplexEffect) obj; + if (startRef == null) { + if (other.startRef != null) { + return false; + } + } else { + if (! startRef.equals(other.startRef)) { + return false; + } + } + if (endRef == null) { + if (other.endRef != null) { + return false; + } + } else { + if (! endRef.equals(other.endRef)) { + return false; + } + } + if (startOffset == null) { + if (other.startOffset != null) { + return false; + } + } else { + if (! startOffset.equals(other.startOffset)) { + return false; + } + } + if (endOffset == null) { + if (other.endOffset != null) { + return false; + } + } else { + if (! endOffset.equals(other.endOffset)) { + return false; + } + } + if (operator == null) { + if (other.operator != null) { + return false; + } + } else { + if (! operator.equals(other.operator)) { + return false; + } + } + if (valueProfile == null) { + if (other.valueProfile != null) { + return false; + } + } else { + if (! valueProfile.equals(other.valueProfile)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = super.hashCode(); + hash = 83 * hash + (startRef != null ? startRef.hashCode() : 0); + hash = 83 * hash + (endRef != null ? endRef.hashCode() : 0); + hash = 83 * hash + (startOffset != null ? startOffset.hashCode() : 0); + hash = 83 * hash + (endOffset != null ? endOffset.hashCode() : 0); + hash = 83 * hash + (operator != null ? operator.hashCode() : 0); + hash = 83 * hash + (valueProfile != null ? valueProfile.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(ComplexEffect: "); + buf.append(super.toString()); + buf.append(", startRef=").append(startRef); + buf.append(", endRef=").append(endRef); + buf.append(", startOffset=").append(startOffset); + buf.append(", endOffset=").append(endOffset); + buf.append(", operator=").append(operator); + buf.append(", valueProfile=").append(valueProfile); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + super.encode(encoder); + if (operator == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'operator' cannot be null!"); + } + if (valueProfile == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'valueProfile' cannot be null!"); + } + encoder.encodeNullableElement(startRef); + encoder.encodeNullableElement(endRef); + encoder.encodeNullableAbstractElement(startOffset); + encoder.encodeNullableAbstractElement(endOffset); + encoder.encodeElement(operator); + encoder.encodeElement(valueProfile); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + super.decode(decoder); + startRef = (org.ccsds.moims.mo.mps.structures.Slider) decoder.decodeNullableElement(new org.ccsds.moims.mo.mps.structures.Slider()); + endRef = (org.ccsds.moims.mo.mps.structures.Slider) decoder.decodeNullableElement(new org.ccsds.moims.mo.mps.structures.Slider()); + startOffset = (org.ccsds.moims.mo.mal.structures.Element) decoder.decodeNullableAbstractElement(); + endOffset = (org.ccsds.moims.mo.mal.structures.Element) decoder.decodeNullableAbstractElement(); + operator = (org.ccsds.moims.mo.mps.structures.EffectOperationEnum) decoder.decodeElement(org.ccsds.moims.mo.mps.structures.EffectOperationEnum.SET); + valueProfile = (org.ccsds.moims.mo.mps.structures.RelativeResourceProfile) decoder.decodeElement(new org.ccsds.moims.mo.mps.structures.RelativeResourceProfile()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ComplexEffectList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ComplexEffectList.java new file mode 100644 index 00000000..fff046cc --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ComplexEffectList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for ComplexEffect. + */ +public final class ComplexEffectList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107662L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107662L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for ComplexEffectList. + * + */ + public ComplexEffectList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public ComplexEffectList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public ComplexEffectList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.ComplexEffect element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.ComplexEffect element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new ComplexEffectList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.ComplexEffect(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ComplexResourceConstraint.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ComplexResourceConstraint.java new file mode 100644 index 00000000..f63bb3ee --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ComplexResourceConstraint.java @@ -0,0 +1,275 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E5: In the [simple] resource constraint, the value of the referenced planning + * resource is constrained against a single value for the entire duration + * of the planning activity to which the constraint applies. With the complex + * resource constraint, the period over which the constraint applies can be + * customized relative to the planning activity to which the constraint applies; + * and the value against which the referenced planning resource is constrained + * can be specified as a relative resource profile which evolves over time. + * The fields of the complex resource constraint extend or modify those of + * the [simple] resource constraint as given below. + */ +public final class ComplexResourceConstraint extends org.ccsds.moims.mo.mps.structures.ResourceConstraint { + + private static final long serialVersionUID = 1407374900330534L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330534L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Identifies the point in the duration of the applicable planning activity + * to which the start of the constraint period relates. Default is the start + * of the planning activity. + */ + private org.ccsds.moims.mo.mps.structures.Slider startRef; + + /** + * Identifies the point in the duration of the applicable planning activity + * to which the end of the constraint period relates. Default is the end of + * the planning activity. + */ + private org.ccsds.moims.mo.mps.structures.Slider endRef; + + /** + * Offset from startRef that specifies the start of the constraint period. + * A positive offset implies a shift later in time. Default is no offset. + */ + private org.ccsds.moims.mo.mal.structures.Element startOffset; + + /** + * Offset from endRef that specifies the end of the constraint period. A + * positive offset implies a shift later in time. Default is no offset. + */ + private org.ccsds.moims.mo.mal.structures.Element endOffset; + + /** + * ResourceProfile specifying an evolving value over time against which the + * value of the planning resource is to be compared (see 4.5.4.4). + */ + private org.ccsds.moims.mo.mps.structures.RelativeResourceProfile valueProfile; + + /** + * Default constructor for ComplexResourceConstraint. + * + */ + public ComplexResourceConstraint() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param negate Specifies whether the result of combining the Constraints is to be inverted (NOT function). Default = False. + * @param resourceRef Identifies the planning resource that is constrained for the duration of the planning activity. + * @param comparator Comparison operator, which may be one of: =, !=, _, _=, _, _=, contains, icontains. The contains operator only applies to strings and may be case sensitive or insensitive. + * @param startRef Identifies the point in the duration of the applicable planning activity to which the start of the constraint period relates. Default is the start of the planning activity. + * @param endRef Identifies the point in the duration of the applicable planning activity to which the end of the constraint period relates. Default is the end of the planning activity. + * @param startOffset Offset from startRef that specifies the start of the constraint period. A positive offset implies a shift later in time. Default is no offset. + * @param endOffset Offset from endRef that specifies the end of the constraint period. A positive offset implies a shift later in time. Default is no offset. + * @param valueProfile ResourceProfile specifying an evolving value over time against which the value of the planning resource is to be compared (see 4.5.4.4). + */ + public ComplexResourceConstraint(Boolean negate, + org.ccsds.moims.mo.mal.structures.ObjectRef resourceRef, + org.ccsds.moims.mo.mps.structures.ExpressionOperatorEnum comparator, + org.ccsds.moims.mo.mps.structures.Slider startRef, + org.ccsds.moims.mo.mps.structures.Slider endRef, + org.ccsds.moims.mo.mal.structures.Element startOffset, + org.ccsds.moims.mo.mal.structures.Element endOffset, + org.ccsds.moims.mo.mps.structures.RelativeResourceProfile valueProfile) { + super(negate, + resourceRef, + comparator); + this.startRef = startRef; + this.endRef = endRef; + this.startOffset = startOffset; + this.endOffset = endOffset; + this.valueProfile = valueProfile; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param resourceRef Identifies the planning resource that is constrained for the duration of the planning activity. + * @param comparator Comparison operator, which may be one of: =, !=, _, _=, _, _=, contains, icontains. The contains operator only applies to strings and may be case sensitive or insensitive. + * @param valueProfile ResourceProfile specifying an evolving value over time against which the value of the planning resource is to be compared (see 4.5.4.4). + */ + public ComplexResourceConstraint(org.ccsds.moims.mo.mal.structures.ObjectRef resourceRef, + org.ccsds.moims.mo.mps.structures.ExpressionOperatorEnum comparator, + org.ccsds.moims.mo.mps.structures.RelativeResourceProfile valueProfile) { + super(resourceRef, + comparator); + this.startRef = null; + this.endRef = null; + this.startOffset = null; + this.endOffset = null; + this.valueProfile = valueProfile; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.ComplexResourceConstraint(); + } + + /** + * Returns the field startRef. + * + * @return The field startRef + */ + public org.ccsds.moims.mo.mps.structures.Slider getStartRef() { + return startRef; + } + + /** + * Returns the field endRef. + * + * @return The field endRef + */ + public org.ccsds.moims.mo.mps.structures.Slider getEndRef() { + return endRef; + } + + /** + * Returns the field startOffset. + * + * @return The field startOffset + */ + public org.ccsds.moims.mo.mal.structures.Element getStartOffset() { + return startOffset; + } + + /** + * Returns the field endOffset. + * + * @return The field endOffset + */ + public org.ccsds.moims.mo.mal.structures.Element getEndOffset() { + return endOffset; + } + + /** + * Returns the field valueProfile. + * + * @return The field valueProfile + */ + public org.ccsds.moims.mo.mps.structures.RelativeResourceProfile getValueProfile() { + return valueProfile; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ComplexResourceConstraint) { + if (! super.equals(obj)) { + return false; + } + ComplexResourceConstraint other = (ComplexResourceConstraint) obj; + if (startRef == null) { + if (other.startRef != null) { + return false; + } + } else { + if (! startRef.equals(other.startRef)) { + return false; + } + } + if (endRef == null) { + if (other.endRef != null) { + return false; + } + } else { + if (! endRef.equals(other.endRef)) { + return false; + } + } + if (startOffset == null) { + if (other.startOffset != null) { + return false; + } + } else { + if (! startOffset.equals(other.startOffset)) { + return false; + } + } + if (endOffset == null) { + if (other.endOffset != null) { + return false; + } + } else { + if (! endOffset.equals(other.endOffset)) { + return false; + } + } + if (valueProfile == null) { + if (other.valueProfile != null) { + return false; + } + } else { + if (! valueProfile.equals(other.valueProfile)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = super.hashCode(); + hash = 83 * hash + (startRef != null ? startRef.hashCode() : 0); + hash = 83 * hash + (endRef != null ? endRef.hashCode() : 0); + hash = 83 * hash + (startOffset != null ? startOffset.hashCode() : 0); + hash = 83 * hash + (endOffset != null ? endOffset.hashCode() : 0); + hash = 83 * hash + (valueProfile != null ? valueProfile.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(ComplexResourceConstraint: "); + buf.append(super.toString()); + buf.append(", startRef=").append(startRef); + buf.append(", endRef=").append(endRef); + buf.append(", startOffset=").append(startOffset); + buf.append(", endOffset=").append(endOffset); + buf.append(", valueProfile=").append(valueProfile); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + super.encode(encoder); + if (valueProfile == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'valueProfile' cannot be null!"); + } + encoder.encodeNullableElement(startRef); + encoder.encodeNullableElement(endRef); + encoder.encodeNullableAbstractElement(startOffset); + encoder.encodeNullableAbstractElement(endOffset); + encoder.encodeElement(valueProfile); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + super.decode(decoder); + startRef = (org.ccsds.moims.mo.mps.structures.Slider) decoder.decodeNullableElement(new org.ccsds.moims.mo.mps.structures.Slider()); + endRef = (org.ccsds.moims.mo.mps.structures.Slider) decoder.decodeNullableElement(new org.ccsds.moims.mo.mps.structures.Slider()); + startOffset = (org.ccsds.moims.mo.mal.structures.Element) decoder.decodeNullableAbstractElement(); + endOffset = (org.ccsds.moims.mo.mal.structures.Element) decoder.decodeNullableAbstractElement(); + valueProfile = (org.ccsds.moims.mo.mps.structures.RelativeResourceProfile) decoder.decodeElement(new org.ccsds.moims.mo.mps.structures.RelativeResourceProfile()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ComplexResourceConstraintList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ComplexResourceConstraintList.java new file mode 100644 index 00000000..fd278eac --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ComplexResourceConstraintList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for ComplexResourceConstraint. + */ +public final class ComplexResourceConstraintList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107674L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107674L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for ComplexResourceConstraintList. + * + */ + public ComplexResourceConstraintList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public ComplexResourceConstraintList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public ComplexResourceConstraintList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.ComplexResourceConstraint element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.ComplexResourceConstraint element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new ComplexResourceConstraintList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.ComplexResourceConstraint(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/Constraint.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/Constraint.java new file mode 100644 index 00000000..b92ff8e9 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/Constraint.java @@ -0,0 +1,85 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E1: Abstract type representing a planning constraint, a Boolean condition + * which restricts the planning of planning activities. + */ +public abstract class Constraint implements org.ccsds.moims.mo.mal.structures.Composite { + + /** + * Specifies whether the result of combining the Constraints is to be inverted + * (NOT function). Default = False. + */ + private Boolean negate; + + /** + * Default constructor for Constraint. + * + */ + public Constraint() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param negate Specifies whether the result of combining the Constraints is to be inverted (NOT function). Default = False. + */ + public Constraint(Boolean negate) { + this.negate = negate; + } + + /** + * Returns the field negate. + * + * @return The field negate + */ + public Boolean getNegate() { + return negate; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Constraint) { + Constraint other = (Constraint) obj; + if (negate == null) { + if (other.negate != null) { + return false; + } + } else { + if (! negate.equals(other.negate)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (negate != null ? negate.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(Constraint: "); + buf.append("negate=").append(negate); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeNullableBoolean(negate); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + negate = decoder.decodeNullableBoolean(); + return this; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ConstraintExpression.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ConstraintExpression.java new file mode 100644 index 00000000..58aeb045 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ConstraintExpression.java @@ -0,0 +1,137 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E1: All types of constraint can be considered conditions that are either + * met or not met when a planning activity is placed in a Plan. They can + * therefore be specified as a potentially complex Boolean expression that + * combines references to the arguments and fields of objects in the MPS information + * model using operators of various types (arithmetic, comparative, logical, + * string, temporal, and geometric). The expression must evaluate to True + * for the constraint to be met. As introduced in 1.2, this Recommended Standard + * does not define a full expression language capable of supporting such complex + * Boolean expressions. It does, however, support the use of externally defined + * expression languages. The ConstraintExpression type allows for the use + * of such an expression language to define any type of constraint, providing + * communicating entities all have the capability to evaluate that expression + * language. + */ +public final class ConstraintExpression extends org.ccsds.moims.mo.mps.structures.Constraint { + + private static final long serialVersionUID = 1407374900330527L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330527L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Potentially complex conditional expression that must evaluate to True for + * the constraint to be met. + */ + private org.ccsds.moims.mo.mal.structures.Element constraint; + + /** + * Default constructor for ConstraintExpression. + * + */ + public ConstraintExpression() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param negate Specifies whether the result of combining the Constraints is to be inverted (NOT function). Default = False. + * @param constraint Potentially complex conditional expression that must evaluate to True for the constraint to be met. + */ + public ConstraintExpression(Boolean negate, + org.ccsds.moims.mo.mal.structures.Element constraint) { + super(negate); + this.constraint = constraint; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param constraint Potentially complex conditional expression that must evaluate to True for the constraint to be met. + */ + public ConstraintExpression(org.ccsds.moims.mo.mal.structures.Element constraint) { + this.constraint = constraint; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.ConstraintExpression(); + } + + /** + * Returns the field constraint. + * + * @return The field constraint + */ + public org.ccsds.moims.mo.mal.structures.Element getConstraint() { + return constraint; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ConstraintExpression) { + if (! super.equals(obj)) { + return false; + } + ConstraintExpression other = (ConstraintExpression) obj; + if (constraint == null) { + if (other.constraint != null) { + return false; + } + } else { + if (! constraint.equals(other.constraint)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = super.hashCode(); + hash = 83 * hash + (constraint != null ? constraint.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(ConstraintExpression: "); + buf.append(super.toString()); + buf.append(", constraint=").append(constraint); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + super.encode(encoder); + if (constraint == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'constraint' cannot be null!"); + } + encoder.encodeAbstractElement(constraint); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + super.decode(decoder); + constraint = (org.ccsds.moims.mo.mal.structures.Element) decoder.decodeAbstractElement(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ConstraintExpressionList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ConstraintExpressionList.java new file mode 100644 index 00000000..74679784 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ConstraintExpressionList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for ConstraintExpression. + */ +public final class ConstraintExpressionList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107681L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107681L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for ConstraintExpressionList. + * + */ + public ConstraintExpressionList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public ConstraintExpressionList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public ConstraintExpressionList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.ConstraintExpression element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.ConstraintExpression element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new ConstraintExpressionList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.ConstraintExpression(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ConstraintList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ConstraintList.java new file mode 100644 index 00000000..8c0bdfa7 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ConstraintList.java @@ -0,0 +1,23 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for Constraint. + */ +public final class ConstraintList extends org.ccsds.moims.mo.mal.structures.HeterogeneousList { + + /** + * Default constructor for ConstraintList. + * + */ + public ConstraintList() { + } + + @Override + public boolean add(org.ccsds.moims.mo.mal.structures.Element element) { + if (element != null && !(element instanceof Constraint)) { + throw new java.lang.ClassCastException("The added element does not extend the type: Constraint"); + } + return super.add(element); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ConstraintNode.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ConstraintNode.java new file mode 100644 index 00000000..7062f11b --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ConstraintNode.java @@ -0,0 +1,160 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E1: Multiple planning constraints can be combined using a ConstraintNode. + * The ConstraintNode specifies the logical operation (AND or OR) to be used + * when combining a set of constraints together. As the ConstraintNode is + * itself defined as a sub-type of Constraint, it is possible to construct + * a tree of ConstraintNodes using different logical operators. + */ +public final class ConstraintNode extends org.ccsds.moims.mo.mps.structures.Constraint { + + private static final long serialVersionUID = 1407374900330525L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330525L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Enumeration specifying the logic for combining multiple Boolean conditions + * together. One of {AND, OR}. Default = AND. + */ + private org.ccsds.moims.mo.mps.structures.LogicOpEnum operator; + + /** + * The set of Constraints to be combined. Must contain at least one element. + */ + private org.ccsds.moims.mo.mps.structures.ConstraintList constraints; + + /** + * Default constructor for ConstraintNode. + * + */ + public ConstraintNode() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param negate Specifies whether the result of combining the Constraints is to be inverted (NOT function). Default = False. + * @param operator Enumeration specifying the logic for combining multiple Boolean conditions together. One of {AND, OR}. Default = AND. + * @param constraints The set of Constraints to be combined. Must contain at least one element. + */ + public ConstraintNode(Boolean negate, + org.ccsds.moims.mo.mps.structures.LogicOpEnum operator, + org.ccsds.moims.mo.mps.structures.ConstraintList constraints) { + super(negate); + this.operator = operator; + this.constraints = constraints; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param constraints The set of Constraints to be combined. Must contain at least one element. + */ + public ConstraintNode(org.ccsds.moims.mo.mps.structures.ConstraintList constraints) { + this.operator = null; + this.constraints = constraints; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.ConstraintNode(); + } + + /** + * Returns the field operator. + * + * @return The field operator + */ + public org.ccsds.moims.mo.mps.structures.LogicOpEnum getOperator() { + return operator; + } + + /** + * Returns the field constraints. + * + * @return The field constraints + */ + public org.ccsds.moims.mo.mps.structures.ConstraintList getConstraints() { + return constraints; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ConstraintNode) { + if (! super.equals(obj)) { + return false; + } + ConstraintNode other = (ConstraintNode) obj; + if (operator == null) { + if (other.operator != null) { + return false; + } + } else { + if (! operator.equals(other.operator)) { + return false; + } + } + if (constraints == null) { + if (other.constraints != null) { + return false; + } + } else { + if (! constraints.equals(other.constraints)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = super.hashCode(); + hash = 83 * hash + (operator != null ? operator.hashCode() : 0); + hash = 83 * hash + (constraints != null ? constraints.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(ConstraintNode: "); + buf.append(super.toString()); + buf.append(", operator=").append(operator); + buf.append(", constraints=").append(constraints); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + super.encode(encoder); + if (constraints == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'constraints' cannot be null!"); + } + encoder.encodeNullableElement(operator); + encoder.encodeElement(constraints); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + super.decode(decoder); + operator = (org.ccsds.moims.mo.mps.structures.LogicOpEnum) decoder.decodeNullableElement(org.ccsds.moims.mo.mps.structures.LogicOpEnum.AND); + constraints = (org.ccsds.moims.mo.mps.structures.ConstraintList) decoder.decodeElement(new org.ccsds.moims.mo.mps.structures.ConstraintList()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ConstraintNodeList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ConstraintNodeList.java new file mode 100644 index 00000000..c3f7fcfe --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ConstraintNodeList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for ConstraintNode. + */ +public final class ConstraintNodeList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107683L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107683L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for ConstraintNodeList. + * + */ + public ConstraintNodeList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public ConstraintNodeList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public ConstraintNodeList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.ConstraintNode element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.ConstraintNode element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new ConstraintNodeList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.ConstraintNode(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/DefListEntry.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/DefListEntry.java new file mode 100644 index 00000000..1ee6a270 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/DefListEntry.java @@ -0,0 +1,142 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E1: Used in the context of the MPS Plan Information Management service, + * this holds a list of definitions for a specified type of MPS service object, + * together with their definitions. + */ +public final class DefListEntry implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1407374900330503L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330503L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Object Type: ActivityDefinition | EventDefinition | Resource | RequestDefinition. + * Reference to an Item. + */ + private org.ccsds.moims.mo.mal.structures.ObjectRef definitionID; + + /** + * Description of the item. + */ + private String description; + + /** + * Default constructor for DefListEntry. + * + */ + public DefListEntry() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param definitionID Object Type: ActivityDefinition | EventDefinition | Resource | RequestDefinition. Reference to an Item. + * @param description Description of the item. + */ + public DefListEntry(org.ccsds.moims.mo.mal.structures.ObjectRef definitionID, + String description) { + this.definitionID = definitionID; + this.description = description; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.DefListEntry(); + } + + /** + * Returns the field definitionID. + * + * @return The field definitionID + */ + public org.ccsds.moims.mo.mal.structures.ObjectRef getDefinitionID() { + return definitionID; + } + + /** + * Returns the field description. + * + * @return The field description + */ + public String getDescription() { + return description; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof DefListEntry) { + DefListEntry other = (DefListEntry) obj; + if (definitionID == null) { + if (other.definitionID != null) { + return false; + } + } else { + if (! definitionID.equals(other.definitionID)) { + return false; + } + } + if (description == null) { + if (other.description != null) { + return false; + } + } else { + if (! description.equals(other.description)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (definitionID != null ? definitionID.hashCode() : 0); + hash = 83 * hash + (description != null ? description.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(DefListEntry: "); + buf.append("definitionID=").append(definitionID); + buf.append(", description=").append(description); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (definitionID == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'definitionID' cannot be null!"); + } + if (description == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'description' cannot be null!"); + } + encoder.encodeAbstractElement(definitionID); + encoder.encodeString(description); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + definitionID = (org.ccsds.moims.mo.mal.structures.ObjectRef) decoder.decodeAbstractElement(); + description = decoder.decodeString(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/DefListEntryList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/DefListEntryList.java new file mode 100644 index 00000000..6bc81e9b --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/DefListEntryList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for DefListEntry. + */ +public final class DefListEntryList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107705L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107705L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for DefListEntryList. + * + */ + public DefListEntryList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public DefListEntryList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public DefListEntryList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.DefListEntry element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.DefListEntry element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new DefListEntryList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.DefListEntry(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/Direction.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/Direction.java new file mode 100644 index 00000000..e011629e --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/Direction.java @@ -0,0 +1,48 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E6: Abstract type that represents a unique direction in three-dimensional + * space. The actual manner in which this direction is evaluated depends + * on the concrete subtype used. + */ +public abstract class Direction implements org.ccsds.moims.mo.mal.structures.Composite { + + /** + * Default constructor for Direction. + * + */ + public Direction() { + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Direction) { + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(Direction: "); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + return this; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/DirectionList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/DirectionList.java new file mode 100644 index 00000000..f14967ea --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/DirectionList.java @@ -0,0 +1,23 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for Direction. + */ +public final class DirectionList extends org.ccsds.moims.mo.mal.structures.HeterogeneousList { + + /** + * Default constructor for DirectionList. + * + */ + public DirectionList() { + } + + @Override + public boolean add(org.ccsds.moims.mo.mal.structures.Element element) { + if (element != null && !(element instanceof Direction)) { + throw new java.lang.ClassCastException("The added element does not extend the type: Direction"); + } + return super.add(element); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/DirectionReference.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/DirectionReference.java new file mode 100644 index 00000000..de253f6e --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/DirectionReference.java @@ -0,0 +1,113 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E6: A DirectionReference is a Direction that may be computed following + * some mission specific definition. + */ +public final class DirectionReference extends org.ccsds.moims.mo.mps.structures.Direction { + + private static final long serialVersionUID = 1407374900330514L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330514L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Name of a mission specific direction definition. + */ + private org.ccsds.moims.mo.mal.structures.Identifier reference; + + /** + * Default constructor for DirectionReference. + * + */ + public DirectionReference() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param reference Name of a mission specific direction definition. + */ + public DirectionReference(org.ccsds.moims.mo.mal.structures.Identifier reference) { + this.reference = reference; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.DirectionReference(); + } + + /** + * Returns the field reference. + * + * @return The field reference + */ + public org.ccsds.moims.mo.mal.structures.Identifier getReference() { + return reference; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof DirectionReference) { + if (! super.equals(obj)) { + return false; + } + DirectionReference other = (DirectionReference) obj; + if (reference == null) { + if (other.reference != null) { + return false; + } + } else { + if (! reference.equals(other.reference)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = super.hashCode(); + hash = 83 * hash + (reference != null ? reference.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(DirectionReference: "); + buf.append(super.toString()); + buf.append(", reference=").append(reference); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + super.encode(encoder); + if (reference == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'reference' cannot be null!"); + } + encoder.encodeIdentifier(reference); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + super.decode(decoder); + reference = decoder.decodeIdentifier(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/DirectionReferenceList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/DirectionReferenceList.java new file mode 100644 index 00000000..91961c06 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/DirectionReferenceList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for DirectionReference. + */ +public final class DirectionReferenceList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107694L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107694L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for DirectionReferenceList. + * + */ + public DirectionReferenceList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public DirectionReferenceList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public DirectionReferenceList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.DirectionReference element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.DirectionReference element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new DirectionReferenceList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.DirectionReference(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/DirectionRepetition.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/DirectionRepetition.java new file mode 100644 index 00000000..ed1da9aa --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/DirectionRepetition.java @@ -0,0 +1,244 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E6: A sub-type of Repetition based on direction, which supports the specification + * of astronomical surveys. + */ +public final class DirectionRepetition extends org.ccsds.moims.mo.mps.structures.Repetition { + + private static final long serialVersionUID = 1407374900330555L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330555L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Nominal direction of first occurrence. + */ + private org.ccsds.moims.mo.mal.structures.Element initialDirection; + + /** + * Specifies the direction of repetition as line connecting the initial and + * target directions. + */ + private org.ccsds.moims.mo.mal.structures.Element targetDirection; + + /** + * The required angle between occurrences. + */ + private org.ccsds.moims.mo.mal.structures.Element separation; + + /** + * The allowed tolerance (+/-) in the required angle between occurrences, + * the interpretation of which is dependent on the separationType. + */ + private org.ccsds.moims.mo.mal.structures.Element tolerance; + + /** + * Default constructor for DirectionRepetition. + * + */ + public DirectionRepetition() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param count Maximum number of repeat cycles/instances. If not specified there is no limit to the number of repetitions. + * @param timeWindow Time period over which the repetition is applicable. If not specified repetition continues indefinitely. + * @param separationType Specifies whether the repetition interval is Relative to the previous occurrence, or Absolute for all occurrences. + * @param initialDirection Nominal direction of first occurrence. + * @param targetDirection Specifies the direction of repetition as line connecting the initial and target directions. + * @param separation The required angle between occurrences. + * @param tolerance The allowed tolerance (+/-) in the required angle between occurrences, the interpretation of which is dependent on the separationType. + */ + public DirectionRepetition(Integer count, + org.ccsds.moims.mo.mps.structures.TimeWindow timeWindow, + org.ccsds.moims.mo.mps.structures.SeparationTypeEnum separationType, + org.ccsds.moims.mo.mal.structures.Element initialDirection, + org.ccsds.moims.mo.mal.structures.Element targetDirection, + org.ccsds.moims.mo.mal.structures.Element separation, + org.ccsds.moims.mo.mal.structures.Element tolerance) { + super(count, + timeWindow, + separationType); + this.initialDirection = initialDirection; + this.targetDirection = targetDirection; + this.separation = separation; + this.tolerance = tolerance; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param separationType Specifies whether the repetition interval is Relative to the previous occurrence, or Absolute for all occurrences. + * @param initialDirection Nominal direction of first occurrence. + * @param targetDirection Specifies the direction of repetition as line connecting the initial and target directions. + * @param separation The required angle between occurrences. + * @param tolerance The allowed tolerance (+/-) in the required angle between occurrences, the interpretation of which is dependent on the separationType. + */ + public DirectionRepetition(org.ccsds.moims.mo.mps.structures.SeparationTypeEnum separationType, + org.ccsds.moims.mo.mal.structures.Element initialDirection, + org.ccsds.moims.mo.mal.structures.Element targetDirection, + org.ccsds.moims.mo.mal.structures.Element separation, + org.ccsds.moims.mo.mal.structures.Element tolerance) { + super(separationType); + this.initialDirection = initialDirection; + this.targetDirection = targetDirection; + this.separation = separation; + this.tolerance = tolerance; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.DirectionRepetition(); + } + + /** + * Returns the field initialDirection. + * + * @return The field initialDirection + */ + public org.ccsds.moims.mo.mal.structures.Element getInitialDirection() { + return initialDirection; + } + + /** + * Returns the field targetDirection. + * + * @return The field targetDirection + */ + public org.ccsds.moims.mo.mal.structures.Element getTargetDirection() { + return targetDirection; + } + + /** + * Returns the field separation. + * + * @return The field separation + */ + public org.ccsds.moims.mo.mal.structures.Element getSeparation() { + return separation; + } + + /** + * Returns the field tolerance. + * + * @return The field tolerance + */ + public org.ccsds.moims.mo.mal.structures.Element getTolerance() { + return tolerance; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof DirectionRepetition) { + if (! super.equals(obj)) { + return false; + } + DirectionRepetition other = (DirectionRepetition) obj; + if (initialDirection == null) { + if (other.initialDirection != null) { + return false; + } + } else { + if (! initialDirection.equals(other.initialDirection)) { + return false; + } + } + if (targetDirection == null) { + if (other.targetDirection != null) { + return false; + } + } else { + if (! targetDirection.equals(other.targetDirection)) { + return false; + } + } + if (separation == null) { + if (other.separation != null) { + return false; + } + } else { + if (! separation.equals(other.separation)) { + return false; + } + } + if (tolerance == null) { + if (other.tolerance != null) { + return false; + } + } else { + if (! tolerance.equals(other.tolerance)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = super.hashCode(); + hash = 83 * hash + (initialDirection != null ? initialDirection.hashCode() : 0); + hash = 83 * hash + (targetDirection != null ? targetDirection.hashCode() : 0); + hash = 83 * hash + (separation != null ? separation.hashCode() : 0); + hash = 83 * hash + (tolerance != null ? tolerance.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(DirectionRepetition: "); + buf.append(super.toString()); + buf.append(", initialDirection=").append(initialDirection); + buf.append(", targetDirection=").append(targetDirection); + buf.append(", separation=").append(separation); + buf.append(", tolerance=").append(tolerance); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + super.encode(encoder); + if (initialDirection == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'initialDirection' cannot be null!"); + } + if (targetDirection == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'targetDirection' cannot be null!"); + } + if (separation == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'separation' cannot be null!"); + } + if (tolerance == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'tolerance' cannot be null!"); + } + encoder.encodeAbstractElement(initialDirection); + encoder.encodeAbstractElement(targetDirection); + encoder.encodeAbstractElement(separation); + encoder.encodeAbstractElement(tolerance); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + super.decode(decoder); + initialDirection = (org.ccsds.moims.mo.mal.structures.Element) decoder.decodeAbstractElement(); + targetDirection = (org.ccsds.moims.mo.mal.structures.Element) decoder.decodeAbstractElement(); + separation = (org.ccsds.moims.mo.mal.structures.Element) decoder.decodeAbstractElement(); + tolerance = (org.ccsds.moims.mo.mal.structures.Element) decoder.decodeAbstractElement(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/DirectionRepetitionList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/DirectionRepetitionList.java new file mode 100644 index 00000000..d26381d1 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/DirectionRepetitionList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for DirectionRepetition. + */ +public final class DirectionRepetitionList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107653L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107653L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for DirectionRepetitionList. + * + */ + public DirectionRepetitionList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public DirectionRepetitionList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public DirectionRepetitionList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.DirectionRepetition element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.DirectionRepetition element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new DirectionRepetitionList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.DirectionRepetition(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/DirectionTrigger.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/DirectionTrigger.java new file mode 100644 index 00000000..acda8f1a --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/DirectionTrigger.java @@ -0,0 +1,161 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E6: Sub-type of Trigger based on pointing. Depending on the coordinate + * type of direction used, a margin may be specified in terms of angle from + * the specified direction. + */ +public final class DirectionTrigger extends org.ccsds.moims.mo.mps.structures.Trigger { + + private static final long serialVersionUID = 1407374900330549L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330549L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Planned direction of Trigger. + */ + private org.ccsds.moims.mo.mps.structures.Direction triggerDirection; + + /** + * Defines a cone around the trigger direction within which a direction is + * considered to meet the trigger condition. + */ + private org.ccsds.moims.mo.mps.structures.Angle angleMargin; + + /** + * Default constructor for DirectionTrigger. + * + */ + public DirectionTrigger() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param time Predicted or actual time of Trigger. The predicted time may evolve during the planning process up to the time of execution. The actual time is only available post execution, and hence can only be provided by a plan execution function. + * @param triggerDirection Planned direction of Trigger. + * @param angleMargin Defines a cone around the trigger direction within which a direction is considered to meet the trigger condition. + */ + public DirectionTrigger(org.ccsds.moims.mo.mal.structures.Time time, + org.ccsds.moims.mo.mps.structures.Direction triggerDirection, + org.ccsds.moims.mo.mps.structures.Angle angleMargin) { + super(time); + this.triggerDirection = triggerDirection; + this.angleMargin = angleMargin; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param time Predicted or actual time of Trigger. The predicted time may evolve during the planning process up to the time of execution. The actual time is only available post execution, and hence can only be provided by a plan execution function. + * @param triggerDirection Planned direction of Trigger. + */ + public DirectionTrigger(org.ccsds.moims.mo.mal.structures.Time time, + org.ccsds.moims.mo.mps.structures.Direction triggerDirection) { + super(time); + this.triggerDirection = triggerDirection; + this.angleMargin = null; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.DirectionTrigger(); + } + + /** + * Returns the field triggerDirection. + * + * @return The field triggerDirection + */ + public org.ccsds.moims.mo.mps.structures.Direction getTriggerDirection() { + return triggerDirection; + } + + /** + * Returns the field angleMargin. + * + * @return The field angleMargin + */ + public org.ccsds.moims.mo.mps.structures.Angle getAngleMargin() { + return angleMargin; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof DirectionTrigger) { + if (! super.equals(obj)) { + return false; + } + DirectionTrigger other = (DirectionTrigger) obj; + if (triggerDirection == null) { + if (other.triggerDirection != null) { + return false; + } + } else { + if (! triggerDirection.equals(other.triggerDirection)) { + return false; + } + } + if (angleMargin == null) { + if (other.angleMargin != null) { + return false; + } + } else { + if (! angleMargin.equals(other.angleMargin)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = super.hashCode(); + hash = 83 * hash + (triggerDirection != null ? triggerDirection.hashCode() : 0); + hash = 83 * hash + (angleMargin != null ? angleMargin.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(DirectionTrigger: "); + buf.append(super.toString()); + buf.append(", triggerDirection=").append(triggerDirection); + buf.append(", angleMargin=").append(angleMargin); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + super.encode(encoder); + if (triggerDirection == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'triggerDirection' cannot be null!"); + } + encoder.encodeAbstractElement(triggerDirection); + encoder.encodeNullableElement(angleMargin); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + super.decode(decoder); + triggerDirection = (org.ccsds.moims.mo.mps.structures.Direction) decoder.decodeAbstractElement(); + angleMargin = (org.ccsds.moims.mo.mps.structures.Angle) decoder.decodeNullableElement(new org.ccsds.moims.mo.mps.structures.Angle()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/DirectionTriggerList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/DirectionTriggerList.java new file mode 100644 index 00000000..ce72dc2c --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/DirectionTriggerList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for DirectionTrigger. + */ +public final class DirectionTriggerList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107659L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107659L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for DirectionTriggerList. + * + */ + public DirectionTriggerList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public DirectionTriggerList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public DirectionTriggerList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.DirectionTrigger element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.DirectionTrigger element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new DirectionTriggerList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.DirectionTrigger(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/Distance.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/Distance.java new file mode 100644 index 00000000..1dca1fa4 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/Distance.java @@ -0,0 +1,93 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E6: Physical value with units of type Distance. + */ +public final class Distance extends org.ccsds.moims.mo.mps.structures.PhysicalValue { + + private static final long serialVersionUID = 1407374900330517L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330517L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for Distance. + * + */ + public Distance() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param value Physical value. + * @param units Optional units. The units for a single quantity. The unit type depends on the specific value type. + */ + public Distance(Double value, + String units) { + super(value, + units); + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param value Physical value. + */ + public Distance(Double value) { + super(value); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.Distance(); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Distance) { + if (! super.equals(obj)) { + return false; + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = super.hashCode(); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(Distance: "); + buf.append(super.toString()); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + super.encode(encoder); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + super.decode(decoder); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/DistanceConstraint.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/DistanceConstraint.java new file mode 100644 index 00000000..abcb99d4 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/DistanceConstraint.java @@ -0,0 +1,245 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E7: Specifies a range of distances between two physical objects (the observer + * and the target). + */ +public final class DistanceConstraint extends org.ccsds.moims.mo.mps.structures.GeometricConstraint { + + private static final long serialVersionUID = 1407374900330539L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330539L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Position of the observer [Object1]. + */ + private org.ccsds.moims.mo.mal.structures.Element observer; + + /** + * Position of the target [Object2]. + */ + private org.ccsds.moims.mo.mal.structures.Element target; + + /** + * Minimum distance between observer and target. + */ + private org.ccsds.moims.mo.mal.structures.Element minDistance; + + /** + * Maximum distance between observer and target. + */ + private org.ccsds.moims.mo.mal.structures.Element maxDistance; + + /** + * Default constructor for DistanceConstraint. + * + */ + public DistanceConstraint() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param negate Specifies whether the result of combining the Constraints is to be inverted (NOT function). Default = False. + * @param startRef Identifies the point in the duration of the applicable planning activity to which the start of the constraint period relates. Default is the start of the planning activity. + * @param endRef Identifies the point in the duration of the applicable planning activity to which the end of the constraint period relates. Default is the end of the planning activity. + * @param startOffset Offset from startRef that specifies the start of the constraint period. A positive offset implies a shift later in time. Default is no offset. + * @param endOffset Offset from endRef that specifies the end of the constraint period. A positive offset implies a shift later in time. Default is no offset. + * @param observer Position of the observer [Object1]. + * @param target Position of the target [Object2]. + * @param minDistance Minimum distance between observer and target. + * @param maxDistance Maximum distance between observer and target. + */ + public DistanceConstraint(Boolean negate, + org.ccsds.moims.mo.mps.structures.Slider startRef, + org.ccsds.moims.mo.mps.structures.Slider endRef, + org.ccsds.moims.mo.mal.structures.Element startOffset, + org.ccsds.moims.mo.mal.structures.Element endOffset, + org.ccsds.moims.mo.mal.structures.Element observer, + org.ccsds.moims.mo.mal.structures.Element target, + org.ccsds.moims.mo.mal.structures.Element minDistance, + org.ccsds.moims.mo.mal.structures.Element maxDistance) { + super(negate, + startRef, + endRef, + startOffset, + endOffset); + this.observer = observer; + this.target = target; + this.minDistance = minDistance; + this.maxDistance = maxDistance; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param observer Position of the observer [Object1]. + * @param target Position of the target [Object2]. + * @param minDistance Minimum distance between observer and target. + * @param maxDistance Maximum distance between observer and target. + */ + public DistanceConstraint(org.ccsds.moims.mo.mal.structures.Element observer, + org.ccsds.moims.mo.mal.structures.Element target, + org.ccsds.moims.mo.mal.structures.Element minDistance, + org.ccsds.moims.mo.mal.structures.Element maxDistance) { + this.observer = observer; + this.target = target; + this.minDistance = minDistance; + this.maxDistance = maxDistance; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.DistanceConstraint(); + } + + /** + * Returns the field observer. + * + * @return The field observer + */ + public org.ccsds.moims.mo.mal.structures.Element getObserver() { + return observer; + } + + /** + * Returns the field target. + * + * @return The field target + */ + public org.ccsds.moims.mo.mal.structures.Element getTarget() { + return target; + } + + /** + * Returns the field minDistance. + * + * @return The field minDistance + */ + public org.ccsds.moims.mo.mal.structures.Element getMinDistance() { + return minDistance; + } + + /** + * Returns the field maxDistance. + * + * @return The field maxDistance + */ + public org.ccsds.moims.mo.mal.structures.Element getMaxDistance() { + return maxDistance; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof DistanceConstraint) { + if (! super.equals(obj)) { + return false; + } + DistanceConstraint other = (DistanceConstraint) obj; + if (observer == null) { + if (other.observer != null) { + return false; + } + } else { + if (! observer.equals(other.observer)) { + return false; + } + } + if (target == null) { + if (other.target != null) { + return false; + } + } else { + if (! target.equals(other.target)) { + return false; + } + } + if (minDistance == null) { + if (other.minDistance != null) { + return false; + } + } else { + if (! minDistance.equals(other.minDistance)) { + return false; + } + } + if (maxDistance == null) { + if (other.maxDistance != null) { + return false; + } + } else { + if (! maxDistance.equals(other.maxDistance)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = super.hashCode(); + hash = 83 * hash + (observer != null ? observer.hashCode() : 0); + hash = 83 * hash + (target != null ? target.hashCode() : 0); + hash = 83 * hash + (minDistance != null ? minDistance.hashCode() : 0); + hash = 83 * hash + (maxDistance != null ? maxDistance.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(DistanceConstraint: "); + buf.append(super.toString()); + buf.append(", observer=").append(observer); + buf.append(", target=").append(target); + buf.append(", minDistance=").append(minDistance); + buf.append(", maxDistance=").append(maxDistance); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + super.encode(encoder); + if (observer == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'observer' cannot be null!"); + } + if (target == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'target' cannot be null!"); + } + if (minDistance == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'minDistance' cannot be null!"); + } + if (maxDistance == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'maxDistance' cannot be null!"); + } + encoder.encodeAbstractElement(observer); + encoder.encodeAbstractElement(target); + encoder.encodeAbstractElement(minDistance); + encoder.encodeAbstractElement(maxDistance); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + super.decode(decoder); + observer = (org.ccsds.moims.mo.mal.structures.Element) decoder.decodeAbstractElement(); + target = (org.ccsds.moims.mo.mal.structures.Element) decoder.decodeAbstractElement(); + minDistance = (org.ccsds.moims.mo.mal.structures.Element) decoder.decodeAbstractElement(); + maxDistance = (org.ccsds.moims.mo.mal.structures.Element) decoder.decodeAbstractElement(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/DistanceConstraintList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/DistanceConstraintList.java new file mode 100644 index 00000000..fd55a1a5 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/DistanceConstraintList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for DistanceConstraint. + */ +public final class DistanceConstraintList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107669L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107669L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for DistanceConstraintList. + * + */ + public DistanceConstraintList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public DistanceConstraintList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public DistanceConstraintList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.DistanceConstraint element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.DistanceConstraint element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new DistanceConstraintList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.DistanceConstraint(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/DistanceList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/DistanceList.java new file mode 100644 index 00000000..6949ae86 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/DistanceList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for Distance. + */ +public final class DistanceList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107691L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107691L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for DistanceList. + * + */ + public DistanceList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public DistanceList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public DistanceList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.Distance element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.Distance element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new DistanceList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.Distance(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/DurationConstraint.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/DurationConstraint.java new file mode 100644 index 00000000..ee352be2 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/DurationConstraint.java @@ -0,0 +1,145 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E2: A DurationConstraint restricts the duration of a planning activity + * within the plan. + */ +public final class DurationConstraint extends org.ccsds.moims.mo.mps.structures.Constraint { + + private static final long serialVersionUID = 1407374900330530L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330530L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Specifies the minimum duration of the planning activity. If omitted, a + * value of 0 is used. + */ + private org.ccsds.moims.mo.mal.structures.Element minDuration; + + /** + * Specifies the maximum duration of the planning activity. If omitted, the + * maximum representable MAL::Duration value is assumed. + */ + private org.ccsds.moims.mo.mal.structures.Element maxDuration; + + /** + * Default constructor for DurationConstraint. + * + */ + public DurationConstraint() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param negate Specifies whether the result of combining the Constraints is to be inverted (NOT function). Default = False. + * @param minDuration Specifies the minimum duration of the planning activity. If omitted, a value of 0 is used. + * @param maxDuration Specifies the maximum duration of the planning activity. If omitted, the maximum representable MAL::Duration value is assumed. + */ + public DurationConstraint(Boolean negate, + org.ccsds.moims.mo.mal.structures.Element minDuration, + org.ccsds.moims.mo.mal.structures.Element maxDuration) { + super(negate); + this.minDuration = minDuration; + this.maxDuration = maxDuration; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.DurationConstraint(); + } + + /** + * Returns the field minDuration. + * + * @return The field minDuration + */ + public org.ccsds.moims.mo.mal.structures.Element getMinDuration() { + return minDuration; + } + + /** + * Returns the field maxDuration. + * + * @return The field maxDuration + */ + public org.ccsds.moims.mo.mal.structures.Element getMaxDuration() { + return maxDuration; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof DurationConstraint) { + if (! super.equals(obj)) { + return false; + } + DurationConstraint other = (DurationConstraint) obj; + if (minDuration == null) { + if (other.minDuration != null) { + return false; + } + } else { + if (! minDuration.equals(other.minDuration)) { + return false; + } + } + if (maxDuration == null) { + if (other.maxDuration != null) { + return false; + } + } else { + if (! maxDuration.equals(other.maxDuration)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = super.hashCode(); + hash = 83 * hash + (minDuration != null ? minDuration.hashCode() : 0); + hash = 83 * hash + (maxDuration != null ? maxDuration.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(DurationConstraint: "); + buf.append(super.toString()); + buf.append(", minDuration=").append(minDuration); + buf.append(", maxDuration=").append(maxDuration); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + super.encode(encoder); + encoder.encodeNullableAbstractElement(minDuration); + encoder.encodeNullableAbstractElement(maxDuration); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + super.decode(decoder); + minDuration = (org.ccsds.moims.mo.mal.structures.Element) decoder.decodeNullableAbstractElement(); + maxDuration = (org.ccsds.moims.mo.mal.structures.Element) decoder.decodeNullableAbstractElement(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/DurationConstraintList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/DurationConstraintList.java new file mode 100644 index 00000000..241132a9 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/DurationConstraintList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for DurationConstraint. + */ +public final class DurationConstraintList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107678L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107678L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for DurationConstraintList. + * + */ + public DurationConstraintList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public DurationConstraintList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public DurationConstraintList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.DurationConstraint element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.DurationConstraint element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new DurationConstraintList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.DurationConstraint(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/Effect.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/Effect.java new file mode 100644 index 00000000..a0f4c7c9 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/Effect.java @@ -0,0 +1,88 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E5: An Effect is an abstract type that may be used to represent the impact + * that executing a planning activity will have on a planning resource. + */ +public abstract class Effect implements org.ccsds.moims.mo.mal.structures.Composite { + + /** + * Identifies the planning resource that is constrained for the duration of + * the planning activity. + */ + private org.ccsds.moims.mo.mal.structures.ObjectRef resourceRef; + + /** + * Default constructor for Effect. + * + */ + public Effect() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param resourceRef Identifies the planning resource that is constrained for the duration of the planning activity. + */ + public Effect(org.ccsds.moims.mo.mal.structures.ObjectRef resourceRef) { + this.resourceRef = resourceRef; + } + + /** + * Returns the field resourceRef. + * + * @return The field resourceRef + */ + public org.ccsds.moims.mo.mal.structures.ObjectRef getResourceRef() { + return resourceRef; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Effect) { + Effect other = (Effect) obj; + if (resourceRef == null) { + if (other.resourceRef != null) { + return false; + } + } else { + if (! resourceRef.equals(other.resourceRef)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (resourceRef != null ? resourceRef.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(Effect: "); + buf.append("resourceRef=").append(resourceRef); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (resourceRef == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'resourceRef' cannot be null!"); + } + encoder.encodeElement(resourceRef); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + resourceRef = (org.ccsds.moims.mo.mal.structures.ObjectRef) decoder.decodeElement(new org.ccsds.moims.mo.mal.structures.ObjectRef()); + return this; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/EffectList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/EffectList.java new file mode 100644 index 00000000..d8f1da48 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/EffectList.java @@ -0,0 +1,23 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for Effect. + */ +public final class EffectList extends org.ccsds.moims.mo.mal.structures.HeterogeneousList { + + /** + * Default constructor for EffectList. + * + */ + public EffectList() { + } + + @Override + public boolean add(org.ccsds.moims.mo.mal.structures.Element element) { + if (element != null && !(element instanceof Effect)) { + throw new java.lang.ClassCastException("The added element does not extend the type: Effect"); + } + return super.add(element); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/EffectOperationEnum.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/EffectOperationEnum.java new file mode 100644 index 00000000..d120192f --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/EffectOperationEnum.java @@ -0,0 +1,134 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * Enumeration class for EffectOperationEnum. + */ +public final class EffectOperationEnum extends org.ccsds.moims.mo.mal.structures.Enumeration { + + private static final long serialVersionUID = 1407374900330545L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330545L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Enumeration value for SET. + */ + public static final int SET_VALUE = 1; + + /** + * Enumeration singleton for value SET. + */ + public static final org.ccsds.moims.mo.mps.structures.EffectOperationEnum SET = new org.ccsds.moims.mo.mps.structures.EffectOperationEnum(org.ccsds.moims.mo.mps.structures.EffectOperationEnum.SET_VALUE); + + /** + * Enumeration value for INCREASE. + */ + public static final int INCREASE_VALUE = 2; + + /** + * Enumeration singleton for value INCREASE. + */ + public static final org.ccsds.moims.mo.mps.structures.EffectOperationEnum INCREASE = new org.ccsds.moims.mo.mps.structures.EffectOperationEnum(org.ccsds.moims.mo.mps.structures.EffectOperationEnum.INCREASE_VALUE); + + /** + * Enumeration value for DECREASE. + */ + public static final int DECREASE_VALUE = 3; + + /** + * Enumeration singleton for value DECREASE. + */ + public static final org.ccsds.moims.mo.mps.structures.EffectOperationEnum DECREASE = new org.ccsds.moims.mo.mps.structures.EffectOperationEnum(org.ccsds.moims.mo.mps.structures.EffectOperationEnum.DECREASE_VALUE); + + /** + * Set of enumeration instances. + */ + private static final org.ccsds.moims.mo.mps.structures.EffectOperationEnum[] _ENUMERATIONS = { + SET, INCREASE, DECREASE}; + + /** + * E5: An EffectOperationEnum is used to denote the specific type of change made to a planning resource for a given Effect. + */ + public EffectOperationEnum() { + super(-1); + } + + /** + * E5: An EffectOperationEnum is used to denote the specific type of change + * made to a planning resource for a given Effect. + * + * @param value The value of the Enumeration. + */ + public EffectOperationEnum(int value) { + super(value); + } + + @Override + public String toString() { + switch (getValue()) { + case SET_VALUE: + return "SET"; + case INCREASE_VALUE: + return "INCREASE"; + case DECREASE_VALUE: + return "DECREASE"; + default: + throw new RuntimeException("Unknown ordinal!"); + } + } + + /** + * Returns the enumeration element represented by the supplied string, or + * null if not matched. + * + * @param s s The string to search for. + * @return The matched enumeration element, or null if not matched. + */ + public static org.ccsds.moims.mo.mps.structures.EffectOperationEnum fromString(String s) { + switch (s) { + case "SET": + return EffectOperationEnum.SET; + case "INCREASE": + return EffectOperationEnum.INCREASE; + case "DECREASE": + return EffectOperationEnum.DECREASE; + default: + throw new RuntimeException("Unknown Enumeration for the provided string: " + s); + } + } + + @Override + public org.ccsds.moims.mo.mal.structures.Enumeration fromValue(Integer value) { + switch (value) { + case SET_VALUE: + return EffectOperationEnum.SET; + case INCREASE_VALUE: + return EffectOperationEnum.INCREASE; + case DECREASE_VALUE: + return EffectOperationEnum.DECREASE; + default: + throw new RuntimeException("Unknown Enumeration for the provided value: " + value); + } + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return _ENUMERATIONS[0]; + } + + @Override + public int getEnumSize() { + return 3; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/EffectOperationEnumList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/EffectOperationEnumList.java new file mode 100644 index 00000000..fa9b6c44 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/EffectOperationEnumList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for EffectOperationEnum. + */ +public final class EffectOperationEnumList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107663L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107663L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for EffectOperationEnumList. + * + */ + public EffectOperationEnumList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public EffectOperationEnumList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public EffectOperationEnumList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.EffectOperationEnum element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.EffectOperationEnum element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new EffectOperationEnumList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return org.ccsds.moims.mo.mps.structures.EffectOperationEnum.SET; + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/EllipsoidalPositionConstraint.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/EllipsoidalPositionConstraint.java new file mode 100644 index 00000000..c43043f4 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/EllipsoidalPositionConstraint.java @@ -0,0 +1,320 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E7: Geometric constraint that specifies a Position with a tolerance given + * in terms of a frame-aligned ellipsoid. The frame within which this tolerance + * ellipsoid is expressed may be different from the frame in which the required + * position is expressed. . + */ +public final class EllipsoidalPositionConstraint extends org.ccsds.moims.mo.mps.structures.GeometricConstraint { + + private static final long serialVersionUID = 1407374900330536L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330536L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Specifies the required position expressed using any concrete position type. + */ + private org.ccsds.moims.mo.mal.structures.Element position; + + /** + * Length of the ellipsoid axis that is aligned with the x axis of the specified + * frame. + */ + private org.ccsds.moims.mo.mal.structures.Element x; + + /** + * Length of the ellipsoid axis that is aligned with the y axis of the specified + * frame. + */ + private org.ccsds.moims.mo.mal.structures.Element y; + + /** + * Length of the ellipsoid axis that is aligned with the z axis of the specified + * frame. + */ + private org.ccsds.moims.mo.mal.structures.Element z; + + /** + * Reference frame with which the axes of the tolerance ellipsoid are aligned + * (see 4.4.2). + */ + private org.ccsds.moims.mo.mal.structures.Identifier frame; + + /** + * Optional. The tolerance units name, either for the quantity of distance + * or the quantity of angle. Default = ‘km’, but ‘deg’ is more relevant for + * an OrbitalPosition. + */ + private String units; + + /** + * Default constructor for EllipsoidalPositionConstraint. + * + */ + public EllipsoidalPositionConstraint() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param negate Specifies whether the result of combining the Constraints is to be inverted (NOT function). Default = False. + * @param startRef Identifies the point in the duration of the applicable planning activity to which the start of the constraint period relates. Default is the start of the planning activity. + * @param endRef Identifies the point in the duration of the applicable planning activity to which the end of the constraint period relates. Default is the end of the planning activity. + * @param startOffset Offset from startRef that specifies the start of the constraint period. A positive offset implies a shift later in time. Default is no offset. + * @param endOffset Offset from endRef that specifies the end of the constraint period. A positive offset implies a shift later in time. Default is no offset. + * @param position Specifies the required position expressed using any concrete position type. + * @param x Length of the ellipsoid axis that is aligned with the x axis of the specified frame. + * @param y Length of the ellipsoid axis that is aligned with the y axis of the specified frame. + * @param z Length of the ellipsoid axis that is aligned with the z axis of the specified frame. + * @param frame Reference frame with which the axes of the tolerance ellipsoid are aligned (see 4.4.2). + * @param units Optional. The tolerance units name, either for the quantity of distance or the quantity of angle. Default = ‘km’, but ‘deg’ is more relevant for an OrbitalPosition. + */ + public EllipsoidalPositionConstraint(Boolean negate, + org.ccsds.moims.mo.mps.structures.Slider startRef, + org.ccsds.moims.mo.mps.structures.Slider endRef, + org.ccsds.moims.mo.mal.structures.Element startOffset, + org.ccsds.moims.mo.mal.structures.Element endOffset, + org.ccsds.moims.mo.mal.structures.Element position, + org.ccsds.moims.mo.mal.structures.Element x, + org.ccsds.moims.mo.mal.structures.Element y, + org.ccsds.moims.mo.mal.structures.Element z, + org.ccsds.moims.mo.mal.structures.Identifier frame, + String units) { + super(negate, + startRef, + endRef, + startOffset, + endOffset); + this.position = position; + this.x = x; + this.y = y; + this.z = z; + this.frame = frame; + this.units = units; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param position Specifies the required position expressed using any concrete position type. + * @param x Length of the ellipsoid axis that is aligned with the x axis of the specified frame. + * @param y Length of the ellipsoid axis that is aligned with the y axis of the specified frame. + * @param z Length of the ellipsoid axis that is aligned with the z axis of the specified frame. + * @param frame Reference frame with which the axes of the tolerance ellipsoid are aligned (see 4.4.2). + */ + public EllipsoidalPositionConstraint(org.ccsds.moims.mo.mal.structures.Element position, + org.ccsds.moims.mo.mal.structures.Element x, + org.ccsds.moims.mo.mal.structures.Element y, + org.ccsds.moims.mo.mal.structures.Element z, + org.ccsds.moims.mo.mal.structures.Identifier frame) { + this.position = position; + this.x = x; + this.y = y; + this.z = z; + this.frame = frame; + this.units = null; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.EllipsoidalPositionConstraint(); + } + + /** + * Returns the field position. + * + * @return The field position + */ + public org.ccsds.moims.mo.mal.structures.Element getPosition() { + return position; + } + + /** + * Returns the field x. + * + * @return The field x + */ + public org.ccsds.moims.mo.mal.structures.Element getX() { + return x; + } + + /** + * Returns the field y. + * + * @return The field y + */ + public org.ccsds.moims.mo.mal.structures.Element getY() { + return y; + } + + /** + * Returns the field z. + * + * @return The field z + */ + public org.ccsds.moims.mo.mal.structures.Element getZ() { + return z; + } + + /** + * Returns the field frame. + * + * @return The field frame + */ + public org.ccsds.moims.mo.mal.structures.Identifier getFrame() { + return frame; + } + + /** + * Returns the field units. + * + * @return The field units + */ + public String getUnits() { + return units; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof EllipsoidalPositionConstraint) { + if (! super.equals(obj)) { + return false; + } + EllipsoidalPositionConstraint other = (EllipsoidalPositionConstraint) obj; + if (position == null) { + if (other.position != null) { + return false; + } + } else { + if (! position.equals(other.position)) { + return false; + } + } + if (x == null) { + if (other.x != null) { + return false; + } + } else { + if (! x.equals(other.x)) { + return false; + } + } + if (y == null) { + if (other.y != null) { + return false; + } + } else { + if (! y.equals(other.y)) { + return false; + } + } + if (z == null) { + if (other.z != null) { + return false; + } + } else { + if (! z.equals(other.z)) { + return false; + } + } + if (frame == null) { + if (other.frame != null) { + return false; + } + } else { + if (! frame.equals(other.frame)) { + return false; + } + } + if (units == null) { + if (other.units != null) { + return false; + } + } else { + if (! units.equals(other.units)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = super.hashCode(); + hash = 83 * hash + (position != null ? position.hashCode() : 0); + hash = 83 * hash + (x != null ? x.hashCode() : 0); + hash = 83 * hash + (y != null ? y.hashCode() : 0); + hash = 83 * hash + (z != null ? z.hashCode() : 0); + hash = 83 * hash + (frame != null ? frame.hashCode() : 0); + hash = 83 * hash + (units != null ? units.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(EllipsoidalPositionConstraint: "); + buf.append(super.toString()); + buf.append(", position=").append(position); + buf.append(", x=").append(x); + buf.append(", y=").append(y); + buf.append(", z=").append(z); + buf.append(", frame=").append(frame); + buf.append(", units=").append(units); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + super.encode(encoder); + if (position == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'position' cannot be null!"); + } + if (x == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'x' cannot be null!"); + } + if (y == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'y' cannot be null!"); + } + if (z == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'z' cannot be null!"); + } + if (frame == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'frame' cannot be null!"); + } + encoder.encodeAbstractElement(position); + encoder.encodeAbstractElement(x); + encoder.encodeAbstractElement(y); + encoder.encodeAbstractElement(z); + encoder.encodeIdentifier(frame); + encoder.encodeNullableString(units); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + super.decode(decoder); + position = (org.ccsds.moims.mo.mal.structures.Element) decoder.decodeAbstractElement(); + x = (org.ccsds.moims.mo.mal.structures.Element) decoder.decodeAbstractElement(); + y = (org.ccsds.moims.mo.mal.structures.Element) decoder.decodeAbstractElement(); + z = (org.ccsds.moims.mo.mal.structures.Element) decoder.decodeAbstractElement(); + frame = decoder.decodeIdentifier(); + units = decoder.decodeNullableString(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/EllipsoidalPositionConstraintList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/EllipsoidalPositionConstraintList.java new file mode 100644 index 00000000..d3407719 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/EllipsoidalPositionConstraintList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for EllipsoidalPositionConstraint. + */ +public final class EllipsoidalPositionConstraintList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107672L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107672L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for EllipsoidalPositionConstraintList. + * + */ + public EllipsoidalPositionConstraintList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public EllipsoidalPositionConstraintList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public EllipsoidalPositionConstraintList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.EllipsoidalPositionConstraint element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.EllipsoidalPositionConstraint element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new EllipsoidalPositionConstraintList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.EllipsoidalPositionConstraint(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/EventDefinition.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/EventDefinition.java new file mode 100644 index 00000000..ca12b04d --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/EventDefinition.java @@ -0,0 +1,269 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E1: An EventDefinition is an MO object that contains static configuration + * data relating to multiple occurrences of a planning event. Its identity + * is defined by a definitionID, which includes a constant key and an evolving + * version, which is updated each time the definition is revised. Event definitions + * form part of the planning configuration data. Events may be either Predicted + * or Potential. Events that are predictable either by time or position can + * have specific instances included in a Plan. Potential events are those + * that may occur during the execution of a Plan, but the specific time or + * position is not predicted. + */ +public final class EventDefinition extends org.ccsds.moims.mo.mal.structures.MOObject { + + private static final long serialVersionUID = 1407374900330697L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330697L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Description of the event. + */ + private String description; + + /** + * Enumeration: one of {Predicted, Potential} indicating whether the event + * occurrence is known in advance or can occur at any time. . + */ + private org.ccsds.moims.mo.mps.structures.PredictabilityEnum predictability; + + /** + * Free-text field that can be used to categorize an event into one of several + * arbitrary categories. Enables a planning system to customize behavior + * for events, such as their presentation in displays, based on the specified + * value. + */ + private String eventType; + + /** + * List of argument definitions. + */ + private org.ccsds.moims.mo.mps.structures.ArgDefList argDefs; + + /** + * List of child event definitions. For a single event, this list shall be + * empty; for a group event, the list shall be populated. + */ + private org.ccsds.moims.mo.mal.structures.ObjectRefList eventDefinitions; + + /** + * Default constructor for EventDefinition. + * + */ + public EventDefinition() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param objectIdentity The identity of the MO Object. + * @param description Description of the event. + * @param predictability Enumeration: one of {Predicted, Potential} indicating whether the event occurrence is known in advance or can occur at any time. + * @param eventType Free-text field that can be used to categorize an event into one of several arbitrary categories. Enables a planning system to customize behavior for events, such as their presentation in displays, based on the specified value. + * @param argDefs List of argument definitions. + * @param eventDefinitions List of child event definitions. For a single event, this list shall be empty; for a group event, the list shall be populated. + */ + public EventDefinition(org.ccsds.moims.mo.mal.structures.ObjectIdentity objectIdentity, + String description, + org.ccsds.moims.mo.mps.structures.PredictabilityEnum predictability, + String eventType, + org.ccsds.moims.mo.mps.structures.ArgDefList argDefs, + org.ccsds.moims.mo.mal.structures.ObjectRefList eventDefinitions) { + super(objectIdentity); + this.description = description; + this.predictability = predictability; + this.eventType = eventType; + this.argDefs = argDefs; + this.eventDefinitions = eventDefinitions; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param objectIdentity The identity of the MO Object. + * @param description Description of the event. + * @param predictability Enumeration: one of {Predicted, Potential} indicating whether the event occurrence is known in advance or can occur at any time. + */ + public EventDefinition(org.ccsds.moims.mo.mal.structures.ObjectIdentity objectIdentity, + String description, + org.ccsds.moims.mo.mps.structures.PredictabilityEnum predictability) { + super(objectIdentity); + this.description = description; + this.predictability = predictability; + this.eventType = null; + this.argDefs = null; + this.eventDefinitions = null; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.EventDefinition(); + } + + /** + * Returns the field description. + * + * @return The field description + */ + public String getDescription() { + return description; + } + + /** + * Returns the field predictability. + * + * @return The field predictability + */ + public org.ccsds.moims.mo.mps.structures.PredictabilityEnum getPredictability() { + return predictability; + } + + /** + * Returns the field eventType. + * + * @return The field eventType + */ + public String getEventType() { + return eventType; + } + + /** + * Returns the field argDefs. + * + * @return The field argDefs + */ + public org.ccsds.moims.mo.mps.structures.ArgDefList getArgDefs() { + return argDefs; + } + + /** + * Returns the field eventDefinitions. + * + * @return The field eventDefinitions + */ + public org.ccsds.moims.mo.mal.structures.ObjectRefList getEventDefinitions() { + return eventDefinitions; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof EventDefinition) { + if (! super.equals(obj)) { + return false; + } + EventDefinition other = (EventDefinition) obj; + if (description == null) { + if (other.description != null) { + return false; + } + } else { + if (! description.equals(other.description)) { + return false; + } + } + if (predictability == null) { + if (other.predictability != null) { + return false; + } + } else { + if (! predictability.equals(other.predictability)) { + return false; + } + } + if (eventType == null) { + if (other.eventType != null) { + return false; + } + } else { + if (! eventType.equals(other.eventType)) { + return false; + } + } + if (argDefs == null) { + if (other.argDefs != null) { + return false; + } + } else { + if (! argDefs.equals(other.argDefs)) { + return false; + } + } + if (eventDefinitions == null) { + if (other.eventDefinitions != null) { + return false; + } + } else { + if (! eventDefinitions.equals(other.eventDefinitions)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = super.hashCode(); + hash = 83 * hash + (description != null ? description.hashCode() : 0); + hash = 83 * hash + (predictability != null ? predictability.hashCode() : 0); + hash = 83 * hash + (eventType != null ? eventType.hashCode() : 0); + hash = 83 * hash + (argDefs != null ? argDefs.hashCode() : 0); + hash = 83 * hash + (eventDefinitions != null ? eventDefinitions.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(EventDefinition: "); + buf.append(super.toString()); + buf.append(", description=").append(description); + buf.append(", predictability=").append(predictability); + buf.append(", eventType=").append(eventType); + buf.append(", argDefs=").append(argDefs); + buf.append(", eventDefinitions=").append(eventDefinitions); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + super.encode(encoder); + if (description == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'description' cannot be null!"); + } + if (predictability == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'predictability' cannot be null!"); + } + encoder.encodeString(description); + encoder.encodeElement(predictability); + encoder.encodeNullableString(eventType); + encoder.encodeNullableElement(argDefs); + encoder.encodeNullableElement(eventDefinitions); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + super.decode(decoder); + description = decoder.decodeString(); + predictability = (org.ccsds.moims.mo.mps.structures.PredictabilityEnum) decoder.decodeElement(org.ccsds.moims.mo.mps.structures.PredictabilityEnum.PREDICTED); + eventType = decoder.decodeNullableString(); + argDefs = (org.ccsds.moims.mo.mps.structures.ArgDefList) decoder.decodeNullableElement(new org.ccsds.moims.mo.mps.structures.ArgDefList()); + eventDefinitions = (org.ccsds.moims.mo.mal.structures.ObjectRefList) decoder.decodeNullableElement(new org.ccsds.moims.mo.mal.structures.ObjectRefList()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/EventDefinitionList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/EventDefinitionList.java new file mode 100644 index 00000000..1d537853 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/EventDefinitionList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for EventDefinition. + */ +public final class EventDefinitionList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107511L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107511L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for EventDefinitionList. + * + */ + public EventDefinitionList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public EventDefinitionList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public EventDefinitionList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.EventDefinition element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.EventDefinition element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new EventDefinitionList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.EventDefinition(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/EventInstance.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/EventInstance.java new file mode 100644 index 00000000..ad3f9b93 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/EventInstance.java @@ -0,0 +1,332 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E1: An EventInstance is an MO object that contains the identity of a specific + * occurrence of a planning event, together with both static and dynamic information + * associated with that occurrence. It supports relationships to its definition + * and source. The source of an EventInstance may be an external event, corresponding + * to a NAV Predicted Event or a CSS Contact Event. EventInstances may be + * contained within a Plan. EventInstances may be referenced as a related + * event by an ActivityInstance, so that the ActivityInstance can reference + * the timing and arguments of the related EventInstance. + */ +public final class EventInstance extends org.ccsds.moims.mo.mal.structures.MOObject { + + private static final long serialVersionUID = 1407374900330698L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330698L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Reference to the EventDefinition. + */ + private org.ccsds.moims.mo.mal.structures.ObjectRef definition; + + /** + * Reference to an external source event (e.g., NAV predicted event, or CSS + * contact event). + */ + private org.ccsds.moims.mo.mal.structures.Identifier sourceEvent; + + /** + * List of references to child EventInstances. For a single event, this list + * is empty; for a group event, the list will be populated. + */ + private org.ccsds.moims.mo.mal.structures.ObjectRefList events; + + /** + * Predicted or actual time of the event. EventTime is nullable: it can be + * predicted without an eventTime (e.g., if position based). + */ + private org.ccsds.moims.mo.mal.structures.FineTime eventTime; + + /** + * Argument values for each argument defined in the EventDefinition. + */ + private org.ccsds.moims.mo.mps.structures.ArgumentList arguments; + + /** + * Current status of the event instance (see event state model in 4.5.3.2). + */ + private org.ccsds.moims.mo.mps.structures.EventStatusEnum eventStatus; + + /** + * StatusInfo provides the reason for entering the terminated state and is + * customizable, but if the following conditions exist then the specified + * text shall be used: - Occurred (Event has been triggered); - Did Not Occur + * (Event expired or did not occur within validity period); - Deleted (Event + * was deleted). + */ + private String statusInfo; + + /** + * Default constructor for EventInstance. + * + */ + public EventInstance() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param objectIdentity The identity of the MO Object. + * @param definition Reference to the EventDefinition. + * @param sourceEvent Reference to an external source event (e.g., NAV predicted event, or CSS contact event). + * @param events List of references to child EventInstances. For a single event, this list is empty; for a group event, the list will be populated. + * @param eventTime Predicted or actual time of the event. EventTime is nullable: it can be predicted without an eventTime (e.g., if position based). + * @param arguments Argument values for each argument defined in the EventDefinition. + * @param eventStatus Current status of the event instance (see event state model in 4.5.3.2). + * @param statusInfo StatusInfo provides the reason for entering the terminated state and is customizable, but if the following conditions exist then the specified text shall be used: - Occurred (Event has been triggered); - Did Not Occur (Event expired or did not occur within validity period); - Deleted (Event was deleted). + */ + public EventInstance(org.ccsds.moims.mo.mal.structures.ObjectIdentity objectIdentity, + org.ccsds.moims.mo.mal.structures.ObjectRef definition, + org.ccsds.moims.mo.mal.structures.Identifier sourceEvent, + org.ccsds.moims.mo.mal.structures.ObjectRefList events, + org.ccsds.moims.mo.mal.structures.FineTime eventTime, + org.ccsds.moims.mo.mps.structures.ArgumentList arguments, + org.ccsds.moims.mo.mps.structures.EventStatusEnum eventStatus, + String statusInfo) { + super(objectIdentity); + this.definition = definition; + this.sourceEvent = sourceEvent; + this.events = events; + this.eventTime = eventTime; + this.arguments = arguments; + this.eventStatus = eventStatus; + this.statusInfo = statusInfo; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param objectIdentity The identity of the MO Object. + * @param definition Reference to the EventDefinition. + * @param eventStatus Current status of the event instance (see event state model in 4.5.3.2). + */ + public EventInstance(org.ccsds.moims.mo.mal.structures.ObjectIdentity objectIdentity, + org.ccsds.moims.mo.mal.structures.ObjectRef definition, + org.ccsds.moims.mo.mps.structures.EventStatusEnum eventStatus) { + super(objectIdentity); + this.definition = definition; + this.sourceEvent = null; + this.events = null; + this.eventTime = null; + this.arguments = null; + this.eventStatus = eventStatus; + this.statusInfo = null; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.EventInstance(); + } + + /** + * Returns the field definition. + * + * @return The field definition + */ + public org.ccsds.moims.mo.mal.structures.ObjectRef getDefinition() { + return definition; + } + + /** + * Returns the field sourceEvent. + * + * @return The field sourceEvent + */ + public org.ccsds.moims.mo.mal.structures.Identifier getSourceEvent() { + return sourceEvent; + } + + /** + * Returns the field events. + * + * @return The field events + */ + public org.ccsds.moims.mo.mal.structures.ObjectRefList getEvents() { + return events; + } + + /** + * Returns the field eventTime. + * + * @return The field eventTime + */ + public org.ccsds.moims.mo.mal.structures.FineTime getEventTime() { + return eventTime; + } + + /** + * Returns the field arguments. + * + * @return The field arguments + */ + public org.ccsds.moims.mo.mps.structures.ArgumentList getArguments() { + return arguments; + } + + /** + * Returns the field eventStatus. + * + * @return The field eventStatus + */ + public org.ccsds.moims.mo.mps.structures.EventStatusEnum getEventStatus() { + return eventStatus; + } + + /** + * Returns the field statusInfo. + * + * @return The field statusInfo + */ + public String getStatusInfo() { + return statusInfo; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof EventInstance) { + if (! super.equals(obj)) { + return false; + } + EventInstance other = (EventInstance) obj; + if (definition == null) { + if (other.definition != null) { + return false; + } + } else { + if (! definition.equals(other.definition)) { + return false; + } + } + if (sourceEvent == null) { + if (other.sourceEvent != null) { + return false; + } + } else { + if (! sourceEvent.equals(other.sourceEvent)) { + return false; + } + } + if (events == null) { + if (other.events != null) { + return false; + } + } else { + if (! events.equals(other.events)) { + return false; + } + } + if (eventTime == null) { + if (other.eventTime != null) { + return false; + } + } else { + if (! eventTime.equals(other.eventTime)) { + return false; + } + } + if (arguments == null) { + if (other.arguments != null) { + return false; + } + } else { + if (! arguments.equals(other.arguments)) { + return false; + } + } + if (eventStatus == null) { + if (other.eventStatus != null) { + return false; + } + } else { + if (! eventStatus.equals(other.eventStatus)) { + return false; + } + } + if (statusInfo == null) { + if (other.statusInfo != null) { + return false; + } + } else { + if (! statusInfo.equals(other.statusInfo)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = super.hashCode(); + hash = 83 * hash + (definition != null ? definition.hashCode() : 0); + hash = 83 * hash + (sourceEvent != null ? sourceEvent.hashCode() : 0); + hash = 83 * hash + (events != null ? events.hashCode() : 0); + hash = 83 * hash + (eventTime != null ? eventTime.hashCode() : 0); + hash = 83 * hash + (arguments != null ? arguments.hashCode() : 0); + hash = 83 * hash + (eventStatus != null ? eventStatus.hashCode() : 0); + hash = 83 * hash + (statusInfo != null ? statusInfo.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(EventInstance: "); + buf.append(super.toString()); + buf.append(", definition=").append(definition); + buf.append(", sourceEvent=").append(sourceEvent); + buf.append(", events=").append(events); + buf.append(", eventTime=").append(eventTime); + buf.append(", arguments=").append(arguments); + buf.append(", eventStatus=").append(eventStatus); + buf.append(", statusInfo=").append(statusInfo); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + super.encode(encoder); + if (definition == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'definition' cannot be null!"); + } + if (eventStatus == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'eventStatus' cannot be null!"); + } + encoder.encodeElement(definition); + encoder.encodeNullableIdentifier(sourceEvent); + encoder.encodeNullableElement(events); + encoder.encodeNullableFineTime(eventTime); + encoder.encodeNullableElement(arguments); + encoder.encodeElement(eventStatus); + encoder.encodeNullableString(statusInfo); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + super.decode(decoder); + definition = (org.ccsds.moims.mo.mal.structures.ObjectRef) decoder.decodeElement(new org.ccsds.moims.mo.mal.structures.ObjectRef()); + sourceEvent = decoder.decodeNullableIdentifier(); + events = (org.ccsds.moims.mo.mal.structures.ObjectRefList) decoder.decodeNullableElement(new org.ccsds.moims.mo.mal.structures.ObjectRefList()); + eventTime = decoder.decodeNullableFineTime(); + arguments = (org.ccsds.moims.mo.mps.structures.ArgumentList) decoder.decodeNullableElement(new org.ccsds.moims.mo.mps.structures.ArgumentList()); + eventStatus = (org.ccsds.moims.mo.mps.structures.EventStatusEnum) decoder.decodeElement(org.ccsds.moims.mo.mps.structures.EventStatusEnum.GROUP); + statusInfo = decoder.decodeNullableString(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/EventInstanceList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/EventInstanceList.java new file mode 100644 index 00000000..ddf0fa00 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/EventInstanceList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for EventInstance. + */ +public final class EventInstanceList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107510L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107510L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for EventInstanceList. + * + */ + public EventInstanceList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public EventInstanceList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public EventInstanceList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.EventInstance element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.EventInstance element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new EventInstanceList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.EventInstance(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/EventRepetition.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/EventRepetition.java new file mode 100644 index 00000000..6072630c --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/EventRepetition.java @@ -0,0 +1,208 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E1: A sub-type of Repetition based on planning events. + */ +public final class EventRepetition extends org.ccsds.moims.mo.mps.structures.Repetition { + + private static final long serialVersionUID = 1407374900330559L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330559L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Reference to an EventDefinition (type of event). + */ + private org.ccsds.moims.mo.mal.structures.Element eventRef; + + /** + * Number of occurrences of the planning event required between occurrences + * of the planning activity. + */ + private org.ccsds.moims.mo.mal.structures.Element separation; + + /** + * The allowed tolerance (+/-) in the number of occurrences of the planning + * event between occurrences of the planning activity, the interpretation + * of which is dependent on the separationType. + */ + private org.ccsds.moims.mo.mal.structures.Element tolerance; + + /** + * Default constructor for EventRepetition. + * + */ + public EventRepetition() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param count Maximum number of repeat cycles/instances. If not specified there is no limit to the number of repetitions. + * @param timeWindow Time period over which the repetition is applicable. If not specified repetition continues indefinitely. + * @param separationType Specifies whether the repetition interval is Relative to the previous occurrence, or Absolute for all occurrences. + * @param eventRef Reference to an EventDefinition (type of event). + * @param separation Number of occurrences of the planning event required between occurrences of the planning activity. + * @param tolerance The allowed tolerance (+/-) in the number of occurrences of the planning event between occurrences of the planning activity, the interpretation of which is dependent on the separationType. + */ + public EventRepetition(Integer count, + org.ccsds.moims.mo.mps.structures.TimeWindow timeWindow, + org.ccsds.moims.mo.mps.structures.SeparationTypeEnum separationType, + org.ccsds.moims.mo.mal.structures.Element eventRef, + org.ccsds.moims.mo.mal.structures.Element separation, + org.ccsds.moims.mo.mal.structures.Element tolerance) { + super(count, + timeWindow, + separationType); + this.eventRef = eventRef; + this.separation = separation; + this.tolerance = tolerance; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param separationType Specifies whether the repetition interval is Relative to the previous occurrence, or Absolute for all occurrences. + * @param eventRef Reference to an EventDefinition (type of event). + * @param separation Number of occurrences of the planning event required between occurrences of the planning activity. + * @param tolerance The allowed tolerance (+/-) in the number of occurrences of the planning event between occurrences of the planning activity, the interpretation of which is dependent on the separationType. + */ + public EventRepetition(org.ccsds.moims.mo.mps.structures.SeparationTypeEnum separationType, + org.ccsds.moims.mo.mal.structures.Element eventRef, + org.ccsds.moims.mo.mal.structures.Element separation, + org.ccsds.moims.mo.mal.structures.Element tolerance) { + super(separationType); + this.eventRef = eventRef; + this.separation = separation; + this.tolerance = tolerance; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.EventRepetition(); + } + + /** + * Returns the field eventRef. + * + * @return The field eventRef + */ + public org.ccsds.moims.mo.mal.structures.Element getEventRef() { + return eventRef; + } + + /** + * Returns the field separation. + * + * @return The field separation + */ + public org.ccsds.moims.mo.mal.structures.Element getSeparation() { + return separation; + } + + /** + * Returns the field tolerance. + * + * @return The field tolerance + */ + public org.ccsds.moims.mo.mal.structures.Element getTolerance() { + return tolerance; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof EventRepetition) { + if (! super.equals(obj)) { + return false; + } + EventRepetition other = (EventRepetition) obj; + if (eventRef == null) { + if (other.eventRef != null) { + return false; + } + } else { + if (! eventRef.equals(other.eventRef)) { + return false; + } + } + if (separation == null) { + if (other.separation != null) { + return false; + } + } else { + if (! separation.equals(other.separation)) { + return false; + } + } + if (tolerance == null) { + if (other.tolerance != null) { + return false; + } + } else { + if (! tolerance.equals(other.tolerance)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = super.hashCode(); + hash = 83 * hash + (eventRef != null ? eventRef.hashCode() : 0); + hash = 83 * hash + (separation != null ? separation.hashCode() : 0); + hash = 83 * hash + (tolerance != null ? tolerance.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(EventRepetition: "); + buf.append(super.toString()); + buf.append(", eventRef=").append(eventRef); + buf.append(", separation=").append(separation); + buf.append(", tolerance=").append(tolerance); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + super.encode(encoder); + if (eventRef == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'eventRef' cannot be null!"); + } + if (separation == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'separation' cannot be null!"); + } + if (tolerance == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'tolerance' cannot be null!"); + } + encoder.encodeAbstractElement(eventRef); + encoder.encodeAbstractElement(separation); + encoder.encodeAbstractElement(tolerance); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + super.decode(decoder); + eventRef = (org.ccsds.moims.mo.mal.structures.Element) decoder.decodeAbstractElement(); + separation = (org.ccsds.moims.mo.mal.structures.Element) decoder.decodeAbstractElement(); + tolerance = (org.ccsds.moims.mo.mal.structures.Element) decoder.decodeAbstractElement(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/EventRepetitionList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/EventRepetitionList.java new file mode 100644 index 00000000..f9640393 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/EventRepetitionList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for EventRepetition. + */ +public final class EventRepetitionList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107649L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107649L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for EventRepetitionList. + * + */ + public EventRepetitionList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public EventRepetitionList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public EventRepetitionList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.EventRepetition element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.EventRepetition element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new EventRepetitionList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.EventRepetition(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/EventStatusEnum.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/EventStatusEnum.java new file mode 100644 index 00000000..90633cf2 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/EventStatusEnum.java @@ -0,0 +1,149 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * Enumeration class for EventStatusEnum. + */ +public final class EventStatusEnum extends org.ccsds.moims.mo.mal.structures.Enumeration { + + private static final long serialVersionUID = 1407374900330699L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330699L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Enumeration value for GROUP. + */ + public static final int GROUP_VALUE = 1; + + /** + * Enumeration singleton for value GROUP. + */ + public static final org.ccsds.moims.mo.mps.structures.EventStatusEnum GROUP = new org.ccsds.moims.mo.mps.structures.EventStatusEnum(org.ccsds.moims.mo.mps.structures.EventStatusEnum.GROUP_VALUE); + + /** + * Enumeration value for PLANNED. + */ + public static final int PLANNED_VALUE = 2; + + /** + * Enumeration singleton for value PLANNED. + */ + public static final org.ccsds.moims.mo.mps.structures.EventStatusEnum PLANNED = new org.ccsds.moims.mo.mps.structures.EventStatusEnum(org.ccsds.moims.mo.mps.structures.EventStatusEnum.PLANNED_VALUE); + + /** + * Enumeration value for ACTIVATED. + */ + public static final int ACTIVATED_VALUE = 3; + + /** + * Enumeration singleton for value ACTIVATED. + */ + public static final org.ccsds.moims.mo.mps.structures.EventStatusEnum ACTIVATED = new org.ccsds.moims.mo.mps.structures.EventStatusEnum(org.ccsds.moims.mo.mps.structures.EventStatusEnum.ACTIVATED_VALUE); + + /** + * Enumeration value for TERMINATED. + */ + public static final int TERMINATED_VALUE = 4; + + /** + * Enumeration singleton for value TERMINATED. + */ + public static final org.ccsds.moims.mo.mps.structures.EventStatusEnum TERMINATED = new org.ccsds.moims.mo.mps.structures.EventStatusEnum(org.ccsds.moims.mo.mps.structures.EventStatusEnum.TERMINATED_VALUE); + + /** + * Set of enumeration instances. + */ + private static final org.ccsds.moims.mo.mps.structures.EventStatusEnum[] _ENUMERATIONS = { + GROUP, PLANNED, ACTIVATED, TERMINATED}; + + /** + * E1: The EventStatusEnum represents the status of a given EventInstance. + */ + public EventStatusEnum() { + super(-1); + } + + /** + * E1: The EventStatusEnum represents the status of a given EventInstance. + * + * @param value The value of the Enumeration. + */ + public EventStatusEnum(int value) { + super(value); + } + + @Override + public String toString() { + switch (getValue()) { + case GROUP_VALUE: + return "GROUP"; + case PLANNED_VALUE: + return "PLANNED"; + case ACTIVATED_VALUE: + return "ACTIVATED"; + case TERMINATED_VALUE: + return "TERMINATED"; + default: + throw new RuntimeException("Unknown ordinal!"); + } + } + + /** + * Returns the enumeration element represented by the supplied string, or + * null if not matched. + * + * @param s s The string to search for. + * @return The matched enumeration element, or null if not matched. + */ + public static org.ccsds.moims.mo.mps.structures.EventStatusEnum fromString(String s) { + switch (s) { + case "GROUP": + return EventStatusEnum.GROUP; + case "PLANNED": + return EventStatusEnum.PLANNED; + case "ACTIVATED": + return EventStatusEnum.ACTIVATED; + case "TERMINATED": + return EventStatusEnum.TERMINATED; + default: + throw new RuntimeException("Unknown Enumeration for the provided string: " + s); + } + } + + @Override + public org.ccsds.moims.mo.mal.structures.Enumeration fromValue(Integer value) { + switch (value) { + case GROUP_VALUE: + return EventStatusEnum.GROUP; + case PLANNED_VALUE: + return EventStatusEnum.PLANNED; + case ACTIVATED_VALUE: + return EventStatusEnum.ACTIVATED; + case TERMINATED_VALUE: + return EventStatusEnum.TERMINATED; + default: + throw new RuntimeException("Unknown Enumeration for the provided value: " + value); + } + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return _ENUMERATIONS[0]; + } + + @Override + public int getEnumSize() { + return 4; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/EventStatusEnumList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/EventStatusEnumList.java new file mode 100644 index 00000000..05cc7940 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/EventStatusEnumList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for EventStatusEnum. + */ +public final class EventStatusEnumList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107509L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107509L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for EventStatusEnumList. + * + */ + public EventStatusEnumList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public EventStatusEnumList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public EventStatusEnumList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.EventStatusEnum element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.EventStatusEnum element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new EventStatusEnumList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return org.ccsds.moims.mo.mps.structures.EventStatusEnum.GROUP; + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/EventTrigger.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/EventTrigger.java new file mode 100644 index 00000000..d8370edb --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/EventTrigger.java @@ -0,0 +1,148 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E1: Sub-type of Trigger based on planning event. + */ +public final class EventTrigger extends org.ccsds.moims.mo.mps.structures.Trigger { + + private static final long serialVersionUID = 1407374900330551L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330551L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Reference to an EventInstance. + */ + private org.ccsds.moims.mo.mal.structures.ObjectRef triggerEvent; + + /** + * Time offset from the EventInstance. + */ + private org.ccsds.moims.mo.mal.structures.Duration timeOffset; + + /** + * Default constructor for EventTrigger. + * + */ + public EventTrigger() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param time Predicted or actual time of Trigger. The predicted time may evolve during the planning process up to the time of execution. The actual time is only available post execution, and hence can only be provided by a plan execution function. + * @param triggerEvent Reference to an EventInstance + * @param timeOffset Time offset from the EventInstance + */ + public EventTrigger(org.ccsds.moims.mo.mal.structures.Time time, + org.ccsds.moims.mo.mal.structures.ObjectRef triggerEvent, + org.ccsds.moims.mo.mal.structures.Duration timeOffset) { + super(time); + this.triggerEvent = triggerEvent; + this.timeOffset = timeOffset; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.EventTrigger(); + } + + /** + * Returns the field triggerEvent. + * + * @return The field triggerEvent + */ + public org.ccsds.moims.mo.mal.structures.ObjectRef getTriggerEvent() { + return triggerEvent; + } + + /** + * Returns the field timeOffset. + * + * @return The field timeOffset + */ + public org.ccsds.moims.mo.mal.structures.Duration getTimeOffset() { + return timeOffset; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof EventTrigger) { + if (! super.equals(obj)) { + return false; + } + EventTrigger other = (EventTrigger) obj; + if (triggerEvent == null) { + if (other.triggerEvent != null) { + return false; + } + } else { + if (! triggerEvent.equals(other.triggerEvent)) { + return false; + } + } + if (timeOffset == null) { + if (other.timeOffset != null) { + return false; + } + } else { + if (! timeOffset.equals(other.timeOffset)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = super.hashCode(); + hash = 83 * hash + (triggerEvent != null ? triggerEvent.hashCode() : 0); + hash = 83 * hash + (timeOffset != null ? timeOffset.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(EventTrigger: "); + buf.append(super.toString()); + buf.append(", triggerEvent=").append(triggerEvent); + buf.append(", timeOffset=").append(timeOffset); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + super.encode(encoder); + if (triggerEvent == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'triggerEvent' cannot be null!"); + } + if (timeOffset == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'timeOffset' cannot be null!"); + } + encoder.encodeElement(triggerEvent); + encoder.encodeDuration(timeOffset); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + super.decode(decoder); + triggerEvent = (org.ccsds.moims.mo.mal.structures.ObjectRef) decoder.decodeElement(new org.ccsds.moims.mo.mal.structures.ObjectRef()); + timeOffset = decoder.decodeDuration(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/EventTriggerList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/EventTriggerList.java new file mode 100644 index 00000000..60fc2e9f --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/EventTriggerList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for EventTrigger. + */ +public final class EventTriggerList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107657L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107657L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for EventTriggerList. + * + */ + public EventTriggerList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public EventTriggerList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public EventTriggerList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.EventTrigger element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.EventTrigger element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new EventTriggerList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.EventTrigger(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/EventUpdate.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/EventUpdate.java new file mode 100644 index 00000000..e6fbbdb4 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/EventUpdate.java @@ -0,0 +1,302 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E1: EventUpdate is a data structure that is used to report the dynamic + * status of an EventInstance in the context of the MPS Plan Execution Control + * service monitorPlanExecutionDetail operation. EventUpdates may be distributed + * to subscribing applications, including status displays, to inform them + * of the latest status of the event. This may be particularly relevant in + * conjunction with a plan execution function. EventUpdates may be stored + * in event history to provide a complete record of evolving status over time. + */ +public final class EventUpdate extends org.ccsds.moims.mo.mps.structures.PlanDetailUpdate { + + private static final long serialVersionUID = 1407374900330701L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330701L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Reference to the EventInstance to which the status update relates. + */ + private org.ccsds.moims.mo.mal.structures.ObjectRef eventInstance; + + /** + * Time of status update. + */ + private org.ccsds.moims.mo.mal.structures.Time timestamp; + + /** + * Predicted or actual time of the event. EventTime is nullable: it can be + * predicted without an EventTime (e.g., if position based). + */ + private org.ccsds.moims.mo.mal.structures.FineTime eventTime; + + /** + * Argument values. + */ + private org.ccsds.moims.mo.mps.structures.ArgumentList arguments; + + /** + * Current status of the EventInstance. + */ + private org.ccsds.moims.mo.mps.structures.EventStatusEnum eventStatus; + + /** + * StatusInfo provides the reason for entering the Terminated state and is + * customizable, but if the following conditions exist then the specified + * text shall be used: - Occurred (Event has been triggered); - Did Not Occur + * (Event expired or did not occur within validity period); - Deleted (Event + * was deleted). + */ + private String statusInfo; + + /** + * Default constructor for EventUpdate. + * + */ + public EventUpdate() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param eventInstance Reference to the EventInstance to which the status update relates. + * @param timestamp Time of status update. + * @param eventTime Predicted or actual time of the event. EventTime is nullable: it can be predicted without an EventTime (e.g., if position based). + * @param arguments Argument values. + * @param eventStatus Current status of the EventInstance. + * @param statusInfo StatusInfo provides the reason for entering the Terminated state and is customizable, but if the following conditions exist then the specified text shall be used: - Occurred (Event has been triggered); - Did Not Occur (Event expired or did not occur within validity period); - Deleted (Event was deleted). + */ + public EventUpdate(org.ccsds.moims.mo.mal.structures.ObjectRef eventInstance, + org.ccsds.moims.mo.mal.structures.Time timestamp, + org.ccsds.moims.mo.mal.structures.FineTime eventTime, + org.ccsds.moims.mo.mps.structures.ArgumentList arguments, + org.ccsds.moims.mo.mps.structures.EventStatusEnum eventStatus, + String statusInfo) { + this.eventInstance = eventInstance; + this.timestamp = timestamp; + this.eventTime = eventTime; + this.arguments = arguments; + this.eventStatus = eventStatus; + this.statusInfo = statusInfo; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param eventInstance Reference to the EventInstance to which the status update relates. + * @param timestamp Time of status update. + * @param eventTime Predicted or actual time of the event. EventTime is nullable: it can be predicted without an EventTime (e.g., if position based). + * @param eventStatus Current status of the EventInstance. + */ + public EventUpdate(org.ccsds.moims.mo.mal.structures.ObjectRef eventInstance, + org.ccsds.moims.mo.mal.structures.Time timestamp, + org.ccsds.moims.mo.mal.structures.FineTime eventTime, + org.ccsds.moims.mo.mps.structures.EventStatusEnum eventStatus) { + this.eventInstance = eventInstance; + this.timestamp = timestamp; + this.eventTime = eventTime; + this.arguments = null; + this.eventStatus = eventStatus; + this.statusInfo = null; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.EventUpdate(); + } + + /** + * Returns the field eventInstance. + * + * @return The field eventInstance + */ + public org.ccsds.moims.mo.mal.structures.ObjectRef getEventInstance() { + return eventInstance; + } + + /** + * Returns the field timestamp. + * + * @return The field timestamp + */ + public org.ccsds.moims.mo.mal.structures.Time getTimestamp() { + return timestamp; + } + + /** + * Returns the field eventTime. + * + * @return The field eventTime + */ + public org.ccsds.moims.mo.mal.structures.FineTime getEventTime() { + return eventTime; + } + + /** + * Returns the field arguments. + * + * @return The field arguments + */ + public org.ccsds.moims.mo.mps.structures.ArgumentList getArguments() { + return arguments; + } + + /** + * Returns the field eventStatus. + * + * @return The field eventStatus + */ + public org.ccsds.moims.mo.mps.structures.EventStatusEnum getEventStatus() { + return eventStatus; + } + + /** + * Returns the field statusInfo. + * + * @return The field statusInfo + */ + public String getStatusInfo() { + return statusInfo; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof EventUpdate) { + if (! super.equals(obj)) { + return false; + } + EventUpdate other = (EventUpdate) obj; + if (eventInstance == null) { + if (other.eventInstance != null) { + return false; + } + } else { + if (! eventInstance.equals(other.eventInstance)) { + return false; + } + } + if (timestamp == null) { + if (other.timestamp != null) { + return false; + } + } else { + if (! timestamp.equals(other.timestamp)) { + return false; + } + } + if (eventTime == null) { + if (other.eventTime != null) { + return false; + } + } else { + if (! eventTime.equals(other.eventTime)) { + return false; + } + } + if (arguments == null) { + if (other.arguments != null) { + return false; + } + } else { + if (! arguments.equals(other.arguments)) { + return false; + } + } + if (eventStatus == null) { + if (other.eventStatus != null) { + return false; + } + } else { + if (! eventStatus.equals(other.eventStatus)) { + return false; + } + } + if (statusInfo == null) { + if (other.statusInfo != null) { + return false; + } + } else { + if (! statusInfo.equals(other.statusInfo)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = super.hashCode(); + hash = 83 * hash + (eventInstance != null ? eventInstance.hashCode() : 0); + hash = 83 * hash + (timestamp != null ? timestamp.hashCode() : 0); + hash = 83 * hash + (eventTime != null ? eventTime.hashCode() : 0); + hash = 83 * hash + (arguments != null ? arguments.hashCode() : 0); + hash = 83 * hash + (eventStatus != null ? eventStatus.hashCode() : 0); + hash = 83 * hash + (statusInfo != null ? statusInfo.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(EventUpdate: "); + buf.append(super.toString()); + buf.append(", eventInstance=").append(eventInstance); + buf.append(", timestamp=").append(timestamp); + buf.append(", eventTime=").append(eventTime); + buf.append(", arguments=").append(arguments); + buf.append(", eventStatus=").append(eventStatus); + buf.append(", statusInfo=").append(statusInfo); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + super.encode(encoder); + if (eventInstance == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'eventInstance' cannot be null!"); + } + if (timestamp == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'timestamp' cannot be null!"); + } + if (eventTime == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'eventTime' cannot be null!"); + } + if (eventStatus == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'eventStatus' cannot be null!"); + } + encoder.encodeElement(eventInstance); + encoder.encodeTime(timestamp); + encoder.encodeFineTime(eventTime); + encoder.encodeNullableElement(arguments); + encoder.encodeElement(eventStatus); + encoder.encodeNullableString(statusInfo); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + super.decode(decoder); + eventInstance = (org.ccsds.moims.mo.mal.structures.ObjectRef) decoder.decodeElement(new org.ccsds.moims.mo.mal.structures.ObjectRef()); + timestamp = decoder.decodeTime(); + eventTime = decoder.decodeFineTime(); + arguments = (org.ccsds.moims.mo.mps.structures.ArgumentList) decoder.decodeNullableElement(new org.ccsds.moims.mo.mps.structures.ArgumentList()); + eventStatus = (org.ccsds.moims.mo.mps.structures.EventStatusEnum) decoder.decodeElement(org.ccsds.moims.mo.mps.structures.EventStatusEnum.GROUP); + statusInfo = decoder.decodeNullableString(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/EventUpdateList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/EventUpdateList.java new file mode 100644 index 00000000..3413ce8b --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/EventUpdateList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for EventUpdate. + */ +public final class EventUpdateList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107507L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107507L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for EventUpdateList. + * + */ + public EventUpdateList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public EventUpdateList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public EventUpdateList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.EventUpdate element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.EventUpdate element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new EventUpdateList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.EventUpdate(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/EventWindow.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/EventWindow.java new file mode 100644 index 00000000..0b73f4d2 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/EventWindow.java @@ -0,0 +1,218 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E1: Represents a specific period relative to two events that mark the start + * and end of the EventWindow. + */ +public final class EventWindow implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1407374900330502L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330502L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * The start of the event window is relative to the referenced startEvent. + */ + private org.ccsds.moims.mo.mal.structures.Element startEvent; + + /** + * The start of the event window is offset by the defined time period from + * the startEvent. A positive offset implies a shift later in time. Default + * is no offset. + */ + private org.ccsds.moims.mo.mal.structures.Element startOffset; + + /** + * The end of the event window is relative to the referenced endEvent. + */ + private org.ccsds.moims.mo.mal.structures.Element endEvent; + + /** + * The end of the event window is offset by the defined time period from the + * endEvent. A positive offset implies a shift later in time. Default is + * no offset. + */ + private org.ccsds.moims.mo.mal.structures.Element endOffset; + + /** + * Default constructor for EventWindow. + * + */ + public EventWindow() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param startEvent The start of the event window is relative to the referenced startEvent. + * @param startOffset The start of the event window is offset by the defined time period from the startEvent. A positive offset implies a shift later in time. Default is no offset. + * @param endEvent The end of the event window is relative to the referenced endEvent. + * @param endOffset The end of the event window is offset by the defined time period from the endEvent. A positive offset implies a shift later in time. Default is no offset. + */ + public EventWindow(org.ccsds.moims.mo.mal.structures.Element startEvent, + org.ccsds.moims.mo.mal.structures.Element startOffset, + org.ccsds.moims.mo.mal.structures.Element endEvent, + org.ccsds.moims.mo.mal.structures.Element endOffset) { + this.startEvent = startEvent; + this.startOffset = startOffset; + this.endEvent = endEvent; + this.endOffset = endOffset; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param startEvent The start of the event window is relative to the referenced startEvent. + * @param endEvent The end of the event window is relative to the referenced endEvent. + */ + public EventWindow(org.ccsds.moims.mo.mal.structures.Element startEvent, + org.ccsds.moims.mo.mal.structures.Element endEvent) { + this.startEvent = startEvent; + this.startOffset = null; + this.endEvent = endEvent; + this.endOffset = null; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.EventWindow(); + } + + /** + * Returns the field startEvent. + * + * @return The field startEvent + */ + public org.ccsds.moims.mo.mal.structures.Element getStartEvent() { + return startEvent; + } + + /** + * Returns the field startOffset. + * + * @return The field startOffset + */ + public org.ccsds.moims.mo.mal.structures.Element getStartOffset() { + return startOffset; + } + + /** + * Returns the field endEvent. + * + * @return The field endEvent + */ + public org.ccsds.moims.mo.mal.structures.Element getEndEvent() { + return endEvent; + } + + /** + * Returns the field endOffset. + * + * @return The field endOffset + */ + public org.ccsds.moims.mo.mal.structures.Element getEndOffset() { + return endOffset; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof EventWindow) { + EventWindow other = (EventWindow) obj; + if (startEvent == null) { + if (other.startEvent != null) { + return false; + } + } else { + if (! startEvent.equals(other.startEvent)) { + return false; + } + } + if (startOffset == null) { + if (other.startOffset != null) { + return false; + } + } else { + if (! startOffset.equals(other.startOffset)) { + return false; + } + } + if (endEvent == null) { + if (other.endEvent != null) { + return false; + } + } else { + if (! endEvent.equals(other.endEvent)) { + return false; + } + } + if (endOffset == null) { + if (other.endOffset != null) { + return false; + } + } else { + if (! endOffset.equals(other.endOffset)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (startEvent != null ? startEvent.hashCode() : 0); + hash = 83 * hash + (startOffset != null ? startOffset.hashCode() : 0); + hash = 83 * hash + (endEvent != null ? endEvent.hashCode() : 0); + hash = 83 * hash + (endOffset != null ? endOffset.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(EventWindow: "); + buf.append("startEvent=").append(startEvent); + buf.append(", startOffset=").append(startOffset); + buf.append(", endEvent=").append(endEvent); + buf.append(", endOffset=").append(endOffset); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (startEvent == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'startEvent' cannot be null!"); + } + if (endEvent == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'endEvent' cannot be null!"); + } + encoder.encodeAbstractElement(startEvent); + encoder.encodeNullableAbstractElement(startOffset); + encoder.encodeAbstractElement(endEvent); + encoder.encodeNullableAbstractElement(endOffset); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + startEvent = (org.ccsds.moims.mo.mal.structures.Element) decoder.decodeAbstractElement(); + startOffset = (org.ccsds.moims.mo.mal.structures.Element) decoder.decodeNullableAbstractElement(); + endEvent = (org.ccsds.moims.mo.mal.structures.Element) decoder.decodeAbstractElement(); + endOffset = (org.ccsds.moims.mo.mal.structures.Element) decoder.decodeNullableAbstractElement(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/EventWindowList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/EventWindowList.java new file mode 100644 index 00000000..2865681c --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/EventWindowList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for EventWindow. + */ +public final class EventWindowList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107706L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107706L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for EventWindowList. + * + */ + public EventWindowList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public EventWindowList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public EventWindowList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.EventWindow element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.EventWindow element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new EventWindowList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.EventWindow(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ExpressionOperatorEnum.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ExpressionOperatorEnum.java new file mode 100644 index 00000000..b03a0c23 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ExpressionOperatorEnum.java @@ -0,0 +1,216 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * Enumeration class for ExpressionOperatorEnum. + */ +public final class ExpressionOperatorEnum extends org.ccsds.moims.mo.mal.structures.Enumeration { + + private static final long serialVersionUID = 1407374900330532L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330532L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Enumeration value for EQUAL. + */ + public static final int EQUAL_VALUE = 1; + + /** + * Enumeration singleton for value EQUAL. + */ + public static final org.ccsds.moims.mo.mps.structures.ExpressionOperatorEnum EQUAL = new org.ccsds.moims.mo.mps.structures.ExpressionOperatorEnum(org.ccsds.moims.mo.mps.structures.ExpressionOperatorEnum.EQUAL_VALUE); + + /** + * Enumeration value for DIFFER. + */ + public static final int DIFFER_VALUE = 2; + + /** + * Enumeration singleton for value DIFFER. + */ + public static final org.ccsds.moims.mo.mps.structures.ExpressionOperatorEnum DIFFER = new org.ccsds.moims.mo.mps.structures.ExpressionOperatorEnum(org.ccsds.moims.mo.mps.structures.ExpressionOperatorEnum.DIFFER_VALUE); + + /** + * Enumeration value for GREATER. + */ + public static final int GREATER_VALUE = 3; + + /** + * Enumeration singleton for value GREATER. + */ + public static final org.ccsds.moims.mo.mps.structures.ExpressionOperatorEnum GREATER = new org.ccsds.moims.mo.mps.structures.ExpressionOperatorEnum(org.ccsds.moims.mo.mps.structures.ExpressionOperatorEnum.GREATER_VALUE); + + /** + * Enumeration value for GREATER_OR_EQUAL. + */ + public static final int GREATER_OR_EQUAL_VALUE = 4; + + /** + * Enumeration singleton for value GREATER_OR_EQUAL. + */ + public static final org.ccsds.moims.mo.mps.structures.ExpressionOperatorEnum GREATER_OR_EQUAL = new org.ccsds.moims.mo.mps.structures.ExpressionOperatorEnum(org.ccsds.moims.mo.mps.structures.ExpressionOperatorEnum.GREATER_OR_EQUAL_VALUE); + + /** + * Enumeration value for LESS. + */ + public static final int LESS_VALUE = 5; + + /** + * Enumeration singleton for value LESS. + */ + public static final org.ccsds.moims.mo.mps.structures.ExpressionOperatorEnum LESS = new org.ccsds.moims.mo.mps.structures.ExpressionOperatorEnum(org.ccsds.moims.mo.mps.structures.ExpressionOperatorEnum.LESS_VALUE); + + /** + * Enumeration value for LESS_OR_EQUAL. + */ + public static final int LESS_OR_EQUAL_VALUE = 6; + + /** + * Enumeration singleton for value LESS_OR_EQUAL. + */ + public static final org.ccsds.moims.mo.mps.structures.ExpressionOperatorEnum LESS_OR_EQUAL = new org.ccsds.moims.mo.mps.structures.ExpressionOperatorEnum(org.ccsds.moims.mo.mps.structures.ExpressionOperatorEnum.LESS_OR_EQUAL_VALUE); + + /** + * Enumeration value for CONTAINS. + */ + public static final int CONTAINS_VALUE = 7; + + /** + * Enumeration singleton for value CONTAINS. + */ + public static final org.ccsds.moims.mo.mps.structures.ExpressionOperatorEnum CONTAINS = new org.ccsds.moims.mo.mps.structures.ExpressionOperatorEnum(org.ccsds.moims.mo.mps.structures.ExpressionOperatorEnum.CONTAINS_VALUE); + + /** + * Enumeration value for ICONTAINS. + */ + public static final int ICONTAINS_VALUE = 8; + + /** + * Enumeration singleton for value ICONTAINS. + */ + public static final org.ccsds.moims.mo.mps.structures.ExpressionOperatorEnum ICONTAINS = new org.ccsds.moims.mo.mps.structures.ExpressionOperatorEnum(org.ccsds.moims.mo.mps.structures.ExpressionOperatorEnum.ICONTAINS_VALUE); + + /** + * Set of enumeration instances. + */ + private static final org.ccsds.moims.mo.mps.structures.ExpressionOperatorEnum[] _ENUMERATIONS = { + EQUAL, DIFFER, GREATER, GREATER_OR_EQUAL, LESS, LESS_OR_EQUAL, CONTAINS, + ICONTAINS}; + + /** + * E5: Whenever a value comparison is needed in this standard, multiple Boolean operations may be chosen from. These operations are described by each of the possible enumeration values of ExpressionOperatorEnum. + */ + public ExpressionOperatorEnum() { + super(-1); + } + + /** + * E5: Whenever a value comparison is needed in this standard, multiple Boolean + * operations may be chosen from. These operations are described by each + * of the possible enumeration values of ExpressionOperatorEnum. + * + * @param value The value of the Enumeration. + */ + public ExpressionOperatorEnum(int value) { + super(value); + } + + @Override + public String toString() { + switch (getValue()) { + case EQUAL_VALUE: + return "EQUAL"; + case DIFFER_VALUE: + return "DIFFER"; + case GREATER_VALUE: + return "GREATER"; + case GREATER_OR_EQUAL_VALUE: + return "GREATER_OR_EQUAL"; + case LESS_VALUE: + return "LESS"; + case LESS_OR_EQUAL_VALUE: + return "LESS_OR_EQUAL"; + case CONTAINS_VALUE: + return "CONTAINS"; + case ICONTAINS_VALUE: + return "ICONTAINS"; + default: + throw new RuntimeException("Unknown ordinal!"); + } + } + + /** + * Returns the enumeration element represented by the supplied string, or + * null if not matched. + * + * @param s s The string to search for. + * @return The matched enumeration element, or null if not matched. + */ + public static org.ccsds.moims.mo.mps.structures.ExpressionOperatorEnum fromString(String s) { + switch (s) { + case "EQUAL": + return ExpressionOperatorEnum.EQUAL; + case "DIFFER": + return ExpressionOperatorEnum.DIFFER; + case "GREATER": + return ExpressionOperatorEnum.GREATER; + case "GREATER_OR_EQUAL": + return ExpressionOperatorEnum.GREATER_OR_EQUAL; + case "LESS": + return ExpressionOperatorEnum.LESS; + case "LESS_OR_EQUAL": + return ExpressionOperatorEnum.LESS_OR_EQUAL; + case "CONTAINS": + return ExpressionOperatorEnum.CONTAINS; + case "ICONTAINS": + return ExpressionOperatorEnum.ICONTAINS; + default: + throw new RuntimeException("Unknown Enumeration for the provided string: " + s); + } + } + + @Override + public org.ccsds.moims.mo.mal.structures.Enumeration fromValue(Integer value) { + switch (value) { + case EQUAL_VALUE: + return ExpressionOperatorEnum.EQUAL; + case DIFFER_VALUE: + return ExpressionOperatorEnum.DIFFER; + case GREATER_VALUE: + return ExpressionOperatorEnum.GREATER; + case GREATER_OR_EQUAL_VALUE: + return ExpressionOperatorEnum.GREATER_OR_EQUAL; + case LESS_VALUE: + return ExpressionOperatorEnum.LESS; + case LESS_OR_EQUAL_VALUE: + return ExpressionOperatorEnum.LESS_OR_EQUAL; + case CONTAINS_VALUE: + return ExpressionOperatorEnum.CONTAINS; + case ICONTAINS_VALUE: + return ExpressionOperatorEnum.ICONTAINS; + default: + throw new RuntimeException("Unknown Enumeration for the provided value: " + value); + } + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return _ENUMERATIONS[0]; + } + + @Override + public int getEnumSize() { + return 8; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ExpressionOperatorEnumList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ExpressionOperatorEnumList.java new file mode 100644 index 00000000..f3a3c8f2 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ExpressionOperatorEnumList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for ExpressionOperatorEnum. + */ +public final class ExpressionOperatorEnumList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107676L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107676L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for ExpressionOperatorEnumList. + * + */ + public ExpressionOperatorEnumList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public ExpressionOperatorEnumList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public ExpressionOperatorEnumList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.ExpressionOperatorEnum element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.ExpressionOperatorEnum element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new ExpressionOperatorEnumList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return org.ccsds.moims.mo.mps.structures.ExpressionOperatorEnum.EQUAL; + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ExternalExpression.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ExternalExpression.java new file mode 100644 index 00000000..cbd6f7ca --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ExternalExpression.java @@ -0,0 +1,176 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E1: When the MPS data types are not sufficiently expressive, it is possible + * to provide an external expression that evaluates into a given data type, + * using the ExternalExpression data type. These external expressions are + * themselves text strings in some external language. The manner in which + * this expression is evaluated is implementation specific. + */ +public final class ExternalExpression implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1407374900330518L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330518L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Enumeration specifying the data type of the result of the expression. + */ + private org.ccsds.moims.mo.mps.structures.ArgTypeEnum type; + + /** + * Defines the expression language used to specify the expression. + */ + private String expressionLanguage; + + /** + * The text of the expression. + */ + private String expression; + + /** + * Default constructor for ExternalExpression. + * + */ + public ExternalExpression() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param type Enumeration specifying the data type of the result of the expression. + * @param expressionLanguage Defines the expression language used to specify the expression. + * @param expression The text of the expression. + */ + public ExternalExpression(org.ccsds.moims.mo.mps.structures.ArgTypeEnum type, + String expressionLanguage, + String expression) { + this.type = type; + this.expressionLanguage = expressionLanguage; + this.expression = expression; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.ExternalExpression(); + } + + /** + * Returns the field type. + * + * @return The field type + */ + public org.ccsds.moims.mo.mps.structures.ArgTypeEnum getType() { + return type; + } + + /** + * Returns the field expressionLanguage. + * + * @return The field expressionLanguage + */ + public String getExpressionLanguage() { + return expressionLanguage; + } + + /** + * Returns the field expression. + * + * @return The field expression + */ + public String getExpression() { + return expression; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ExternalExpression) { + ExternalExpression other = (ExternalExpression) obj; + if (type == null) { + if (other.type != null) { + return false; + } + } else { + if (! type.equals(other.type)) { + return false; + } + } + if (expressionLanguage == null) { + if (other.expressionLanguage != null) { + return false; + } + } else { + if (! expressionLanguage.equals(other.expressionLanguage)) { + return false; + } + } + if (expression == null) { + if (other.expression != null) { + return false; + } + } else { + if (! expression.equals(other.expression)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (type != null ? type.hashCode() : 0); + hash = 83 * hash + (expressionLanguage != null ? expressionLanguage.hashCode() : 0); + hash = 83 * hash + (expression != null ? expression.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(ExternalExpression: "); + buf.append("type=").append(type); + buf.append(", expressionLanguage=").append(expressionLanguage); + buf.append(", expression=").append(expression); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (type == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'type' cannot be null!"); + } + if (expressionLanguage == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'expressionLanguage' cannot be null!"); + } + if (expression == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'expression' cannot be null!"); + } + encoder.encodeElement(type); + encoder.encodeString(expressionLanguage); + encoder.encodeString(expression); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + type = (org.ccsds.moims.mo.mps.structures.ArgTypeEnum) decoder.decodeElement(org.ccsds.moims.mo.mps.structures.ArgTypeEnum.BLOB); + expressionLanguage = decoder.decodeString(); + expression = decoder.decodeString(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ExternalExpressionList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ExternalExpressionList.java new file mode 100644 index 00000000..3b83e711 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ExternalExpressionList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for ExternalExpression. + */ +public final class ExternalExpressionList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107690L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107690L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for ExternalExpressionList. + * + */ + public ExternalExpressionList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public ExternalExpressionList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public ExternalExpressionList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.ExternalExpression element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.ExternalExpression element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new ExternalExpressionList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.ExternalExpression(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/FunctionConstraint.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/FunctionConstraint.java new file mode 100644 index 00000000..fdaee007 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/FunctionConstraint.java @@ -0,0 +1,258 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E8: Function constraints make use of an external custom function to determine + * whether or not a constraint is satisfied. The function must return True + * for the constraint to be met. As for complex resource constraints, the + * period over which the function constraint applies is specified relative + * to the planning activity to which the constraint applies. + */ +public final class FunctionConstraint extends org.ccsds.moims.mo.mps.structures.Constraint { + + private static final long serialVersionUID = 1407374900330543L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330543L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Identifies the point in the duration of the applicable planning activity + * to which the start of the constraint period relates. Default is the start + * of the planning activity. + */ + private org.ccsds.moims.mo.mps.structures.Slider startRef; + + /** + * Identifies the point in the duration of the applicable planning activity + * to which the end of the constraint period relates. Default is the end of + * the planning activity. + */ + private org.ccsds.moims.mo.mps.structures.Slider endRef; + + /** + * Offset from startRef that specifies the start of the constraint period. + * A positive offset implies a shift later in time. Default is no offset. + */ + private org.ccsds.moims.mo.mal.structures.Element startOffset; + + /** + * Offset from endRef that specifies the end of the constraint period. A + * positive offset implies a shift later in time. Default is no offset. + */ + private org.ccsds.moims.mo.mal.structures.Element endOffset; + + /** + * Specifies the Function to be applied and its set of input arguments. + */ + private org.ccsds.moims.mo.mps.structures.FunctionDetails function; + + /** + * Default constructor for FunctionConstraint. + * + */ + public FunctionConstraint() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param negate Specifies whether the result of combining the Constraints is to be inverted (NOT function). Default = False. + * @param startRef Identifies the point in the duration of the applicable planning activity to which the start of the constraint period relates. Default is the start of the planning activity. + * @param endRef Identifies the point in the duration of the applicable planning activity to which the end of the constraint period relates. Default is the end of the planning activity. + * @param startOffset Offset from startRef that specifies the start of the constraint period. A positive offset implies a shift later in time. Default is no offset. + * @param endOffset Offset from endRef that specifies the end of the constraint period. A positive offset implies a shift later in time. Default is no offset. + * @param function Specifies the Function to be applied and its set of input arguments. + */ + public FunctionConstraint(Boolean negate, + org.ccsds.moims.mo.mps.structures.Slider startRef, + org.ccsds.moims.mo.mps.structures.Slider endRef, + org.ccsds.moims.mo.mal.structures.Element startOffset, + org.ccsds.moims.mo.mal.structures.Element endOffset, + org.ccsds.moims.mo.mps.structures.FunctionDetails function) { + super(negate); + this.startRef = startRef; + this.endRef = endRef; + this.startOffset = startOffset; + this.endOffset = endOffset; + this.function = function; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param function Specifies the Function to be applied and its set of input arguments. + */ + public FunctionConstraint(org.ccsds.moims.mo.mps.structures.FunctionDetails function) { + this.startRef = null; + this.endRef = null; + this.startOffset = null; + this.endOffset = null; + this.function = function; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.FunctionConstraint(); + } + + /** + * Returns the field startRef. + * + * @return The field startRef + */ + public org.ccsds.moims.mo.mps.structures.Slider getStartRef() { + return startRef; + } + + /** + * Returns the field endRef. + * + * @return The field endRef + */ + public org.ccsds.moims.mo.mps.structures.Slider getEndRef() { + return endRef; + } + + /** + * Returns the field startOffset. + * + * @return The field startOffset + */ + public org.ccsds.moims.mo.mal.structures.Element getStartOffset() { + return startOffset; + } + + /** + * Returns the field endOffset. + * + * @return The field endOffset + */ + public org.ccsds.moims.mo.mal.structures.Element getEndOffset() { + return endOffset; + } + + /** + * Returns the field function. + * + * @return The field function + */ + public org.ccsds.moims.mo.mps.structures.FunctionDetails getFunction() { + return function; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof FunctionConstraint) { + if (! super.equals(obj)) { + return false; + } + FunctionConstraint other = (FunctionConstraint) obj; + if (startRef == null) { + if (other.startRef != null) { + return false; + } + } else { + if (! startRef.equals(other.startRef)) { + return false; + } + } + if (endRef == null) { + if (other.endRef != null) { + return false; + } + } else { + if (! endRef.equals(other.endRef)) { + return false; + } + } + if (startOffset == null) { + if (other.startOffset != null) { + return false; + } + } else { + if (! startOffset.equals(other.startOffset)) { + return false; + } + } + if (endOffset == null) { + if (other.endOffset != null) { + return false; + } + } else { + if (! endOffset.equals(other.endOffset)) { + return false; + } + } + if (function == null) { + if (other.function != null) { + return false; + } + } else { + if (! function.equals(other.function)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = super.hashCode(); + hash = 83 * hash + (startRef != null ? startRef.hashCode() : 0); + hash = 83 * hash + (endRef != null ? endRef.hashCode() : 0); + hash = 83 * hash + (startOffset != null ? startOffset.hashCode() : 0); + hash = 83 * hash + (endOffset != null ? endOffset.hashCode() : 0); + hash = 83 * hash + (function != null ? function.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(FunctionConstraint: "); + buf.append(super.toString()); + buf.append(", startRef=").append(startRef); + buf.append(", endRef=").append(endRef); + buf.append(", startOffset=").append(startOffset); + buf.append(", endOffset=").append(endOffset); + buf.append(", function=").append(function); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + super.encode(encoder); + if (function == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'function' cannot be null!"); + } + encoder.encodeNullableElement(startRef); + encoder.encodeNullableElement(endRef); + encoder.encodeNullableAbstractElement(startOffset); + encoder.encodeNullableAbstractElement(endOffset); + encoder.encodeElement(function); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + super.decode(decoder); + startRef = (org.ccsds.moims.mo.mps.structures.Slider) decoder.decodeNullableElement(new org.ccsds.moims.mo.mps.structures.Slider()); + endRef = (org.ccsds.moims.mo.mps.structures.Slider) decoder.decodeNullableElement(new org.ccsds.moims.mo.mps.structures.Slider()); + startOffset = (org.ccsds.moims.mo.mal.structures.Element) decoder.decodeNullableAbstractElement(); + endOffset = (org.ccsds.moims.mo.mal.structures.Element) decoder.decodeNullableAbstractElement(); + function = (org.ccsds.moims.mo.mps.structures.FunctionDetails) decoder.decodeElement(new org.ccsds.moims.mo.mps.structures.FunctionDetails()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/FunctionConstraintList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/FunctionConstraintList.java new file mode 100644 index 00000000..e307edd9 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/FunctionConstraintList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for FunctionConstraint. + */ +public final class FunctionConstraintList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107665L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107665L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for FunctionConstraintList. + * + */ + public FunctionConstraintList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public FunctionConstraintList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public FunctionConstraintList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.FunctionConstraint element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.FunctionConstraint element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new FunctionConstraintList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.FunctionConstraint(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/FunctionDefinitionDetails.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/FunctionDefinitionDetails.java new file mode 100644 index 00000000..c3146f30 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/FunctionDefinitionDetails.java @@ -0,0 +1,223 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E8: FunctionDefinitionDetails is a data structure that contains static + * configuration data relating to custom functions: built-in Boolean functions + * of an MPS system, each of which has a specified Identifier and optional + * set of argument definitions. This may change over time, each comprising + * a separate version of the definition. FunctionDefinitions form part of + * the planning configuration data. + */ +public final class FunctionDefinitionDetails implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1407374900331197L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900331197L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * ID of the custom function. + */ + private org.ccsds.moims.mo.mal.structures.Identifier functionID; + + /** + * Version of the FunctionDefinition. + */ + private org.ccsds.moims.mo.mal.structures.UInteger version; + + /** + * Description of the custom function. + */ + private String description; + + /** + * List of argument definitions. + */ + private org.ccsds.moims.mo.mps.structures.ArgDefList argDefs; + + /** + * Default constructor for FunctionDefinitionDetails. + * + */ + public FunctionDefinitionDetails() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param functionID ID of the custom function. + * @param version Version of the FunctionDefinition. + * @param description Description of the custom function. + * @param argDefs List of argument definitions. + */ + public FunctionDefinitionDetails(org.ccsds.moims.mo.mal.structures.Identifier functionID, + org.ccsds.moims.mo.mal.structures.UInteger version, + String description, + org.ccsds.moims.mo.mps.structures.ArgDefList argDefs) { + this.functionID = functionID; + this.version = version; + this.description = description; + this.argDefs = argDefs; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param functionID ID of the custom function. + * @param version Version of the FunctionDefinition. + * @param description Description of the custom function. + */ + public FunctionDefinitionDetails(org.ccsds.moims.mo.mal.structures.Identifier functionID, + org.ccsds.moims.mo.mal.structures.UInteger version, + String description) { + this.functionID = functionID; + this.version = version; + this.description = description; + this.argDefs = null; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.FunctionDefinitionDetails(); + } + + /** + * Returns the field functionID. + * + * @return The field functionID + */ + public org.ccsds.moims.mo.mal.structures.Identifier getFunctionID() { + return functionID; + } + + /** + * Returns the field version. + * + * @return The field version + */ + public org.ccsds.moims.mo.mal.structures.UInteger getVersion() { + return version; + } + + /** + * Returns the field description. + * + * @return The field description + */ + public String getDescription() { + return description; + } + + /** + * Returns the field argDefs. + * + * @return The field argDefs + */ + public org.ccsds.moims.mo.mps.structures.ArgDefList getArgDefs() { + return argDefs; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof FunctionDefinitionDetails) { + FunctionDefinitionDetails other = (FunctionDefinitionDetails) obj; + if (functionID == null) { + if (other.functionID != null) { + return false; + } + } else { + if (! functionID.equals(other.functionID)) { + return false; + } + } + if (version == null) { + if (other.version != null) { + return false; + } + } else { + if (! version.equals(other.version)) { + return false; + } + } + if (description == null) { + if (other.description != null) { + return false; + } + } else { + if (! description.equals(other.description)) { + return false; + } + } + if (argDefs == null) { + if (other.argDefs != null) { + return false; + } + } else { + if (! argDefs.equals(other.argDefs)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (functionID != null ? functionID.hashCode() : 0); + hash = 83 * hash + (version != null ? version.hashCode() : 0); + hash = 83 * hash + (description != null ? description.hashCode() : 0); + hash = 83 * hash + (argDefs != null ? argDefs.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(FunctionDefinitionDetails: "); + buf.append("functionID=").append(functionID); + buf.append(", version=").append(version); + buf.append(", description=").append(description); + buf.append(", argDefs=").append(argDefs); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (functionID == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'functionID' cannot be null!"); + } + if (version == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'version' cannot be null!"); + } + if (description == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'description' cannot be null!"); + } + encoder.encodeIdentifier(functionID); + encoder.encodeUInteger(version); + encoder.encodeString(description); + encoder.encodeNullableElement(argDefs); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + functionID = decoder.decodeIdentifier(); + version = decoder.decodeUInteger(); + description = decoder.decodeString(); + argDefs = (org.ccsds.moims.mo.mps.structures.ArgDefList) decoder.decodeNullableElement(new org.ccsds.moims.mo.mps.structures.ArgDefList()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/FunctionDefinitionDetailsList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/FunctionDefinitionDetailsList.java new file mode 100644 index 00000000..59d24db7 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/FunctionDefinitionDetailsList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for FunctionDefinitionDetails. + */ +public final class FunctionDefinitionDetailsList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107011L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107011L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for FunctionDefinitionDetailsList. + * + */ + public FunctionDefinitionDetailsList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public FunctionDefinitionDetailsList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public FunctionDefinitionDetailsList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.FunctionDefinitionDetails element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.FunctionDefinitionDetails element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new FunctionDefinitionDetailsList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.FunctionDefinitionDetails(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/FunctionDetails.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/FunctionDetails.java new file mode 100644 index 00000000..6c5889d1 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/FunctionDetails.java @@ -0,0 +1,149 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E8: Contains the information required to invoke a defined function, including + * the specification of argument values. + */ +public final class FunctionDetails implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1407374900331198L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900331198L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * ID of a specific FunctionDefinition. + */ + private org.ccsds.moims.mo.mal.structures.Identifier functionID; + + /** + * Set of argument specifications for each argument definition contained in + * the referenced function definition. These supply a value for each argument, + * or an expression to enable the value to be derived. + */ + private org.ccsds.moims.mo.mps.structures.ArgSpecList argSpecs; + + /** + * Default constructor for FunctionDetails. + * + */ + public FunctionDetails() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param functionID ID of a specific FunctionDefinition. + * @param argSpecs Set of argument specifications for each argument definition contained in the referenced function definition. These supply a value for each argument, or an expression to enable the value to be derived. + */ + public FunctionDetails(org.ccsds.moims.mo.mal.structures.Identifier functionID, + org.ccsds.moims.mo.mps.structures.ArgSpecList argSpecs) { + this.functionID = functionID; + this.argSpecs = argSpecs; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param functionID ID of a specific FunctionDefinition. + */ + public FunctionDetails(org.ccsds.moims.mo.mal.structures.Identifier functionID) { + this.functionID = functionID; + this.argSpecs = null; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.FunctionDetails(); + } + + /** + * Returns the field functionID. + * + * @return The field functionID + */ + public org.ccsds.moims.mo.mal.structures.Identifier getFunctionID() { + return functionID; + } + + /** + * Returns the field argSpecs. + * + * @return The field argSpecs + */ + public org.ccsds.moims.mo.mps.structures.ArgSpecList getArgSpecs() { + return argSpecs; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof FunctionDetails) { + FunctionDetails other = (FunctionDetails) obj; + if (functionID == null) { + if (other.functionID != null) { + return false; + } + } else { + if (! functionID.equals(other.functionID)) { + return false; + } + } + if (argSpecs == null) { + if (other.argSpecs != null) { + return false; + } + } else { + if (! argSpecs.equals(other.argSpecs)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (functionID != null ? functionID.hashCode() : 0); + hash = 83 * hash + (argSpecs != null ? argSpecs.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(FunctionDetails: "); + buf.append("functionID=").append(functionID); + buf.append(", argSpecs=").append(argSpecs); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (functionID == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'functionID' cannot be null!"); + } + encoder.encodeIdentifier(functionID); + encoder.encodeNullableElement(argSpecs); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + functionID = decoder.decodeIdentifier(); + argSpecs = (org.ccsds.moims.mo.mps.structures.ArgSpecList) decoder.decodeNullableElement(new org.ccsds.moims.mo.mps.structures.ArgSpecList()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/FunctionDetailsList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/FunctionDetailsList.java new file mode 100644 index 00000000..2d5af698 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/FunctionDetailsList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for FunctionDetails. + */ +public final class FunctionDetailsList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107010L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107010L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for FunctionDetailsList. + * + */ + public FunctionDetailsList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public FunctionDetailsList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public FunctionDetailsList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.FunctionDetails element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.FunctionDetails element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new FunctionDetailsList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.FunctionDetails(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/GeometricConstraint.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/GeometricConstraint.java new file mode 100644 index 00000000..3c6c2f29 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/GeometricConstraint.java @@ -0,0 +1,190 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E7: Geometric constraints restrict the planning of the planning activity + * by imposing a geometric condition that must be valid during some constraint + * period. + */ +public abstract class GeometricConstraint extends org.ccsds.moims.mo.mps.structures.Constraint { + + /** + * Identifies the point in the duration of the applicable planning activity + * to which the start of the constraint period relates. Default is the start + * of the planning activity. + */ + private org.ccsds.moims.mo.mps.structures.Slider startRef; + + /** + * Identifies the point in the duration of the applicable planning activity + * to which the end of the constraint period relates. Default is the end of + * the planning activity. + */ + private org.ccsds.moims.mo.mps.structures.Slider endRef; + + /** + * Offset from startRef that specifies the start of the constraint period. + * A positive offset implies a shift later in time. Default is no offset. + */ + private org.ccsds.moims.mo.mal.structures.Element startOffset; + + /** + * Offset from endRef that specifies the end of the constraint period. A + * positive offset implies a shift later in time. Default is no offset. + */ + private org.ccsds.moims.mo.mal.structures.Element endOffset; + + /** + * Default constructor for GeometricConstraint. + * + */ + public GeometricConstraint() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param negate Specifies whether the result of combining the Constraints is to be inverted (NOT function). Default = False. + * @param startRef Identifies the point in the duration of the applicable planning activity to which the start of the constraint period relates. Default is the start of the planning activity. + * @param endRef Identifies the point in the duration of the applicable planning activity to which the end of the constraint period relates. Default is the end of the planning activity. + * @param startOffset Offset from startRef that specifies the start of the constraint period. A positive offset implies a shift later in time. Default is no offset. + * @param endOffset Offset from endRef that specifies the end of the constraint period. A positive offset implies a shift later in time. Default is no offset. + */ + public GeometricConstraint(Boolean negate, + org.ccsds.moims.mo.mps.structures.Slider startRef, + org.ccsds.moims.mo.mps.structures.Slider endRef, + org.ccsds.moims.mo.mal.structures.Element startOffset, + org.ccsds.moims.mo.mal.structures.Element endOffset) { + super(negate); + this.startRef = startRef; + this.endRef = endRef; + this.startOffset = startOffset; + this.endOffset = endOffset; + } + + /** + * Returns the field startRef. + * + * @return The field startRef + */ + public org.ccsds.moims.mo.mps.structures.Slider getStartRef() { + return startRef; + } + + /** + * Returns the field endRef. + * + * @return The field endRef + */ + public org.ccsds.moims.mo.mps.structures.Slider getEndRef() { + return endRef; + } + + /** + * Returns the field startOffset. + * + * @return The field startOffset + */ + public org.ccsds.moims.mo.mal.structures.Element getStartOffset() { + return startOffset; + } + + /** + * Returns the field endOffset. + * + * @return The field endOffset + */ + public org.ccsds.moims.mo.mal.structures.Element getEndOffset() { + return endOffset; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof GeometricConstraint) { + if (! super.equals(obj)) { + return false; + } + GeometricConstraint other = (GeometricConstraint) obj; + if (startRef == null) { + if (other.startRef != null) { + return false; + } + } else { + if (! startRef.equals(other.startRef)) { + return false; + } + } + if (endRef == null) { + if (other.endRef != null) { + return false; + } + } else { + if (! endRef.equals(other.endRef)) { + return false; + } + } + if (startOffset == null) { + if (other.startOffset != null) { + return false; + } + } else { + if (! startOffset.equals(other.startOffset)) { + return false; + } + } + if (endOffset == null) { + if (other.endOffset != null) { + return false; + } + } else { + if (! endOffset.equals(other.endOffset)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = super.hashCode(); + hash = 83 * hash + (startRef != null ? startRef.hashCode() : 0); + hash = 83 * hash + (endRef != null ? endRef.hashCode() : 0); + hash = 83 * hash + (startOffset != null ? startOffset.hashCode() : 0); + hash = 83 * hash + (endOffset != null ? endOffset.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(GeometricConstraint: "); + buf.append(super.toString()); + buf.append(", startRef=").append(startRef); + buf.append(", endRef=").append(endRef); + buf.append(", startOffset=").append(startOffset); + buf.append(", endOffset=").append(endOffset); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + super.encode(encoder); + encoder.encodeNullableElement(startRef); + encoder.encodeNullableElement(endRef); + encoder.encodeNullableAbstractElement(startOffset); + encoder.encodeNullableAbstractElement(endOffset); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + super.decode(decoder); + startRef = (org.ccsds.moims.mo.mps.structures.Slider) decoder.decodeNullableElement(new org.ccsds.moims.mo.mps.structures.Slider()); + endRef = (org.ccsds.moims.mo.mps.structures.Slider) decoder.decodeNullableElement(new org.ccsds.moims.mo.mps.structures.Slider()); + startOffset = (org.ccsds.moims.mo.mal.structures.Element) decoder.decodeNullableAbstractElement(); + endOffset = (org.ccsds.moims.mo.mal.structures.Element) decoder.decodeNullableAbstractElement(); + return this; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/GeometricConstraintList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/GeometricConstraintList.java new file mode 100644 index 00000000..3167818c --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/GeometricConstraintList.java @@ -0,0 +1,23 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for GeometricConstraint. + */ +public final class GeometricConstraintList extends org.ccsds.moims.mo.mal.structures.HeterogeneousList { + + /** + * Default constructor for GeometricConstraintList. + * + */ + public GeometricConstraintList() { + } + + @Override + public boolean add(org.ccsds.moims.mo.mal.structures.Element element) { + if (element != null && !(element instanceof GeometricConstraint)) { + throw new java.lang.ClassCastException("The added element does not extend the type: GeometricConstraint"); + } + return super.add(element); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/InsertedActivityDetails.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/InsertedActivityDetails.java new file mode 100644 index 00000000..add6d2d9 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/InsertedActivityDetails.java @@ -0,0 +1,431 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E1: A concrete sub-type of ActivityDetails (4.5.2.3.1) that is a variation + * of SimpleActivityDetails providing additional details for a single ActivityInstance + * to be inserted into a Plan using the MPS Plan Edit service. + */ +public final class InsertedActivityDetails extends org.ccsds.moims.mo.mps.structures.ActivityDetails { + + private static final long serialVersionUID = 1407374900330603L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330603L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Reference to the Plan into which the ActivityInstance is to be inserted. + */ + private org.ccsds.moims.mo.mal.structures.ObjectRef plan; + + /** + * Optionally specifies the trigger that initiates the ActivityInstance: may + * be time, position, or event based. + */ + private org.ccsds.moims.mo.mps.structures.Trigger start; + + /** + * Optionally specifies the trigger that ends the ActivityInstance. + */ + private org.ccsds.moims.mo.mps.structures.Trigger end; + + /** + * Reference to the ActivityDefinition. + */ + private org.ccsds.moims.mo.mal.structures.ObjectRef activityDefinition; + + /** + * Set of argument specifications for each argument definition contained in + * the referenced activity definition. These supply a value for each argument, + * or an expression to enable the value to be derived. + */ + private org.ccsds.moims.mo.mps.structures.ArgSpecList argSpecs; + + /** + * The User ID for the person or organization inserting the activity into + * the Plan. + */ + private org.ccsds.moims.mo.mal.structures.ObjectRef user; + + /** + * A single constraint or a constraint node that may contain multiple constraints, + * specific to the ActivityInstance to be created. + */ + private org.ccsds.moims.mo.mps.structures.Constraint constraints; + + /** + * Set of Effects specific to the ActivityInstance to be created. + */ + private org.ccsds.moims.mo.mps.structures.EffectList effects; + + /** + * Optional association of the ActivityInstance with a defined sub-plan. + */ + private org.ccsds.moims.mo.mal.structures.Identifier subPlan; + + /** + * Set of tags that may be used to associate the Activity with a subset of + * the Plan, grouping activities by operational responsibility (controller/group/system) + * or other criteria. + */ + private org.ccsds.moims.mo.mal.structures.StringList tags; + + /** + * Default constructor for InsertedActivityDetails. + * + */ + public InsertedActivityDetails() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param activityRef Specifies how the ActivityInstance is placed with respect to any defined Repetition (0=Start; 1=End). Default is Start. + * @param activityOffset Specifies an offset in time for the ActivityInstance from any defined Repetition. Default is no offset. + * @param relatedEvent Specifies a related Event (or Event Group) for the ActivityInstance. Argument specifications and constraints may reference arguments and fields of the RelatedEvent. + * @param comments Any notes associated with the ActivityDetails. + * @param plan Reference to the Plan into which the ActivityInstance is to be inserted. + * @param start Optionally specifies the trigger that initiates the ActivityInstance: may be time, position, or event based. + * @param end Optionally specifies the trigger that ends the ActivityInstance. + * @param activityDefinition Reference to the ActivityDefinition. + * @param argSpecs Set of argument specifications for each argument definition contained in the referenced activity definition. These supply a value for each argument, or an expression to enable the value to be derived. + * @param user The User ID for the person or organization inserting the activity into the Plan. + * @param constraints A single constraint or a constraint node that may contain multiple constraints, specific to the ActivityInstance to be created. + * @param effects Set of Effects specific to the ActivityInstance to be created. + * @param subPlan Optional association of the ActivityInstance with a defined sub-plan. + * @param tags Set of tags that may be used to associate the Activity with a subset of the Plan, grouping activities by operational responsibility (controller/group/system) or other criteria. + */ + public InsertedActivityDetails(org.ccsds.moims.mo.mps.structures.Slider activityRef, + org.ccsds.moims.mo.mal.structures.Element activityOffset, + org.ccsds.moims.mo.mal.structures.Element relatedEvent, + String comments, + org.ccsds.moims.mo.mal.structures.ObjectRef plan, + org.ccsds.moims.mo.mps.structures.Trigger start, + org.ccsds.moims.mo.mps.structures.Trigger end, + org.ccsds.moims.mo.mal.structures.ObjectRef activityDefinition, + org.ccsds.moims.mo.mps.structures.ArgSpecList argSpecs, + org.ccsds.moims.mo.mal.structures.ObjectRef user, + org.ccsds.moims.mo.mps.structures.Constraint constraints, + org.ccsds.moims.mo.mps.structures.EffectList effects, + org.ccsds.moims.mo.mal.structures.Identifier subPlan, + org.ccsds.moims.mo.mal.structures.StringList tags) { + super(activityRef, + activityOffset, + relatedEvent, + comments); + this.plan = plan; + this.start = start; + this.end = end; + this.activityDefinition = activityDefinition; + this.argSpecs = argSpecs; + this.user = user; + this.constraints = constraints; + this.effects = effects; + this.subPlan = subPlan; + this.tags = tags; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param plan Reference to the Plan into which the ActivityInstance is to be inserted. + * @param activityDefinition Reference to the ActivityDefinition. + * @param user The User ID for the person or organization inserting the activity into the Plan. + */ + public InsertedActivityDetails(org.ccsds.moims.mo.mal.structures.ObjectRef plan, + org.ccsds.moims.mo.mal.structures.ObjectRef activityDefinition, + org.ccsds.moims.mo.mal.structures.ObjectRef user) { + this.plan = plan; + this.start = null; + this.end = null; + this.activityDefinition = activityDefinition; + this.argSpecs = null; + this.user = user; + this.constraints = null; + this.effects = null; + this.subPlan = null; + this.tags = null; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.InsertedActivityDetails(); + } + + /** + * Returns the field plan. + * + * @return The field plan + */ + public org.ccsds.moims.mo.mal.structures.ObjectRef getPlan() { + return plan; + } + + /** + * Returns the field start. + * + * @return The field start + */ + public org.ccsds.moims.mo.mps.structures.Trigger getStart() { + return start; + } + + /** + * Returns the field end. + * + * @return The field end + */ + public org.ccsds.moims.mo.mps.structures.Trigger getEnd() { + return end; + } + + /** + * Returns the field activityDefinition. + * + * @return The field activityDefinition + */ + public org.ccsds.moims.mo.mal.structures.ObjectRef getActivityDefinition() { + return activityDefinition; + } + + /** + * Returns the field argSpecs. + * + * @return The field argSpecs + */ + public org.ccsds.moims.mo.mps.structures.ArgSpecList getArgSpecs() { + return argSpecs; + } + + /** + * Returns the field user. + * + * @return The field user + */ + public org.ccsds.moims.mo.mal.structures.ObjectRef getUser() { + return user; + } + + /** + * Returns the field constraints. + * + * @return The field constraints + */ + public org.ccsds.moims.mo.mps.structures.Constraint getConstraints() { + return constraints; + } + + /** + * Returns the field effects. + * + * @return The field effects + */ + public org.ccsds.moims.mo.mps.structures.EffectList getEffects() { + return effects; + } + + /** + * Returns the field subPlan. + * + * @return The field subPlan + */ + public org.ccsds.moims.mo.mal.structures.Identifier getSubPlan() { + return subPlan; + } + + /** + * Returns the field tags. + * + * @return The field tags + */ + public org.ccsds.moims.mo.mal.structures.StringList getTags() { + return tags; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof InsertedActivityDetails) { + if (! super.equals(obj)) { + return false; + } + InsertedActivityDetails other = (InsertedActivityDetails) obj; + if (plan == null) { + if (other.plan != null) { + return false; + } + } else { + if (! plan.equals(other.plan)) { + return false; + } + } + if (start == null) { + if (other.start != null) { + return false; + } + } else { + if (! start.equals(other.start)) { + return false; + } + } + if (end == null) { + if (other.end != null) { + return false; + } + } else { + if (! end.equals(other.end)) { + return false; + } + } + if (activityDefinition == null) { + if (other.activityDefinition != null) { + return false; + } + } else { + if (! activityDefinition.equals(other.activityDefinition)) { + return false; + } + } + if (argSpecs == null) { + if (other.argSpecs != null) { + return false; + } + } else { + if (! argSpecs.equals(other.argSpecs)) { + return false; + } + } + if (user == null) { + if (other.user != null) { + return false; + } + } else { + if (! user.equals(other.user)) { + return false; + } + } + if (constraints == null) { + if (other.constraints != null) { + return false; + } + } else { + if (! constraints.equals(other.constraints)) { + return false; + } + } + if (effects == null) { + if (other.effects != null) { + return false; + } + } else { + if (! effects.equals(other.effects)) { + return false; + } + } + if (subPlan == null) { + if (other.subPlan != null) { + return false; + } + } else { + if (! subPlan.equals(other.subPlan)) { + return false; + } + } + if (tags == null) { + if (other.tags != null) { + return false; + } + } else { + if (! tags.equals(other.tags)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = super.hashCode(); + hash = 83 * hash + (plan != null ? plan.hashCode() : 0); + hash = 83 * hash + (start != null ? start.hashCode() : 0); + hash = 83 * hash + (end != null ? end.hashCode() : 0); + hash = 83 * hash + (activityDefinition != null ? activityDefinition.hashCode() : 0); + hash = 83 * hash + (argSpecs != null ? argSpecs.hashCode() : 0); + hash = 83 * hash + (user != null ? user.hashCode() : 0); + hash = 83 * hash + (constraints != null ? constraints.hashCode() : 0); + hash = 83 * hash + (effects != null ? effects.hashCode() : 0); + hash = 83 * hash + (subPlan != null ? subPlan.hashCode() : 0); + hash = 83 * hash + (tags != null ? tags.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(InsertedActivityDetails: "); + buf.append(super.toString()); + buf.append(", plan=").append(plan); + buf.append(", start=").append(start); + buf.append(", end=").append(end); + buf.append(", activityDefinition=").append(activityDefinition); + buf.append(", argSpecs=").append(argSpecs); + buf.append(", user=").append(user); + buf.append(", constraints=").append(constraints); + buf.append(", effects=").append(effects); + buf.append(", subPlan=").append(subPlan); + buf.append(", tags=").append(tags); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + super.encode(encoder); + if (plan == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'plan' cannot be null!"); + } + if (activityDefinition == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'activityDefinition' cannot be null!"); + } + if (user == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'user' cannot be null!"); + } + encoder.encodeElement(plan); + encoder.encodeNullableAbstractElement(start); + encoder.encodeNullableAbstractElement(end); + encoder.encodeElement(activityDefinition); + encoder.encodeNullableElement(argSpecs); + encoder.encodeElement(user); + encoder.encodeNullableAbstractElement(constraints); + encoder.encodeNullableElement(effects); + encoder.encodeNullableIdentifier(subPlan); + encoder.encodeNullableElement(tags); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + super.decode(decoder); + plan = (org.ccsds.moims.mo.mal.structures.ObjectRef) decoder.decodeElement(new org.ccsds.moims.mo.mal.structures.ObjectRef()); + start = (org.ccsds.moims.mo.mps.structures.Trigger) decoder.decodeNullableAbstractElement(); + end = (org.ccsds.moims.mo.mps.structures.Trigger) decoder.decodeNullableAbstractElement(); + activityDefinition = (org.ccsds.moims.mo.mal.structures.ObjectRef) decoder.decodeElement(new org.ccsds.moims.mo.mal.structures.ObjectRef()); + argSpecs = (org.ccsds.moims.mo.mps.structures.ArgSpecList) decoder.decodeNullableElement(new org.ccsds.moims.mo.mps.structures.ArgSpecList()); + user = (org.ccsds.moims.mo.mal.structures.ObjectRef) decoder.decodeElement(new org.ccsds.moims.mo.mal.structures.ObjectRef()); + constraints = (org.ccsds.moims.mo.mps.structures.Constraint) decoder.decodeNullableAbstractElement(); + effects = (org.ccsds.moims.mo.mps.structures.EffectList) decoder.decodeNullableElement(new org.ccsds.moims.mo.mps.structures.EffectList()); + subPlan = decoder.decodeNullableIdentifier(); + tags = (org.ccsds.moims.mo.mal.structures.StringList) decoder.decodeNullableElement(new org.ccsds.moims.mo.mal.structures.StringList()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/InsertedActivityDetailsList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/InsertedActivityDetailsList.java new file mode 100644 index 00000000..69d26c91 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/InsertedActivityDetailsList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for InsertedActivityDetails. + */ +public final class InsertedActivityDetailsList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107605L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107605L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for InsertedActivityDetailsList. + * + */ + public InsertedActivityDetailsList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public InsertedActivityDetailsList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public InsertedActivityDetailsList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.InsertedActivityDetails element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.InsertedActivityDetails element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new InsertedActivityDetailsList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.InsertedActivityDetails(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/InsertedEventDetails.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/InsertedEventDetails.java new file mode 100644 index 00000000..21c11264 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/InsertedEventDetails.java @@ -0,0 +1,220 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E1: A data structure that provides the information required to create the + * EventInstance to be inserted into a Plan using the MPS Plan Edit service. + */ +public final class InsertedEventDetails implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1407374900330702L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330702L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Reference to the Plan into which the Event is to be inserted. + */ + private org.ccsds.moims.mo.mal.structures.ObjectRef plan; + + /** + * Reference to the EventDefinition. + */ + private org.ccsds.moims.mo.mal.structures.ObjectRef eventDefinition; + + /** + * Specifies the predicted or actual time of the event. For an inserted event + * this must be present. + */ + private org.ccsds.moims.mo.mal.structures.FineTime eventTime; + + /** + * Argument values. + */ + private org.ccsds.moims.mo.mps.structures.ArgumentList arguments; + + /** + * Default constructor for InsertedEventDetails. + * + */ + public InsertedEventDetails() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param plan Reference to the Plan into which the Event is to be inserted. + * @param eventDefinition Reference to the EventDefinition. + * @param eventTime Specifies the predicted or actual time of the event. For an inserted event this must be present. + * @param arguments Argument values. + */ + public InsertedEventDetails(org.ccsds.moims.mo.mal.structures.ObjectRef plan, + org.ccsds.moims.mo.mal.structures.ObjectRef eventDefinition, + org.ccsds.moims.mo.mal.structures.FineTime eventTime, + org.ccsds.moims.mo.mps.structures.ArgumentList arguments) { + this.plan = plan; + this.eventDefinition = eventDefinition; + this.eventTime = eventTime; + this.arguments = arguments; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param plan Reference to the Plan into which the Event is to be inserted. + * @param eventDefinition Reference to the EventDefinition. + * @param eventTime Specifies the predicted or actual time of the event. For an inserted event this must be present. + */ + public InsertedEventDetails(org.ccsds.moims.mo.mal.structures.ObjectRef plan, + org.ccsds.moims.mo.mal.structures.ObjectRef eventDefinition, + org.ccsds.moims.mo.mal.structures.FineTime eventTime) { + this.plan = plan; + this.eventDefinition = eventDefinition; + this.eventTime = eventTime; + this.arguments = null; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.InsertedEventDetails(); + } + + /** + * Returns the field plan. + * + * @return The field plan + */ + public org.ccsds.moims.mo.mal.structures.ObjectRef getPlan() { + return plan; + } + + /** + * Returns the field eventDefinition. + * + * @return The field eventDefinition + */ + public org.ccsds.moims.mo.mal.structures.ObjectRef getEventDefinition() { + return eventDefinition; + } + + /** + * Returns the field eventTime. + * + * @return The field eventTime + */ + public org.ccsds.moims.mo.mal.structures.FineTime getEventTime() { + return eventTime; + } + + /** + * Returns the field arguments. + * + * @return The field arguments + */ + public org.ccsds.moims.mo.mps.structures.ArgumentList getArguments() { + return arguments; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof InsertedEventDetails) { + InsertedEventDetails other = (InsertedEventDetails) obj; + if (plan == null) { + if (other.plan != null) { + return false; + } + } else { + if (! plan.equals(other.plan)) { + return false; + } + } + if (eventDefinition == null) { + if (other.eventDefinition != null) { + return false; + } + } else { + if (! eventDefinition.equals(other.eventDefinition)) { + return false; + } + } + if (eventTime == null) { + if (other.eventTime != null) { + return false; + } + } else { + if (! eventTime.equals(other.eventTime)) { + return false; + } + } + if (arguments == null) { + if (other.arguments != null) { + return false; + } + } else { + if (! arguments.equals(other.arguments)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (plan != null ? plan.hashCode() : 0); + hash = 83 * hash + (eventDefinition != null ? eventDefinition.hashCode() : 0); + hash = 83 * hash + (eventTime != null ? eventTime.hashCode() : 0); + hash = 83 * hash + (arguments != null ? arguments.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(InsertedEventDetails: "); + buf.append("plan=").append(plan); + buf.append(", eventDefinition=").append(eventDefinition); + buf.append(", eventTime=").append(eventTime); + buf.append(", arguments=").append(arguments); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (plan == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'plan' cannot be null!"); + } + if (eventDefinition == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'eventDefinition' cannot be null!"); + } + if (eventTime == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'eventTime' cannot be null!"); + } + encoder.encodeElement(plan); + encoder.encodeElement(eventDefinition); + encoder.encodeFineTime(eventTime); + encoder.encodeNullableElement(arguments); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + plan = (org.ccsds.moims.mo.mal.structures.ObjectRef) decoder.decodeElement(new org.ccsds.moims.mo.mal.structures.ObjectRef()); + eventDefinition = (org.ccsds.moims.mo.mal.structures.ObjectRef) decoder.decodeElement(new org.ccsds.moims.mo.mal.structures.ObjectRef()); + eventTime = decoder.decodeFineTime(); + arguments = (org.ccsds.moims.mo.mps.structures.ArgumentList) decoder.decodeNullableElement(new org.ccsds.moims.mo.mps.structures.ArgumentList()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/InsertedEventDetailsList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/InsertedEventDetailsList.java new file mode 100644 index 00000000..8fa50edf --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/InsertedEventDetailsList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for InsertedEventDetails. + */ +public final class InsertedEventDetailsList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107506L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107506L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for InsertedEventDetailsList. + * + */ + public InsertedEventDetailsList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public InsertedEventDetailsList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public InsertedEventDetailsList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.InsertedEventDetails element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.InsertedEventDetails element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new InsertedEventDetailsList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.InsertedEventDetails(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/InterpolationTypeEnum.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/InterpolationTypeEnum.java new file mode 100644 index 00000000..a0599a57 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/InterpolationTypeEnum.java @@ -0,0 +1,134 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * Enumeration class for InterpolationTypeEnum. + */ +public final class InterpolationTypeEnum extends org.ccsds.moims.mo.mal.structures.Enumeration { + + private static final long serialVersionUID = 1407374900330801L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330801L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Enumeration value for STEP. + */ + public static final int STEP_VALUE = 1; + + /** + * Enumeration singleton for value STEP. + */ + public static final org.ccsds.moims.mo.mps.structures.InterpolationTypeEnum STEP = new org.ccsds.moims.mo.mps.structures.InterpolationTypeEnum(org.ccsds.moims.mo.mps.structures.InterpolationTypeEnum.STEP_VALUE); + + /** + * Enumeration value for LINEAR. + */ + public static final int LINEAR_VALUE = 2; + + /** + * Enumeration singleton for value LINEAR. + */ + public static final org.ccsds.moims.mo.mps.structures.InterpolationTypeEnum LINEAR = new org.ccsds.moims.mo.mps.structures.InterpolationTypeEnum(org.ccsds.moims.mo.mps.structures.InterpolationTypeEnum.LINEAR_VALUE); + + /** + * Enumeration value for POLYNOMIAL. + */ + public static final int POLYNOMIAL_VALUE = 3; + + /** + * Enumeration singleton for value POLYNOMIAL. + */ + public static final org.ccsds.moims.mo.mps.structures.InterpolationTypeEnum POLYNOMIAL = new org.ccsds.moims.mo.mps.structures.InterpolationTypeEnum(org.ccsds.moims.mo.mps.structures.InterpolationTypeEnum.POLYNOMIAL_VALUE); + + /** + * Set of enumeration instances. + */ + private static final org.ccsds.moims.mo.mps.structures.InterpolationTypeEnum[] _ENUMERATIONS = { + STEP, LINEAR, POLYNOMIAL}; + + /** + * E4: The InterpolationTypeEnum describes the set of supported interpolation types for a given operation. + */ + public InterpolationTypeEnum() { + super(-1); + } + + /** + * E4: The InterpolationTypeEnum describes the set of supported interpolation + * types for a given operation. + * + * @param value The value of the Enumeration. + */ + public InterpolationTypeEnum(int value) { + super(value); + } + + @Override + public String toString() { + switch (getValue()) { + case STEP_VALUE: + return "STEP"; + case LINEAR_VALUE: + return "LINEAR"; + case POLYNOMIAL_VALUE: + return "POLYNOMIAL"; + default: + throw new RuntimeException("Unknown ordinal!"); + } + } + + /** + * Returns the enumeration element represented by the supplied string, or + * null if not matched. + * + * @param s s The string to search for. + * @return The matched enumeration element, or null if not matched. + */ + public static org.ccsds.moims.mo.mps.structures.InterpolationTypeEnum fromString(String s) { + switch (s) { + case "STEP": + return InterpolationTypeEnum.STEP; + case "LINEAR": + return InterpolationTypeEnum.LINEAR; + case "POLYNOMIAL": + return InterpolationTypeEnum.POLYNOMIAL; + default: + throw new RuntimeException("Unknown Enumeration for the provided string: " + s); + } + } + + @Override + public org.ccsds.moims.mo.mal.structures.Enumeration fromValue(Integer value) { + switch (value) { + case STEP_VALUE: + return InterpolationTypeEnum.STEP; + case LINEAR_VALUE: + return InterpolationTypeEnum.LINEAR; + case POLYNOMIAL_VALUE: + return InterpolationTypeEnum.POLYNOMIAL; + default: + throw new RuntimeException("Unknown Enumeration for the provided value: " + value); + } + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return _ENUMERATIONS[0]; + } + + @Override + public int getEnumSize() { + return 3; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/InterpolationTypeEnumList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/InterpolationTypeEnumList.java new file mode 100644 index 00000000..32ee44e5 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/InterpolationTypeEnumList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for InterpolationTypeEnum. + */ +public final class InterpolationTypeEnumList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107407L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107407L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for InterpolationTypeEnumList. + * + */ + public InterpolationTypeEnumList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public InterpolationTypeEnumList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public InterpolationTypeEnumList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.InterpolationTypeEnum element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.InterpolationTypeEnum element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new InterpolationTypeEnumList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return org.ccsds.moims.mo.mps.structures.InterpolationTypeEnum.STEP; + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ItemRevision.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ItemRevision.java new file mode 100644 index 00000000..881ac60a --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ItemRevision.java @@ -0,0 +1,143 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E3: An ItemRevision represents the changes that were made to a single planned + * item inside a revision. + */ +public final class ItemRevision implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1407374900331002L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900331002L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Object Type: ActivityInstance | EventInstance. Reference to a planned ActivityInstance + * or EventInstance that is new or modified in the current Plan, or has been + * deleted with respect to the referenced revisedPlan. + */ + private org.ccsds.moims.mo.mal.structures.ObjectRef itemRef; + + /** + * Revision status of the referenced item. May be one of New, Modified, Deleted, + * or Undefined. + */ + private org.ccsds.moims.mo.mps.structures.RevisionStatusEnum revisionStatus; + + /** + * Default constructor for ItemRevision. + * + */ + public ItemRevision() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param itemRef Object Type: ActivityInstance | EventInstance. Reference to a planned ActivityInstance or EventInstance that is new or modified in the current Plan, or has been deleted with respect to the referenced revisedPlan. + * @param revisionStatus Revision status of the referenced item. May be one of New, Modified, Deleted, or Undefined. + */ + public ItemRevision(org.ccsds.moims.mo.mal.structures.ObjectRef itemRef, + org.ccsds.moims.mo.mps.structures.RevisionStatusEnum revisionStatus) { + this.itemRef = itemRef; + this.revisionStatus = revisionStatus; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.ItemRevision(); + } + + /** + * Returns the field itemRef. + * + * @return The field itemRef + */ + public org.ccsds.moims.mo.mal.structures.ObjectRef getItemRef() { + return itemRef; + } + + /** + * Returns the field revisionStatus. + * + * @return The field revisionStatus + */ + public org.ccsds.moims.mo.mps.structures.RevisionStatusEnum getRevisionStatus() { + return revisionStatus; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ItemRevision) { + ItemRevision other = (ItemRevision) obj; + if (itemRef == null) { + if (other.itemRef != null) { + return false; + } + } else { + if (! itemRef.equals(other.itemRef)) { + return false; + } + } + if (revisionStatus == null) { + if (other.revisionStatus != null) { + return false; + } + } else { + if (! revisionStatus.equals(other.revisionStatus)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (itemRef != null ? itemRef.hashCode() : 0); + hash = 83 * hash + (revisionStatus != null ? revisionStatus.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(ItemRevision: "); + buf.append("itemRef=").append(itemRef); + buf.append(", revisionStatus=").append(revisionStatus); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (itemRef == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'itemRef' cannot be null!"); + } + if (revisionStatus == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'revisionStatus' cannot be null!"); + } + encoder.encodeAbstractElement(itemRef); + encoder.encodeElement(revisionStatus); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + itemRef = (org.ccsds.moims.mo.mal.structures.ObjectRef) decoder.decodeAbstractElement(); + revisionStatus = (org.ccsds.moims.mo.mps.structures.RevisionStatusEnum) decoder.decodeElement(org.ccsds.moims.mo.mps.structures.RevisionStatusEnum.NEW); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ItemRevisionList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ItemRevisionList.java new file mode 100644 index 00000000..05645772 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ItemRevisionList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for ItemRevision. + */ +public final class ItemRevisionList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107206L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107206L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for ItemRevisionList. + * + */ + public ItemRevisionList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public ItemRevisionList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public ItemRevisionList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.ItemRevision element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.ItemRevision element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new ItemRevisionList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.ItemRevision(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/LogicOpEnum.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/LogicOpEnum.java new file mode 100644 index 00000000..f9db742a --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/LogicOpEnum.java @@ -0,0 +1,118 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * Enumeration class for LogicOpEnum. + */ +public final class LogicOpEnum extends org.ccsds.moims.mo.mal.structures.Enumeration { + + private static final long serialVersionUID = 1407374900330526L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330526L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Enumeration value for AND. + */ + public static final int AND_VALUE = 1; + + /** + * Enumeration singleton for value AND. + */ + public static final org.ccsds.moims.mo.mps.structures.LogicOpEnum AND = new org.ccsds.moims.mo.mps.structures.LogicOpEnum(org.ccsds.moims.mo.mps.structures.LogicOpEnum.AND_VALUE); + + /** + * Enumeration value for OR. + */ + public static final int OR_VALUE = 2; + + /** + * Enumeration singleton for value OR. + */ + public static final org.ccsds.moims.mo.mps.structures.LogicOpEnum OR = new org.ccsds.moims.mo.mps.structures.LogicOpEnum(org.ccsds.moims.mo.mps.structures.LogicOpEnum.OR_VALUE); + + /** + * Set of enumeration instances. + */ + private static final org.ccsds.moims.mo.mps.structures.LogicOpEnum[] _ENUMERATIONS = { + AND, OR}; + + /** + * E1: A LogicOpEnum represents the type of logic used to combine two Boolean conditions. + */ + public LogicOpEnum() { + super(-1); + } + + /** + * E1: A LogicOpEnum represents the type of logic used to combine two Boolean + * conditions. + * + * @param value The value of the Enumeration. + */ + public LogicOpEnum(int value) { + super(value); + } + + @Override + public String toString() { + switch (getValue()) { + case AND_VALUE: + return "AND"; + case OR_VALUE: + return "OR"; + default: + throw new RuntimeException("Unknown ordinal!"); + } + } + + /** + * Returns the enumeration element represented by the supplied string, or + * null if not matched. + * + * @param s s The string to search for. + * @return The matched enumeration element, or null if not matched. + */ + public static org.ccsds.moims.mo.mps.structures.LogicOpEnum fromString(String s) { + switch (s) { + case "AND": + return LogicOpEnum.AND; + case "OR": + return LogicOpEnum.OR; + default: + throw new RuntimeException("Unknown Enumeration for the provided string: " + s); + } + } + + @Override + public org.ccsds.moims.mo.mal.structures.Enumeration fromValue(Integer value) { + switch (value) { + case AND_VALUE: + return LogicOpEnum.AND; + case OR_VALUE: + return LogicOpEnum.OR; + default: + throw new RuntimeException("Unknown Enumeration for the provided value: " + value); + } + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return _ENUMERATIONS[0]; + } + + @Override + public int getEnumSize() { + return 2; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/LogicOpEnumList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/LogicOpEnumList.java new file mode 100644 index 00000000..6ee7f1f8 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/LogicOpEnumList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for LogicOpEnum. + */ +public final class LogicOpEnumList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107682L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107682L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for LogicOpEnumList. + * + */ + public LogicOpEnumList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public LogicOpEnumList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public LogicOpEnumList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.LogicOpEnum element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.LogicOpEnum element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new LogicOpEnumList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return org.ccsds.moims.mo.mps.structures.LogicOpEnum.AND; + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/NamedElement.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/NamedElement.java new file mode 100644 index 00000000..01e69b56 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/NamedElement.java @@ -0,0 +1,151 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E1: The NamedElement composite represents a pair of a MAL::Identifier and + * an abstract MAL::Element. It is an extension of the MAL::NamedValue composite + * that adds support for non-MAL::Attribute values. + */ +public final class NamedElement implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1407374900330498L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330498L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Name identifying the element. + */ + private org.ccsds.moims.mo.mal.structures.Identifier name; + + /** + * Expression evaluating to the corresponding MAL::Element value. When used + * in a pointing constraint, then the MAL Element subtype must match the argument + * type of the corresponding pointing template argument (see 4.6.6.4.4 and + * table 4-6). + */ + private org.ccsds.moims.mo.mal.structures.Element value; + + /** + * Default constructor for NamedElement. + * + */ + public NamedElement() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param name Name identifying the element. + * @param value Expression evaluating to the corresponding MAL::Element value. When used in a pointing constraint, then the MAL Element subtype must match the argument type of the corresponding pointing template argument (see 4.6.6.4.4 and table 4-6). + */ + public NamedElement(org.ccsds.moims.mo.mal.structures.Identifier name, + org.ccsds.moims.mo.mal.structures.Element value) { + this.name = name; + this.value = value; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param name Name identifying the element. + */ + public NamedElement(org.ccsds.moims.mo.mal.structures.Identifier name) { + this.name = name; + this.value = null; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.NamedElement(); + } + + /** + * Returns the field name. + * + * @return The field name + */ + public org.ccsds.moims.mo.mal.structures.Identifier getName() { + return name; + } + + /** + * Returns the field value. + * + * @return The field value + */ + public org.ccsds.moims.mo.mal.structures.Element getValue() { + return value; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof NamedElement) { + NamedElement other = (NamedElement) obj; + if (name == null) { + if (other.name != null) { + return false; + } + } else { + if (! name.equals(other.name)) { + return false; + } + } + if (value == null) { + if (other.value != null) { + return false; + } + } else { + if (! value.equals(other.value)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (name != null ? name.hashCode() : 0); + hash = 83 * hash + (value != null ? value.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(NamedElement: "); + buf.append("name=").append(name); + buf.append(", value=").append(value); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (name == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'name' cannot be null!"); + } + encoder.encodeIdentifier(name); + encoder.encodeNullableAbstractElement(value); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + name = decoder.decodeIdentifier(); + value = (org.ccsds.moims.mo.mal.structures.Element) decoder.decodeNullableAbstractElement(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/NamedElementList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/NamedElementList.java new file mode 100644 index 00000000..2e4b9c44 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/NamedElementList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for NamedElement. + */ +public final class NamedElementList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107710L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107710L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for NamedElementList. + * + */ + public NamedElementList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public NamedElementList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public NamedElementList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.NamedElement element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.NamedElement element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new NamedElementList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.NamedElement(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/NamedTargetDirection.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/NamedTargetDirection.java new file mode 100644 index 00000000..8194f32c --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/NamedTargetDirection.java @@ -0,0 +1,115 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E6: A NamedTargetDirection is a Direction that points to an existing object. + * The manner in which the planning system derives the value of this Direction + * from the name of the referenced object is implementation-defined. + */ +public final class NamedTargetDirection extends org.ccsds.moims.mo.mps.structures.Direction { + + private static final long serialVersionUID = 1407374900330513L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330513L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Name or identifier of a catalogued celestial object or a mission specific + * object (see 4.4.3). + */ + private org.ccsds.moims.mo.mal.structures.Identifier namedTarget; + + /** + * Default constructor for NamedTargetDirection. + * + */ + public NamedTargetDirection() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param namedTarget Name or identifier of a catalogued celestial object or a mission specific object (see 4.4.3). + */ + public NamedTargetDirection(org.ccsds.moims.mo.mal.structures.Identifier namedTarget) { + this.namedTarget = namedTarget; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.NamedTargetDirection(); + } + + /** + * Returns the field namedTarget. + * + * @return The field namedTarget + */ + public org.ccsds.moims.mo.mal.structures.Identifier getNamedTarget() { + return namedTarget; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof NamedTargetDirection) { + if (! super.equals(obj)) { + return false; + } + NamedTargetDirection other = (NamedTargetDirection) obj; + if (namedTarget == null) { + if (other.namedTarget != null) { + return false; + } + } else { + if (! namedTarget.equals(other.namedTarget)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = super.hashCode(); + hash = 83 * hash + (namedTarget != null ? namedTarget.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(NamedTargetDirection: "); + buf.append(super.toString()); + buf.append(", namedTarget=").append(namedTarget); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + super.encode(encoder); + if (namedTarget == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'namedTarget' cannot be null!"); + } + encoder.encodeIdentifier(namedTarget); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + super.decode(decoder); + namedTarget = decoder.decodeIdentifier(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/NamedTargetDirectionList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/NamedTargetDirectionList.java new file mode 100644 index 00000000..be64bb7b --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/NamedTargetDirectionList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for NamedTargetDirection. + */ +public final class NamedTargetDirectionList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107695L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107695L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for NamedTargetDirectionList. + * + */ + public NamedTargetDirectionList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public NamedTargetDirectionList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public NamedTargetDirectionList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.NamedTargetDirection element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.NamedTargetDirection element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new NamedTargetDirectionList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.NamedTargetDirection(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/NumericRange.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/NumericRange.java new file mode 100644 index 00000000..862025ab --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/NumericRange.java @@ -0,0 +1,140 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E1: Concrete sub-type of ValidationDetails that provides additional fields + * to support data validation for numeric data types. + */ +public final class NumericRange extends org.ccsds.moims.mo.mps.structures.ValidationDetails { + + private static final long serialVersionUID = 1407374900330522L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330522L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Minimum value of the argument; if omitted, no minimum value is considered. + */ + private Double min; + + /** + * Maximum value of the argument; if omitted, no maximum value is considered. + */ + private Double max; + + /** + * Default constructor for NumericRange. + * + */ + public NumericRange() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param min Minimum value of the argument; if omitted, no minimum value is considered. + * @param max Maximum value of the argument; if omitted, no maximum value is considered. + */ + public NumericRange(Double min, + Double max) { + this.min = min; + this.max = max; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.NumericRange(); + } + + /** + * Returns the field min. + * + * @return The field min + */ + public Double getMin() { + return min; + } + + /** + * Returns the field max. + * + * @return The field max + */ + public Double getMax() { + return max; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof NumericRange) { + if (! super.equals(obj)) { + return false; + } + NumericRange other = (NumericRange) obj; + if (min == null) { + if (other.min != null) { + return false; + } + } else { + if (! min.equals(other.min)) { + return false; + } + } + if (max == null) { + if (other.max != null) { + return false; + } + } else { + if (! max.equals(other.max)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = super.hashCode(); + hash = 83 * hash + (min != null ? min.hashCode() : 0); + hash = 83 * hash + (max != null ? max.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(NumericRange: "); + buf.append(super.toString()); + buf.append(", min=").append(min); + buf.append(", max=").append(max); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + super.encode(encoder); + encoder.encodeNullableDouble(min); + encoder.encodeNullableDouble(max); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + super.decode(decoder); + min = decoder.decodeNullableDouble(); + max = decoder.decodeNullableDouble(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/NumericRangeList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/NumericRangeList.java new file mode 100644 index 00000000..4cc84544 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/NumericRangeList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for NumericRange. + */ +public final class NumericRangeList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107686L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107686L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for NumericRangeList. + * + */ + public NumericRangeList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public NumericRangeList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public NumericRangeList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.NumericRange element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.NumericRange element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new NumericRangeList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.NumericRange(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/NumericResource.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/NumericResource.java new file mode 100644 index 00000000..bbfe30f2 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/NumericResource.java @@ -0,0 +1,147 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E4: An additional concrete sub-type of ValidationDetails applicable only + * to Resources of any numeric type, including Duration, that provides additional + * fields for the specification of numeric data validation. + */ +public final class NumericResource extends org.ccsds.moims.mo.mps.structures.ValidationDetails { + + private static final long serialVersionUID = 1407374900330798L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330798L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Defines the permitted minimum value over time. + */ + private org.ccsds.moims.mo.mps.structures.ResourceProfile minimum; + + /** + * Defines the permitted maximum value over time. + */ + private org.ccsds.moims.mo.mps.structures.ResourceProfile maximum; + + /** + * Default constructor for NumericResource. + * + */ + public NumericResource() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param minimum Defines the permitted minimum value over time. + * @param maximum Defines the permitted maximum value over time. + */ + public NumericResource(org.ccsds.moims.mo.mps.structures.ResourceProfile minimum, + org.ccsds.moims.mo.mps.structures.ResourceProfile maximum) { + this.minimum = minimum; + this.maximum = maximum; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.NumericResource(); + } + + /** + * Returns the field minimum. + * + * @return The field minimum + */ + public org.ccsds.moims.mo.mps.structures.ResourceProfile getMinimum() { + return minimum; + } + + /** + * Returns the field maximum. + * + * @return The field maximum + */ + public org.ccsds.moims.mo.mps.structures.ResourceProfile getMaximum() { + return maximum; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof NumericResource) { + if (! super.equals(obj)) { + return false; + } + NumericResource other = (NumericResource) obj; + if (minimum == null) { + if (other.minimum != null) { + return false; + } + } else { + if (! minimum.equals(other.minimum)) { + return false; + } + } + if (maximum == null) { + if (other.maximum != null) { + return false; + } + } else { + if (! maximum.equals(other.maximum)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = super.hashCode(); + hash = 83 * hash + (minimum != null ? minimum.hashCode() : 0); + hash = 83 * hash + (maximum != null ? maximum.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(NumericResource: "); + buf.append(super.toString()); + buf.append(", minimum=").append(minimum); + buf.append(", maximum=").append(maximum); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + super.encode(encoder); + if (minimum == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'minimum' cannot be null!"); + } + if (maximum == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'maximum' cannot be null!"); + } + encoder.encodeElement(minimum); + encoder.encodeElement(maximum); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + super.decode(decoder); + minimum = (org.ccsds.moims.mo.mps.structures.ResourceProfile) decoder.decodeElement(new org.ccsds.moims.mo.mps.structures.ResourceProfile()); + maximum = (org.ccsds.moims.mo.mps.structures.ResourceProfile) decoder.decodeElement(new org.ccsds.moims.mo.mps.structures.ResourceProfile()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/NumericResourceList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/NumericResourceList.java new file mode 100644 index 00000000..eb88de01 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/NumericResourceList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for NumericResource. + */ +public final class NumericResourceList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107410L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107410L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for NumericResourceList. + * + */ + public NumericResourceList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public NumericResourceList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public NumericResourceList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.NumericResource element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.NumericResource element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new NumericResourceList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.NumericResource(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ObjectPosition.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ObjectPosition.java new file mode 100644 index 00000000..9676ed06 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ObjectPosition.java @@ -0,0 +1,115 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E6: An ObjectPosition is a Position that coincides with the position of + * an existing object. The manner in which the planning system derives the + * value of this Position from the name of the referenced object is implementation-defined. + */ +public final class ObjectPosition extends org.ccsds.moims.mo.mps.structures.Position { + + private static final long serialVersionUID = 1407374900330508L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330508L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Name or identifier of a catalogued celestial object or a mission specific + * object. + */ + private org.ccsds.moims.mo.mal.structures.Identifier object; + + /** + * Default constructor for ObjectPosition. + * + */ + public ObjectPosition() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param object Name or identifier of a catalogued celestial object or a mission specific object. + */ + public ObjectPosition(org.ccsds.moims.mo.mal.structures.Identifier object) { + this.object = object; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.ObjectPosition(); + } + + /** + * Returns the field object. + * + * @return The field object + */ + public org.ccsds.moims.mo.mal.structures.Identifier getObject() { + return object; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ObjectPosition) { + if (! super.equals(obj)) { + return false; + } + ObjectPosition other = (ObjectPosition) obj; + if (object == null) { + if (other.object != null) { + return false; + } + } else { + if (! object.equals(other.object)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = super.hashCode(); + hash = 83 * hash + (object != null ? object.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(ObjectPosition: "); + buf.append(super.toString()); + buf.append(", object=").append(object); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + super.encode(encoder); + if (object == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'object' cannot be null!"); + } + encoder.encodeIdentifier(object); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + super.decode(decoder); + object = decoder.decodeIdentifier(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ObjectPositionList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ObjectPositionList.java new file mode 100644 index 00000000..f2f4f2ba --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ObjectPositionList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for ObjectPosition. + */ +public final class ObjectPositionList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107700L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107700L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for ObjectPositionList. + * + */ + public ObjectPositionList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public ObjectPositionList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public ObjectPositionList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.ObjectPosition element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.ObjectPosition element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new ObjectPositionList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.ObjectPosition(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/OrbitFilePosition.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/OrbitFilePosition.java new file mode 100644 index 00000000..5de81a32 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/OrbitFilePosition.java @@ -0,0 +1,113 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E6: An OrbitFilePosition represents a Position that is defined with respect + * to some Orbit Data Message (ODM) file (reference [D10]). + */ +public final class OrbitFilePosition extends org.ccsds.moims.mo.mps.structures.Position { + + private static final long serialVersionUID = 1407374900330506L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330506L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Name of or reference to a file containing an ODM. + */ + private org.ccsds.moims.mo.mal.structures.File orbitFile; + + /** + * Default constructor for OrbitFilePosition. + * + */ + public OrbitFilePosition() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param orbitFile Name of or reference to a file containing an ODM. + */ + public OrbitFilePosition(org.ccsds.moims.mo.mal.structures.File orbitFile) { + this.orbitFile = orbitFile; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.OrbitFilePosition(); + } + + /** + * Returns the field orbitFile. + * + * @return The field orbitFile + */ + public org.ccsds.moims.mo.mal.structures.File getOrbitFile() { + return orbitFile; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof OrbitFilePosition) { + if (! super.equals(obj)) { + return false; + } + OrbitFilePosition other = (OrbitFilePosition) obj; + if (orbitFile == null) { + if (other.orbitFile != null) { + return false; + } + } else { + if (! orbitFile.equals(other.orbitFile)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = super.hashCode(); + hash = 83 * hash + (orbitFile != null ? orbitFile.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(OrbitFilePosition: "); + buf.append(super.toString()); + buf.append(", orbitFile=").append(orbitFile); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + super.encode(encoder); + if (orbitFile == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'orbitFile' cannot be null!"); + } + encoder.encodeElement(orbitFile); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + super.decode(decoder); + orbitFile = (org.ccsds.moims.mo.mal.structures.File) decoder.decodeElement(new org.ccsds.moims.mo.mal.structures.File()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/OrbitFilePositionList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/OrbitFilePositionList.java new file mode 100644 index 00000000..b04ce310 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/OrbitFilePositionList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for OrbitFilePosition. + */ +public final class OrbitFilePositionList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107702L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107702L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for OrbitFilePositionList. + * + */ + public OrbitFilePositionList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public OrbitFilePositionList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public OrbitFilePositionList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.OrbitFilePosition element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.OrbitFilePosition element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new OrbitFilePositionList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.OrbitFilePosition(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/OrbitRepetition.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/OrbitRepetition.java new file mode 100644 index 00000000..fcbdb386 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/OrbitRepetition.java @@ -0,0 +1,323 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E6: A sub-type of Repetition based on the orbital cycle. + */ +public final class OrbitRepetition extends org.ccsds.moims.mo.mps.structures.Repetition { + + private static final long serialVersionUID = 1407374900330554L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330554L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Orbit number for the first occurrence. Depending on the relativeOrbit + * flag, the orbit number may be absolute (since start of mission) or relative + * (to the orbital repeat cycle). The datum with respect to which the orbit + * number is counted is mission specific. + */ + private org.ccsds.moims.mo.mal.structures.Element orbitNumber; + + /** + * Flag indicating if the orbit number is absolute or relative to the orbital + * repeat cycle. + */ + private Boolean relativeOrbit; + + /** + * The required number of orbits separation between occurrences. If orbitNumber + * is Relative and the required repetition is once per repeat cycle, this + * is the number of orbits in the repeat cycle, but the value 0 may also be + * used. + */ + private org.ccsds.moims.mo.mal.structures.Element orbitSeparation; + + /** + * The required angular separation between occurrences. This allows for multiple + * repetitions within an orbit. The value 0 indicates only one occurrence + * within the orbit. + */ + private org.ccsds.moims.mo.mal.structures.Element angularSeparation; + + /** + * The required position of the first occurrence within the orbit expressed + * as an angle. + */ + private org.ccsds.moims.mo.mal.structures.Element orbitAngle; + + /** + * The allowed tolerance (+/-) in the required orbital angle. + */ + private org.ccsds.moims.mo.mal.structures.Element tolerance; + + /** + * Default constructor for OrbitRepetition. + * + */ + public OrbitRepetition() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param count Maximum number of repeat cycles/instances. If not specified there is no limit to the number of repetitions. + * @param timeWindow Time period over which the repetition is applicable. If not specified repetition continues indefinitely. + * @param separationType Specifies whether the repetition interval is Relative to the previous occurrence, or Absolute for all occurrences. + * @param orbitNumber Orbit number for the first occurrence. Depending on the relativeOrbit flag, the orbit number may be absolute (since start of mission) or relative (to the orbital repeat cycle). The datum with respect to which the orbit number is counted is mission specific. + * @param relativeOrbit Flag indicating if the orbit number is absolute or relative to the orbital repeat cycle. + * @param orbitSeparation The required number of orbits separation between occurrences. If orbitNumber is Relative and the required repetition is once per repeat cycle, this is the number of orbits in the repeat cycle, but the value 0 may also be used. + * @param angularSeparation The required angular separation between occurrences. This allows for multiple repetitions within an orbit. The value 0 indicates only one occurrence within the orbit. + * @param orbitAngle The required position of the first occurrence within the orbit expressed as an angle. + * @param tolerance The allowed tolerance (+/-) in the required orbital angle. + */ + public OrbitRepetition(Integer count, + org.ccsds.moims.mo.mps.structures.TimeWindow timeWindow, + org.ccsds.moims.mo.mps.structures.SeparationTypeEnum separationType, + org.ccsds.moims.mo.mal.structures.Element orbitNumber, + Boolean relativeOrbit, + org.ccsds.moims.mo.mal.structures.Element orbitSeparation, + org.ccsds.moims.mo.mal.structures.Element angularSeparation, + org.ccsds.moims.mo.mal.structures.Element orbitAngle, + org.ccsds.moims.mo.mal.structures.Element tolerance) { + super(count, + timeWindow, + separationType); + this.orbitNumber = orbitNumber; + this.relativeOrbit = relativeOrbit; + this.orbitSeparation = orbitSeparation; + this.angularSeparation = angularSeparation; + this.orbitAngle = orbitAngle; + this.tolerance = tolerance; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param separationType Specifies whether the repetition interval is Relative to the previous occurrence, or Absolute for all occurrences. + * @param orbitNumber Orbit number for the first occurrence. Depending on the relativeOrbit flag, the orbit number may be absolute (since start of mission) or relative (to the orbital repeat cycle). The datum with respect to which the orbit number is counted is mission specific. + * @param relativeOrbit Flag indicating if the orbit number is absolute or relative to the orbital repeat cycle. + * @param orbitSeparation The required number of orbits separation between occurrences. If orbitNumber is Relative and the required repetition is once per repeat cycle, this is the number of orbits in the repeat cycle, but the value 0 may also be used. + * @param angularSeparation The required angular separation between occurrences. This allows for multiple repetitions within an orbit. The value 0 indicates only one occurrence within the orbit. + * @param orbitAngle The required position of the first occurrence within the orbit expressed as an angle. + * @param tolerance The allowed tolerance (+/-) in the required orbital angle. + */ + public OrbitRepetition(org.ccsds.moims.mo.mps.structures.SeparationTypeEnum separationType, + org.ccsds.moims.mo.mal.structures.Element orbitNumber, + Boolean relativeOrbit, + org.ccsds.moims.mo.mal.structures.Element orbitSeparation, + org.ccsds.moims.mo.mal.structures.Element angularSeparation, + org.ccsds.moims.mo.mal.structures.Element orbitAngle, + org.ccsds.moims.mo.mal.structures.Element tolerance) { + super(separationType); + this.orbitNumber = orbitNumber; + this.relativeOrbit = relativeOrbit; + this.orbitSeparation = orbitSeparation; + this.angularSeparation = angularSeparation; + this.orbitAngle = orbitAngle; + this.tolerance = tolerance; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.OrbitRepetition(); + } + + /** + * Returns the field orbitNumber. + * + * @return The field orbitNumber + */ + public org.ccsds.moims.mo.mal.structures.Element getOrbitNumber() { + return orbitNumber; + } + + /** + * Returns the field relativeOrbit. + * + * @return The field relativeOrbit + */ + public Boolean getRelativeOrbit() { + return relativeOrbit; + } + + /** + * Returns the field orbitSeparation. + * + * @return The field orbitSeparation + */ + public org.ccsds.moims.mo.mal.structures.Element getOrbitSeparation() { + return orbitSeparation; + } + + /** + * Returns the field angularSeparation. + * + * @return The field angularSeparation + */ + public org.ccsds.moims.mo.mal.structures.Element getAngularSeparation() { + return angularSeparation; + } + + /** + * Returns the field orbitAngle. + * + * @return The field orbitAngle + */ + public org.ccsds.moims.mo.mal.structures.Element getOrbitAngle() { + return orbitAngle; + } + + /** + * Returns the field tolerance. + * + * @return The field tolerance + */ + public org.ccsds.moims.mo.mal.structures.Element getTolerance() { + return tolerance; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof OrbitRepetition) { + if (! super.equals(obj)) { + return false; + } + OrbitRepetition other = (OrbitRepetition) obj; + if (orbitNumber == null) { + if (other.orbitNumber != null) { + return false; + } + } else { + if (! orbitNumber.equals(other.orbitNumber)) { + return false; + } + } + if (relativeOrbit == null) { + if (other.relativeOrbit != null) { + return false; + } + } else { + if (! relativeOrbit.equals(other.relativeOrbit)) { + return false; + } + } + if (orbitSeparation == null) { + if (other.orbitSeparation != null) { + return false; + } + } else { + if (! orbitSeparation.equals(other.orbitSeparation)) { + return false; + } + } + if (angularSeparation == null) { + if (other.angularSeparation != null) { + return false; + } + } else { + if (! angularSeparation.equals(other.angularSeparation)) { + return false; + } + } + if (orbitAngle == null) { + if (other.orbitAngle != null) { + return false; + } + } else { + if (! orbitAngle.equals(other.orbitAngle)) { + return false; + } + } + if (tolerance == null) { + if (other.tolerance != null) { + return false; + } + } else { + if (! tolerance.equals(other.tolerance)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = super.hashCode(); + hash = 83 * hash + (orbitNumber != null ? orbitNumber.hashCode() : 0); + hash = 83 * hash + (relativeOrbit != null ? relativeOrbit.hashCode() : 0); + hash = 83 * hash + (orbitSeparation != null ? orbitSeparation.hashCode() : 0); + hash = 83 * hash + (angularSeparation != null ? angularSeparation.hashCode() : 0); + hash = 83 * hash + (orbitAngle != null ? orbitAngle.hashCode() : 0); + hash = 83 * hash + (tolerance != null ? tolerance.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(OrbitRepetition: "); + buf.append(super.toString()); + buf.append(", orbitNumber=").append(orbitNumber); + buf.append(", relativeOrbit=").append(relativeOrbit); + buf.append(", orbitSeparation=").append(orbitSeparation); + buf.append(", angularSeparation=").append(angularSeparation); + buf.append(", orbitAngle=").append(orbitAngle); + buf.append(", tolerance=").append(tolerance); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + super.encode(encoder); + if (orbitNumber == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'orbitNumber' cannot be null!"); + } + if (relativeOrbit == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'relativeOrbit' cannot be null!"); + } + if (orbitSeparation == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'orbitSeparation' cannot be null!"); + } + if (angularSeparation == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'angularSeparation' cannot be null!"); + } + if (orbitAngle == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'orbitAngle' cannot be null!"); + } + if (tolerance == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'tolerance' cannot be null!"); + } + encoder.encodeAbstractElement(orbitNumber); + encoder.encodeBoolean(relativeOrbit); + encoder.encodeAbstractElement(orbitSeparation); + encoder.encodeAbstractElement(angularSeparation); + encoder.encodeAbstractElement(orbitAngle); + encoder.encodeAbstractElement(tolerance); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + super.decode(decoder); + orbitNumber = (org.ccsds.moims.mo.mal.structures.Element) decoder.decodeAbstractElement(); + relativeOrbit = decoder.decodeBoolean(); + orbitSeparation = (org.ccsds.moims.mo.mal.structures.Element) decoder.decodeAbstractElement(); + angularSeparation = (org.ccsds.moims.mo.mal.structures.Element) decoder.decodeAbstractElement(); + orbitAngle = (org.ccsds.moims.mo.mal.structures.Element) decoder.decodeAbstractElement(); + tolerance = (org.ccsds.moims.mo.mal.structures.Element) decoder.decodeAbstractElement(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/OrbitRepetitionList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/OrbitRepetitionList.java new file mode 100644 index 00000000..1951076b --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/OrbitRepetitionList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for OrbitRepetition. + */ +public final class OrbitRepetitionList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107654L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107654L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for OrbitRepetitionList. + * + */ + public OrbitRepetitionList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public OrbitRepetitionList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public OrbitRepetitionList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.OrbitRepetition element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.OrbitRepetition element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new OrbitRepetitionList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.OrbitRepetition(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/OrbitalPosition.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/OrbitalPosition.java new file mode 100644 index 00000000..99c569b9 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/OrbitalPosition.java @@ -0,0 +1,184 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E6: An OrbitalPosition represents a Position that is defined with respect + * to some mission specific orbit. The conventions used to derive the orbitNumber + * and orbitAngle follow from a mission specific definition. + */ +public final class OrbitalPosition extends org.ccsds.moims.mo.mps.structures.Position { + + private static final long serialVersionUID = 1407374900330507L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330507L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Orbit number. Depending on the relativeOrbit flag, the orbit number may + * be absolute (since start of mission) or relative (to the orbital repeat + * cycle). + */ + private Integer orbitNumber; + + /** + * Flag indicating if the orbit number is absolute or relative to the orbital + * repeat cycle. + */ + private Boolean relativeOrbit; + + /** + * Angle within orbit. Whether this angle is the mean or true anomaly and + * from which datum it is measured are mission specific. + */ + private org.ccsds.moims.mo.mps.structures.Angle orbitAngle; + + /** + * Default constructor for OrbitalPosition. + * + */ + public OrbitalPosition() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param orbitNumber Orbit number. Depending on the relativeOrbit flag, the orbit number may be absolute (since start of mission) or relative (to the orbital repeat cycle). + * @param relativeOrbit Flag indicating if the orbit number is absolute or relative to the orbital repeat cycle. + * @param orbitAngle Angle within orbit. Whether this angle is the mean or true anomaly and from which datum it is measured are mission specific. + */ + public OrbitalPosition(Integer orbitNumber, + Boolean relativeOrbit, + org.ccsds.moims.mo.mps.structures.Angle orbitAngle) { + this.orbitNumber = orbitNumber; + this.relativeOrbit = relativeOrbit; + this.orbitAngle = orbitAngle; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.OrbitalPosition(); + } + + /** + * Returns the field orbitNumber. + * + * @return The field orbitNumber + */ + public Integer getOrbitNumber() { + return orbitNumber; + } + + /** + * Returns the field relativeOrbit. + * + * @return The field relativeOrbit + */ + public Boolean getRelativeOrbit() { + return relativeOrbit; + } + + /** + * Returns the field orbitAngle. + * + * @return The field orbitAngle + */ + public org.ccsds.moims.mo.mps.structures.Angle getOrbitAngle() { + return orbitAngle; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof OrbitalPosition) { + if (! super.equals(obj)) { + return false; + } + OrbitalPosition other = (OrbitalPosition) obj; + if (orbitNumber == null) { + if (other.orbitNumber != null) { + return false; + } + } else { + if (! orbitNumber.equals(other.orbitNumber)) { + return false; + } + } + if (relativeOrbit == null) { + if (other.relativeOrbit != null) { + return false; + } + } else { + if (! relativeOrbit.equals(other.relativeOrbit)) { + return false; + } + } + if (orbitAngle == null) { + if (other.orbitAngle != null) { + return false; + } + } else { + if (! orbitAngle.equals(other.orbitAngle)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = super.hashCode(); + hash = 83 * hash + (orbitNumber != null ? orbitNumber.hashCode() : 0); + hash = 83 * hash + (relativeOrbit != null ? relativeOrbit.hashCode() : 0); + hash = 83 * hash + (orbitAngle != null ? orbitAngle.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(OrbitalPosition: "); + buf.append(super.toString()); + buf.append(", orbitNumber=").append(orbitNumber); + buf.append(", relativeOrbit=").append(relativeOrbit); + buf.append(", orbitAngle=").append(orbitAngle); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + super.encode(encoder); + if (orbitNumber == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'orbitNumber' cannot be null!"); + } + if (relativeOrbit == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'relativeOrbit' cannot be null!"); + } + if (orbitAngle == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'orbitAngle' cannot be null!"); + } + encoder.encodeInteger(orbitNumber); + encoder.encodeBoolean(relativeOrbit); + encoder.encodeElement(orbitAngle); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + super.decode(decoder); + orbitNumber = decoder.decodeInteger(); + relativeOrbit = decoder.decodeBoolean(); + orbitAngle = (org.ccsds.moims.mo.mps.structures.Angle) decoder.decodeElement(new org.ccsds.moims.mo.mps.structures.Angle()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/OrbitalPositionList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/OrbitalPositionList.java new file mode 100644 index 00000000..377f26b9 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/OrbitalPositionList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for OrbitalPosition. + */ +public final class OrbitalPositionList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107701L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107701L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for OrbitalPositionList. + * + */ + public OrbitalPositionList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public OrbitalPositionList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public OrbitalPositionList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.OrbitalPosition element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.OrbitalPosition element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new OrbitalPositionList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.OrbitalPosition(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PartialPlan.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PartialPlan.java new file mode 100644 index 00000000..f1efc9d8 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PartialPlan.java @@ -0,0 +1,318 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E1: A PartialPlan is a data structure returned from the getPartialPlan + * operation of the Plan Distribution Service that contains a reference to + * the source Plan, the criteria used to select the partial plan, and the + * partial plan itself. The partial plan uses the same structure as a normal + * Plan, with header fields matching those of the source Plan, but only containing + * the subset of ActivityInstances that matches the selection criteria. Whether + * EventInstances and Resources are included is implementation specific, but + * it might be assumed that any events and resources related to the selected + * ActivityInstances would be included in the returned partial plan. + */ +public final class PartialPlan implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1407374900331011L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900331011L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Reference to the Plan of which the partial plan is a selected subset. + */ + private org.ccsds.moims.mo.mal.structures.ObjectRef sourcePlan; + + /** + * Selection criterion based on the domain of contained ActivityInstances. + * An ordered list representing a domain hierarchy, ‘*’ can be used to represent + * a wildcard at that level. + */ + private org.ccsds.moims.mo.mal.structures.IdentifierList domain; + + /** + * Selection criterion based on the subPlan of contained ActivityInstances. + */ + private org.ccsds.moims.mo.mal.structures.Identifier subPlan; + + /** + * Selection criterion based on tags associated with contained ActivityInstances. + */ + private org.ccsds.moims.mo.mal.structures.StringList tags; + + /** + * Selection criterion indicating the start of a range of time, position, + * or events associated with contained ActivityInstances. + */ + private org.ccsds.moims.mo.mps.structures.Trigger partialPlanStart; + + /** + * Selection criterion indicating the end of a range of time, position, or + * events associated with contained ActivityInstances. + */ + private org.ccsds.moims.mo.mps.structures.Trigger partialPlanEnd; + + /** + * The returned partial plan. + */ + private org.ccsds.moims.mo.mps.structures.Plan partialPlan; + + /** + * Default constructor for PartialPlan. + * + */ + public PartialPlan() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param sourcePlan Reference to the Plan of which the partial plan is a selected subset. + * @param domain Selection criterion based on the domain of contained ActivityInstances. An ordered list representing a domain hierarchy, ‘*’ can be used to represent a wildcard at that level. + * @param subPlan Selection criterion based on the subPlan of contained ActivityInstances. + * @param tags Selection criterion based on tags associated with contained ActivityInstances. + * @param partialPlanStart Selection criterion indicating the start of a range of time, position, or events associated with contained ActivityInstances. + * @param partialPlanEnd Selection criterion indicating the end of a range of time, position, or events associated with contained ActivityInstances. + * @param partialPlan The returned partial plan. + */ + public PartialPlan(org.ccsds.moims.mo.mal.structures.ObjectRef sourcePlan, + org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.Identifier subPlan, + org.ccsds.moims.mo.mal.structures.StringList tags, + org.ccsds.moims.mo.mps.structures.Trigger partialPlanStart, + org.ccsds.moims.mo.mps.structures.Trigger partialPlanEnd, + org.ccsds.moims.mo.mps.structures.Plan partialPlan) { + this.sourcePlan = sourcePlan; + this.domain = domain; + this.subPlan = subPlan; + this.tags = tags; + this.partialPlanStart = partialPlanStart; + this.partialPlanEnd = partialPlanEnd; + this.partialPlan = partialPlan; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param sourcePlan Reference to the Plan of which the partial plan is a selected subset. + * @param partialPlan The returned partial plan. + */ + public PartialPlan(org.ccsds.moims.mo.mal.structures.ObjectRef sourcePlan, + org.ccsds.moims.mo.mps.structures.Plan partialPlan) { + this.sourcePlan = sourcePlan; + this.domain = null; + this.subPlan = null; + this.tags = null; + this.partialPlanStart = null; + this.partialPlanEnd = null; + this.partialPlan = partialPlan; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.PartialPlan(); + } + + /** + * Returns the field sourcePlan. + * + * @return The field sourcePlan + */ + public org.ccsds.moims.mo.mal.structures.ObjectRef getSourcePlan() { + return sourcePlan; + } + + /** + * Returns the field domain. + * + * @return The field domain + */ + public org.ccsds.moims.mo.mal.structures.IdentifierList getDomain() { + return domain; + } + + /** + * Returns the field subPlan. + * + * @return The field subPlan + */ + public org.ccsds.moims.mo.mal.structures.Identifier getSubPlan() { + return subPlan; + } + + /** + * Returns the field tags. + * + * @return The field tags + */ + public org.ccsds.moims.mo.mal.structures.StringList getTags() { + return tags; + } + + /** + * Returns the field partialPlanStart. + * + * @return The field partialPlanStart + */ + public org.ccsds.moims.mo.mps.structures.Trigger getPartialPlanStart() { + return partialPlanStart; + } + + /** + * Returns the field partialPlanEnd. + * + * @return The field partialPlanEnd + */ + public org.ccsds.moims.mo.mps.structures.Trigger getPartialPlanEnd() { + return partialPlanEnd; + } + + /** + * Returns the field partialPlan. + * + * @return The field partialPlan + */ + public org.ccsds.moims.mo.mps.structures.Plan getPartialPlan() { + return partialPlan; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof PartialPlan) { + PartialPlan other = (PartialPlan) obj; + if (sourcePlan == null) { + if (other.sourcePlan != null) { + return false; + } + } else { + if (! sourcePlan.equals(other.sourcePlan)) { + return false; + } + } + if (domain == null) { + if (other.domain != null) { + return false; + } + } else { + if (! domain.equals(other.domain)) { + return false; + } + } + if (subPlan == null) { + if (other.subPlan != null) { + return false; + } + } else { + if (! subPlan.equals(other.subPlan)) { + return false; + } + } + if (tags == null) { + if (other.tags != null) { + return false; + } + } else { + if (! tags.equals(other.tags)) { + return false; + } + } + if (partialPlanStart == null) { + if (other.partialPlanStart != null) { + return false; + } + } else { + if (! partialPlanStart.equals(other.partialPlanStart)) { + return false; + } + } + if (partialPlanEnd == null) { + if (other.partialPlanEnd != null) { + return false; + } + } else { + if (! partialPlanEnd.equals(other.partialPlanEnd)) { + return false; + } + } + if (partialPlan == null) { + if (other.partialPlan != null) { + return false; + } + } else { + if (! partialPlan.equals(other.partialPlan)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (sourcePlan != null ? sourcePlan.hashCode() : 0); + hash = 83 * hash + (domain != null ? domain.hashCode() : 0); + hash = 83 * hash + (subPlan != null ? subPlan.hashCode() : 0); + hash = 83 * hash + (tags != null ? tags.hashCode() : 0); + hash = 83 * hash + (partialPlanStart != null ? partialPlanStart.hashCode() : 0); + hash = 83 * hash + (partialPlanEnd != null ? partialPlanEnd.hashCode() : 0); + hash = 83 * hash + (partialPlan != null ? partialPlan.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(PartialPlan: "); + buf.append("sourcePlan=").append(sourcePlan); + buf.append(", domain=").append(domain); + buf.append(", subPlan=").append(subPlan); + buf.append(", tags=").append(tags); + buf.append(", partialPlanStart=").append(partialPlanStart); + buf.append(", partialPlanEnd=").append(partialPlanEnd); + buf.append(", partialPlan=").append(partialPlan); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (sourcePlan == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'sourcePlan' cannot be null!"); + } + if (partialPlan == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'partialPlan' cannot be null!"); + } + encoder.encodeElement(sourcePlan); + encoder.encodeNullableElement(domain); + encoder.encodeNullableIdentifier(subPlan); + encoder.encodeNullableElement(tags); + encoder.encodeNullableAbstractElement(partialPlanStart); + encoder.encodeNullableAbstractElement(partialPlanEnd); + encoder.encodeElement(partialPlan); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + sourcePlan = (org.ccsds.moims.mo.mal.structures.ObjectRef) decoder.decodeElement(new org.ccsds.moims.mo.mal.structures.ObjectRef()); + domain = (org.ccsds.moims.mo.mal.structures.IdentifierList) decoder.decodeNullableElement(new org.ccsds.moims.mo.mal.structures.IdentifierList()); + subPlan = decoder.decodeNullableIdentifier(); + tags = (org.ccsds.moims.mo.mal.structures.StringList) decoder.decodeNullableElement(new org.ccsds.moims.mo.mal.structures.StringList()); + partialPlanStart = (org.ccsds.moims.mo.mps.structures.Trigger) decoder.decodeNullableAbstractElement(); + partialPlanEnd = (org.ccsds.moims.mo.mps.structures.Trigger) decoder.decodeNullableAbstractElement(); + partialPlan = (org.ccsds.moims.mo.mps.structures.Plan) decoder.decodeElement(new org.ccsds.moims.mo.mps.structures.Plan()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PartialPlanFilter.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PartialPlanFilter.java new file mode 100644 index 00000000..765feafa --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PartialPlanFilter.java @@ -0,0 +1,280 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E1: PartialPlanFilter is a data structure input to the getPartialPlan operation + * of the Plan Distribution Service that contains a reference to the source + * Plan, and specifies the criteria used to select the partial plan. + */ +public final class PartialPlanFilter implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1407374900331013L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900331013L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Reference to the Plan of which the partial plan is a selected subset. + */ + private org.ccsds.moims.mo.mal.structures.ObjectRef sourcePlan; + + /** + * Selection criterion based on the domain of contained ActivityInstances. + * An ordered list representing a domain hierarchy, ‘*’ can be used to represent + * a wildcard at that level. + */ + private org.ccsds.moims.mo.mal.structures.IdentifierList domain; + + /** + * Selection criterion based on the subPlan of contained ActivityInstances. + */ + private org.ccsds.moims.mo.mal.structures.Identifier subPlan; + + /** + * Selection criterion based on tags associated with contained ActivityInstances. + */ + private org.ccsds.moims.mo.mal.structures.StringList tags; + + /** + * Selection criterion indicating the start of a range of time, position, + * or events associated with contained ActivityInstances. If no actual time + * is known for a Trigger, its predicted time may be used instead to derive + * the relevant range. . + */ + private org.ccsds.moims.mo.mps.structures.Trigger partialPlanStart; + + /** + * Selection criterion indicating the end of a range of time, position, or + * events associated with contained ActivityInstances. If no actual time + * is known for a Trigger, its predicted time may be used instead to derive + * the relevant range. + */ + private org.ccsds.moims.mo.mps.structures.Trigger partialPlanEnd; + + /** + * Default constructor for PartialPlanFilter. + * + */ + public PartialPlanFilter() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param sourcePlan Reference to the Plan of which the partial plan is a selected subset. + * @param domain Selection criterion based on the domain of contained ActivityInstances. An ordered list representing a domain hierarchy, ‘*’ can be used to represent a wildcard at that level. + * @param subPlan Selection criterion based on the subPlan of contained ActivityInstances. + * @param tags Selection criterion based on tags associated with contained ActivityInstances + * @param partialPlanStart Selection criterion indicating the start of a range of time, position, or events associated with contained ActivityInstances. If no actual time is known for a Trigger, its predicted time may be used instead to derive the relevant range. + * @param partialPlanEnd Selection criterion indicating the end of a range of time, position, or events associated with contained ActivityInstances. If no actual time is known for a Trigger, its predicted time may be used instead to derive the relevant range. + */ + public PartialPlanFilter(org.ccsds.moims.mo.mal.structures.ObjectRef sourcePlan, + org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.Identifier subPlan, + org.ccsds.moims.mo.mal.structures.StringList tags, + org.ccsds.moims.mo.mps.structures.Trigger partialPlanStart, + org.ccsds.moims.mo.mps.structures.Trigger partialPlanEnd) { + this.sourcePlan = sourcePlan; + this.domain = domain; + this.subPlan = subPlan; + this.tags = tags; + this.partialPlanStart = partialPlanStart; + this.partialPlanEnd = partialPlanEnd; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param sourcePlan Reference to the Plan of which the partial plan is a selected subset. + */ + public PartialPlanFilter(org.ccsds.moims.mo.mal.structures.ObjectRef sourcePlan) { + this.sourcePlan = sourcePlan; + this.domain = null; + this.subPlan = null; + this.tags = null; + this.partialPlanStart = null; + this.partialPlanEnd = null; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.PartialPlanFilter(); + } + + /** + * Returns the field sourcePlan. + * + * @return The field sourcePlan + */ + public org.ccsds.moims.mo.mal.structures.ObjectRef getSourcePlan() { + return sourcePlan; + } + + /** + * Returns the field domain. + * + * @return The field domain + */ + public org.ccsds.moims.mo.mal.structures.IdentifierList getDomain() { + return domain; + } + + /** + * Returns the field subPlan. + * + * @return The field subPlan + */ + public org.ccsds.moims.mo.mal.structures.Identifier getSubPlan() { + return subPlan; + } + + /** + * Returns the field tags. + * + * @return The field tags + */ + public org.ccsds.moims.mo.mal.structures.StringList getTags() { + return tags; + } + + /** + * Returns the field partialPlanStart. + * + * @return The field partialPlanStart + */ + public org.ccsds.moims.mo.mps.structures.Trigger getPartialPlanStart() { + return partialPlanStart; + } + + /** + * Returns the field partialPlanEnd. + * + * @return The field partialPlanEnd + */ + public org.ccsds.moims.mo.mps.structures.Trigger getPartialPlanEnd() { + return partialPlanEnd; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof PartialPlanFilter) { + PartialPlanFilter other = (PartialPlanFilter) obj; + if (sourcePlan == null) { + if (other.sourcePlan != null) { + return false; + } + } else { + if (! sourcePlan.equals(other.sourcePlan)) { + return false; + } + } + if (domain == null) { + if (other.domain != null) { + return false; + } + } else { + if (! domain.equals(other.domain)) { + return false; + } + } + if (subPlan == null) { + if (other.subPlan != null) { + return false; + } + } else { + if (! subPlan.equals(other.subPlan)) { + return false; + } + } + if (tags == null) { + if (other.tags != null) { + return false; + } + } else { + if (! tags.equals(other.tags)) { + return false; + } + } + if (partialPlanStart == null) { + if (other.partialPlanStart != null) { + return false; + } + } else { + if (! partialPlanStart.equals(other.partialPlanStart)) { + return false; + } + } + if (partialPlanEnd == null) { + if (other.partialPlanEnd != null) { + return false; + } + } else { + if (! partialPlanEnd.equals(other.partialPlanEnd)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (sourcePlan != null ? sourcePlan.hashCode() : 0); + hash = 83 * hash + (domain != null ? domain.hashCode() : 0); + hash = 83 * hash + (subPlan != null ? subPlan.hashCode() : 0); + hash = 83 * hash + (tags != null ? tags.hashCode() : 0); + hash = 83 * hash + (partialPlanStart != null ? partialPlanStart.hashCode() : 0); + hash = 83 * hash + (partialPlanEnd != null ? partialPlanEnd.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(PartialPlanFilter: "); + buf.append("sourcePlan=").append(sourcePlan); + buf.append(", domain=").append(domain); + buf.append(", subPlan=").append(subPlan); + buf.append(", tags=").append(tags); + buf.append(", partialPlanStart=").append(partialPlanStart); + buf.append(", partialPlanEnd=").append(partialPlanEnd); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (sourcePlan == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'sourcePlan' cannot be null!"); + } + encoder.encodeElement(sourcePlan); + encoder.encodeNullableElement(domain); + encoder.encodeNullableIdentifier(subPlan); + encoder.encodeNullableElement(tags); + encoder.encodeNullableAbstractElement(partialPlanStart); + encoder.encodeNullableAbstractElement(partialPlanEnd); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + sourcePlan = (org.ccsds.moims.mo.mal.structures.ObjectRef) decoder.decodeElement(new org.ccsds.moims.mo.mal.structures.ObjectRef()); + domain = (org.ccsds.moims.mo.mal.structures.IdentifierList) decoder.decodeNullableElement(new org.ccsds.moims.mo.mal.structures.IdentifierList()); + subPlan = decoder.decodeNullableIdentifier(); + tags = (org.ccsds.moims.mo.mal.structures.StringList) decoder.decodeNullableElement(new org.ccsds.moims.mo.mal.structures.StringList()); + partialPlanStart = (org.ccsds.moims.mo.mps.structures.Trigger) decoder.decodeNullableAbstractElement(); + partialPlanEnd = (org.ccsds.moims.mo.mps.structures.Trigger) decoder.decodeNullableAbstractElement(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PartialPlanFilterList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PartialPlanFilterList.java new file mode 100644 index 00000000..dbd8d18e --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PartialPlanFilterList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for PartialPlanFilter. + */ +public final class PartialPlanFilterList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107195L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107195L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for PartialPlanFilterList. + * + */ + public PartialPlanFilterList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public PartialPlanFilterList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public PartialPlanFilterList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.PartialPlanFilter element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.PartialPlanFilter element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new PartialPlanFilterList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.PartialPlanFilter(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PartialPlanList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PartialPlanList.java new file mode 100644 index 00000000..b6b52577 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PartialPlanList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for PartialPlan. + */ +public final class PartialPlanList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107197L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107197L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for PartialPlanList. + * + */ + public PartialPlanList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public PartialPlanList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public PartialPlanList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.PartialPlan element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.PartialPlan element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new PartialPlanList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.PartialPlan(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PhysicalValue.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PhysicalValue.java new file mode 100644 index 00000000..7f78dd38 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PhysicalValue.java @@ -0,0 +1,129 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E6: PhysicalValue is an abstract base type for the specific value types + * defined below. Only specific value types are used in the pointing constraint + * definitions below. + */ +public abstract class PhysicalValue implements org.ccsds.moims.mo.mal.structures.Composite { + + /** + * Physical value. + */ + private Double value; + + /** + * Optional units. The units for a single quantity. The unit type depends + * on the specific value type. + */ + private String units; + + /** + * Default constructor for PhysicalValue. + * + */ + public PhysicalValue() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param value Physical value. + * @param units Optional units. The units for a single quantity. The unit type depends on the specific value type. + */ + public PhysicalValue(Double value, + String units) { + this.value = value; + this.units = units; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param value Physical value. + */ + public PhysicalValue(Double value) { + this.value = value; + this.units = null; + } + + /** + * Returns the field value. + * + * @return The field value + */ + public Double getValue() { + return value; + } + + /** + * Returns the field units. + * + * @return The field units + */ + public String getUnits() { + return units; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof PhysicalValue) { + PhysicalValue other = (PhysicalValue) obj; + if (value == null) { + if (other.value != null) { + return false; + } + } else { + if (! value.equals(other.value)) { + return false; + } + } + if (units == null) { + if (other.units != null) { + return false; + } + } else { + if (! units.equals(other.units)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (value != null ? value.hashCode() : 0); + hash = 83 * hash + (units != null ? units.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(PhysicalValue: "); + buf.append("value=").append(value); + buf.append(", units=").append(units); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (value == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'value' cannot be null!"); + } + encoder.encodeDouble(value); + encoder.encodeNullableString(units); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + value = decoder.decodeDouble(); + units = decoder.decodeNullableString(); + return this; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PhysicalValueList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PhysicalValueList.java new file mode 100644 index 00000000..cc8ac07e --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PhysicalValueList.java @@ -0,0 +1,23 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for PhysicalValue. + */ +public final class PhysicalValueList extends org.ccsds.moims.mo.mal.structures.HeterogeneousList { + + /** + * Default constructor for PhysicalValueList. + * + */ + public PhysicalValueList() { + } + + @Override + public boolean add(org.ccsds.moims.mo.mal.structures.Element element) { + if (element != null && !(element instanceof PhysicalValue)) { + throw new java.lang.ClassCastException("The added element does not extend the type: PhysicalValue"); + } + return super.add(element); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/Plan.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/Plan.java new file mode 100644 index 00000000..afe88f51 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/Plan.java @@ -0,0 +1,453 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E1: A Plan is an MO object that contains both the static fields that define + * a version of a plan and dynamic fields that hold its current state. Its + * identity is defined by a constant key and an evolving version, which is + * updated each time the Plan is revised. + */ +public final class Plan extends org.ccsds.moims.mo.mal.structures.MOObject { + + private static final long serialVersionUID = 1407374900330997L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330997L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Flag indicating if the Plan is a patch plan that only contains details + * of the changes from the precursor Plan. A patch plan must have a precursor. + * It must also include a single PlanRevision relative to the precursor Plan. + */ + private Boolean isPatchPlan; + + /** + * Reference to a precursor (or predecessor) Plan from which the changes are + * detailed in the Plan. This may be used if there is an iterative re-planning + * cycle in which successive plans overlap, or where a previous Plan has been + * updated through re-planning. If there is no precursor, then the Plan must + * be a self-standing full plan. If the Plan is a Patch Plan, then a precursor + * plan must be specified. + */ + private org.ccsds.moims.mo.mal.structures.ObjectRef precursorPlan; + + /** + * Applicable only for patch plans, this is a reference to the target Plan. + * This target Plan is the result of applying the patch plan to the precursor + * Plan and is distinct from the identity of the patch plan itself. Patch + * plans are not permitted in the context of a planning request. + */ + private org.ccsds.moims.mo.mal.structures.ObjectRef targetPlan; + + /** + * Contains header information relating to the Plan, including its originator + * and validity period. + */ + private org.ccsds.moims.mo.mps.structures.PlanInformation information; + + /** + * Contains the planned activities and events that constitute the Plan. + */ + private org.ccsds.moims.mo.mps.structures.PlannedItems items; + + /** + * Details the changes between this Plan and other Plans (or other versions + * of the same Plan), usually the precursor Plan. Optional, but must contain + * at least one element in a patch plan. Multiple revisions may be included, + * documenting the differences with any other version of a Plan. This can + * be used to provide a change history for successive versions of the same + * Plan, or to document the differences between alternate Plans. + */ + private org.ccsds.moims.mo.mps.structures.PlanRevisionList revisions; + + /** + * If present, must contain one ResourceProfile per planning resource. These + * profiles shall provide the projected evolution of the value of a planning + * resource, or its initial value at the start of the Plan. Which approach + * is used is a deployment choice. + */ + private org.ccsds.moims.mo.mps.structures.ResourceProfileList resources; + + /** + * Flag indicating if the Plan has currently been released as an Operational + * or Alternate plan. + */ + private Boolean isAlternate; + + /** + * Current status of the Plan. + */ + private org.ccsds.moims.mo.mps.structures.PlanStatusEnum status; + + /** + * Supplementary information for a Plan in the Terminated state. This is + * customizable, but if the following conditions exist then the specified + * text shall be used: - Completed (nominal); - Superseded (by a successor + * Plan); - Revoked; - Cancelled (deactivated after start of execution); - + * Expired. + */ + private String statusInfo; + + /** + * Default constructor for Plan. + * + */ + public Plan() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param objectIdentity The identity of the MO Object. + * @param isPatchPlan Flag indicating if the Plan is a patch plan that only contains details of the changes from the precursor Plan. A patch plan must have a precursor. It must also include a single PlanRevision relative to the precursor Plan. + * @param precursorPlan Reference to a precursor (or predecessor) Plan from which the changes are detailed in the Plan. This may be used if there is an iterative re-planning cycle in which successive plans overlap, or where a previous Plan has been updated through re-planning. If there is no precursor, then the Plan must be a self-standing full plan. If the Plan is a Patch Plan, then a precursor plan must be specified. + * @param targetPlan Applicable only for patch plans, this is a reference to the target Plan. This target Plan is the result of applying the patch plan to the precursor Plan and is distinct from the identity of the patch plan itself. Patch plans are not permitted in the context of a planning request. + * @param information Contains header information relating to the Plan, including its originator and validity period. + * @param items Contains the planned activities and events that constitute the Plan. + * @param revisions Details the changes between this Plan and other Plans (or other versions of the same Plan), usually the precursor Plan. Optional, but must contain at least one element in a patch plan. Multiple revisions may be included, documenting the differences with any other version of a Plan. This can be used to provide a change history for successive versions of the same Plan, or to document the differences between alternate Plans. + * @param resources If present, must contain one ResourceProfile per planning resource. These profiles shall provide the projected evolution of the value of a planning resource, or its initial value at the start of the Plan. Which approach is used is a deployment choice. + * @param isAlternate Flag indicating if the Plan has currently been released as an Operational or Alternate plan. + * @param status Current status of the Plan. + * @param statusInfo Supplementary information for a Plan in the Terminated state. This is customizable, but if the following conditions exist then the specified text shall be used: - Completed (nominal); - Superseded (by a successor Plan); - Revoked; - Cancelled (deactivated after start of execution); - Expired. + */ + public Plan(org.ccsds.moims.mo.mal.structures.ObjectIdentity objectIdentity, + Boolean isPatchPlan, + org.ccsds.moims.mo.mal.structures.ObjectRef precursorPlan, + org.ccsds.moims.mo.mal.structures.ObjectRef targetPlan, + org.ccsds.moims.mo.mps.structures.PlanInformation information, + org.ccsds.moims.mo.mps.structures.PlannedItems items, + org.ccsds.moims.mo.mps.structures.PlanRevisionList revisions, + org.ccsds.moims.mo.mps.structures.ResourceProfileList resources, + Boolean isAlternate, + org.ccsds.moims.mo.mps.structures.PlanStatusEnum status, + String statusInfo) { + super(objectIdentity); + this.isPatchPlan = isPatchPlan; + this.precursorPlan = precursorPlan; + this.targetPlan = targetPlan; + this.information = information; + this.items = items; + this.revisions = revisions; + this.resources = resources; + this.isAlternate = isAlternate; + this.status = status; + this.statusInfo = statusInfo; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param objectIdentity The identity of the MO Object. + * @param isPatchPlan Flag indicating if the Plan is a patch plan that only contains details of the changes from the precursor Plan. A patch plan must have a precursor. It must also include a single PlanRevision relative to the precursor Plan. + * @param information Contains header information relating to the Plan, including its originator and validity period. + * @param items Contains the planned activities and events that constitute the Plan. + * @param isAlternate Flag indicating if the Plan has currently been released as an Operational or Alternate plan. + * @param status Current status of the Plan. + */ + public Plan(org.ccsds.moims.mo.mal.structures.ObjectIdentity objectIdentity, + Boolean isPatchPlan, + org.ccsds.moims.mo.mps.structures.PlanInformation information, + org.ccsds.moims.mo.mps.structures.PlannedItems items, + Boolean isAlternate, + org.ccsds.moims.mo.mps.structures.PlanStatusEnum status) { + super(objectIdentity); + this.isPatchPlan = isPatchPlan; + this.precursorPlan = null; + this.targetPlan = null; + this.information = information; + this.items = items; + this.revisions = null; + this.resources = null; + this.isAlternate = isAlternate; + this.status = status; + this.statusInfo = null; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.Plan(); + } + + /** + * Returns the field isPatchPlan. + * + * @return The field isPatchPlan + */ + public Boolean getIsPatchPlan() { + return isPatchPlan; + } + + /** + * Returns the field precursorPlan. + * + * @return The field precursorPlan + */ + public org.ccsds.moims.mo.mal.structures.ObjectRef getPrecursorPlan() { + return precursorPlan; + } + + /** + * Returns the field targetPlan. + * + * @return The field targetPlan + */ + public org.ccsds.moims.mo.mal.structures.ObjectRef getTargetPlan() { + return targetPlan; + } + + /** + * Returns the field information. + * + * @return The field information + */ + public org.ccsds.moims.mo.mps.structures.PlanInformation getInformation() { + return information; + } + + /** + * Returns the field items. + * + * @return The field items + */ + public org.ccsds.moims.mo.mps.structures.PlannedItems getItems() { + return items; + } + + /** + * Returns the field revisions. + * + * @return The field revisions + */ + public org.ccsds.moims.mo.mps.structures.PlanRevisionList getRevisions() { + return revisions; + } + + /** + * Returns the field resources. + * + * @return The field resources + */ + public org.ccsds.moims.mo.mps.structures.ResourceProfileList getResources() { + return resources; + } + + /** + * Returns the field isAlternate. + * + * @return The field isAlternate + */ + public Boolean getIsAlternate() { + return isAlternate; + } + + /** + * Returns the field status. + * + * @return The field status + */ + public org.ccsds.moims.mo.mps.structures.PlanStatusEnum getStatus() { + return status; + } + + /** + * Returns the field statusInfo. + * + * @return The field statusInfo + */ + public String getStatusInfo() { + return statusInfo; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Plan) { + if (! super.equals(obj)) { + return false; + } + Plan other = (Plan) obj; + if (isPatchPlan == null) { + if (other.isPatchPlan != null) { + return false; + } + } else { + if (! isPatchPlan.equals(other.isPatchPlan)) { + return false; + } + } + if (precursorPlan == null) { + if (other.precursorPlan != null) { + return false; + } + } else { + if (! precursorPlan.equals(other.precursorPlan)) { + return false; + } + } + if (targetPlan == null) { + if (other.targetPlan != null) { + return false; + } + } else { + if (! targetPlan.equals(other.targetPlan)) { + return false; + } + } + if (information == null) { + if (other.information != null) { + return false; + } + } else { + if (! information.equals(other.information)) { + return false; + } + } + if (items == null) { + if (other.items != null) { + return false; + } + } else { + if (! items.equals(other.items)) { + return false; + } + } + if (revisions == null) { + if (other.revisions != null) { + return false; + } + } else { + if (! revisions.equals(other.revisions)) { + return false; + } + } + if (resources == null) { + if (other.resources != null) { + return false; + } + } else { + if (! resources.equals(other.resources)) { + return false; + } + } + if (isAlternate == null) { + if (other.isAlternate != null) { + return false; + } + } else { + if (! isAlternate.equals(other.isAlternate)) { + return false; + } + } + if (status == null) { + if (other.status != null) { + return false; + } + } else { + if (! status.equals(other.status)) { + return false; + } + } + if (statusInfo == null) { + if (other.statusInfo != null) { + return false; + } + } else { + if (! statusInfo.equals(other.statusInfo)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = super.hashCode(); + hash = 83 * hash + (isPatchPlan != null ? isPatchPlan.hashCode() : 0); + hash = 83 * hash + (precursorPlan != null ? precursorPlan.hashCode() : 0); + hash = 83 * hash + (targetPlan != null ? targetPlan.hashCode() : 0); + hash = 83 * hash + (information != null ? information.hashCode() : 0); + hash = 83 * hash + (items != null ? items.hashCode() : 0); + hash = 83 * hash + (revisions != null ? revisions.hashCode() : 0); + hash = 83 * hash + (resources != null ? resources.hashCode() : 0); + hash = 83 * hash + (isAlternate != null ? isAlternate.hashCode() : 0); + hash = 83 * hash + (status != null ? status.hashCode() : 0); + hash = 83 * hash + (statusInfo != null ? statusInfo.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(Plan: "); + buf.append(super.toString()); + buf.append(", isPatchPlan=").append(isPatchPlan); + buf.append(", precursorPlan=").append(precursorPlan); + buf.append(", targetPlan=").append(targetPlan); + buf.append(", information=").append(information); + buf.append(", items=").append(items); + buf.append(", revisions=").append(revisions); + buf.append(", resources=").append(resources); + buf.append(", isAlternate=").append(isAlternate); + buf.append(", status=").append(status); + buf.append(", statusInfo=").append(statusInfo); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + super.encode(encoder); + if (isPatchPlan == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'isPatchPlan' cannot be null!"); + } + if (information == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'information' cannot be null!"); + } + if (items == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'items' cannot be null!"); + } + if (isAlternate == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'isAlternate' cannot be null!"); + } + if (status == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'status' cannot be null!"); + } + encoder.encodeBoolean(isPatchPlan); + encoder.encodeNullableElement(precursorPlan); + encoder.encodeNullableElement(targetPlan); + encoder.encodeElement(information); + encoder.encodeElement(items); + encoder.encodeNullableElement(revisions); + encoder.encodeNullableElement(resources); + encoder.encodeBoolean(isAlternate); + encoder.encodeElement(status); + encoder.encodeNullableString(statusInfo); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + super.decode(decoder); + isPatchPlan = decoder.decodeBoolean(); + precursorPlan = (org.ccsds.moims.mo.mal.structures.ObjectRef) decoder.decodeNullableElement(new org.ccsds.moims.mo.mal.structures.ObjectRef()); + targetPlan = (org.ccsds.moims.mo.mal.structures.ObjectRef) decoder.decodeNullableElement(new org.ccsds.moims.mo.mal.structures.ObjectRef()); + information = (org.ccsds.moims.mo.mps.structures.PlanInformation) decoder.decodeElement(new org.ccsds.moims.mo.mps.structures.PlanInformation()); + items = (org.ccsds.moims.mo.mps.structures.PlannedItems) decoder.decodeElement(new org.ccsds.moims.mo.mps.structures.PlannedItems()); + revisions = (org.ccsds.moims.mo.mps.structures.PlanRevisionList) decoder.decodeNullableElement(new org.ccsds.moims.mo.mps.structures.PlanRevisionList()); + resources = (org.ccsds.moims.mo.mps.structures.ResourceProfileList) decoder.decodeNullableElement(new org.ccsds.moims.mo.mps.structures.ResourceProfileList()); + isAlternate = decoder.decodeBoolean(); + status = (org.ccsds.moims.mo.mps.structures.PlanStatusEnum) decoder.decodeElement(org.ccsds.moims.mo.mps.structures.PlanStatusEnum.DRAFT); + statusInfo = decoder.decodeNullableString(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanActivationStatus.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanActivationStatus.java new file mode 100644 index 00000000..cc2ef043 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanActivationStatus.java @@ -0,0 +1,175 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E1: PlanActivationStatus is a data structure that returns the activation + * status of a Plan in the context of the MPS Plan Execution Control service + * activatePlan and deactivatePlan operations. + */ +public final class PlanActivationStatus implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1407374900331006L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900331006L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Reference to the Plan to which the status relates. + */ + private org.ccsds.moims.mo.mal.structures.ObjectRef plan; + + /** + * Current status of the Plan. + */ + private org.ccsds.moims.mo.mps.structures.PlanStatusEnum status; + + /** + * ActivationInfo provides customizable detailed information on the result + * of the activation/deactivation request for the referenced Plan. . + */ + private String activationInfo; + + /** + * Default constructor for PlanActivationStatus. + * + */ + public PlanActivationStatus() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param plan Reference to the Plan to which the status relates. + * @param status Current status of the Plan. + * @param activationInfo ActivationInfo provides customizable detailed information on the result of the activation/deactivation request for the referenced Plan. + */ + public PlanActivationStatus(org.ccsds.moims.mo.mal.structures.ObjectRef plan, + org.ccsds.moims.mo.mps.structures.PlanStatusEnum status, + String activationInfo) { + this.plan = plan; + this.status = status; + this.activationInfo = activationInfo; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.PlanActivationStatus(); + } + + /** + * Returns the field plan. + * + * @return The field plan + */ + public org.ccsds.moims.mo.mal.structures.ObjectRef getPlan() { + return plan; + } + + /** + * Returns the field status. + * + * @return The field status + */ + public org.ccsds.moims.mo.mps.structures.PlanStatusEnum getStatus() { + return status; + } + + /** + * Returns the field activationInfo. + * + * @return The field activationInfo + */ + public String getActivationInfo() { + return activationInfo; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof PlanActivationStatus) { + PlanActivationStatus other = (PlanActivationStatus) obj; + if (plan == null) { + if (other.plan != null) { + return false; + } + } else { + if (! plan.equals(other.plan)) { + return false; + } + } + if (status == null) { + if (other.status != null) { + return false; + } + } else { + if (! status.equals(other.status)) { + return false; + } + } + if (activationInfo == null) { + if (other.activationInfo != null) { + return false; + } + } else { + if (! activationInfo.equals(other.activationInfo)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (plan != null ? plan.hashCode() : 0); + hash = 83 * hash + (status != null ? status.hashCode() : 0); + hash = 83 * hash + (activationInfo != null ? activationInfo.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(PlanActivationStatus: "); + buf.append("plan=").append(plan); + buf.append(", status=").append(status); + buf.append(", activationInfo=").append(activationInfo); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (plan == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'plan' cannot be null!"); + } + if (status == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'status' cannot be null!"); + } + if (activationInfo == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'activationInfo' cannot be null!"); + } + encoder.encodeElement(plan); + encoder.encodeElement(status); + encoder.encodeString(activationInfo); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + plan = (org.ccsds.moims.mo.mal.structures.ObjectRef) decoder.decodeElement(new org.ccsds.moims.mo.mal.structures.ObjectRef()); + status = (org.ccsds.moims.mo.mps.structures.PlanStatusEnum) decoder.decodeElement(org.ccsds.moims.mo.mps.structures.PlanStatusEnum.DRAFT); + activationInfo = decoder.decodeString(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanActivationStatusList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanActivationStatusList.java new file mode 100644 index 00000000..e16eb99d --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanActivationStatusList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for PlanActivationStatus. + */ +public final class PlanActivationStatusList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107202L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107202L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for PlanActivationStatusList. + * + */ + public PlanActivationStatusList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public PlanActivationStatusList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public PlanActivationStatusList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.PlanActivationStatus element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.PlanActivationStatus element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new PlanActivationStatusList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.PlanActivationStatus(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanDetailUpdate.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanDetailUpdate.java new file mode 100644 index 00000000..40f7d2a6 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanDetailUpdate.java @@ -0,0 +1,49 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E1: Specifically in the case of reporting the detailed execution status + * of a plan, updates may be reported for multiple object types: planning + * activities, planning events, and planning resources. To support this an + * abstract type of PlanDetailUpdate is defined as follows. + */ +public abstract class PlanDetailUpdate implements org.ccsds.moims.mo.mal.structures.Composite { + + /** + * Default constructor for PlanDetailUpdate. + * + */ + public PlanDetailUpdate() { + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof PlanDetailUpdate) { + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(PlanDetailUpdate: "); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + return this; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanDetailUpdateList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanDetailUpdateList.java new file mode 100644 index 00000000..9a63ed6a --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanDetailUpdateList.java @@ -0,0 +1,23 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for PlanDetailUpdate. + */ +public final class PlanDetailUpdateList extends org.ccsds.moims.mo.mal.structures.HeterogeneousList { + + /** + * Default constructor for PlanDetailUpdateList. + * + */ + public PlanDetailUpdateList() { + } + + @Override + public boolean add(org.ccsds.moims.mo.mal.structures.Element element) { + if (element != null && !(element instanceof PlanDetailUpdate)) { + throw new java.lang.ClassCastException("The added element does not extend the type: PlanDetailUpdate"); + } + return super.add(element); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanFilter.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanFilter.java new file mode 100644 index 00000000..c7d2f948 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanFilter.java @@ -0,0 +1,255 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E1: PlanFilter is a data structure used in the context of MPS Plan Distribution + * Service operations to specify a filtered set of Plans. . + */ +public final class PlanFilter implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1407374900331012L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900331012L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Domain of the Plan. An ordered list representing a domain hierarchy, ‘*’ + * can be used to represent a wildcard at that level. + */ + private org.ccsds.moims.mo.mal.structures.IdentifierList domain; + + /** + * Reference to the Plan. + */ + private org.ccsds.moims.mo.mal.structures.ObjectRef planID; + + /** + * Reference to the precursor Plan of the Plan. + */ + private org.ccsds.moims.mo.mal.structures.ObjectRef precursorPlan; + + /** + * Current status (enum) of the Plan. + */ + private org.ccsds.moims.mo.mps.structures.PlanStatusEnum status; + + /** + * Originator of the Plan. + */ + private org.ccsds.moims.mo.mal.structures.Identifier originator; + + /** + * Period of time with which the validity period of the Plan overlaps. + */ + private org.ccsds.moims.mo.mps.structures.TimeWindow validityPeriod; + + /** + * Default constructor for PlanFilter. + * + */ + public PlanFilter() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param domain Domain of the Plan. An ordered list representing a domain hierarchy, ‘*’ can be used to represent a wildcard at that level. + * @param planID Reference to the Plan. + * @param precursorPlan Reference to the precursor Plan of the Plan. + * @param status Current status (enum) of the Plan. + * @param originator Originator of the Plan. + * @param validityPeriod Period of time with which the validity period of the Plan overlaps. + */ + public PlanFilter(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.ObjectRef planID, + org.ccsds.moims.mo.mal.structures.ObjectRef precursorPlan, + org.ccsds.moims.mo.mps.structures.PlanStatusEnum status, + org.ccsds.moims.mo.mal.structures.Identifier originator, + org.ccsds.moims.mo.mps.structures.TimeWindow validityPeriod) { + this.domain = domain; + this.planID = planID; + this.precursorPlan = precursorPlan; + this.status = status; + this.originator = originator; + this.validityPeriod = validityPeriod; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.PlanFilter(); + } + + /** + * Returns the field domain. + * + * @return The field domain + */ + public org.ccsds.moims.mo.mal.structures.IdentifierList getDomain() { + return domain; + } + + /** + * Returns the field planID. + * + * @return The field planID + */ + public org.ccsds.moims.mo.mal.structures.ObjectRef getPlanID() { + return planID; + } + + /** + * Returns the field precursorPlan. + * + * @return The field precursorPlan + */ + public org.ccsds.moims.mo.mal.structures.ObjectRef getPrecursorPlan() { + return precursorPlan; + } + + /** + * Returns the field status. + * + * @return The field status + */ + public org.ccsds.moims.mo.mps.structures.PlanStatusEnum getStatus() { + return status; + } + + /** + * Returns the field originator. + * + * @return The field originator + */ + public org.ccsds.moims.mo.mal.structures.Identifier getOriginator() { + return originator; + } + + /** + * Returns the field validityPeriod. + * + * @return The field validityPeriod + */ + public org.ccsds.moims.mo.mps.structures.TimeWindow getValidityPeriod() { + return validityPeriod; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof PlanFilter) { + PlanFilter other = (PlanFilter) obj; + if (domain == null) { + if (other.domain != null) { + return false; + } + } else { + if (! domain.equals(other.domain)) { + return false; + } + } + if (planID == null) { + if (other.planID != null) { + return false; + } + } else { + if (! planID.equals(other.planID)) { + return false; + } + } + if (precursorPlan == null) { + if (other.precursorPlan != null) { + return false; + } + } else { + if (! precursorPlan.equals(other.precursorPlan)) { + return false; + } + } + if (status == null) { + if (other.status != null) { + return false; + } + } else { + if (! status.equals(other.status)) { + return false; + } + } + if (originator == null) { + if (other.originator != null) { + return false; + } + } else { + if (! originator.equals(other.originator)) { + return false; + } + } + if (validityPeriod == null) { + if (other.validityPeriod != null) { + return false; + } + } else { + if (! validityPeriod.equals(other.validityPeriod)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (domain != null ? domain.hashCode() : 0); + hash = 83 * hash + (planID != null ? planID.hashCode() : 0); + hash = 83 * hash + (precursorPlan != null ? precursorPlan.hashCode() : 0); + hash = 83 * hash + (status != null ? status.hashCode() : 0); + hash = 83 * hash + (originator != null ? originator.hashCode() : 0); + hash = 83 * hash + (validityPeriod != null ? validityPeriod.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(PlanFilter: "); + buf.append("domain=").append(domain); + buf.append(", planID=").append(planID); + buf.append(", precursorPlan=").append(precursorPlan); + buf.append(", status=").append(status); + buf.append(", originator=").append(originator); + buf.append(", validityPeriod=").append(validityPeriod); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeNullableElement(domain); + encoder.encodeNullableElement(planID); + encoder.encodeNullableElement(precursorPlan); + encoder.encodeNullableElement(status); + encoder.encodeNullableIdentifier(originator); + encoder.encodeNullableElement(validityPeriod); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + domain = (org.ccsds.moims.mo.mal.structures.IdentifierList) decoder.decodeNullableElement(new org.ccsds.moims.mo.mal.structures.IdentifierList()); + planID = (org.ccsds.moims.mo.mal.structures.ObjectRef) decoder.decodeNullableElement(new org.ccsds.moims.mo.mal.structures.ObjectRef()); + precursorPlan = (org.ccsds.moims.mo.mal.structures.ObjectRef) decoder.decodeNullableElement(new org.ccsds.moims.mo.mal.structures.ObjectRef()); + status = (org.ccsds.moims.mo.mps.structures.PlanStatusEnum) decoder.decodeNullableElement(org.ccsds.moims.mo.mps.structures.PlanStatusEnum.DRAFT); + originator = decoder.decodeNullableIdentifier(); + validityPeriod = (org.ccsds.moims.mo.mps.structures.TimeWindow) decoder.decodeNullableElement(new org.ccsds.moims.mo.mps.structures.TimeWindow()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanFilterList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanFilterList.java new file mode 100644 index 00000000..949d8384 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanFilterList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for PlanFilter. + */ +public final class PlanFilterList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107196L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107196L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for PlanFilterList. + * + */ + public PlanFilterList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public PlanFilterList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public PlanFilterList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.PlanFilter element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.PlanFilter element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new PlanFilterList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.PlanFilter(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanInformation.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanInformation.java new file mode 100644 index 00000000..b42ccc03 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanInformation.java @@ -0,0 +1,405 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E1: The PlanInformation section of a plan contains administrative and validity + * details associated with the plan as a whole. + */ +public final class PlanInformation implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1407374900330999L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330999L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Identity of the entity or system responsible for the production of the + * plan. The implementing planning system is responsible for defining the + * value to be provided for this field. + */ + private org.ccsds.moims.mo.mal.structures.Identifier originator; + + /** + * Date and time of production of the plan. + */ + private org.ccsds.moims.mo.mal.structures.Time productionTime; + + /** + * Description of the plan. + */ + private String description; + + /** + * Field for additional comments or notes to the operations team regarding + * the plan. + */ + private String comments; + + /** + * Start of validity period for the plan. The validity period defines when + * the plan is available for operational use. It cannot be used outside its + * validity period. + */ + private org.ccsds.moims.mo.mal.structures.Time validityStart; + + /** + * End of validity period for the plan. + */ + private org.ccsds.moims.mo.mal.structures.Time validityEnd; + + /** + * Start of the plan period. The plan period defines the start and end points + * of the plan. Planned items (planning activities and events) contained + * within the plan must at least partially overlap the plan period. The use + * of the trigger structure allows this to be specified in terms of time, + * position, pointing, or planning events. Examples are: - a specified period + * of time; - an orbital repeat cycle; - a period between two events. + */ + private org.ccsds.moims.mo.mps.structures.Trigger planPeriodStart; + + /** + * End of the plan period. + */ + private org.ccsds.moims.mo.mps.structures.Trigger planPeriodEnd; + + /** + * Specifies the time system used for all time fields within the Plan (see + * 4.4.1). If Null, the default time system is used. + */ + private org.ccsds.moims.mo.mal.structures.Identifier timeSystem; + + /** + * Default constructor for PlanInformation. + * + */ + public PlanInformation() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param originator Identity of the entity or system responsible for the production of the plan. The implementing planning system is responsible for defining the value to be provided for this field. + * @param productionTime Date and time of production of the plan. + * @param description Description of the plan. + * @param comments Field for additional comments or notes to the operations team regarding the plan. + * @param validityStart Start of validity period for the plan. The validity period defines when the plan is available for operational use. It cannot be used outside its validity period. + * @param validityEnd End of validity period for the plan. + * @param planPeriodStart Start of the plan period. The plan period defines the start and end points of the plan. Planned items (planning activities and events) contained within the plan must at least partially overlap the plan period. The use of the trigger structure allows this to be specified in terms of time, position, pointing, or planning events. Examples are: - a specified period of time; - an orbital repeat cycle; - a period between two events. + * @param planPeriodEnd End of the plan period. + * @param timeSystem Specifies the time system used for all time fields within the Plan (see 4.4.1). If Null, the default time system is used. + */ + public PlanInformation(org.ccsds.moims.mo.mal.structures.Identifier originator, + org.ccsds.moims.mo.mal.structures.Time productionTime, + String description, + String comments, + org.ccsds.moims.mo.mal.structures.Time validityStart, + org.ccsds.moims.mo.mal.structures.Time validityEnd, + org.ccsds.moims.mo.mps.structures.Trigger planPeriodStart, + org.ccsds.moims.mo.mps.structures.Trigger planPeriodEnd, + org.ccsds.moims.mo.mal.structures.Identifier timeSystem) { + this.originator = originator; + this.productionTime = productionTime; + this.description = description; + this.comments = comments; + this.validityStart = validityStart; + this.validityEnd = validityEnd; + this.planPeriodStart = planPeriodStart; + this.planPeriodEnd = planPeriodEnd; + this.timeSystem = timeSystem; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param originator Identity of the entity or system responsible for the production of the plan. The implementing planning system is responsible for defining the value to be provided for this field. + * @param productionTime Date and time of production of the plan. + * @param description Description of the plan. + * @param validityStart Start of validity period for the plan. The validity period defines when the plan is available for operational use. It cannot be used outside its validity period. + * @param validityEnd End of validity period for the plan. + * @param planPeriodStart Start of the plan period. The plan period defines the start and end points of the plan. Planned items (planning activities and events) contained within the plan must at least partially overlap the plan period. The use of the trigger structure allows this to be specified in terms of time, position, pointing, or planning events. Examples are: - a specified period of time; - an orbital repeat cycle; - a period between two events. + * @param planPeriodEnd End of the plan period. + */ + public PlanInformation(org.ccsds.moims.mo.mal.structures.Identifier originator, + org.ccsds.moims.mo.mal.structures.Time productionTime, + String description, + org.ccsds.moims.mo.mal.structures.Time validityStart, + org.ccsds.moims.mo.mal.structures.Time validityEnd, + org.ccsds.moims.mo.mps.structures.Trigger planPeriodStart, + org.ccsds.moims.mo.mps.structures.Trigger planPeriodEnd) { + this.originator = originator; + this.productionTime = productionTime; + this.description = description; + this.comments = null; + this.validityStart = validityStart; + this.validityEnd = validityEnd; + this.planPeriodStart = planPeriodStart; + this.planPeriodEnd = planPeriodEnd; + this.timeSystem = null; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.PlanInformation(); + } + + /** + * Returns the field originator. + * + * @return The field originator + */ + public org.ccsds.moims.mo.mal.structures.Identifier getOriginator() { + return originator; + } + + /** + * Returns the field productionTime. + * + * @return The field productionTime + */ + public org.ccsds.moims.mo.mal.structures.Time getProductionTime() { + return productionTime; + } + + /** + * Returns the field description. + * + * @return The field description + */ + public String getDescription() { + return description; + } + + /** + * Returns the field comments. + * + * @return The field comments + */ + public String getComments() { + return comments; + } + + /** + * Returns the field validityStart. + * + * @return The field validityStart + */ + public org.ccsds.moims.mo.mal.structures.Time getValidityStart() { + return validityStart; + } + + /** + * Returns the field validityEnd. + * + * @return The field validityEnd + */ + public org.ccsds.moims.mo.mal.structures.Time getValidityEnd() { + return validityEnd; + } + + /** + * Returns the field planPeriodStart. + * + * @return The field planPeriodStart + */ + public org.ccsds.moims.mo.mps.structures.Trigger getPlanPeriodStart() { + return planPeriodStart; + } + + /** + * Returns the field planPeriodEnd. + * + * @return The field planPeriodEnd + */ + public org.ccsds.moims.mo.mps.structures.Trigger getPlanPeriodEnd() { + return planPeriodEnd; + } + + /** + * Returns the field timeSystem. + * + * @return The field timeSystem + */ + public org.ccsds.moims.mo.mal.structures.Identifier getTimeSystem() { + return timeSystem; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof PlanInformation) { + PlanInformation other = (PlanInformation) obj; + if (originator == null) { + if (other.originator != null) { + return false; + } + } else { + if (! originator.equals(other.originator)) { + return false; + } + } + if (productionTime == null) { + if (other.productionTime != null) { + return false; + } + } else { + if (! productionTime.equals(other.productionTime)) { + return false; + } + } + if (description == null) { + if (other.description != null) { + return false; + } + } else { + if (! description.equals(other.description)) { + return false; + } + } + if (comments == null) { + if (other.comments != null) { + return false; + } + } else { + if (! comments.equals(other.comments)) { + return false; + } + } + if (validityStart == null) { + if (other.validityStart != null) { + return false; + } + } else { + if (! validityStart.equals(other.validityStart)) { + return false; + } + } + if (validityEnd == null) { + if (other.validityEnd != null) { + return false; + } + } else { + if (! validityEnd.equals(other.validityEnd)) { + return false; + } + } + if (planPeriodStart == null) { + if (other.planPeriodStart != null) { + return false; + } + } else { + if (! planPeriodStart.equals(other.planPeriodStart)) { + return false; + } + } + if (planPeriodEnd == null) { + if (other.planPeriodEnd != null) { + return false; + } + } else { + if (! planPeriodEnd.equals(other.planPeriodEnd)) { + return false; + } + } + if (timeSystem == null) { + if (other.timeSystem != null) { + return false; + } + } else { + if (! timeSystem.equals(other.timeSystem)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (originator != null ? originator.hashCode() : 0); + hash = 83 * hash + (productionTime != null ? productionTime.hashCode() : 0); + hash = 83 * hash + (description != null ? description.hashCode() : 0); + hash = 83 * hash + (comments != null ? comments.hashCode() : 0); + hash = 83 * hash + (validityStart != null ? validityStart.hashCode() : 0); + hash = 83 * hash + (validityEnd != null ? validityEnd.hashCode() : 0); + hash = 83 * hash + (planPeriodStart != null ? planPeriodStart.hashCode() : 0); + hash = 83 * hash + (planPeriodEnd != null ? planPeriodEnd.hashCode() : 0); + hash = 83 * hash + (timeSystem != null ? timeSystem.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(PlanInformation: "); + buf.append("originator=").append(originator); + buf.append(", productionTime=").append(productionTime); + buf.append(", description=").append(description); + buf.append(", comments=").append(comments); + buf.append(", validityStart=").append(validityStart); + buf.append(", validityEnd=").append(validityEnd); + buf.append(", planPeriodStart=").append(planPeriodStart); + buf.append(", planPeriodEnd=").append(planPeriodEnd); + buf.append(", timeSystem=").append(timeSystem); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (originator == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'originator' cannot be null!"); + } + if (productionTime == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'productionTime' cannot be null!"); + } + if (description == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'description' cannot be null!"); + } + if (validityStart == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'validityStart' cannot be null!"); + } + if (validityEnd == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'validityEnd' cannot be null!"); + } + if (planPeriodStart == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'planPeriodStart' cannot be null!"); + } + if (planPeriodEnd == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'planPeriodEnd' cannot be null!"); + } + encoder.encodeIdentifier(originator); + encoder.encodeTime(productionTime); + encoder.encodeString(description); + encoder.encodeNullableString(comments); + encoder.encodeTime(validityStart); + encoder.encodeTime(validityEnd); + encoder.encodeAbstractElement(planPeriodStart); + encoder.encodeAbstractElement(planPeriodEnd); + encoder.encodeNullableIdentifier(timeSystem); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + originator = decoder.decodeIdentifier(); + productionTime = decoder.decodeTime(); + description = decoder.decodeString(); + comments = decoder.decodeNullableString(); + validityStart = decoder.decodeTime(); + validityEnd = decoder.decodeTime(); + planPeriodStart = (org.ccsds.moims.mo.mps.structures.Trigger) decoder.decodeAbstractElement(); + planPeriodEnd = (org.ccsds.moims.mo.mps.structures.Trigger) decoder.decodeAbstractElement(); + timeSystem = decoder.decodeNullableIdentifier(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanInformationList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanInformationList.java new file mode 100644 index 00000000..afe6e4c1 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanInformationList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for PlanInformation. + */ +public final class PlanInformationList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107209L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107209L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for PlanInformationList. + * + */ + public PlanInformationList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public PlanInformationList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public PlanInformationList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.PlanInformation element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.PlanInformation element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new PlanInformationList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.PlanInformation(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanList.java new file mode 100644 index 00000000..8e590b0d --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for Plan. + */ +public final class PlanList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107211L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107211L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for PlanList. + * + */ + public PlanList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public PlanList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public PlanList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.Plan element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.Plan element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new PlanList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.Plan(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanQuery.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanQuery.java new file mode 100644 index 00000000..27b054eb --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanQuery.java @@ -0,0 +1,512 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E1: PlanQuery is a data structure used in the context of queryPlan operation + * of the MPS Plan Distribution Service. It is used to specify search criteria + * for querying the available set of Plans. . + */ +public final class PlanQuery implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1407374900331010L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900331010L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Query for Plans with the specified PlanID. + */ + private org.ccsds.moims.mo.mal.structures.ObjectRef planID; + + /** + * Query for Plans with or without a precursor. + */ + private Boolean hasPrecursor; + + /** + * Query for Plans that are or are not patch plans. + */ + private Boolean isPatchPlan; + + /** + * Query for Plans with the specified precursor Plan. + */ + private org.ccsds.moims.mo.mal.structures.ObjectRef precursorPlan; + + /** + * Applicable only for patch plans. Query for patch plans that have the specified + * target Plan. + */ + private org.ccsds.moims.mo.mal.structures.ObjectRef targetPlan; + + /** + * Query for Plans with the specified originator. + */ + private org.ccsds.moims.mo.mal.structures.Identifier originator; + + /** + * Query for Plans with a production date in the specified range. + */ + private org.ccsds.moims.mo.mps.structures.TimeWindow productionTime; + + /** + * Query for Plans with a validity period within (overlapping with) the specified + * range. + */ + private org.ccsds.moims.mo.mps.structures.TimeWindow validityPeriod; + + /** + * Query for Plans that are or are not Alternate plans. + */ + private Boolean isAlternate; + + /** + * Query for Plans that have a current status matching one of the specified + * Plan statuses. + */ + private org.ccsds.moims.mo.mps.structures.PlanStatusEnumList status; + + /** + * Query for Plans that contain EventInstances inside plannedItems whose definition + * matches one of the specified EventDefinitions. + */ + private org.ccsds.moims.mo.mal.structures.ObjectRefList plannedEvents; + + /** + * Query for Plans that contain ActivityInstances inside plannedItems whose + * definition matches one of the specified ActivityDefinitions. + */ + private org.ccsds.moims.mo.mal.structures.ObjectRefList plannedActivities; + + /** + * Query for patch plans that contain EventInstances inside their revisions + * whose definition matches one of the specified EventDefinitions. If the + * revisionStatus is either New or Modified, then the EventInstances in the + * current plan shall be checked. If the revisionStatus is either Deleted + * or Undefined, then the EventInstances in the revised plan shall be checked. + * If the revised plan is not available anymore, then the result will depend + * on the implementation. + */ + private org.ccsds.moims.mo.mal.structures.ObjectRefList revisedEvents; + + /** + * Query for patch plans that contain ActivityInstances inside their revisions + * whose definition matches one of the specified ActivityDefinitions. If the + * revisionStatus is either New or Modified, then the ActivityInstances in + * the current plan shall be checked. If the revisionStatus is either Deleted + * or Undefined, then the ActivityInstances in the revised plan shall be checked. + * If the revised plan is not available anymore, then the result will depend + * on the implementation. + */ + private org.ccsds.moims.mo.mal.structures.ObjectRefList revisedActivities; + + /** + * Default constructor for PlanQuery. + * + */ + public PlanQuery() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param planID Query for Plans with the specified PlanID. + * @param hasPrecursor Query for Plans with or without a precursor. + * @param isPatchPlan Query for Plans that are or are not patch plans. + * @param precursorPlan Query for Plans with the specified precursor Plan. + * @param targetPlan Applicable only for patch plans. Query for patch plans that have the specified target Plan. + * @param originator Query for Plans with the specified originator. + * @param productionTime Query for Plans with a production date in the specified range. + * @param validityPeriod Query for Plans with a validity period within (overlapping with) the specified range. + * @param isAlternate Query for Plans that are or are not Alternate plans. + * @param status Query for Plans that have a current status matching one of the specified Plan statuses. + * @param plannedEvents Query for Plans that contain EventInstances inside plannedItems whose definition matches one of the specified EventDefinitions. + * @param plannedActivities Query for Plans that contain ActivityInstances inside plannedItems whose definition matches one of the specified ActivityDefinitions. + * @param revisedEvents Query for patch plans that contain EventInstances inside their revisions whose definition matches one of the specified EventDefinitions. If the revisionStatus is either New or Modified, then the EventInstances in the current plan shall be checked. If the revisionStatus is either Deleted or Undefined, then the EventInstances in the revised plan shall be checked. If the revised plan is not available anymore, then the result will depend on the implementation. + * @param revisedActivities Query for patch plans that contain ActivityInstances inside their revisions whose definition matches one of the specified ActivityDefinitions. If the revisionStatus is either New or Modified, then the ActivityInstances in the current plan shall be checked. If the revisionStatus is either Deleted or Undefined, then the ActivityInstances in the revised plan shall be checked. If the revised plan is not available anymore, then the result will depend on the implementation. + */ + public PlanQuery(org.ccsds.moims.mo.mal.structures.ObjectRef planID, + Boolean hasPrecursor, + Boolean isPatchPlan, + org.ccsds.moims.mo.mal.structures.ObjectRef precursorPlan, + org.ccsds.moims.mo.mal.structures.ObjectRef targetPlan, + org.ccsds.moims.mo.mal.structures.Identifier originator, + org.ccsds.moims.mo.mps.structures.TimeWindow productionTime, + org.ccsds.moims.mo.mps.structures.TimeWindow validityPeriod, + Boolean isAlternate, + org.ccsds.moims.mo.mps.structures.PlanStatusEnumList status, + org.ccsds.moims.mo.mal.structures.ObjectRefList plannedEvents, + org.ccsds.moims.mo.mal.structures.ObjectRefList plannedActivities, + org.ccsds.moims.mo.mal.structures.ObjectRefList revisedEvents, + org.ccsds.moims.mo.mal.structures.ObjectRefList revisedActivities) { + this.planID = planID; + this.hasPrecursor = hasPrecursor; + this.isPatchPlan = isPatchPlan; + this.precursorPlan = precursorPlan; + this.targetPlan = targetPlan; + this.originator = originator; + this.productionTime = productionTime; + this.validityPeriod = validityPeriod; + this.isAlternate = isAlternate; + this.status = status; + this.plannedEvents = plannedEvents; + this.plannedActivities = plannedActivities; + this.revisedEvents = revisedEvents; + this.revisedActivities = revisedActivities; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.PlanQuery(); + } + + /** + * Returns the field planID. + * + * @return The field planID + */ + public org.ccsds.moims.mo.mal.structures.ObjectRef getPlanID() { + return planID; + } + + /** + * Returns the field hasPrecursor. + * + * @return The field hasPrecursor + */ + public Boolean getHasPrecursor() { + return hasPrecursor; + } + + /** + * Returns the field isPatchPlan. + * + * @return The field isPatchPlan + */ + public Boolean getIsPatchPlan() { + return isPatchPlan; + } + + /** + * Returns the field precursorPlan. + * + * @return The field precursorPlan + */ + public org.ccsds.moims.mo.mal.structures.ObjectRef getPrecursorPlan() { + return precursorPlan; + } + + /** + * Returns the field targetPlan. + * + * @return The field targetPlan + */ + public org.ccsds.moims.mo.mal.structures.ObjectRef getTargetPlan() { + return targetPlan; + } + + /** + * Returns the field originator. + * + * @return The field originator + */ + public org.ccsds.moims.mo.mal.structures.Identifier getOriginator() { + return originator; + } + + /** + * Returns the field productionTime. + * + * @return The field productionTime + */ + public org.ccsds.moims.mo.mps.structures.TimeWindow getProductionTime() { + return productionTime; + } + + /** + * Returns the field validityPeriod. + * + * @return The field validityPeriod + */ + public org.ccsds.moims.mo.mps.structures.TimeWindow getValidityPeriod() { + return validityPeriod; + } + + /** + * Returns the field isAlternate. + * + * @return The field isAlternate + */ + public Boolean getIsAlternate() { + return isAlternate; + } + + /** + * Returns the field status. + * + * @return The field status + */ + public org.ccsds.moims.mo.mps.structures.PlanStatusEnumList getStatus() { + return status; + } + + /** + * Returns the field plannedEvents. + * + * @return The field plannedEvents + */ + public org.ccsds.moims.mo.mal.structures.ObjectRefList getPlannedEvents() { + return plannedEvents; + } + + /** + * Returns the field plannedActivities. + * + * @return The field plannedActivities + */ + public org.ccsds.moims.mo.mal.structures.ObjectRefList getPlannedActivities() { + return plannedActivities; + } + + /** + * Returns the field revisedEvents. + * + * @return The field revisedEvents + */ + public org.ccsds.moims.mo.mal.structures.ObjectRefList getRevisedEvents() { + return revisedEvents; + } + + /** + * Returns the field revisedActivities. + * + * @return The field revisedActivities + */ + public org.ccsds.moims.mo.mal.structures.ObjectRefList getRevisedActivities() { + return revisedActivities; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof PlanQuery) { + PlanQuery other = (PlanQuery) obj; + if (planID == null) { + if (other.planID != null) { + return false; + } + } else { + if (! planID.equals(other.planID)) { + return false; + } + } + if (hasPrecursor == null) { + if (other.hasPrecursor != null) { + return false; + } + } else { + if (! hasPrecursor.equals(other.hasPrecursor)) { + return false; + } + } + if (isPatchPlan == null) { + if (other.isPatchPlan != null) { + return false; + } + } else { + if (! isPatchPlan.equals(other.isPatchPlan)) { + return false; + } + } + if (precursorPlan == null) { + if (other.precursorPlan != null) { + return false; + } + } else { + if (! precursorPlan.equals(other.precursorPlan)) { + return false; + } + } + if (targetPlan == null) { + if (other.targetPlan != null) { + return false; + } + } else { + if (! targetPlan.equals(other.targetPlan)) { + return false; + } + } + if (originator == null) { + if (other.originator != null) { + return false; + } + } else { + if (! originator.equals(other.originator)) { + return false; + } + } + if (productionTime == null) { + if (other.productionTime != null) { + return false; + } + } else { + if (! productionTime.equals(other.productionTime)) { + return false; + } + } + if (validityPeriod == null) { + if (other.validityPeriod != null) { + return false; + } + } else { + if (! validityPeriod.equals(other.validityPeriod)) { + return false; + } + } + if (isAlternate == null) { + if (other.isAlternate != null) { + return false; + } + } else { + if (! isAlternate.equals(other.isAlternate)) { + return false; + } + } + if (status == null) { + if (other.status != null) { + return false; + } + } else { + if (! status.equals(other.status)) { + return false; + } + } + if (plannedEvents == null) { + if (other.plannedEvents != null) { + return false; + } + } else { + if (! plannedEvents.equals(other.plannedEvents)) { + return false; + } + } + if (plannedActivities == null) { + if (other.plannedActivities != null) { + return false; + } + } else { + if (! plannedActivities.equals(other.plannedActivities)) { + return false; + } + } + if (revisedEvents == null) { + if (other.revisedEvents != null) { + return false; + } + } else { + if (! revisedEvents.equals(other.revisedEvents)) { + return false; + } + } + if (revisedActivities == null) { + if (other.revisedActivities != null) { + return false; + } + } else { + if (! revisedActivities.equals(other.revisedActivities)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (planID != null ? planID.hashCode() : 0); + hash = 83 * hash + (hasPrecursor != null ? hasPrecursor.hashCode() : 0); + hash = 83 * hash + (isPatchPlan != null ? isPatchPlan.hashCode() : 0); + hash = 83 * hash + (precursorPlan != null ? precursorPlan.hashCode() : 0); + hash = 83 * hash + (targetPlan != null ? targetPlan.hashCode() : 0); + hash = 83 * hash + (originator != null ? originator.hashCode() : 0); + hash = 83 * hash + (productionTime != null ? productionTime.hashCode() : 0); + hash = 83 * hash + (validityPeriod != null ? validityPeriod.hashCode() : 0); + hash = 83 * hash + (isAlternate != null ? isAlternate.hashCode() : 0); + hash = 83 * hash + (status != null ? status.hashCode() : 0); + hash = 83 * hash + (plannedEvents != null ? plannedEvents.hashCode() : 0); + hash = 83 * hash + (plannedActivities != null ? plannedActivities.hashCode() : 0); + hash = 83 * hash + (revisedEvents != null ? revisedEvents.hashCode() : 0); + hash = 83 * hash + (revisedActivities != null ? revisedActivities.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(PlanQuery: "); + buf.append("planID=").append(planID); + buf.append(", hasPrecursor=").append(hasPrecursor); + buf.append(", isPatchPlan=").append(isPatchPlan); + buf.append(", precursorPlan=").append(precursorPlan); + buf.append(", targetPlan=").append(targetPlan); + buf.append(", originator=").append(originator); + buf.append(", productionTime=").append(productionTime); + buf.append(", validityPeriod=").append(validityPeriod); + buf.append(", isAlternate=").append(isAlternate); + buf.append(", status=").append(status); + buf.append(", plannedEvents=").append(plannedEvents); + buf.append(", plannedActivities=").append(plannedActivities); + buf.append(", revisedEvents=").append(revisedEvents); + buf.append(", revisedActivities=").append(revisedActivities); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeNullableElement(planID); + encoder.encodeNullableBoolean(hasPrecursor); + encoder.encodeNullableBoolean(isPatchPlan); + encoder.encodeNullableElement(precursorPlan); + encoder.encodeNullableElement(targetPlan); + encoder.encodeNullableIdentifier(originator); + encoder.encodeNullableElement(productionTime); + encoder.encodeNullableElement(validityPeriod); + encoder.encodeNullableBoolean(isAlternate); + encoder.encodeNullableElement(status); + encoder.encodeNullableElement(plannedEvents); + encoder.encodeNullableElement(plannedActivities); + encoder.encodeNullableElement(revisedEvents); + encoder.encodeNullableElement(revisedActivities); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + planID = (org.ccsds.moims.mo.mal.structures.ObjectRef) decoder.decodeNullableElement(new org.ccsds.moims.mo.mal.structures.ObjectRef()); + hasPrecursor = decoder.decodeNullableBoolean(); + isPatchPlan = decoder.decodeNullableBoolean(); + precursorPlan = (org.ccsds.moims.mo.mal.structures.ObjectRef) decoder.decodeNullableElement(new org.ccsds.moims.mo.mal.structures.ObjectRef()); + targetPlan = (org.ccsds.moims.mo.mal.structures.ObjectRef) decoder.decodeNullableElement(new org.ccsds.moims.mo.mal.structures.ObjectRef()); + originator = decoder.decodeNullableIdentifier(); + productionTime = (org.ccsds.moims.mo.mps.structures.TimeWindow) decoder.decodeNullableElement(new org.ccsds.moims.mo.mps.structures.TimeWindow()); + validityPeriod = (org.ccsds.moims.mo.mps.structures.TimeWindow) decoder.decodeNullableElement(new org.ccsds.moims.mo.mps.structures.TimeWindow()); + isAlternate = decoder.decodeNullableBoolean(); + status = (org.ccsds.moims.mo.mps.structures.PlanStatusEnumList) decoder.decodeNullableElement(new org.ccsds.moims.mo.mps.structures.PlanStatusEnumList()); + plannedEvents = (org.ccsds.moims.mo.mal.structures.ObjectRefList) decoder.decodeNullableElement(new org.ccsds.moims.mo.mal.structures.ObjectRefList()); + plannedActivities = (org.ccsds.moims.mo.mal.structures.ObjectRefList) decoder.decodeNullableElement(new org.ccsds.moims.mo.mal.structures.ObjectRefList()); + revisedEvents = (org.ccsds.moims.mo.mal.structures.ObjectRefList) decoder.decodeNullableElement(new org.ccsds.moims.mo.mal.structures.ObjectRefList()); + revisedActivities = (org.ccsds.moims.mo.mal.structures.ObjectRefList) decoder.decodeNullableElement(new org.ccsds.moims.mo.mal.structures.ObjectRefList()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanQueryList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanQueryList.java new file mode 100644 index 00000000..46fa12fc --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanQueryList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for PlanQuery. + */ +public final class PlanQueryList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107198L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107198L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for PlanQueryList. + * + */ + public PlanQueryList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public PlanQueryList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public PlanQueryList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.PlanQuery element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.PlanQuery element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new PlanQueryList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.PlanQuery(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanRevision.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanRevision.java new file mode 100644 index 00000000..f43837dc --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanRevision.java @@ -0,0 +1,224 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E3: Each PlanRevision comprises an ordered set of ItemRevisions that document + * the change to individual planned items (planning events and activities). + * Each ItemRevision references an individual EventInstance or ActivityInstance + * and indicates whether the planned item is new, modified or deleted in the + * current Plan. + */ +public final class PlanRevision implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1407374900331001L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900331001L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Reference to the Plan with respect to which the plan revisions are detailed. + * Typically, this is the precursor Plan, but any other Plan can be used. + */ + private org.ccsds.moims.mo.mal.structures.ObjectRef revisedPlan; + + /** + * Start time of the earliest revision. + */ + private org.ccsds.moims.mo.mal.structures.Time revisionStart; + + /** + * End time of the latest revision. + */ + private org.ccsds.moims.mo.mal.structures.Time revisionEnd; + + /** + * Ordered list (earliest to latest) of revisions to planned items (activity + * and event instances). + */ + private org.ccsds.moims.mo.mps.structures.ItemRevisionList itemRevisions; + + /** + * Default constructor for PlanRevision. + * + */ + public PlanRevision() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param revisedPlan Reference to the Plan with respect to which the plan revisions are detailed. Typically, this is the precursor Plan, but any other Plan can be used. + * @param revisionStart Start time of the earliest revision. + * @param revisionEnd End time of the latest revision. + * @param itemRevisions Ordered list (earliest to latest) of revisions to planned items (activity and event instances). + */ + public PlanRevision(org.ccsds.moims.mo.mal.structures.ObjectRef revisedPlan, + org.ccsds.moims.mo.mal.structures.Time revisionStart, + org.ccsds.moims.mo.mal.structures.Time revisionEnd, + org.ccsds.moims.mo.mps.structures.ItemRevisionList itemRevisions) { + this.revisedPlan = revisedPlan; + this.revisionStart = revisionStart; + this.revisionEnd = revisionEnd; + this.itemRevisions = itemRevisions; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param revisedPlan Reference to the Plan with respect to which the plan revisions are detailed. Typically, this is the precursor Plan, but any other Plan can be used. + * @param revisionStart Start time of the earliest revision. + * @param revisionEnd End time of the latest revision. + */ + public PlanRevision(org.ccsds.moims.mo.mal.structures.ObjectRef revisedPlan, + org.ccsds.moims.mo.mal.structures.Time revisionStart, + org.ccsds.moims.mo.mal.structures.Time revisionEnd) { + this.revisedPlan = revisedPlan; + this.revisionStart = revisionStart; + this.revisionEnd = revisionEnd; + this.itemRevisions = null; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.PlanRevision(); + } + + /** + * Returns the field revisedPlan. + * + * @return The field revisedPlan + */ + public org.ccsds.moims.mo.mal.structures.ObjectRef getRevisedPlan() { + return revisedPlan; + } + + /** + * Returns the field revisionStart. + * + * @return The field revisionStart + */ + public org.ccsds.moims.mo.mal.structures.Time getRevisionStart() { + return revisionStart; + } + + /** + * Returns the field revisionEnd. + * + * @return The field revisionEnd + */ + public org.ccsds.moims.mo.mal.structures.Time getRevisionEnd() { + return revisionEnd; + } + + /** + * Returns the field itemRevisions. + * + * @return The field itemRevisions + */ + public org.ccsds.moims.mo.mps.structures.ItemRevisionList getItemRevisions() { + return itemRevisions; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof PlanRevision) { + PlanRevision other = (PlanRevision) obj; + if (revisedPlan == null) { + if (other.revisedPlan != null) { + return false; + } + } else { + if (! revisedPlan.equals(other.revisedPlan)) { + return false; + } + } + if (revisionStart == null) { + if (other.revisionStart != null) { + return false; + } + } else { + if (! revisionStart.equals(other.revisionStart)) { + return false; + } + } + if (revisionEnd == null) { + if (other.revisionEnd != null) { + return false; + } + } else { + if (! revisionEnd.equals(other.revisionEnd)) { + return false; + } + } + if (itemRevisions == null) { + if (other.itemRevisions != null) { + return false; + } + } else { + if (! itemRevisions.equals(other.itemRevisions)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (revisedPlan != null ? revisedPlan.hashCode() : 0); + hash = 83 * hash + (revisionStart != null ? revisionStart.hashCode() : 0); + hash = 83 * hash + (revisionEnd != null ? revisionEnd.hashCode() : 0); + hash = 83 * hash + (itemRevisions != null ? itemRevisions.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(PlanRevision: "); + buf.append("revisedPlan=").append(revisedPlan); + buf.append(", revisionStart=").append(revisionStart); + buf.append(", revisionEnd=").append(revisionEnd); + buf.append(", itemRevisions=").append(itemRevisions); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (revisedPlan == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'revisedPlan' cannot be null!"); + } + if (revisionStart == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'revisionStart' cannot be null!"); + } + if (revisionEnd == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'revisionEnd' cannot be null!"); + } + encoder.encodeElement(revisedPlan); + encoder.encodeTime(revisionStart); + encoder.encodeTime(revisionEnd); + encoder.encodeNullableElement(itemRevisions); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + revisedPlan = (org.ccsds.moims.mo.mal.structures.ObjectRef) decoder.decodeElement(new org.ccsds.moims.mo.mal.structures.ObjectRef()); + revisionStart = decoder.decodeTime(); + revisionEnd = decoder.decodeTime(); + itemRevisions = (org.ccsds.moims.mo.mps.structures.ItemRevisionList) decoder.decodeNullableElement(new org.ccsds.moims.mo.mps.structures.ItemRevisionList()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanRevisionList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanRevisionList.java new file mode 100644 index 00000000..f6d3c250 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanRevisionList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for PlanRevision. + */ +public final class PlanRevisionList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107207L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107207L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for PlanRevisionList. + * + */ + public PlanRevisionList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public PlanRevisionList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public PlanRevisionList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.PlanRevision element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.PlanRevision element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new PlanRevisionList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.PlanRevision(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanStatusEnum.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanStatusEnum.java new file mode 100644 index 00000000..7f0cddef --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanStatusEnum.java @@ -0,0 +1,165 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * Enumeration class for PlanStatusEnum. + */ +public final class PlanStatusEnum extends org.ccsds.moims.mo.mal.structures.Enumeration { + + private static final long serialVersionUID = 1407374900330998L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330998L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Enumeration value for DRAFT. + */ + public static final int DRAFT_VALUE = 1; + + /** + * Enumeration singleton for value DRAFT. + */ + public static final org.ccsds.moims.mo.mps.structures.PlanStatusEnum DRAFT = new org.ccsds.moims.mo.mps.structures.PlanStatusEnum(org.ccsds.moims.mo.mps.structures.PlanStatusEnum.DRAFT_VALUE); + + /** + * Enumeration value for RELEASED. + */ + public static final int RELEASED_VALUE = 2; + + /** + * Enumeration singleton for value RELEASED. + */ + public static final org.ccsds.moims.mo.mps.structures.PlanStatusEnum RELEASED = new org.ccsds.moims.mo.mps.structures.PlanStatusEnum(org.ccsds.moims.mo.mps.structures.PlanStatusEnum.RELEASED_VALUE); + + /** + * Enumeration value for SUBMITTED. + */ + public static final int SUBMITTED_VALUE = 3; + + /** + * Enumeration singleton for value SUBMITTED. + */ + public static final org.ccsds.moims.mo.mps.structures.PlanStatusEnum SUBMITTED = new org.ccsds.moims.mo.mps.structures.PlanStatusEnum(org.ccsds.moims.mo.mps.structures.PlanStatusEnum.SUBMITTED_VALUE); + + /** + * Enumeration value for ACTIVATED. + */ + public static final int ACTIVATED_VALUE = 4; + + /** + * Enumeration singleton for value ACTIVATED. + */ + public static final org.ccsds.moims.mo.mps.structures.PlanStatusEnum ACTIVATED = new org.ccsds.moims.mo.mps.structures.PlanStatusEnum(org.ccsds.moims.mo.mps.structures.PlanStatusEnum.ACTIVATED_VALUE); + + /** + * Enumeration value for TERMINATED. + */ + public static final int TERMINATED_VALUE = 5; + + /** + * Enumeration singleton for value TERMINATED. + */ + public static final org.ccsds.moims.mo.mps.structures.PlanStatusEnum TERMINATED = new org.ccsds.moims.mo.mps.structures.PlanStatusEnum(org.ccsds.moims.mo.mps.structures.PlanStatusEnum.TERMINATED_VALUE); + + /** + * Set of enumeration instances. + */ + private static final org.ccsds.moims.mo.mps.structures.PlanStatusEnum[] _ENUMERATIONS = { + DRAFT, RELEASED, SUBMITTED, ACTIVATED, TERMINATED}; + + /** + * E1: PlanStatusEnum represents the status of a given Plan object. + */ + public PlanStatusEnum() { + super(-1); + } + + /** + * E1: PlanStatusEnum represents the status of a given Plan object. . + * + * @param value The value of the Enumeration. + */ + public PlanStatusEnum(int value) { + super(value); + } + + @Override + public String toString() { + switch (getValue()) { + case DRAFT_VALUE: + return "DRAFT"; + case RELEASED_VALUE: + return "RELEASED"; + case SUBMITTED_VALUE: + return "SUBMITTED"; + case ACTIVATED_VALUE: + return "ACTIVATED"; + case TERMINATED_VALUE: + return "TERMINATED"; + default: + throw new RuntimeException("Unknown ordinal!"); + } + } + + /** + * Returns the enumeration element represented by the supplied string, or + * null if not matched. + * + * @param s s The string to search for. + * @return The matched enumeration element, or null if not matched. + */ + public static org.ccsds.moims.mo.mps.structures.PlanStatusEnum fromString(String s) { + switch (s) { + case "DRAFT": + return PlanStatusEnum.DRAFT; + case "RELEASED": + return PlanStatusEnum.RELEASED; + case "SUBMITTED": + return PlanStatusEnum.SUBMITTED; + case "ACTIVATED": + return PlanStatusEnum.ACTIVATED; + case "TERMINATED": + return PlanStatusEnum.TERMINATED; + default: + throw new RuntimeException("Unknown Enumeration for the provided string: " + s); + } + } + + @Override + public org.ccsds.moims.mo.mal.structures.Enumeration fromValue(Integer value) { + switch (value) { + case DRAFT_VALUE: + return PlanStatusEnum.DRAFT; + case RELEASED_VALUE: + return PlanStatusEnum.RELEASED; + case SUBMITTED_VALUE: + return PlanStatusEnum.SUBMITTED; + case ACTIVATED_VALUE: + return PlanStatusEnum.ACTIVATED; + case TERMINATED_VALUE: + return PlanStatusEnum.TERMINATED; + default: + throw new RuntimeException("Unknown Enumeration for the provided value: " + value); + } + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return _ENUMERATIONS[0]; + } + + @Override + public int getEnumSize() { + return 5; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanStatusEnumList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanStatusEnumList.java new file mode 100644 index 00000000..8a1ed430 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanStatusEnumList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for PlanStatusEnum. + */ +public final class PlanStatusEnumList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107210L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107210L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for PlanStatusEnumList. + * + */ + public PlanStatusEnumList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public PlanStatusEnumList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public PlanStatusEnumList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.PlanStatusEnum element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.PlanStatusEnum element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new PlanStatusEnumList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return org.ccsds.moims.mo.mps.structures.PlanStatusEnum.DRAFT; + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanSummaryStatus.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanSummaryStatus.java new file mode 100644 index 00000000..d9f7d049 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanSummaryStatus.java @@ -0,0 +1,367 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E1: PlanSummaryStatus is a data structure that provides a summary view + * of a Plan that includes the PlanInformation section and current status, + * but not the full details of the Plan. It is returned in the context of + * the MPS Plan Distribution service getPlanSummaries operation. + */ +public final class PlanSummaryStatus implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1407374900331005L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900331005L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Reference to the Plan to which the summary status relates. + */ + private org.ccsds.moims.mo.mal.structures.ObjectRef plan; + + /** + * Flag indicating if the Plan is a patch plan that only contains details + * of the changes from the precursor Plan. A patch plan must have a precursor. + * It must also include a single PlanRevision relative to the precursor Plan. + */ + private Boolean isPatchPlan; + + /** + * Reference to a precursor (or predecessor) Plan from which the changes are + * detailed in the Plan. This may be used if there is an iterative re-planning + * cycle in which successive plans overlap, or where a previous Plan has been + * updated through re-planning. If there is no precursor, then the Plan must + * be a self-standing full plan. If the Plan is a Patch Plan, then a precursor + * plan must be specified. + */ + private org.ccsds.moims.mo.mal.structures.ObjectRef precursorPlan; + + /** + * Applicable only for patch plans, this is a reference to the target Plan. + * This target Plan is the result of applying the patch plan to the precursor + * Plan and is distinct from the identity of the patch plan itself. Patch + * plans are not permitted in the context of a planning request. + */ + private org.ccsds.moims.mo.mal.structures.ObjectRef targetPlan; + + /** + * Contains header information relating to the Plan, including its originator + * and validity period. + */ + private org.ccsds.moims.mo.mps.structures.PlanInformation information; + + /** + * Flag indicating if the Plan has currently been released as an Operational + * or Alternate plan. + */ + private Boolean isAlternate; + + /** + * Current status of the Plan. + */ + private org.ccsds.moims.mo.mps.structures.PlanStatusEnum status; + + /** + * Supplementary information for a Plan in the Terminated state. + */ + private String statusInfo; + + /** + * Default constructor for PlanSummaryStatus. + * + */ + public PlanSummaryStatus() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param plan Reference to the Plan to which the summary status relates. + * @param isPatchPlan Flag indicating if the Plan is a patch plan that only contains details of the changes from the precursor Plan. A patch plan must have a precursor. It must also include a single PlanRevision relative to the precursor Plan. + * @param precursorPlan Reference to a precursor (or predecessor) Plan from which the changes are detailed in the Plan. This may be used if there is an iterative re-planning cycle in which successive plans overlap, or where a previous Plan has been updated through re-planning. If there is no precursor, then the Plan must be a self-standing full plan. If the Plan is a Patch Plan, then a precursor plan must be specified. + * @param targetPlan Applicable only for patch plans, this is a reference to the target Plan. This target Plan is the result of applying the patch plan to the precursor Plan and is distinct from the identity of the patch plan itself. Patch plans are not permitted in the context of a planning request. + * @param information Contains header information relating to the Plan, including its originator and validity period. + * @param isAlternate Flag indicating if the Plan has currently been released as an Operational or Alternate plan. + * @param status Current status of the Plan. + * @param statusInfo Supplementary information for a Plan in the Terminated state. + */ + public PlanSummaryStatus(org.ccsds.moims.mo.mal.structures.ObjectRef plan, + Boolean isPatchPlan, + org.ccsds.moims.mo.mal.structures.ObjectRef precursorPlan, + org.ccsds.moims.mo.mal.structures.ObjectRef targetPlan, + org.ccsds.moims.mo.mps.structures.PlanInformation information, + Boolean isAlternate, + org.ccsds.moims.mo.mps.structures.PlanStatusEnum status, + String statusInfo) { + this.plan = plan; + this.isPatchPlan = isPatchPlan; + this.precursorPlan = precursorPlan; + this.targetPlan = targetPlan; + this.information = information; + this.isAlternate = isAlternate; + this.status = status; + this.statusInfo = statusInfo; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param plan Reference to the Plan to which the summary status relates. + * @param isPatchPlan Flag indicating if the Plan is a patch plan that only contains details of the changes from the precursor Plan. A patch plan must have a precursor. It must also include a single PlanRevision relative to the precursor Plan. + * @param information Contains header information relating to the Plan, including its originator and validity period. + * @param isAlternate Flag indicating if the Plan has currently been released as an Operational or Alternate plan. + * @param status Current status of the Plan. + */ + public PlanSummaryStatus(org.ccsds.moims.mo.mal.structures.ObjectRef plan, + Boolean isPatchPlan, + org.ccsds.moims.mo.mps.structures.PlanInformation information, + Boolean isAlternate, + org.ccsds.moims.mo.mps.structures.PlanStatusEnum status) { + this.plan = plan; + this.isPatchPlan = isPatchPlan; + this.precursorPlan = null; + this.targetPlan = null; + this.information = information; + this.isAlternate = isAlternate; + this.status = status; + this.statusInfo = null; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.PlanSummaryStatus(); + } + + /** + * Returns the field plan. + * + * @return The field plan + */ + public org.ccsds.moims.mo.mal.structures.ObjectRef getPlan() { + return plan; + } + + /** + * Returns the field isPatchPlan. + * + * @return The field isPatchPlan + */ + public Boolean getIsPatchPlan() { + return isPatchPlan; + } + + /** + * Returns the field precursorPlan. + * + * @return The field precursorPlan + */ + public org.ccsds.moims.mo.mal.structures.ObjectRef getPrecursorPlan() { + return precursorPlan; + } + + /** + * Returns the field targetPlan. + * + * @return The field targetPlan + */ + public org.ccsds.moims.mo.mal.structures.ObjectRef getTargetPlan() { + return targetPlan; + } + + /** + * Returns the field information. + * + * @return The field information + */ + public org.ccsds.moims.mo.mps.structures.PlanInformation getInformation() { + return information; + } + + /** + * Returns the field isAlternate. + * + * @return The field isAlternate + */ + public Boolean getIsAlternate() { + return isAlternate; + } + + /** + * Returns the field status. + * + * @return The field status + */ + public org.ccsds.moims.mo.mps.structures.PlanStatusEnum getStatus() { + return status; + } + + /** + * Returns the field statusInfo. + * + * @return The field statusInfo + */ + public String getStatusInfo() { + return statusInfo; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof PlanSummaryStatus) { + PlanSummaryStatus other = (PlanSummaryStatus) obj; + if (plan == null) { + if (other.plan != null) { + return false; + } + } else { + if (! plan.equals(other.plan)) { + return false; + } + } + if (isPatchPlan == null) { + if (other.isPatchPlan != null) { + return false; + } + } else { + if (! isPatchPlan.equals(other.isPatchPlan)) { + return false; + } + } + if (precursorPlan == null) { + if (other.precursorPlan != null) { + return false; + } + } else { + if (! precursorPlan.equals(other.precursorPlan)) { + return false; + } + } + if (targetPlan == null) { + if (other.targetPlan != null) { + return false; + } + } else { + if (! targetPlan.equals(other.targetPlan)) { + return false; + } + } + if (information == null) { + if (other.information != null) { + return false; + } + } else { + if (! information.equals(other.information)) { + return false; + } + } + if (isAlternate == null) { + if (other.isAlternate != null) { + return false; + } + } else { + if (! isAlternate.equals(other.isAlternate)) { + return false; + } + } + if (status == null) { + if (other.status != null) { + return false; + } + } else { + if (! status.equals(other.status)) { + return false; + } + } + if (statusInfo == null) { + if (other.statusInfo != null) { + return false; + } + } else { + if (! statusInfo.equals(other.statusInfo)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (plan != null ? plan.hashCode() : 0); + hash = 83 * hash + (isPatchPlan != null ? isPatchPlan.hashCode() : 0); + hash = 83 * hash + (precursorPlan != null ? precursorPlan.hashCode() : 0); + hash = 83 * hash + (targetPlan != null ? targetPlan.hashCode() : 0); + hash = 83 * hash + (information != null ? information.hashCode() : 0); + hash = 83 * hash + (isAlternate != null ? isAlternate.hashCode() : 0); + hash = 83 * hash + (status != null ? status.hashCode() : 0); + hash = 83 * hash + (statusInfo != null ? statusInfo.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(PlanSummaryStatus: "); + buf.append("plan=").append(plan); + buf.append(", isPatchPlan=").append(isPatchPlan); + buf.append(", precursorPlan=").append(precursorPlan); + buf.append(", targetPlan=").append(targetPlan); + buf.append(", information=").append(information); + buf.append(", isAlternate=").append(isAlternate); + buf.append(", status=").append(status); + buf.append(", statusInfo=").append(statusInfo); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (plan == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'plan' cannot be null!"); + } + if (isPatchPlan == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'isPatchPlan' cannot be null!"); + } + if (information == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'information' cannot be null!"); + } + if (isAlternate == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'isAlternate' cannot be null!"); + } + if (status == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'status' cannot be null!"); + } + encoder.encodeElement(plan); + encoder.encodeBoolean(isPatchPlan); + encoder.encodeNullableElement(precursorPlan); + encoder.encodeNullableElement(targetPlan); + encoder.encodeElement(information); + encoder.encodeBoolean(isAlternate); + encoder.encodeElement(status); + encoder.encodeNullableString(statusInfo); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + plan = (org.ccsds.moims.mo.mal.structures.ObjectRef) decoder.decodeElement(new org.ccsds.moims.mo.mal.structures.ObjectRef()); + isPatchPlan = decoder.decodeBoolean(); + precursorPlan = (org.ccsds.moims.mo.mal.structures.ObjectRef) decoder.decodeNullableElement(new org.ccsds.moims.mo.mal.structures.ObjectRef()); + targetPlan = (org.ccsds.moims.mo.mal.structures.ObjectRef) decoder.decodeNullableElement(new org.ccsds.moims.mo.mal.structures.ObjectRef()); + information = (org.ccsds.moims.mo.mps.structures.PlanInformation) decoder.decodeElement(new org.ccsds.moims.mo.mps.structures.PlanInformation()); + isAlternate = decoder.decodeBoolean(); + status = (org.ccsds.moims.mo.mps.structures.PlanStatusEnum) decoder.decodeElement(org.ccsds.moims.mo.mps.structures.PlanStatusEnum.DRAFT); + statusInfo = decoder.decodeNullableString(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanSummaryStatusList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanSummaryStatusList.java new file mode 100644 index 00000000..848ff663 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanSummaryStatusList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for PlanSummaryStatus. + */ +public final class PlanSummaryStatusList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107203L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107203L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for PlanSummaryStatusList. + * + */ + public PlanSummaryStatusList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public PlanSummaryStatusList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public PlanSummaryStatusList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.PlanSummaryStatus element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.PlanSummaryStatus element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new PlanSummaryStatusList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.PlanSummaryStatus(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanUpdate.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanUpdate.java new file mode 100644 index 00000000..67436dcd --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanUpdate.java @@ -0,0 +1,266 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E1: PlanUpdate is a data structure that is used to report changes in status + * of the Plan as it proceeds through both planning and plan execution functions. + * It is returned in the context of the MPS Plan Distribution service getPlanStatus + * and monitorPlanStatus operations, and also the MPS Plan Execution Control + * service monitorPlanExecution and getPlanStatus operations. PlanUpdates + * may be distributed to subscribing applications, including status displays, + * to inform them of the latest status of a Plan. PlanUpdates may be stored + * in plan history to provide a complete record of evolving status over time. + */ +public final class PlanUpdate implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1407374900331004L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900331004L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Reference to the Plan to which the status update relates. + */ + private org.ccsds.moims.mo.mal.structures.ObjectRef plan; + + /** + * Time of status update. + */ + private org.ccsds.moims.mo.mal.structures.Time timestamp; + + /** + * Flag indicating if the Plan has currently been released as an Operational + * or Alternate plan. + */ + private Boolean isAlternate; + + /** + * Current status of the Plan. + */ + private org.ccsds.moims.mo.mps.structures.PlanStatusEnum status; + + /** + * Supplementary information for a Plan in the Terminated state. This is + * customizable, but if the following conditions exist then the specified + * text shall be used: - Completed (nominal); - Superseded by a successor + * Plan; - Revoked by a User; - Cancelled (deactivated after start of execution); + * - Expired (reached the end of its validity period without being activated). + */ + private String statusInfo; + + /** + * Default constructor for PlanUpdate. + * + */ + public PlanUpdate() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param plan Reference to the Plan to which the status update relates. + * @param timestamp Time of status update. + * @param isAlternate Flag indicating if the Plan has currently been released as an Operational or Alternate plan. + * @param status Current status of the Plan. + * @param statusInfo Supplementary information for a Plan in the Terminated state. This is customizable, but if the following conditions exist then the specified text shall be used: - Completed (nominal); - Superseded by a successor Plan; - Revoked by a User; - Cancelled (deactivated after start of execution); - Expired (reached the end of its validity period without being activated). + */ + public PlanUpdate(org.ccsds.moims.mo.mal.structures.ObjectRef plan, + org.ccsds.moims.mo.mal.structures.Time timestamp, + Boolean isAlternate, + org.ccsds.moims.mo.mps.structures.PlanStatusEnum status, + String statusInfo) { + this.plan = plan; + this.timestamp = timestamp; + this.isAlternate = isAlternate; + this.status = status; + this.statusInfo = statusInfo; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param plan Reference to the Plan to which the status update relates. + * @param timestamp Time of status update. + * @param isAlternate Flag indicating if the Plan has currently been released as an Operational or Alternate plan. + * @param status Current status of the Plan. + */ + public PlanUpdate(org.ccsds.moims.mo.mal.structures.ObjectRef plan, + org.ccsds.moims.mo.mal.structures.Time timestamp, + Boolean isAlternate, + org.ccsds.moims.mo.mps.structures.PlanStatusEnum status) { + this.plan = plan; + this.timestamp = timestamp; + this.isAlternate = isAlternate; + this.status = status; + this.statusInfo = null; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.PlanUpdate(); + } + + /** + * Returns the field plan. + * + * @return The field plan + */ + public org.ccsds.moims.mo.mal.structures.ObjectRef getPlan() { + return plan; + } + + /** + * Returns the field timestamp. + * + * @return The field timestamp + */ + public org.ccsds.moims.mo.mal.structures.Time getTimestamp() { + return timestamp; + } + + /** + * Returns the field isAlternate. + * + * @return The field isAlternate + */ + public Boolean getIsAlternate() { + return isAlternate; + } + + /** + * Returns the field status. + * + * @return The field status + */ + public org.ccsds.moims.mo.mps.structures.PlanStatusEnum getStatus() { + return status; + } + + /** + * Returns the field statusInfo. + * + * @return The field statusInfo + */ + public String getStatusInfo() { + return statusInfo; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof PlanUpdate) { + PlanUpdate other = (PlanUpdate) obj; + if (plan == null) { + if (other.plan != null) { + return false; + } + } else { + if (! plan.equals(other.plan)) { + return false; + } + } + if (timestamp == null) { + if (other.timestamp != null) { + return false; + } + } else { + if (! timestamp.equals(other.timestamp)) { + return false; + } + } + if (isAlternate == null) { + if (other.isAlternate != null) { + return false; + } + } else { + if (! isAlternate.equals(other.isAlternate)) { + return false; + } + } + if (status == null) { + if (other.status != null) { + return false; + } + } else { + if (! status.equals(other.status)) { + return false; + } + } + if (statusInfo == null) { + if (other.statusInfo != null) { + return false; + } + } else { + if (! statusInfo.equals(other.statusInfo)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (plan != null ? plan.hashCode() : 0); + hash = 83 * hash + (timestamp != null ? timestamp.hashCode() : 0); + hash = 83 * hash + (isAlternate != null ? isAlternate.hashCode() : 0); + hash = 83 * hash + (status != null ? status.hashCode() : 0); + hash = 83 * hash + (statusInfo != null ? statusInfo.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(PlanUpdate: "); + buf.append("plan=").append(plan); + buf.append(", timestamp=").append(timestamp); + buf.append(", isAlternate=").append(isAlternate); + buf.append(", status=").append(status); + buf.append(", statusInfo=").append(statusInfo); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (plan == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'plan' cannot be null!"); + } + if (timestamp == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'timestamp' cannot be null!"); + } + if (isAlternate == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'isAlternate' cannot be null!"); + } + if (status == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'status' cannot be null!"); + } + encoder.encodeElement(plan); + encoder.encodeTime(timestamp); + encoder.encodeBoolean(isAlternate); + encoder.encodeElement(status); + encoder.encodeNullableString(statusInfo); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + plan = (org.ccsds.moims.mo.mal.structures.ObjectRef) decoder.decodeElement(new org.ccsds.moims.mo.mal.structures.ObjectRef()); + timestamp = decoder.decodeTime(); + isAlternate = decoder.decodeBoolean(); + status = (org.ccsds.moims.mo.mps.structures.PlanStatusEnum) decoder.decodeElement(org.ccsds.moims.mo.mps.structures.PlanStatusEnum.DRAFT); + statusInfo = decoder.decodeNullableString(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanUpdateList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanUpdateList.java new file mode 100644 index 00000000..bebef93c --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanUpdateList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for PlanUpdate. + */ +public final class PlanUpdateList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107204L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107204L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for PlanUpdateList. + * + */ + public PlanUpdateList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public PlanUpdateList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public PlanUpdateList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.PlanUpdate element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.PlanUpdate element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new PlanUpdateList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.PlanUpdate(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlannedItems.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlannedItems.java new file mode 100644 index 00000000..a449bd52 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlannedItems.java @@ -0,0 +1,136 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E1: The PlannedItems section of the Plan specifies the set of planning + * activities and planning events contained within the Plan. It comprises + * two lists of contained MO objects: one of EventInstances and one of ActivityInstances. + * Both lists can be empty. + */ +public final class PlannedItems implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1407374900331000L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900331000L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * List of planned events contained within the Plan. + */ + private org.ccsds.moims.mo.mps.structures.EventInstanceList plannedEvents; + + /** + * List of planned activities contained within the Plan. + */ + private org.ccsds.moims.mo.mps.structures.ActivityInstanceList plannedActivities; + + /** + * Default constructor for PlannedItems. + * + */ + public PlannedItems() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param plannedEvents List of planned events contained within the Plan. + * @param plannedActivities List of planned activities contained within the Plan. + */ + public PlannedItems(org.ccsds.moims.mo.mps.structures.EventInstanceList plannedEvents, + org.ccsds.moims.mo.mps.structures.ActivityInstanceList plannedActivities) { + this.plannedEvents = plannedEvents; + this.plannedActivities = plannedActivities; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.PlannedItems(); + } + + /** + * Returns the field plannedEvents. + * + * @return The field plannedEvents + */ + public org.ccsds.moims.mo.mps.structures.EventInstanceList getPlannedEvents() { + return plannedEvents; + } + + /** + * Returns the field plannedActivities. + * + * @return The field plannedActivities + */ + public org.ccsds.moims.mo.mps.structures.ActivityInstanceList getPlannedActivities() { + return plannedActivities; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof PlannedItems) { + PlannedItems other = (PlannedItems) obj; + if (plannedEvents == null) { + if (other.plannedEvents != null) { + return false; + } + } else { + if (! plannedEvents.equals(other.plannedEvents)) { + return false; + } + } + if (plannedActivities == null) { + if (other.plannedActivities != null) { + return false; + } + } else { + if (! plannedActivities.equals(other.plannedActivities)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (plannedEvents != null ? plannedEvents.hashCode() : 0); + hash = 83 * hash + (plannedActivities != null ? plannedActivities.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(PlannedItems: "); + buf.append("plannedEvents=").append(plannedEvents); + buf.append(", plannedActivities=").append(plannedActivities); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeNullableElement(plannedEvents); + encoder.encodeNullableElement(plannedActivities); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + plannedEvents = (org.ccsds.moims.mo.mps.structures.EventInstanceList) decoder.decodeNullableElement(new org.ccsds.moims.mo.mps.structures.EventInstanceList()); + plannedActivities = (org.ccsds.moims.mo.mps.structures.ActivityInstanceList) decoder.decodeNullableElement(new org.ccsds.moims.mo.mps.structures.ActivityInstanceList()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlannedItemsList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlannedItemsList.java new file mode 100644 index 00000000..d7d33342 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlannedItemsList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for PlannedItems. + */ +public final class PlannedItemsList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107208L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107208L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for PlannedItemsList. + * + */ + public PlannedItemsList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public PlannedItemsList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public PlannedItemsList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.PlannedItems element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.PlannedItems element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new PlannedItemsList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.PlannedItems(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanningRequestDetails.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanningRequestDetails.java new file mode 100644 index 00000000..d311b3fa --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanningRequestDetails.java @@ -0,0 +1,569 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E1: PlanningRequestDetails is a data structure used in the context of the + * MPS Planning Request service submitRequest and updateRequest operations, + * where the RequestInstance MO object cannot be used, because the full identity + * of the resulting RequestInstance is not yet known at the time of submitting + * or updating the request. + */ +public final class PlanningRequestDetails implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1407374900330901L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330901L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * User supplied reference for the planning request. This is distinct from + * the identity of the RequestInstance that is assigned by the planning function. + * No guarantees are made by the planning system about the contents of this + * identifier; that is entirely up to the user who supplies the reference. + */ + private org.ccsds.moims.mo.mal.structures.Identifier userReference; + + /** + * Reference to the RequestDefinition from which the RequestInstance was created, + * if a planning request template was used. + */ + private org.ccsds.moims.mo.mal.structures.ObjectRef definition; + + /** + * Specifies which planning period the planning request applies to. Planning + * period IDs are mission specific, but can be used to indicate mission phase; + * planning cycle; or ‘semester’ in observatory missions. + */ + private org.ccsds.moims.mo.mal.structures.Identifier planningPeriod; + + /** + * Validity period for the planning request, expressed as one or more time + * windows. The planning request must be satisfied within this period. When + * multiple TimeWindows are provided, the planning request may be satisfied + * within any individual TimeWindow. If this field is null, no restriction + * is placed on the times between which this request must be planned. + */ + private org.ccsds.moims.mo.mps.structures.TimeWindowList validityTimes; + + /** + * Validity period for the planning request, expressed as one or more event + * windows. The planning request must be satisfied within this period. When + * multiple EventWindows are provided, the planning request may be satisfied + * within any individual EventWindow. If this field is null, no restriction + * is placed on any events between which this request must be planned. + */ + private org.ccsds.moims.mo.mps.structures.EventWindowList validityEvents; + + /** + * Specifies the time system used for all time fields within the planning + * request (see 4.4.1). If null, the default time system is used. + */ + private org.ccsds.moims.mo.mal.structures.Identifier timeSystem; + + /** + * The User ID for the person or organization raising the planning request. + */ + private org.ccsds.moims.mo.mal.structures.ObjectRef user; + + /** + * Description of the request. + */ + private String description; + + /** + * List of named argument values. If created from a template planning request, + * this will include the arguments defined in the RequestDefinition. + */ + private org.ccsds.moims.mo.mps.structures.ArgumentList arguments; + + /** + * A flag that indicates whether the planning request is for a repetitive + * standing order (unbounded other than by the validity period), or is a one-off + * request. If it is a standing order, then the supplied activity details + * must be an ActivityNode with specification of the repetition criteria. + * It should be noted that a one-off request can still include repetition. + */ + private Boolean standingOrder; + + /** + * Set of activity details specifying requested activities. + */ + private org.ccsds.moims.mo.mps.structures.ActivityDetailsList activities; + + /** + * Reference to an existing Plan (output of one planning function) submitted + * as a planning request to another planning function in the context of a + * distributed or hierarchical planning system. Only one of inputPlanRef and + * inputPlan should be present within the planning request. + */ + private org.ccsds.moims.mo.mal.structures.ObjectRef inputPlanRef; + + /** + * An existing Plan (output of one planning function) submitted as a planning + * request to another planning function in the context of a distributed or + * hierarchical planning system. The Plan is embedded within the planning + * request. Only one of inputPlanRef and inputPlan should be present within + * the planning request. + */ + private org.ccsds.moims.mo.mps.structures.Plan inputPlan; + + /** + * Free text for any additional user comments about the request. + */ + private String comments; + + /** + * Default constructor for PlanningRequestDetails. + * + */ + public PlanningRequestDetails() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param userReference User supplied reference for the planning request. This is distinct from the identity of the RequestInstance that is assigned by the planning function. No guarantees are made by the planning system about the contents of this identifier; that is entirely up to the user who supplies the reference. + * @param definition Reference to the RequestDefinition from which the RequestInstance was created, if a planning request template was used. + * @param planningPeriod Specifies which planning period the planning request applies to. Planning period IDs are mission specific, but can be used to indicate mission phase; planning cycle; or ‘semester’ in observatory missions. + * @param validityTimes Validity period for the planning request, expressed as one or more time windows. The planning request must be satisfied within this period. When multiple TimeWindows are provided, the planning request may be satisfied within any individual TimeWindow. If this field is null, no restriction is placed on the times between which this request must be planned. + * @param validityEvents Validity period for the planning request, expressed as one or more event windows. The planning request must be satisfied within this period. When multiple EventWindows are provided, the planning request may be satisfied within any individual EventWindow. If this field is null, no restriction is placed on any events between which this request must be planned. + * @param timeSystem Specifies the time system used for all time fields within the planning request (see 4.4.1). If null, the default time system is used. + * @param user The User ID for the person or organization raising the planning request. + * @param description Description of the request. + * @param arguments List of named argument values. If created from a template planning request, this will include the arguments defined in the RequestDefinition. + * @param standingOrder A flag that indicates whether the planning request is for a repetitive standing order (unbounded other than by the validity period), or is a one-off request. If it is a standing order, then the supplied activity details must be an ActivityNode with specification of the repetition criteria. It should be noted that a one-off request can still include repetition. + * @param activities Set of activity details specifying requested activities. + * @param inputPlanRef Reference to an existing Plan (output of one planning function) submitted as a planning request to another planning function in the context of a distributed or hierarchical planning system. Only one of inputPlanRef and inputPlan should be present within the planning request. + * @param inputPlan An existing Plan (output of one planning function) submitted as a planning request to another planning function in the context of a distributed or hierarchical planning system. The Plan is embedded within the planning request. Only one of inputPlanRef and inputPlan should be present within the planning request. + * @param comments Free text for any additional user comments about the request. + */ + public PlanningRequestDetails(org.ccsds.moims.mo.mal.structures.Identifier userReference, + org.ccsds.moims.mo.mal.structures.ObjectRef definition, + org.ccsds.moims.mo.mal.structures.Identifier planningPeriod, + org.ccsds.moims.mo.mps.structures.TimeWindowList validityTimes, + org.ccsds.moims.mo.mps.structures.EventWindowList validityEvents, + org.ccsds.moims.mo.mal.structures.Identifier timeSystem, + org.ccsds.moims.mo.mal.structures.ObjectRef user, + String description, + org.ccsds.moims.mo.mps.structures.ArgumentList arguments, + Boolean standingOrder, + org.ccsds.moims.mo.mps.structures.ActivityDetailsList activities, + org.ccsds.moims.mo.mal.structures.ObjectRef inputPlanRef, + org.ccsds.moims.mo.mps.structures.Plan inputPlan, + String comments) { + this.userReference = userReference; + this.definition = definition; + this.planningPeriod = planningPeriod; + this.validityTimes = validityTimes; + this.validityEvents = validityEvents; + this.timeSystem = timeSystem; + this.user = user; + this.description = description; + this.arguments = arguments; + this.standingOrder = standingOrder; + this.activities = activities; + this.inputPlanRef = inputPlanRef; + this.inputPlan = inputPlan; + this.comments = comments; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param userReference User supplied reference for the planning request. This is distinct from the identity of the RequestInstance that is assigned by the planning function. No guarantees are made by the planning system about the contents of this identifier; that is entirely up to the user who supplies the reference. + * @param planningPeriod Specifies which planning period the planning request applies to. Planning period IDs are mission specific, but can be used to indicate mission phase; planning cycle; or ‘semester’ in observatory missions. + * @param user The User ID for the person or organization raising the planning request. + * @param description Description of the request. + * @param standingOrder A flag that indicates whether the planning request is for a repetitive standing order (unbounded other than by the validity period), or is a one-off request. If it is a standing order, then the supplied activity details must be an ActivityNode with specification of the repetition criteria. It should be noted that a one-off request can still include repetition. + */ + public PlanningRequestDetails(org.ccsds.moims.mo.mal.structures.Identifier userReference, + org.ccsds.moims.mo.mal.structures.Identifier planningPeriod, + org.ccsds.moims.mo.mal.structures.ObjectRef user, + String description, + Boolean standingOrder) { + this.userReference = userReference; + this.definition = null; + this.planningPeriod = planningPeriod; + this.validityTimes = null; + this.validityEvents = null; + this.timeSystem = null; + this.user = user; + this.description = description; + this.arguments = null; + this.standingOrder = standingOrder; + this.activities = null; + this.inputPlanRef = null; + this.inputPlan = null; + this.comments = null; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.PlanningRequestDetails(); + } + + /** + * Returns the field userReference. + * + * @return The field userReference + */ + public org.ccsds.moims.mo.mal.structures.Identifier getUserReference() { + return userReference; + } + + /** + * Returns the field definition. + * + * @return The field definition + */ + public org.ccsds.moims.mo.mal.structures.ObjectRef getDefinition() { + return definition; + } + + /** + * Returns the field planningPeriod. + * + * @return The field planningPeriod + */ + public org.ccsds.moims.mo.mal.structures.Identifier getPlanningPeriod() { + return planningPeriod; + } + + /** + * Returns the field validityTimes. + * + * @return The field validityTimes + */ + public org.ccsds.moims.mo.mps.structures.TimeWindowList getValidityTimes() { + return validityTimes; + } + + /** + * Returns the field validityEvents. + * + * @return The field validityEvents + */ + public org.ccsds.moims.mo.mps.structures.EventWindowList getValidityEvents() { + return validityEvents; + } + + /** + * Returns the field timeSystem. + * + * @return The field timeSystem + */ + public org.ccsds.moims.mo.mal.structures.Identifier getTimeSystem() { + return timeSystem; + } + + /** + * Returns the field user. + * + * @return The field user + */ + public org.ccsds.moims.mo.mal.structures.ObjectRef getUser() { + return user; + } + + /** + * Returns the field description. + * + * @return The field description + */ + public String getDescription() { + return description; + } + + /** + * Returns the field arguments. + * + * @return The field arguments + */ + public org.ccsds.moims.mo.mps.structures.ArgumentList getArguments() { + return arguments; + } + + /** + * Returns the field standingOrder. + * + * @return The field standingOrder + */ + public Boolean getStandingOrder() { + return standingOrder; + } + + /** + * Returns the field activities. + * + * @return The field activities + */ + public org.ccsds.moims.mo.mps.structures.ActivityDetailsList getActivities() { + return activities; + } + + /** + * Returns the field inputPlanRef. + * + * @return The field inputPlanRef + */ + public org.ccsds.moims.mo.mal.structures.ObjectRef getInputPlanRef() { + return inputPlanRef; + } + + /** + * Returns the field inputPlan. + * + * @return The field inputPlan + */ + public org.ccsds.moims.mo.mps.structures.Plan getInputPlan() { + return inputPlan; + } + + /** + * Returns the field comments. + * + * @return The field comments + */ + public String getComments() { + return comments; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof PlanningRequestDetails) { + PlanningRequestDetails other = (PlanningRequestDetails) obj; + if (userReference == null) { + if (other.userReference != null) { + return false; + } + } else { + if (! userReference.equals(other.userReference)) { + return false; + } + } + if (definition == null) { + if (other.definition != null) { + return false; + } + } else { + if (! definition.equals(other.definition)) { + return false; + } + } + if (planningPeriod == null) { + if (other.planningPeriod != null) { + return false; + } + } else { + if (! planningPeriod.equals(other.planningPeriod)) { + return false; + } + } + if (validityTimes == null) { + if (other.validityTimes != null) { + return false; + } + } else { + if (! validityTimes.equals(other.validityTimes)) { + return false; + } + } + if (validityEvents == null) { + if (other.validityEvents != null) { + return false; + } + } else { + if (! validityEvents.equals(other.validityEvents)) { + return false; + } + } + if (timeSystem == null) { + if (other.timeSystem != null) { + return false; + } + } else { + if (! timeSystem.equals(other.timeSystem)) { + return false; + } + } + if (user == null) { + if (other.user != null) { + return false; + } + } else { + if (! user.equals(other.user)) { + return false; + } + } + if (description == null) { + if (other.description != null) { + return false; + } + } else { + if (! description.equals(other.description)) { + return false; + } + } + if (arguments == null) { + if (other.arguments != null) { + return false; + } + } else { + if (! arguments.equals(other.arguments)) { + return false; + } + } + if (standingOrder == null) { + if (other.standingOrder != null) { + return false; + } + } else { + if (! standingOrder.equals(other.standingOrder)) { + return false; + } + } + if (activities == null) { + if (other.activities != null) { + return false; + } + } else { + if (! activities.equals(other.activities)) { + return false; + } + } + if (inputPlanRef == null) { + if (other.inputPlanRef != null) { + return false; + } + } else { + if (! inputPlanRef.equals(other.inputPlanRef)) { + return false; + } + } + if (inputPlan == null) { + if (other.inputPlan != null) { + return false; + } + } else { + if (! inputPlan.equals(other.inputPlan)) { + return false; + } + } + if (comments == null) { + if (other.comments != null) { + return false; + } + } else { + if (! comments.equals(other.comments)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (userReference != null ? userReference.hashCode() : 0); + hash = 83 * hash + (definition != null ? definition.hashCode() : 0); + hash = 83 * hash + (planningPeriod != null ? planningPeriod.hashCode() : 0); + hash = 83 * hash + (validityTimes != null ? validityTimes.hashCode() : 0); + hash = 83 * hash + (validityEvents != null ? validityEvents.hashCode() : 0); + hash = 83 * hash + (timeSystem != null ? timeSystem.hashCode() : 0); + hash = 83 * hash + (user != null ? user.hashCode() : 0); + hash = 83 * hash + (description != null ? description.hashCode() : 0); + hash = 83 * hash + (arguments != null ? arguments.hashCode() : 0); + hash = 83 * hash + (standingOrder != null ? standingOrder.hashCode() : 0); + hash = 83 * hash + (activities != null ? activities.hashCode() : 0); + hash = 83 * hash + (inputPlanRef != null ? inputPlanRef.hashCode() : 0); + hash = 83 * hash + (inputPlan != null ? inputPlan.hashCode() : 0); + hash = 83 * hash + (comments != null ? comments.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(PlanningRequestDetails: "); + buf.append("userReference=").append(userReference); + buf.append(", definition=").append(definition); + buf.append(", planningPeriod=").append(planningPeriod); + buf.append(", validityTimes=").append(validityTimes); + buf.append(", validityEvents=").append(validityEvents); + buf.append(", timeSystem=").append(timeSystem); + buf.append(", user=").append(user); + buf.append(", description=").append(description); + buf.append(", arguments=").append(arguments); + buf.append(", standingOrder=").append(standingOrder); + buf.append(", activities=").append(activities); + buf.append(", inputPlanRef=").append(inputPlanRef); + buf.append(", inputPlan=").append(inputPlan); + buf.append(", comments=").append(comments); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (userReference == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'userReference' cannot be null!"); + } + if (planningPeriod == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'planningPeriod' cannot be null!"); + } + if (user == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'user' cannot be null!"); + } + if (description == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'description' cannot be null!"); + } + if (standingOrder == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'standingOrder' cannot be null!"); + } + encoder.encodeIdentifier(userReference); + encoder.encodeNullableElement(definition); + encoder.encodeIdentifier(planningPeriod); + encoder.encodeNullableElement(validityTimes); + encoder.encodeNullableElement(validityEvents); + encoder.encodeNullableIdentifier(timeSystem); + encoder.encodeElement(user); + encoder.encodeString(description); + encoder.encodeNullableElement(arguments); + encoder.encodeBoolean(standingOrder); + encoder.encodeNullableElement(activities); + encoder.encodeNullableElement(inputPlanRef); + encoder.encodeNullableElement(inputPlan); + encoder.encodeNullableString(comments); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + userReference = decoder.decodeIdentifier(); + definition = (org.ccsds.moims.mo.mal.structures.ObjectRef) decoder.decodeNullableElement(new org.ccsds.moims.mo.mal.structures.ObjectRef()); + planningPeriod = decoder.decodeIdentifier(); + validityTimes = (org.ccsds.moims.mo.mps.structures.TimeWindowList) decoder.decodeNullableElement(new org.ccsds.moims.mo.mps.structures.TimeWindowList()); + validityEvents = (org.ccsds.moims.mo.mps.structures.EventWindowList) decoder.decodeNullableElement(new org.ccsds.moims.mo.mps.structures.EventWindowList()); + timeSystem = decoder.decodeNullableIdentifier(); + user = (org.ccsds.moims.mo.mal.structures.ObjectRef) decoder.decodeElement(new org.ccsds.moims.mo.mal.structures.ObjectRef()); + description = decoder.decodeString(); + arguments = (org.ccsds.moims.mo.mps.structures.ArgumentList) decoder.decodeNullableElement(new org.ccsds.moims.mo.mps.structures.ArgumentList()); + standingOrder = decoder.decodeBoolean(); + activities = (org.ccsds.moims.mo.mps.structures.ActivityDetailsList) decoder.decodeNullableElement(new org.ccsds.moims.mo.mps.structures.ActivityDetailsList()); + inputPlanRef = (org.ccsds.moims.mo.mal.structures.ObjectRef) decoder.decodeNullableElement(new org.ccsds.moims.mo.mal.structures.ObjectRef()); + inputPlan = (org.ccsds.moims.mo.mps.structures.Plan) decoder.decodeNullableElement(new org.ccsds.moims.mo.mps.structures.Plan()); + comments = decoder.decodeNullableString(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanningRequestDetailsList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanningRequestDetailsList.java new file mode 100644 index 00000000..ce55f58d --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanningRequestDetailsList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for PlanningRequestDetails. + */ +public final class PlanningRequestDetailsList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107307L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107307L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for PlanningRequestDetailsList. + * + */ + public PlanningRequestDetailsList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public PlanningRequestDetailsList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public PlanningRequestDetailsList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.PlanningRequestDetails element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.PlanningRequestDetails element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new PlanningRequestDetailsList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.PlanningRequestDetails(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanningRequestResponse.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanningRequestResponse.java new file mode 100644 index 00000000..231465c0 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanningRequestResponse.java @@ -0,0 +1,146 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E1: PlanningRequestResponse is a data structure used in the context of + * the MPS Planning Request service submitRequest and updateRequest operations, + * in response to the submitted PlanningRequestDetails defined above. It + * contains a reference to the created RequestInstance and the supplied userReference + * to allow the user to correlate the two. + */ +public final class PlanningRequestResponse implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1407374900330902L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330902L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Reference to the RequestInstance created in response to a submitRequest + * operation, or the updated version of the RequestInstance following an updateRequest + * operation. + */ + private org.ccsds.moims.mo.mal.structures.ObjectRef instance; + + /** + * User supplied reference for the planning request. This is distinct from + * the identity of the RequestInstance that is assigned by the planning function. + */ + private org.ccsds.moims.mo.mal.structures.Identifier userReference; + + /** + * Default constructor for PlanningRequestResponse. + * + */ + public PlanningRequestResponse() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param instance Reference to the RequestInstance created in response to a submitRequest operation, or the updated version of the RequestInstance following an updateRequest operation. + * @param userReference User supplied reference for the planning request. This is distinct from the identity of the RequestInstance that is assigned by the planning function. + */ + public PlanningRequestResponse(org.ccsds.moims.mo.mal.structures.ObjectRef instance, + org.ccsds.moims.mo.mal.structures.Identifier userReference) { + this.instance = instance; + this.userReference = userReference; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.PlanningRequestResponse(); + } + + /** + * Returns the field instance. + * + * @return The field instance + */ + public org.ccsds.moims.mo.mal.structures.ObjectRef getInstance() { + return instance; + } + + /** + * Returns the field userReference. + * + * @return The field userReference + */ + public org.ccsds.moims.mo.mal.structures.Identifier getUserReference() { + return userReference; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof PlanningRequestResponse) { + PlanningRequestResponse other = (PlanningRequestResponse) obj; + if (instance == null) { + if (other.instance != null) { + return false; + } + } else { + if (! instance.equals(other.instance)) { + return false; + } + } + if (userReference == null) { + if (other.userReference != null) { + return false; + } + } else { + if (! userReference.equals(other.userReference)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (instance != null ? instance.hashCode() : 0); + hash = 83 * hash + (userReference != null ? userReference.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(PlanningRequestResponse: "); + buf.append("instance=").append(instance); + buf.append(", userReference=").append(userReference); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (instance == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'instance' cannot be null!"); + } + if (userReference == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'userReference' cannot be null!"); + } + encoder.encodeElement(instance); + encoder.encodeIdentifier(userReference); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + instance = (org.ccsds.moims.mo.mal.structures.ObjectRef) decoder.decodeElement(new org.ccsds.moims.mo.mal.structures.ObjectRef()); + userReference = decoder.decodeIdentifier(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanningRequestResponseList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanningRequestResponseList.java new file mode 100644 index 00000000..070c19c0 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanningRequestResponseList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for PlanningRequestResponse. + */ +public final class PlanningRequestResponseList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107306L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107306L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for PlanningRequestResponseList. + * + */ + public PlanningRequestResponseList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public PlanningRequestResponseList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public PlanningRequestResponseList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.PlanningRequestResponse element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.PlanningRequestResponse element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new PlanningRequestResponseList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.PlanningRequestResponse(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanningUser.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanningUser.java new file mode 100644 index 00000000..6be58c35 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanningUser.java @@ -0,0 +1,83 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E1: The source of a planning request is the user that raises it, and this + * is identified in the user field of a RequestInstance as a reference to + * a PlanningUser object. + */ +public final class PlanningUser extends org.ccsds.moims.mo.mal.structures.MOObject { + + private static final long serialVersionUID = 1407374900331097L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900331097L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for PlanningUser. + * + */ + public PlanningUser() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param objectIdentity The identity of the MO Object. + */ + public PlanningUser(org.ccsds.moims.mo.mal.structures.ObjectIdentity objectIdentity) { + super(objectIdentity); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.PlanningUser(); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof PlanningUser) { + if (! super.equals(obj)) { + return false; + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = super.hashCode(); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(PlanningUser: "); + buf.append(super.toString()); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + super.encode(encoder); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + super.decode(decoder); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanningUserList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanningUserList.java new file mode 100644 index 00000000..97831c31 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PlanningUserList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for PlanningUser. + */ +public final class PlanningUserList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107111L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107111L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for PlanningUserList. + * + */ + public PlanningUserList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public PlanningUserList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public PlanningUserList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.PlanningUser element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.PlanningUser element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new PlanningUserList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.PlanningUser(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PointingConstraint.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PointingConstraint.java new file mode 100644 index 00000000..619c1cdc --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PointingConstraint.java @@ -0,0 +1,347 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E7: Pointing constraints impose a restriction on a planning activity appearing + * in a Plan, based on the pointing direction of a physical object, such as + * a spacecraft or instrument. As with the Direction data types (see 4.6.3.3), + * pointing constraints are consistent with the pointing templates defined + * for use within CCSDS Navigation data format Recommended Standards, and + * specifically the Pointing Request Message (PRM) (reference [10]). PointingConstraint + * is a concrete sub-type of GeometricConstraint that includes fields common + * to all pointing templates. The pointing template itself is then identified + * as a field and any additional arguments applicable to the template are + * provided as a list of name-value pairs. NOTE – Pointing templates are common, + * generic templates that describe pointing modes that may be followed by + * spacecraft. + */ +public final class PointingConstraint extends org.ccsds.moims.mo.mps.structures.GeometricConstraint { + + private static final long serialVersionUID = 1407374900330537L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330537L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Optional. Reference frame to which the pointing constraint applies (see + * 4.4.2). Default frame is the spacecraft frame or any other mission specific + * default frame. + */ + private org.ccsds.moims.mo.mal.structures.Identifier pointingFrame; + + /** + * The primary axis to which the pointing constraints applies. Direction + * in any spacecraft frame. + */ + private org.ccsds.moims.mo.mal.structures.Element boresight; + + /** + * Defines an optional cone region around the boresight, allowing a margin + * for application of the pointing constraint. Default = 0.0. + */ + private org.ccsds.moims.mo.mal.structures.Element boresightMargin; + + /** + * Defines an optional rotation around the boresight with respect to the default + * phase angle, allowing a margin for application of the pointing constraint. + * Default = 0.0. + */ + private org.ccsds.moims.mo.mal.structures.Element phaseAngleMargin; + + /** + * If True, no constraint will apply to the phaseAngle. The phaseAngleMargin + * field will be ignored in this case. Default = False. + */ + private Boolean unconstrainedPhaseAngle; + + /** + * One of the pointing templates defined in the PRM or a mission specific + * pointing template (see 4.4.4). + */ + private org.ccsds.moims.mo.mal.structures.Identifier pointingTemplate; + + /** + * The argument list shall be consistent with the referenced template by name. + * Each value type shall match the argument type according to table 4-6. + */ + private org.ccsds.moims.mo.mps.structures.NamedElementList pointingArguments; + + /** + * Default constructor for PointingConstraint. + * + */ + public PointingConstraint() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param negate Specifies whether the result of combining the Constraints is to be inverted (NOT function). Default = False. + * @param startRef Identifies the point in the duration of the applicable planning activity to which the start of the constraint period relates. Default is the start of the planning activity. + * @param endRef Identifies the point in the duration of the applicable planning activity to which the end of the constraint period relates. Default is the end of the planning activity. + * @param startOffset Offset from startRef that specifies the start of the constraint period. A positive offset implies a shift later in time. Default is no offset. + * @param endOffset Offset from endRef that specifies the end of the constraint period. A positive offset implies a shift later in time. Default is no offset. + * @param pointingFrame Optional. Reference frame to which the pointing constraint applies (see 4.4.2). Default frame is the spacecraft frame or any other mission specific default frame. + * @param boresight The primary axis to which the pointing constraints applies. Direction in any spacecraft frame. + * @param boresightMargin Defines an optional cone region around the boresight, allowing a margin for application of the pointing constraint. Default = 0.0. + * @param phaseAngleMargin Defines an optional rotation around the boresight with respect to the default phase angle, allowing a margin for application of the pointing constraint. Default = 0.0. + * @param unconstrainedPhaseAngle If True, no constraint will apply to the phaseAngle. The phaseAngleMargin field will be ignored in this case. Default = False. + * @param pointingTemplate One of the pointing templates defined in the PRM or a mission specific pointing template (see 4.4.4). + * @param pointingArguments The argument list shall be consistent with the referenced template by name. Each value type shall match the argument type according to table 4-6. + */ + public PointingConstraint(Boolean negate, + org.ccsds.moims.mo.mps.structures.Slider startRef, + org.ccsds.moims.mo.mps.structures.Slider endRef, + org.ccsds.moims.mo.mal.structures.Element startOffset, + org.ccsds.moims.mo.mal.structures.Element endOffset, + org.ccsds.moims.mo.mal.structures.Identifier pointingFrame, + org.ccsds.moims.mo.mal.structures.Element boresight, + org.ccsds.moims.mo.mal.structures.Element boresightMargin, + org.ccsds.moims.mo.mal.structures.Element phaseAngleMargin, + Boolean unconstrainedPhaseAngle, + org.ccsds.moims.mo.mal.structures.Identifier pointingTemplate, + org.ccsds.moims.mo.mps.structures.NamedElementList pointingArguments) { + super(negate, + startRef, + endRef, + startOffset, + endOffset); + this.pointingFrame = pointingFrame; + this.boresight = boresight; + this.boresightMargin = boresightMargin; + this.phaseAngleMargin = phaseAngleMargin; + this.unconstrainedPhaseAngle = unconstrainedPhaseAngle; + this.pointingTemplate = pointingTemplate; + this.pointingArguments = pointingArguments; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param boresight The primary axis to which the pointing constraints applies. Direction in any spacecraft frame. + * @param pointingTemplate One of the pointing templates defined in the PRM or a mission specific pointing template (see 4.4.4). + */ + public PointingConstraint(org.ccsds.moims.mo.mal.structures.Element boresight, + org.ccsds.moims.mo.mal.structures.Identifier pointingTemplate) { + this.pointingFrame = null; + this.boresight = boresight; + this.boresightMargin = null; + this.phaseAngleMargin = null; + this.unconstrainedPhaseAngle = null; + this.pointingTemplate = pointingTemplate; + this.pointingArguments = null; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.PointingConstraint(); + } + + /** + * Returns the field pointingFrame. + * + * @return The field pointingFrame + */ + public org.ccsds.moims.mo.mal.structures.Identifier getPointingFrame() { + return pointingFrame; + } + + /** + * Returns the field boresight. + * + * @return The field boresight + */ + public org.ccsds.moims.mo.mal.structures.Element getBoresight() { + return boresight; + } + + /** + * Returns the field boresightMargin. + * + * @return The field boresightMargin + */ + public org.ccsds.moims.mo.mal.structures.Element getBoresightMargin() { + return boresightMargin; + } + + /** + * Returns the field phaseAngleMargin. + * + * @return The field phaseAngleMargin + */ + public org.ccsds.moims.mo.mal.structures.Element getPhaseAngleMargin() { + return phaseAngleMargin; + } + + /** + * Returns the field unconstrainedPhaseAngle. + * + * @return The field unconstrainedPhaseAngle + */ + public Boolean getUnconstrainedPhaseAngle() { + return unconstrainedPhaseAngle; + } + + /** + * Returns the field pointingTemplate. + * + * @return The field pointingTemplate + */ + public org.ccsds.moims.mo.mal.structures.Identifier getPointingTemplate() { + return pointingTemplate; + } + + /** + * Returns the field pointingArguments. + * + * @return The field pointingArguments + */ + public org.ccsds.moims.mo.mps.structures.NamedElementList getPointingArguments() { + return pointingArguments; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof PointingConstraint) { + if (! super.equals(obj)) { + return false; + } + PointingConstraint other = (PointingConstraint) obj; + if (pointingFrame == null) { + if (other.pointingFrame != null) { + return false; + } + } else { + if (! pointingFrame.equals(other.pointingFrame)) { + return false; + } + } + if (boresight == null) { + if (other.boresight != null) { + return false; + } + } else { + if (! boresight.equals(other.boresight)) { + return false; + } + } + if (boresightMargin == null) { + if (other.boresightMargin != null) { + return false; + } + } else { + if (! boresightMargin.equals(other.boresightMargin)) { + return false; + } + } + if (phaseAngleMargin == null) { + if (other.phaseAngleMargin != null) { + return false; + } + } else { + if (! phaseAngleMargin.equals(other.phaseAngleMargin)) { + return false; + } + } + if (unconstrainedPhaseAngle == null) { + if (other.unconstrainedPhaseAngle != null) { + return false; + } + } else { + if (! unconstrainedPhaseAngle.equals(other.unconstrainedPhaseAngle)) { + return false; + } + } + if (pointingTemplate == null) { + if (other.pointingTemplate != null) { + return false; + } + } else { + if (! pointingTemplate.equals(other.pointingTemplate)) { + return false; + } + } + if (pointingArguments == null) { + if (other.pointingArguments != null) { + return false; + } + } else { + if (! pointingArguments.equals(other.pointingArguments)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = super.hashCode(); + hash = 83 * hash + (pointingFrame != null ? pointingFrame.hashCode() : 0); + hash = 83 * hash + (boresight != null ? boresight.hashCode() : 0); + hash = 83 * hash + (boresightMargin != null ? boresightMargin.hashCode() : 0); + hash = 83 * hash + (phaseAngleMargin != null ? phaseAngleMargin.hashCode() : 0); + hash = 83 * hash + (unconstrainedPhaseAngle != null ? unconstrainedPhaseAngle.hashCode() : 0); + hash = 83 * hash + (pointingTemplate != null ? pointingTemplate.hashCode() : 0); + hash = 83 * hash + (pointingArguments != null ? pointingArguments.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(PointingConstraint: "); + buf.append(super.toString()); + buf.append(", pointingFrame=").append(pointingFrame); + buf.append(", boresight=").append(boresight); + buf.append(", boresightMargin=").append(boresightMargin); + buf.append(", phaseAngleMargin=").append(phaseAngleMargin); + buf.append(", unconstrainedPhaseAngle=").append(unconstrainedPhaseAngle); + buf.append(", pointingTemplate=").append(pointingTemplate); + buf.append(", pointingArguments=").append(pointingArguments); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + super.encode(encoder); + if (boresight == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'boresight' cannot be null!"); + } + if (pointingTemplate == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'pointingTemplate' cannot be null!"); + } + encoder.encodeNullableIdentifier(pointingFrame); + encoder.encodeAbstractElement(boresight); + encoder.encodeNullableAbstractElement(boresightMargin); + encoder.encodeNullableAbstractElement(phaseAngleMargin); + encoder.encodeNullableBoolean(unconstrainedPhaseAngle); + encoder.encodeIdentifier(pointingTemplate); + encoder.encodeNullableElement(pointingArguments); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + super.decode(decoder); + pointingFrame = decoder.decodeNullableIdentifier(); + boresight = (org.ccsds.moims.mo.mal.structures.Element) decoder.decodeAbstractElement(); + boresightMargin = (org.ccsds.moims.mo.mal.structures.Element) decoder.decodeNullableAbstractElement(); + phaseAngleMargin = (org.ccsds.moims.mo.mal.structures.Element) decoder.decodeNullableAbstractElement(); + unconstrainedPhaseAngle = decoder.decodeNullableBoolean(); + pointingTemplate = decoder.decodeIdentifier(); + pointingArguments = (org.ccsds.moims.mo.mps.structures.NamedElementList) decoder.decodeNullableElement(new org.ccsds.moims.mo.mps.structures.NamedElementList()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PointingConstraintList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PointingConstraintList.java new file mode 100644 index 00000000..3c8e9d42 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PointingConstraintList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for PointingConstraint. + */ +public final class PointingConstraintList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107671L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107671L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for PointingConstraintList. + * + */ + public PointingConstraintList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public PointingConstraintList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public PointingConstraintList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.PointingConstraint element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.PointingConstraint element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new PointingConstraintList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.PointingConstraint(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/Position.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/Position.java new file mode 100644 index 00000000..9b0ad3ba --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/Position.java @@ -0,0 +1,48 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E6: Abstract type that represents a unique position in three-dimensional + * space. Depending on the concrete subtype used, the actual position may + * be derived in different manners. + */ +public abstract class Position implements org.ccsds.moims.mo.mal.structures.Composite { + + /** + * Default constructor for Position. + * + */ + public Position() { + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Position) { + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(Position: "); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + return this; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PositionConstraint.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PositionConstraint.java new file mode 100644 index 00000000..093834b2 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PositionConstraint.java @@ -0,0 +1,183 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E7: Sub-type of geometric constraint expressed in terms of a specified + * Position and a tolerance. The tolerance is defined as a sphere around + * the specified position, expressed as a distance or angle. It should be + * noted that the position itself can be expressed using any of the concrete + * position subtypes, including orbital and surface positions. The use of + * a constraint expressed by OrbitalPosition is particularly relevant for + * Earth observation satellites with a repetitive ground track and on-board + * position-based planning function. The position can also be specified as + * an expression. + */ +public final class PositionConstraint extends org.ccsds.moims.mo.mps.structures.GeometricConstraint { + + private static final long serialVersionUID = 1407374900330535L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330535L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Specifies the required position expressed using any concrete position type. + */ + private org.ccsds.moims.mo.mal.structures.Element position; + + /** + * Specifies the maximum distance or angle from the required position that + * satisfies the constraint, effectively defining a sphere around the required + * position. The PhysicalValue shall be of type Distance or Angle (in case + * of an OrbitalPosition). + */ + private org.ccsds.moims.mo.mal.structures.Element tolerance; + + /** + * Default constructor for PositionConstraint. + * + */ + public PositionConstraint() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param negate Specifies whether the result of combining the Constraints is to be inverted (NOT function). Default = False. + * @param startRef Identifies the point in the duration of the applicable planning activity to which the start of the constraint period relates. Default is the start of the planning activity. + * @param endRef Identifies the point in the duration of the applicable planning activity to which the end of the constraint period relates. Default is the end of the planning activity. + * @param startOffset Offset from startRef that specifies the start of the constraint period. A positive offset implies a shift later in time. Default is no offset. + * @param endOffset Offset from endRef that specifies the end of the constraint period. A positive offset implies a shift later in time. Default is no offset. + * @param position Specifies the required position expressed using any concrete position type. + * @param tolerance Specifies the maximum distance or angle from the required position that satisfies the constraint, effectively defining a sphere around the required position. The PhysicalValue shall be of type Distance or Angle (in case of an OrbitalPosition). + */ + public PositionConstraint(Boolean negate, + org.ccsds.moims.mo.mps.structures.Slider startRef, + org.ccsds.moims.mo.mps.structures.Slider endRef, + org.ccsds.moims.mo.mal.structures.Element startOffset, + org.ccsds.moims.mo.mal.structures.Element endOffset, + org.ccsds.moims.mo.mal.structures.Element position, + org.ccsds.moims.mo.mal.structures.Element tolerance) { + super(negate, + startRef, + endRef, + startOffset, + endOffset); + this.position = position; + this.tolerance = tolerance; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param position Specifies the required position expressed using any concrete position type. + * @param tolerance Specifies the maximum distance or angle from the required position that satisfies the constraint, effectively defining a sphere around the required position. The PhysicalValue shall be of type Distance or Angle (in case of an OrbitalPosition). + */ + public PositionConstraint(org.ccsds.moims.mo.mal.structures.Element position, + org.ccsds.moims.mo.mal.structures.Element tolerance) { + this.position = position; + this.tolerance = tolerance; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.PositionConstraint(); + } + + /** + * Returns the field position. + * + * @return The field position + */ + public org.ccsds.moims.mo.mal.structures.Element getPosition() { + return position; + } + + /** + * Returns the field tolerance. + * + * @return The field tolerance + */ + public org.ccsds.moims.mo.mal.structures.Element getTolerance() { + return tolerance; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof PositionConstraint) { + if (! super.equals(obj)) { + return false; + } + PositionConstraint other = (PositionConstraint) obj; + if (position == null) { + if (other.position != null) { + return false; + } + } else { + if (! position.equals(other.position)) { + return false; + } + } + if (tolerance == null) { + if (other.tolerance != null) { + return false; + } + } else { + if (! tolerance.equals(other.tolerance)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = super.hashCode(); + hash = 83 * hash + (position != null ? position.hashCode() : 0); + hash = 83 * hash + (tolerance != null ? tolerance.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(PositionConstraint: "); + buf.append(super.toString()); + buf.append(", position=").append(position); + buf.append(", tolerance=").append(tolerance); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + super.encode(encoder); + if (position == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'position' cannot be null!"); + } + if (tolerance == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'tolerance' cannot be null!"); + } + encoder.encodeAbstractElement(position); + encoder.encodeAbstractElement(tolerance); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + super.decode(decoder); + position = (org.ccsds.moims.mo.mal.structures.Element) decoder.decodeAbstractElement(); + tolerance = (org.ccsds.moims.mo.mal.structures.Element) decoder.decodeAbstractElement(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PositionConstraintList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PositionConstraintList.java new file mode 100644 index 00000000..f03b69c2 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PositionConstraintList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for PositionConstraint. + */ +public final class PositionConstraintList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107673L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107673L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for PositionConstraintList. + * + */ + public PositionConstraintList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public PositionConstraintList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public PositionConstraintList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.PositionConstraint element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.PositionConstraint element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new PositionConstraintList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.PositionConstraint(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PositionList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PositionList.java new file mode 100644 index 00000000..a9c9db6f --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PositionList.java @@ -0,0 +1,23 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for Position. + */ +public final class PositionList extends org.ccsds.moims.mo.mal.structures.HeterogeneousList { + + /** + * Default constructor for PositionList. + * + */ + public PositionList() { + } + + @Override + public boolean add(org.ccsds.moims.mo.mal.structures.Element element) { + if (element != null && !(element instanceof Position)) { + throw new java.lang.ClassCastException("The added element does not extend the type: Position"); + } + return super.add(element); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PositionReference.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PositionReference.java new file mode 100644 index 00000000..cbfb5be6 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PositionReference.java @@ -0,0 +1,114 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E6: A PositionReference is a Position that is evaluated based on a given + * reference position. The manner in which the Position is computed by the + * planning system based on this reference may be mission specific. + */ +public final class PositionReference extends org.ccsds.moims.mo.mps.structures.Position { + + private static final long serialVersionUID = 1407374900330509L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330509L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Name of a mission specific position definition. + */ + private org.ccsds.moims.mo.mal.structures.Identifier reference; + + /** + * Default constructor for PositionReference. + * + */ + public PositionReference() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param reference Name of a mission specific position definition. + */ + public PositionReference(org.ccsds.moims.mo.mal.structures.Identifier reference) { + this.reference = reference; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.PositionReference(); + } + + /** + * Returns the field reference. + * + * @return The field reference + */ + public org.ccsds.moims.mo.mal.structures.Identifier getReference() { + return reference; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof PositionReference) { + if (! super.equals(obj)) { + return false; + } + PositionReference other = (PositionReference) obj; + if (reference == null) { + if (other.reference != null) { + return false; + } + } else { + if (! reference.equals(other.reference)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = super.hashCode(); + hash = 83 * hash + (reference != null ? reference.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(PositionReference: "); + buf.append(super.toString()); + buf.append(", reference=").append(reference); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + super.encode(encoder); + if (reference == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'reference' cannot be null!"); + } + encoder.encodeIdentifier(reference); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + super.decode(decoder); + reference = decoder.decodeIdentifier(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PositionReferenceList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PositionReferenceList.java new file mode 100644 index 00000000..8486d7d7 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PositionReferenceList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for PositionReference. + */ +public final class PositionReferenceList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107699L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107699L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for PositionReferenceList. + * + */ + public PositionReferenceList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public PositionReferenceList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public PositionReferenceList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.PositionReference element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.PositionReference element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new PositionReferenceList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.PositionReference(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PositionRepetition.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PositionRepetition.java new file mode 100644 index 00000000..a8bd1a59 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PositionRepetition.java @@ -0,0 +1,243 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E6: A sub-type of Repetition that starts at a given Position and repeats + * based on separation from each subsequent occurrence. + */ +public final class PositionRepetition extends org.ccsds.moims.mo.mps.structures.Repetition { + + private static final long serialVersionUID = 1407374900330553L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330553L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Nominal position of first occurrence. + */ + private org.ccsds.moims.mo.mal.structures.Element initialPosition; + + /** + * Direction of repetition. + */ + private org.ccsds.moims.mo.mal.structures.Element repetitionDirection; + + /** + * The required Distance between occurrences. + */ + private org.ccsds.moims.mo.mal.structures.Element separation; + + /** + * The allowed tolerance (+/-) in the required distance between occurrences, + * the interpretation of which is dependent on the separationType. + */ + private org.ccsds.moims.mo.mal.structures.Element tolerance; + + /** + * Default constructor for PositionRepetition. + * + */ + public PositionRepetition() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param count Maximum number of repeat cycles/instances. If not specified there is no limit to the number of repetitions. + * @param timeWindow Time period over which the repetition is applicable. If not specified repetition continues indefinitely. + * @param separationType Specifies whether the repetition interval is Relative to the previous occurrence, or Absolute for all occurrences. + * @param initialPosition Nominal position of first occurrence. + * @param repetitionDirection Direction of repetition. + * @param separation The required Distance between occurrences. + * @param tolerance The allowed tolerance (+/-) in the required distance between occurrences, the interpretation of which is dependent on the separationType. + */ + public PositionRepetition(Integer count, + org.ccsds.moims.mo.mps.structures.TimeWindow timeWindow, + org.ccsds.moims.mo.mps.structures.SeparationTypeEnum separationType, + org.ccsds.moims.mo.mal.structures.Element initialPosition, + org.ccsds.moims.mo.mal.structures.Element repetitionDirection, + org.ccsds.moims.mo.mal.structures.Element separation, + org.ccsds.moims.mo.mal.structures.Element tolerance) { + super(count, + timeWindow, + separationType); + this.initialPosition = initialPosition; + this.repetitionDirection = repetitionDirection; + this.separation = separation; + this.tolerance = tolerance; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param separationType Specifies whether the repetition interval is Relative to the previous occurrence, or Absolute for all occurrences. + * @param initialPosition Nominal position of first occurrence. + * @param repetitionDirection Direction of repetition. + * @param separation The required Distance between occurrences. + * @param tolerance The allowed tolerance (+/-) in the required distance between occurrences, the interpretation of which is dependent on the separationType. + */ + public PositionRepetition(org.ccsds.moims.mo.mps.structures.SeparationTypeEnum separationType, + org.ccsds.moims.mo.mal.structures.Element initialPosition, + org.ccsds.moims.mo.mal.structures.Element repetitionDirection, + org.ccsds.moims.mo.mal.structures.Element separation, + org.ccsds.moims.mo.mal.structures.Element tolerance) { + super(separationType); + this.initialPosition = initialPosition; + this.repetitionDirection = repetitionDirection; + this.separation = separation; + this.tolerance = tolerance; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.PositionRepetition(); + } + + /** + * Returns the field initialPosition. + * + * @return The field initialPosition + */ + public org.ccsds.moims.mo.mal.structures.Element getInitialPosition() { + return initialPosition; + } + + /** + * Returns the field repetitionDirection. + * + * @return The field repetitionDirection + */ + public org.ccsds.moims.mo.mal.structures.Element getRepetitionDirection() { + return repetitionDirection; + } + + /** + * Returns the field separation. + * + * @return The field separation + */ + public org.ccsds.moims.mo.mal.structures.Element getSeparation() { + return separation; + } + + /** + * Returns the field tolerance. + * + * @return The field tolerance + */ + public org.ccsds.moims.mo.mal.structures.Element getTolerance() { + return tolerance; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof PositionRepetition) { + if (! super.equals(obj)) { + return false; + } + PositionRepetition other = (PositionRepetition) obj; + if (initialPosition == null) { + if (other.initialPosition != null) { + return false; + } + } else { + if (! initialPosition.equals(other.initialPosition)) { + return false; + } + } + if (repetitionDirection == null) { + if (other.repetitionDirection != null) { + return false; + } + } else { + if (! repetitionDirection.equals(other.repetitionDirection)) { + return false; + } + } + if (separation == null) { + if (other.separation != null) { + return false; + } + } else { + if (! separation.equals(other.separation)) { + return false; + } + } + if (tolerance == null) { + if (other.tolerance != null) { + return false; + } + } else { + if (! tolerance.equals(other.tolerance)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = super.hashCode(); + hash = 83 * hash + (initialPosition != null ? initialPosition.hashCode() : 0); + hash = 83 * hash + (repetitionDirection != null ? repetitionDirection.hashCode() : 0); + hash = 83 * hash + (separation != null ? separation.hashCode() : 0); + hash = 83 * hash + (tolerance != null ? tolerance.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(PositionRepetition: "); + buf.append(super.toString()); + buf.append(", initialPosition=").append(initialPosition); + buf.append(", repetitionDirection=").append(repetitionDirection); + buf.append(", separation=").append(separation); + buf.append(", tolerance=").append(tolerance); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + super.encode(encoder); + if (initialPosition == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'initialPosition' cannot be null!"); + } + if (repetitionDirection == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'repetitionDirection' cannot be null!"); + } + if (separation == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'separation' cannot be null!"); + } + if (tolerance == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'tolerance' cannot be null!"); + } + encoder.encodeAbstractElement(initialPosition); + encoder.encodeAbstractElement(repetitionDirection); + encoder.encodeAbstractElement(separation); + encoder.encodeAbstractElement(tolerance); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + super.decode(decoder); + initialPosition = (org.ccsds.moims.mo.mal.structures.Element) decoder.decodeAbstractElement(); + repetitionDirection = (org.ccsds.moims.mo.mal.structures.Element) decoder.decodeAbstractElement(); + separation = (org.ccsds.moims.mo.mal.structures.Element) decoder.decodeAbstractElement(); + tolerance = (org.ccsds.moims.mo.mal.structures.Element) decoder.decodeAbstractElement(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PositionRepetitionList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PositionRepetitionList.java new file mode 100644 index 00000000..2a522676 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PositionRepetitionList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for PositionRepetition. + */ +public final class PositionRepetitionList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107655L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107655L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for PositionRepetitionList. + * + */ + public PositionRepetitionList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public PositionRepetitionList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public PositionRepetitionList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.PositionRepetition element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.PositionRepetition element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new PositionRepetitionList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.PositionRepetition(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PositionTrigger.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PositionTrigger.java new file mode 100644 index 00000000..2871377d --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PositionTrigger.java @@ -0,0 +1,161 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E6: Sub-type of Trigger based on position. Depending on the coordinate + * type of position used, a margin may be specified in terms of distance from + * the specified position. + */ +public final class PositionTrigger extends org.ccsds.moims.mo.mps.structures.Trigger { + + private static final long serialVersionUID = 1407374900330548L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330548L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Planned position of Trigger. + */ + private org.ccsds.moims.mo.mps.structures.Position triggerPosition; + + /** + * Defines a sphere around the trigger position within which a position is + * considered to meet the trigger condition. + */ + private org.ccsds.moims.mo.mps.structures.Distance distanceMargin; + + /** + * Default constructor for PositionTrigger. + * + */ + public PositionTrigger() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param time Predicted or actual time of Trigger. The predicted time may evolve during the planning process up to the time of execution. The actual time is only available post execution, and hence can only be provided by a plan execution function. + * @param triggerPosition Planned position of Trigger. + * @param distanceMargin Defines a sphere around the trigger position within which a position is considered to meet the trigger condition. + */ + public PositionTrigger(org.ccsds.moims.mo.mal.structures.Time time, + org.ccsds.moims.mo.mps.structures.Position triggerPosition, + org.ccsds.moims.mo.mps.structures.Distance distanceMargin) { + super(time); + this.triggerPosition = triggerPosition; + this.distanceMargin = distanceMargin; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param time Predicted or actual time of Trigger. The predicted time may evolve during the planning process up to the time of execution. The actual time is only available post execution, and hence can only be provided by a plan execution function. + * @param triggerPosition Planned position of Trigger. + */ + public PositionTrigger(org.ccsds.moims.mo.mal.structures.Time time, + org.ccsds.moims.mo.mps.structures.Position triggerPosition) { + super(time); + this.triggerPosition = triggerPosition; + this.distanceMargin = null; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.PositionTrigger(); + } + + /** + * Returns the field triggerPosition. + * + * @return The field triggerPosition + */ + public org.ccsds.moims.mo.mps.structures.Position getTriggerPosition() { + return triggerPosition; + } + + /** + * Returns the field distanceMargin. + * + * @return The field distanceMargin + */ + public org.ccsds.moims.mo.mps.structures.Distance getDistanceMargin() { + return distanceMargin; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof PositionTrigger) { + if (! super.equals(obj)) { + return false; + } + PositionTrigger other = (PositionTrigger) obj; + if (triggerPosition == null) { + if (other.triggerPosition != null) { + return false; + } + } else { + if (! triggerPosition.equals(other.triggerPosition)) { + return false; + } + } + if (distanceMargin == null) { + if (other.distanceMargin != null) { + return false; + } + } else { + if (! distanceMargin.equals(other.distanceMargin)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = super.hashCode(); + hash = 83 * hash + (triggerPosition != null ? triggerPosition.hashCode() : 0); + hash = 83 * hash + (distanceMargin != null ? distanceMargin.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(PositionTrigger: "); + buf.append(super.toString()); + buf.append(", triggerPosition=").append(triggerPosition); + buf.append(", distanceMargin=").append(distanceMargin); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + super.encode(encoder); + if (triggerPosition == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'triggerPosition' cannot be null!"); + } + encoder.encodeAbstractElement(triggerPosition); + encoder.encodeNullableElement(distanceMargin); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + super.decode(decoder); + triggerPosition = (org.ccsds.moims.mo.mps.structures.Position) decoder.decodeAbstractElement(); + distanceMargin = (org.ccsds.moims.mo.mps.structures.Distance) decoder.decodeNullableElement(new org.ccsds.moims.mo.mps.structures.Distance()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PositionTriggerList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PositionTriggerList.java new file mode 100644 index 00000000..486b598c --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PositionTriggerList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for PositionTrigger. + */ +public final class PositionTriggerList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107660L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107660L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for PositionTriggerList. + * + */ + public PositionTriggerList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public PositionTriggerList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public PositionTriggerList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.PositionTrigger element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.PositionTrigger element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new PositionTriggerList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.PositionTrigger(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PredictabilityEnum.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PredictabilityEnum.java new file mode 100644 index 00000000..f5e04ccd --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PredictabilityEnum.java @@ -0,0 +1,118 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * Enumeration class for PredictabilityEnum. + */ +public final class PredictabilityEnum extends org.ccsds.moims.mo.mal.structures.Enumeration { + + private static final long serialVersionUID = 1407374900330700L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330700L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Enumeration value for PREDICTED. + */ + public static final int PREDICTED_VALUE = 1; + + /** + * Enumeration singleton for value PREDICTED. + */ + public static final org.ccsds.moims.mo.mps.structures.PredictabilityEnum PREDICTED = new org.ccsds.moims.mo.mps.structures.PredictabilityEnum(org.ccsds.moims.mo.mps.structures.PredictabilityEnum.PREDICTED_VALUE); + + /** + * Enumeration value for POTENTIAL. + */ + public static final int POTENTIAL_VALUE = 2; + + /** + * Enumeration singleton for value POTENTIAL. + */ + public static final org.ccsds.moims.mo.mps.structures.PredictabilityEnum POTENTIAL = new org.ccsds.moims.mo.mps.structures.PredictabilityEnum(org.ccsds.moims.mo.mps.structures.PredictabilityEnum.POTENTIAL_VALUE); + + /** + * Set of enumeration instances. + */ + private static final org.ccsds.moims.mo.mps.structures.PredictabilityEnum[] _ENUMERATIONS = { + PREDICTED, POTENTIAL}; + + /** + * E1: The PredictabilityEnum enumeration is used to indicate whether a given Event is predictable or can occur at any time. + */ + public PredictabilityEnum() { + super(-1); + } + + /** + * E1: The PredictabilityEnum enumeration is used to indicate whether a given + * Event is predictable or can occur at any time. + * + * @param value The value of the Enumeration. + */ + public PredictabilityEnum(int value) { + super(value); + } + + @Override + public String toString() { + switch (getValue()) { + case PREDICTED_VALUE: + return "PREDICTED"; + case POTENTIAL_VALUE: + return "POTENTIAL"; + default: + throw new RuntimeException("Unknown ordinal!"); + } + } + + /** + * Returns the enumeration element represented by the supplied string, or + * null if not matched. + * + * @param s s The string to search for. + * @return The matched enumeration element, or null if not matched. + */ + public static org.ccsds.moims.mo.mps.structures.PredictabilityEnum fromString(String s) { + switch (s) { + case "PREDICTED": + return PredictabilityEnum.PREDICTED; + case "POTENTIAL": + return PredictabilityEnum.POTENTIAL; + default: + throw new RuntimeException("Unknown Enumeration for the provided string: " + s); + } + } + + @Override + public org.ccsds.moims.mo.mal.structures.Enumeration fromValue(Integer value) { + switch (value) { + case PREDICTED_VALUE: + return PredictabilityEnum.PREDICTED; + case POTENTIAL_VALUE: + return PredictabilityEnum.POTENTIAL; + default: + throw new RuntimeException("Unknown Enumeration for the provided value: " + value); + } + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return _ENUMERATIONS[0]; + } + + @Override + public int getEnumSize() { + return 2; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PredictabilityEnumList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PredictabilityEnumList.java new file mode 100644 index 00000000..90154a88 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/PredictabilityEnumList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for PredictabilityEnum. + */ +public final class PredictabilityEnumList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107508L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107508L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for PredictabilityEnumList. + * + */ + public PredictabilityEnumList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public PredictabilityEnumList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public PredictabilityEnumList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.PredictabilityEnum element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.PredictabilityEnum element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new PredictabilityEnumList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return org.ccsds.moims.mo.mps.structures.PredictabilityEnum.PREDICTED; + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ProfileEntry.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ProfileEntry.java new file mode 100644 index 00000000..d433dce3 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ProfileEntry.java @@ -0,0 +1,141 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E4: Defines the value (or minimum/maximum value) of a resource at a particular + * point in time. + */ +public final class ProfileEntry implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1407374900330802L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330802L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Time of resource data point. + */ + private org.ccsds.moims.mo.mal.structures.Element time; + + /** + * Value of resource data point. MAL Attribute type must match the dataType + * of the Resource definition. + */ + private org.ccsds.moims.mo.mal.structures.Attribute value; + + /** + * Default constructor for ProfileEntry. + * + */ + public ProfileEntry() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param time Time of resource data point. + * @param value Value of resource data point. MAL Attribute type must match the dataType of the Resource definition. + */ + public ProfileEntry(org.ccsds.moims.mo.mal.structures.Element time, + org.ccsds.moims.mo.mal.structures.Attribute value) { + this.time = time; + this.value = value; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.ProfileEntry(); + } + + /** + * Returns the field time. + * + * @return The field time + */ + public org.ccsds.moims.mo.mal.structures.Element getTime() { + return time; + } + + /** + * Returns the field value. + * + * @return The field value + */ + public org.ccsds.moims.mo.mal.structures.Attribute getValue() { + return value; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ProfileEntry) { + ProfileEntry other = (ProfileEntry) obj; + if (time == null) { + if (other.time != null) { + return false; + } + } else { + if (! time.equals(other.time)) { + return false; + } + } + if (value == null) { + if (other.value != null) { + return false; + } + } else { + if (! value.equals(other.value)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (time != null ? time.hashCode() : 0); + hash = 83 * hash + (value != null ? value.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(ProfileEntry: "); + buf.append("time=").append(time); + buf.append(", value=").append(value); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (time == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'time' cannot be null!"); + } + if (value == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'value' cannot be null!"); + } + encoder.encodeAbstractElement(time); + encoder.encodeAttribute(value); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + time = (org.ccsds.moims.mo.mal.structures.Element) decoder.decodeAbstractElement(); + value = (org.ccsds.moims.mo.mal.structures.Attribute) decoder.decodeAttribute(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ProfileEntryList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ProfileEntryList.java new file mode 100644 index 00000000..06c7f425 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ProfileEntryList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for ProfileEntry. + */ +public final class ProfileEntryList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107406L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107406L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for ProfileEntryList. + * + */ + public ProfileEntryList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public ProfileEntryList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public ProfileEntryList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.ProfileEntry element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.ProfileEntry element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new ProfileEntryList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.ProfileEntry(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ProfileSegment.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ProfileSegment.java new file mode 100644 index 00000000..6525c259 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ProfileSegment.java @@ -0,0 +1,285 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E4: A ProfileSegment defines the time range and interpolation method for + * a set of ProfileEntries. + */ +public final class ProfileSegment implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1407374900330800L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330800L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Interpolation method to be applied for values lying between points defined + * in the profile segment. Default = Step. + */ + private org.ccsds.moims.mo.mps.structures.InterpolationTypeEnum interpolation; + + /** + * Start of time range covered by the profile segment. + */ + private org.ccsds.moims.mo.mal.structures.Element start; + + /** + * End of time range covered by the profile segment. + */ + private org.ccsds.moims.mo.mal.structures.Element end; + + /** + * Indicates whether the start time is included in the profile segment. Default + * = True. + */ + private Boolean startIncluded; + + /** + * Indicates whether the end time is included in the profile segment. This + * allows the same time to be used as the end of one segment and the start + * of another. Default = False. + */ + private Boolean endIncluded; + + /** + * Set of profile entries (resource value points). + */ + private org.ccsds.moims.mo.mps.structures.ProfileEntryList profileEntries; + + /** + * Default constructor for ProfileSegment. + * + */ + public ProfileSegment() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param interpolation Interpolation method to be applied for values lying between points defined in the profile segment. Default = Step. + * @param start Start of time range covered by the profile segment. + * @param end End of time range covered by the profile segment. + * @param startIncluded Indicates whether the start time is included in the profile segment. Default = True. + * @param endIncluded Indicates whether the end time is included in the profile segment. This allows the same time to be used as the end of one segment and the start of another. Default = False. + * @param profileEntries Set of profile entries (resource value points). + */ + public ProfileSegment(org.ccsds.moims.mo.mps.structures.InterpolationTypeEnum interpolation, + org.ccsds.moims.mo.mal.structures.Element start, + org.ccsds.moims.mo.mal.structures.Element end, + Boolean startIncluded, + Boolean endIncluded, + org.ccsds.moims.mo.mps.structures.ProfileEntryList profileEntries) { + this.interpolation = interpolation; + this.start = start; + this.end = end; + this.startIncluded = startIncluded; + this.endIncluded = endIncluded; + this.profileEntries = profileEntries; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param start Start of time range covered by the profile segment. + * @param end End of time range covered by the profile segment. + * @param profileEntries Set of profile entries (resource value points). + */ + public ProfileSegment(org.ccsds.moims.mo.mal.structures.Element start, + org.ccsds.moims.mo.mal.structures.Element end, + org.ccsds.moims.mo.mps.structures.ProfileEntryList profileEntries) { + this.interpolation = null; + this.start = start; + this.end = end; + this.startIncluded = null; + this.endIncluded = null; + this.profileEntries = profileEntries; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.ProfileSegment(); + } + + /** + * Returns the field interpolation. + * + * @return The field interpolation + */ + public org.ccsds.moims.mo.mps.structures.InterpolationTypeEnum getInterpolation() { + return interpolation; + } + + /** + * Returns the field start. + * + * @return The field start + */ + public org.ccsds.moims.mo.mal.structures.Element getStart() { + return start; + } + + /** + * Returns the field end. + * + * @return The field end + */ + public org.ccsds.moims.mo.mal.structures.Element getEnd() { + return end; + } + + /** + * Returns the field startIncluded. + * + * @return The field startIncluded + */ + public Boolean getStartIncluded() { + return startIncluded; + } + + /** + * Returns the field endIncluded. + * + * @return The field endIncluded + */ + public Boolean getEndIncluded() { + return endIncluded; + } + + /** + * Returns the field profileEntries. + * + * @return The field profileEntries + */ + public org.ccsds.moims.mo.mps.structures.ProfileEntryList getProfileEntries() { + return profileEntries; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ProfileSegment) { + ProfileSegment other = (ProfileSegment) obj; + if (interpolation == null) { + if (other.interpolation != null) { + return false; + } + } else { + if (! interpolation.equals(other.interpolation)) { + return false; + } + } + if (start == null) { + if (other.start != null) { + return false; + } + } else { + if (! start.equals(other.start)) { + return false; + } + } + if (end == null) { + if (other.end != null) { + return false; + } + } else { + if (! end.equals(other.end)) { + return false; + } + } + if (startIncluded == null) { + if (other.startIncluded != null) { + return false; + } + } else { + if (! startIncluded.equals(other.startIncluded)) { + return false; + } + } + if (endIncluded == null) { + if (other.endIncluded != null) { + return false; + } + } else { + if (! endIncluded.equals(other.endIncluded)) { + return false; + } + } + if (profileEntries == null) { + if (other.profileEntries != null) { + return false; + } + } else { + if (! profileEntries.equals(other.profileEntries)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (interpolation != null ? interpolation.hashCode() : 0); + hash = 83 * hash + (start != null ? start.hashCode() : 0); + hash = 83 * hash + (end != null ? end.hashCode() : 0); + hash = 83 * hash + (startIncluded != null ? startIncluded.hashCode() : 0); + hash = 83 * hash + (endIncluded != null ? endIncluded.hashCode() : 0); + hash = 83 * hash + (profileEntries != null ? profileEntries.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(ProfileSegment: "); + buf.append("interpolation=").append(interpolation); + buf.append(", start=").append(start); + buf.append(", end=").append(end); + buf.append(", startIncluded=").append(startIncluded); + buf.append(", endIncluded=").append(endIncluded); + buf.append(", profileEntries=").append(profileEntries); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (start == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'start' cannot be null!"); + } + if (end == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'end' cannot be null!"); + } + if (profileEntries == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'profileEntries' cannot be null!"); + } + encoder.encodeNullableElement(interpolation); + encoder.encodeAbstractElement(start); + encoder.encodeAbstractElement(end); + encoder.encodeNullableBoolean(startIncluded); + encoder.encodeNullableBoolean(endIncluded); + encoder.encodeElement(profileEntries); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + interpolation = (org.ccsds.moims.mo.mps.structures.InterpolationTypeEnum) decoder.decodeNullableElement(org.ccsds.moims.mo.mps.structures.InterpolationTypeEnum.STEP); + start = (org.ccsds.moims.mo.mal.structures.Element) decoder.decodeAbstractElement(); + end = (org.ccsds.moims.mo.mal.structures.Element) decoder.decodeAbstractElement(); + startIncluded = decoder.decodeNullableBoolean(); + endIncluded = decoder.decodeNullableBoolean(); + profileEntries = (org.ccsds.moims.mo.mps.structures.ProfileEntryList) decoder.decodeElement(new org.ccsds.moims.mo.mps.structures.ProfileEntryList()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ProfileSegmentList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ProfileSegmentList.java new file mode 100644 index 00000000..93b18fe7 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ProfileSegmentList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for ProfileSegment. + */ +public final class ProfileSegmentList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107408L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107408L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for ProfileSegmentList. + * + */ + public ProfileSegmentList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public ProfileSegmentList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public ProfileSegmentList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.ProfileSegment element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.ProfileSegment element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new ProfileSegmentList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.ProfileSegment(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RADecDirection.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RADecDirection.java new file mode 100644 index 00000000..ece3b97e --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RADecDirection.java @@ -0,0 +1,182 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E6: Represents a Direction based on celestial angular coordinates of right + * ascension and declination. + */ +public final class RADecDirection extends org.ccsds.moims.mo.mps.structures.Direction { + + private static final long serialVersionUID = 1407374900330512L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330512L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Right Ascension: Celestial angular coordinate, measured eastward along + * the celestial equator. + */ + private org.ccsds.moims.mo.mps.structures.Angle ra; + + /** + * Declination: Celestial angular coordinate, north or south of the celestial + * equator. + */ + private org.ccsds.moims.mo.mps.structures.Angle dec; + + /** + * Reference frame within which the direction is expressed. Must be a quasi-inertial + * celestial body or orbit-related frame (see 4.4.2). + */ + private org.ccsds.moims.mo.mal.structures.Identifier frame; + + /** + * Default constructor for RADecDirection. + * + */ + public RADecDirection() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param ra Right Ascension: Celestial angular coordinate, measured eastward along the celestial equator. + * @param dec Declination: Celestial angular coordinate, north or south of the celestial equator. + * @param frame Reference frame within which the direction is expressed. Must be a quasi-inertial celestial body or orbit-related frame (see 4.4.2). + */ + public RADecDirection(org.ccsds.moims.mo.mps.structures.Angle ra, + org.ccsds.moims.mo.mps.structures.Angle dec, + org.ccsds.moims.mo.mal.structures.Identifier frame) { + this.ra = ra; + this.dec = dec; + this.frame = frame; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.RADecDirection(); + } + + /** + * Returns the field ra. + * + * @return The field ra + */ + public org.ccsds.moims.mo.mps.structures.Angle getRa() { + return ra; + } + + /** + * Returns the field dec. + * + * @return The field dec + */ + public org.ccsds.moims.mo.mps.structures.Angle getDec() { + return dec; + } + + /** + * Returns the field frame. + * + * @return The field frame + */ + public org.ccsds.moims.mo.mal.structures.Identifier getFrame() { + return frame; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof RADecDirection) { + if (! super.equals(obj)) { + return false; + } + RADecDirection other = (RADecDirection) obj; + if (ra == null) { + if (other.ra != null) { + return false; + } + } else { + if (! ra.equals(other.ra)) { + return false; + } + } + if (dec == null) { + if (other.dec != null) { + return false; + } + } else { + if (! dec.equals(other.dec)) { + return false; + } + } + if (frame == null) { + if (other.frame != null) { + return false; + } + } else { + if (! frame.equals(other.frame)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = super.hashCode(); + hash = 83 * hash + (ra != null ? ra.hashCode() : 0); + hash = 83 * hash + (dec != null ? dec.hashCode() : 0); + hash = 83 * hash + (frame != null ? frame.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(RADecDirection: "); + buf.append(super.toString()); + buf.append(", ra=").append(ra); + buf.append(", dec=").append(dec); + buf.append(", frame=").append(frame); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + super.encode(encoder); + if (ra == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'ra' cannot be null!"); + } + if (dec == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'dec' cannot be null!"); + } + if (frame == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'frame' cannot be null!"); + } + encoder.encodeElement(ra); + encoder.encodeElement(dec); + encoder.encodeIdentifier(frame); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + super.decode(decoder); + ra = (org.ccsds.moims.mo.mps.structures.Angle) decoder.decodeElement(new org.ccsds.moims.mo.mps.structures.Angle()); + dec = (org.ccsds.moims.mo.mps.structures.Angle) decoder.decodeElement(new org.ccsds.moims.mo.mps.structures.Angle()); + frame = decoder.decodeIdentifier(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RADecDirectionList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RADecDirectionList.java new file mode 100644 index 00000000..f3bfbc9d --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RADecDirectionList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for RADecDirection. + */ +public final class RADecDirectionList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107696L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107696L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for RADecDirectionList. + * + */ + public RADecDirectionList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public RADecDirectionList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public RADecDirectionList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.RADecDirection element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.RADecDirection element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new RADecDirectionList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.RADecDirection(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RelativeProfileEntry.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RelativeProfileEntry.java new file mode 100644 index 00000000..b4088c74 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RelativeProfileEntry.java @@ -0,0 +1,143 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E4: Defines the value (or minimum/maximum value) of a resource at a relative + * point in time. Specific subtypes exist for each allowed data type for a + * Resource. These replace the variant type value field with one of concrete + * data type. + */ +public final class RelativeProfileEntry implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1407374900330805L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330805L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Relative time of resource data point. + */ + private org.ccsds.moims.mo.mal.structures.Element time; + + /** + * Value of resource data point. MAL Attribute type must match the dataType + * of the Resource definition. + */ + private org.ccsds.moims.mo.mal.structures.Attribute value; + + /** + * Default constructor for RelativeProfileEntry. + * + */ + public RelativeProfileEntry() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param time Relative time of resource data point. + * @param value Value of resource data point. MAL Attribute type must match the dataType of the Resource definition. + */ + public RelativeProfileEntry(org.ccsds.moims.mo.mal.structures.Element time, + org.ccsds.moims.mo.mal.structures.Attribute value) { + this.time = time; + this.value = value; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.RelativeProfileEntry(); + } + + /** + * Returns the field time. + * + * @return The field time + */ + public org.ccsds.moims.mo.mal.structures.Element getTime() { + return time; + } + + /** + * Returns the field value. + * + * @return The field value + */ + public org.ccsds.moims.mo.mal.structures.Attribute getValue() { + return value; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof RelativeProfileEntry) { + RelativeProfileEntry other = (RelativeProfileEntry) obj; + if (time == null) { + if (other.time != null) { + return false; + } + } else { + if (! time.equals(other.time)) { + return false; + } + } + if (value == null) { + if (other.value != null) { + return false; + } + } else { + if (! value.equals(other.value)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (time != null ? time.hashCode() : 0); + hash = 83 * hash + (value != null ? value.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(RelativeProfileEntry: "); + buf.append("time=").append(time); + buf.append(", value=").append(value); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (time == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'time' cannot be null!"); + } + if (value == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'value' cannot be null!"); + } + encoder.encodeAbstractElement(time); + encoder.encodeAttribute(value); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + time = (org.ccsds.moims.mo.mal.structures.Element) decoder.decodeAbstractElement(); + value = (org.ccsds.moims.mo.mal.structures.Attribute) decoder.decodeAttribute(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RelativeProfileEntryList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RelativeProfileEntryList.java new file mode 100644 index 00000000..62212f7a --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RelativeProfileEntryList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for RelativeProfileEntry. + */ +public final class RelativeProfileEntryList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107403L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107403L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for RelativeProfileEntryList. + * + */ + public RelativeProfileEntryList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public RelativeProfileEntryList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public RelativeProfileEntryList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.RelativeProfileEntry element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.RelativeProfileEntry element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new RelativeProfileEntryList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.RelativeProfileEntry(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RelativeProfileSegment.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RelativeProfileSegment.java new file mode 100644 index 00000000..7c2c73c0 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RelativeProfileSegment.java @@ -0,0 +1,285 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E4: A RelativeResourceSegment defines the time range and interpolation + * method for a set of RelativeProfileEntries. + */ +public final class RelativeProfileSegment implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1407374900330804L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330804L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Interpolation method to be applied for values lying between points defined + * in the relative profile segment. Default = Step. + */ + private org.ccsds.moims.mo.mps.structures.InterpolationTypeEnum interpolation; + + /** + * Relative start of time range covered by the relative profile segment. + */ + private org.ccsds.moims.mo.mal.structures.Element start; + + /** + * Relative end of time range covered by the relative profile segment. + */ + private org.ccsds.moims.mo.mal.structures.Element end; + + /** + * Indicates whether the start time is included in the relative profile segment. + * Default = True. + */ + private Boolean startIncluded; + + /** + * Indicates whether the end time is included in the relative profile segment. + * This allows the same time to be used as the end of one segment and the + * start of another. Default = False. + */ + private Boolean endIncluded; + + /** + * Set of relative profile entries (resource value points). + */ + private org.ccsds.moims.mo.mps.structures.RelativeProfileEntryList profileEntries; + + /** + * Default constructor for RelativeProfileSegment. + * + */ + public RelativeProfileSegment() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param interpolation Interpolation method to be applied for values lying between points defined in the relative profile segment. Default = Step. + * @param start Relative start of time range covered by the relative profile segment. + * @param end Relative end of time range covered by the relative profile segment. + * @param startIncluded Indicates whether the start time is included in the relative profile segment. Default = True. + * @param endIncluded Indicates whether the end time is included in the relative profile segment. This allows the same time to be used as the end of one segment and the start of another. Default = False. + * @param profileEntries Set of relative profile entries (resource value points). + */ + public RelativeProfileSegment(org.ccsds.moims.mo.mps.structures.InterpolationTypeEnum interpolation, + org.ccsds.moims.mo.mal.structures.Element start, + org.ccsds.moims.mo.mal.structures.Element end, + Boolean startIncluded, + Boolean endIncluded, + org.ccsds.moims.mo.mps.structures.RelativeProfileEntryList profileEntries) { + this.interpolation = interpolation; + this.start = start; + this.end = end; + this.startIncluded = startIncluded; + this.endIncluded = endIncluded; + this.profileEntries = profileEntries; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param start Relative start of time range covered by the relative profile segment. + * @param end Relative end of time range covered by the relative profile segment. + * @param profileEntries Set of relative profile entries (resource value points). + */ + public RelativeProfileSegment(org.ccsds.moims.mo.mal.structures.Element start, + org.ccsds.moims.mo.mal.structures.Element end, + org.ccsds.moims.mo.mps.structures.RelativeProfileEntryList profileEntries) { + this.interpolation = null; + this.start = start; + this.end = end; + this.startIncluded = null; + this.endIncluded = null; + this.profileEntries = profileEntries; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.RelativeProfileSegment(); + } + + /** + * Returns the field interpolation. + * + * @return The field interpolation + */ + public org.ccsds.moims.mo.mps.structures.InterpolationTypeEnum getInterpolation() { + return interpolation; + } + + /** + * Returns the field start. + * + * @return The field start + */ + public org.ccsds.moims.mo.mal.structures.Element getStart() { + return start; + } + + /** + * Returns the field end. + * + * @return The field end + */ + public org.ccsds.moims.mo.mal.structures.Element getEnd() { + return end; + } + + /** + * Returns the field startIncluded. + * + * @return The field startIncluded + */ + public Boolean getStartIncluded() { + return startIncluded; + } + + /** + * Returns the field endIncluded. + * + * @return The field endIncluded + */ + public Boolean getEndIncluded() { + return endIncluded; + } + + /** + * Returns the field profileEntries. + * + * @return The field profileEntries + */ + public org.ccsds.moims.mo.mps.structures.RelativeProfileEntryList getProfileEntries() { + return profileEntries; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof RelativeProfileSegment) { + RelativeProfileSegment other = (RelativeProfileSegment) obj; + if (interpolation == null) { + if (other.interpolation != null) { + return false; + } + } else { + if (! interpolation.equals(other.interpolation)) { + return false; + } + } + if (start == null) { + if (other.start != null) { + return false; + } + } else { + if (! start.equals(other.start)) { + return false; + } + } + if (end == null) { + if (other.end != null) { + return false; + } + } else { + if (! end.equals(other.end)) { + return false; + } + } + if (startIncluded == null) { + if (other.startIncluded != null) { + return false; + } + } else { + if (! startIncluded.equals(other.startIncluded)) { + return false; + } + } + if (endIncluded == null) { + if (other.endIncluded != null) { + return false; + } + } else { + if (! endIncluded.equals(other.endIncluded)) { + return false; + } + } + if (profileEntries == null) { + if (other.profileEntries != null) { + return false; + } + } else { + if (! profileEntries.equals(other.profileEntries)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (interpolation != null ? interpolation.hashCode() : 0); + hash = 83 * hash + (start != null ? start.hashCode() : 0); + hash = 83 * hash + (end != null ? end.hashCode() : 0); + hash = 83 * hash + (startIncluded != null ? startIncluded.hashCode() : 0); + hash = 83 * hash + (endIncluded != null ? endIncluded.hashCode() : 0); + hash = 83 * hash + (profileEntries != null ? profileEntries.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(RelativeProfileSegment: "); + buf.append("interpolation=").append(interpolation); + buf.append(", start=").append(start); + buf.append(", end=").append(end); + buf.append(", startIncluded=").append(startIncluded); + buf.append(", endIncluded=").append(endIncluded); + buf.append(", profileEntries=").append(profileEntries); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (start == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'start' cannot be null!"); + } + if (end == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'end' cannot be null!"); + } + if (profileEntries == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'profileEntries' cannot be null!"); + } + encoder.encodeNullableElement(interpolation); + encoder.encodeAbstractElement(start); + encoder.encodeAbstractElement(end); + encoder.encodeNullableBoolean(startIncluded); + encoder.encodeNullableBoolean(endIncluded); + encoder.encodeElement(profileEntries); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + interpolation = (org.ccsds.moims.mo.mps.structures.InterpolationTypeEnum) decoder.decodeNullableElement(org.ccsds.moims.mo.mps.structures.InterpolationTypeEnum.STEP); + start = (org.ccsds.moims.mo.mal.structures.Element) decoder.decodeAbstractElement(); + end = (org.ccsds.moims.mo.mal.structures.Element) decoder.decodeAbstractElement(); + startIncluded = decoder.decodeNullableBoolean(); + endIncluded = decoder.decodeNullableBoolean(); + profileEntries = (org.ccsds.moims.mo.mps.structures.RelativeProfileEntryList) decoder.decodeElement(new org.ccsds.moims.mo.mps.structures.RelativeProfileEntryList()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RelativeProfileSegmentList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RelativeProfileSegmentList.java new file mode 100644 index 00000000..22fe8285 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RelativeProfileSegmentList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for RelativeProfileSegment. + */ +public final class RelativeProfileSegmentList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107404L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107404L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for RelativeProfileSegmentList. + * + */ + public RelativeProfileSegmentList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public RelativeProfileSegmentList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public RelativeProfileSegmentList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.RelativeProfileSegment element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.RelativeProfileSegment element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new RelativeProfileSegmentList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.RelativeProfileSegment(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RelativeResourceProfile.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RelativeResourceProfile.java new file mode 100644 index 00000000..69843a1f --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RelativeResourceProfile.java @@ -0,0 +1,142 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E4: A variation on ResourceProfile, the RelativeResourceProfile uses relative + * timestamps of type Duration (indicating an offset from a reference time, + * such as the start time of an Activity). RelativeResourceProfiles are used + * in the context of a complex resource constraint. + */ +public final class RelativeResourceProfile implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1407374900330803L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330803L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Reference to a Resource. + */ + private org.ccsds.moims.mo.mal.structures.ObjectRef resource; + + /** + * Set of RelativeProfileSegments. + */ + private org.ccsds.moims.mo.mps.structures.RelativeProfileSegmentList profileSegments; + + /** + * Default constructor for RelativeResourceProfile. + * + */ + public RelativeResourceProfile() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param resource Reference to a Resource. + * @param profileSegments Set of RelativeProfileSegments. + */ + public RelativeResourceProfile(org.ccsds.moims.mo.mal.structures.ObjectRef resource, + org.ccsds.moims.mo.mps.structures.RelativeProfileSegmentList profileSegments) { + this.resource = resource; + this.profileSegments = profileSegments; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.RelativeResourceProfile(); + } + + /** + * Returns the field resource. + * + * @return The field resource + */ + public org.ccsds.moims.mo.mal.structures.ObjectRef getResource() { + return resource; + } + + /** + * Returns the field profileSegments. + * + * @return The field profileSegments + */ + public org.ccsds.moims.mo.mps.structures.RelativeProfileSegmentList getProfileSegments() { + return profileSegments; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof RelativeResourceProfile) { + RelativeResourceProfile other = (RelativeResourceProfile) obj; + if (resource == null) { + if (other.resource != null) { + return false; + } + } else { + if (! resource.equals(other.resource)) { + return false; + } + } + if (profileSegments == null) { + if (other.profileSegments != null) { + return false; + } + } else { + if (! profileSegments.equals(other.profileSegments)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (resource != null ? resource.hashCode() : 0); + hash = 83 * hash + (profileSegments != null ? profileSegments.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(RelativeResourceProfile: "); + buf.append("resource=").append(resource); + buf.append(", profileSegments=").append(profileSegments); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (resource == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'resource' cannot be null!"); + } + if (profileSegments == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'profileSegments' cannot be null!"); + } + encoder.encodeElement(resource); + encoder.encodeElement(profileSegments); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + resource = (org.ccsds.moims.mo.mal.structures.ObjectRef) decoder.decodeElement(new org.ccsds.moims.mo.mal.structures.ObjectRef()); + profileSegments = (org.ccsds.moims.mo.mps.structures.RelativeProfileSegmentList) decoder.decodeElement(new org.ccsds.moims.mo.mps.structures.RelativeProfileSegmentList()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RelativeResourceProfileList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RelativeResourceProfileList.java new file mode 100644 index 00000000..12fbf626 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RelativeResourceProfileList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for RelativeResourceProfile. + */ +public final class RelativeResourceProfileList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107405L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107405L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for RelativeResourceProfileList. + * + */ + public RelativeResourceProfileList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public RelativeResourceProfileList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public RelativeResourceProfileList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.RelativeResourceProfile element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.RelativeResourceProfile element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new RelativeResourceProfileList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.RelativeResourceProfile(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/Repetition.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/Repetition.java new file mode 100644 index 00000000..a312cc14 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/Repetition.java @@ -0,0 +1,167 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E1: A repetition is used to specify the repeated instantiation of a [set + * of] planning activities. Multiple subtypes of Repetition are defined to + * support the specification of repeat cycles by different criteria. It can + * be used in the context of a planning request to specify a standing order + * for repeated execution of the [set of] planning activities. In the context + * of an ActivityNode embedded within a planning request (see 4.5.2.3.2), + * it is possible to nest one Repetition inside another, enabling the specification + * of complex repetitive sequences of activities. + */ +public abstract class Repetition implements org.ccsds.moims.mo.mal.structures.Composite { + + /** + * Maximum number of repeat cycles/instances. If not specified there is no + * limit to the number of repetitions. + */ + private Integer count; + + /** + * Time period over which the repetition is applicable. If not specified repetition + * continues indefinitely. + */ + private org.ccsds.moims.mo.mps.structures.TimeWindow timeWindow; + + /** + * Specifies whether the repetition interval is Relative to the previous occurrence, + * or Absolute for all occurrences. + */ + private org.ccsds.moims.mo.mps.structures.SeparationTypeEnum separationType; + + /** + * Default constructor for Repetition. + * + */ + public Repetition() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param count Maximum number of repeat cycles/instances. If not specified there is no limit to the number of repetitions. + * @param timeWindow Time period over which the repetition is applicable. If not specified repetition continues indefinitely. + * @param separationType Specifies whether the repetition interval is Relative to the previous occurrence, or Absolute for all occurrences. + */ + public Repetition(Integer count, + org.ccsds.moims.mo.mps.structures.TimeWindow timeWindow, + org.ccsds.moims.mo.mps.structures.SeparationTypeEnum separationType) { + this.count = count; + this.timeWindow = timeWindow; + this.separationType = separationType; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param separationType Specifies whether the repetition interval is Relative to the previous occurrence, or Absolute for all occurrences. + */ + public Repetition(org.ccsds.moims.mo.mps.structures.SeparationTypeEnum separationType) { + this.count = null; + this.timeWindow = null; + this.separationType = separationType; + } + + /** + * Returns the field count. + * + * @return The field count + */ + public Integer getCount() { + return count; + } + + /** + * Returns the field timeWindow. + * + * @return The field timeWindow + */ + public org.ccsds.moims.mo.mps.structures.TimeWindow getTimeWindow() { + return timeWindow; + } + + /** + * Returns the field separationType. + * + * @return The field separationType + */ + public org.ccsds.moims.mo.mps.structures.SeparationTypeEnum getSeparationType() { + return separationType; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Repetition) { + Repetition other = (Repetition) obj; + if (count == null) { + if (other.count != null) { + return false; + } + } else { + if (! count.equals(other.count)) { + return false; + } + } + if (timeWindow == null) { + if (other.timeWindow != null) { + return false; + } + } else { + if (! timeWindow.equals(other.timeWindow)) { + return false; + } + } + if (separationType == null) { + if (other.separationType != null) { + return false; + } + } else { + if (! separationType.equals(other.separationType)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (count != null ? count.hashCode() : 0); + hash = 83 * hash + (timeWindow != null ? timeWindow.hashCode() : 0); + hash = 83 * hash + (separationType != null ? separationType.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(Repetition: "); + buf.append("count=").append(count); + buf.append(", timeWindow=").append(timeWindow); + buf.append(", separationType=").append(separationType); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (separationType == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'separationType' cannot be null!"); + } + encoder.encodeNullableInteger(count); + encoder.encodeNullableElement(timeWindow); + encoder.encodeElement(separationType); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + count = decoder.decodeNullableInteger(); + timeWindow = (org.ccsds.moims.mo.mps.structures.TimeWindow) decoder.decodeNullableElement(new org.ccsds.moims.mo.mps.structures.TimeWindow()); + separationType = (org.ccsds.moims.mo.mps.structures.SeparationTypeEnum) decoder.decodeElement(org.ccsds.moims.mo.mps.structures.SeparationTypeEnum.RELATIVE); + return this; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RepetitionList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RepetitionList.java new file mode 100644 index 00000000..71eb9e9a --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RepetitionList.java @@ -0,0 +1,23 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for Repetition. + */ +public final class RepetitionList extends org.ccsds.moims.mo.mal.structures.HeterogeneousList { + + /** + * Default constructor for RepetitionList. + * + */ + public RepetitionList() { + } + + @Override + public boolean add(org.ccsds.moims.mo.mal.structures.Element element) { + if (element != null && !(element instanceof Repetition)) { + throw new java.lang.ClassCastException("The added element does not extend the type: Repetition"); + } + return super.add(element); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RequestDefinition.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RequestDefinition.java new file mode 100644 index 00000000..b917c63d --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RequestDefinition.java @@ -0,0 +1,236 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E1: A RequestDefinition is an MO object that contains the specification + * of a re-usable planning request template. + */ +public final class RequestDefinition extends org.ccsds.moims.mo.mal.structures.MOObject { + + private static final long serialVersionUID = 1407374900330897L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330897L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Description of the re-usable RequestDefinition. + */ + private String description; + + /** + * List of argument definitions. Arguments may be referenced in ActivityDetails + * and constraints. + */ + private org.ccsds.moims.mo.mps.structures.ArgDefList argDefs; + + /** + * A flag that indicates whether the planning request is for a repetitive + * standing order (unbounded other than by the validity period), or is a one-off + * request. If it is a standing order, then the supplied activity details + * must be an ActivityNode with specification of the repetition criteria. + * It should be noted that a one-off request can still include repetition. + */ + private Boolean standingOrder; + + /** + * Set of activity details specifying requested activities. + */ + private org.ccsds.moims.mo.mps.structures.ActivityDetailsList activities; + + /** + * Default constructor for RequestDefinition. + * + */ + public RequestDefinition() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param objectIdentity The identity of the MO Object. + * @param description Description of the re-usable RequestDefinition. + * @param argDefs List of argument definitions. Arguments may be referenced in ActivityDetails and constraints. + * @param standingOrder A flag that indicates whether the planning request is for a repetitive standing order (unbounded other than by the validity period), or is a one-off request. If it is a standing order, then the supplied activity details must be an ActivityNode with specification of the repetition criteria. It should be noted that a one-off request can still include repetition. + * @param activities Set of activity details specifying requested activities. + */ + public RequestDefinition(org.ccsds.moims.mo.mal.structures.ObjectIdentity objectIdentity, + String description, + org.ccsds.moims.mo.mps.structures.ArgDefList argDefs, + Boolean standingOrder, + org.ccsds.moims.mo.mps.structures.ActivityDetailsList activities) { + super(objectIdentity); + this.description = description; + this.argDefs = argDefs; + this.standingOrder = standingOrder; + this.activities = activities; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param objectIdentity The identity of the MO Object. + * @param description Description of the re-usable RequestDefinition. + * @param standingOrder A flag that indicates whether the planning request is for a repetitive standing order (unbounded other than by the validity period), or is a one-off request. If it is a standing order, then the supplied activity details must be an ActivityNode with specification of the repetition criteria. It should be noted that a one-off request can still include repetition. + * @param activities Set of activity details specifying requested activities. + */ + public RequestDefinition(org.ccsds.moims.mo.mal.structures.ObjectIdentity objectIdentity, + String description, + Boolean standingOrder, + org.ccsds.moims.mo.mps.structures.ActivityDetailsList activities) { + super(objectIdentity); + this.description = description; + this.argDefs = null; + this.standingOrder = standingOrder; + this.activities = activities; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.RequestDefinition(); + } + + /** + * Returns the field description. + * + * @return The field description + */ + public String getDescription() { + return description; + } + + /** + * Returns the field argDefs. + * + * @return The field argDefs + */ + public org.ccsds.moims.mo.mps.structures.ArgDefList getArgDefs() { + return argDefs; + } + + /** + * Returns the field standingOrder. + * + * @return The field standingOrder + */ + public Boolean getStandingOrder() { + return standingOrder; + } + + /** + * Returns the field activities. + * + * @return The field activities + */ + public org.ccsds.moims.mo.mps.structures.ActivityDetailsList getActivities() { + return activities; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof RequestDefinition) { + if (! super.equals(obj)) { + return false; + } + RequestDefinition other = (RequestDefinition) obj; + if (description == null) { + if (other.description != null) { + return false; + } + } else { + if (! description.equals(other.description)) { + return false; + } + } + if (argDefs == null) { + if (other.argDefs != null) { + return false; + } + } else { + if (! argDefs.equals(other.argDefs)) { + return false; + } + } + if (standingOrder == null) { + if (other.standingOrder != null) { + return false; + } + } else { + if (! standingOrder.equals(other.standingOrder)) { + return false; + } + } + if (activities == null) { + if (other.activities != null) { + return false; + } + } else { + if (! activities.equals(other.activities)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = super.hashCode(); + hash = 83 * hash + (description != null ? description.hashCode() : 0); + hash = 83 * hash + (argDefs != null ? argDefs.hashCode() : 0); + hash = 83 * hash + (standingOrder != null ? standingOrder.hashCode() : 0); + hash = 83 * hash + (activities != null ? activities.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(RequestDefinition: "); + buf.append(super.toString()); + buf.append(", description=").append(description); + buf.append(", argDefs=").append(argDefs); + buf.append(", standingOrder=").append(standingOrder); + buf.append(", activities=").append(activities); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + super.encode(encoder); + if (description == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'description' cannot be null!"); + } + if (standingOrder == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'standingOrder' cannot be null!"); + } + if (activities == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'activities' cannot be null!"); + } + encoder.encodeString(description); + encoder.encodeNullableElement(argDefs); + encoder.encodeBoolean(standingOrder); + encoder.encodeElement(activities); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + super.decode(decoder); + description = decoder.decodeString(); + argDefs = (org.ccsds.moims.mo.mps.structures.ArgDefList) decoder.decodeNullableElement(new org.ccsds.moims.mo.mps.structures.ArgDefList()); + standingOrder = decoder.decodeBoolean(); + activities = (org.ccsds.moims.mo.mps.structures.ActivityDetailsList) decoder.decodeElement(new org.ccsds.moims.mo.mps.structures.ActivityDetailsList()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RequestDefinitionList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RequestDefinitionList.java new file mode 100644 index 00000000..56cc33f3 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RequestDefinitionList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for RequestDefinition. + */ +public final class RequestDefinitionList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107311L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107311L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for RequestDefinitionList. + * + */ + public RequestDefinitionList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public RequestDefinitionList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public RequestDefinitionList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.RequestDefinition element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.RequestDefinition element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new RequestDefinitionList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.RequestDefinition(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RequestFilter.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RequestFilter.java new file mode 100644 index 00000000..512b817f --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RequestFilter.java @@ -0,0 +1,319 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E1: RequestFilter is a data structure used in the context of MPS Planning + * Request Service operations to specify a filtered set of planning requests. + * NOTE – All fields are nullable and it is valid to specify a RequestFilter + * with no filter criteria; this corresponds to an open filter in which all + * available planning requests are returned. + */ +public final class RequestFilter implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1407374900330904L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330904L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Domain of the RequestInstance. An ordered list representing a domain hierarchy, + * ‘*’ can be used to represent a wildcard at that level. + */ + private org.ccsds.moims.mo.mal.structures.IdentifierList domain; + + /** + * Reference to the RequestInstance. + */ + private org.ccsds.moims.mo.mal.structures.ObjectRef instanceID; + + /** + * Query for request instances with a creation date and time in the specified + * range. + */ + private org.ccsds.moims.mo.mps.structures.TimeWindow creationTime; + + /** + * Reference to the RequestDefinition from which the RequestInstance was created. + */ + private org.ccsds.moims.mo.mal.structures.ObjectRef definitionID; + + /** + * Reference of the User who initiated the RequestInstance. + */ + private org.ccsds.moims.mo.mal.structures.ObjectRef userID; + + /** + * Reference supplied by User when submitting the RequestInstance. + */ + private org.ccsds.moims.mo.mal.structures.Identifier userReference; + + /** + * Current status (enum) of the RequestInstance. + */ + private org.ccsds.moims.mo.mps.structures.RequestStatusEnum status; + + /** + * Reference to the output Plan(s) generated in response to the RequestInstance. + */ + private org.ccsds.moims.mo.mal.structures.ObjectRefList outputPlanRefs; + + /** + * Default constructor for RequestFilter. + * + */ + public RequestFilter() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param domain Domain of the RequestInstance. An ordered list representing a domain hierarchy, ‘*’ can be used to represent a wildcard at that level. + * @param instanceID Reference to the RequestInstance. + * @param creationTime Query for request instances with a creation date and time in the specified range. + * @param definitionID Reference to the RequestDefinition from which the RequestInstance was created. + * @param userID Reference of the User who initiated the RequestInstance. + * @param userReference Reference supplied by User when submitting the RequestInstance. + * @param status Current status (enum) of the RequestInstance. + * @param outputPlanRefs Reference to the output Plan(s) generated in response to the RequestInstance. + */ + public RequestFilter(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.ObjectRef instanceID, + org.ccsds.moims.mo.mps.structures.TimeWindow creationTime, + org.ccsds.moims.mo.mal.structures.ObjectRef definitionID, + org.ccsds.moims.mo.mal.structures.ObjectRef userID, + org.ccsds.moims.mo.mal.structures.Identifier userReference, + org.ccsds.moims.mo.mps.structures.RequestStatusEnum status, + org.ccsds.moims.mo.mal.structures.ObjectRefList outputPlanRefs) { + this.domain = domain; + this.instanceID = instanceID; + this.creationTime = creationTime; + this.definitionID = definitionID; + this.userID = userID; + this.userReference = userReference; + this.status = status; + this.outputPlanRefs = outputPlanRefs; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.RequestFilter(); + } + + /** + * Returns the field domain. + * + * @return The field domain + */ + public org.ccsds.moims.mo.mal.structures.IdentifierList getDomain() { + return domain; + } + + /** + * Returns the field instanceID. + * + * @return The field instanceID + */ + public org.ccsds.moims.mo.mal.structures.ObjectRef getInstanceID() { + return instanceID; + } + + /** + * Returns the field creationTime. + * + * @return The field creationTime + */ + public org.ccsds.moims.mo.mps.structures.TimeWindow getCreationTime() { + return creationTime; + } + + /** + * Returns the field definitionID. + * + * @return The field definitionID + */ + public org.ccsds.moims.mo.mal.structures.ObjectRef getDefinitionID() { + return definitionID; + } + + /** + * Returns the field userID. + * + * @return The field userID + */ + public org.ccsds.moims.mo.mal.structures.ObjectRef getUserID() { + return userID; + } + + /** + * Returns the field userReference. + * + * @return The field userReference + */ + public org.ccsds.moims.mo.mal.structures.Identifier getUserReference() { + return userReference; + } + + /** + * Returns the field status. + * + * @return The field status + */ + public org.ccsds.moims.mo.mps.structures.RequestStatusEnum getStatus() { + return status; + } + + /** + * Returns the field outputPlanRefs. + * + * @return The field outputPlanRefs + */ + public org.ccsds.moims.mo.mal.structures.ObjectRefList getOutputPlanRefs() { + return outputPlanRefs; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof RequestFilter) { + RequestFilter other = (RequestFilter) obj; + if (domain == null) { + if (other.domain != null) { + return false; + } + } else { + if (! domain.equals(other.domain)) { + return false; + } + } + if (instanceID == null) { + if (other.instanceID != null) { + return false; + } + } else { + if (! instanceID.equals(other.instanceID)) { + return false; + } + } + if (creationTime == null) { + if (other.creationTime != null) { + return false; + } + } else { + if (! creationTime.equals(other.creationTime)) { + return false; + } + } + if (definitionID == null) { + if (other.definitionID != null) { + return false; + } + } else { + if (! definitionID.equals(other.definitionID)) { + return false; + } + } + if (userID == null) { + if (other.userID != null) { + return false; + } + } else { + if (! userID.equals(other.userID)) { + return false; + } + } + if (userReference == null) { + if (other.userReference != null) { + return false; + } + } else { + if (! userReference.equals(other.userReference)) { + return false; + } + } + if (status == null) { + if (other.status != null) { + return false; + } + } else { + if (! status.equals(other.status)) { + return false; + } + } + if (outputPlanRefs == null) { + if (other.outputPlanRefs != null) { + return false; + } + } else { + if (! outputPlanRefs.equals(other.outputPlanRefs)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (domain != null ? domain.hashCode() : 0); + hash = 83 * hash + (instanceID != null ? instanceID.hashCode() : 0); + hash = 83 * hash + (creationTime != null ? creationTime.hashCode() : 0); + hash = 83 * hash + (definitionID != null ? definitionID.hashCode() : 0); + hash = 83 * hash + (userID != null ? userID.hashCode() : 0); + hash = 83 * hash + (userReference != null ? userReference.hashCode() : 0); + hash = 83 * hash + (status != null ? status.hashCode() : 0); + hash = 83 * hash + (outputPlanRefs != null ? outputPlanRefs.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(RequestFilter: "); + buf.append("domain=").append(domain); + buf.append(", instanceID=").append(instanceID); + buf.append(", creationTime=").append(creationTime); + buf.append(", definitionID=").append(definitionID); + buf.append(", userID=").append(userID); + buf.append(", userReference=").append(userReference); + buf.append(", status=").append(status); + buf.append(", outputPlanRefs=").append(outputPlanRefs); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeNullableElement(domain); + encoder.encodeNullableElement(instanceID); + encoder.encodeNullableElement(creationTime); + encoder.encodeNullableElement(definitionID); + encoder.encodeNullableElement(userID); + encoder.encodeNullableIdentifier(userReference); + encoder.encodeNullableElement(status); + encoder.encodeNullableElement(outputPlanRefs); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + domain = (org.ccsds.moims.mo.mal.structures.IdentifierList) decoder.decodeNullableElement(new org.ccsds.moims.mo.mal.structures.IdentifierList()); + instanceID = (org.ccsds.moims.mo.mal.structures.ObjectRef) decoder.decodeNullableElement(new org.ccsds.moims.mo.mal.structures.ObjectRef()); + creationTime = (org.ccsds.moims.mo.mps.structures.TimeWindow) decoder.decodeNullableElement(new org.ccsds.moims.mo.mps.structures.TimeWindow()); + definitionID = (org.ccsds.moims.mo.mal.structures.ObjectRef) decoder.decodeNullableElement(new org.ccsds.moims.mo.mal.structures.ObjectRef()); + userID = (org.ccsds.moims.mo.mal.structures.ObjectRef) decoder.decodeNullableElement(new org.ccsds.moims.mo.mal.structures.ObjectRef()); + userReference = decoder.decodeNullableIdentifier(); + status = (org.ccsds.moims.mo.mps.structures.RequestStatusEnum) decoder.decodeNullableElement(org.ccsds.moims.mo.mps.structures.RequestStatusEnum.REQUESTED); + outputPlanRefs = (org.ccsds.moims.mo.mal.structures.ObjectRefList) decoder.decodeNullableElement(new org.ccsds.moims.mo.mal.structures.ObjectRefList()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RequestFilterList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RequestFilterList.java new file mode 100644 index 00000000..46087088 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RequestFilterList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for RequestFilter. + */ +public final class RequestFilterList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107304L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107304L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for RequestFilterList. + * + */ + public RequestFilterList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public RequestFilterList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public RequestFilterList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.RequestFilter element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.RequestFilter element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new RequestFilterList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.RequestFilter(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RequestInstance.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RequestInstance.java new file mode 100644 index 00000000..18a36bb7 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RequestInstance.java @@ -0,0 +1,381 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E1: A RequestInstance is an MO object that contains the specification of + * a planning request. This may change over time if the request is updated + * by the user, each comprising a separate version of the request with the + * same object key. In the context of a hierarchical or federated planning + * system, a RequestInstance can be used to submit a Plan (4.5.6) to a planning + * function, either embedding the Plan in the RequestInstance or passing it + * by reference. If passed by reference, the Plan can be retrieved using + * the Plan Distribution Service (3.6). Patch plans are not permitted in + * this context. NOTE – RequestInstances may be created from a RequestDefinition + * that has defined arguments (as ArgDefs) and will in this case have the + * associated Arguments. An ad-hoc RequestInstance is not anticipated to + * hold any Arguments. The values that can be parameterized through the arguments + * of a re-usable RequestDefinition can be directly entered in a RequestInstance, + * and there would be no corresponding ArgDef associated with any Arguments + * supplied. + */ +public final class RequestInstance extends org.ccsds.moims.mo.mal.structures.MOObject { + + private static final long serialVersionUID = 1407374900330898L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330898L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * The contents of the planning request. + */ + private org.ccsds.moims.mo.mps.structures.PlanningRequestDetails requestDetails; + + /** + * Creation date and time of the RequestInstance version. + */ + private org.ccsds.moims.mo.mal.structures.Time creationTime; + + /** + * Current status of the ActivityInstance (see planning request state model + * in 4.5.5.2). + */ + private org.ccsds.moims.mo.mps.structures.RequestStatusEnum status; + + /** + * Reference to the output Plan(s) that contains the activities resulting + * from the planning request. Where multiple alternate plans have been generated, + * these may be listed here. + */ + private org.ccsds.moims.mo.mal.structures.ObjectRefList outputPlanRefs; + + /** + * Optional return data from the planning process, provided as a list of ID-Value + * pairs. This can be used to provide additional information required by + * the User to interpret the planned operations. + */ + private org.ccsds.moims.mo.mal.structures.NamedValueList returnData; + + /** + * StatusInfo provides the reason for termination and is customizable, but + * if the following conditions exist then the specified text shall be used: + * - Completed (all constituent activities completed successfully); - Expired + * (constituent activities expired prior to execution); - Failed (constituent + * activities failed during execution); - Deleted (constituent activities + * were deleted); - Partially Completed. It may also be used to provide the + * reason for rejection. + */ + private String statusInfo; + + /** + * Error Code optional in the case of a failure status for the planning request + * (for example Terminated state with statusInfo Failed). The codes are implementation + * specific. + */ + private Integer errorCode; + + /** + * Supplementary error information. + */ + private String errorInfo; + + /** + * Default constructor for RequestInstance. + * + */ + public RequestInstance() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param objectIdentity The identity of the MO Object. + * @param requestDetails The contents of the planning request. + * @param creationTime Creation date and time of the RequestInstance version. + * @param status Current status of the ActivityInstance (see planning request state model in 4.5.5.2). + * @param outputPlanRefs Reference to the output Plan(s) that contains the activities resulting from the planning request. Where multiple alternate plans have been generated, these may be listed here. + * @param returnData Optional return data from the planning process, provided as a list of ID-Value pairs. This can be used to provide additional information required by the User to interpret the planned operations. + * @param statusInfo StatusInfo provides the reason for termination and is customizable, but if the following conditions exist then the specified text shall be used: - Completed (all constituent activities completed successfully); - Expired (constituent activities expired prior to execution); - Failed (constituent activities failed during execution); - Deleted (constituent activities were deleted); - Partially Completed. It may also be used to provide the reason for rejection. + * @param errorCode Error Code optional in the case of a failure status for the planning request (for example Terminated state with statusInfo Failed). The codes are implementation specific. + * @param errorInfo Supplementary error information. + */ + public RequestInstance(org.ccsds.moims.mo.mal.structures.ObjectIdentity objectIdentity, + org.ccsds.moims.mo.mps.structures.PlanningRequestDetails requestDetails, + org.ccsds.moims.mo.mal.structures.Time creationTime, + org.ccsds.moims.mo.mps.structures.RequestStatusEnum status, + org.ccsds.moims.mo.mal.structures.ObjectRefList outputPlanRefs, + org.ccsds.moims.mo.mal.structures.NamedValueList returnData, + String statusInfo, + Integer errorCode, + String errorInfo) { + super(objectIdentity); + this.requestDetails = requestDetails; + this.creationTime = creationTime; + this.status = status; + this.outputPlanRefs = outputPlanRefs; + this.returnData = returnData; + this.statusInfo = statusInfo; + this.errorCode = errorCode; + this.errorInfo = errorInfo; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param objectIdentity The identity of the MO Object. + * @param requestDetails The contents of the planning request. + * @param creationTime Creation date and time of the RequestInstance version. + * @param status Current status of the ActivityInstance (see planning request state model in 4.5.5.2). + */ + public RequestInstance(org.ccsds.moims.mo.mal.structures.ObjectIdentity objectIdentity, + org.ccsds.moims.mo.mps.structures.PlanningRequestDetails requestDetails, + org.ccsds.moims.mo.mal.structures.Time creationTime, + org.ccsds.moims.mo.mps.structures.RequestStatusEnum status) { + super(objectIdentity); + this.requestDetails = requestDetails; + this.creationTime = creationTime; + this.status = status; + this.outputPlanRefs = null; + this.returnData = null; + this.statusInfo = null; + this.errorCode = null; + this.errorInfo = null; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.RequestInstance(); + } + + /** + * Returns the field requestDetails. + * + * @return The field requestDetails + */ + public org.ccsds.moims.mo.mps.structures.PlanningRequestDetails getRequestDetails() { + return requestDetails; + } + + /** + * Returns the field creationTime. + * + * @return The field creationTime + */ + public org.ccsds.moims.mo.mal.structures.Time getCreationTime() { + return creationTime; + } + + /** + * Returns the field status. + * + * @return The field status + */ + public org.ccsds.moims.mo.mps.structures.RequestStatusEnum getStatus() { + return status; + } + + /** + * Returns the field outputPlanRefs. + * + * @return The field outputPlanRefs + */ + public org.ccsds.moims.mo.mal.structures.ObjectRefList getOutputPlanRefs() { + return outputPlanRefs; + } + + /** + * Returns the field returnData. + * + * @return The field returnData + */ + public org.ccsds.moims.mo.mal.structures.NamedValueList getReturnData() { + return returnData; + } + + /** + * Returns the field statusInfo. + * + * @return The field statusInfo + */ + public String getStatusInfo() { + return statusInfo; + } + + /** + * Returns the field errorCode. + * + * @return The field errorCode + */ + public Integer getErrorCode() { + return errorCode; + } + + /** + * Returns the field errorInfo. + * + * @return The field errorInfo + */ + public String getErrorInfo() { + return errorInfo; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof RequestInstance) { + if (! super.equals(obj)) { + return false; + } + RequestInstance other = (RequestInstance) obj; + if (requestDetails == null) { + if (other.requestDetails != null) { + return false; + } + } else { + if (! requestDetails.equals(other.requestDetails)) { + return false; + } + } + if (creationTime == null) { + if (other.creationTime != null) { + return false; + } + } else { + if (! creationTime.equals(other.creationTime)) { + return false; + } + } + if (status == null) { + if (other.status != null) { + return false; + } + } else { + if (! status.equals(other.status)) { + return false; + } + } + if (outputPlanRefs == null) { + if (other.outputPlanRefs != null) { + return false; + } + } else { + if (! outputPlanRefs.equals(other.outputPlanRefs)) { + return false; + } + } + if (returnData == null) { + if (other.returnData != null) { + return false; + } + } else { + if (! returnData.equals(other.returnData)) { + return false; + } + } + if (statusInfo == null) { + if (other.statusInfo != null) { + return false; + } + } else { + if (! statusInfo.equals(other.statusInfo)) { + return false; + } + } + if (errorCode == null) { + if (other.errorCode != null) { + return false; + } + } else { + if (! errorCode.equals(other.errorCode)) { + return false; + } + } + if (errorInfo == null) { + if (other.errorInfo != null) { + return false; + } + } else { + if (! errorInfo.equals(other.errorInfo)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = super.hashCode(); + hash = 83 * hash + (requestDetails != null ? requestDetails.hashCode() : 0); + hash = 83 * hash + (creationTime != null ? creationTime.hashCode() : 0); + hash = 83 * hash + (status != null ? status.hashCode() : 0); + hash = 83 * hash + (outputPlanRefs != null ? outputPlanRefs.hashCode() : 0); + hash = 83 * hash + (returnData != null ? returnData.hashCode() : 0); + hash = 83 * hash + (statusInfo != null ? statusInfo.hashCode() : 0); + hash = 83 * hash + (errorCode != null ? errorCode.hashCode() : 0); + hash = 83 * hash + (errorInfo != null ? errorInfo.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(RequestInstance: "); + buf.append(super.toString()); + buf.append(", requestDetails=").append(requestDetails); + buf.append(", creationTime=").append(creationTime); + buf.append(", status=").append(status); + buf.append(", outputPlanRefs=").append(outputPlanRefs); + buf.append(", returnData=").append(returnData); + buf.append(", statusInfo=").append(statusInfo); + buf.append(", errorCode=").append(errorCode); + buf.append(", errorInfo=").append(errorInfo); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + super.encode(encoder); + if (requestDetails == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'requestDetails' cannot be null!"); + } + if (creationTime == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'creationTime' cannot be null!"); + } + if (status == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'status' cannot be null!"); + } + encoder.encodeElement(requestDetails); + encoder.encodeTime(creationTime); + encoder.encodeElement(status); + encoder.encodeNullableElement(outputPlanRefs); + encoder.encodeNullableElement(returnData); + encoder.encodeNullableString(statusInfo); + encoder.encodeNullableInteger(errorCode); + encoder.encodeNullableString(errorInfo); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + super.decode(decoder); + requestDetails = (org.ccsds.moims.mo.mps.structures.PlanningRequestDetails) decoder.decodeElement(new org.ccsds.moims.mo.mps.structures.PlanningRequestDetails()); + creationTime = decoder.decodeTime(); + status = (org.ccsds.moims.mo.mps.structures.RequestStatusEnum) decoder.decodeElement(org.ccsds.moims.mo.mps.structures.RequestStatusEnum.REQUESTED); + outputPlanRefs = (org.ccsds.moims.mo.mal.structures.ObjectRefList) decoder.decodeNullableElement(new org.ccsds.moims.mo.mal.structures.ObjectRefList()); + returnData = (org.ccsds.moims.mo.mal.structures.NamedValueList) decoder.decodeNullableElement(new org.ccsds.moims.mo.mal.structures.NamedValueList()); + statusInfo = decoder.decodeNullableString(); + errorCode = decoder.decodeNullableInteger(); + errorInfo = decoder.decodeNullableString(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RequestInstanceList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RequestInstanceList.java new file mode 100644 index 00000000..aa140c86 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RequestInstanceList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for RequestInstance. + */ +public final class RequestInstanceList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107310L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107310L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for RequestInstanceList. + * + */ + public RequestInstanceList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public RequestInstanceList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public RequestInstanceList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.RequestInstance element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.RequestInstance element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new RequestInstanceList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.RequestInstance(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RequestStatusEnum.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RequestStatusEnum.java new file mode 100644 index 00000000..2d95e0d8 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RequestStatusEnum.java @@ -0,0 +1,215 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * Enumeration class for RequestStatusEnum. + */ +public final class RequestStatusEnum extends org.ccsds.moims.mo.mal.structures.Enumeration { + + private static final long serialVersionUID = 1407374900330899L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330899L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Enumeration value for REQUESTED. + */ + public static final int REQUESTED_VALUE = 1; + + /** + * Enumeration singleton for value REQUESTED. + */ + public static final org.ccsds.moims.mo.mps.structures.RequestStatusEnum REQUESTED = new org.ccsds.moims.mo.mps.structures.RequestStatusEnum(org.ccsds.moims.mo.mps.structures.RequestStatusEnum.REQUESTED_VALUE); + + /** + * Enumeration value for ACCEPTED. + */ + public static final int ACCEPTED_VALUE = 2; + + /** + * Enumeration singleton for value ACCEPTED. + */ + public static final org.ccsds.moims.mo.mps.structures.RequestStatusEnum ACCEPTED = new org.ccsds.moims.mo.mps.structures.RequestStatusEnum(org.ccsds.moims.mo.mps.structures.RequestStatusEnum.ACCEPTED_VALUE); + + /** + * Enumeration value for REJECTED. + */ + public static final int REJECTED_VALUE = 3; + + /** + * Enumeration singleton for value REJECTED. + */ + public static final org.ccsds.moims.mo.mps.structures.RequestStatusEnum REJECTED = new org.ccsds.moims.mo.mps.structures.RequestStatusEnum(org.ccsds.moims.mo.mps.structures.RequestStatusEnum.REJECTED_VALUE); + + /** + * Enumeration value for CANCELLED. + */ + public static final int CANCELLED_VALUE = 4; + + /** + * Enumeration singleton for value CANCELLED. + */ + public static final org.ccsds.moims.mo.mps.structures.RequestStatusEnum CANCELLED = new org.ccsds.moims.mo.mps.structures.RequestStatusEnum(org.ccsds.moims.mo.mps.structures.RequestStatusEnum.CANCELLED_VALUE); + + /** + * Enumeration value for PLANNED. + */ + public static final int PLANNED_VALUE = 5; + + /** + * Enumeration singleton for value PLANNED. + */ + public static final org.ccsds.moims.mo.mps.structures.RequestStatusEnum PLANNED = new org.ccsds.moims.mo.mps.structures.RequestStatusEnum(org.ccsds.moims.mo.mps.structures.RequestStatusEnum.PLANNED_VALUE); + + /** + * Enumeration value for PROCESSING. + */ + public static final int PROCESSING_VALUE = 6; + + /** + * Enumeration singleton for value PROCESSING. + */ + public static final org.ccsds.moims.mo.mps.structures.RequestStatusEnum PROCESSING = new org.ccsds.moims.mo.mps.structures.RequestStatusEnum(org.ccsds.moims.mo.mps.structures.RequestStatusEnum.PROCESSING_VALUE); + + /** + * Enumeration value for PROCESSED. + */ + public static final int PROCESSED_VALUE = 7; + + /** + * Enumeration singleton for value PROCESSED. + */ + public static final org.ccsds.moims.mo.mps.structures.RequestStatusEnum PROCESSED = new org.ccsds.moims.mo.mps.structures.RequestStatusEnum(org.ccsds.moims.mo.mps.structures.RequestStatusEnum.PROCESSED_VALUE); + + /** + * Enumeration value for TERMINATED. + */ + public static final int TERMINATED_VALUE = 8; + + /** + * Enumeration singleton for value TERMINATED. + */ + public static final org.ccsds.moims.mo.mps.structures.RequestStatusEnum TERMINATED = new org.ccsds.moims.mo.mps.structures.RequestStatusEnum(org.ccsds.moims.mo.mps.structures.RequestStatusEnum.TERMINATED_VALUE); + + /** + * Set of enumeration instances. + */ + private static final org.ccsds.moims.mo.mps.structures.RequestStatusEnum[] _ENUMERATIONS = { + REQUESTED, ACCEPTED, REJECTED, CANCELLED, PLANNED, PROCESSING, PROCESSED, + TERMINATED}; + + /** + * E1: The RequestStatusEnum enumeration represents the different statuses in which a planning request may be found. + */ + public RequestStatusEnum() { + super(-1); + } + + /** + * E1: The RequestStatusEnum enumeration represents the different statuses + * in which a planning request may be found. + * + * @param value The value of the Enumeration. + */ + public RequestStatusEnum(int value) { + super(value); + } + + @Override + public String toString() { + switch (getValue()) { + case REQUESTED_VALUE: + return "REQUESTED"; + case ACCEPTED_VALUE: + return "ACCEPTED"; + case REJECTED_VALUE: + return "REJECTED"; + case CANCELLED_VALUE: + return "CANCELLED"; + case PLANNED_VALUE: + return "PLANNED"; + case PROCESSING_VALUE: + return "PROCESSING"; + case PROCESSED_VALUE: + return "PROCESSED"; + case TERMINATED_VALUE: + return "TERMINATED"; + default: + throw new RuntimeException("Unknown ordinal!"); + } + } + + /** + * Returns the enumeration element represented by the supplied string, or + * null if not matched. + * + * @param s s The string to search for. + * @return The matched enumeration element, or null if not matched. + */ + public static org.ccsds.moims.mo.mps.structures.RequestStatusEnum fromString(String s) { + switch (s) { + case "REQUESTED": + return RequestStatusEnum.REQUESTED; + case "ACCEPTED": + return RequestStatusEnum.ACCEPTED; + case "REJECTED": + return RequestStatusEnum.REJECTED; + case "CANCELLED": + return RequestStatusEnum.CANCELLED; + case "PLANNED": + return RequestStatusEnum.PLANNED; + case "PROCESSING": + return RequestStatusEnum.PROCESSING; + case "PROCESSED": + return RequestStatusEnum.PROCESSED; + case "TERMINATED": + return RequestStatusEnum.TERMINATED; + default: + throw new RuntimeException("Unknown Enumeration for the provided string: " + s); + } + } + + @Override + public org.ccsds.moims.mo.mal.structures.Enumeration fromValue(Integer value) { + switch (value) { + case REQUESTED_VALUE: + return RequestStatusEnum.REQUESTED; + case ACCEPTED_VALUE: + return RequestStatusEnum.ACCEPTED; + case REJECTED_VALUE: + return RequestStatusEnum.REJECTED; + case CANCELLED_VALUE: + return RequestStatusEnum.CANCELLED; + case PLANNED_VALUE: + return RequestStatusEnum.PLANNED; + case PROCESSING_VALUE: + return RequestStatusEnum.PROCESSING; + case PROCESSED_VALUE: + return RequestStatusEnum.PROCESSED; + case TERMINATED_VALUE: + return RequestStatusEnum.TERMINATED; + default: + throw new RuntimeException("Unknown Enumeration for the provided value: " + value); + } + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return _ENUMERATIONS[0]; + } + + @Override + public int getEnumSize() { + return 8; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RequestStatusEnumList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RequestStatusEnumList.java new file mode 100644 index 00000000..8f338be7 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RequestStatusEnumList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for RequestStatusEnum. + */ +public final class RequestStatusEnumList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107309L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107309L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for RequestStatusEnumList. + * + */ + public RequestStatusEnumList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public RequestStatusEnumList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public RequestStatusEnumList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.RequestStatusEnum element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.RequestStatusEnum element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new RequestStatusEnumList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return org.ccsds.moims.mo.mps.structures.RequestStatusEnum.REQUESTED; + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RequestStatusUpdate.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RequestStatusUpdate.java new file mode 100644 index 00000000..c4b27bc2 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RequestStatusUpdate.java @@ -0,0 +1,365 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E1: RequestStatusUpdate is a data structure that is used to report changes + * in status of the RequestInstance as it proceeds through both planning and + * plan execution functions. Reporting is the responsibility of the planning + * function. Planning request status updates may be distributed to subscribing + * applications, including both Users and status displays, to inform them + * of the latest status of the planning request. This may be particularly + * relevant in conjunction with a plan execution function. Status updates + * may be stored in planning request history to provide a complete record + * of evolving status over time. + */ +public final class RequestStatusUpdate implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1407374900330900L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330900L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Reference to the planning request instance to which the status update relates. + */ + private org.ccsds.moims.mo.mal.structures.ObjectRef requestInstance; + + /** + * Time of status update. + */ + private org.ccsds.moims.mo.mal.structures.Time timestamp; + + /** + * Current status of the planning request. + */ + private org.ccsds.moims.mo.mps.structures.RequestStatusEnum status; + + /** + * Reference to the output Plan(s) that contains the activities resulting + * from the planning request. Where multiple alternate plans have been generated, + * these may be listed here. It should be noted that this is only available + * once the planning request has been processed and successfully planned. + * The outputPlanRefs may be updated following iterative planning cycles + * or re-planning. + */ + private org.ccsds.moims.mo.mal.structures.ObjectRefList outputPlanRefs; + + /** + * Optional return data from the planning process, provided as a list of ID-Value + * pairs. This can be used to provide additional information required by + * the User to interpret the planned operations. + */ + private org.ccsds.moims.mo.mal.structures.NamedValueList returnData; + + /** + * StatusInfo provides the reason for termination and is customizable, but + * if the following conditions exist then the specified text shall be used: + * - Completed (all constituent activities completed successfully); - Expired + * (constituent activities expired prior to execution); - Failed (constituent + * activities failed during execution); - Deleted (constituent activities + * were deleted); - PartiallyCompleted. It may also be used to provide the + * reason for rejection. + */ + private String statusInfo; + + /** + * Error Code optional in the case of a failure status for the planning request + * (for example Terminated state with statusInfo Failed). The codes are implementation + * specific. + */ + private Integer errorCode; + + /** + * Supplementary error information. + */ + private String errorInfo; + + /** + * Default constructor for RequestStatusUpdate. + * + */ + public RequestStatusUpdate() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param requestInstance Reference to the planning request instance to which the status update relates. + * @param timestamp Time of status update. + * @param status Current status of the planning request. + * @param outputPlanRefs Reference to the output Plan(s) that contains the activities resulting from the planning request. Where multiple alternate plans have been generated, these may be listed here. It should be noted that this is only available once the planning request has been processed and successfully planned. The outputPlanRefs may be updated following iterative planning cycles or re-planning. + * @param returnData Optional return data from the planning process, provided as a list of ID-Value pairs. This can be used to provide additional information required by the User to interpret the planned operations. + * @param statusInfo StatusInfo provides the reason for termination and is customizable, but if the following conditions exist then the specified text shall be used: - Completed (all constituent activities completed successfully); - Expired (constituent activities expired prior to execution); - Failed (constituent activities failed during execution); - Deleted (constituent activities were deleted); - PartiallyCompleted. It may also be used to provide the reason for rejection. + * @param errorCode Error Code optional in the case of a failure status for the planning request (for example Terminated state with statusInfo Failed). The codes are implementation specific. + * @param errorInfo Supplementary error information. + */ + public RequestStatusUpdate(org.ccsds.moims.mo.mal.structures.ObjectRef requestInstance, + org.ccsds.moims.mo.mal.structures.Time timestamp, + org.ccsds.moims.mo.mps.structures.RequestStatusEnum status, + org.ccsds.moims.mo.mal.structures.ObjectRefList outputPlanRefs, + org.ccsds.moims.mo.mal.structures.NamedValueList returnData, + String statusInfo, + Integer errorCode, + String errorInfo) { + this.requestInstance = requestInstance; + this.timestamp = timestamp; + this.status = status; + this.outputPlanRefs = outputPlanRefs; + this.returnData = returnData; + this.statusInfo = statusInfo; + this.errorCode = errorCode; + this.errorInfo = errorInfo; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param requestInstance Reference to the planning request instance to which the status update relates. + * @param timestamp Time of status update. + * @param status Current status of the planning request. + */ + public RequestStatusUpdate(org.ccsds.moims.mo.mal.structures.ObjectRef requestInstance, + org.ccsds.moims.mo.mal.structures.Time timestamp, + org.ccsds.moims.mo.mps.structures.RequestStatusEnum status) { + this.requestInstance = requestInstance; + this.timestamp = timestamp; + this.status = status; + this.outputPlanRefs = null; + this.returnData = null; + this.statusInfo = null; + this.errorCode = null; + this.errorInfo = null; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.RequestStatusUpdate(); + } + + /** + * Returns the field requestInstance. + * + * @return The field requestInstance + */ + public org.ccsds.moims.mo.mal.structures.ObjectRef getRequestInstance() { + return requestInstance; + } + + /** + * Returns the field timestamp. + * + * @return The field timestamp + */ + public org.ccsds.moims.mo.mal.structures.Time getTimestamp() { + return timestamp; + } + + /** + * Returns the field status. + * + * @return The field status + */ + public org.ccsds.moims.mo.mps.structures.RequestStatusEnum getStatus() { + return status; + } + + /** + * Returns the field outputPlanRefs. + * + * @return The field outputPlanRefs + */ + public org.ccsds.moims.mo.mal.structures.ObjectRefList getOutputPlanRefs() { + return outputPlanRefs; + } + + /** + * Returns the field returnData. + * + * @return The field returnData + */ + public org.ccsds.moims.mo.mal.structures.NamedValueList getReturnData() { + return returnData; + } + + /** + * Returns the field statusInfo. + * + * @return The field statusInfo + */ + public String getStatusInfo() { + return statusInfo; + } + + /** + * Returns the field errorCode. + * + * @return The field errorCode + */ + public Integer getErrorCode() { + return errorCode; + } + + /** + * Returns the field errorInfo. + * + * @return The field errorInfo + */ + public String getErrorInfo() { + return errorInfo; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof RequestStatusUpdate) { + RequestStatusUpdate other = (RequestStatusUpdate) obj; + if (requestInstance == null) { + if (other.requestInstance != null) { + return false; + } + } else { + if (! requestInstance.equals(other.requestInstance)) { + return false; + } + } + if (timestamp == null) { + if (other.timestamp != null) { + return false; + } + } else { + if (! timestamp.equals(other.timestamp)) { + return false; + } + } + if (status == null) { + if (other.status != null) { + return false; + } + } else { + if (! status.equals(other.status)) { + return false; + } + } + if (outputPlanRefs == null) { + if (other.outputPlanRefs != null) { + return false; + } + } else { + if (! outputPlanRefs.equals(other.outputPlanRefs)) { + return false; + } + } + if (returnData == null) { + if (other.returnData != null) { + return false; + } + } else { + if (! returnData.equals(other.returnData)) { + return false; + } + } + if (statusInfo == null) { + if (other.statusInfo != null) { + return false; + } + } else { + if (! statusInfo.equals(other.statusInfo)) { + return false; + } + } + if (errorCode == null) { + if (other.errorCode != null) { + return false; + } + } else { + if (! errorCode.equals(other.errorCode)) { + return false; + } + } + if (errorInfo == null) { + if (other.errorInfo != null) { + return false; + } + } else { + if (! errorInfo.equals(other.errorInfo)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (requestInstance != null ? requestInstance.hashCode() : 0); + hash = 83 * hash + (timestamp != null ? timestamp.hashCode() : 0); + hash = 83 * hash + (status != null ? status.hashCode() : 0); + hash = 83 * hash + (outputPlanRefs != null ? outputPlanRefs.hashCode() : 0); + hash = 83 * hash + (returnData != null ? returnData.hashCode() : 0); + hash = 83 * hash + (statusInfo != null ? statusInfo.hashCode() : 0); + hash = 83 * hash + (errorCode != null ? errorCode.hashCode() : 0); + hash = 83 * hash + (errorInfo != null ? errorInfo.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(RequestStatusUpdate: "); + buf.append("requestInstance=").append(requestInstance); + buf.append(", timestamp=").append(timestamp); + buf.append(", status=").append(status); + buf.append(", outputPlanRefs=").append(outputPlanRefs); + buf.append(", returnData=").append(returnData); + buf.append(", statusInfo=").append(statusInfo); + buf.append(", errorCode=").append(errorCode); + buf.append(", errorInfo=").append(errorInfo); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (requestInstance == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'requestInstance' cannot be null!"); + } + if (timestamp == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'timestamp' cannot be null!"); + } + if (status == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'status' cannot be null!"); + } + encoder.encodeElement(requestInstance); + encoder.encodeTime(timestamp); + encoder.encodeElement(status); + encoder.encodeNullableElement(outputPlanRefs); + encoder.encodeNullableElement(returnData); + encoder.encodeNullableString(statusInfo); + encoder.encodeNullableInteger(errorCode); + encoder.encodeNullableString(errorInfo); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + requestInstance = (org.ccsds.moims.mo.mal.structures.ObjectRef) decoder.decodeElement(new org.ccsds.moims.mo.mal.structures.ObjectRef()); + timestamp = decoder.decodeTime(); + status = (org.ccsds.moims.mo.mps.structures.RequestStatusEnum) decoder.decodeElement(org.ccsds.moims.mo.mps.structures.RequestStatusEnum.REQUESTED); + outputPlanRefs = (org.ccsds.moims.mo.mal.structures.ObjectRefList) decoder.decodeNullableElement(new org.ccsds.moims.mo.mal.structures.ObjectRefList()); + returnData = (org.ccsds.moims.mo.mal.structures.NamedValueList) decoder.decodeNullableElement(new org.ccsds.moims.mo.mal.structures.NamedValueList()); + statusInfo = decoder.decodeNullableString(); + errorCode = decoder.decodeNullableInteger(); + errorInfo = decoder.decodeNullableString(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RequestStatusUpdateList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RequestStatusUpdateList.java new file mode 100644 index 00000000..9d39652b --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RequestStatusUpdateList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for RequestStatusUpdate. + */ +public final class RequestStatusUpdateList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107308L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107308L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for RequestStatusUpdateList. + * + */ + public RequestStatusUpdateList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public RequestStatusUpdateList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public RequestStatusUpdateList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.RequestStatusUpdate element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.RequestStatusUpdate element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new RequestStatusUpdateList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.RequestStatusUpdate(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RequestSummaryStatus.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RequestSummaryStatus.java new file mode 100644 index 00000000..36285233 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RequestSummaryStatus.java @@ -0,0 +1,570 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E1: RequestSummaryStatus is a data structure used in the context of the + * MPS Planning Request service getRequestSummaries operation, where a list + * of these structures is returned. It contains header fields of the planning + * request and its status, but not the request content (arguments, activities + * and constraints). + */ +public final class RequestSummaryStatus implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1407374900330903L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330903L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Reference to the RequestInstance. + */ + private org.ccsds.moims.mo.mal.structures.ObjectRef requestInstance; + + /** + * Optional user supplied reference for the planning request. This is distinct + * from the identity of the RequestInstance that is assigned by the planning + * function. + */ + private org.ccsds.moims.mo.mal.structures.Identifier userReference; + + /** + * Creation date and time of the RequestInstance version. + */ + private org.ccsds.moims.mo.mal.structures.Time creationTime; + + /** + * Reference to the RequestDefinition from which the RequestInstance was created, + * if a planning request template was used. + */ + private org.ccsds.moims.mo.mal.structures.ObjectRef definition; + + /** + * Specifies which planning period the planning request applies to. Planning + * period IDs are mission specific, but can be used to indicate mission phase; + * planning cycle; or ‘semester’ in observatory missions. + */ + private org.ccsds.moims.mo.mal.structures.Identifier planningPeriod; + + /** + * Validity period for the planning request, expressed as one or more time + * windows. The planning request must be satisfied within this period. Only + * one of validityTime or validityEvent should be present in a planning request. + */ + private org.ccsds.moims.mo.mps.structures.TimeWindowList validityTimes; + + /** + * Validity period for the planning request, expressed as one or more event + * windows. The planning request must be satisfied within this period. Only + * one of validityTime or validityEvent should be present in a planning request. + */ + private org.ccsds.moims.mo.mps.structures.EventWindowList validityEvents; + + /** + * The User ID for the person or organization raising the planning request. + */ + private org.ccsds.moims.mo.mal.structures.ObjectRef user; + + /** + * Description of the request. + */ + private String description; + + /** + * A flag that indicates whether the planning request is for a repetitive + * standing order (unbounded other than by the validity period), or is a one-off + * request. + */ + private Boolean standingOrder; + + /** + * Free text for any additional user comments about the request. + */ + private String comments; + + /** + * Current status of the RequestInstance (see planning request state model + * in 4.5.5.2). + */ + private org.ccsds.moims.mo.mps.structures.RequestStatusEnum status; + + /** + * References to output Plan(s) that contains the activities resulting from + * the planning request. + */ + private org.ccsds.moims.mo.mal.structures.ObjectRefList outputPlanRefs; + + /** + * StatusInfo provides the reason for termination and is customizable, but + * includes: - Completed (all constituent activities completed successfully); + * - Expired (constituent activities expired prior to execution); - Failed + * (constituent activities failed during execution); - Deleted (constituent + * activities were deleted); - PartiallyCompleted. It may also be used to + * provide the reason for rejection. + */ + private String statusInfo; + + /** + * Default constructor for RequestSummaryStatus. + * + */ + public RequestSummaryStatus() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param requestInstance Reference to the RequestInstance. + * @param userReference Optional user supplied reference for the planning request. This is distinct from the identity of the RequestInstance that is assigned by the planning function. + * @param creationTime Creation date and time of the RequestInstance version. + * @param definition Reference to the RequestDefinition from which the RequestInstance was created, if a planning request template was used. + * @param planningPeriod Specifies which planning period the planning request applies to. Planning period IDs are mission specific, but can be used to indicate mission phase; planning cycle; or ‘semester’ in observatory missions. + * @param validityTimes Validity period for the planning request, expressed as one or more time windows. The planning request must be satisfied within this period. Only one of validityTime or validityEvent should be present in a planning request. + * @param validityEvents Validity period for the planning request, expressed as one or more event windows. The planning request must be satisfied within this period. Only one of validityTime or validityEvent should be present in a planning request. + * @param user The User ID for the person or organization raising the planning request. + * @param description Description of the request. + * @param standingOrder A flag that indicates whether the planning request is for a repetitive standing order (unbounded other than by the validity period), or is a one-off request. + * @param comments Free text for any additional user comments about the request. + * @param status Current status of the RequestInstance (see planning request state model in 4.5.5.2). + * @param outputPlanRefs References to output Plan(s) that contains the activities resulting from the planning request. + * @param statusInfo StatusInfo provides the reason for termination and is customizable, but includes: - Completed (all constituent activities completed successfully); - Expired (constituent activities expired prior to execution); - Failed (constituent activities failed during execution); - Deleted (constituent activities were deleted); - PartiallyCompleted. It may also be used to provide the reason for rejection. + */ + public RequestSummaryStatus(org.ccsds.moims.mo.mal.structures.ObjectRef requestInstance, + org.ccsds.moims.mo.mal.structures.Identifier userReference, + org.ccsds.moims.mo.mal.structures.Time creationTime, + org.ccsds.moims.mo.mal.structures.ObjectRef definition, + org.ccsds.moims.mo.mal.structures.Identifier planningPeriod, + org.ccsds.moims.mo.mps.structures.TimeWindowList validityTimes, + org.ccsds.moims.mo.mps.structures.EventWindowList validityEvents, + org.ccsds.moims.mo.mal.structures.ObjectRef user, + String description, + Boolean standingOrder, + String comments, + org.ccsds.moims.mo.mps.structures.RequestStatusEnum status, + org.ccsds.moims.mo.mal.structures.ObjectRefList outputPlanRefs, + String statusInfo) { + this.requestInstance = requestInstance; + this.userReference = userReference; + this.creationTime = creationTime; + this.definition = definition; + this.planningPeriod = planningPeriod; + this.validityTimes = validityTimes; + this.validityEvents = validityEvents; + this.user = user; + this.description = description; + this.standingOrder = standingOrder; + this.comments = comments; + this.status = status; + this.outputPlanRefs = outputPlanRefs; + this.statusInfo = statusInfo; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param requestInstance Reference to the RequestInstance. + * @param creationTime Creation date and time of the RequestInstance version. + * @param planningPeriod Specifies which planning period the planning request applies to. Planning period IDs are mission specific, but can be used to indicate mission phase; planning cycle; or ‘semester’ in observatory missions. + * @param user The User ID for the person or organization raising the planning request. + * @param description Description of the request. + * @param standingOrder A flag that indicates whether the planning request is for a repetitive standing order (unbounded other than by the validity period), or is a one-off request. + * @param status Current status of the RequestInstance (see planning request state model in 4.5.5.2). + */ + public RequestSummaryStatus(org.ccsds.moims.mo.mal.structures.ObjectRef requestInstance, + org.ccsds.moims.mo.mal.structures.Time creationTime, + org.ccsds.moims.mo.mal.structures.Identifier planningPeriod, + org.ccsds.moims.mo.mal.structures.ObjectRef user, + String description, + Boolean standingOrder, + org.ccsds.moims.mo.mps.structures.RequestStatusEnum status) { + this.requestInstance = requestInstance; + this.userReference = null; + this.creationTime = creationTime; + this.definition = null; + this.planningPeriod = planningPeriod; + this.validityTimes = null; + this.validityEvents = null; + this.user = user; + this.description = description; + this.standingOrder = standingOrder; + this.comments = null; + this.status = status; + this.outputPlanRefs = null; + this.statusInfo = null; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.RequestSummaryStatus(); + } + + /** + * Returns the field requestInstance. + * + * @return The field requestInstance + */ + public org.ccsds.moims.mo.mal.structures.ObjectRef getRequestInstance() { + return requestInstance; + } + + /** + * Returns the field userReference. + * + * @return The field userReference + */ + public org.ccsds.moims.mo.mal.structures.Identifier getUserReference() { + return userReference; + } + + /** + * Returns the field creationTime. + * + * @return The field creationTime + */ + public org.ccsds.moims.mo.mal.structures.Time getCreationTime() { + return creationTime; + } + + /** + * Returns the field definition. + * + * @return The field definition + */ + public org.ccsds.moims.mo.mal.structures.ObjectRef getDefinition() { + return definition; + } + + /** + * Returns the field planningPeriod. + * + * @return The field planningPeriod + */ + public org.ccsds.moims.mo.mal.structures.Identifier getPlanningPeriod() { + return planningPeriod; + } + + /** + * Returns the field validityTimes. + * + * @return The field validityTimes + */ + public org.ccsds.moims.mo.mps.structures.TimeWindowList getValidityTimes() { + return validityTimes; + } + + /** + * Returns the field validityEvents. + * + * @return The field validityEvents + */ + public org.ccsds.moims.mo.mps.structures.EventWindowList getValidityEvents() { + return validityEvents; + } + + /** + * Returns the field user. + * + * @return The field user + */ + public org.ccsds.moims.mo.mal.structures.ObjectRef getUser() { + return user; + } + + /** + * Returns the field description. + * + * @return The field description + */ + public String getDescription() { + return description; + } + + /** + * Returns the field standingOrder. + * + * @return The field standingOrder + */ + public Boolean getStandingOrder() { + return standingOrder; + } + + /** + * Returns the field comments. + * + * @return The field comments + */ + public String getComments() { + return comments; + } + + /** + * Returns the field status. + * + * @return The field status + */ + public org.ccsds.moims.mo.mps.structures.RequestStatusEnum getStatus() { + return status; + } + + /** + * Returns the field outputPlanRefs. + * + * @return The field outputPlanRefs + */ + public org.ccsds.moims.mo.mal.structures.ObjectRefList getOutputPlanRefs() { + return outputPlanRefs; + } + + /** + * Returns the field statusInfo. + * + * @return The field statusInfo + */ + public String getStatusInfo() { + return statusInfo; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof RequestSummaryStatus) { + RequestSummaryStatus other = (RequestSummaryStatus) obj; + if (requestInstance == null) { + if (other.requestInstance != null) { + return false; + } + } else { + if (! requestInstance.equals(other.requestInstance)) { + return false; + } + } + if (userReference == null) { + if (other.userReference != null) { + return false; + } + } else { + if (! userReference.equals(other.userReference)) { + return false; + } + } + if (creationTime == null) { + if (other.creationTime != null) { + return false; + } + } else { + if (! creationTime.equals(other.creationTime)) { + return false; + } + } + if (definition == null) { + if (other.definition != null) { + return false; + } + } else { + if (! definition.equals(other.definition)) { + return false; + } + } + if (planningPeriod == null) { + if (other.planningPeriod != null) { + return false; + } + } else { + if (! planningPeriod.equals(other.planningPeriod)) { + return false; + } + } + if (validityTimes == null) { + if (other.validityTimes != null) { + return false; + } + } else { + if (! validityTimes.equals(other.validityTimes)) { + return false; + } + } + if (validityEvents == null) { + if (other.validityEvents != null) { + return false; + } + } else { + if (! validityEvents.equals(other.validityEvents)) { + return false; + } + } + if (user == null) { + if (other.user != null) { + return false; + } + } else { + if (! user.equals(other.user)) { + return false; + } + } + if (description == null) { + if (other.description != null) { + return false; + } + } else { + if (! description.equals(other.description)) { + return false; + } + } + if (standingOrder == null) { + if (other.standingOrder != null) { + return false; + } + } else { + if (! standingOrder.equals(other.standingOrder)) { + return false; + } + } + if (comments == null) { + if (other.comments != null) { + return false; + } + } else { + if (! comments.equals(other.comments)) { + return false; + } + } + if (status == null) { + if (other.status != null) { + return false; + } + } else { + if (! status.equals(other.status)) { + return false; + } + } + if (outputPlanRefs == null) { + if (other.outputPlanRefs != null) { + return false; + } + } else { + if (! outputPlanRefs.equals(other.outputPlanRefs)) { + return false; + } + } + if (statusInfo == null) { + if (other.statusInfo != null) { + return false; + } + } else { + if (! statusInfo.equals(other.statusInfo)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (requestInstance != null ? requestInstance.hashCode() : 0); + hash = 83 * hash + (userReference != null ? userReference.hashCode() : 0); + hash = 83 * hash + (creationTime != null ? creationTime.hashCode() : 0); + hash = 83 * hash + (definition != null ? definition.hashCode() : 0); + hash = 83 * hash + (planningPeriod != null ? planningPeriod.hashCode() : 0); + hash = 83 * hash + (validityTimes != null ? validityTimes.hashCode() : 0); + hash = 83 * hash + (validityEvents != null ? validityEvents.hashCode() : 0); + hash = 83 * hash + (user != null ? user.hashCode() : 0); + hash = 83 * hash + (description != null ? description.hashCode() : 0); + hash = 83 * hash + (standingOrder != null ? standingOrder.hashCode() : 0); + hash = 83 * hash + (comments != null ? comments.hashCode() : 0); + hash = 83 * hash + (status != null ? status.hashCode() : 0); + hash = 83 * hash + (outputPlanRefs != null ? outputPlanRefs.hashCode() : 0); + hash = 83 * hash + (statusInfo != null ? statusInfo.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(RequestSummaryStatus: "); + buf.append("requestInstance=").append(requestInstance); + buf.append(", userReference=").append(userReference); + buf.append(", creationTime=").append(creationTime); + buf.append(", definition=").append(definition); + buf.append(", planningPeriod=").append(planningPeriod); + buf.append(", validityTimes=").append(validityTimes); + buf.append(", validityEvents=").append(validityEvents); + buf.append(", user=").append(user); + buf.append(", description=").append(description); + buf.append(", standingOrder=").append(standingOrder); + buf.append(", comments=").append(comments); + buf.append(", status=").append(status); + buf.append(", outputPlanRefs=").append(outputPlanRefs); + buf.append(", statusInfo=").append(statusInfo); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (requestInstance == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'requestInstance' cannot be null!"); + } + if (creationTime == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'creationTime' cannot be null!"); + } + if (planningPeriod == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'planningPeriod' cannot be null!"); + } + if (user == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'user' cannot be null!"); + } + if (description == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'description' cannot be null!"); + } + if (standingOrder == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'standingOrder' cannot be null!"); + } + if (status == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'status' cannot be null!"); + } + encoder.encodeElement(requestInstance); + encoder.encodeNullableIdentifier(userReference); + encoder.encodeTime(creationTime); + encoder.encodeNullableElement(definition); + encoder.encodeIdentifier(planningPeriod); + encoder.encodeNullableElement(validityTimes); + encoder.encodeNullableElement(validityEvents); + encoder.encodeElement(user); + encoder.encodeString(description); + encoder.encodeBoolean(standingOrder); + encoder.encodeNullableString(comments); + encoder.encodeElement(status); + encoder.encodeNullableElement(outputPlanRefs); + encoder.encodeNullableString(statusInfo); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + requestInstance = (org.ccsds.moims.mo.mal.structures.ObjectRef) decoder.decodeElement(new org.ccsds.moims.mo.mal.structures.ObjectRef()); + userReference = decoder.decodeNullableIdentifier(); + creationTime = decoder.decodeTime(); + definition = (org.ccsds.moims.mo.mal.structures.ObjectRef) decoder.decodeNullableElement(new org.ccsds.moims.mo.mal.structures.ObjectRef()); + planningPeriod = decoder.decodeIdentifier(); + validityTimes = (org.ccsds.moims.mo.mps.structures.TimeWindowList) decoder.decodeNullableElement(new org.ccsds.moims.mo.mps.structures.TimeWindowList()); + validityEvents = (org.ccsds.moims.mo.mps.structures.EventWindowList) decoder.decodeNullableElement(new org.ccsds.moims.mo.mps.structures.EventWindowList()); + user = (org.ccsds.moims.mo.mal.structures.ObjectRef) decoder.decodeElement(new org.ccsds.moims.mo.mal.structures.ObjectRef()); + description = decoder.decodeString(); + standingOrder = decoder.decodeBoolean(); + comments = decoder.decodeNullableString(); + status = (org.ccsds.moims.mo.mps.structures.RequestStatusEnum) decoder.decodeElement(org.ccsds.moims.mo.mps.structures.RequestStatusEnum.REQUESTED); + outputPlanRefs = (org.ccsds.moims.mo.mal.structures.ObjectRefList) decoder.decodeNullableElement(new org.ccsds.moims.mo.mal.structures.ObjectRefList()); + statusInfo = decoder.decodeNullableString(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RequestSummaryStatusList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RequestSummaryStatusList.java new file mode 100644 index 00000000..e6355957 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RequestSummaryStatusList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for RequestSummaryStatus. + */ +public final class RequestSummaryStatusList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107305L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107305L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for RequestSummaryStatusList. + * + */ + public RequestSummaryStatusList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public RequestSummaryStatusList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public RequestSummaryStatusList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.RequestSummaryStatus element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.RequestSummaryStatus element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new RequestSummaryStatusList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.RequestSummaryStatus(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/Resource.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/Resource.java new file mode 100644 index 00000000..39fa6b62 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/Resource.java @@ -0,0 +1,272 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E4: A resource is an MO object that contains both the static fields that + * define a planning resource and a dynamic field that holds its current value. + * Its identity is defined by a constant key and evolving version, which + * is updated each time the definition is revised. Resource definitions form + * part of the planning configuration data and in practice the value field + * may be omitted in this context, although it may also be used to provide + * an initial or default value. Depending on the resource data type, the resource + * definition may require additional type-specific fields to support data + * validation. Subtypes are defined for Numeric, String, and enumerated Status + * type resources. The base Resource MO object type can be used where no + * data validation is applicable. The following fields are applicable to + * the base type and all subtypes. + */ +public final class Resource extends org.ccsds.moims.mo.mal.structures.MOObject { + + private static final long serialVersionUID = 1407374900330797L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330797L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Description of the Resource. + */ + private String description; + + /** + * Specifies the data type of the Resource, which must be a supported MAL + * Attribute type. + */ + private org.ccsds.moims.mo.mal.structures.AttributeType dataType; + + /** + * Optional. Specifies the units of a single quantity, in which the value + * of the Resource is expressed in. + */ + private String units; + + /** + * Optional. Specifies the allowed range of values for the Resource, with + * concrete subtypes specific to the data type of the Resource. + */ + private org.ccsds.moims.mo.mps.structures.ValidationDetails validationData; + + /** + * Value of the resource. MAL Attribute type must match the dataType of the + * Resource definition. The value is only nullable in the context of a Resource + * definition (planning configuration data). + */ + private org.ccsds.moims.mo.mal.structures.Attribute value; + + /** + * Default constructor for Resource. + * + */ + public Resource() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param objectIdentity The identity of the MO Object. + * @param description Description of the Resource. + * @param dataType Specifies the data type of the Resource, which must be a supported MAL Attribute type. + * @param units Optional. Specifies the units of a single quantity, in which the value of the Resource is expressed in. + * @param validationData Optional. Specifies the allowed range of values for the Resource, with concrete subtypes specific to the data type of the Resource. + * @param value Value of the resource. MAL Attribute type must match the dataType of the Resource definition. The value is only nullable in the context of a Resource definition (planning configuration data). + */ + public Resource(org.ccsds.moims.mo.mal.structures.ObjectIdentity objectIdentity, + String description, + org.ccsds.moims.mo.mal.structures.AttributeType dataType, + String units, + org.ccsds.moims.mo.mps.structures.ValidationDetails validationData, + org.ccsds.moims.mo.mal.structures.Attribute value) { + super(objectIdentity); + this.description = description; + this.dataType = dataType; + this.units = units; + this.validationData = validationData; + this.value = value; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param objectIdentity The identity of the MO Object. + * @param description Description of the Resource. + * @param dataType Specifies the data type of the Resource, which must be a supported MAL Attribute type. + */ + public Resource(org.ccsds.moims.mo.mal.structures.ObjectIdentity objectIdentity, + String description, + org.ccsds.moims.mo.mal.structures.AttributeType dataType) { + super(objectIdentity); + this.description = description; + this.dataType = dataType; + this.units = null; + this.validationData = null; + this.value = null; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.Resource(); + } + + /** + * Returns the field description. + * + * @return The field description + */ + public String getDescription() { + return description; + } + + /** + * Returns the field dataType. + * + * @return The field dataType + */ + public org.ccsds.moims.mo.mal.structures.AttributeType getDataType() { + return dataType; + } + + /** + * Returns the field units. + * + * @return The field units + */ + public String getUnits() { + return units; + } + + /** + * Returns the field validationData. + * + * @return The field validationData + */ + public org.ccsds.moims.mo.mps.structures.ValidationDetails getValidationData() { + return validationData; + } + + /** + * Returns the field value. + * + * @return The field value + */ + public org.ccsds.moims.mo.mal.structures.Attribute getValue() { + return value; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Resource) { + if (! super.equals(obj)) { + return false; + } + Resource other = (Resource) obj; + if (description == null) { + if (other.description != null) { + return false; + } + } else { + if (! description.equals(other.description)) { + return false; + } + } + if (dataType == null) { + if (other.dataType != null) { + return false; + } + } else { + if (! dataType.equals(other.dataType)) { + return false; + } + } + if (units == null) { + if (other.units != null) { + return false; + } + } else { + if (! units.equals(other.units)) { + return false; + } + } + if (validationData == null) { + if (other.validationData != null) { + return false; + } + } else { + if (! validationData.equals(other.validationData)) { + return false; + } + } + if (value == null) { + if (other.value != null) { + return false; + } + } else { + if (! value.equals(other.value)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = super.hashCode(); + hash = 83 * hash + (description != null ? description.hashCode() : 0); + hash = 83 * hash + (dataType != null ? dataType.hashCode() : 0); + hash = 83 * hash + (units != null ? units.hashCode() : 0); + hash = 83 * hash + (validationData != null ? validationData.hashCode() : 0); + hash = 83 * hash + (value != null ? value.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(Resource: "); + buf.append(super.toString()); + buf.append(", description=").append(description); + buf.append(", dataType=").append(dataType); + buf.append(", units=").append(units); + buf.append(", validationData=").append(validationData); + buf.append(", value=").append(value); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + super.encode(encoder); + if (description == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'description' cannot be null!"); + } + if (dataType == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'dataType' cannot be null!"); + } + encoder.encodeString(description); + encoder.encodeElement(dataType); + encoder.encodeNullableString(units); + encoder.encodeNullableAbstractElement(validationData); + encoder.encodeNullableAttribute(value); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + super.decode(decoder); + description = decoder.decodeString(); + dataType = (org.ccsds.moims.mo.mal.structures.AttributeType) decoder.decodeElement(org.ccsds.moims.mo.mal.structures.AttributeType.BLOB); + units = decoder.decodeNullableString(); + validationData = (org.ccsds.moims.mo.mps.structures.ValidationDetails) decoder.decodeNullableAbstractElement(); + value = (org.ccsds.moims.mo.mal.structures.Attribute) decoder.decodeNullableAttribute(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ResourceConstraint.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ResourceConstraint.java new file mode 100644 index 00000000..596ef7ea --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ResourceConstraint.java @@ -0,0 +1,144 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E5: ResourceConstraint is an abstract type that represents a constraint + * expressed in terms of the value of a given Resource. + */ +public abstract class ResourceConstraint extends org.ccsds.moims.mo.mps.structures.Constraint { + + /** + * Identifies the planning resource that is constrained for the duration of + * the planning activity. + */ + private org.ccsds.moims.mo.mal.structures.ObjectRef resourceRef; + + /** + * Comparison operator, which may be one of: =, !=, _, _=, _, _=, contains, + * icontains. The contains operator only applies to strings and may be case + * sensitive or insensitive. + */ + private org.ccsds.moims.mo.mps.structures.ExpressionOperatorEnum comparator; + + /** + * Default constructor for ResourceConstraint. + * + */ + public ResourceConstraint() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param negate Specifies whether the result of combining the Constraints is to be inverted (NOT function). Default = False. + * @param resourceRef Identifies the planning resource that is constrained for the duration of the planning activity. + * @param comparator Comparison operator, which may be one of: =, !=, _, _=, _, _=, contains, icontains. The contains operator only applies to strings and may be case sensitive or insensitive. + */ + public ResourceConstraint(Boolean negate, + org.ccsds.moims.mo.mal.structures.ObjectRef resourceRef, + org.ccsds.moims.mo.mps.structures.ExpressionOperatorEnum comparator) { + super(negate); + this.resourceRef = resourceRef; + this.comparator = comparator; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param resourceRef Identifies the planning resource that is constrained for the duration of the planning activity. + * @param comparator Comparison operator, which may be one of: =, !=, _, _=, _, _=, contains, icontains. The contains operator only applies to strings and may be case sensitive or insensitive. + */ + public ResourceConstraint(org.ccsds.moims.mo.mal.structures.ObjectRef resourceRef, + org.ccsds.moims.mo.mps.structures.ExpressionOperatorEnum comparator) { + this.resourceRef = resourceRef; + this.comparator = comparator; + } + + /** + * Returns the field resourceRef. + * + * @return The field resourceRef + */ + public org.ccsds.moims.mo.mal.structures.ObjectRef getResourceRef() { + return resourceRef; + } + + /** + * Returns the field comparator. + * + * @return The field comparator + */ + public org.ccsds.moims.mo.mps.structures.ExpressionOperatorEnum getComparator() { + return comparator; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ResourceConstraint) { + if (! super.equals(obj)) { + return false; + } + ResourceConstraint other = (ResourceConstraint) obj; + if (resourceRef == null) { + if (other.resourceRef != null) { + return false; + } + } else { + if (! resourceRef.equals(other.resourceRef)) { + return false; + } + } + if (comparator == null) { + if (other.comparator != null) { + return false; + } + } else { + if (! comparator.equals(other.comparator)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = super.hashCode(); + hash = 83 * hash + (resourceRef != null ? resourceRef.hashCode() : 0); + hash = 83 * hash + (comparator != null ? comparator.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(ResourceConstraint: "); + buf.append(super.toString()); + buf.append(", resourceRef=").append(resourceRef); + buf.append(", comparator=").append(comparator); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + super.encode(encoder); + if (resourceRef == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'resourceRef' cannot be null!"); + } + if (comparator == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'comparator' cannot be null!"); + } + encoder.encodeElement(resourceRef); + encoder.encodeElement(comparator); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + super.decode(decoder); + resourceRef = (org.ccsds.moims.mo.mal.structures.ObjectRef) decoder.decodeElement(new org.ccsds.moims.mo.mal.structures.ObjectRef()); + comparator = (org.ccsds.moims.mo.mps.structures.ExpressionOperatorEnum) decoder.decodeElement(org.ccsds.moims.mo.mps.structures.ExpressionOperatorEnum.EQUAL); + return this; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ResourceConstraintList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ResourceConstraintList.java new file mode 100644 index 00000000..1af39f02 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ResourceConstraintList.java @@ -0,0 +1,23 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for ResourceConstraint. + */ +public final class ResourceConstraintList extends org.ccsds.moims.mo.mal.structures.HeterogeneousList { + + /** + * Default constructor for ResourceConstraintList. + * + */ + public ResourceConstraintList() { + } + + @Override + public boolean add(org.ccsds.moims.mo.mal.structures.Element element) { + if (element != null && !(element instanceof ResourceConstraint)) { + throw new java.lang.ClassCastException("The added element does not extend the type: ResourceConstraint"); + } + return super.add(element); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ResourceList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ResourceList.java new file mode 100644 index 00000000..cb65b268 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ResourceList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for Resource. + */ +public final class ResourceList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107411L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107411L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for ResourceList. + * + */ + public ResourceList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public ResourceList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public ResourceList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.Resource element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.Resource element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new ResourceList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.Resource(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ResourceProfile.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ResourceProfile.java new file mode 100644 index 00000000..ef585649 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ResourceProfile.java @@ -0,0 +1,142 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E4: A ResourceProfile provides the evolution of a value for a single planning + * resource over time as a set of ProfileSegments. + */ +public final class ResourceProfile implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1407374900330799L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330799L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Reference to a Resource. + */ + private org.ccsds.moims.mo.mal.structures.ObjectRef resource; + + /** + * Set of Profile Segments; if these segments are not contiguous, the value + * of the profile in those places is undefined. The resulting behavior may + * be defined by the planning system. + */ + private org.ccsds.moims.mo.mps.structures.ProfileSegmentList profileSegments; + + /** + * Default constructor for ResourceProfile. + * + */ + public ResourceProfile() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param resource Reference to a Resource. + * @param profileSegments Set of Profile Segments; if these segments are not contiguous, the value of the profile in those places is undefined. The resulting behavior may be defined by the planning system. + */ + public ResourceProfile(org.ccsds.moims.mo.mal.structures.ObjectRef resource, + org.ccsds.moims.mo.mps.structures.ProfileSegmentList profileSegments) { + this.resource = resource; + this.profileSegments = profileSegments; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.ResourceProfile(); + } + + /** + * Returns the field resource. + * + * @return The field resource + */ + public org.ccsds.moims.mo.mal.structures.ObjectRef getResource() { + return resource; + } + + /** + * Returns the field profileSegments. + * + * @return The field profileSegments + */ + public org.ccsds.moims.mo.mps.structures.ProfileSegmentList getProfileSegments() { + return profileSegments; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ResourceProfile) { + ResourceProfile other = (ResourceProfile) obj; + if (resource == null) { + if (other.resource != null) { + return false; + } + } else { + if (! resource.equals(other.resource)) { + return false; + } + } + if (profileSegments == null) { + if (other.profileSegments != null) { + return false; + } + } else { + if (! profileSegments.equals(other.profileSegments)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (resource != null ? resource.hashCode() : 0); + hash = 83 * hash + (profileSegments != null ? profileSegments.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(ResourceProfile: "); + buf.append("resource=").append(resource); + buf.append(", profileSegments=").append(profileSegments); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (resource == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'resource' cannot be null!"); + } + if (profileSegments == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'profileSegments' cannot be null!"); + } + encoder.encodeElement(resource); + encoder.encodeElement(profileSegments); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + resource = (org.ccsds.moims.mo.mal.structures.ObjectRef) decoder.decodeElement(new org.ccsds.moims.mo.mal.structures.ObjectRef()); + profileSegments = (org.ccsds.moims.mo.mps.structures.ProfileSegmentList) decoder.decodeElement(new org.ccsds.moims.mo.mps.structures.ProfileSegmentList()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ResourceProfileList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ResourceProfileList.java new file mode 100644 index 00000000..61734dfd --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ResourceProfileList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for ResourceProfile. + */ +public final class ResourceProfileList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107409L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107409L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for ResourceProfileList. + * + */ + public ResourceProfileList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public ResourceProfileList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public ResourceProfileList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.ResourceProfile element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.ResourceProfile element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new ResourceProfileList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.ResourceProfile(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ResourceUpdate.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ResourceUpdate.java new file mode 100644 index 00000000..4ba26b89 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ResourceUpdate.java @@ -0,0 +1,190 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E4: ResourceUpdate is a data structure that is used to report the value + * of a Resource at a given point in time in the context of the MPS Plan Execution + * Control service monitorPlanExecutionDetail operation, or to supply an updated + * value for a Resource in the context of the MPS Plan Edit service. Resource + * updates may be distributed to subscribing applications, including status + * displays, to inform them of the latest value of the Resource. This may + * be particularly relevant in conjunction with a plan execution function. + * Resource updates may be stored in resource history to provide a complete + * record of evolving value over time. Resource updates are also effectively + * contained within a Plan to describe the predicted evolution of Resources + * over the duration of that Plan. However, in this context the ResourceProfile + * construct is used (see 4.5.4.4 above). + */ +public final class ResourceUpdate extends org.ccsds.moims.mo.mps.structures.PlanDetailUpdate { + + private static final long serialVersionUID = 1407374900330806L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330806L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Reference to the Resource to which the value update relates. + */ + private org.ccsds.moims.mo.mal.structures.ObjectRef resource; + + /** + * Time of Resource value update. + */ + private org.ccsds.moims.mo.mal.structures.Time timestamp; + + /** + * Value of the resource. MAL Attribute type must match the dataType of the + * resource definition. + */ + private org.ccsds.moims.mo.mal.structures.Attribute value; + + /** + * Default constructor for ResourceUpdate. + * + */ + public ResourceUpdate() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param resource Reference to the Resource to which the value update relates. + * @param timestamp Time of Resource value update. + * @param value Value of the resource. MAL Attribute type must match the dataType of the resource definition. + */ + public ResourceUpdate(org.ccsds.moims.mo.mal.structures.ObjectRef resource, + org.ccsds.moims.mo.mal.structures.Time timestamp, + org.ccsds.moims.mo.mal.structures.Attribute value) { + this.resource = resource; + this.timestamp = timestamp; + this.value = value; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.ResourceUpdate(); + } + + /** + * Returns the field resource. + * + * @return The field resource + */ + public org.ccsds.moims.mo.mal.structures.ObjectRef getResource() { + return resource; + } + + /** + * Returns the field timestamp. + * + * @return The field timestamp + */ + public org.ccsds.moims.mo.mal.structures.Time getTimestamp() { + return timestamp; + } + + /** + * Returns the field value. + * + * @return The field value + */ + public org.ccsds.moims.mo.mal.structures.Attribute getValue() { + return value; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ResourceUpdate) { + if (! super.equals(obj)) { + return false; + } + ResourceUpdate other = (ResourceUpdate) obj; + if (resource == null) { + if (other.resource != null) { + return false; + } + } else { + if (! resource.equals(other.resource)) { + return false; + } + } + if (timestamp == null) { + if (other.timestamp != null) { + return false; + } + } else { + if (! timestamp.equals(other.timestamp)) { + return false; + } + } + if (value == null) { + if (other.value != null) { + return false; + } + } else { + if (! value.equals(other.value)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = super.hashCode(); + hash = 83 * hash + (resource != null ? resource.hashCode() : 0); + hash = 83 * hash + (timestamp != null ? timestamp.hashCode() : 0); + hash = 83 * hash + (value != null ? value.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(ResourceUpdate: "); + buf.append(super.toString()); + buf.append(", resource=").append(resource); + buf.append(", timestamp=").append(timestamp); + buf.append(", value=").append(value); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + super.encode(encoder); + if (resource == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'resource' cannot be null!"); + } + if (timestamp == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'timestamp' cannot be null!"); + } + if (value == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'value' cannot be null!"); + } + encoder.encodeElement(resource); + encoder.encodeTime(timestamp); + encoder.encodeAttribute(value); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + super.decode(decoder); + resource = (org.ccsds.moims.mo.mal.structures.ObjectRef) decoder.decodeElement(new org.ccsds.moims.mo.mal.structures.ObjectRef()); + timestamp = decoder.decodeTime(); + value = (org.ccsds.moims.mo.mal.structures.Attribute) decoder.decodeAttribute(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ResourceUpdateList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ResourceUpdateList.java new file mode 100644 index 00000000..91baf1a0 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ResourceUpdateList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for ResourceUpdate. + */ +public final class ResourceUpdateList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107402L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107402L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for ResourceUpdateList. + * + */ + public ResourceUpdateList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public ResourceUpdateList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public ResourceUpdateList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.ResourceUpdate element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.ResourceUpdate element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new ResourceUpdateList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.ResourceUpdate(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RevisionStatusEnum.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RevisionStatusEnum.java new file mode 100644 index 00000000..a0d798c4 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RevisionStatusEnum.java @@ -0,0 +1,150 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * Enumeration class for RevisionStatusEnum. + */ +public final class RevisionStatusEnum extends org.ccsds.moims.mo.mal.structures.Enumeration { + + private static final long serialVersionUID = 1407374900331003L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900331003L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Enumeration value for NEW. + */ + public static final int NEW_VALUE = 1; + + /** + * Enumeration singleton for value NEW. + */ + public static final org.ccsds.moims.mo.mps.structures.RevisionStatusEnum NEW = new org.ccsds.moims.mo.mps.structures.RevisionStatusEnum(org.ccsds.moims.mo.mps.structures.RevisionStatusEnum.NEW_VALUE); + + /** + * Enumeration value for MODIFIED. + */ + public static final int MODIFIED_VALUE = 2; + + /** + * Enumeration singleton for value MODIFIED. + */ + public static final org.ccsds.moims.mo.mps.structures.RevisionStatusEnum MODIFIED = new org.ccsds.moims.mo.mps.structures.RevisionStatusEnum(org.ccsds.moims.mo.mps.structures.RevisionStatusEnum.MODIFIED_VALUE); + + /** + * Enumeration value for DELETED. + */ + public static final int DELETED_VALUE = 3; + + /** + * Enumeration singleton for value DELETED. + */ + public static final org.ccsds.moims.mo.mps.structures.RevisionStatusEnum DELETED = new org.ccsds.moims.mo.mps.structures.RevisionStatusEnum(org.ccsds.moims.mo.mps.structures.RevisionStatusEnum.DELETED_VALUE); + + /** + * Enumeration value for UNDEFINED. + */ + public static final int UNDEFINED_VALUE = 4; + + /** + * Enumeration singleton for value UNDEFINED. + */ + public static final org.ccsds.moims.mo.mps.structures.RevisionStatusEnum UNDEFINED = new org.ccsds.moims.mo.mps.structures.RevisionStatusEnum(org.ccsds.moims.mo.mps.structures.RevisionStatusEnum.UNDEFINED_VALUE); + + /** + * Set of enumeration instances. + */ + private static final org.ccsds.moims.mo.mps.structures.RevisionStatusEnum[] _ENUMERATIONS = { + NEW, MODIFIED, DELETED, UNDEFINED}; + + /** + * E3: The RevisionStatusEnum represents the type of changes that were made to an item in a given revision. + */ + public RevisionStatusEnum() { + super(-1); + } + + /** + * E3: The RevisionStatusEnum represents the type of changes that were made + * to an item in a given revision. + * + * @param value The value of the Enumeration. + */ + public RevisionStatusEnum(int value) { + super(value); + } + + @Override + public String toString() { + switch (getValue()) { + case NEW_VALUE: + return "NEW"; + case MODIFIED_VALUE: + return "MODIFIED"; + case DELETED_VALUE: + return "DELETED"; + case UNDEFINED_VALUE: + return "UNDEFINED"; + default: + throw new RuntimeException("Unknown ordinal!"); + } + } + + /** + * Returns the enumeration element represented by the supplied string, or + * null if not matched. + * + * @param s s The string to search for. + * @return The matched enumeration element, or null if not matched. + */ + public static org.ccsds.moims.mo.mps.structures.RevisionStatusEnum fromString(String s) { + switch (s) { + case "NEW": + return RevisionStatusEnum.NEW; + case "MODIFIED": + return RevisionStatusEnum.MODIFIED; + case "DELETED": + return RevisionStatusEnum.DELETED; + case "UNDEFINED": + return RevisionStatusEnum.UNDEFINED; + default: + throw new RuntimeException("Unknown Enumeration for the provided string: " + s); + } + } + + @Override + public org.ccsds.moims.mo.mal.structures.Enumeration fromValue(Integer value) { + switch (value) { + case NEW_VALUE: + return RevisionStatusEnum.NEW; + case MODIFIED_VALUE: + return RevisionStatusEnum.MODIFIED; + case DELETED_VALUE: + return RevisionStatusEnum.DELETED; + case UNDEFINED_VALUE: + return RevisionStatusEnum.UNDEFINED; + default: + throw new RuntimeException("Unknown Enumeration for the provided value: " + value); + } + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return _ENUMERATIONS[0]; + } + + @Override + public int getEnumSize() { + return 4; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RevisionStatusEnumList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RevisionStatusEnumList.java new file mode 100644 index 00000000..173dfd0a --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RevisionStatusEnumList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for RevisionStatusEnum. + */ +public final class RevisionStatusEnumList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107205L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107205L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for RevisionStatusEnumList. + * + */ + public RevisionStatusEnumList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public RevisionStatusEnumList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public RevisionStatusEnumList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.RevisionStatusEnum element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.RevisionStatusEnum element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new RevisionStatusEnumList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return org.ccsds.moims.mo.mps.structures.RevisionStatusEnum.NEW; + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RevolutionConstraint.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RevolutionConstraint.java new file mode 100644 index 00000000..0334a249 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RevolutionConstraint.java @@ -0,0 +1,172 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E7: Specifies a range of revolution angles for a rotating spacecraft. + */ +public final class RevolutionConstraint extends org.ccsds.moims.mo.mps.structures.GeometricConstraint { + + private static final long serialVersionUID = 1407374900330538L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330538L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Angle of revolution. + */ + private org.ccsds.moims.mo.mal.structures.Element revolutionAngle; + + /** + * Tolerance in the angle of revolution. + */ + private org.ccsds.moims.mo.mal.structures.Element tolerance; + + /** + * Default constructor for RevolutionConstraint. + * + */ + public RevolutionConstraint() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param negate Specifies whether the result of combining the Constraints is to be inverted (NOT function). Default = False. + * @param startRef Identifies the point in the duration of the applicable planning activity to which the start of the constraint period relates. Default is the start of the planning activity. + * @param endRef Identifies the point in the duration of the applicable planning activity to which the end of the constraint period relates. Default is the end of the planning activity. + * @param startOffset Offset from startRef that specifies the start of the constraint period. A positive offset implies a shift later in time. Default is no offset. + * @param endOffset Offset from endRef that specifies the end of the constraint period. A positive offset implies a shift later in time. Default is no offset. + * @param revolutionAngle Angle of revolution. + * @param tolerance Tolerance in the angle of revolution. + */ + public RevolutionConstraint(Boolean negate, + org.ccsds.moims.mo.mps.structures.Slider startRef, + org.ccsds.moims.mo.mps.structures.Slider endRef, + org.ccsds.moims.mo.mal.structures.Element startOffset, + org.ccsds.moims.mo.mal.structures.Element endOffset, + org.ccsds.moims.mo.mal.structures.Element revolutionAngle, + org.ccsds.moims.mo.mal.structures.Element tolerance) { + super(negate, + startRef, + endRef, + startOffset, + endOffset); + this.revolutionAngle = revolutionAngle; + this.tolerance = tolerance; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param revolutionAngle Angle of revolution. + * @param tolerance Tolerance in the angle of revolution. + */ + public RevolutionConstraint(org.ccsds.moims.mo.mal.structures.Element revolutionAngle, + org.ccsds.moims.mo.mal.structures.Element tolerance) { + this.revolutionAngle = revolutionAngle; + this.tolerance = tolerance; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.RevolutionConstraint(); + } + + /** + * Returns the field revolutionAngle. + * + * @return The field revolutionAngle + */ + public org.ccsds.moims.mo.mal.structures.Element getRevolutionAngle() { + return revolutionAngle; + } + + /** + * Returns the field tolerance. + * + * @return The field tolerance + */ + public org.ccsds.moims.mo.mal.structures.Element getTolerance() { + return tolerance; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof RevolutionConstraint) { + if (! super.equals(obj)) { + return false; + } + RevolutionConstraint other = (RevolutionConstraint) obj; + if (revolutionAngle == null) { + if (other.revolutionAngle != null) { + return false; + } + } else { + if (! revolutionAngle.equals(other.revolutionAngle)) { + return false; + } + } + if (tolerance == null) { + if (other.tolerance != null) { + return false; + } + } else { + if (! tolerance.equals(other.tolerance)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = super.hashCode(); + hash = 83 * hash + (revolutionAngle != null ? revolutionAngle.hashCode() : 0); + hash = 83 * hash + (tolerance != null ? tolerance.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(RevolutionConstraint: "); + buf.append(super.toString()); + buf.append(", revolutionAngle=").append(revolutionAngle); + buf.append(", tolerance=").append(tolerance); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + super.encode(encoder); + if (revolutionAngle == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'revolutionAngle' cannot be null!"); + } + if (tolerance == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'tolerance' cannot be null!"); + } + encoder.encodeAbstractElement(revolutionAngle); + encoder.encodeAbstractElement(tolerance); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + super.decode(decoder); + revolutionAngle = (org.ccsds.moims.mo.mal.structures.Element) decoder.decodeAbstractElement(); + tolerance = (org.ccsds.moims.mo.mal.structures.Element) decoder.decodeAbstractElement(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RevolutionConstraintList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RevolutionConstraintList.java new file mode 100644 index 00000000..8280bb4c --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RevolutionConstraintList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for RevolutionConstraint. + */ +public final class RevolutionConstraintList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107670L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107670L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for RevolutionConstraintList. + * + */ + public RevolutionConstraintList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public RevolutionConstraintList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public RevolutionConstraintList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.RevolutionConstraint element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.RevolutionConstraint element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new RevolutionConstraintList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.RevolutionConstraint(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RevolutionRepetition.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RevolutionRepetition.java new file mode 100644 index 00000000..47f2eb2e --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RevolutionRepetition.java @@ -0,0 +1,207 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E6: A sub-type of Repetition based on the revolutions of a rotating spacecraft + * or instrument. + */ +public final class RevolutionRepetition extends org.ccsds.moims.mo.mps.structures.Repetition { + + private static final long serialVersionUID = 1407374900330556L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330556L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * The required number of revolutions between occurrences. + */ + private org.ccsds.moims.mo.mal.structures.Element revsSeparation; + + /** + * The allowed tolerance (+/-) in the required number of revolutions between + * occurrences, the interpretation of which is dependent on the separationType. + */ + private org.ccsds.moims.mo.mal.structures.Element revsTolerance; + + /** + * Specifies the angle within a revolution. + */ + private org.ccsds.moims.mo.mal.structures.Element revAngle; + + /** + * Default constructor for RevolutionRepetition. + * + */ + public RevolutionRepetition() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param count Maximum number of repeat cycles/instances. If not specified there is no limit to the number of repetitions. + * @param timeWindow Time period over which the repetition is applicable. If not specified repetition continues indefinitely. + * @param separationType Specifies whether the repetition interval is Relative to the previous occurrence, or Absolute for all occurrences. + * @param revsSeparation The required number of revolutions between occurrences. + * @param revsTolerance The allowed tolerance (+/-) in the required number of revolutions between occurrences, the interpretation of which is dependent on the separationType. + * @param revAngle Specifies the angle within a revolution. + */ + public RevolutionRepetition(Integer count, + org.ccsds.moims.mo.mps.structures.TimeWindow timeWindow, + org.ccsds.moims.mo.mps.structures.SeparationTypeEnum separationType, + org.ccsds.moims.mo.mal.structures.Element revsSeparation, + org.ccsds.moims.mo.mal.structures.Element revsTolerance, + org.ccsds.moims.mo.mal.structures.Element revAngle) { + super(count, + timeWindow, + separationType); + this.revsSeparation = revsSeparation; + this.revsTolerance = revsTolerance; + this.revAngle = revAngle; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param separationType Specifies whether the repetition interval is Relative to the previous occurrence, or Absolute for all occurrences. + * @param revsSeparation The required number of revolutions between occurrences. + * @param revsTolerance The allowed tolerance (+/-) in the required number of revolutions between occurrences, the interpretation of which is dependent on the separationType. + * @param revAngle Specifies the angle within a revolution. + */ + public RevolutionRepetition(org.ccsds.moims.mo.mps.structures.SeparationTypeEnum separationType, + org.ccsds.moims.mo.mal.structures.Element revsSeparation, + org.ccsds.moims.mo.mal.structures.Element revsTolerance, + org.ccsds.moims.mo.mal.structures.Element revAngle) { + super(separationType); + this.revsSeparation = revsSeparation; + this.revsTolerance = revsTolerance; + this.revAngle = revAngle; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.RevolutionRepetition(); + } + + /** + * Returns the field revsSeparation. + * + * @return The field revsSeparation + */ + public org.ccsds.moims.mo.mal.structures.Element getRevsSeparation() { + return revsSeparation; + } + + /** + * Returns the field revsTolerance. + * + * @return The field revsTolerance + */ + public org.ccsds.moims.mo.mal.structures.Element getRevsTolerance() { + return revsTolerance; + } + + /** + * Returns the field revAngle. + * + * @return The field revAngle + */ + public org.ccsds.moims.mo.mal.structures.Element getRevAngle() { + return revAngle; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof RevolutionRepetition) { + if (! super.equals(obj)) { + return false; + } + RevolutionRepetition other = (RevolutionRepetition) obj; + if (revsSeparation == null) { + if (other.revsSeparation != null) { + return false; + } + } else { + if (! revsSeparation.equals(other.revsSeparation)) { + return false; + } + } + if (revsTolerance == null) { + if (other.revsTolerance != null) { + return false; + } + } else { + if (! revsTolerance.equals(other.revsTolerance)) { + return false; + } + } + if (revAngle == null) { + if (other.revAngle != null) { + return false; + } + } else { + if (! revAngle.equals(other.revAngle)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = super.hashCode(); + hash = 83 * hash + (revsSeparation != null ? revsSeparation.hashCode() : 0); + hash = 83 * hash + (revsTolerance != null ? revsTolerance.hashCode() : 0); + hash = 83 * hash + (revAngle != null ? revAngle.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(RevolutionRepetition: "); + buf.append(super.toString()); + buf.append(", revsSeparation=").append(revsSeparation); + buf.append(", revsTolerance=").append(revsTolerance); + buf.append(", revAngle=").append(revAngle); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + super.encode(encoder); + if (revsSeparation == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'revsSeparation' cannot be null!"); + } + if (revsTolerance == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'revsTolerance' cannot be null!"); + } + if (revAngle == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'revAngle' cannot be null!"); + } + encoder.encodeAbstractElement(revsSeparation); + encoder.encodeAbstractElement(revsTolerance); + encoder.encodeAbstractElement(revAngle); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + super.decode(decoder); + revsSeparation = (org.ccsds.moims.mo.mal.structures.Element) decoder.decodeAbstractElement(); + revsTolerance = (org.ccsds.moims.mo.mal.structures.Element) decoder.decodeAbstractElement(); + revAngle = (org.ccsds.moims.mo.mal.structures.Element) decoder.decodeAbstractElement(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RevolutionRepetitionList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RevolutionRepetitionList.java new file mode 100644 index 00000000..f6a358d0 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/RevolutionRepetitionList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for RevolutionRepetition. + */ +public final class RevolutionRepetitionList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107652L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107652L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for RevolutionRepetitionList. + * + */ + public RevolutionRepetitionList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public RevolutionRepetitionList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public RevolutionRepetitionList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.RevolutionRepetition element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.RevolutionRepetition element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new RevolutionRepetitionList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.RevolutionRepetition(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SecondaryErrorCodeEnum.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SecondaryErrorCodeEnum.java new file mode 100644 index 00000000..9bd575db --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SecondaryErrorCodeEnum.java @@ -0,0 +1,215 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * Enumeration class for SecondaryErrorCodeEnum. + */ +public final class SecondaryErrorCodeEnum extends org.ccsds.moims.mo.mal.structures.Enumeration { + + private static final long serialVersionUID = 1407374900330560L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330560L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Enumeration value for UNKNOWN. + */ + public static final int UNKNOWN_VALUE = 1; + + /** + * Enumeration singleton for value UNKNOWN. + */ + public static final org.ccsds.moims.mo.mps.structures.SecondaryErrorCodeEnum UNKNOWN = new org.ccsds.moims.mo.mps.structures.SecondaryErrorCodeEnum(org.ccsds.moims.mo.mps.structures.SecondaryErrorCodeEnum.UNKNOWN_VALUE); + + /** + * Enumeration value for UNDEFINED. + */ + public static final int UNDEFINED_VALUE = 2; + + /** + * Enumeration singleton for value UNDEFINED. + */ + public static final org.ccsds.moims.mo.mps.structures.SecondaryErrorCodeEnum UNDEFINED = new org.ccsds.moims.mo.mps.structures.SecondaryErrorCodeEnum(org.ccsds.moims.mo.mps.structures.SecondaryErrorCodeEnum.UNDEFINED_VALUE); + + /** + * Enumeration value for OUT_OF_RANGE. + */ + public static final int OUT_OF_RANGE_VALUE = 3; + + /** + * Enumeration singleton for value OUT_OF_RANGE. + */ + public static final org.ccsds.moims.mo.mps.structures.SecondaryErrorCodeEnum OUT_OF_RANGE = new org.ccsds.moims.mo.mps.structures.SecondaryErrorCodeEnum(org.ccsds.moims.mo.mps.structures.SecondaryErrorCodeEnum.OUT_OF_RANGE_VALUE); + + /** + * Enumeration value for UNRECOGNIZED. + */ + public static final int UNRECOGNIZED_VALUE = 4; + + /** + * Enumeration singleton for value UNRECOGNIZED. + */ + public static final org.ccsds.moims.mo.mps.structures.SecondaryErrorCodeEnum UNRECOGNIZED = new org.ccsds.moims.mo.mps.structures.SecondaryErrorCodeEnum(org.ccsds.moims.mo.mps.structures.SecondaryErrorCodeEnum.UNRECOGNIZED_VALUE); + + /** + * Enumeration value for BAD_TIME. + */ + public static final int BAD_TIME_VALUE = 5; + + /** + * Enumeration singleton for value BAD_TIME. + */ + public static final org.ccsds.moims.mo.mps.structures.SecondaryErrorCodeEnum BAD_TIME = new org.ccsds.moims.mo.mps.structures.SecondaryErrorCodeEnum(org.ccsds.moims.mo.mps.structures.SecondaryErrorCodeEnum.BAD_TIME_VALUE); + + /** + * Enumeration value for BAD_POSITION. + */ + public static final int BAD_POSITION_VALUE = 6; + + /** + * Enumeration singleton for value BAD_POSITION. + */ + public static final org.ccsds.moims.mo.mps.structures.SecondaryErrorCodeEnum BAD_POSITION = new org.ccsds.moims.mo.mps.structures.SecondaryErrorCodeEnum(org.ccsds.moims.mo.mps.structures.SecondaryErrorCodeEnum.BAD_POSITION_VALUE); + + /** + * Enumeration value for BAD_DIRECTION. + */ + public static final int BAD_DIRECTION_VALUE = 7; + + /** + * Enumeration singleton for value BAD_DIRECTION. + */ + public static final org.ccsds.moims.mo.mps.structures.SecondaryErrorCodeEnum BAD_DIRECTION = new org.ccsds.moims.mo.mps.structures.SecondaryErrorCodeEnum(org.ccsds.moims.mo.mps.structures.SecondaryErrorCodeEnum.BAD_DIRECTION_VALUE); + + /** + * Enumeration value for INCONSISTENT. + */ + public static final int INCONSISTENT_VALUE = 8; + + /** + * Enumeration singleton for value INCONSISTENT. + */ + public static final org.ccsds.moims.mo.mps.structures.SecondaryErrorCodeEnum INCONSISTENT = new org.ccsds.moims.mo.mps.structures.SecondaryErrorCodeEnum(org.ccsds.moims.mo.mps.structures.SecondaryErrorCodeEnum.INCONSISTENT_VALUE); + + /** + * Set of enumeration instances. + */ + private static final org.ccsds.moims.mo.mps.structures.SecondaryErrorCodeEnum[] _ENUMERATIONS = { + UNKNOWN, UNDEFINED, OUT_OF_RANGE, UNRECOGNIZED, BAD_TIME, BAD_POSITION, + BAD_DIRECTION, INCONSISTENT}; + + /** + * E1: For the INVALID error, the secondary error code is a MAL::UShort that allows for deployment specific extensibility. + */ + public SecondaryErrorCodeEnum() { + super(-1); + } + + /** + * E1: For the INVALID error, the secondary error code is a MAL::UShort that + * allows for deployment specific extensibility. + * + * @param value The value of the Enumeration. + */ + public SecondaryErrorCodeEnum(int value) { + super(value); + } + + @Override + public String toString() { + switch (getValue()) { + case UNKNOWN_VALUE: + return "UNKNOWN"; + case UNDEFINED_VALUE: + return "UNDEFINED"; + case OUT_OF_RANGE_VALUE: + return "OUT_OF_RANGE"; + case UNRECOGNIZED_VALUE: + return "UNRECOGNIZED"; + case BAD_TIME_VALUE: + return "BAD_TIME"; + case BAD_POSITION_VALUE: + return "BAD_POSITION"; + case BAD_DIRECTION_VALUE: + return "BAD_DIRECTION"; + case INCONSISTENT_VALUE: + return "INCONSISTENT"; + default: + throw new RuntimeException("Unknown ordinal!"); + } + } + + /** + * Returns the enumeration element represented by the supplied string, or + * null if not matched. + * + * @param s s The string to search for. + * @return The matched enumeration element, or null if not matched. + */ + public static org.ccsds.moims.mo.mps.structures.SecondaryErrorCodeEnum fromString(String s) { + switch (s) { + case "UNKNOWN": + return SecondaryErrorCodeEnum.UNKNOWN; + case "UNDEFINED": + return SecondaryErrorCodeEnum.UNDEFINED; + case "OUT_OF_RANGE": + return SecondaryErrorCodeEnum.OUT_OF_RANGE; + case "UNRECOGNIZED": + return SecondaryErrorCodeEnum.UNRECOGNIZED; + case "BAD_TIME": + return SecondaryErrorCodeEnum.BAD_TIME; + case "BAD_POSITION": + return SecondaryErrorCodeEnum.BAD_POSITION; + case "BAD_DIRECTION": + return SecondaryErrorCodeEnum.BAD_DIRECTION; + case "INCONSISTENT": + return SecondaryErrorCodeEnum.INCONSISTENT; + default: + throw new RuntimeException("Unknown Enumeration for the provided string: " + s); + } + } + + @Override + public org.ccsds.moims.mo.mal.structures.Enumeration fromValue(Integer value) { + switch (value) { + case UNKNOWN_VALUE: + return SecondaryErrorCodeEnum.UNKNOWN; + case UNDEFINED_VALUE: + return SecondaryErrorCodeEnum.UNDEFINED; + case OUT_OF_RANGE_VALUE: + return SecondaryErrorCodeEnum.OUT_OF_RANGE; + case UNRECOGNIZED_VALUE: + return SecondaryErrorCodeEnum.UNRECOGNIZED; + case BAD_TIME_VALUE: + return SecondaryErrorCodeEnum.BAD_TIME; + case BAD_POSITION_VALUE: + return SecondaryErrorCodeEnum.BAD_POSITION; + case BAD_DIRECTION_VALUE: + return SecondaryErrorCodeEnum.BAD_DIRECTION; + case INCONSISTENT_VALUE: + return SecondaryErrorCodeEnum.INCONSISTENT; + default: + throw new RuntimeException("Unknown Enumeration for the provided value: " + value); + } + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return _ENUMERATIONS[0]; + } + + @Override + public int getEnumSize() { + return 8; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SecondaryErrorCodeEnumList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SecondaryErrorCodeEnumList.java new file mode 100644 index 00000000..dba5a18f --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SecondaryErrorCodeEnumList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for SecondaryErrorCodeEnum. + */ +public final class SecondaryErrorCodeEnumList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107648L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107648L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for SecondaryErrorCodeEnumList. + * + */ + public SecondaryErrorCodeEnumList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public SecondaryErrorCodeEnumList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public SecondaryErrorCodeEnumList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.SecondaryErrorCodeEnum element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.SecondaryErrorCodeEnum element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new SecondaryErrorCodeEnumList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return org.ccsds.moims.mo.mps.structures.SecondaryErrorCodeEnum.UNKNOWN; + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SeparationConstraint.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SeparationConstraint.java new file mode 100644 index 00000000..c4e2b044 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SeparationConstraint.java @@ -0,0 +1,389 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E2: A separation constraint specifies that the parent planning activity + * (the activity for which the constraint is defined) must be separate in + * time from another planning activity or planning event, the opponent. + */ +public final class SeparationConstraint extends org.ccsds.moims.mo.mps.structures.Constraint { + + private static final long serialVersionUID = 1407374900330542L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330542L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Object Type: ActivityDefinition | EventDefinition Specifies the definition + * (class) of the opponent planning activity or planning event. + */ + private org.ccsds.moims.mo.mal.structures.Element opponent; + + /** + * Identifies the point in the duration of the parent activity with respect + * to which to place the start of its constraint window. Default = 0. + */ + private org.ccsds.moims.mo.mps.structures.Slider startRef; + + /** + * Offset with respect to startRef of the start of the parent activity constraint + * window. A positive offset implies a shift later in time. Default is no + * offset. + */ + private org.ccsds.moims.mo.mal.structures.Element startOffset; + + /** + * Identifies the point in the duration of the parent activity with respect + * to which to place the end of its constraint window. Default = 1. + */ + private org.ccsds.moims.mo.mps.structures.Slider endRef; + + /** + * Offset with respect to endRef of the end of the parent activity constraint + * window. A positive offset implies a shift later in time. Default is no + * offset. + */ + private org.ccsds.moims.mo.mal.structures.Element endOffset; + + /** + * Identifies the point in the duration of the opponent with respect to which + * to place the start of its constraint window. This field will be ignored + * in case the opponent is a planning event. Default = 0. + */ + private org.ccsds.moims.mo.mps.structures.Slider opponentStartRef; + + /** + * Offset with respect to opponentStartRef of the start of the opponent constraint + * window. A positive offset implies a shift later in time. Default is no + * offset. + */ + private org.ccsds.moims.mo.mal.structures.Element opponentStartOffset; + + /** + * Identifies the point in the duration of the opponent with respect to which + * to place the end of its constraint window. This field will be ignored + * in case the opponent is a planning event. Default = 1. + */ + private org.ccsds.moims.mo.mps.structures.Slider opponentEndRef; + + /** + * Offset with respect to opponentEndRef of the end of the opponent constraint + * window. A positive offset implies a shift later in time. Default is no + * offset. + */ + private org.ccsds.moims.mo.mal.structures.Element opponentEndOffset; + + /** + * Default constructor for SeparationConstraint. + * + */ + public SeparationConstraint() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param negate Specifies whether the result of combining the Constraints is to be inverted (NOT function). Default = False. + * @param opponent Object Type: ActivityDefinition | EventDefinition Specifies the definition (class) of the opponent planning activity or planning event. + * @param startRef Identifies the point in the duration of the parent activity with respect to which to place the start of its constraint window. Default = 0. + * @param startOffset Offset with respect to startRef of the start of the parent activity constraint window. A positive offset implies a shift later in time. Default is no offset. + * @param endRef Identifies the point in the duration of the parent activity with respect to which to place the end of its constraint window. Default = 1. + * @param endOffset Offset with respect to endRef of the end of the parent activity constraint window. A positive offset implies a shift later in time. Default is no offset. + * @param opponentStartRef Identifies the point in the duration of the opponent with respect to which to place the start of its constraint window. This field will be ignored in case the opponent is a planning event. Default = 0. + * @param opponentStartOffset Offset with respect to opponentStartRef of the start of the opponent constraint window. A positive offset implies a shift later in time. Default is no offset. + * @param opponentEndRef Identifies the point in the duration of the opponent with respect to which to place the end of its constraint window. This field will be ignored in case the opponent is a planning event. Default = 1. + * @param opponentEndOffset Offset with respect to opponentEndRef of the end of the opponent constraint window. A positive offset implies a shift later in time. Default is no offset. + */ + public SeparationConstraint(Boolean negate, + org.ccsds.moims.mo.mal.structures.Element opponent, + org.ccsds.moims.mo.mps.structures.Slider startRef, + org.ccsds.moims.mo.mal.structures.Element startOffset, + org.ccsds.moims.mo.mps.structures.Slider endRef, + org.ccsds.moims.mo.mal.structures.Element endOffset, + org.ccsds.moims.mo.mps.structures.Slider opponentStartRef, + org.ccsds.moims.mo.mal.structures.Element opponentStartOffset, + org.ccsds.moims.mo.mps.structures.Slider opponentEndRef, + org.ccsds.moims.mo.mal.structures.Element opponentEndOffset) { + super(negate); + this.opponent = opponent; + this.startRef = startRef; + this.startOffset = startOffset; + this.endRef = endRef; + this.endOffset = endOffset; + this.opponentStartRef = opponentStartRef; + this.opponentStartOffset = opponentStartOffset; + this.opponentEndRef = opponentEndRef; + this.opponentEndOffset = opponentEndOffset; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param opponent Object Type: ActivityDefinition | EventDefinition Specifies the definition (class) of the opponent planning activity or planning event. + */ + public SeparationConstraint(org.ccsds.moims.mo.mal.structures.Element opponent) { + this.opponent = opponent; + this.startRef = null; + this.startOffset = null; + this.endRef = null; + this.endOffset = null; + this.opponentStartRef = null; + this.opponentStartOffset = null; + this.opponentEndRef = null; + this.opponentEndOffset = null; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.SeparationConstraint(); + } + + /** + * Returns the field opponent. + * + * @return The field opponent + */ + public org.ccsds.moims.mo.mal.structures.Element getOpponent() { + return opponent; + } + + /** + * Returns the field startRef. + * + * @return The field startRef + */ + public org.ccsds.moims.mo.mps.structures.Slider getStartRef() { + return startRef; + } + + /** + * Returns the field startOffset. + * + * @return The field startOffset + */ + public org.ccsds.moims.mo.mal.structures.Element getStartOffset() { + return startOffset; + } + + /** + * Returns the field endRef. + * + * @return The field endRef + */ + public org.ccsds.moims.mo.mps.structures.Slider getEndRef() { + return endRef; + } + + /** + * Returns the field endOffset. + * + * @return The field endOffset + */ + public org.ccsds.moims.mo.mal.structures.Element getEndOffset() { + return endOffset; + } + + /** + * Returns the field opponentStartRef. + * + * @return The field opponentStartRef + */ + public org.ccsds.moims.mo.mps.structures.Slider getOpponentStartRef() { + return opponentStartRef; + } + + /** + * Returns the field opponentStartOffset. + * + * @return The field opponentStartOffset + */ + public org.ccsds.moims.mo.mal.structures.Element getOpponentStartOffset() { + return opponentStartOffset; + } + + /** + * Returns the field opponentEndRef. + * + * @return The field opponentEndRef + */ + public org.ccsds.moims.mo.mps.structures.Slider getOpponentEndRef() { + return opponentEndRef; + } + + /** + * Returns the field opponentEndOffset. + * + * @return The field opponentEndOffset + */ + public org.ccsds.moims.mo.mal.structures.Element getOpponentEndOffset() { + return opponentEndOffset; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof SeparationConstraint) { + if (! super.equals(obj)) { + return false; + } + SeparationConstraint other = (SeparationConstraint) obj; + if (opponent == null) { + if (other.opponent != null) { + return false; + } + } else { + if (! opponent.equals(other.opponent)) { + return false; + } + } + if (startRef == null) { + if (other.startRef != null) { + return false; + } + } else { + if (! startRef.equals(other.startRef)) { + return false; + } + } + if (startOffset == null) { + if (other.startOffset != null) { + return false; + } + } else { + if (! startOffset.equals(other.startOffset)) { + return false; + } + } + if (endRef == null) { + if (other.endRef != null) { + return false; + } + } else { + if (! endRef.equals(other.endRef)) { + return false; + } + } + if (endOffset == null) { + if (other.endOffset != null) { + return false; + } + } else { + if (! endOffset.equals(other.endOffset)) { + return false; + } + } + if (opponentStartRef == null) { + if (other.opponentStartRef != null) { + return false; + } + } else { + if (! opponentStartRef.equals(other.opponentStartRef)) { + return false; + } + } + if (opponentStartOffset == null) { + if (other.opponentStartOffset != null) { + return false; + } + } else { + if (! opponentStartOffset.equals(other.opponentStartOffset)) { + return false; + } + } + if (opponentEndRef == null) { + if (other.opponentEndRef != null) { + return false; + } + } else { + if (! opponentEndRef.equals(other.opponentEndRef)) { + return false; + } + } + if (opponentEndOffset == null) { + if (other.opponentEndOffset != null) { + return false; + } + } else { + if (! opponentEndOffset.equals(other.opponentEndOffset)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = super.hashCode(); + hash = 83 * hash + (opponent != null ? opponent.hashCode() : 0); + hash = 83 * hash + (startRef != null ? startRef.hashCode() : 0); + hash = 83 * hash + (startOffset != null ? startOffset.hashCode() : 0); + hash = 83 * hash + (endRef != null ? endRef.hashCode() : 0); + hash = 83 * hash + (endOffset != null ? endOffset.hashCode() : 0); + hash = 83 * hash + (opponentStartRef != null ? opponentStartRef.hashCode() : 0); + hash = 83 * hash + (opponentStartOffset != null ? opponentStartOffset.hashCode() : 0); + hash = 83 * hash + (opponentEndRef != null ? opponentEndRef.hashCode() : 0); + hash = 83 * hash + (opponentEndOffset != null ? opponentEndOffset.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(SeparationConstraint: "); + buf.append(super.toString()); + buf.append(", opponent=").append(opponent); + buf.append(", startRef=").append(startRef); + buf.append(", startOffset=").append(startOffset); + buf.append(", endRef=").append(endRef); + buf.append(", endOffset=").append(endOffset); + buf.append(", opponentStartRef=").append(opponentStartRef); + buf.append(", opponentStartOffset=").append(opponentStartOffset); + buf.append(", opponentEndRef=").append(opponentEndRef); + buf.append(", opponentEndOffset=").append(opponentEndOffset); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + super.encode(encoder); + if (opponent == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'opponent' cannot be null!"); + } + encoder.encodeAbstractElement(opponent); + encoder.encodeNullableElement(startRef); + encoder.encodeNullableAbstractElement(startOffset); + encoder.encodeNullableElement(endRef); + encoder.encodeNullableAbstractElement(endOffset); + encoder.encodeNullableElement(opponentStartRef); + encoder.encodeNullableAbstractElement(opponentStartOffset); + encoder.encodeNullableElement(opponentEndRef); + encoder.encodeNullableAbstractElement(opponentEndOffset); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + super.decode(decoder); + opponent = (org.ccsds.moims.mo.mal.structures.Element) decoder.decodeAbstractElement(); + startRef = (org.ccsds.moims.mo.mps.structures.Slider) decoder.decodeNullableElement(new org.ccsds.moims.mo.mps.structures.Slider()); + startOffset = (org.ccsds.moims.mo.mal.structures.Element) decoder.decodeNullableAbstractElement(); + endRef = (org.ccsds.moims.mo.mps.structures.Slider) decoder.decodeNullableElement(new org.ccsds.moims.mo.mps.structures.Slider()); + endOffset = (org.ccsds.moims.mo.mal.structures.Element) decoder.decodeNullableAbstractElement(); + opponentStartRef = (org.ccsds.moims.mo.mps.structures.Slider) decoder.decodeNullableElement(new org.ccsds.moims.mo.mps.structures.Slider()); + opponentStartOffset = (org.ccsds.moims.mo.mal.structures.Element) decoder.decodeNullableAbstractElement(); + opponentEndRef = (org.ccsds.moims.mo.mps.structures.Slider) decoder.decodeNullableElement(new org.ccsds.moims.mo.mps.structures.Slider()); + opponentEndOffset = (org.ccsds.moims.mo.mal.structures.Element) decoder.decodeNullableAbstractElement(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SeparationConstraintList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SeparationConstraintList.java new file mode 100644 index 00000000..bb0c45c6 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SeparationConstraintList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for SeparationConstraint. + */ +public final class SeparationConstraintList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107666L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107666L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for SeparationConstraintList. + * + */ + public SeparationConstraintList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public SeparationConstraintList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public SeparationConstraintList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.SeparationConstraint element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.SeparationConstraint element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new SeparationConstraintList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.SeparationConstraint(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SeparationTypeEnum.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SeparationTypeEnum.java new file mode 100644 index 00000000..4efc5358 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SeparationTypeEnum.java @@ -0,0 +1,118 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * Enumeration class for SeparationTypeEnum. + */ +public final class SeparationTypeEnum extends org.ccsds.moims.mo.mal.structures.Enumeration { + + private static final long serialVersionUID = 1407374900330552L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330552L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Enumeration value for RELATIVE. + */ + public static final int RELATIVE_VALUE = 1; + + /** + * Enumeration singleton for value RELATIVE. + */ + public static final org.ccsds.moims.mo.mps.structures.SeparationTypeEnum RELATIVE = new org.ccsds.moims.mo.mps.structures.SeparationTypeEnum(org.ccsds.moims.mo.mps.structures.SeparationTypeEnum.RELATIVE_VALUE); + + /** + * Enumeration value for ABSOLUTE. + */ + public static final int ABSOLUTE_VALUE = 2; + + /** + * Enumeration singleton for value ABSOLUTE. + */ + public static final org.ccsds.moims.mo.mps.structures.SeparationTypeEnum ABSOLUTE = new org.ccsds.moims.mo.mps.structures.SeparationTypeEnum(org.ccsds.moims.mo.mps.structures.SeparationTypeEnum.ABSOLUTE_VALUE); + + /** + * Set of enumeration instances. + */ + private static final org.ccsds.moims.mo.mps.structures.SeparationTypeEnum[] _ENUMERATIONS = { + RELATIVE, ABSOLUTE}; + + /** + * E1: A SeparationTypeEnum is used to define whether the separation between repetitions is relative or absolute. + */ + public SeparationTypeEnum() { + super(-1); + } + + /** + * E1: A SeparationTypeEnum is used to define whether the separation between + * repetitions is relative or absolute. + * + * @param value The value of the Enumeration. + */ + public SeparationTypeEnum(int value) { + super(value); + } + + @Override + public String toString() { + switch (getValue()) { + case RELATIVE_VALUE: + return "RELATIVE"; + case ABSOLUTE_VALUE: + return "ABSOLUTE"; + default: + throw new RuntimeException("Unknown ordinal!"); + } + } + + /** + * Returns the enumeration element represented by the supplied string, or + * null if not matched. + * + * @param s s The string to search for. + * @return The matched enumeration element, or null if not matched. + */ + public static org.ccsds.moims.mo.mps.structures.SeparationTypeEnum fromString(String s) { + switch (s) { + case "RELATIVE": + return SeparationTypeEnum.RELATIVE; + case "ABSOLUTE": + return SeparationTypeEnum.ABSOLUTE; + default: + throw new RuntimeException("Unknown Enumeration for the provided string: " + s); + } + } + + @Override + public org.ccsds.moims.mo.mal.structures.Enumeration fromValue(Integer value) { + switch (value) { + case RELATIVE_VALUE: + return SeparationTypeEnum.RELATIVE; + case ABSOLUTE_VALUE: + return SeparationTypeEnum.ABSOLUTE; + default: + throw new RuntimeException("Unknown Enumeration for the provided value: " + value); + } + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return _ENUMERATIONS[0]; + } + + @Override + public int getEnumSize() { + return 2; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SeparationTypeEnumList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SeparationTypeEnumList.java new file mode 100644 index 00000000..cc98630d --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SeparationTypeEnumList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for SeparationTypeEnum. + */ +public final class SeparationTypeEnumList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107656L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107656L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for SeparationTypeEnumList. + * + */ + public SeparationTypeEnumList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public SeparationTypeEnumList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public SeparationTypeEnumList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.SeparationTypeEnum element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.SeparationTypeEnum element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new SeparationTypeEnumList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return org.ccsds.moims.mo.mps.structures.SeparationTypeEnum.RELATIVE; + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SequentialConstraint.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SequentialConstraint.java new file mode 100644 index 00000000..e6270c15 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SequentialConstraint.java @@ -0,0 +1,258 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E2: Sequential constraints impose a restriction on the order of planning + * activities in a Plan with respect to other planning activities and planning + * events. Two objects are identified: the parent activity and its opponent. + * The parent activity is the activity for which the constraint is defined. + * The opponent may be either a planning activity or a planning event and + * must be placed in the Plan relative to the parent activity. + */ +public final class SequentialConstraint extends org.ccsds.moims.mo.mps.structures.Constraint { + + private static final long serialVersionUID = 1407374900330541L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330541L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Object Type: ActivityDefinition | EventDefinition Specifies the definition + * (class) of the opponent planning activity or planning event. + */ + private org.ccsds.moims.mo.mal.structures.Element opponent; + + /** + * Point on the parent activity that must be followed by the opponent. Default + * = 1. + */ + private org.ccsds.moims.mo.mps.structures.Slider parentRef; + + /** + * Point on the opponent that must follow the parent activity. This field + * will be ignored in case the opponent is a planning event. Default = 0. + */ + private org.ccsds.moims.mo.mps.structures.Slider opponentRef; + + /** + * Minimum offset between the specified points on the parent activity and + * the opponent. Default is no offset. + */ + private org.ccsds.moims.mo.mal.structures.Element minOffset; + + /** + * Maximum offset between the specified points on the parent activity and + * the opponent. Default is no offset. + */ + private org.ccsds.moims.mo.mal.structures.Element maxOffset; + + /** + * Default constructor for SequentialConstraint. + * + */ + public SequentialConstraint() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param negate Specifies whether the result of combining the Constraints is to be inverted (NOT function). Default = False. + * @param opponent Object Type: ActivityDefinition | EventDefinition Specifies the definition (class) of the opponent planning activity or planning event. + * @param parentRef Point on the parent activity that must be followed by the opponent. Default = 1. + * @param opponentRef Point on the opponent that must follow the parent activity. This field will be ignored in case the opponent is a planning event. Default = 0. + * @param minOffset Minimum offset between the specified points on the parent activity and the opponent. Default is no offset. + * @param maxOffset Maximum offset between the specified points on the parent activity and the opponent. Default is no offset. + */ + public SequentialConstraint(Boolean negate, + org.ccsds.moims.mo.mal.structures.Element opponent, + org.ccsds.moims.mo.mps.structures.Slider parentRef, + org.ccsds.moims.mo.mps.structures.Slider opponentRef, + org.ccsds.moims.mo.mal.structures.Element minOffset, + org.ccsds.moims.mo.mal.structures.Element maxOffset) { + super(negate); + this.opponent = opponent; + this.parentRef = parentRef; + this.opponentRef = opponentRef; + this.minOffset = minOffset; + this.maxOffset = maxOffset; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param opponent Object Type: ActivityDefinition | EventDefinition Specifies the definition (class) of the opponent planning activity or planning event. + */ + public SequentialConstraint(org.ccsds.moims.mo.mal.structures.Element opponent) { + this.opponent = opponent; + this.parentRef = null; + this.opponentRef = null; + this.minOffset = null; + this.maxOffset = null; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.SequentialConstraint(); + } + + /** + * Returns the field opponent. + * + * @return The field opponent + */ + public org.ccsds.moims.mo.mal.structures.Element getOpponent() { + return opponent; + } + + /** + * Returns the field parentRef. + * + * @return The field parentRef + */ + public org.ccsds.moims.mo.mps.structures.Slider getParentRef() { + return parentRef; + } + + /** + * Returns the field opponentRef. + * + * @return The field opponentRef + */ + public org.ccsds.moims.mo.mps.structures.Slider getOpponentRef() { + return opponentRef; + } + + /** + * Returns the field minOffset. + * + * @return The field minOffset + */ + public org.ccsds.moims.mo.mal.structures.Element getMinOffset() { + return minOffset; + } + + /** + * Returns the field maxOffset. + * + * @return The field maxOffset + */ + public org.ccsds.moims.mo.mal.structures.Element getMaxOffset() { + return maxOffset; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof SequentialConstraint) { + if (! super.equals(obj)) { + return false; + } + SequentialConstraint other = (SequentialConstraint) obj; + if (opponent == null) { + if (other.opponent != null) { + return false; + } + } else { + if (! opponent.equals(other.opponent)) { + return false; + } + } + if (parentRef == null) { + if (other.parentRef != null) { + return false; + } + } else { + if (! parentRef.equals(other.parentRef)) { + return false; + } + } + if (opponentRef == null) { + if (other.opponentRef != null) { + return false; + } + } else { + if (! opponentRef.equals(other.opponentRef)) { + return false; + } + } + if (minOffset == null) { + if (other.minOffset != null) { + return false; + } + } else { + if (! minOffset.equals(other.minOffset)) { + return false; + } + } + if (maxOffset == null) { + if (other.maxOffset != null) { + return false; + } + } else { + if (! maxOffset.equals(other.maxOffset)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = super.hashCode(); + hash = 83 * hash + (opponent != null ? opponent.hashCode() : 0); + hash = 83 * hash + (parentRef != null ? parentRef.hashCode() : 0); + hash = 83 * hash + (opponentRef != null ? opponentRef.hashCode() : 0); + hash = 83 * hash + (minOffset != null ? minOffset.hashCode() : 0); + hash = 83 * hash + (maxOffset != null ? maxOffset.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(SequentialConstraint: "); + buf.append(super.toString()); + buf.append(", opponent=").append(opponent); + buf.append(", parentRef=").append(parentRef); + buf.append(", opponentRef=").append(opponentRef); + buf.append(", minOffset=").append(minOffset); + buf.append(", maxOffset=").append(maxOffset); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + super.encode(encoder); + if (opponent == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'opponent' cannot be null!"); + } + encoder.encodeAbstractElement(opponent); + encoder.encodeNullableElement(parentRef); + encoder.encodeNullableElement(opponentRef); + encoder.encodeNullableAbstractElement(minOffset); + encoder.encodeNullableAbstractElement(maxOffset); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + super.decode(decoder); + opponent = (org.ccsds.moims.mo.mal.structures.Element) decoder.decodeAbstractElement(); + parentRef = (org.ccsds.moims.mo.mps.structures.Slider) decoder.decodeNullableElement(new org.ccsds.moims.mo.mps.structures.Slider()); + opponentRef = (org.ccsds.moims.mo.mps.structures.Slider) decoder.decodeNullableElement(new org.ccsds.moims.mo.mps.structures.Slider()); + minOffset = (org.ccsds.moims.mo.mal.structures.Element) decoder.decodeNullableAbstractElement(); + maxOffset = (org.ccsds.moims.mo.mal.structures.Element) decoder.decodeNullableAbstractElement(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SequentialConstraintList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SequentialConstraintList.java new file mode 100644 index 00000000..62c5908d --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SequentialConstraintList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for SequentialConstraint. + */ +public final class SequentialConstraintList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107667L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107667L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for SequentialConstraintList. + * + */ + public SequentialConstraintList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public SequentialConstraintList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public SequentialConstraintList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.SequentialConstraint element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.SequentialConstraint element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new SequentialConstraintList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.SequentialConstraint(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SimpleActivityDetails.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SimpleActivityDetails.java new file mode 100644 index 00000000..4c35c045 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SimpleActivityDetails.java @@ -0,0 +1,294 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E1: A concrete sub-type of ActivityDetails, a SimpleActivityDetails provides + * the information required to instantiate a single ActivityInstance. + */ +public final class SimpleActivityDetails extends org.ccsds.moims.mo.mps.structures.ActivityDetails { + + private static final long serialVersionUID = 1407374900330601L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330601L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Reference to the ActivityDefinition. + */ + private org.ccsds.moims.mo.mal.structures.ObjectRef activityDefinition; + + /** + * Set of argument specifications for each argument definition contained in + * the referenced activity definition. These supply a value for each argument, + * or an expression to enable the value to be derived. + */ + private org.ccsds.moims.mo.mps.structures.ArgSpecList argSpecs; + + /** + * A single constraint or a constraint node that may contain multiple constraints, + * specific to the ActivityInstance to be created. + */ + private org.ccsds.moims.mo.mps.structures.Constraint constraints; + + /** + * Set of Effects specific to the ActivityInstance to be created. + */ + private org.ccsds.moims.mo.mps.structures.EffectList effects; + + /** + * Optional association of the ActivityInstance with a defined sub-plan. + */ + private org.ccsds.moims.mo.mal.structures.Identifier subPlan; + + /** + * A set of tags that may be used to associate the Activity with an identified + * subset of the Plan, grouping activities by operational responsibility (controller/group/system) + * or other criteria. + */ + private org.ccsds.moims.mo.mal.structures.StringList tags; + + /** + * Default constructor for SimpleActivityDetails. + * + */ + public SimpleActivityDetails() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param activityRef Specifies how the ActivityInstance is placed with respect to any defined Repetition (0=Start; 1=End). Default is Start. + * @param activityOffset Specifies an offset in time for the ActivityInstance from any defined Repetition. Default is no offset. + * @param relatedEvent Specifies a related Event (or Event Group) for the ActivityInstance. Argument specifications and constraints may reference arguments and fields of the RelatedEvent. + * @param comments Any notes associated with the ActivityDetails. + * @param activityDefinition Reference to the ActivityDefinition. + * @param argSpecs Set of argument specifications for each argument definition contained in the referenced activity definition. These supply a value for each argument, or an expression to enable the value to be derived. + * @param constraints A single constraint or a constraint node that may contain multiple constraints, specific to the ActivityInstance to be created. + * @param effects Set of Effects specific to the ActivityInstance to be created. + * @param subPlan Optional association of the ActivityInstance with a defined sub-plan. + * @param tags A set of tags that may be used to associate the Activity with an identified subset of the Plan, grouping activities by operational responsibility (controller/group/system) or other criteria. + */ + public SimpleActivityDetails(org.ccsds.moims.mo.mps.structures.Slider activityRef, + org.ccsds.moims.mo.mal.structures.Element activityOffset, + org.ccsds.moims.mo.mal.structures.Element relatedEvent, + String comments, + org.ccsds.moims.mo.mal.structures.ObjectRef activityDefinition, + org.ccsds.moims.mo.mps.structures.ArgSpecList argSpecs, + org.ccsds.moims.mo.mps.structures.Constraint constraints, + org.ccsds.moims.mo.mps.structures.EffectList effects, + org.ccsds.moims.mo.mal.structures.Identifier subPlan, + org.ccsds.moims.mo.mal.structures.StringList tags) { + super(activityRef, + activityOffset, + relatedEvent, + comments); + this.activityDefinition = activityDefinition; + this.argSpecs = argSpecs; + this.constraints = constraints; + this.effects = effects; + this.subPlan = subPlan; + this.tags = tags; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param activityDefinition Reference to the ActivityDefinition. + */ + public SimpleActivityDetails(org.ccsds.moims.mo.mal.structures.ObjectRef activityDefinition) { + this.activityDefinition = activityDefinition; + this.argSpecs = null; + this.constraints = null; + this.effects = null; + this.subPlan = null; + this.tags = null; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.SimpleActivityDetails(); + } + + /** + * Returns the field activityDefinition. + * + * @return The field activityDefinition + */ + public org.ccsds.moims.mo.mal.structures.ObjectRef getActivityDefinition() { + return activityDefinition; + } + + /** + * Returns the field argSpecs. + * + * @return The field argSpecs + */ + public org.ccsds.moims.mo.mps.structures.ArgSpecList getArgSpecs() { + return argSpecs; + } + + /** + * Returns the field constraints. + * + * @return The field constraints + */ + public org.ccsds.moims.mo.mps.structures.Constraint getConstraints() { + return constraints; + } + + /** + * Returns the field effects. + * + * @return The field effects + */ + public org.ccsds.moims.mo.mps.structures.EffectList getEffects() { + return effects; + } + + /** + * Returns the field subPlan. + * + * @return The field subPlan + */ + public org.ccsds.moims.mo.mal.structures.Identifier getSubPlan() { + return subPlan; + } + + /** + * Returns the field tags. + * + * @return The field tags + */ + public org.ccsds.moims.mo.mal.structures.StringList getTags() { + return tags; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof SimpleActivityDetails) { + if (! super.equals(obj)) { + return false; + } + SimpleActivityDetails other = (SimpleActivityDetails) obj; + if (activityDefinition == null) { + if (other.activityDefinition != null) { + return false; + } + } else { + if (! activityDefinition.equals(other.activityDefinition)) { + return false; + } + } + if (argSpecs == null) { + if (other.argSpecs != null) { + return false; + } + } else { + if (! argSpecs.equals(other.argSpecs)) { + return false; + } + } + if (constraints == null) { + if (other.constraints != null) { + return false; + } + } else { + if (! constraints.equals(other.constraints)) { + return false; + } + } + if (effects == null) { + if (other.effects != null) { + return false; + } + } else { + if (! effects.equals(other.effects)) { + return false; + } + } + if (subPlan == null) { + if (other.subPlan != null) { + return false; + } + } else { + if (! subPlan.equals(other.subPlan)) { + return false; + } + } + if (tags == null) { + if (other.tags != null) { + return false; + } + } else { + if (! tags.equals(other.tags)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = super.hashCode(); + hash = 83 * hash + (activityDefinition != null ? activityDefinition.hashCode() : 0); + hash = 83 * hash + (argSpecs != null ? argSpecs.hashCode() : 0); + hash = 83 * hash + (constraints != null ? constraints.hashCode() : 0); + hash = 83 * hash + (effects != null ? effects.hashCode() : 0); + hash = 83 * hash + (subPlan != null ? subPlan.hashCode() : 0); + hash = 83 * hash + (tags != null ? tags.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(SimpleActivityDetails: "); + buf.append(super.toString()); + buf.append(", activityDefinition=").append(activityDefinition); + buf.append(", argSpecs=").append(argSpecs); + buf.append(", constraints=").append(constraints); + buf.append(", effects=").append(effects); + buf.append(", subPlan=").append(subPlan); + buf.append(", tags=").append(tags); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + super.encode(encoder); + if (activityDefinition == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'activityDefinition' cannot be null!"); + } + encoder.encodeElement(activityDefinition); + encoder.encodeNullableElement(argSpecs); + encoder.encodeNullableAbstractElement(constraints); + encoder.encodeNullableElement(effects); + encoder.encodeNullableIdentifier(subPlan); + encoder.encodeNullableElement(tags); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + super.decode(decoder); + activityDefinition = (org.ccsds.moims.mo.mal.structures.ObjectRef) decoder.decodeElement(new org.ccsds.moims.mo.mal.structures.ObjectRef()); + argSpecs = (org.ccsds.moims.mo.mps.structures.ArgSpecList) decoder.decodeNullableElement(new org.ccsds.moims.mo.mps.structures.ArgSpecList()); + constraints = (org.ccsds.moims.mo.mps.structures.Constraint) decoder.decodeNullableAbstractElement(); + effects = (org.ccsds.moims.mo.mps.structures.EffectList) decoder.decodeNullableElement(new org.ccsds.moims.mo.mps.structures.EffectList()); + subPlan = decoder.decodeNullableIdentifier(); + tags = (org.ccsds.moims.mo.mal.structures.StringList) decoder.decodeNullableElement(new org.ccsds.moims.mo.mal.structures.StringList()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SimpleActivityDetailsList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SimpleActivityDetailsList.java new file mode 100644 index 00000000..a83aa19b --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SimpleActivityDetailsList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for SimpleActivityDetails. + */ +public final class SimpleActivityDetailsList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107607L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107607L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for SimpleActivityDetailsList. + * + */ + public SimpleActivityDetailsList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public SimpleActivityDetailsList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public SimpleActivityDetailsList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.SimpleActivityDetails element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.SimpleActivityDetails element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new SimpleActivityDetailsList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.SimpleActivityDetails(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SimpleEffect.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SimpleEffect.java new file mode 100644 index 00000000..ebc6d63d --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SimpleEffect.java @@ -0,0 +1,238 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E5: A simple effect applies the defined operation on the specified planning + * resource at the time relative to the planning activity defined by (timeRef + * + timeOffset). + */ +public final class SimpleEffect extends org.ccsds.moims.mo.mps.structures.Effect { + + private static final long serialVersionUID = 1407374900330544L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330544L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * The point in the duration of the planning activity to which the time of + * the Effect is relative. 0: the start of the planning activity 1: the + * end of the planning activity. + */ + private org.ccsds.moims.mo.mps.structures.Slider timeRef; + + /** + * Offset from timeRef that specifies the time at which the Effect is to be + * applied. Default is no offset. + */ + private org.ccsds.moims.mo.mal.structures.Element timeOffset; + + /** + * Operation to be performed on the planning resource. One of: SET, INCREASE, + * DECREASE. Increase and decrease are only applicable to numeric data types. + */ + private org.ccsds.moims.mo.mps.structures.EffectOperationEnum operator; + + /** + * The value that the planning resource is to be set to if the Effect operator + * is SET; or to be increased or decreased by if it is INCREASE or DECREASE. + * MAL Attribute type must match the dataType of the Resource definition. + */ + private org.ccsds.moims.mo.mal.structures.Attribute value; + + /** + * Default constructor for SimpleEffect. + * + */ + public SimpleEffect() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param resourceRef Identifies the planning resource that is constrained for the duration of the planning activity. + * @param timeRef The point in the duration of the planning activity to which the time of the Effect is relative. 0: the start of the planning activity 1: the end of the planning activity + * @param timeOffset Offset from timeRef that specifies the time at which the Effect is to be applied. Default is no offset. + * @param operator Operation to be performed on the planning resource. One of: SET, INCREASE, DECREASE. Increase and decrease are only applicable to numeric data types. + * @param value The value that the planning resource is to be set to if the Effect operator is SET; or to be increased or decreased by if it is INCREASE or DECREASE. MAL Attribute type must match the dataType of the Resource definition. + */ + public SimpleEffect(org.ccsds.moims.mo.mal.structures.ObjectRef resourceRef, + org.ccsds.moims.mo.mps.structures.Slider timeRef, + org.ccsds.moims.mo.mal.structures.Element timeOffset, + org.ccsds.moims.mo.mps.structures.EffectOperationEnum operator, + org.ccsds.moims.mo.mal.structures.Attribute value) { + super(resourceRef); + this.timeRef = timeRef; + this.timeOffset = timeOffset; + this.operator = operator; + this.value = value; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param resourceRef Identifies the planning resource that is constrained for the duration of the planning activity. + * @param timeRef The point in the duration of the planning activity to which the time of the Effect is relative. 0: the start of the planning activity 1: the end of the planning activity + * @param operator Operation to be performed on the planning resource. One of: SET, INCREASE, DECREASE. Increase and decrease are only applicable to numeric data types. + * @param value The value that the planning resource is to be set to if the Effect operator is SET; or to be increased or decreased by if it is INCREASE or DECREASE. MAL Attribute type must match the dataType of the Resource definition. + */ + public SimpleEffect(org.ccsds.moims.mo.mal.structures.ObjectRef resourceRef, + org.ccsds.moims.mo.mps.structures.Slider timeRef, + org.ccsds.moims.mo.mps.structures.EffectOperationEnum operator, + org.ccsds.moims.mo.mal.structures.Attribute value) { + super(resourceRef); + this.timeRef = timeRef; + this.timeOffset = null; + this.operator = operator; + this.value = value; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.SimpleEffect(); + } + + /** + * Returns the field timeRef. + * + * @return The field timeRef + */ + public org.ccsds.moims.mo.mps.structures.Slider getTimeRef() { + return timeRef; + } + + /** + * Returns the field timeOffset. + * + * @return The field timeOffset + */ + public org.ccsds.moims.mo.mal.structures.Element getTimeOffset() { + return timeOffset; + } + + /** + * Returns the field operator. + * + * @return The field operator + */ + public org.ccsds.moims.mo.mps.structures.EffectOperationEnum getOperator() { + return operator; + } + + /** + * Returns the field value. + * + * @return The field value + */ + public org.ccsds.moims.mo.mal.structures.Attribute getValue() { + return value; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof SimpleEffect) { + if (! super.equals(obj)) { + return false; + } + SimpleEffect other = (SimpleEffect) obj; + if (timeRef == null) { + if (other.timeRef != null) { + return false; + } + } else { + if (! timeRef.equals(other.timeRef)) { + return false; + } + } + if (timeOffset == null) { + if (other.timeOffset != null) { + return false; + } + } else { + if (! timeOffset.equals(other.timeOffset)) { + return false; + } + } + if (operator == null) { + if (other.operator != null) { + return false; + } + } else { + if (! operator.equals(other.operator)) { + return false; + } + } + if (value == null) { + if (other.value != null) { + return false; + } + } else { + if (! value.equals(other.value)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = super.hashCode(); + hash = 83 * hash + (timeRef != null ? timeRef.hashCode() : 0); + hash = 83 * hash + (timeOffset != null ? timeOffset.hashCode() : 0); + hash = 83 * hash + (operator != null ? operator.hashCode() : 0); + hash = 83 * hash + (value != null ? value.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(SimpleEffect: "); + buf.append(super.toString()); + buf.append(", timeRef=").append(timeRef); + buf.append(", timeOffset=").append(timeOffset); + buf.append(", operator=").append(operator); + buf.append(", value=").append(value); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + super.encode(encoder); + if (timeRef == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'timeRef' cannot be null!"); + } + if (operator == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'operator' cannot be null!"); + } + if (value == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'value' cannot be null!"); + } + encoder.encodeElement(timeRef); + encoder.encodeNullableAbstractElement(timeOffset); + encoder.encodeElement(operator); + encoder.encodeAttribute(value); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + super.decode(decoder); + timeRef = (org.ccsds.moims.mo.mps.structures.Slider) decoder.decodeElement(new org.ccsds.moims.mo.mps.structures.Slider()); + timeOffset = (org.ccsds.moims.mo.mal.structures.Element) decoder.decodeNullableAbstractElement(); + operator = (org.ccsds.moims.mo.mps.structures.EffectOperationEnum) decoder.decodeElement(org.ccsds.moims.mo.mps.structures.EffectOperationEnum.SET); + value = (org.ccsds.moims.mo.mal.structures.Attribute) decoder.decodeAttribute(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SimpleEffectList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SimpleEffectList.java new file mode 100644 index 00000000..8774840c --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SimpleEffectList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for SimpleEffect. + */ +public final class SimpleEffectList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107664L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107664L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for SimpleEffectList. + * + */ + public SimpleEffectList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public SimpleEffectList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public SimpleEffectList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.SimpleEffect element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.SimpleEffect element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new SimpleEffectList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.SimpleEffect(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SimpleResourceConstraint.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SimpleResourceConstraint.java new file mode 100644 index 00000000..61416b78 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SimpleResourceConstraint.java @@ -0,0 +1,138 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E5: The simple resource constraint must be satisfied for the duration of + * the planning activity to which the constraint applies. + */ +public final class SimpleResourceConstraint extends org.ccsds.moims.mo.mps.structures.ResourceConstraint { + + private static final long serialVersionUID = 1407374900330533L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330533L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Value (of same type as the referenced Resource) to be compared against. + * MAL Attribute type must match the dataType of the Resource definition. + */ + private org.ccsds.moims.mo.mal.structures.Attribute value; + + /** + * Default constructor for SimpleResourceConstraint. + * + */ + public SimpleResourceConstraint() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param negate Specifies whether the result of combining the Constraints is to be inverted (NOT function). Default = False. + * @param resourceRef Identifies the planning resource that is constrained for the duration of the planning activity. + * @param comparator Comparison operator, which may be one of: =, !=, _, _=, _, _=, contains, icontains. The contains operator only applies to strings and may be case sensitive or insensitive. + * @param value Value (of same type as the referenced Resource) to be compared against. MAL Attribute type must match the dataType of the Resource definition. + */ + public SimpleResourceConstraint(Boolean negate, + org.ccsds.moims.mo.mal.structures.ObjectRef resourceRef, + org.ccsds.moims.mo.mps.structures.ExpressionOperatorEnum comparator, + org.ccsds.moims.mo.mal.structures.Attribute value) { + super(negate, + resourceRef, + comparator); + this.value = value; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param resourceRef Identifies the planning resource that is constrained for the duration of the planning activity. + * @param comparator Comparison operator, which may be one of: =, !=, _, _=, _, _=, contains, icontains. The contains operator only applies to strings and may be case sensitive or insensitive. + * @param value Value (of same type as the referenced Resource) to be compared against. MAL Attribute type must match the dataType of the Resource definition. + */ + public SimpleResourceConstraint(org.ccsds.moims.mo.mal.structures.ObjectRef resourceRef, + org.ccsds.moims.mo.mps.structures.ExpressionOperatorEnum comparator, + org.ccsds.moims.mo.mal.structures.Attribute value) { + super(resourceRef, + comparator); + this.value = value; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.SimpleResourceConstraint(); + } + + /** + * Returns the field value. + * + * @return The field value + */ + public org.ccsds.moims.mo.mal.structures.Attribute getValue() { + return value; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof SimpleResourceConstraint) { + if (! super.equals(obj)) { + return false; + } + SimpleResourceConstraint other = (SimpleResourceConstraint) obj; + if (value == null) { + if (other.value != null) { + return false; + } + } else { + if (! value.equals(other.value)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = super.hashCode(); + hash = 83 * hash + (value != null ? value.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(SimpleResourceConstraint: "); + buf.append(super.toString()); + buf.append(", value=").append(value); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + super.encode(encoder); + if (value == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'value' cannot be null!"); + } + encoder.encodeAttribute(value); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + super.decode(decoder); + value = (org.ccsds.moims.mo.mal.structures.Attribute) decoder.decodeAttribute(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SimpleResourceConstraintList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SimpleResourceConstraintList.java new file mode 100644 index 00000000..16c73cd3 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SimpleResourceConstraintList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for SimpleResourceConstraint. + */ +public final class SimpleResourceConstraintList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107675L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107675L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for SimpleResourceConstraintList. + * + */ + public SimpleResourceConstraintList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public SimpleResourceConstraintList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public SimpleResourceConstraintList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.SimpleResourceConstraint element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.SimpleResourceConstraint element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new SimpleResourceConstraintList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.SimpleResourceConstraint(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/Slider.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/Slider.java new file mode 100644 index 00000000..0fe28453 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/Slider.java @@ -0,0 +1,110 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E1: Used to indicate a relative position with respect to an MPS object, + * such as a planning activity where 0 represents the start and 1 the end + * of the activity. The slider is a real number that can represent any point + * between these two extremes. + */ +public final class Slider implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1407374900330499L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330499L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Relative point between the start and end of an MPS object, where 0 represents + * the start and 1 represents the end. + */ + private Float position; + + /** + * Default constructor for Slider. + * + */ + public Slider() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param position Relative point between the start and end of an MPS object, where 0 represents the start and 1 represents the end. + */ + public Slider(Float position) { + this.position = position; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.Slider(); + } + + /** + * Returns the field position. + * + * @return The field position + */ + public Float getPosition() { + return position; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Slider) { + Slider other = (Slider) obj; + if (position == null) { + if (other.position != null) { + return false; + } + } else { + if (! position.equals(other.position)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (position != null ? position.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(Slider: "); + buf.append("position=").append(position); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (position == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'position' cannot be null!"); + } + encoder.encodeFloat(position); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + position = decoder.decodeFloat(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SliderList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SliderList.java new file mode 100644 index 00000000..447e3860 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SliderList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for Slider. + */ +public final class SliderList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107709L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107709L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for SliderList. + * + */ + public SliderList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public SliderList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public SliderList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.Slider element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.Slider element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new SliderList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.Slider(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SphericalDirection.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SphericalDirection.java new file mode 100644 index 00000000..5e1098ea --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SphericalDirection.java @@ -0,0 +1,181 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E6: Typically used to define a direction in a secondary frame. When used + * to specify a surface coordinate, this actually represents a {longitude, + * latitude} pair. + */ +public final class SphericalDirection extends org.ccsds.moims.mo.mps.structures.Direction { + + private static final long serialVersionUID = 1407374900330511L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330511L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Angular coordinate. May also represent longitude. + */ + private org.ccsds.moims.mo.mps.structures.Angle azimuth; + + /** + * Angular coordinate. May also represent latitude. + */ + private org.ccsds.moims.mo.mps.structures.Angle elevation; + + /** + * Reference frame within which the direction is expressed. Must be a celestial + * body or spacecraft reference frame (see 4.4.2). + */ + private org.ccsds.moims.mo.mal.structures.Identifier frame; + + /** + * Default constructor for SphericalDirection. + * + */ + public SphericalDirection() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param azimuth Angular coordinate. May also represent longitude. + * @param elevation Angular coordinate. May also represent latitude. + * @param frame Reference frame within which the direction is expressed. Must be a celestial body or spacecraft reference frame (see 4.4.2). + */ + public SphericalDirection(org.ccsds.moims.mo.mps.structures.Angle azimuth, + org.ccsds.moims.mo.mps.structures.Angle elevation, + org.ccsds.moims.mo.mal.structures.Identifier frame) { + this.azimuth = azimuth; + this.elevation = elevation; + this.frame = frame; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.SphericalDirection(); + } + + /** + * Returns the field azimuth. + * + * @return The field azimuth + */ + public org.ccsds.moims.mo.mps.structures.Angle getAzimuth() { + return azimuth; + } + + /** + * Returns the field elevation. + * + * @return The field elevation + */ + public org.ccsds.moims.mo.mps.structures.Angle getElevation() { + return elevation; + } + + /** + * Returns the field frame. + * + * @return The field frame + */ + public org.ccsds.moims.mo.mal.structures.Identifier getFrame() { + return frame; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof SphericalDirection) { + if (! super.equals(obj)) { + return false; + } + SphericalDirection other = (SphericalDirection) obj; + if (azimuth == null) { + if (other.azimuth != null) { + return false; + } + } else { + if (! azimuth.equals(other.azimuth)) { + return false; + } + } + if (elevation == null) { + if (other.elevation != null) { + return false; + } + } else { + if (! elevation.equals(other.elevation)) { + return false; + } + } + if (frame == null) { + if (other.frame != null) { + return false; + } + } else { + if (! frame.equals(other.frame)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = super.hashCode(); + hash = 83 * hash + (azimuth != null ? azimuth.hashCode() : 0); + hash = 83 * hash + (elevation != null ? elevation.hashCode() : 0); + hash = 83 * hash + (frame != null ? frame.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(SphericalDirection: "); + buf.append(super.toString()); + buf.append(", azimuth=").append(azimuth); + buf.append(", elevation=").append(elevation); + buf.append(", frame=").append(frame); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + super.encode(encoder); + if (azimuth == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'azimuth' cannot be null!"); + } + if (elevation == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'elevation' cannot be null!"); + } + if (frame == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'frame' cannot be null!"); + } + encoder.encodeElement(azimuth); + encoder.encodeElement(elevation); + encoder.encodeIdentifier(frame); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + super.decode(decoder); + azimuth = (org.ccsds.moims.mo.mps.structures.Angle) decoder.decodeElement(new org.ccsds.moims.mo.mps.structures.Angle()); + elevation = (org.ccsds.moims.mo.mps.structures.Angle) decoder.decodeElement(new org.ccsds.moims.mo.mps.structures.Angle()); + frame = decoder.decodeIdentifier(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SphericalDirectionList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SphericalDirectionList.java new file mode 100644 index 00000000..d6875fb4 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SphericalDirectionList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for SphericalDirection. + */ +public final class SphericalDirectionList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107697L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107697L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for SphericalDirectionList. + * + */ + public SphericalDirectionList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public SphericalDirectionList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public SphericalDirectionList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.SphericalDirection element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.SphericalDirection element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new SphericalDirectionList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.SphericalDirection(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/StateDef.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/StateDef.java new file mode 100644 index 00000000..cca98d97 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/StateDef.java @@ -0,0 +1,142 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E1: Status values may be represented as enumerated Integers, but the enumeration + * is not defined by the Recommended Standard, but in the context of planning + * configuration data. StateDefs hold the definitions of the text labels + * associated with specific status values. + */ +public final class StateDef implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1407374900330500L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330500L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Enumerated value of the Status. + */ + private Integer value; + + /** + * Text label associated with the enumerated value. + */ + private String state; + + /** + * Default constructor for StateDef. + * + */ + public StateDef() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param value Enumerated value of the Status. + * @param state Text label associated with the enumerated value. + */ + public StateDef(Integer value, + String state) { + this.value = value; + this.state = state; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.StateDef(); + } + + /** + * Returns the field value. + * + * @return The field value + */ + public Integer getValue() { + return value; + } + + /** + * Returns the field state. + * + * @return The field state + */ + public String getState() { + return state; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof StateDef) { + StateDef other = (StateDef) obj; + if (value == null) { + if (other.value != null) { + return false; + } + } else { + if (! value.equals(other.value)) { + return false; + } + } + if (state == null) { + if (other.state != null) { + return false; + } + } else { + if (! state.equals(other.state)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (value != null ? value.hashCode() : 0); + hash = 83 * hash + (state != null ? state.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(StateDef: "); + buf.append("value=").append(value); + buf.append(", state=").append(state); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (value == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'value' cannot be null!"); + } + if (state == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'state' cannot be null!"); + } + encoder.encodeInteger(value); + encoder.encodeString(state); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + value = decoder.decodeInteger(); + state = decoder.decodeString(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/StateDefList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/StateDefList.java new file mode 100644 index 00000000..0a916c21 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/StateDefList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for StateDef. + */ +public final class StateDefList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107708L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107708L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for StateDefList. + * + */ + public StateDefList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public StateDefList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public StateDefList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.StateDef element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.StateDef element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new StateDefList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.StateDef(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/StatusValues.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/StatusValues.java new file mode 100644 index 00000000..5a74e76b --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/StatusValues.java @@ -0,0 +1,115 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E1: Concrete sub-type of ValidationDetails that provides additional fields + * to support data validation and interpretation for integer type arguments + * that are effectively enumerated Statuses. + */ +public final class StatusValues extends org.ccsds.moims.mo.mps.structures.ValidationDetails { + + private static final long serialVersionUID = 1407374900330524L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330524L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Set of allowed State definitions (see 4.6.2.4.2), comprising the enumerated + * value and an associated text label. + */ + private org.ccsds.moims.mo.mps.structures.StateDefList allowedValues; + + /** + * Default constructor for StatusValues. + * + */ + public StatusValues() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param allowedValues Set of allowed State definitions (see 4.6.2.4.2), comprising the enumerated value and an associated text label. + */ + public StatusValues(org.ccsds.moims.mo.mps.structures.StateDefList allowedValues) { + this.allowedValues = allowedValues; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.StatusValues(); + } + + /** + * Returns the field allowedValues. + * + * @return The field allowedValues + */ + public org.ccsds.moims.mo.mps.structures.StateDefList getAllowedValues() { + return allowedValues; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof StatusValues) { + if (! super.equals(obj)) { + return false; + } + StatusValues other = (StatusValues) obj; + if (allowedValues == null) { + if (other.allowedValues != null) { + return false; + } + } else { + if (! allowedValues.equals(other.allowedValues)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = super.hashCode(); + hash = 83 * hash + (allowedValues != null ? allowedValues.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(StatusValues: "); + buf.append(super.toString()); + buf.append(", allowedValues=").append(allowedValues); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + super.encode(encoder); + if (allowedValues == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'allowedValues' cannot be null!"); + } + encoder.encodeElement(allowedValues); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + super.decode(decoder); + allowedValues = (org.ccsds.moims.mo.mps.structures.StateDefList) decoder.decodeElement(new org.ccsds.moims.mo.mps.structures.StateDefList()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/StatusValuesList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/StatusValuesList.java new file mode 100644 index 00000000..537a015e --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/StatusValuesList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for StatusValues. + */ +public final class StatusValuesList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107684L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107684L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for StatusValuesList. + * + */ + public StatusValuesList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public StatusValuesList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public StatusValuesList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.StatusValues element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.StatusValues element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new StatusValuesList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.StatusValues(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/StringPattern.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/StringPattern.java new file mode 100644 index 00000000..e707588c --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/StringPattern.java @@ -0,0 +1,144 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E1: Concrete sub-type of ValidationDetails that provides additional fields + * to support data validation for the string data type. + */ +public final class StringPattern extends org.ccsds.moims.mo.mps.structures.ValidationDetails { + + private static final long serialVersionUID = 1407374900330523L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330523L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Maximum length of the string (characters). If omitted, no maximum length + * is enforced. + */ + private org.ccsds.moims.mo.mal.structures.UInteger maxLength; + + /** + * A ‘regular expression’ or sequence of characters defining a character pattern + * that the string value must match. If omitted, all character sequences + * are permitted. The choice of ‘regular expression’ specification to follow + * is implementation-specific. + */ + private String regex; + + /** + * Default constructor for StringPattern. + * + */ + public StringPattern() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param maxLength Maximum length of the string (characters). If omitted, no maximum length is enforced. + * @param regex A ‘regular expression’ or sequence of characters defining a character pattern that the string value must match. If omitted, all character sequences are permitted. The choice of ‘regular expression’ specification to follow is implementation-specific. + */ + public StringPattern(org.ccsds.moims.mo.mal.structures.UInteger maxLength, + String regex) { + this.maxLength = maxLength; + this.regex = regex; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.StringPattern(); + } + + /** + * Returns the field maxLength. + * + * @return The field maxLength + */ + public org.ccsds.moims.mo.mal.structures.UInteger getMaxLength() { + return maxLength; + } + + /** + * Returns the field regex. + * + * @return The field regex + */ + public String getRegex() { + return regex; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof StringPattern) { + if (! super.equals(obj)) { + return false; + } + StringPattern other = (StringPattern) obj; + if (maxLength == null) { + if (other.maxLength != null) { + return false; + } + } else { + if (! maxLength.equals(other.maxLength)) { + return false; + } + } + if (regex == null) { + if (other.regex != null) { + return false; + } + } else { + if (! regex.equals(other.regex)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = super.hashCode(); + hash = 83 * hash + (maxLength != null ? maxLength.hashCode() : 0); + hash = 83 * hash + (regex != null ? regex.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(StringPattern: "); + buf.append(super.toString()); + buf.append(", maxLength=").append(maxLength); + buf.append(", regex=").append(regex); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + super.encode(encoder); + encoder.encodeNullableUInteger(maxLength); + encoder.encodeNullableString(regex); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + super.decode(decoder); + maxLength = decoder.decodeNullableUInteger(); + regex = decoder.decodeNullableString(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/StringPatternList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/StringPatternList.java new file mode 100644 index 00000000..c6173d42 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/StringPatternList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for StringPattern. + */ +public final class StringPatternList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107685L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107685L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for StringPatternList. + * + */ + public StringPatternList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public StringPatternList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public StringPatternList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.StringPattern element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.StringPattern element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new StringPatternList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.StringPattern(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SubPlanActivationStatus.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SubPlanActivationStatus.java new file mode 100644 index 00000000..5ac0b72a --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SubPlanActivationStatus.java @@ -0,0 +1,175 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E1: SubPlanActivationStatus is a data structure that returns the activation + * status of a sub-plan in the context of the MPS Plan Execution Control service + * activateSubPlan and deactivateSubPlan operations. + */ +public final class SubPlanActivationStatus implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1407374900331009L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900331009L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Identifier of the sub-plan to which the status relates. + */ + private org.ccsds.moims.mo.mal.structures.Identifier plan; + + /** + * Current status of the sub-plan, which may be Activated or Deactivated. + */ + private org.ccsds.moims.mo.mps.structures.SubPlanStatusEnum status; + + /** + * ActivationInfo provides customizable detailed information on the result + * of the activation/deactivation request for the referenced sub-plan. . + */ + private String activationInfo; + + /** + * Default constructor for SubPlanActivationStatus. + * + */ + public SubPlanActivationStatus() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param plan Identifier of the sub-plan to which the status relates. + * @param status Current status of the sub-plan, which may be Activated or Deactivated. + * @param activationInfo ActivationInfo provides customizable detailed information on the result of the activation/deactivation request for the referenced sub-plan. + */ + public SubPlanActivationStatus(org.ccsds.moims.mo.mal.structures.Identifier plan, + org.ccsds.moims.mo.mps.structures.SubPlanStatusEnum status, + String activationInfo) { + this.plan = plan; + this.status = status; + this.activationInfo = activationInfo; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.SubPlanActivationStatus(); + } + + /** + * Returns the field plan. + * + * @return The field plan + */ + public org.ccsds.moims.mo.mal.structures.Identifier getPlan() { + return plan; + } + + /** + * Returns the field status. + * + * @return The field status + */ + public org.ccsds.moims.mo.mps.structures.SubPlanStatusEnum getStatus() { + return status; + } + + /** + * Returns the field activationInfo. + * + * @return The field activationInfo + */ + public String getActivationInfo() { + return activationInfo; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof SubPlanActivationStatus) { + SubPlanActivationStatus other = (SubPlanActivationStatus) obj; + if (plan == null) { + if (other.plan != null) { + return false; + } + } else { + if (! plan.equals(other.plan)) { + return false; + } + } + if (status == null) { + if (other.status != null) { + return false; + } + } else { + if (! status.equals(other.status)) { + return false; + } + } + if (activationInfo == null) { + if (other.activationInfo != null) { + return false; + } + } else { + if (! activationInfo.equals(other.activationInfo)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (plan != null ? plan.hashCode() : 0); + hash = 83 * hash + (status != null ? status.hashCode() : 0); + hash = 83 * hash + (activationInfo != null ? activationInfo.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(SubPlanActivationStatus: "); + buf.append("plan=").append(plan); + buf.append(", status=").append(status); + buf.append(", activationInfo=").append(activationInfo); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (plan == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'plan' cannot be null!"); + } + if (status == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'status' cannot be null!"); + } + if (activationInfo == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'activationInfo' cannot be null!"); + } + encoder.encodeIdentifier(plan); + encoder.encodeElement(status); + encoder.encodeString(activationInfo); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + plan = decoder.decodeIdentifier(); + status = (org.ccsds.moims.mo.mps.structures.SubPlanStatusEnum) decoder.decodeElement(org.ccsds.moims.mo.mps.structures.SubPlanStatusEnum.ACTIVATED); + activationInfo = decoder.decodeString(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SubPlanActivationStatusList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SubPlanActivationStatusList.java new file mode 100644 index 00000000..f4c56403 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SubPlanActivationStatusList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for SubPlanActivationStatus. + */ +public final class SubPlanActivationStatusList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107199L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107199L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for SubPlanActivationStatusList. + * + */ + public SubPlanActivationStatusList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public SubPlanActivationStatusList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public SubPlanActivationStatusList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.SubPlanActivationStatus element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.SubPlanActivationStatus element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new SubPlanActivationStatusList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.SubPlanActivationStatus(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SubPlanStatusEnum.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SubPlanStatusEnum.java new file mode 100644 index 00000000..5a04cd4b --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SubPlanStatusEnum.java @@ -0,0 +1,118 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * Enumeration class for SubPlanStatusEnum. + */ +public final class SubPlanStatusEnum extends org.ccsds.moims.mo.mal.structures.Enumeration { + + private static final long serialVersionUID = 1407374900331008L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900331008L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Enumeration value for ACTIVATED. + */ + public static final int ACTIVATED_VALUE = 1; + + /** + * Enumeration singleton for value ACTIVATED. + */ + public static final org.ccsds.moims.mo.mps.structures.SubPlanStatusEnum ACTIVATED = new org.ccsds.moims.mo.mps.structures.SubPlanStatusEnum(org.ccsds.moims.mo.mps.structures.SubPlanStatusEnum.ACTIVATED_VALUE); + + /** + * Enumeration value for DEACTIVATED. + */ + public static final int DEACTIVATED_VALUE = 2; + + /** + * Enumeration singleton for value DEACTIVATED. + */ + public static final org.ccsds.moims.mo.mps.structures.SubPlanStatusEnum DEACTIVATED = new org.ccsds.moims.mo.mps.structures.SubPlanStatusEnum(org.ccsds.moims.mo.mps.structures.SubPlanStatusEnum.DEACTIVATED_VALUE); + + /** + * Set of enumeration instances. + */ + private static final org.ccsds.moims.mo.mps.structures.SubPlanStatusEnum[] _ENUMERATIONS = { + ACTIVATED, DEACTIVATED}; + + /** + * E1: This enumeration may be used to indicate whether or not a given subplan is active. + */ + public SubPlanStatusEnum() { + super(-1); + } + + /** + * E1: This enumeration may be used to indicate whether or not a given subplan + * is active. + * + * @param value The value of the Enumeration. + */ + public SubPlanStatusEnum(int value) { + super(value); + } + + @Override + public String toString() { + switch (getValue()) { + case ACTIVATED_VALUE: + return "ACTIVATED"; + case DEACTIVATED_VALUE: + return "DEACTIVATED"; + default: + throw new RuntimeException("Unknown ordinal!"); + } + } + + /** + * Returns the enumeration element represented by the supplied string, or + * null if not matched. + * + * @param s s The string to search for. + * @return The matched enumeration element, or null if not matched. + */ + public static org.ccsds.moims.mo.mps.structures.SubPlanStatusEnum fromString(String s) { + switch (s) { + case "ACTIVATED": + return SubPlanStatusEnum.ACTIVATED; + case "DEACTIVATED": + return SubPlanStatusEnum.DEACTIVATED; + default: + throw new RuntimeException("Unknown Enumeration for the provided string: " + s); + } + } + + @Override + public org.ccsds.moims.mo.mal.structures.Enumeration fromValue(Integer value) { + switch (value) { + case ACTIVATED_VALUE: + return SubPlanStatusEnum.ACTIVATED; + case DEACTIVATED_VALUE: + return SubPlanStatusEnum.DEACTIVATED; + default: + throw new RuntimeException("Unknown Enumeration for the provided value: " + value); + } + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return _ENUMERATIONS[0]; + } + + @Override + public int getEnumSize() { + return 2; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SubPlanStatusEnumList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SubPlanStatusEnumList.java new file mode 100644 index 00000000..ab2c7f66 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SubPlanStatusEnumList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for SubPlanStatusEnum. + */ +public final class SubPlanStatusEnumList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107200L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107200L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for SubPlanStatusEnumList. + * + */ + public SubPlanStatusEnumList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public SubPlanStatusEnumList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public SubPlanStatusEnumList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.SubPlanStatusEnum element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.SubPlanStatusEnum element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new SubPlanStatusEnumList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return org.ccsds.moims.mo.mps.structures.SubPlanStatusEnum.ACTIVATED; + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SubPlanUpdate.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SubPlanUpdate.java new file mode 100644 index 00000000..2783cf42 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SubPlanUpdate.java @@ -0,0 +1,179 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E1: SubPlanUpdate is a data structure that is used to report changes in + * status of a sub-plan during plan execution. It is returned in the context + * of the MPS Plan Execution Control service monitorSubPlanExecution and getSubPlanStatus + * operations. Sub-plans are not defined as objects within the MPS model. + * Individual activities within a Plan may be associated with a single sub-plan + * via its Identifier. The plan execution function is responsible for managing + * and reporting sub-plan status associated with relevant Plan Execution Control + * service operations, if supported. + */ +public final class SubPlanUpdate implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1407374900331007L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900331007L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Identifier of the sub-plan to which the update relates. + */ + private org.ccsds.moims.mo.mal.structures.Identifier subPlan; + + /** + * Time of status update. + */ + private org.ccsds.moims.mo.mal.structures.Time timestamp; + + /** + * Current status of the sub-plan, which may be Activated or Deactivated. + */ + private org.ccsds.moims.mo.mps.structures.SubPlanStatusEnum status; + + /** + * Default constructor for SubPlanUpdate. + * + */ + public SubPlanUpdate() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param subPlan Identifier of the sub-plan to which the update relates. + * @param timestamp Time of status update. + * @param status Current status of the sub-plan, which may be Activated or Deactivated. + */ + public SubPlanUpdate(org.ccsds.moims.mo.mal.structures.Identifier subPlan, + org.ccsds.moims.mo.mal.structures.Time timestamp, + org.ccsds.moims.mo.mps.structures.SubPlanStatusEnum status) { + this.subPlan = subPlan; + this.timestamp = timestamp; + this.status = status; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.SubPlanUpdate(); + } + + /** + * Returns the field subPlan. + * + * @return The field subPlan + */ + public org.ccsds.moims.mo.mal.structures.Identifier getSubPlan() { + return subPlan; + } + + /** + * Returns the field timestamp. + * + * @return The field timestamp + */ + public org.ccsds.moims.mo.mal.structures.Time getTimestamp() { + return timestamp; + } + + /** + * Returns the field status. + * + * @return The field status + */ + public org.ccsds.moims.mo.mps.structures.SubPlanStatusEnum getStatus() { + return status; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof SubPlanUpdate) { + SubPlanUpdate other = (SubPlanUpdate) obj; + if (subPlan == null) { + if (other.subPlan != null) { + return false; + } + } else { + if (! subPlan.equals(other.subPlan)) { + return false; + } + } + if (timestamp == null) { + if (other.timestamp != null) { + return false; + } + } else { + if (! timestamp.equals(other.timestamp)) { + return false; + } + } + if (status == null) { + if (other.status != null) { + return false; + } + } else { + if (! status.equals(other.status)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (subPlan != null ? subPlan.hashCode() : 0); + hash = 83 * hash + (timestamp != null ? timestamp.hashCode() : 0); + hash = 83 * hash + (status != null ? status.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(SubPlanUpdate: "); + buf.append("subPlan=").append(subPlan); + buf.append(", timestamp=").append(timestamp); + buf.append(", status=").append(status); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (subPlan == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'subPlan' cannot be null!"); + } + if (timestamp == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'timestamp' cannot be null!"); + } + if (status == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'status' cannot be null!"); + } + encoder.encodeIdentifier(subPlan); + encoder.encodeTime(timestamp); + encoder.encodeElement(status); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + subPlan = decoder.decodeIdentifier(); + timestamp = decoder.decodeTime(); + status = (org.ccsds.moims.mo.mps.structures.SubPlanStatusEnum) decoder.decodeElement(org.ccsds.moims.mo.mps.structures.SubPlanStatusEnum.ACTIVATED); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SubPlanUpdateList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SubPlanUpdateList.java new file mode 100644 index 00000000..cd505ca3 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SubPlanUpdateList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for SubPlanUpdate. + */ +public final class SubPlanUpdateList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107201L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107201L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for SubPlanUpdateList. + * + */ + public SubPlanUpdateList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public SubPlanUpdateList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public SubPlanUpdateList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.SubPlanUpdate element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.SubPlanUpdate element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new SubPlanUpdateList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.SubPlanUpdate(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SurfacePosition.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SurfacePosition.java new file mode 100644 index 00000000..ccf39ebb --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SurfacePosition.java @@ -0,0 +1,292 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E6: A SurfacePosition is typically used to specify a coordinate on the + * surface of a celestial body. Optionally, an altitude above the surface + * may also be specified. The reference ellipsoid used to define the surface + * may be mission specific. + */ +public final class SurfacePosition extends org.ccsds.moims.mo.mps.structures.Position { + + private static final long serialVersionUID = 1407374900330505L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330505L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Angular coordinate. May also represent azimuth. + */ + private Double longitude; + + /** + * Angular coordinate. May also represent elevation. + */ + private Double latitude; + + /** + * Reference frame used to determine the origin and orientation of the reference + * ellipsoid. Must be a celestial body reference frame (see 4.4.2). + */ + private org.ccsds.moims.mo.mal.structures.Identifier frame; + + /** + * The units for the quantity of angle, in which to express the longitude + * and latitude. Default = ‘deg’. + */ + private String units; + + /** + * Altitude above a reference ellipsoid (negative values allowed). Default + * = 0. + */ + private Double altitude; + + /** + * The units for the quantity of altitude. Default = ‘m’. + */ + private String altitudeUnits; + + /** + * Default constructor for SurfacePosition. + * + */ + public SurfacePosition() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param longitude Angular coordinate. May also represent azimuth. + * @param latitude Angular coordinate. May also represent elevation. + * @param frame Reference frame used to determine the origin and orientation of the reference ellipsoid. Must be a celestial body reference frame (see 4.4.2). + * @param units The units for the quantity of angle, in which to express the longitude and latitude. Default = ‘deg’. + * @param altitude Altitude above a reference ellipsoid (negative values allowed). Default = 0. + * @param altitudeUnits The units for the quantity of altitude. Default = ‘m’. + */ + public SurfacePosition(Double longitude, + Double latitude, + org.ccsds.moims.mo.mal.structures.Identifier frame, + String units, + Double altitude, + String altitudeUnits) { + this.longitude = longitude; + this.latitude = latitude; + this.frame = frame; + this.units = units; + this.altitude = altitude; + this.altitudeUnits = altitudeUnits; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param longitude Angular coordinate. May also represent azimuth. + * @param latitude Angular coordinate. May also represent elevation. + * @param frame Reference frame used to determine the origin and orientation of the reference ellipsoid. Must be a celestial body reference frame (see 4.4.2). + */ + public SurfacePosition(Double longitude, + Double latitude, + org.ccsds.moims.mo.mal.structures.Identifier frame) { + this.longitude = longitude; + this.latitude = latitude; + this.frame = frame; + this.units = null; + this.altitude = null; + this.altitudeUnits = null; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.SurfacePosition(); + } + + /** + * Returns the field longitude. + * + * @return The field longitude + */ + public Double getLongitude() { + return longitude; + } + + /** + * Returns the field latitude. + * + * @return The field latitude + */ + public Double getLatitude() { + return latitude; + } + + /** + * Returns the field frame. + * + * @return The field frame + */ + public org.ccsds.moims.mo.mal.structures.Identifier getFrame() { + return frame; + } + + /** + * Returns the field units. + * + * @return The field units + */ + public String getUnits() { + return units; + } + + /** + * Returns the field altitude. + * + * @return The field altitude + */ + public Double getAltitude() { + return altitude; + } + + /** + * Returns the field altitudeUnits. + * + * @return The field altitudeUnits + */ + public String getAltitudeUnits() { + return altitudeUnits; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof SurfacePosition) { + if (! super.equals(obj)) { + return false; + } + SurfacePosition other = (SurfacePosition) obj; + if (longitude == null) { + if (other.longitude != null) { + return false; + } + } else { + if (! longitude.equals(other.longitude)) { + return false; + } + } + if (latitude == null) { + if (other.latitude != null) { + return false; + } + } else { + if (! latitude.equals(other.latitude)) { + return false; + } + } + if (frame == null) { + if (other.frame != null) { + return false; + } + } else { + if (! frame.equals(other.frame)) { + return false; + } + } + if (units == null) { + if (other.units != null) { + return false; + } + } else { + if (! units.equals(other.units)) { + return false; + } + } + if (altitude == null) { + if (other.altitude != null) { + return false; + } + } else { + if (! altitude.equals(other.altitude)) { + return false; + } + } + if (altitudeUnits == null) { + if (other.altitudeUnits != null) { + return false; + } + } else { + if (! altitudeUnits.equals(other.altitudeUnits)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = super.hashCode(); + hash = 83 * hash + (longitude != null ? longitude.hashCode() : 0); + hash = 83 * hash + (latitude != null ? latitude.hashCode() : 0); + hash = 83 * hash + (frame != null ? frame.hashCode() : 0); + hash = 83 * hash + (units != null ? units.hashCode() : 0); + hash = 83 * hash + (altitude != null ? altitude.hashCode() : 0); + hash = 83 * hash + (altitudeUnits != null ? altitudeUnits.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(SurfacePosition: "); + buf.append(super.toString()); + buf.append(", longitude=").append(longitude); + buf.append(", latitude=").append(latitude); + buf.append(", frame=").append(frame); + buf.append(", units=").append(units); + buf.append(", altitude=").append(altitude); + buf.append(", altitudeUnits=").append(altitudeUnits); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + super.encode(encoder); + if (longitude == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'longitude' cannot be null!"); + } + if (latitude == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'latitude' cannot be null!"); + } + if (frame == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'frame' cannot be null!"); + } + encoder.encodeDouble(longitude); + encoder.encodeDouble(latitude); + encoder.encodeIdentifier(frame); + encoder.encodeNullableString(units); + encoder.encodeNullableDouble(altitude); + encoder.encodeNullableString(altitudeUnits); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + super.decode(decoder); + longitude = decoder.decodeDouble(); + latitude = decoder.decodeDouble(); + frame = decoder.decodeIdentifier(); + units = decoder.decodeNullableString(); + altitude = decoder.decodeNullableDouble(); + altitudeUnits = decoder.decodeNullableString(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SurfacePositionList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SurfacePositionList.java new file mode 100644 index 00000000..18c576b2 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/SurfacePositionList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for SurfacePosition. + */ +public final class SurfacePositionList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107703L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107703L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for SurfacePositionList. + * + */ + public SurfacePositionList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public SurfacePositionList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public SurfacePositionList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.SurfacePosition element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.SurfacePosition element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new SurfacePositionList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.SurfacePosition(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/TemporalRepetition.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/TemporalRepetition.java new file mode 100644 index 00000000..d0ca3d9b --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/TemporalRepetition.java @@ -0,0 +1,206 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E1: A sub-type of Repetition based on time. + */ +public final class TemporalRepetition extends org.ccsds.moims.mo.mps.structures.Repetition { + + private static final long serialVersionUID = 1407374900330557L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330557L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Nominal time of first occurrence. + */ + private org.ccsds.moims.mo.mal.structures.Element initialTime; + + /** + * The required time interval between occurrences. + */ + private org.ccsds.moims.mo.mal.structures.Element separation; + + /** + * The allowed tolerance (+/-) in the required time between occurrences, the + * interpretation of which is dependent on the separationType. + */ + private org.ccsds.moims.mo.mal.structures.Element tolerance; + + /** + * Default constructor for TemporalRepetition. + * + */ + public TemporalRepetition() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param count Maximum number of repeat cycles/instances. If not specified there is no limit to the number of repetitions. + * @param timeWindow Time period over which the repetition is applicable. If not specified repetition continues indefinitely. + * @param separationType Specifies whether the repetition interval is Relative to the previous occurrence, or Absolute for all occurrences. + * @param initialTime Nominal time of first occurrence. + * @param separation The required time interval between occurrences. + * @param tolerance The allowed tolerance (+/-) in the required time between occurrences, the interpretation of which is dependent on the separationType. + */ + public TemporalRepetition(Integer count, + org.ccsds.moims.mo.mps.structures.TimeWindow timeWindow, + org.ccsds.moims.mo.mps.structures.SeparationTypeEnum separationType, + org.ccsds.moims.mo.mal.structures.Element initialTime, + org.ccsds.moims.mo.mal.structures.Element separation, + org.ccsds.moims.mo.mal.structures.Element tolerance) { + super(count, + timeWindow, + separationType); + this.initialTime = initialTime; + this.separation = separation; + this.tolerance = tolerance; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param separationType Specifies whether the repetition interval is Relative to the previous occurrence, or Absolute for all occurrences. + * @param initialTime Nominal time of first occurrence. + * @param separation The required time interval between occurrences. + * @param tolerance The allowed tolerance (+/-) in the required time between occurrences, the interpretation of which is dependent on the separationType. + */ + public TemporalRepetition(org.ccsds.moims.mo.mps.structures.SeparationTypeEnum separationType, + org.ccsds.moims.mo.mal.structures.Element initialTime, + org.ccsds.moims.mo.mal.structures.Element separation, + org.ccsds.moims.mo.mal.structures.Element tolerance) { + super(separationType); + this.initialTime = initialTime; + this.separation = separation; + this.tolerance = tolerance; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.TemporalRepetition(); + } + + /** + * Returns the field initialTime. + * + * @return The field initialTime + */ + public org.ccsds.moims.mo.mal.structures.Element getInitialTime() { + return initialTime; + } + + /** + * Returns the field separation. + * + * @return The field separation + */ + public org.ccsds.moims.mo.mal.structures.Element getSeparation() { + return separation; + } + + /** + * Returns the field tolerance. + * + * @return The field tolerance + */ + public org.ccsds.moims.mo.mal.structures.Element getTolerance() { + return tolerance; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof TemporalRepetition) { + if (! super.equals(obj)) { + return false; + } + TemporalRepetition other = (TemporalRepetition) obj; + if (initialTime == null) { + if (other.initialTime != null) { + return false; + } + } else { + if (! initialTime.equals(other.initialTime)) { + return false; + } + } + if (separation == null) { + if (other.separation != null) { + return false; + } + } else { + if (! separation.equals(other.separation)) { + return false; + } + } + if (tolerance == null) { + if (other.tolerance != null) { + return false; + } + } else { + if (! tolerance.equals(other.tolerance)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = super.hashCode(); + hash = 83 * hash + (initialTime != null ? initialTime.hashCode() : 0); + hash = 83 * hash + (separation != null ? separation.hashCode() : 0); + hash = 83 * hash + (tolerance != null ? tolerance.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(TemporalRepetition: "); + buf.append(super.toString()); + buf.append(", initialTime=").append(initialTime); + buf.append(", separation=").append(separation); + buf.append(", tolerance=").append(tolerance); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + super.encode(encoder); + if (initialTime == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'initialTime' cannot be null!"); + } + if (separation == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'separation' cannot be null!"); + } + if (tolerance == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'tolerance' cannot be null!"); + } + encoder.encodeAbstractElement(initialTime); + encoder.encodeAbstractElement(separation); + encoder.encodeAbstractElement(tolerance); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + super.decode(decoder); + initialTime = (org.ccsds.moims.mo.mal.structures.Element) decoder.decodeAbstractElement(); + separation = (org.ccsds.moims.mo.mal.structures.Element) decoder.decodeAbstractElement(); + tolerance = (org.ccsds.moims.mo.mal.structures.Element) decoder.decodeAbstractElement(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/TemporalRepetitionList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/TemporalRepetitionList.java new file mode 100644 index 00000000..22acb285 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/TemporalRepetitionList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for TemporalRepetition. + */ +public final class TemporalRepetitionList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107651L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107651L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for TemporalRepetitionList. + * + */ + public TemporalRepetitionList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public TemporalRepetitionList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public TemporalRepetitionList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.TemporalRepetition element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.TemporalRepetition element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new TemporalRepetitionList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.TemporalRepetition(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/TimeConstraint.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/TimeConstraint.java new file mode 100644 index 00000000..3c91d8d5 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/TimeConstraint.java @@ -0,0 +1,161 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E2: The time at which a planning activity must be planned. + */ +public final class TimeConstraint extends org.ccsds.moims.mo.mps.structures.Constraint { + + private static final long serialVersionUID = 1407374900330528L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330528L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * The time at which the planning activity must be planned. + */ + private org.ccsds.moims.mo.mal.structures.Element time; + + /** + * The point in the duration of the planning activity that is time constrained. + * 0: the start of the planning activity. 1: the end of the planning activity. + */ + private org.ccsds.moims.mo.mps.structures.Slider timeRef; + + /** + * Default constructor for TimeConstraint. + * + */ + public TimeConstraint() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param negate Specifies whether the result of combining the Constraints is to be inverted (NOT function). Default = False. + * @param time The time at which the planning activity must be planned. + * @param timeRef The point in the duration of the planning activity that is time constrained. 0: the start of the planning activity. 1: the end of the planning activity. + */ + public TimeConstraint(Boolean negate, + org.ccsds.moims.mo.mal.structures.Element time, + org.ccsds.moims.mo.mps.structures.Slider timeRef) { + super(negate); + this.time = time; + this.timeRef = timeRef; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param time The time at which the planning activity must be planned. + * @param timeRef The point in the duration of the planning activity that is time constrained. 0: the start of the planning activity. 1: the end of the planning activity. + */ + public TimeConstraint(org.ccsds.moims.mo.mal.structures.Element time, + org.ccsds.moims.mo.mps.structures.Slider timeRef) { + this.time = time; + this.timeRef = timeRef; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.TimeConstraint(); + } + + /** + * Returns the field time. + * + * @return The field time + */ + public org.ccsds.moims.mo.mal.structures.Element getTime() { + return time; + } + + /** + * Returns the field timeRef. + * + * @return The field timeRef + */ + public org.ccsds.moims.mo.mps.structures.Slider getTimeRef() { + return timeRef; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof TimeConstraint) { + if (! super.equals(obj)) { + return false; + } + TimeConstraint other = (TimeConstraint) obj; + if (time == null) { + if (other.time != null) { + return false; + } + } else { + if (! time.equals(other.time)) { + return false; + } + } + if (timeRef == null) { + if (other.timeRef != null) { + return false; + } + } else { + if (! timeRef.equals(other.timeRef)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = super.hashCode(); + hash = 83 * hash + (time != null ? time.hashCode() : 0); + hash = 83 * hash + (timeRef != null ? timeRef.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(TimeConstraint: "); + buf.append(super.toString()); + buf.append(", time=").append(time); + buf.append(", timeRef=").append(timeRef); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + super.encode(encoder); + if (time == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'time' cannot be null!"); + } + if (timeRef == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'timeRef' cannot be null!"); + } + encoder.encodeAbstractElement(time); + encoder.encodeElement(timeRef); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + super.decode(decoder); + time = (org.ccsds.moims.mo.mal.structures.Element) decoder.decodeAbstractElement(); + timeRef = (org.ccsds.moims.mo.mps.structures.Slider) decoder.decodeElement(new org.ccsds.moims.mo.mps.structures.Slider()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/TimeConstraintList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/TimeConstraintList.java new file mode 100644 index 00000000..f1efe9db --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/TimeConstraintList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for TimeConstraint. + */ +public final class TimeConstraintList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107680L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107680L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for TimeConstraintList. + * + */ + public TimeConstraintList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public TimeConstraintList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public TimeConstraintList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.TimeConstraint element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.TimeConstraint element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new TimeConstraintList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.TimeConstraint(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/TimeTrigger.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/TimeTrigger.java new file mode 100644 index 00000000..ab86a2ff --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/TimeTrigger.java @@ -0,0 +1,118 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E1: Sub-type of Trigger based on time. The trigger time is the specified + * constraint, and will usually match the predicted time on the base class + * during the planning process, but the actual time could still be slightly + * different post-execution. + */ +public final class TimeTrigger extends org.ccsds.moims.mo.mps.structures.Trigger { + + private static final long serialVersionUID = 1407374900330547L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330547L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Planned time of Trigger. + */ + private org.ccsds.moims.mo.mal.structures.Time triggerTime; + + /** + * Default constructor for TimeTrigger. + * + */ + public TimeTrigger() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param time Predicted or actual time of Trigger. The predicted time may evolve during the planning process up to the time of execution. The actual time is only available post execution, and hence can only be provided by a plan execution function. + * @param triggerTime Planned time of Trigger. + */ + public TimeTrigger(org.ccsds.moims.mo.mal.structures.Time time, + org.ccsds.moims.mo.mal.structures.Time triggerTime) { + super(time); + this.triggerTime = triggerTime; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.TimeTrigger(); + } + + /** + * Returns the field triggerTime. + * + * @return The field triggerTime + */ + public org.ccsds.moims.mo.mal.structures.Time getTriggerTime() { + return triggerTime; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof TimeTrigger) { + if (! super.equals(obj)) { + return false; + } + TimeTrigger other = (TimeTrigger) obj; + if (triggerTime == null) { + if (other.triggerTime != null) { + return false; + } + } else { + if (! triggerTime.equals(other.triggerTime)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = super.hashCode(); + hash = 83 * hash + (triggerTime != null ? triggerTime.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(TimeTrigger: "); + buf.append(super.toString()); + buf.append(", triggerTime=").append(triggerTime); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + super.encode(encoder); + if (triggerTime == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'triggerTime' cannot be null!"); + } + encoder.encodeTime(triggerTime); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + super.decode(decoder); + triggerTime = decoder.decodeTime(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/TimeTriggerList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/TimeTriggerList.java new file mode 100644 index 00000000..93a145d7 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/TimeTriggerList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for TimeTrigger. + */ +public final class TimeTriggerList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107661L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107661L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for TimeTriggerList. + * + */ + public TimeTriggerList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public TimeTriggerList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public TimeTriggerList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.TimeTrigger element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.TimeTrigger element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new TimeTriggerList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.TimeTrigger(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/TimeWindow.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/TimeWindow.java new file mode 100644 index 00000000..dab96046 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/TimeWindow.java @@ -0,0 +1,141 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E1: Represents a specific period of time, specified as two Expressions + * of type Time defining the start and end of the TimeWindow. + */ +public final class TimeWindow implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 1407374900330501L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330501L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Start time of the time window. + */ + private org.ccsds.moims.mo.mal.structures.Element start; + + /** + * End time of the time window. Shall not be earlier in time than the start + * of the time window. + */ + private org.ccsds.moims.mo.mal.structures.Element end; + + /** + * Default constructor for TimeWindow. + * + */ + public TimeWindow() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param start Start time of the time window. + * @param end End time of the time window. Shall not be earlier in time than the start of the time window. + */ + public TimeWindow(org.ccsds.moims.mo.mal.structures.Element start, + org.ccsds.moims.mo.mal.structures.Element end) { + this.start = start; + this.end = end; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.TimeWindow(); + } + + /** + * Returns the field start. + * + * @return The field start + */ + public org.ccsds.moims.mo.mal.structures.Element getStart() { + return start; + } + + /** + * Returns the field end. + * + * @return The field end + */ + public org.ccsds.moims.mo.mal.structures.Element getEnd() { + return end; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof TimeWindow) { + TimeWindow other = (TimeWindow) obj; + if (start == null) { + if (other.start != null) { + return false; + } + } else { + if (! start.equals(other.start)) { + return false; + } + } + if (end == null) { + if (other.end != null) { + return false; + } + } else { + if (! end.equals(other.end)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (start != null ? start.hashCode() : 0); + hash = 83 * hash + (end != null ? end.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(TimeWindow: "); + buf.append("start=").append(start); + buf.append(", end=").append(end); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (start == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'start' cannot be null!"); + } + if (end == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'end' cannot be null!"); + } + encoder.encodeAbstractElement(start); + encoder.encodeAbstractElement(end); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + start = (org.ccsds.moims.mo.mal.structures.Element) decoder.decodeAbstractElement(); + end = (org.ccsds.moims.mo.mal.structures.Element) decoder.decodeAbstractElement(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/TimeWindowConstraint.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/TimeWindowConstraint.java new file mode 100644 index 00000000..9fe7f5eb --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/TimeWindowConstraint.java @@ -0,0 +1,193 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E2: A time window within which the planning activity is to be planned. + */ +public final class TimeWindowConstraint extends org.ccsds.moims.mo.mps.structures.Constraint { + + private static final long serialVersionUID = 1407374900330529L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374900330529L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * The point in the duration of the activity that is constrained to be after + * the start time of the time window. Although typically the start of the + * activity (0), this can be any point up to the end of the activity (1). + * Default is the start of the planning activity. + */ + private org.ccsds.moims.mo.mps.structures.Slider startRef; + + /** + * The point in the duration of the activity that is constrained to be before + * the end time of the time window. Although typically the end of the activity + * (1), this can be any point up to the start of the activity (0). Default + * is the end of the planning activity. + */ + private org.ccsds.moims.mo.mps.structures.Slider endRef; + + /** + * The [set of] TimeWindows within which the activity must be placed on the + * Plan. + */ + private org.ccsds.moims.mo.mps.structures.TimeWindowList timeWindows; + + /** + * Default constructor for TimeWindowConstraint. + * + */ + public TimeWindowConstraint() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param negate Specifies whether the result of combining the Constraints is to be inverted (NOT function). Default = False. + * @param startRef The point in the duration of the activity that is constrained to be after the start time of the time window. Although typically the start of the activity (0), this can be any point up to the end of the activity (1). Default is the start of the planning activity. + * @param endRef The point in the duration of the activity that is constrained to be before the end time of the time window. Although typically the end of the activity (1), this can be any point up to the start of the activity (0). Default is the end of the planning activity. + * @param timeWindows The [set of] TimeWindows within which the activity must be placed on the Plan. + */ + public TimeWindowConstraint(Boolean negate, + org.ccsds.moims.mo.mps.structures.Slider startRef, + org.ccsds.moims.mo.mps.structures.Slider endRef, + org.ccsds.moims.mo.mps.structures.TimeWindowList timeWindows) { + super(negate); + this.startRef = startRef; + this.endRef = endRef; + this.timeWindows = timeWindows; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param timeWindows The [set of] TimeWindows within which the activity must be placed on the Plan. + */ + public TimeWindowConstraint(org.ccsds.moims.mo.mps.structures.TimeWindowList timeWindows) { + this.startRef = null; + this.endRef = null; + this.timeWindows = timeWindows; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mps.structures.TimeWindowConstraint(); + } + + /** + * Returns the field startRef. + * + * @return The field startRef + */ + public org.ccsds.moims.mo.mps.structures.Slider getStartRef() { + return startRef; + } + + /** + * Returns the field endRef. + * + * @return The field endRef + */ + public org.ccsds.moims.mo.mps.structures.Slider getEndRef() { + return endRef; + } + + /** + * Returns the field timeWindows. + * + * @return The field timeWindows + */ + public org.ccsds.moims.mo.mps.structures.TimeWindowList getTimeWindows() { + return timeWindows; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof TimeWindowConstraint) { + if (! super.equals(obj)) { + return false; + } + TimeWindowConstraint other = (TimeWindowConstraint) obj; + if (startRef == null) { + if (other.startRef != null) { + return false; + } + } else { + if (! startRef.equals(other.startRef)) { + return false; + } + } + if (endRef == null) { + if (other.endRef != null) { + return false; + } + } else { + if (! endRef.equals(other.endRef)) { + return false; + } + } + if (timeWindows == null) { + if (other.timeWindows != null) { + return false; + } + } else { + if (! timeWindows.equals(other.timeWindows)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = super.hashCode(); + hash = 83 * hash + (startRef != null ? startRef.hashCode() : 0); + hash = 83 * hash + (endRef != null ? endRef.hashCode() : 0); + hash = 83 * hash + (timeWindows != null ? timeWindows.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(TimeWindowConstraint: "); + buf.append(super.toString()); + buf.append(", startRef=").append(startRef); + buf.append(", endRef=").append(endRef); + buf.append(", timeWindows=").append(timeWindows); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + super.encode(encoder); + if (timeWindows == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'timeWindows' cannot be null!"); + } + encoder.encodeNullableElement(startRef); + encoder.encodeNullableElement(endRef); + encoder.encodeElement(timeWindows); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + super.decode(decoder); + startRef = (org.ccsds.moims.mo.mps.structures.Slider) decoder.decodeNullableElement(new org.ccsds.moims.mo.mps.structures.Slider()); + endRef = (org.ccsds.moims.mo.mps.structures.Slider) decoder.decodeNullableElement(new org.ccsds.moims.mo.mps.structures.Slider()); + timeWindows = (org.ccsds.moims.mo.mps.structures.TimeWindowList) decoder.decodeElement(new org.ccsds.moims.mo.mps.structures.TimeWindowList()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/TimeWindowConstraintList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/TimeWindowConstraintList.java new file mode 100644 index 00000000..90bb8cfd --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/TimeWindowConstraintList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for TimeWindowConstraint. + */ +public final class TimeWindowConstraintList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107679L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107679L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for TimeWindowConstraintList. + * + */ + public TimeWindowConstraintList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public TimeWindowConstraintList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public TimeWindowConstraintList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.TimeWindowConstraint element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.TimeWindowConstraint element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new TimeWindowConstraintList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.TimeWindowConstraint(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/TimeWindowList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/TimeWindowList.java new file mode 100644 index 00000000..b8fba546 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/TimeWindowList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for TimeWindow. + */ +public final class TimeWindowList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 1407374917107707L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 1407374917107707L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for TimeWindowList. + * + */ + public TimeWindowList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public TimeWindowList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public TimeWindowList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mps.structures.TimeWindow element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mps.structures.TimeWindow element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new TimeWindowList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mps.structures.TimeWindow(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/Trigger.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/Trigger.java new file mode 100644 index 00000000..d5603633 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/Trigger.java @@ -0,0 +1,91 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E1: All sub-classes of Trigger include the time at which they are predicted + * to occur (in advance of execution); and, where applicable, the time at + * which they actually occurred (post execution). + */ +public abstract class Trigger implements org.ccsds.moims.mo.mal.structures.Composite { + + /** + * Predicted or actual time of Trigger. The predicted time may evolve during + * the planning process up to the time of execution. The actual time is only + * available post execution, and hence can only be provided by a plan execution + * function. + */ + private org.ccsds.moims.mo.mal.structures.Time time; + + /** + * Default constructor for Trigger. + * + */ + public Trigger() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param time Predicted or actual time of Trigger. The predicted time may evolve during the planning process up to the time of execution. The actual time is only available post execution, and hence can only be provided by a plan execution function. + */ + public Trigger(org.ccsds.moims.mo.mal.structures.Time time) { + this.time = time; + } + + /** + * Returns the field time. + * + * @return The field time + */ + public org.ccsds.moims.mo.mal.structures.Time getTime() { + return time; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Trigger) { + Trigger other = (Trigger) obj; + if (time == null) { + if (other.time != null) { + return false; + } + } else { + if (! time.equals(other.time)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (time != null ? time.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(Trigger: "); + buf.append("time=").append(time); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (time == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'time' cannot be null!"); + } + encoder.encodeTime(time); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + time = decoder.decodeTime(); + return this; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/TriggerList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/TriggerList.java new file mode 100644 index 00000000..0ef49789 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/TriggerList.java @@ -0,0 +1,23 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for Trigger. + */ +public final class TriggerList extends org.ccsds.moims.mo.mal.structures.HeterogeneousList { + + /** + * Default constructor for TriggerList. + * + */ + public TriggerList() { + } + + @Override + public boolean add(org.ccsds.moims.mo.mal.structures.Element element) { + if (element != null && !(element instanceof Trigger)) { + throw new java.lang.ClassCastException("The added element does not extend the type: Trigger"); + } + return super.add(element); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ValidationDetails.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ValidationDetails.java new file mode 100644 index 00000000..a8407dc3 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ValidationDetails.java @@ -0,0 +1,47 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * E1: Abstract type that is used to represent an allowed range of values + * for a given Argument or Resource. + */ +public abstract class ValidationDetails implements org.ccsds.moims.mo.mal.structures.Composite { + + /** + * Default constructor for ValidationDetails. + * + */ + public ValidationDetails() { + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ValidationDetails) { + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(ValidationDetails: "); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + return this; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ValidationDetailsList.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ValidationDetailsList.java new file mode 100644 index 00000000..dc25a7c6 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/ValidationDetailsList.java @@ -0,0 +1,23 @@ +package org.ccsds.moims.mo.mps.structures; + +/** + * List class for ValidationDetails. + */ +public final class ValidationDetailsList extends org.ccsds.moims.mo.mal.structures.HeterogeneousList { + + /** + * Default constructor for ValidationDetailsList. + * + */ + public ValidationDetailsList() { + } + + @Override + public boolean add(org.ccsds.moims.mo.mal.structures.Element element) { + if (element != null && !(element instanceof ValidationDetails)) { + throw new java.lang.ClassCastException("The added element does not extend the type: ValidationDetails"); + } + return super.add(element); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/package-info.java new file mode 100644 index 00000000..56e77ca8 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area005-v001-mps/org/ccsds/moims/mo/mps/structures/package-info.java @@ -0,0 +1,4 @@ +/** + * Package containing types defined in the MPS area. +*/ +package org.ccsds.moims.mo.mps.structures; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/DeliveryFailedException.java b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/DeliveryFailedException.java new file mode 100644 index 00000000..5150cbb6 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/DeliveryFailedException.java @@ -0,0 +1,28 @@ +package org.ccsds.moims.mo.mpd; + +/** + * The DeliveryFailedException exception. An attempt to deliver a product + * file to the nominated address failed. + */ +public final class DeliveryFailedException extends org.ccsds.moims.mo.mal.MOErrorException { + + private static final String MO_ERROR_NAME = "Delivery Failed"; + + /** + * Constructs a new DeliveryFailedException exception. + * + */ + public DeliveryFailedException() { + super(MO_ERROR_NAME, MPDHelper.DELIVERY_FAILED_ERROR_NUMBER, ""); + } + + /** + * Constructs a new DeliveryFailedException exception. + * + * @param extraInformation The extraInformation of the exception. + */ + public DeliveryFailedException(Object extraInformation) { + super(MO_ERROR_NAME, MPDHelper.DELIVERY_FAILED_ERROR_NUMBER, extraInformation); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/InvalidException.java b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/InvalidException.java new file mode 100644 index 00000000..e3c0f04b --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/InvalidException.java @@ -0,0 +1,28 @@ +package org.ccsds.moims.mo.mpd; + +/** + * The InvalidException exception. A field in the message contains an invalid + * value. If there are multiple errors, the first invalid field is reported. + */ +public final class InvalidException extends org.ccsds.moims.mo.mal.MOErrorException { + + private static final String MO_ERROR_NAME = "Invalid"; + + /** + * Constructs a new InvalidException exception. + * + */ + public InvalidException() { + super(MO_ERROR_NAME, MPDHelper.INVALID_ERROR_NUMBER, ""); + } + + /** + * Constructs a new InvalidException exception. + * + * @param extraInformation The extraInformation of the exception. + */ + public InvalidException(Object extraInformation) { + super(MO_ERROR_NAME, MPDHelper.INVALID_ERROR_NUMBER, extraInformation); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/MPDElementFactory.java b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/MPDElementFactory.java new file mode 100644 index 00000000..81184aee --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/MPDElementFactory.java @@ -0,0 +1,55 @@ +package org.ccsds.moims.mo.mpd; + +/** + * Creates the Elements of the MPD area, without holding an instance of each + * of them, so that the class of a type is only loaded once a message carries + * that type. + */ +public final class MPDElementFactory implements org.ccsds.moims.mo.mal.AreaElementFactory { + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement(int serviceNumber, + int typeNumber) { + if (serviceNumber != 0) { + return null; // This Area declares no types under a service + } + switch (typeNumber) { + case -12: return new org.ccsds.moims.mo.mpd.structures.DeliveryMethodEnumList(); + case -11: return new org.ccsds.moims.mo.mpd.structures.StringPatternList(); + case -10: return new org.ccsds.moims.mo.mpd.structures.ValueSetList(); + case -9: return new org.ccsds.moims.mo.mpd.structures.ValueRangeList(); + case -8: return new org.ccsds.moims.mo.mpd.structures.AttributeDefList(); + case -7: return new org.ccsds.moims.mo.mpd.structures.TimeWindowList(); + case -6: return new org.ccsds.moims.mo.mpd.structures.ProductFilterList(); + case -5: return new org.ccsds.moims.mo.mpd.structures.FileMetadataList(); + case -4: return new org.ccsds.moims.mo.mpd.structures.ProductMetadataList(); + case -3: return new org.ccsds.moims.mo.mpd.structures.StandingOrderList(); + case -2: return new org.ccsds.moims.mo.mpd.structures.ProductTypeList(); + case -1: return new org.ccsds.moims.mo.mpd.structures.ProductList(); + case 1: return new org.ccsds.moims.mo.mpd.structures.Product(); + case 2: return new org.ccsds.moims.mo.mpd.structures.ProductType(); + case 3: return new org.ccsds.moims.mo.mpd.structures.StandingOrder(); + case 4: return new org.ccsds.moims.mo.mpd.structures.ProductMetadata(); + case 5: return new org.ccsds.moims.mo.mpd.structures.FileMetadata(); + case 6: return new org.ccsds.moims.mo.mpd.structures.ProductFilter(); + case 7: return new org.ccsds.moims.mo.mpd.structures.TimeWindow(); + case 8: return new org.ccsds.moims.mo.mpd.structures.AttributeDef(); + case 9: return new org.ccsds.moims.mo.mpd.structures.ValueRange(); + case 10: return new org.ccsds.moims.mo.mpd.structures.ValueSet(); + case 11: return new org.ccsds.moims.mo.mpd.structures.StringPattern(); + case 12: return new org.ccsds.moims.mo.mpd.structures.DeliveryMethodEnum(); + default: return null; + } + } + + @Override + public int getAreaNumber() { + return 9; + } + + @Override + public int getAreaVersion() { + return 1; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/MPDHelper.java b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/MPDHelper.java new file mode 100644 index 00000000..5edc8500 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/MPDHelper.java @@ -0,0 +1,105 @@ +package org.ccsds.moims.mo.mpd; + +/** + * Helper class for MPD area. + */ +public class MPDHelper { + + /** + * Area number literal. + */ + public static final int _MPD_AREA_NUMBER = 9; + + /** + * Area number instance. + */ + public static final org.ccsds.moims.mo.mal.structures.UShort MPD_AREA_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_MPD_AREA_NUMBER); + + /** + * Area name constant. + */ + public static final org.ccsds.moims.mo.mal.structures.Identifier MPD_AREA_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("MPD"); + + /** + * Area version literal. + */ + public static final short _MPD_AREA_VERSION = 1; + + /** + * Area version instance. + */ + public static final org.ccsds.moims.mo.mal.structures.UOctet MPD_AREA_VERSION = new org.ccsds.moims.mo.mal.structures.UOctet(_MPD_AREA_VERSION); + + /** + * Area Elements. + */ + public static final org.ccsds.moims.mo.mal.structures.Element[] MPD_AREA_ELEMENTS = {}; + + /** + * Services in this Area. + */ + public static final org.ccsds.moims.mo.mal.ServiceInfo[] MPD_AREA_SERVICES = { + org.ccsds.moims.mo.mpd.productretrieval.ProductRetrievalHelper.PRODUCTRETRIEVAL_SERVICE, + org.ccsds.moims.mo.mpd.ordermanagement.OrderManagementHelper.ORDERMANAGEMENT_SERVICE, + org.ccsds.moims.mo.mpd.productorderdelivery.ProductOrderDeliveryHelper.PRODUCTORDERDELIVERY_SERVICE,}; + + /** + * Area singleton instance. + */ + public static final org.ccsds.moims.mo.mal.MALArea MPD_AREA = new org.ccsds.moims.mo.mal.MALArea(MPD_AREA_NUMBER, MPD_AREA_NAME, MPD_AREA_VERSION, MPD_AREA_ELEMENTS, MPD_AREA_SERVICES, new MPDElementFactory()); + + /** + * Error literal for error INVALID. + */ + public static final long _INVALID_ERROR_NUMBER = 1; + + /** + * Error instance for error INVALID. + */ + public static final org.ccsds.moims.mo.mal.structures.UInteger INVALID_ERROR_NUMBER = new org.ccsds.moims.mo.mal.structures.UInteger(_INVALID_ERROR_NUMBER); + + /** + * Error literal for error DELIVERY_FAILED. + */ + public static final long _DELIVERY_FAILED_ERROR_NUMBER = 2; + + /** + * Error instance for error DELIVERY_FAILED. + */ + public static final org.ccsds.moims.mo.mal.structures.UInteger DELIVERY_FAILED_ERROR_NUMBER = new org.ccsds.moims.mo.mal.structures.UInteger(_DELIVERY_FAILED_ERROR_NUMBER); + + /** + * Error literal for error ORDER_FAILED. + */ + public static final long _ORDER_FAILED_ERROR_NUMBER = 3; + + /** + * Error instance for error ORDER_FAILED. + */ + public static final org.ccsds.moims.mo.mal.structures.UInteger ORDER_FAILED_ERROR_NUMBER = new org.ccsds.moims.mo.mal.structures.UInteger(_ORDER_FAILED_ERROR_NUMBER); + + /** + * Error literal for error UNKNOWN. + */ + public static final long _UNKNOWN_ERROR_NUMBER = 4; + + /** + * Error instance for error UNKNOWN. + */ + public static final org.ccsds.moims.mo.mal.structures.UInteger UNKNOWN_ERROR_NUMBER = new org.ccsds.moims.mo.mal.structures.UInteger(_UNKNOWN_ERROR_NUMBER); + + /** + * Error literal for error TOO_MANY. + */ + public static final long _TOO_MANY_ERROR_NUMBER = 5; + + /** + * Error instance for error TOO_MANY. + */ + public static final org.ccsds.moims.mo.mal.structures.UInteger TOO_MANY_ERROR_NUMBER = new org.ccsds.moims.mo.mal.structures.UInteger(_TOO_MANY_ERROR_NUMBER); + + private MPDHelper() { + // Utility class; not meant to be instantiated. + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/OrderFailedException.java b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/OrderFailedException.java new file mode 100644 index 00000000..336e6f22 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/OrderFailedException.java @@ -0,0 +1,27 @@ +package org.ccsds.moims.mo.mpd; + +/** + * The OrderFailedException exception. Creation of a new product order failed. + */ +public final class OrderFailedException extends org.ccsds.moims.mo.mal.MOErrorException { + + private static final String MO_ERROR_NAME = "Order Failed"; + + /** + * Constructs a new OrderFailedException exception. + * + */ + public OrderFailedException() { + super(MO_ERROR_NAME, MPDHelper.ORDER_FAILED_ERROR_NUMBER, ""); + } + + /** + * Constructs a new OrderFailedException exception. + * + * @param extraInformation The extraInformation of the exception. + */ + public OrderFailedException(Object extraInformation) { + super(MO_ERROR_NAME, MPDHelper.ORDER_FAILED_ERROR_NUMBER, extraInformation); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/TooManyException.java b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/TooManyException.java new file mode 100644 index 00000000..34509506 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/TooManyException.java @@ -0,0 +1,27 @@ +package org.ccsds.moims.mo.mpd; + +/** + * The TooManyException exception. Too many entries were found. + */ +public final class TooManyException extends org.ccsds.moims.mo.mal.MOErrorException { + + private static final String MO_ERROR_NAME = "Too Many"; + + /** + * Constructs a new TooManyException exception. + * + */ + public TooManyException() { + super(MO_ERROR_NAME, MPDHelper.TOO_MANY_ERROR_NUMBER, ""); + } + + /** + * Constructs a new TooManyException exception. + * + * @param extraInformation The extraInformation of the exception. + */ + public TooManyException(Object extraInformation) { + super(MO_ERROR_NAME, MPDHelper.TOO_MANY_ERROR_NUMBER, extraInformation); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/UnknownException.java b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/UnknownException.java new file mode 100644 index 00000000..0c392da9 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/UnknownException.java @@ -0,0 +1,27 @@ +package org.ccsds.moims.mo.mpd; + +/** + * The UnknownException exception. The referenced item does not exist. + */ +public final class UnknownException extends org.ccsds.moims.mo.mal.MOErrorException { + + private static final String MO_ERROR_NAME = "Unknown"; + + /** + * Constructs a new UnknownException exception. + * + */ + public UnknownException() { + super(MO_ERROR_NAME, MPDHelper.UNKNOWN_ERROR_NUMBER, ""); + } + + /** + * Constructs a new UnknownException exception. + * + * @param extraInformation The extraInformation of the exception. + */ + public UnknownException(Object extraInformation) { + super(MO_ERROR_NAME, MPDHelper.UNKNOWN_ERROR_NUMBER, extraInformation); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/ordermanagement/OrderManagementHelper.java b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/ordermanagement/OrderManagementHelper.java new file mode 100644 index 00000000..d6db998a --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/ordermanagement/OrderManagementHelper.java @@ -0,0 +1,17 @@ +package org.ccsds.moims.mo.mpd.ordermanagement; + +/** + * Helper class for OrderManagement service. + */ +public class OrderManagementHelper { + + /** + * Service singleton instance. + */ + public static final org.ccsds.moims.mo.mpd.ordermanagement.OrderManagementServiceInfo ORDERMANAGEMENT_SERVICE = new org.ccsds.moims.mo.mpd.ordermanagement.OrderManagementServiceInfo(); + + private OrderManagementHelper() { + // Utility class; not meant to be instantiated. + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/ordermanagement/OrderManagementServiceInfo.java b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/ordermanagement/OrderManagementServiceInfo.java new file mode 100644 index 00000000..db62a739 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/ordermanagement/OrderManagementServiceInfo.java @@ -0,0 +1,140 @@ +package org.ccsds.moims.mo.mpd.ordermanagement; + +/** + * Helper class for OrderManagement service. + */ +public class OrderManagementServiceInfo extends org.ccsds.moims.mo.mal.ServiceInfo { + + /** + * Service number literal. + */ + public static final int _ORDERMANAGEMENT_SERVICE_NUMBER = 2; + + /** + * Service number instance. + */ + public static final org.ccsds.moims.mo.mal.structures.UShort ORDERMANAGEMENT_SERVICE_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_ORDERMANAGEMENT_SERVICE_NUMBER); + + /** + * Service name constant. + */ + public static final org.ccsds.moims.mo.mal.structures.Identifier ORDERMANAGEMENT_SERVICE_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("OrderManagement"); + + /** + * The service key of this service. + */ + private static final org.ccsds.moims.mo.mal.ServiceKey SERVICE_KEY = new org.ccsds.moims.mo.mal.ServiceKey( + 9, 1, ORDERMANAGEMENT_SERVICE_NUMBER); + + /** + * Operation number literal for operation LISTSTANDINGORDERS. + */ + public static final int _LISTSTANDINGORDERS_OP_NUMBER = 1; + + /** + * Operation number instance for operation LISTSTANDINGORDERS. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort LISTSTANDINGORDERS_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_LISTSTANDINGORDERS_OP_NUMBER); + + /** + * Operation instance for operation LISTSTANDINGORDERS. + */ + public static final org.ccsds.moims.mo.mal.MALRequestOperation LISTSTANDINGORDERS_OP = new org.ccsds.moims.mo.mal.MALRequestOperation(SERVICE_KEY, + LISTSTANDINGORDERS_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("listStandingOrders"), + new org.ccsds.moims.mo.mal.structures.UShort(1), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("user", true, org.ccsds.moims.mo.mal.structures.Attribute.IDENTIFIER_SHORT_FORM, "The user of the standing order(s) to be listed."), + new org.ccsds.moims.mo.mal.OperationField("domain", true, org.ccsds.moims.mo.mal.structures.IdentifierList.SHORT_FORM, "The domain of the standing order(s) to be listed.")}, + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("standingOrders", false, org.ccsds.moims.mo.mpd.structures.StandingOrderList.SHORT_FORM, "The standing orders that match the selected criteria.")}, + "The listStandingOrders operation lists the existing standing orders on the service provider for a given user and domain."); + + /** + * Operation number literal for operation SUBMITSTANDINGORDER. + */ + public static final int _SUBMITSTANDINGORDER_OP_NUMBER = 2; + + /** + * Operation number instance for operation SUBMITSTANDINGORDER. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort SUBMITSTANDINGORDER_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_SUBMITSTANDINGORDER_OP_NUMBER); + + /** + * Operation instance for operation SUBMITSTANDINGORDER. + */ + public static final org.ccsds.moims.mo.mal.MALRequestOperation SUBMITSTANDINGORDER_OP = new org.ccsds.moims.mo.mal.MALRequestOperation(SERVICE_KEY, + SUBMITSTANDINGORDER_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("submitStandingOrder"), + new org.ccsds.moims.mo.mal.structures.UShort(2), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("orderDetails", false, org.ccsds.moims.mo.mpd.structures.StandingOrder.SHORT_FORM, "The details of the order to be submitted for processing.")}, + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("orderID", false, org.ccsds.moims.mo.mal.structures.Attribute.LONG_SHORT_FORM, "The unique id of the standing order.")}, + "The submitStandingOrder operation creates a new standing order in the provider for delivery of mission data products."); + + /** + * Operation number literal for operation CANCELSTANDINGORDER. + */ + public static final int _CANCELSTANDINGORDER_OP_NUMBER = 3; + + /** + * Operation number instance for operation CANCELSTANDINGORDER. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort CANCELSTANDINGORDER_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_CANCELSTANDINGORDER_OP_NUMBER); + + /** + * Operation instance for operation CANCELSTANDINGORDER. + */ + public static final org.ccsds.moims.mo.mal.MALSubmitOperation CANCELSTANDINGORDER_OP = new org.ccsds.moims.mo.mal.MALSubmitOperation(SERVICE_KEY, + CANCELSTANDINGORDER_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("cancelStandingOrder"), + new org.ccsds.moims.mo.mal.structures.UShort(2), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("orderID", false, org.ccsds.moims.mo.mal.structures.Attribute.LONG_SHORT_FORM, "The unique id of the standing order to be cancelled.")}, + "The cancelStandingOrder operation cancels an existing standing order."); + + /** + * Area elements. + */ + public static final org.ccsds.moims.mo.mal.structures.Element[] ORDERMANAGEMENT_SERVICE_ELEMENTS = {}; + + /** + * The set of operations for this service. + */ + public static final org.ccsds.moims.mo.mal.MALOperation[] OPERATIONS = new org.ccsds.moims.mo.mal.MALOperation[]{LISTSTANDINGORDERS_OP, + SUBMITSTANDINGORDER_OP, + CANCELSTANDINGORDER_OP}; + + /** + * Creates an instance of the OrderManagement ServiceInfo. + * + */ + public OrderManagementServiceInfo() { + super(SERVICE_KEY, ORDERMANAGEMENT_SERVICE_NAME, ORDERMANAGEMENT_SERVICE_ELEMENTS, OPERATIONS); + } + + @Override + public org.ccsds.moims.mo.mal.MALArea getArea() { + return org.ccsds.moims.mo.mpd.MPDHelper.MPD_AREA; + } + + @Override + public org.ccsds.moims.mo.mal.MOErrorException generateMOError(int errorNumber, + Object extraInfo) { + switch (errorNumber) { + case 1: + return new org.ccsds.moims.mo.mpd.InvalidException(extraInfo); + case 2: + return new org.ccsds.moims.mo.mpd.DeliveryFailedException(extraInfo); + case 3: + return new org.ccsds.moims.mo.mpd.OrderFailedException(extraInfo); + case 4: + return new org.ccsds.moims.mo.mpd.UnknownException(extraInfo); + case 5: + return new org.ccsds.moims.mo.mpd.TooManyException(extraInfo); + } + return null; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/ordermanagement/consumer/OrderManagementAdapter.java b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/ordermanagement/consumer/OrderManagementAdapter.java new file mode 100644 index 00000000..251aa88b --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/ordermanagement/consumer/OrderManagementAdapter.java @@ -0,0 +1,143 @@ +package org.ccsds.moims.mo.mpd.ordermanagement.consumer; + +/** + * Consumer adapter for OrderManagement service. + */ +public abstract class OrderManagementAdapter extends org.ccsds.moims.mo.mal.consumer.MALInteractionAdapter { + + /** + * Called by the MAL when a REQUEST response is received from a provider for + * the operation listStandingOrders. + * + * @param msgHeader msgHeader The header of the received message + * @param standingOrders The standing orders that match the selected criteria. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void listStandingOrdersResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mpd.structures.StandingOrderList standingOrders, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response error is received from a provider + * for the operation listStandingOrders. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void listStandingOrdersErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response is received from a provider for + * the operation submitStandingOrder. + * + * @param msgHeader msgHeader The header of the received message + * @param orderID The unique id of the standing order. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void submitStandingOrderResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + Long orderID, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response error is received from a provider + * for the operation submitStandingOrder. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void submitStandingOrderErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a SUBMIT acknowledgement is received from a provider + * for the operation cancelStandingOrder. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void cancelStandingOrderAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a SUBMIT acknowledgement error is received from + * a provider for the operation cancelStandingOrder. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void cancelStandingOrderErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + @Override + public final void submitAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mpd.ordermanagement.OrderManagementServiceInfo._CANCELSTANDINGORDER_OP_NUMBER: + cancelStandingOrderAckReceived(msgHeader, qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void submitErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALErrorBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mpd.ordermanagement.OrderManagementServiceInfo._CANCELSTANDINGORDER_OP_NUMBER: + cancelStandingOrderErrorReceived(msgHeader, body.getError(), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void requestResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALMessageBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mpd.ordermanagement.OrderManagementServiceInfo._LISTSTANDINGORDERS_OP_NUMBER: + listStandingOrdersResponseReceived(msgHeader, + (org.ccsds.moims.mo.mpd.structures.StandingOrderList) body.getBodyElement(0, new org.ccsds.moims.mo.mpd.structures.StandingOrderList()), qosProperties); + break; + case org.ccsds.moims.mo.mpd.ordermanagement.OrderManagementServiceInfo._SUBMITSTANDINGORDER_OP_NUMBER: + submitStandingOrderResponseReceived(msgHeader, + (body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.Union(Long.MAX_VALUE)) == null) ? null : ((org.ccsds.moims.mo.mal.structures.Union) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.Union(Long.MAX_VALUE))).getLongValue(), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void requestErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALErrorBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mpd.ordermanagement.OrderManagementServiceInfo._LISTSTANDINGORDERS_OP_NUMBER: + listStandingOrdersErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mpd.ordermanagement.OrderManagementServiceInfo._SUBMITSTANDINGORDER_OP_NUMBER: + submitStandingOrderErrorReceived(msgHeader, body.getError(), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/ordermanagement/consumer/OrderManagementStub.java b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/ordermanagement/consumer/OrderManagementStub.java new file mode 100644 index 00000000..235b05d7 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/ordermanagement/consumer/OrderManagementStub.java @@ -0,0 +1,171 @@ +package org.ccsds.moims.mo.mpd.ordermanagement.consumer; + +/** + * Consumer stub for OrderManagement service. + */ +public class OrderManagementStub { + + /** + * The consumer field. + */ + private final org.ccsds.moims.mo.mal.consumer.MALConsumer consumer; + + /** + * Wraps a MALconsumer connection with service specific methods that map from + * the high level service API to the generic MAL API. + * + * @param consumer consumer The MALConsumer to use in this stub. + */ + public OrderManagementStub(org.ccsds.moims.mo.mal.consumer.MALConsumer consumer) { + this.consumer = consumer; + } + + /** + * Returns the internal MAL consumer object used for sending of messages from + * this interface. + * + * @return The MAL consumer object. + */ + public org.ccsds.moims.mo.mal.consumer.MALConsumer getConsumer() { + return consumer; + } + + /** + * The listStandingOrders operation lists the existing standing orders on + * the service provider for a given user and domain. + * + * @param user The user of the standing order(s) to be listed. + * @param domain The domain of the standing order(s) to be listed. + * @return The return value of the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mpd.structures.StandingOrderList listStandingOrders(org.ccsds.moims.mo.mal.structures.Identifier user, + org.ccsds.moims.mo.mal.structures.IdentifierList domain) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + org.ccsds.moims.mo.mal.transport.MALMessageBody body = consumer.request(org.ccsds.moims.mo.mpd.ordermanagement.OrderManagementServiceInfo.LISTSTANDINGORDERS_OP, user, domain); + Object body0 = (Object) body.getBodyElement(0, new org.ccsds.moims.mo.mpd.structures.StandingOrderList()); + return (org.ccsds.moims.mo.mpd.structures.StandingOrderList) body0; + } + + /** + * Asynchronous version of method listStandingOrders. + * + * @param user The user of the standing order(s) to be listed. + * @param domain The domain of the standing order(s) to be listed. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncListStandingOrders(org.ccsds.moims.mo.mal.structures.Identifier user, + org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mpd.ordermanagement.consumer.OrderManagementAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncRequest(org.ccsds.moims.mo.mpd.ordermanagement.OrderManagementServiceInfo.LISTSTANDINGORDERS_OP, adapter, user, domain); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueListStandingOrders(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mpd.ordermanagement.consumer.OrderManagementAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mpd.ordermanagement.OrderManagementServiceInfo.LISTSTANDINGORDERS_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The submitStandingOrder operation creates a new standing order in the provider + * for delivery of mission data products. + * + * @param orderDetails The details of the order to be submitted for processing. + * @return The return value of the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public Long submitStandingOrder(org.ccsds.moims.mo.mpd.structures.StandingOrder orderDetails) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + org.ccsds.moims.mo.mal.transport.MALMessageBody body = consumer.request(org.ccsds.moims.mo.mpd.ordermanagement.OrderManagementServiceInfo.SUBMITSTANDINGORDER_OP, orderDetails); + Object body0 = (Object) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.Union(Long.MAX_VALUE)); + return (body0 == null) ? null : ((org.ccsds.moims.mo.mal.structures.Union) body0).getLongValue(); + } + + /** + * Asynchronous version of method submitStandingOrder. + * + * @param orderDetails The details of the order to be submitted for processing. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncSubmitStandingOrder(org.ccsds.moims.mo.mpd.structures.StandingOrder orderDetails, + org.ccsds.moims.mo.mpd.ordermanagement.consumer.OrderManagementAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncRequest(org.ccsds.moims.mo.mpd.ordermanagement.OrderManagementServiceInfo.SUBMITSTANDINGORDER_OP, adapter, orderDetails); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueSubmitStandingOrder(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mpd.ordermanagement.consumer.OrderManagementAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mpd.ordermanagement.OrderManagementServiceInfo.SUBMITSTANDINGORDER_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The cancelStandingOrder operation cancels an existing standing order. + * + * @param orderID The unique id of the standing order to be cancelled. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void cancelStandingOrder(Long orderID) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.submit(org.ccsds.moims.mo.mpd.ordermanagement.OrderManagementServiceInfo.CANCELSTANDINGORDER_OP, (orderID == null) ? null : new org.ccsds.moims.mo.mal.structures.Union(orderID)); + } + + /** + * Asynchronous version of method cancelStandingOrder. + * + * @param orderID The unique id of the standing order to be cancelled. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncCancelStandingOrder(Long orderID, + org.ccsds.moims.mo.mpd.ordermanagement.consumer.OrderManagementAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncSubmit(org.ccsds.moims.mo.mpd.ordermanagement.OrderManagementServiceInfo.CANCELSTANDINGORDER_OP, adapter, (orderID == null) ? null : new org.ccsds.moims.mo.mal.structures.Union(orderID)); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueCancelStandingOrder(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mpd.ordermanagement.consumer.OrderManagementAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mpd.ordermanagement.OrderManagementServiceInfo.CANCELSTANDINGORDER_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/ordermanagement/consumer/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/ordermanagement/consumer/package-info.java new file mode 100644 index 00000000..e7a819db --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/ordermanagement/consumer/package-info.java @@ -0,0 +1,4 @@ +/** + * Package containing the consumer stubs for the OrderManagement service. +*/ +package org.ccsds.moims.mo.mpd.ordermanagement.consumer; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/ordermanagement/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/ordermanagement/package-info.java new file mode 100644 index 00000000..3e6e3f72 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/ordermanagement/package-info.java @@ -0,0 +1,6 @@ +/** + * The Order Management Service is used to submit and manage standing orders. + * Standing orders specify a product filter to subscribe to a subset of automatically + * generated products and define the method and destination for product delivery. +*/ +package org.ccsds.moims.mo.mpd.ordermanagement; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/ordermanagement/provider/OrderManagementHandler.java b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/ordermanagement/provider/OrderManagementHandler.java new file mode 100644 index 00000000..c74d0c92 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/ordermanagement/provider/OrderManagementHandler.java @@ -0,0 +1,52 @@ +package org.ccsds.moims.mo.mpd.ordermanagement.provider; + +/** + * Interface that providers of the OrderManagement service must implement + * to handle the operations of that service. + */ +public interface OrderManagementHandler { + + /** + * Implements the operation listStandingOrders. + * + * @param user The user of the standing order(s) to be listed. + * @param domain The domain of the standing order(s) to be listed. + * @param interaction The MAL object representing the interaction in the provider. + * @return The return value of the operation + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + org.ccsds.moims.mo.mpd.structures.StandingOrderList listStandingOrders(org.ccsds.moims.mo.mal.structures.Identifier user, + org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation submitStandingOrder. + * + * @param orderDetails The details of the order to be submitted for processing. + * @param interaction The MAL object representing the interaction in the provider. + * @return The return value of the operation + * @throws org.ccsds.moims.mo.mpd.InvalidException When a field in the message contains an invalid value. When the delivery method is selected as FILETRANFER and the delivery URI is set to NULL. When the delivery method is not selected as FILETRANFER and the delivery URI is not set to NULL. + * @throws org.ccsds.moims.mo.mpd.OrderFailedException When the selected URI contains an unsupported scheme/protocol. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + Long submitStandingOrder(org.ccsds.moims.mo.mpd.structures.StandingOrder orderDetails, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mpd.InvalidException, org.ccsds.moims.mo.mpd.OrderFailedException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation cancelStandingOrder. + * + * @param orderID The unique id of the standing order to be cancelled. + * @param interaction The MAL object representing the interaction in the provider. + * @throws org.ccsds.moims.mo.mpd.UnknownException When the referenced orderID does not exist. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + void cancelStandingOrder(Long orderID, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mpd.UnknownException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Sets the skeleton to be used for creation of publishers. + * + * @param skeleton The skeleton to be used. + */ + void setSkeleton(org.ccsds.moims.mo.mpd.ordermanagement.provider.OrderManagementSkeleton skeleton); +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/ordermanagement/provider/OrderManagementInheritanceSkeleton.java b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/ordermanagement/provider/OrderManagementInheritanceSkeleton.java new file mode 100644 index 00000000..d14489d0 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/ordermanagement/provider/OrderManagementInheritanceSkeleton.java @@ -0,0 +1,124 @@ +package org.ccsds.moims.mo.mpd.ordermanagement.provider; + +/** + * Provider Inheritance skeleton for OrderManagementInheritanceSkeleton service. + */ +public abstract class OrderManagementInheritanceSkeleton implements org.ccsds.moims.mo.mal.provider.MALInteractionHandler, org.ccsds.moims.mo.mpd.ordermanagement.provider.OrderManagementSkeleton, org.ccsds.moims.mo.mpd.ordermanagement.provider.OrderManagementHandler { + + /** + * The providerSet field. + */ + private org.ccsds.moims.mo.mal.provider.MALProviderSet providerSet = new org.ccsds.moims.mo.mal.provider.MALProviderSet(org.ccsds.moims.mo.mpd.ordermanagement.OrderManagementHelper.ORDERMANAGEMENT_SERVICE); + + /** + * Returns the connection object for this provider. + * + * @return the connection object for this provider + * @throws java.io.IOException if the method was not implemented yet. + */ + public org.ccsds.moims.mo.mal.helpertools.connections.ConnectionProvider getConnection() throws java.io.IOException { + throw new java.io.IOException("This method needs to be overridden!"); + } + + @Override + public void setSkeleton(org.ccsds.moims.mo.mpd.ordermanagement.provider.OrderManagementSkeleton skeleton) { + // Not used in the inheritance pattern (the skeleton is 'this'); + } + + @Override + public void malInitialize(org.ccsds.moims.mo.mal.provider.MALProvider provider) throws org.ccsds.moims.mo.mal.MALException { + providerSet.addProvider(provider); + } + + @Override + public void malFinalize(org.ccsds.moims.mo.mal.provider.MALProvider provider) throws org.ccsds.moims.mo.mal.MALException { + providerSet.removeProvider(provider); + } + + @Override + public void handleSend(org.ccsds.moims.mo.mal.provider.MALInteraction interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + switch (opNumber) { + default: + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } + + @Override + public void handleSubmit(org.ccsds.moims.mo.mal.provider.MALSubmit interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + try { + switch (opNumber) { + case org.ccsds.moims.mo.mpd.ordermanagement.OrderManagementServiceInfo._CANCELSTANDINGORDER_OP_NUMBER: + cancelStandingOrder((body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.Union(Long.MAX_VALUE)) == null) ? null : ((org.ccsds.moims.mo.mal.structures.Union) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.Union(Long.MAX_VALUE))).getLongValue(), + interaction); + interaction.sendAcknowledgement(); + break; + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } catch (org.ccsds.moims.mo.mal.MOErrorException error) { + throw new org.ccsds.moims.mo.mal.MALInteractionException(error); + } + } + + @Override + public void handleRequest(org.ccsds.moims.mo.mal.provider.MALRequest interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + try { + switch (opNumber) { + case org.ccsds.moims.mo.mpd.ordermanagement.OrderManagementServiceInfo._LISTSTANDINGORDERS_OP_NUMBER: + interaction.sendResponse(listStandingOrders((org.ccsds.moims.mo.mal.structures.Identifier) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.Identifier()), + (org.ccsds.moims.mo.mal.structures.IdentifierList) body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.IdentifierList()), + interaction)); + break; + case org.ccsds.moims.mo.mpd.ordermanagement.OrderManagementServiceInfo._SUBMITSTANDINGORDER_OP_NUMBER: + Long submitStandingOrderRt = submitStandingOrder((org.ccsds.moims.mo.mpd.structures.StandingOrder) body.getBodyElement(0, new org.ccsds.moims.mo.mpd.structures.StandingOrder()), + interaction); + interaction.sendResponse((submitStandingOrderRt == null) ? null : new org.ccsds.moims.mo.mal.structures.Union(submitStandingOrderRt)); + break; + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } catch (org.ccsds.moims.mo.mal.MOErrorException error) { + throw new org.ccsds.moims.mo.mal.MALInteractionException(error); + } + } + + @Override + public void handleInvoke(org.ccsds.moims.mo.mal.provider.MALInvoke interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + switch (opNumber) { + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } + + @Override + public void handleProgress(org.ccsds.moims.mo.mal.provider.MALProgress interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + switch (opNumber) { + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/ordermanagement/provider/OrderManagementSkeleton.java b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/ordermanagement/provider/OrderManagementSkeleton.java new file mode 100644 index 00000000..594edc82 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/ordermanagement/provider/OrderManagementSkeleton.java @@ -0,0 +1,8 @@ +package org.ccsds.moims.mo.mpd.ordermanagement.provider; + +/** + * The skeleton interface for the OrderManagement service. + */ +public interface OrderManagementSkeleton { + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/ordermanagement/provider/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/ordermanagement/provider/package-info.java new file mode 100644 index 00000000..2fe3218d --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/ordermanagement/provider/package-info.java @@ -0,0 +1,4 @@ +/** + * Package containing the provider skeletons for the OrderManagement service. +*/ +package org.ccsds.moims.mo.mpd.ordermanagement.provider; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/package-info.java new file mode 100644 index 00000000..214eb6d5 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/package-info.java @@ -0,0 +1,4 @@ +/** + * Mission Operations services - Mission Product Distribution. +*/ +package org.ccsds.moims.mo.mpd; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productorderdelivery/ProductOrderDeliveryHelper.java b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productorderdelivery/ProductOrderDeliveryHelper.java new file mode 100644 index 00000000..c8ea3bb4 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productorderdelivery/ProductOrderDeliveryHelper.java @@ -0,0 +1,17 @@ +package org.ccsds.moims.mo.mpd.productorderdelivery; + +/** + * Helper class for ProductOrderDelivery service. + */ +public class ProductOrderDeliveryHelper { + + /** + * Service singleton instance. + */ + public static final org.ccsds.moims.mo.mpd.productorderdelivery.ProductOrderDeliveryServiceInfo PRODUCTORDERDELIVERY_SERVICE = new org.ccsds.moims.mo.mpd.productorderdelivery.ProductOrderDeliveryServiceInfo(); + + private ProductOrderDeliveryHelper() { + // Utility class; not meant to be instantiated. + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productorderdelivery/ProductOrderDeliveryServiceInfo.java b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productorderdelivery/ProductOrderDeliveryServiceInfo.java new file mode 100644 index 00000000..5320c645 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productorderdelivery/ProductOrderDeliveryServiceInfo.java @@ -0,0 +1,142 @@ +package org.ccsds.moims.mo.mpd.productorderdelivery; + +/** + * Helper class for ProductOrderDelivery service. + */ +public class ProductOrderDeliveryServiceInfo extends org.ccsds.moims.mo.mal.ServiceInfo { + + /** + * Service number literal. + */ + public static final int _PRODUCTORDERDELIVERY_SERVICE_NUMBER = 3; + + /** + * Service number instance. + */ + public static final org.ccsds.moims.mo.mal.structures.UShort PRODUCTORDERDELIVERY_SERVICE_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_PRODUCTORDERDELIVERY_SERVICE_NUMBER); + + /** + * Service name constant. + */ + public static final org.ccsds.moims.mo.mal.structures.Identifier PRODUCTORDERDELIVERY_SERVICE_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("ProductOrderDelivery"); + + /** + * The service key of this service. + */ + private static final org.ccsds.moims.mo.mal.ServiceKey SERVICE_KEY = new org.ccsds.moims.mo.mal.ServiceKey( + 9, 1, PRODUCTORDERDELIVERY_SERVICE_NUMBER); + + /** + * Operation number literal for operation NOTIFYPRODUCTDELIVERY. + */ + public static final int _NOTIFYPRODUCTDELIVERY_OP_NUMBER = 1; + + /** + * Operation number instance for operation NOTIFYPRODUCTDELIVERY. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort NOTIFYPRODUCTDELIVERY_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_NOTIFYPRODUCTDELIVERY_OP_NUMBER); + + /** + * Operation instance for operation NOTIFYPRODUCTDELIVERY. + */ + public static final org.ccsds.moims.mo.mal.MALPubSubOperation NOTIFYPRODUCTDELIVERY_OP = new org.ccsds.moims.mo.mal.MALPubSubOperation(SERVICE_KEY, + NOTIFYPRODUCTDELIVERY_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("notifyProductDelivery"), + new org.ccsds.moims.mo.mal.structures.UShort(1), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("metadata", false, org.ccsds.moims.mo.mpd.structures.ProductMetadata.SHORT_FORM, "The metadata of the mission data product."), + new org.ccsds.moims.mo.mal.OperationField("filename", false, org.ccsds.moims.mo.mal.structures.Attribute.STRING_SHORT_FORM, "The filename of the mission data product."), + new org.ccsds.moims.mo.mal.OperationField("deliveredTo", false, org.ccsds.moims.mo.mal.structures.Attribute.URI_SHORT_FORM, "The location's URI where the mission data product was delivered."), + new org.ccsds.moims.mo.mal.OperationField("success", false, org.ccsds.moims.mo.mal.structures.Attribute.BOOLEAN_SHORT_FORM, "The status indicating the successful delivery of the mission data product.")}, + "The notifyProductDelivery operation publishes a notification whenever a product has been delivered by file transfer in accordance with an existing standing order."); + + /** + * Key names instance for NOTIFYPRODUCTDELIVERY operation of pubsub interaction + * pattern. + */ + private static final org.ccsds.moims.mo.mal.structures.Identifier [] _NOTIFYPRODUCTDELIVERY_OP_KEY_NAMES = {new org.ccsds.moims.mo.mal.structures.Identifier("user"), + new org.ccsds.moims.mo.mal.structures.Identifier("orderID")}; + + /** + * Key names instance for NOTIFYPRODUCTDELIVERY operation of pubsub interaction + * pattern. + */ + private static final org.ccsds.moims.mo.mal.structures.IdentifierList NOTIFYPRODUCTDELIVERY_OP_KEY_NAMES = new org.ccsds.moims.mo.mal.structures.IdentifierList(new java.util.ArrayList<>(java.util.Arrays.asList(_NOTIFYPRODUCTDELIVERY_OP_KEY_NAMES))); + + /** + * Operation number literal for operation DELIVERPRODUCTS. + */ + public static final int _DELIVERPRODUCTS_OP_NUMBER = 2; + + /** + * Operation number instance for operation DELIVERPRODUCTS. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort DELIVERPRODUCTS_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_DELIVERPRODUCTS_OP_NUMBER); + + /** + * Operation instance for operation DELIVERPRODUCTS. + */ + public static final org.ccsds.moims.mo.mal.MALPubSubOperation DELIVERPRODUCTS_OP = new org.ccsds.moims.mo.mal.MALPubSubOperation(SERVICE_KEY, + DELIVERPRODUCTS_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("deliverProducts"), + new org.ccsds.moims.mo.mal.structures.UShort(2), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("product", false, org.ccsds.moims.mo.mpd.structures.Product.SHORT_FORM, "The mission data product.")}, + "The deliverProducts operation publishes mission data products directly via the service interface for an existing standing order."); + + /** + * Key names instance for DELIVERPRODUCTS operation of pubsub interaction + * pattern. + */ + private static final org.ccsds.moims.mo.mal.structures.Identifier [] _DELIVERPRODUCTS_OP_KEY_NAMES = {new org.ccsds.moims.mo.mal.structures.Identifier("user"), + new org.ccsds.moims.mo.mal.structures.Identifier("orderID")}; + + /** + * Key names instance for DELIVERPRODUCTS operation of pubsub interaction + * pattern. + */ + private static final org.ccsds.moims.mo.mal.structures.IdentifierList DELIVERPRODUCTS_OP_KEY_NAMES = new org.ccsds.moims.mo.mal.structures.IdentifierList(new java.util.ArrayList<>(java.util.Arrays.asList(_DELIVERPRODUCTS_OP_KEY_NAMES))); + + /** + * Area elements. + */ + public static final org.ccsds.moims.mo.mal.structures.Element[] PRODUCTORDERDELIVERY_SERVICE_ELEMENTS = {}; + + /** + * The set of operations for this service. + */ + public static final org.ccsds.moims.mo.mal.MALOperation[] OPERATIONS = new org.ccsds.moims.mo.mal.MALOperation[]{NOTIFYPRODUCTDELIVERY_OP, + DELIVERPRODUCTS_OP}; + + /** + * Creates an instance of the ProductOrderDelivery ServiceInfo. + * + */ + public ProductOrderDeliveryServiceInfo() { + super(SERVICE_KEY, PRODUCTORDERDELIVERY_SERVICE_NAME, PRODUCTORDERDELIVERY_SERVICE_ELEMENTS, OPERATIONS); + } + + @Override + public org.ccsds.moims.mo.mal.MALArea getArea() { + return org.ccsds.moims.mo.mpd.MPDHelper.MPD_AREA; + } + + @Override + public org.ccsds.moims.mo.mal.MOErrorException generateMOError(int errorNumber, + Object extraInfo) { + switch (errorNumber) { + case 1: + return new org.ccsds.moims.mo.mpd.InvalidException(extraInfo); + case 2: + return new org.ccsds.moims.mo.mpd.DeliveryFailedException(extraInfo); + case 3: + return new org.ccsds.moims.mo.mpd.OrderFailedException(extraInfo); + case 4: + return new org.ccsds.moims.mo.mpd.UnknownException(extraInfo); + case 5: + return new org.ccsds.moims.mo.mpd.TooManyException(extraInfo); + } + return null; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productorderdelivery/consumer/DeliverProductsSubscriptionKeys.java b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productorderdelivery/consumer/DeliverProductsSubscriptionKeys.java new file mode 100644 index 00000000..3f118c56 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productorderdelivery/consumer/DeliverProductsSubscriptionKeys.java @@ -0,0 +1,88 @@ +package org.ccsds.moims.mo.mpd.productorderdelivery.consumer; + +/** + * Typed accessors for the Subscription Keys of the deliverProducts PubSub + * operation. + */ +public final class DeliverProductsSubscriptionKeys { + + /** + * The key values as received in the UpdateHeader. + */ + private org.ccsds.moims.mo.mal.structures.NullableAttributeList keyValues; + + /** + * The effective key names for the received key values. + */ + private org.ccsds.moims.mo.mal.structures.IdentifierList keyNames; + + /** + * The Subscription Key names defined by the operation, in order. + */ + private static final org.ccsds.moims.mo.mal.structures.IdentifierList CANONICAL_KEY_NAMES = new org.ccsds.moims.mo.mal.structures.IdentifierList(new java.util.ArrayList<>(java.util.Arrays.asList(new org.ccsds.moims.mo.mal.structures.Identifier("user"), new org.ccsds.moims.mo.mal.structures.Identifier("orderID")))); + + /** + * Creates an instance from the received UpdateHeader and the subscription + * selectedKeys. + * + * @param updateHeader The UpdateHeader received in the NOTIFY message + * @param selectedKeys The selectedKeys of the subscription, or null if trimming was not enabled + */ + public DeliverProductsSubscriptionKeys(org.ccsds.moims.mo.mal.structures.UpdateHeader updateHeader, + org.ccsds.moims.mo.mal.structures.IdentifierList selectedKeys) { + this.keyValues = (updateHeader == null) ? null : updateHeader.getKeyValues(); + this.keyNames = (selectedKeys != null) ? selectedKeys : CANONICAL_KEY_NAMES; + } + + /** + * Returns the value of the "user" Subscription Key, or null if not present. + * + * @return The key value, or null if not present + */ + public org.ccsds.moims.mo.mal.structures.Identifier getUser() { + return (org.ccsds.moims.mo.mal.structures.Identifier) valueByName("user"); + } + + /** + * Returns the value of the "orderID" Subscription Key, or null if not present. + * + * @return The key value, or null if not present + */ + public Long getOrderID() { + org.ccsds.moims.mo.mal.structures.Attribute v = valueByName("orderID"); + return (v == null) ? null : (Long) org.ccsds.moims.mo.mal.structures.Attribute.attribute2JavaType(v); + } + + /** + * Returns the Subscription Key value with the given name, or null if it is + * not present (for example when it was trimmed away or is a custom key that + * is not part of this subscription). + * + * @param name The Subscription Key name + * @return The key value, or null if not present + */ + public org.ccsds.moims.mo.mal.structures.Attribute getByName(String name) { + return valueByName(name); + } + + /** + * + * @param name The Subscription Key name + */ + private org.ccsds.moims.mo.mal.structures.Attribute valueByName(String name) { + if (keyNames == null || keyValues == null) { + return null; + } + for (int i = 0; i < keyNames.size(); i++) { + if (name.equals(keyNames.get(i).getValue())) { + if (i >= keyValues.size()) { + return null; + } + org.ccsds.moims.mo.mal.structures.NullableAttribute na = keyValues.get(i); + return (na == null) ? null : na.getValue(); + } + } + return null; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productorderdelivery/consumer/NotifyProductDeliverySubscriptionKeys.java b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productorderdelivery/consumer/NotifyProductDeliverySubscriptionKeys.java new file mode 100644 index 00000000..b70b0498 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productorderdelivery/consumer/NotifyProductDeliverySubscriptionKeys.java @@ -0,0 +1,88 @@ +package org.ccsds.moims.mo.mpd.productorderdelivery.consumer; + +/** + * Typed accessors for the Subscription Keys of the notifyProductDelivery + * PubSub operation. + */ +public final class NotifyProductDeliverySubscriptionKeys { + + /** + * The key values as received in the UpdateHeader. + */ + private org.ccsds.moims.mo.mal.structures.NullableAttributeList keyValues; + + /** + * The effective key names for the received key values. + */ + private org.ccsds.moims.mo.mal.structures.IdentifierList keyNames; + + /** + * The Subscription Key names defined by the operation, in order. + */ + private static final org.ccsds.moims.mo.mal.structures.IdentifierList CANONICAL_KEY_NAMES = new org.ccsds.moims.mo.mal.structures.IdentifierList(new java.util.ArrayList<>(java.util.Arrays.asList(new org.ccsds.moims.mo.mal.structures.Identifier("user"), new org.ccsds.moims.mo.mal.structures.Identifier("orderID")))); + + /** + * Creates an instance from the received UpdateHeader and the subscription + * selectedKeys. + * + * @param updateHeader The UpdateHeader received in the NOTIFY message + * @param selectedKeys The selectedKeys of the subscription, or null if trimming was not enabled + */ + public NotifyProductDeliverySubscriptionKeys(org.ccsds.moims.mo.mal.structures.UpdateHeader updateHeader, + org.ccsds.moims.mo.mal.structures.IdentifierList selectedKeys) { + this.keyValues = (updateHeader == null) ? null : updateHeader.getKeyValues(); + this.keyNames = (selectedKeys != null) ? selectedKeys : CANONICAL_KEY_NAMES; + } + + /** + * Returns the value of the "user" Subscription Key, or null if not present. + * + * @return The key value, or null if not present + */ + public org.ccsds.moims.mo.mal.structures.Identifier getUser() { + return (org.ccsds.moims.mo.mal.structures.Identifier) valueByName("user"); + } + + /** + * Returns the value of the "orderID" Subscription Key, or null if not present. + * + * @return The key value, or null if not present + */ + public Long getOrderID() { + org.ccsds.moims.mo.mal.structures.Attribute v = valueByName("orderID"); + return (v == null) ? null : (Long) org.ccsds.moims.mo.mal.structures.Attribute.attribute2JavaType(v); + } + + /** + * Returns the Subscription Key value with the given name, or null if it is + * not present (for example when it was trimmed away or is a custom key that + * is not part of this subscription). + * + * @param name The Subscription Key name + * @return The key value, or null if not present + */ + public org.ccsds.moims.mo.mal.structures.Attribute getByName(String name) { + return valueByName(name); + } + + /** + * + * @param name The Subscription Key name + */ + private org.ccsds.moims.mo.mal.structures.Attribute valueByName(String name) { + if (keyNames == null || keyValues == null) { + return null; + } + for (int i = 0; i < keyNames.size(); i++) { + if (name.equals(keyNames.get(i).getValue())) { + if (i >= keyValues.size()) { + return null; + } + org.ccsds.moims.mo.mal.structures.NullableAttribute na = keyValues.get(i); + return (na == null) ? null : na.getValue(); + } + } + return null; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productorderdelivery/consumer/ProductOrderDeliveryAdapter.java b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productorderdelivery/consumer/ProductOrderDeliveryAdapter.java new file mode 100644 index 00000000..80c4d9b2 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productorderdelivery/consumer/ProductOrderDeliveryAdapter.java @@ -0,0 +1,257 @@ +package org.ccsds.moims.mo.mpd.productorderdelivery.consumer; + +/** + * Consumer adapter for ProductOrderDelivery service. + */ +public abstract class ProductOrderDeliveryAdapter extends org.ccsds.moims.mo.mal.consumer.MALInteractionAdapter { + + /** + * Called by the MAL when a PubSub register acknowledgement is received from + * a broker for the operation notifyProductDelivery. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void notifyProductDeliveryRegisterAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PubSub register acknowledgement error is received + * from a broker for the operation notifyProductDelivery. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void notifyProductDeliveryRegisterErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PubSub deregister acknowledgement is received + * from a broker for the operation notifyProductDelivery. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void notifyProductDeliveryDeregisterAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PubSub update is received from a broker for the + * operation notifyProductDelivery. + * + * @param msgHeader msgHeader The header of the received message + * @param subscriptionId The subscriptionId of the subscription. + * @param updateHeader The Update header. + * @param keys The typed Subscription Key accessors for this update + * @param metadata The metadata of the mission data product. + * @param filename The filename of the mission data product. + * @param deliveredTo The location's URI where the mission data product was delivered. + * @param success The status indicating the successful delivery of the mission data product. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void notifyProductDeliveryNotifyReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.structures.Identifier subscriptionId, + org.ccsds.moims.mo.mal.structures.UpdateHeader updateHeader, + NotifyProductDeliverySubscriptionKeys keys, + org.ccsds.moims.mo.mpd.structures.ProductMetadata metadata, + String filename, + org.ccsds.moims.mo.mal.structures.URI deliveredTo, + Boolean success, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PubSub update error is received from a broker + * for the operation notifyProductDelivery. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void notifyProductDeliveryNotifyErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PubSub register acknowledgement is received from + * a broker for the operation deliverProducts. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void deliverProductsRegisterAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PubSub register acknowledgement error is received + * from a broker for the operation deliverProducts. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void deliverProductsRegisterErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PubSub deregister acknowledgement is received + * from a broker for the operation deliverProducts. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void deliverProductsDeregisterAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PubSub update is received from a broker for the + * operation deliverProducts. + * + * @param msgHeader msgHeader The header of the received message + * @param subscriptionId The subscriptionId of the subscription. + * @param updateHeader The Update header. + * @param keys The typed Subscription Key accessors for this update + * @param product The mission data product. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void deliverProductsNotifyReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.structures.Identifier subscriptionId, + org.ccsds.moims.mo.mal.structures.UpdateHeader updateHeader, + DeliverProductsSubscriptionKeys keys, + org.ccsds.moims.mo.mpd.structures.Product product, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PubSub update error is received from a broker + * for the operation deliverProducts. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void deliverProductsNotifyErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + @Override + public final void registerAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mpd.productorderdelivery.ProductOrderDeliveryServiceInfo._NOTIFYPRODUCTDELIVERY_OP_NUMBER: + notifyProductDeliveryRegisterAckReceived(msgHeader, qosProperties); + break; + case org.ccsds.moims.mo.mpd.productorderdelivery.ProductOrderDeliveryServiceInfo._DELIVERPRODUCTS_OP_NUMBER: + deliverProductsRegisterAckReceived(msgHeader, qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void registerErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALErrorBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mpd.productorderdelivery.ProductOrderDeliveryServiceInfo._NOTIFYPRODUCTDELIVERY_OP_NUMBER: + notifyProductDeliveryRegisterErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mpd.productorderdelivery.ProductOrderDeliveryServiceInfo._DELIVERPRODUCTS_OP_NUMBER: + deliverProductsRegisterErrorReceived(msgHeader, body.getError(), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void notifyReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALNotifyBody body, + org.ccsds.moims.mo.mal.structures.IdentifierList selectedKeys, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + if ((org.ccsds.moims.mo.mpd.MPDHelper.MPD_AREA_NUMBER.equals(msgHeader.getServiceArea())) && (org.ccsds.moims.mo.mpd.productorderdelivery.ProductOrderDeliveryServiceInfo.PRODUCTORDERDELIVERY_SERVICE_NUMBER.equals(msgHeader.getService()))) { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mpd.productorderdelivery.ProductOrderDeliveryServiceInfo._NOTIFYPRODUCTDELIVERY_OP_NUMBER: + notifyProductDeliveryNotifyReceived(msgHeader, + (org.ccsds.moims.mo.mal.structures.Identifier) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.Identifier()), + (org.ccsds.moims.mo.mal.structures.UpdateHeader) body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.UpdateHeader()), + new NotifyProductDeliverySubscriptionKeys((org.ccsds.moims.mo.mal.structures.UpdateHeader) body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.UpdateHeader()), selectedKeys), + (org.ccsds.moims.mo.mpd.structures.ProductMetadata) body.getBodyElement(2, new org.ccsds.moims.mo.mpd.structures.ProductMetadata()), + (body.getBodyElement(3, new org.ccsds.moims.mo.mal.structures.Union("")) == null) ? null : ((org.ccsds.moims.mo.mal.structures.Union) body.getBodyElement(3, new org.ccsds.moims.mo.mal.structures.Union(""))).getStringValue(), + (org.ccsds.moims.mo.mal.structures.URI) body.getBodyElement(4, new org.ccsds.moims.mo.mal.structures.URI()), + (body.getBodyElement(5, new org.ccsds.moims.mo.mal.structures.Union(Boolean.FALSE)) == null) ? null : ((org.ccsds.moims.mo.mal.structures.Union) body.getBodyElement(5, new org.ccsds.moims.mo.mal.structures.Union(Boolean.FALSE))).getBooleanValue(), qosProperties); + break; + case org.ccsds.moims.mo.mpd.productorderdelivery.ProductOrderDeliveryServiceInfo._DELIVERPRODUCTS_OP_NUMBER: + deliverProductsNotifyReceived(msgHeader, + (org.ccsds.moims.mo.mal.structures.Identifier) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.Identifier()), + (org.ccsds.moims.mo.mal.structures.UpdateHeader) body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.UpdateHeader()), + new DeliverProductsSubscriptionKeys((org.ccsds.moims.mo.mal.structures.UpdateHeader) body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.UpdateHeader()), selectedKeys), + (org.ccsds.moims.mo.mpd.structures.Product) body.getBodyElement(2, new org.ccsds.moims.mo.mpd.structures.Product()), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + else { + notifyReceivedFromOtherService(msgHeader, body, qosProperties); + } + } + + @Override + public final void notifyErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALErrorBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mpd.productorderdelivery.ProductOrderDeliveryServiceInfo._NOTIFYPRODUCTDELIVERY_OP_NUMBER: + notifyProductDeliveryNotifyErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mpd.productorderdelivery.ProductOrderDeliveryServiceInfo._DELIVERPRODUCTS_OP_NUMBER: + deliverProductsNotifyErrorReceived(msgHeader, body.getError(), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void deregisterAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mpd.productorderdelivery.ProductOrderDeliveryServiceInfo._NOTIFYPRODUCTDELIVERY_OP_NUMBER: + notifyProductDeliveryDeregisterAckReceived(msgHeader, qosProperties); + break; + case org.ccsds.moims.mo.mpd.productorderdelivery.ProductOrderDeliveryServiceInfo._DELIVERPRODUCTS_OP_NUMBER: + deliverProductsDeregisterAckReceived(msgHeader, qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + /** + * Called by the MAL when a PubSub update from another service is received + * from a broker. + * + * @param msgHeader msgHeader The header of the received message + * @param body body The body of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + * @throws org.ccsds.moims.mo.mal.MALException if an error is detected processing the message. + */ + public void notifyReceivedFromOtherService(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALNotifyBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productorderdelivery/consumer/ProductOrderDeliveryStub.java b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productorderdelivery/consumer/ProductOrderDeliveryStub.java new file mode 100644 index 00000000..b7ae7e78 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productorderdelivery/consumer/ProductOrderDeliveryStub.java @@ -0,0 +1,137 @@ +package org.ccsds.moims.mo.mpd.productorderdelivery.consumer; + +/** + * Consumer stub for ProductOrderDelivery service. + */ +public class ProductOrderDeliveryStub { + + /** + * The consumer field. + */ + private final org.ccsds.moims.mo.mal.consumer.MALConsumer consumer; + + /** + * Wraps a MALconsumer connection with service specific methods that map from + * the high level service API to the generic MAL API. + * + * @param consumer consumer The MALConsumer to use in this stub. + */ + public ProductOrderDeliveryStub(org.ccsds.moims.mo.mal.consumer.MALConsumer consumer) { + this.consumer = consumer; + } + + /** + * Returns the internal MAL consumer object used for sending of messages from + * this interface. + * + * @return The MAL consumer object. + */ + public org.ccsds.moims.mo.mal.consumer.MALConsumer getConsumer() { + return consumer; + } + + /** + * Register method for the notifyProductDelivery PubSub interaction. + * + * @param subscription subscription the subscription to register for + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void notifyProductDeliveryRegister(org.ccsds.moims.mo.mal.structures.Subscription subscription, + org.ccsds.moims.mo.mpd.productorderdelivery.consumer.ProductOrderDeliveryAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.register(org.ccsds.moims.mo.mpd.productorderdelivery.ProductOrderDeliveryServiceInfo.NOTIFYPRODUCTDELIVERY_OP, subscription, adapter); + } + + /** + * Asynchronous version of method notifyProductDeliveryRegister. + * + * @param subscription subscription the subscription to register for + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncNotifyProductDeliveryRegister(org.ccsds.moims.mo.mal.structures.Subscription subscription, + org.ccsds.moims.mo.mpd.productorderdelivery.consumer.ProductOrderDeliveryAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncRegister(org.ccsds.moims.mo.mpd.productorderdelivery.ProductOrderDeliveryServiceInfo.NOTIFYPRODUCTDELIVERY_OP, subscription, adapter); + } + + /** + * Deregister method for the notifyProductDelivery PubSub interaction. + * + * @param identifierList identifierList the subscription identifiers to deregister + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void notifyProductDeliveryDeregister(org.ccsds.moims.mo.mal.structures.IdentifierList identifierList) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.deregister(org.ccsds.moims.mo.mpd.productorderdelivery.ProductOrderDeliveryServiceInfo.NOTIFYPRODUCTDELIVERY_OP, identifierList); + } + + /** + * Asynchronous version of method notifyProductDeliveryDeregister. + * + * @param identifierList identifierList the subscription identifiers to deregister + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncNotifyProductDeliveryDeregister(org.ccsds.moims.mo.mal.structures.IdentifierList identifierList, + org.ccsds.moims.mo.mpd.productorderdelivery.consumer.ProductOrderDeliveryAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncDeregister(org.ccsds.moims.mo.mpd.productorderdelivery.ProductOrderDeliveryServiceInfo.NOTIFYPRODUCTDELIVERY_OP, identifierList, adapter); + } + + /** + * Register method for the deliverProducts PubSub interaction. + * + * @param subscription subscription the subscription to register for + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void deliverProductsRegister(org.ccsds.moims.mo.mal.structures.Subscription subscription, + org.ccsds.moims.mo.mpd.productorderdelivery.consumer.ProductOrderDeliveryAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.register(org.ccsds.moims.mo.mpd.productorderdelivery.ProductOrderDeliveryServiceInfo.DELIVERPRODUCTS_OP, subscription, adapter); + } + + /** + * Asynchronous version of method deliverProductsRegister. + * + * @param subscription subscription the subscription to register for + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncDeliverProductsRegister(org.ccsds.moims.mo.mal.structures.Subscription subscription, + org.ccsds.moims.mo.mpd.productorderdelivery.consumer.ProductOrderDeliveryAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncRegister(org.ccsds.moims.mo.mpd.productorderdelivery.ProductOrderDeliveryServiceInfo.DELIVERPRODUCTS_OP, subscription, adapter); + } + + /** + * Deregister method for the deliverProducts PubSub interaction. + * + * @param identifierList identifierList the subscription identifiers to deregister + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void deliverProductsDeregister(org.ccsds.moims.mo.mal.structures.IdentifierList identifierList) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.deregister(org.ccsds.moims.mo.mpd.productorderdelivery.ProductOrderDeliveryServiceInfo.DELIVERPRODUCTS_OP, identifierList); + } + + /** + * Asynchronous version of method deliverProductsDeregister. + * + * @param identifierList identifierList the subscription identifiers to deregister + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncDeliverProductsDeregister(org.ccsds.moims.mo.mal.structures.IdentifierList identifierList, + org.ccsds.moims.mo.mpd.productorderdelivery.consumer.ProductOrderDeliveryAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncDeregister(org.ccsds.moims.mo.mpd.productorderdelivery.ProductOrderDeliveryServiceInfo.DELIVERPRODUCTS_OP, identifierList, adapter); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productorderdelivery/consumer/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productorderdelivery/consumer/package-info.java new file mode 100644 index 00000000..959bf85f --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productorderdelivery/consumer/package-info.java @@ -0,0 +1,4 @@ +/** + * Package containing the consumer stubs for the ProductOrderDelivery service. +*/ +package org.ccsds.moims.mo.mpd.productorderdelivery.consumer; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productorderdelivery/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productorderdelivery/package-info.java new file mode 100644 index 00000000..342dd3d8 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productorderdelivery/package-info.java @@ -0,0 +1,10 @@ +/** + * The Product Order Delivery Service is used in conjunction with existing + * standing orders (for the delivery of selected products). File delivery + * of products, if requested in the standing order, will be delivered without + * the need to use these service operations. The service provides two capabilities + * to the consumer: (1) to receive notifications each time their ordered products + * have been delivered as files; (2) to receive the ordered products via message + * transfer rather than file delivery. +*/ +package org.ccsds.moims.mo.mpd.productorderdelivery; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productorderdelivery/provider/DeliverProductsPublisher.java b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productorderdelivery/provider/DeliverProductsPublisher.java new file mode 100644 index 00000000..b0211ed7 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productorderdelivery/provider/DeliverProductsPublisher.java @@ -0,0 +1,119 @@ +package org.ccsds.moims.mo.mpd.productorderdelivery.provider; + +/** + * Publisher class for the deliverProducts operation. + */ +public final class DeliverProductsPublisher { + + /** + * The publisherSet field. + */ + private org.ccsds.moims.mo.mal.provider.MALPublisherSet publisherSet; + + /** + * Creates an instance of this class using the supplied publisher set. + * + * @param publisherSet The set of broker connections to use when registering and publishing. + */ + public DeliverProductsPublisher(org.ccsds.moims.mo.mal.provider.MALPublisherSet publisherSet) { + this.publisherSet = publisherSet; + } + + /** + * Registers this provider implementation to the set of broker connections. + * + * @param keyNames The key names to use in the method + * @param keyTypes The key types to use in the method + * @param listener The listener object to use for callback from the publisher + * @throws java.lang.IllegalArgumentException If any supplied argument is invalid + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void register(org.ccsds.moims.mo.mal.structures.IdentifierList keyNames, + org.ccsds.moims.mo.mal.structures.AttributeTypeList keyTypes, + org.ccsds.moims.mo.mal.provider.MALPublishInteractionListener listener) throws java.lang.IllegalArgumentException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + publisherSet.register(keyNames, keyTypes, listener); + } + + /** + * Registers this provider implementation to the set of broker connections + * with the default subscription keys. + * + * @param listener The listener object to use for callback from the publisher + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void registerWithDefaultKeys(org.ccsds.moims.mo.mal.provider.MALPublishInteractionListener listener) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + org.ccsds.moims.mo.mal.structures.IdentifierList keyNames = new org.ccsds.moims.mo.mal.structures.IdentifierList(); + org.ccsds.moims.mo.mal.structures.AttributeTypeList keyTypes = new org.ccsds.moims.mo.mal.structures.AttributeTypeList(); + keyNames.add(new org.ccsds.moims.mo.mal.structures.Identifier("user")); + keyTypes.add(org.ccsds.moims.mo.mal.structures.AttributeType.IDENTIFIER); + keyNames.add(new org.ccsds.moims.mo.mal.structures.Identifier("orderID")); + keyTypes.add(org.ccsds.moims.mo.mal.structures.AttributeType.LONG); + publisherSet.register(keyNames, keyTypes, listener); + } + + /** + * Asynchronously registers this provider implementation to the set of broker + * connections. + * + * @param keyNames The key names to use in the method + * @param keyTypes The key types to use in the method + * @param listener The listener object to use for callback from the publisher + * @throws java.lang.IllegalArgumentException If any supplied argument is invalid + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void asyncRegister(org.ccsds.moims.mo.mal.structures.IdentifierList keyNames, + org.ccsds.moims.mo.mal.structures.AttributeTypeList keyTypes, + org.ccsds.moims.mo.mal.provider.MALPublishInteractionListener listener) throws java.lang.IllegalArgumentException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + publisherSet.asyncRegister(keyNames, keyTypes, listener); + } + + /** + * Publishes updates to the set of registered broker connections. + * + * @param updateHeader The headers of the updates being added + * @param product The mission data product. + * @throws java.lang.IllegalArgumentException If any supplied argument is invalid + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void publish(org.ccsds.moims.mo.mal.structures.UpdateHeader updateHeader, + org.ccsds.moims.mo.mpd.structures.Product product) throws java.lang.IllegalArgumentException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + publisherSet.publish(updateHeader, product); + } + + /** + * Deregisters this provider implementation from the set of broker connections. + * + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void deregister() throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + publisherSet.deregister(); + } + + /** + * Asynchronously deregisters this provider implementation from the set of + * broker connections. + * + * @param listener The listener object to use for callback from the publisher + * @throws java.lang.IllegalArgumentException If any supplied argument is invalid + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void asyncDeregister(org.ccsds.moims.mo.mal.provider.MALPublishInteractionListener listener) throws java.lang.IllegalArgumentException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + publisherSet.asyncDeregister(listener); + } + + /** + * Closes this publisher. + * + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void close() throws org.ccsds.moims.mo.mal.MALException { + publisherSet.close(); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productorderdelivery/provider/NotifyProductDeliveryPublisher.java b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productorderdelivery/provider/NotifyProductDeliveryPublisher.java new file mode 100644 index 00000000..2c68f596 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productorderdelivery/provider/NotifyProductDeliveryPublisher.java @@ -0,0 +1,125 @@ +package org.ccsds.moims.mo.mpd.productorderdelivery.provider; + +/** + * Publisher class for the notifyProductDelivery operation. + */ +public final class NotifyProductDeliveryPublisher { + + /** + * The publisherSet field. + */ + private org.ccsds.moims.mo.mal.provider.MALPublisherSet publisherSet; + + /** + * Creates an instance of this class using the supplied publisher set. + * + * @param publisherSet The set of broker connections to use when registering and publishing. + */ + public NotifyProductDeliveryPublisher(org.ccsds.moims.mo.mal.provider.MALPublisherSet publisherSet) { + this.publisherSet = publisherSet; + } + + /** + * Registers this provider implementation to the set of broker connections. + * + * @param keyNames The key names to use in the method + * @param keyTypes The key types to use in the method + * @param listener The listener object to use for callback from the publisher + * @throws java.lang.IllegalArgumentException If any supplied argument is invalid + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void register(org.ccsds.moims.mo.mal.structures.IdentifierList keyNames, + org.ccsds.moims.mo.mal.structures.AttributeTypeList keyTypes, + org.ccsds.moims.mo.mal.provider.MALPublishInteractionListener listener) throws java.lang.IllegalArgumentException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + publisherSet.register(keyNames, keyTypes, listener); + } + + /** + * Registers this provider implementation to the set of broker connections + * with the default subscription keys. + * + * @param listener The listener object to use for callback from the publisher + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void registerWithDefaultKeys(org.ccsds.moims.mo.mal.provider.MALPublishInteractionListener listener) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + org.ccsds.moims.mo.mal.structures.IdentifierList keyNames = new org.ccsds.moims.mo.mal.structures.IdentifierList(); + org.ccsds.moims.mo.mal.structures.AttributeTypeList keyTypes = new org.ccsds.moims.mo.mal.structures.AttributeTypeList(); + keyNames.add(new org.ccsds.moims.mo.mal.structures.Identifier("user")); + keyTypes.add(org.ccsds.moims.mo.mal.structures.AttributeType.IDENTIFIER); + keyNames.add(new org.ccsds.moims.mo.mal.structures.Identifier("orderID")); + keyTypes.add(org.ccsds.moims.mo.mal.structures.AttributeType.LONG); + publisherSet.register(keyNames, keyTypes, listener); + } + + /** + * Asynchronously registers this provider implementation to the set of broker + * connections. + * + * @param keyNames The key names to use in the method + * @param keyTypes The key types to use in the method + * @param listener The listener object to use for callback from the publisher + * @throws java.lang.IllegalArgumentException If any supplied argument is invalid + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void asyncRegister(org.ccsds.moims.mo.mal.structures.IdentifierList keyNames, + org.ccsds.moims.mo.mal.structures.AttributeTypeList keyTypes, + org.ccsds.moims.mo.mal.provider.MALPublishInteractionListener listener) throws java.lang.IllegalArgumentException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + publisherSet.asyncRegister(keyNames, keyTypes, listener); + } + + /** + * Publishes updates to the set of registered broker connections. + * + * @param updateHeader The headers of the updates being added + * @param metadata The metadata of the mission data product. + * @param filename The filename of the mission data product. + * @param deliveredTo The location's URI where the mission data product was delivered. + * @param success The status indicating the successful delivery of the mission data product. + * @throws java.lang.IllegalArgumentException If any supplied argument is invalid + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void publish(org.ccsds.moims.mo.mal.structures.UpdateHeader updateHeader, + org.ccsds.moims.mo.mpd.structures.ProductMetadata metadata, + String filename, + org.ccsds.moims.mo.mal.structures.URI deliveredTo, + Boolean success) throws java.lang.IllegalArgumentException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + publisherSet.publish(updateHeader, metadata, filename, deliveredTo, success); + } + + /** + * Deregisters this provider implementation from the set of broker connections. + * + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void deregister() throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + publisherSet.deregister(); + } + + /** + * Asynchronously deregisters this provider implementation from the set of + * broker connections. + * + * @param listener The listener object to use for callback from the publisher + * @throws java.lang.IllegalArgumentException If any supplied argument is invalid + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void asyncDeregister(org.ccsds.moims.mo.mal.provider.MALPublishInteractionListener listener) throws java.lang.IllegalArgumentException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + publisherSet.asyncDeregister(listener); + } + + /** + * Closes this publisher. + * + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void close() throws org.ccsds.moims.mo.mal.MALException { + publisherSet.close(); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productorderdelivery/provider/ProductOrderDeliveryHandler.java b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productorderdelivery/provider/ProductOrderDeliveryHandler.java new file mode 100644 index 00000000..2f937a2e --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productorderdelivery/provider/ProductOrderDeliveryHandler.java @@ -0,0 +1,15 @@ +package org.ccsds.moims.mo.mpd.productorderdelivery.provider; + +/** + * Interface that providers of the ProductOrderDelivery service must implement + * to handle the operations of that service. + */ +public interface ProductOrderDeliveryHandler { + + /** + * Sets the skeleton to be used for creation of publishers. + * + * @param skeleton The skeleton to be used. + */ + void setSkeleton(org.ccsds.moims.mo.mpd.productorderdelivery.provider.ProductOrderDeliverySkeleton skeleton); +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productorderdelivery/provider/ProductOrderDeliveryInheritanceSkeleton.java b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productorderdelivery/provider/ProductOrderDeliveryInheritanceSkeleton.java new file mode 100644 index 00000000..b0a44299 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productorderdelivery/provider/ProductOrderDeliveryInheritanceSkeleton.java @@ -0,0 +1,124 @@ +package org.ccsds.moims.mo.mpd.productorderdelivery.provider; + +/** + * Provider Inheritance skeleton for ProductOrderDeliveryInheritanceSkeleton + * service. + */ +public abstract class ProductOrderDeliveryInheritanceSkeleton implements org.ccsds.moims.mo.mal.provider.MALInteractionHandler, org.ccsds.moims.mo.mpd.productorderdelivery.provider.ProductOrderDeliverySkeleton, org.ccsds.moims.mo.mpd.productorderdelivery.provider.ProductOrderDeliveryHandler { + + /** + * The providerSet field. + */ + private org.ccsds.moims.mo.mal.provider.MALProviderSet providerSet = new org.ccsds.moims.mo.mal.provider.MALProviderSet(org.ccsds.moims.mo.mpd.productorderdelivery.ProductOrderDeliveryHelper.PRODUCTORDERDELIVERY_SERVICE); + + /** + * Returns the connection object for this provider. + * + * @return the connection object for this provider + * @throws java.io.IOException if the method was not implemented yet. + */ + public org.ccsds.moims.mo.mal.helpertools.connections.ConnectionProvider getConnection() throws java.io.IOException { + throw new java.io.IOException("This method needs to be overridden!"); + } + + @Override + public void setSkeleton(org.ccsds.moims.mo.mpd.productorderdelivery.provider.ProductOrderDeliverySkeleton skeleton) { + // Not used in the inheritance pattern (the skeleton is 'this'); + } + + @Override + public void malInitialize(org.ccsds.moims.mo.mal.provider.MALProvider provider) throws org.ccsds.moims.mo.mal.MALException { + providerSet.addProvider(provider); + } + + @Override + public void malFinalize(org.ccsds.moims.mo.mal.provider.MALProvider provider) throws org.ccsds.moims.mo.mal.MALException { + providerSet.removeProvider(provider); + } + + @Override + public org.ccsds.moims.mo.mpd.productorderdelivery.provider.NotifyProductDeliveryPublisher createNotifyProductDeliveryPublisher(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.Identifier networkZone, + org.ccsds.moims.mo.mal.structures.SessionType sessionType, + org.ccsds.moims.mo.mal.structures.Identifier sessionName, + org.ccsds.moims.mo.mal.structures.QoSLevel qos, + java.util.Map qosProps, + org.ccsds.moims.mo.mal.structures.UInteger priority) throws org.ccsds.moims.mo.mal.MALException { + return new org.ccsds.moims.mo.mpd.productorderdelivery.provider.NotifyProductDeliveryPublisher(providerSet.createPublisherSet(org.ccsds.moims.mo.mpd.productorderdelivery.ProductOrderDeliveryServiceInfo.NOTIFYPRODUCTDELIVERY_OP, domain, sessionType, sessionName, qos, qosProps, null)); + } + + @Override + public org.ccsds.moims.mo.mpd.productorderdelivery.provider.DeliverProductsPublisher createDeliverProductsPublisher(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.Identifier networkZone, + org.ccsds.moims.mo.mal.structures.SessionType sessionType, + org.ccsds.moims.mo.mal.structures.Identifier sessionName, + org.ccsds.moims.mo.mal.structures.QoSLevel qos, + java.util.Map qosProps, + org.ccsds.moims.mo.mal.structures.UInteger priority) throws org.ccsds.moims.mo.mal.MALException { + return new org.ccsds.moims.mo.mpd.productorderdelivery.provider.DeliverProductsPublisher(providerSet.createPublisherSet(org.ccsds.moims.mo.mpd.productorderdelivery.ProductOrderDeliveryServiceInfo.DELIVERPRODUCTS_OP, domain, sessionType, sessionName, qos, qosProps, null)); + } + + @Override + public void handleSend(org.ccsds.moims.mo.mal.provider.MALInteraction interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + switch (opNumber) { + default: + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } + + @Override + public void handleSubmit(org.ccsds.moims.mo.mal.provider.MALSubmit interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + switch (opNumber) { + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } + + @Override + public void handleRequest(org.ccsds.moims.mo.mal.provider.MALRequest interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + switch (opNumber) { + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } + + @Override + public void handleInvoke(org.ccsds.moims.mo.mal.provider.MALInvoke interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + switch (opNumber) { + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } + + @Override + public void handleProgress(org.ccsds.moims.mo.mal.provider.MALProgress interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + switch (opNumber) { + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productorderdelivery/provider/ProductOrderDeliverySkeleton.java b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productorderdelivery/provider/ProductOrderDeliverySkeleton.java new file mode 100644 index 00000000..aac7deab --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productorderdelivery/provider/ProductOrderDeliverySkeleton.java @@ -0,0 +1,50 @@ +package org.ccsds.moims.mo.mpd.productorderdelivery.provider; + +/** + * The skeleton interface for the ProductOrderDelivery service. + */ +public interface ProductOrderDeliverySkeleton { + + /** + * Creates a publisher object using the current registered provider set for + * the PubSub operation notifyProductDelivery. + * + * @param domain The domain used for publishing + * @param networkZone ~The network zone used for publishing + * @param sessionType The session used for publishing + * @param sessionName The session name used for publishing + * @param qos The QoS used for publishing + * @param qosProps The QoS properties used for publishing + * @param priority The priority used for publishing + * @return The new publisher object. + * @throws org.ccsds.moims.mo.mal.MALException if a problem is detected during creation of the publisher + */ + org.ccsds.moims.mo.mpd.productorderdelivery.provider.NotifyProductDeliveryPublisher createNotifyProductDeliveryPublisher(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.Identifier networkZone, + org.ccsds.moims.mo.mal.structures.SessionType sessionType, + org.ccsds.moims.mo.mal.structures.Identifier sessionName, + org.ccsds.moims.mo.mal.structures.QoSLevel qos, + java.util.Map qosProps, + org.ccsds.moims.mo.mal.structures.UInteger priority) throws org.ccsds.moims.mo.mal.MALException; + /** + * Creates a publisher object using the current registered provider set for + * the PubSub operation deliverProducts. + * + * @param domain The domain used for publishing + * @param networkZone ~The network zone used for publishing + * @param sessionType The session used for publishing + * @param sessionName The session name used for publishing + * @param qos The QoS used for publishing + * @param qosProps The QoS properties used for publishing + * @param priority The priority used for publishing + * @return The new publisher object. + * @throws org.ccsds.moims.mo.mal.MALException if a problem is detected during creation of the publisher + */ + org.ccsds.moims.mo.mpd.productorderdelivery.provider.DeliverProductsPublisher createDeliverProductsPublisher(org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.Identifier networkZone, + org.ccsds.moims.mo.mal.structures.SessionType sessionType, + org.ccsds.moims.mo.mal.structures.Identifier sessionName, + org.ccsds.moims.mo.mal.structures.QoSLevel qos, + java.util.Map qosProps, + org.ccsds.moims.mo.mal.structures.UInteger priority) throws org.ccsds.moims.mo.mal.MALException; +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productorderdelivery/provider/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productorderdelivery/provider/package-info.java new file mode 100644 index 00000000..3efab675 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productorderdelivery/provider/package-info.java @@ -0,0 +1,5 @@ +/** + * Package containing the provider skeletons for the ProductOrderDelivery + * service. +*/ +package org.ccsds.moims.mo.mpd.productorderdelivery.provider; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productretrieval/ProductRetrievalHelper.java b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productretrieval/ProductRetrievalHelper.java new file mode 100644 index 00000000..b7539e96 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productretrieval/ProductRetrievalHelper.java @@ -0,0 +1,17 @@ +package org.ccsds.moims.mo.mpd.productretrieval; + +/** + * Helper class for ProductRetrieval service. + */ +public class ProductRetrievalHelper { + + /** + * Service singleton instance. + */ + public static final org.ccsds.moims.mo.mpd.productretrieval.ProductRetrievalServiceInfo PRODUCTRETRIEVAL_SERVICE = new org.ccsds.moims.mo.mpd.productretrieval.ProductRetrievalServiceInfo(); + + private ProductRetrievalHelper() { + // Utility class; not meant to be instantiated. + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productretrieval/ProductRetrievalServiceInfo.java b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productretrieval/ProductRetrievalServiceInfo.java new file mode 100644 index 00000000..f3277411 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productretrieval/ProductRetrievalServiceInfo.java @@ -0,0 +1,150 @@ +package org.ccsds.moims.mo.mpd.productretrieval; + +/** + * Helper class for ProductRetrieval service. + */ +public class ProductRetrievalServiceInfo extends org.ccsds.moims.mo.mal.ServiceInfo { + + /** + * Service number literal. + */ + public static final int _PRODUCTRETRIEVAL_SERVICE_NUMBER = 1; + + /** + * Service number instance. + */ + public static final org.ccsds.moims.mo.mal.structures.UShort PRODUCTRETRIEVAL_SERVICE_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_PRODUCTRETRIEVAL_SERVICE_NUMBER); + + /** + * Service name constant. + */ + public static final org.ccsds.moims.mo.mal.structures.Identifier PRODUCTRETRIEVAL_SERVICE_NAME = new org.ccsds.moims.mo.mal.structures.Identifier("ProductRetrieval"); + + /** + * The service key of this service. + */ + private static final org.ccsds.moims.mo.mal.ServiceKey SERVICE_KEY = new org.ccsds.moims.mo.mal.ServiceKey( + 9, 1, PRODUCTRETRIEVAL_SERVICE_NUMBER); + + /** + * Operation number literal for operation LISTPRODUCTS. + */ + public static final int _LISTPRODUCTS_OP_NUMBER = 1; + + /** + * Operation number instance for operation LISTPRODUCTS. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort LISTPRODUCTS_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_LISTPRODUCTS_OP_NUMBER); + + /** + * Operation instance for operation LISTPRODUCTS. + */ + public static final org.ccsds.moims.mo.mal.MALRequestOperation LISTPRODUCTS_OP = new org.ccsds.moims.mo.mal.MALRequestOperation(SERVICE_KEY, + LISTPRODUCTS_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("listProducts"), + new org.ccsds.moims.mo.mal.structures.UShort(1), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("productFilter", false, org.ccsds.moims.mo.mpd.structures.ProductFilter.SHORT_FORM, "The product filter used to refine the selection of products."), + new org.ccsds.moims.mo.mal.OperationField("creationDate", true, org.ccsds.moims.mo.mpd.structures.TimeWindow.SHORT_FORM, "The time window used to filter products based on their creation date."), + new org.ccsds.moims.mo.mal.OperationField("contentDate", true, org.ccsds.moims.mo.mpd.structures.TimeWindow.SHORT_FORM, "The time window used to filter products based on their content creation period.")}, + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("metadatas", false, org.ccsds.moims.mo.mpd.structures.ProductMetadataList.SHORT_FORM, "The list of metadata entries that match the selected filters.")}, + "The listProducts operation lists the available products for a selected product filter and optionally also for a selected creation date and for a selected content date time window."); + + /** + * Operation number literal for operation GETPRODUCTS. + */ + public static final int _GETPRODUCTS_OP_NUMBER = 2; + + /** + * Operation number instance for operation GETPRODUCTS. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort GETPRODUCTS_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_GETPRODUCTS_OP_NUMBER); + + /** + * Operation instance for operation GETPRODUCTS. + */ + public static final org.ccsds.moims.mo.mal.MALProgressOperation GETPRODUCTS_OP = new org.ccsds.moims.mo.mal.MALProgressOperation(SERVICE_KEY, + GETPRODUCTS_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("getProducts"), + new org.ccsds.moims.mo.mal.structures.UShort(2), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("productRefs", false, org.ccsds.moims.mo.mal.structures.ObjectRefList.SHORT_FORM, "The references to the products to be retrieved.")}, + new org.ccsds.moims.mo.mal.OperationField[] {}, + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("product", false, org.ccsds.moims.mo.mpd.structures.Product.SHORT_FORM, "The selected mission data product(s).")}, + new org.ccsds.moims.mo.mal.OperationField[] {}, + "The getProducts operation retrieves the selected mission data products from the provider."); + + /** + * Operation number literal for operation DELIVERPRODUCTFILES. + */ + public static final int _DELIVERPRODUCTFILES_OP_NUMBER = 3; + + /** + * Operation number instance for operation DELIVERPRODUCTFILES. + */ + private static final org.ccsds.moims.mo.mal.structures.UShort DELIVERPRODUCTFILES_OP_NUMBER = new org.ccsds.moims.mo.mal.structures.UShort(_DELIVERPRODUCTFILES_OP_NUMBER); + + /** + * Operation instance for operation DELIVERPRODUCTFILES. + */ + public static final org.ccsds.moims.mo.mal.MALProgressOperation DELIVERPRODUCTFILES_OP = new org.ccsds.moims.mo.mal.MALProgressOperation(SERVICE_KEY, + DELIVERPRODUCTFILES_OP_NUMBER, + new org.ccsds.moims.mo.mal.structures.Identifier("deliverProductFiles"), + new org.ccsds.moims.mo.mal.structures.UShort(3), + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("productRefs", false, org.ccsds.moims.mo.mal.structures.ObjectRefList.SHORT_FORM, "The references to the products to be delivered."), + new org.ccsds.moims.mo.mal.OperationField("deliverTo", false, org.ccsds.moims.mo.mal.structures.Attribute.URI_SHORT_FORM, "The location's URI where the mission data product must be delivered.")}, + new org.ccsds.moims.mo.mal.OperationField[] {}, + new org.ccsds.moims.mo.mal.OperationField[] { + new org.ccsds.moims.mo.mal.OperationField("metadata", false, org.ccsds.moims.mo.mpd.structures.ProductMetadata.SHORT_FORM, "The metadata of the transferred mission data product(s)."), + new org.ccsds.moims.mo.mal.OperationField("filename", false, org.ccsds.moims.mo.mal.structures.Attribute.STRING_SHORT_FORM, "The filename of the transferred mission data product(s)."), + new org.ccsds.moims.mo.mal.OperationField("success", false, org.ccsds.moims.mo.mal.structures.Attribute.BOOLEAN_SHORT_FORM, "The completion status of the remote file transfer.")}, + new org.ccsds.moims.mo.mal.OperationField[] {}, + "The deliverProductFiles operation allows consumers to instruct the provider to initiate a remote file transfer delivery of the selected mission data products to a specified target."); + + /** + * Area elements. + */ + public static final org.ccsds.moims.mo.mal.structures.Element[] PRODUCTRETRIEVAL_SERVICE_ELEMENTS = {}; + + /** + * The set of operations for this service. + */ + public static final org.ccsds.moims.mo.mal.MALOperation[] OPERATIONS = new org.ccsds.moims.mo.mal.MALOperation[]{LISTPRODUCTS_OP, + GETPRODUCTS_OP, + DELIVERPRODUCTFILES_OP}; + + /** + * Creates an instance of the ProductRetrieval ServiceInfo. + * + */ + public ProductRetrievalServiceInfo() { + super(SERVICE_KEY, PRODUCTRETRIEVAL_SERVICE_NAME, PRODUCTRETRIEVAL_SERVICE_ELEMENTS, OPERATIONS); + } + + @Override + public org.ccsds.moims.mo.mal.MALArea getArea() { + return org.ccsds.moims.mo.mpd.MPDHelper.MPD_AREA; + } + + @Override + public org.ccsds.moims.mo.mal.MOErrorException generateMOError(int errorNumber, + Object extraInfo) { + switch (errorNumber) { + case 1: + return new org.ccsds.moims.mo.mpd.InvalidException(extraInfo); + case 2: + return new org.ccsds.moims.mo.mpd.DeliveryFailedException(extraInfo); + case 3: + return new org.ccsds.moims.mo.mpd.OrderFailedException(extraInfo); + case 4: + return new org.ccsds.moims.mo.mpd.UnknownException(extraInfo); + case 5: + return new org.ccsds.moims.mo.mpd.TooManyException(extraInfo); + } + return null; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productretrieval/consumer/ProductRetrievalAdapter.java b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productretrieval/consumer/ProductRetrievalAdapter.java new file mode 100644 index 00000000..8cb632e1 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productretrieval/consumer/ProductRetrievalAdapter.java @@ -0,0 +1,313 @@ +package org.ccsds.moims.mo.mpd.productretrieval.consumer; + +/** + * Consumer adapter for ProductRetrieval service. + */ +public abstract class ProductRetrievalAdapter extends org.ccsds.moims.mo.mal.consumer.MALInteractionAdapter { + + /** + * Called by the MAL when a REQUEST response is received from a provider for + * the operation listProducts. + * + * @param msgHeader msgHeader The header of the received message + * @param metadatas The list of metadata entries that match the selected filters. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void listProductsResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mpd.structures.ProductMetadataList metadatas, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a REQUEST response error is received from a provider + * for the operation listProducts. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void listProductsErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PROGRESS acknowledgement is received from a provider + * for the operation getProducts. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void getProductsAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PROGRESS update is received from a provider for + * the operation getProducts. + * + * @param msgHeader msgHeader The header of the received message + * @param product The selected mission data product(s). + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void getProductsUpdateReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mpd.structures.Product product, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PROGRESS response is received from a provider + * for the operation getProducts. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void getProductsResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PROGRESS acknowledgement error is received from + * a provider for the operation getProducts. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void getProductsAckErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PROGRESS update error is received from a provider + * for the operation getProducts. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void getProductsUpdateErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PROGRESS response error is received from a provider + * for the operation getProducts. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void getProductsResponseErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PROGRESS acknowledgement is received from a provider + * for the operation deliverProductFiles. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void deliverProductFilesAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PROGRESS update is received from a provider for + * the operation deliverProductFiles. + * + * @param msgHeader msgHeader The header of the received message + * @param metadata The metadata of the transferred mission data product(s). + * @param filename The filename of the transferred mission data product(s). + * @param success The completion status of the remote file transfer. + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void deliverProductFilesUpdateReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mpd.structures.ProductMetadata metadata, + String filename, + Boolean success, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PROGRESS response is received from a provider + * for the operation deliverProductFiles. + * + * @param msgHeader msgHeader The header of the received message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void deliverProductFilesResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PROGRESS acknowledgement error is received from + * a provider for the operation deliverProductFiles. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void deliverProductFilesAckErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PROGRESS update error is received from a provider + * for the operation deliverProductFiles. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void deliverProductFilesUpdateErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + /** + * Called by the MAL when a PROGRESS response error is received from a provider + * for the operation deliverProductFiles. + * + * @param msgHeader msgHeader The header of the received message + * @param error error The received error message + * @param qosProperties qosProperties The QoS properties associated with the message + */ + public void deliverProductFilesResponseErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.MOErrorException error, + java.util.Map qosProperties) { + } + + @Override + public final void requestResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALMessageBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mpd.productretrieval.ProductRetrievalServiceInfo._LISTPRODUCTS_OP_NUMBER: + listProductsResponseReceived(msgHeader, + (org.ccsds.moims.mo.mpd.structures.ProductMetadataList) body.getBodyElement(0, new org.ccsds.moims.mo.mpd.structures.ProductMetadataList()), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void requestErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALErrorBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mpd.productretrieval.ProductRetrievalServiceInfo._LISTPRODUCTS_OP_NUMBER: + listProductsErrorReceived(msgHeader, body.getError(), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void progressAckReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALMessageBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mpd.productretrieval.ProductRetrievalServiceInfo._GETPRODUCTS_OP_NUMBER: + getProductsAckReceived(msgHeader, qosProperties); + break; + case org.ccsds.moims.mo.mpd.productretrieval.ProductRetrievalServiceInfo._DELIVERPRODUCTFILES_OP_NUMBER: + deliverProductFilesAckReceived(msgHeader, qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void progressAckErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALErrorBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mpd.productretrieval.ProductRetrievalServiceInfo._GETPRODUCTS_OP_NUMBER: + getProductsAckErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mpd.productretrieval.ProductRetrievalServiceInfo._DELIVERPRODUCTFILES_OP_NUMBER: + deliverProductFilesAckErrorReceived(msgHeader, body.getError(), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void progressUpdateReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALMessageBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mpd.productretrieval.ProductRetrievalServiceInfo._GETPRODUCTS_OP_NUMBER: + getProductsUpdateReceived(msgHeader, + (org.ccsds.moims.mo.mpd.structures.Product) body.getBodyElement(0, new org.ccsds.moims.mo.mpd.structures.Product()), qosProperties); + break; + case org.ccsds.moims.mo.mpd.productretrieval.ProductRetrievalServiceInfo._DELIVERPRODUCTFILES_OP_NUMBER: + deliverProductFilesUpdateReceived(msgHeader, + (org.ccsds.moims.mo.mpd.structures.ProductMetadata) body.getBodyElement(0, new org.ccsds.moims.mo.mpd.structures.ProductMetadata()), + (body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.Union("")) == null) ? null : ((org.ccsds.moims.mo.mal.structures.Union) body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.Union(""))).getStringValue(), + (body.getBodyElement(2, new org.ccsds.moims.mo.mal.structures.Union(Boolean.FALSE)) == null) ? null : ((org.ccsds.moims.mo.mal.structures.Union) body.getBodyElement(2, new org.ccsds.moims.mo.mal.structures.Union(Boolean.FALSE))).getBooleanValue(), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void progressUpdateErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALErrorBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mpd.productretrieval.ProductRetrievalServiceInfo._GETPRODUCTS_OP_NUMBER: + getProductsUpdateErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mpd.productretrieval.ProductRetrievalServiceInfo._DELIVERPRODUCTFILES_OP_NUMBER: + deliverProductFilesUpdateErrorReceived(msgHeader, body.getError(), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void progressResponseReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALMessageBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mpd.productretrieval.ProductRetrievalServiceInfo._GETPRODUCTS_OP_NUMBER: + getProductsResponseReceived(msgHeader, qosProperties); + break; + case org.ccsds.moims.mo.mpd.productretrieval.ProductRetrievalServiceInfo._DELIVERPRODUCTFILES_OP_NUMBER: + deliverProductFilesResponseReceived(msgHeader, qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + + @Override + public final void progressResponseErrorReceived(org.ccsds.moims.mo.mal.transport.MALMessageHeader msgHeader, + org.ccsds.moims.mo.mal.transport.MALErrorBody body, + java.util.Map qosProperties) throws org.ccsds.moims.mo.mal.MALException { + switch (msgHeader.getOperation().getValue()) { + case org.ccsds.moims.mo.mpd.productretrieval.ProductRetrievalServiceInfo._GETPRODUCTS_OP_NUMBER: + getProductsResponseErrorReceived(msgHeader, body.getError(), qosProperties); + break; + case org.ccsds.moims.mo.mpd.productretrieval.ProductRetrievalServiceInfo._DELIVERPRODUCTFILES_OP_NUMBER: + deliverProductFilesResponseErrorReceived(msgHeader, body.getError(), qosProperties); + break; + default: + throw new org.ccsds.moims.mo.mal.MALException("Consumer adapter was not expecting operation number " + msgHeader.getOperation().getValue()); + } + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productretrieval/consumer/ProductRetrievalStub.java b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productretrieval/consumer/ProductRetrievalStub.java new file mode 100644 index 00000000..cee51fc0 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productretrieval/consumer/ProductRetrievalStub.java @@ -0,0 +1,183 @@ +package org.ccsds.moims.mo.mpd.productretrieval.consumer; + +/** + * Consumer stub for ProductRetrieval service. + */ +public class ProductRetrievalStub { + + /** + * The consumer field. + */ + private final org.ccsds.moims.mo.mal.consumer.MALConsumer consumer; + + /** + * Wraps a MALconsumer connection with service specific methods that map from + * the high level service API to the generic MAL API. + * + * @param consumer consumer The MALConsumer to use in this stub. + */ + public ProductRetrievalStub(org.ccsds.moims.mo.mal.consumer.MALConsumer consumer) { + this.consumer = consumer; + } + + /** + * Returns the internal MAL consumer object used for sending of messages from + * this interface. + * + * @return The MAL consumer object. + */ + public org.ccsds.moims.mo.mal.consumer.MALConsumer getConsumer() { + return consumer; + } + + /** + * The listProducts operation lists the available products for a selected + * product filter and optionally also for a selected creation date and for + * a selected content date time window. + * + * @param productFilter The product filter used to refine the selection of products. + * @param creationDate The time window used to filter products based on their creation date. + * @param contentDate The time window used to filter products based on their content creation period. + * @return The return value of the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mpd.structures.ProductMetadataList listProducts(org.ccsds.moims.mo.mpd.structures.ProductFilter productFilter, + org.ccsds.moims.mo.mpd.structures.TimeWindow creationDate, + org.ccsds.moims.mo.mpd.structures.TimeWindow contentDate) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + org.ccsds.moims.mo.mal.transport.MALMessageBody body = consumer.request(org.ccsds.moims.mo.mpd.productretrieval.ProductRetrievalServiceInfo.LISTPRODUCTS_OP, productFilter, creationDate, contentDate); + Object body0 = (Object) body.getBodyElement(0, new org.ccsds.moims.mo.mpd.structures.ProductMetadataList()); + return (org.ccsds.moims.mo.mpd.structures.ProductMetadataList) body0; + } + + /** + * Asynchronous version of method listProducts. + * + * @param productFilter The product filter used to refine the selection of products. + * @param creationDate The time window used to filter products based on their creation date. + * @param contentDate The time window used to filter products based on their content creation period. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncListProducts(org.ccsds.moims.mo.mpd.structures.ProductFilter productFilter, + org.ccsds.moims.mo.mpd.structures.TimeWindow creationDate, + org.ccsds.moims.mo.mpd.structures.TimeWindow contentDate, + org.ccsds.moims.mo.mpd.productretrieval.consumer.ProductRetrievalAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncRequest(org.ccsds.moims.mo.mpd.productretrieval.ProductRetrievalServiceInfo.LISTPRODUCTS_OP, adapter, productFilter, creationDate, contentDate); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueListProducts(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mpd.productretrieval.consumer.ProductRetrievalAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mpd.productretrieval.ProductRetrievalServiceInfo.LISTPRODUCTS_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The getProducts operation retrieves the selected mission data products + * from the provider. + * + * @param productRefs The references to the products to be retrieved. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void getProducts(org.ccsds.moims.mo.mal.structures.ObjectRefList productRefs, + org.ccsds.moims.mo.mpd.productretrieval.consumer.ProductRetrievalAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.progress(org.ccsds.moims.mo.mpd.productretrieval.ProductRetrievalServiceInfo.GETPRODUCTS_OP, adapter, productRefs); + } + + /** + * Asynchronous version of method getProducts. + * + * @param productRefs The references to the products to be retrieved. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncGetProducts(org.ccsds.moims.mo.mal.structures.ObjectRefList productRefs, + org.ccsds.moims.mo.mpd.productretrieval.consumer.ProductRetrievalAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncProgress(org.ccsds.moims.mo.mpd.productretrieval.ProductRetrievalServiceInfo.GETPRODUCTS_OP, adapter, productRefs); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueGetProducts(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mpd.productretrieval.consumer.ProductRetrievalAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mpd.productretrieval.ProductRetrievalServiceInfo.GETPRODUCTS_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + + /** + * The deliverProductFiles operation allows consumers to instruct the provider + * to initiate a remote file transfer delivery of the selected mission data + * products to a specified target. + * + * @param productRefs The references to the products to be delivered. + * @param deliverTo The location's URI where the mission data product must be delivered. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void deliverProductFiles(org.ccsds.moims.mo.mal.structures.ObjectRefList productRefs, + org.ccsds.moims.mo.mal.structures.URI deliverTo, + org.ccsds.moims.mo.mpd.productretrieval.consumer.ProductRetrievalAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.progress(org.ccsds.moims.mo.mpd.productretrieval.ProductRetrievalServiceInfo.DELIVERPRODUCTFILES_OP, adapter, productRefs, deliverTo); + } + + /** + * Asynchronous version of method deliverProductFiles. + * + * @param productRefs The references to the products to be delivered. + * @param deliverTo The location's URI where the mission data product must be delivered. + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @return the MAL message sent to initiate the interaction + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage asyncDeliverProductFiles(org.ccsds.moims.mo.mal.structures.ObjectRefList productRefs, + org.ccsds.moims.mo.mal.structures.URI deliverTo, + org.ccsds.moims.mo.mpd.productretrieval.consumer.ProductRetrievalAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return consumer.asyncProgress(org.ccsds.moims.mo.mpd.productretrieval.ProductRetrievalServiceInfo.DELIVERPRODUCTFILES_OP, adapter, productRefs, deliverTo); + } + + /** + * Continues a previously started interaction. + * + * @param lastInteractionStage lastInteractionStage The last stage of the interaction to continue + * @param initiationTimestamp initiationTimestamp Timestamp of the interaction initiation message + * @param transactionId transactionId Transaction identifier of the interaction to continue + * @param adapter adapter Listener in charge of receiving the messages from the service provider + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public void continueDeliverProductFiles(org.ccsds.moims.mo.mal.structures.UOctet lastInteractionStage, + org.ccsds.moims.mo.mal.structures.Time initiationTimestamp, + Long transactionId, + org.ccsds.moims.mo.mpd.productretrieval.consumer.ProductRetrievalAdapter adapter) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + consumer.continueInteraction(org.ccsds.moims.mo.mpd.productretrieval.ProductRetrievalServiceInfo.DELIVERPRODUCTFILES_OP, lastInteractionStage, initiationTimestamp, transactionId, adapter); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productretrieval/consumer/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productretrieval/consumer/package-info.java new file mode 100644 index 00000000..8adaaef4 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productretrieval/consumer/package-info.java @@ -0,0 +1,4 @@ +/** + * Package containing the consumer stubs for the ProductRetrieval service. +*/ +package org.ccsds.moims.mo.mpd.productretrieval.consumer; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productretrieval/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productretrieval/package-info.java new file mode 100644 index 00000000..c7d6902c --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productretrieval/package-info.java @@ -0,0 +1,5 @@ +/** + * The Product Retrieval Service allows browsing and retrieval of existing + * products. +*/ +package org.ccsds.moims.mo.mpd.productretrieval; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productretrieval/provider/DeliverProductFilesInteraction.java b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productretrieval/provider/DeliverProductFilesInteraction.java new file mode 100644 index 00000000..e6d17968 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productretrieval/provider/DeliverProductFilesInteraction.java @@ -0,0 +1,96 @@ +package org.ccsds.moims.mo.mpd.productretrieval.provider; + +/** + * Provider PROGRESS interaction class for ProductRetrieval::deliverProductFiles + * operation. + */ +public class DeliverProductFilesInteraction { + + /** + * The interaction field. + */ + private org.ccsds.moims.mo.mal.provider.MALProgress interaction; + + /** + * Wraps the provided MAL interaction object with methods for sending responses + * to an PROGRESS interaction from a provider. + * + * @param interaction The MAL interaction action object to use. + */ + public DeliverProductFilesInteraction(org.ccsds.moims.mo.mal.provider.MALProgress interaction) { + this.interaction = interaction; + } + + /** + * Returns the MAL interaction object used for returning messages from the + * provider. + * + * @return The MAL interaction object provided in the constructor + */ + public org.ccsds.moims.mo.mal.provider.MALProgress getInteraction() { + return interaction; + } + + /** + * Sends a PROGRESS acknowledge to the consumer. + * + * @return Returns the MAL message created by the acknowledge + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage sendAcknowledgement() throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return interaction.sendAcknowledgement((Object[]) null); + } + + /** + * Sends a PROGRESS update to the consumer. + * + * @param metadata The metadata of the transferred mission data product(s). + * @param filename The filename of the transferred mission data product(s). + * @param success The completion status of the remote file transfer. + * @return Returns the MAL message created by the update + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage sendUpdate(org.ccsds.moims.mo.mpd.structures.ProductMetadata metadata, + String filename, + Boolean success) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return interaction.sendUpdate(metadata, (filename == null) ? null : new org.ccsds.moims.mo.mal.structures.Union(filename), (success == null) ? null : new org.ccsds.moims.mo.mal.structures.Union(success)); + } + + /** + * Sends a PROGRESS response to the consumer. + * + * @return Returns the MAL message created by the response + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage sendResponse() throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return interaction.sendResponse((Object[]) null); + } + + /** + * Sends an error to the consumer. + * + * @param error error The MAL error to send to the consumer. + * @return Returns the MAL message created by the error + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage sendError(org.ccsds.moims.mo.mal.MOErrorException error) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return interaction.sendError(error); + } + + /** + * Sends an update error to the consumer. + * + * @param error error The MAL error to send to the consumer. + * @return Returns the MAL message created by the error + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage sendUpdateError(org.ccsds.moims.mo.mal.MOErrorException error) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return interaction.sendUpdateError(error); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productretrieval/provider/GetProductsInteraction.java b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productretrieval/provider/GetProductsInteraction.java new file mode 100644 index 00000000..a1639ab1 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productretrieval/provider/GetProductsInteraction.java @@ -0,0 +1,91 @@ +package org.ccsds.moims.mo.mpd.productretrieval.provider; + +/** + * Provider PROGRESS interaction class for ProductRetrieval::getProducts operation. + */ +public class GetProductsInteraction { + + /** + * The interaction field. + */ + private org.ccsds.moims.mo.mal.provider.MALProgress interaction; + + /** + * Wraps the provided MAL interaction object with methods for sending responses + * to an PROGRESS interaction from a provider. + * + * @param interaction The MAL interaction action object to use. + */ + public GetProductsInteraction(org.ccsds.moims.mo.mal.provider.MALProgress interaction) { + this.interaction = interaction; + } + + /** + * Returns the MAL interaction object used for returning messages from the + * provider. + * + * @return The MAL interaction object provided in the constructor + */ + public org.ccsds.moims.mo.mal.provider.MALProgress getInteraction() { + return interaction; + } + + /** + * Sends a PROGRESS acknowledge to the consumer. + * + * @return Returns the MAL message created by the acknowledge + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage sendAcknowledgement() throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return interaction.sendAcknowledgement((Object[]) null); + } + + /** + * Sends a PROGRESS update to the consumer. + * + * @param product The selected mission data product(s). + * @return Returns the MAL message created by the update + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage sendUpdate(org.ccsds.moims.mo.mpd.structures.Product product) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return interaction.sendUpdate(product); + } + + /** + * Sends a PROGRESS response to the consumer. + * + * @return Returns the MAL message created by the response + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage sendResponse() throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return interaction.sendResponse((Object[]) null); + } + + /** + * Sends an error to the consumer. + * + * @param error error The MAL error to send to the consumer. + * @return Returns the MAL message created by the error + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage sendError(org.ccsds.moims.mo.mal.MOErrorException error) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return interaction.sendError(error); + } + + /** + * Sends an update error to the consumer. + * + * @param error error The MAL error to send to the consumer. + * @return Returns the MAL message created by the error + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + public org.ccsds.moims.mo.mal.transport.MALMessage sendUpdateError(org.ccsds.moims.mo.mal.MOErrorException error) throws org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException { + return interaction.sendUpdateError(error); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productretrieval/provider/ProductRetrievalHandler.java b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productretrieval/provider/ProductRetrievalHandler.java new file mode 100644 index 00000000..359ff2fe --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productretrieval/provider/ProductRetrievalHandler.java @@ -0,0 +1,57 @@ +package org.ccsds.moims.mo.mpd.productretrieval.provider; + +/** + * Interface that providers of the ProductRetrieval service must implement + * to handle the operations of that service. + */ +public interface ProductRetrievalHandler { + + /** + * Implements the operation listProducts. + * + * @param productFilter The product filter used to refine the selection of products. + * @param creationDate The time window used to filter products based on their creation date. + * @param contentDate The time window used to filter products based on their content creation period. + * @param interaction The MAL object representing the interaction in the provider. + * @return The return value of the operation + * @throws org.ccsds.moims.mo.mpd.InvalidException When a field in the message contains an invalid value. + * @throws org.ccsds.moims.mo.mpd.TooManyException When the list cannot be returned due to too many entries. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + org.ccsds.moims.mo.mpd.structures.ProductMetadataList listProducts(org.ccsds.moims.mo.mpd.structures.ProductFilter productFilter, + org.ccsds.moims.mo.mpd.structures.TimeWindow creationDate, + org.ccsds.moims.mo.mpd.structures.TimeWindow contentDate, + org.ccsds.moims.mo.mal.provider.MALInteraction interaction) throws org.ccsds.moims.mo.mpd.InvalidException, org.ccsds.moims.mo.mpd.TooManyException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation getProducts. + * + * @param productRefs The references to the products to be retrieved. + * @param interaction The MAL object representing the interaction in the provider. + * @throws org.ccsds.moims.mo.mpd.UnknownException When one or more of the productRefs was not found. + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + void getProducts(org.ccsds.moims.mo.mal.structures.ObjectRefList productRefs, + org.ccsds.moims.mo.mpd.productretrieval.provider.GetProductsInteraction interaction) throws org.ccsds.moims.mo.mpd.UnknownException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Implements the operation deliverProductFiles. + * + * @param productRefs The references to the products to be delivered. + * @param deliverTo The location's URI where the mission data product must be delivered. + * @param interaction The MAL object representing the interaction in the provider. + * @throws org.ccsds.moims.mo.mpd.UnknownException When one or more of the productRefs was not found. + * @throws org.ccsds.moims.mo.mpd.DeliveryFailedException When the provider is unable to reach the selected URI (e.g. unreachable target machine, wrong credentials, revoked access, etc). + * @throws org.ccsds.moims.mo.mal.MALInteractionException if there is a problem during the interaction as defined by the MAL specification. + * @throws org.ccsds.moims.mo.mal.MALException if there is an implementation exception + */ + void deliverProductFiles(org.ccsds.moims.mo.mal.structures.ObjectRefList productRefs, + org.ccsds.moims.mo.mal.structures.URI deliverTo, + org.ccsds.moims.mo.mpd.productretrieval.provider.DeliverProductFilesInteraction interaction) throws org.ccsds.moims.mo.mpd.UnknownException, org.ccsds.moims.mo.mpd.DeliveryFailedException, org.ccsds.moims.mo.mal.MALInteractionException, org.ccsds.moims.mo.mal.MALException; + /** + * Sets the skeleton to be used for creation of publishers. + * + * @param skeleton The skeleton to be used. + */ + void setSkeleton(org.ccsds.moims.mo.mpd.productretrieval.provider.ProductRetrievalSkeleton skeleton); +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productretrieval/provider/ProductRetrievalInheritanceSkeleton.java b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productretrieval/provider/ProductRetrievalInheritanceSkeleton.java new file mode 100644 index 00000000..8f6eb52f --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productretrieval/provider/ProductRetrievalInheritanceSkeleton.java @@ -0,0 +1,124 @@ +package org.ccsds.moims.mo.mpd.productretrieval.provider; + +/** + * Provider Inheritance skeleton for ProductRetrievalInheritanceSkeleton service. + */ +public abstract class ProductRetrievalInheritanceSkeleton implements org.ccsds.moims.mo.mal.provider.MALInteractionHandler, org.ccsds.moims.mo.mpd.productretrieval.provider.ProductRetrievalSkeleton, org.ccsds.moims.mo.mpd.productretrieval.provider.ProductRetrievalHandler { + + /** + * The providerSet field. + */ + private org.ccsds.moims.mo.mal.provider.MALProviderSet providerSet = new org.ccsds.moims.mo.mal.provider.MALProviderSet(org.ccsds.moims.mo.mpd.productretrieval.ProductRetrievalHelper.PRODUCTRETRIEVAL_SERVICE); + + /** + * Returns the connection object for this provider. + * + * @return the connection object for this provider + * @throws java.io.IOException if the method was not implemented yet. + */ + public org.ccsds.moims.mo.mal.helpertools.connections.ConnectionProvider getConnection() throws java.io.IOException { + throw new java.io.IOException("This method needs to be overridden!"); + } + + @Override + public void setSkeleton(org.ccsds.moims.mo.mpd.productretrieval.provider.ProductRetrievalSkeleton skeleton) { + // Not used in the inheritance pattern (the skeleton is 'this'); + } + + @Override + public void malInitialize(org.ccsds.moims.mo.mal.provider.MALProvider provider) throws org.ccsds.moims.mo.mal.MALException { + providerSet.addProvider(provider); + } + + @Override + public void malFinalize(org.ccsds.moims.mo.mal.provider.MALProvider provider) throws org.ccsds.moims.mo.mal.MALException { + providerSet.removeProvider(provider); + } + + @Override + public void handleSend(org.ccsds.moims.mo.mal.provider.MALInteraction interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + switch (opNumber) { + default: + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } + + @Override + public void handleSubmit(org.ccsds.moims.mo.mal.provider.MALSubmit interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + switch (opNumber) { + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } + + @Override + public void handleRequest(org.ccsds.moims.mo.mal.provider.MALRequest interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + try { + switch (opNumber) { + case org.ccsds.moims.mo.mpd.productretrieval.ProductRetrievalServiceInfo._LISTPRODUCTS_OP_NUMBER: + interaction.sendResponse(listProducts((org.ccsds.moims.mo.mpd.structures.ProductFilter) body.getBodyElement(0, new org.ccsds.moims.mo.mpd.structures.ProductFilter()), + (org.ccsds.moims.mo.mpd.structures.TimeWindow) body.getBodyElement(1, new org.ccsds.moims.mo.mpd.structures.TimeWindow()), + (org.ccsds.moims.mo.mpd.structures.TimeWindow) body.getBodyElement(2, new org.ccsds.moims.mo.mpd.structures.TimeWindow()), + interaction)); + break; + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } catch (org.ccsds.moims.mo.mal.MOErrorException error) { + throw new org.ccsds.moims.mo.mal.MALInteractionException(error); + } + } + + @Override + public void handleInvoke(org.ccsds.moims.mo.mal.provider.MALInvoke interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + switch (opNumber) { + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } + + @Override + public void handleProgress(org.ccsds.moims.mo.mal.provider.MALProgress interaction, + org.ccsds.moims.mo.mal.transport.MALMessageBody body) throws org.ccsds.moims.mo.mal.MALException, org.ccsds.moims.mo.mal.MALInteractionException { + int opNumber = interaction.getOperation().getNumber().getValue(); + try { + switch (opNumber) { + case org.ccsds.moims.mo.mpd.productretrieval.ProductRetrievalServiceInfo._GETPRODUCTS_OP_NUMBER: + getProducts((org.ccsds.moims.mo.mal.structures.ObjectRefList) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.ObjectRefList()), + new GetProductsInteraction(interaction)); + break; + case org.ccsds.moims.mo.mpd.productretrieval.ProductRetrievalServiceInfo._DELIVERPRODUCTFILES_OP_NUMBER: + deliverProductFiles((org.ccsds.moims.mo.mal.structures.ObjectRefList) body.getBodyElement(0, new org.ccsds.moims.mo.mal.structures.ObjectRefList()), + (org.ccsds.moims.mo.mal.structures.URI) body.getBodyElement(1, new org.ccsds.moims.mo.mal.structures.URI()), + new DeliverProductFilesInteraction(interaction)); + break; + default: + interaction.sendError(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + throw new org.ccsds.moims.mo.mal.MALInteractionException(new org.ccsds.moims.mo.mal.UnsupportedOperationException( + org.ccsds.moims.mo.mal.provider.MALInteractionHandler.ERROR_MSG_UNSUPPORTED + opNumber)); + } + } catch (org.ccsds.moims.mo.mal.MOErrorException error) { + throw new org.ccsds.moims.mo.mal.MALInteractionException(error); + } + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productretrieval/provider/ProductRetrievalSkeleton.java b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productretrieval/provider/ProductRetrievalSkeleton.java new file mode 100644 index 00000000..8d89b48e --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productretrieval/provider/ProductRetrievalSkeleton.java @@ -0,0 +1,8 @@ +package org.ccsds.moims.mo.mpd.productretrieval.provider; + +/** + * The skeleton interface for the ProductRetrieval service. + */ +public interface ProductRetrievalSkeleton { + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productretrieval/provider/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productretrieval/provider/package-info.java new file mode 100644 index 00000000..eba47e60 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/productretrieval/provider/package-info.java @@ -0,0 +1,4 @@ +/** + * Package containing the provider skeletons for the ProductRetrieval service. +*/ +package org.ccsds.moims.mo.mpd.productretrieval.provider; diff --git a/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/AttributeDef.java b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/AttributeDef.java new file mode 100644 index 00000000..ae383e89 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/AttributeDef.java @@ -0,0 +1,215 @@ +package org.ccsds.moims.mo.mpd.structures; + +/** + * An AttributeDef specifies a metadata attribute in terms of its name, attribute + * type, optional units, and a free text description. Note that as AttributeDef + * is only used in the context of ProductType. + */ +public final class AttributeDef implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 2533274807173128L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 2533274807173128L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * The name to the metadata attribute. + */ + private org.ccsds.moims.mo.mal.structures.Identifier name; + + /** + * Specifies the MAL attribute type of the metadata attribute. + */ + private org.ccsds.moims.mo.mal.structures.AttributeType attributeType; + + /** + * The units associated with the metadata attribute (optional). + */ + private String units; + + /** + * The description of the metadata attribute (optional). + */ + private String description; + + /** + * Default constructor for AttributeDef. + * + */ + public AttributeDef() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param name The name to the metadata attribute. + * @param attributeType Specifies the MAL attribute type of the metadata attribute. + * @param units The units associated with the metadata attribute (optional). + * @param description The description of the metadata attribute (optional). + */ + public AttributeDef(org.ccsds.moims.mo.mal.structures.Identifier name, + org.ccsds.moims.mo.mal.structures.AttributeType attributeType, + String units, + String description) { + this.name = name; + this.attributeType = attributeType; + this.units = units; + this.description = description; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param name The name to the metadata attribute. + * @param attributeType Specifies the MAL attribute type of the metadata attribute. + */ + public AttributeDef(org.ccsds.moims.mo.mal.structures.Identifier name, + org.ccsds.moims.mo.mal.structures.AttributeType attributeType) { + this.name = name; + this.attributeType = attributeType; + this.units = null; + this.description = null; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mpd.structures.AttributeDef(); + } + + /** + * Returns the field name. + * + * @return The field name + */ + public org.ccsds.moims.mo.mal.structures.Identifier getName() { + return name; + } + + /** + * Returns the field attributeType. + * + * @return The field attributeType + */ + public org.ccsds.moims.mo.mal.structures.AttributeType getAttributeType() { + return attributeType; + } + + /** + * Returns the field units. + * + * @return The field units + */ + public String getUnits() { + return units; + } + + /** + * Returns the field description. + * + * @return The field description + */ + public String getDescription() { + return description; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof AttributeDef) { + AttributeDef other = (AttributeDef) obj; + if (name == null) { + if (other.name != null) { + return false; + } + } else { + if (! name.equals(other.name)) { + return false; + } + } + if (attributeType == null) { + if (other.attributeType != null) { + return false; + } + } else { + if (! attributeType.equals(other.attributeType)) { + return false; + } + } + if (units == null) { + if (other.units != null) { + return false; + } + } else { + if (! units.equals(other.units)) { + return false; + } + } + if (description == null) { + if (other.description != null) { + return false; + } + } else { + if (! description.equals(other.description)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (name != null ? name.hashCode() : 0); + hash = 83 * hash + (attributeType != null ? attributeType.hashCode() : 0); + hash = 83 * hash + (units != null ? units.hashCode() : 0); + hash = 83 * hash + (description != null ? description.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(AttributeDef: "); + buf.append("name=").append(name); + buf.append(", attributeType=").append(attributeType); + buf.append(", units=").append(units); + buf.append(", description=").append(description); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (name == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'name' cannot be null!"); + } + if (attributeType == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'attributeType' cannot be null!"); + } + encoder.encodeIdentifier(name); + encoder.encodeElement(attributeType); + encoder.encodeNullableString(units); + encoder.encodeNullableString(description); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + name = decoder.decodeIdentifier(); + attributeType = (org.ccsds.moims.mo.mal.structures.AttributeType) decoder.decodeElement(org.ccsds.moims.mo.mal.structures.AttributeType.BLOB); + units = decoder.decodeNullableString(); + description = decoder.decodeNullableString(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/AttributeDefList.java b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/AttributeDefList.java new file mode 100644 index 00000000..dfc99836 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/AttributeDefList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mpd.structures; + +/** + * List class for AttributeDef. + */ +public final class AttributeDefList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 2533274823950328L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 2533274823950328L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for AttributeDefList. + * + */ + public AttributeDefList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public AttributeDefList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public AttributeDefList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mpd.structures.AttributeDef element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mpd.structures.AttributeDef element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new AttributeDefList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mpd.structures.AttributeDef(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/AttributeFilter.java b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/AttributeFilter.java new file mode 100644 index 00000000..261ef23a --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/AttributeFilter.java @@ -0,0 +1,124 @@ +package org.ccsds.moims.mo.mpd.structures; + +/** + * An AttributeFilter is an abstract data structure that enables three types + * of filters: ValueRange, ValueSet, and StringPattern. It is used in the + * context of selecting a subset of mission data products. + */ +public abstract class AttributeFilter implements org.ccsds.moims.mo.mal.structures.Composite { + + /** + * The name of the metadata attribute to filter. If the product metadata being + * evaluated does not contain an attribute with this name, then the evaluation + * of the filter shall be false. + */ + private org.ccsds.moims.mo.mal.structures.Identifier name; + + /** + * Indicates whether the filter is to include [TRUE] or exclude [FALSE] attribute + * values that match the filter. + */ + private Boolean include; + + /** + * Default constructor for AttributeFilter. + * + */ + public AttributeFilter() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param name The name of the metadata attribute to filter. If the product metadata being evaluated does not contain an attribute with this name, then the evaluation of the filter shall be false. + * @param include Indicates whether the filter is to include [TRUE] or exclude [FALSE] attribute values that match the filter. + */ + public AttributeFilter(org.ccsds.moims.mo.mal.structures.Identifier name, + Boolean include) { + this.name = name; + this.include = include; + } + + /** + * Returns the field name. + * + * @return The field name + */ + public org.ccsds.moims.mo.mal.structures.Identifier getName() { + return name; + } + + /** + * Returns the field include. + * + * @return The field include + */ + public Boolean getInclude() { + return include; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof AttributeFilter) { + AttributeFilter other = (AttributeFilter) obj; + if (name == null) { + if (other.name != null) { + return false; + } + } else { + if (! name.equals(other.name)) { + return false; + } + } + if (include == null) { + if (other.include != null) { + return false; + } + } else { + if (! include.equals(other.include)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (name != null ? name.hashCode() : 0); + hash = 83 * hash + (include != null ? include.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(AttributeFilter: "); + buf.append("name=").append(name); + buf.append(", include=").append(include); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (name == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'name' cannot be null!"); + } + if (include == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'include' cannot be null!"); + } + encoder.encodeIdentifier(name); + encoder.encodeBoolean(include); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + name = decoder.decodeIdentifier(); + include = decoder.decodeBoolean(); + return this; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/AttributeFilterList.java b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/AttributeFilterList.java new file mode 100644 index 00000000..23546657 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/AttributeFilterList.java @@ -0,0 +1,23 @@ +package org.ccsds.moims.mo.mpd.structures; + +/** + * List class for AttributeFilter. + */ +public final class AttributeFilterList extends org.ccsds.moims.mo.mal.structures.HeterogeneousList { + + /** + * Default constructor for AttributeFilterList. + * + */ + public AttributeFilterList() { + } + + @Override + public boolean add(org.ccsds.moims.mo.mal.structures.Element element) { + if (element != null && !(element instanceof AttributeFilter)) { + throw new java.lang.ClassCastException("The added element does not extend the type: AttributeFilter"); + } + return super.add(element); + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/DeliveryMethodEnum.java b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/DeliveryMethodEnum.java new file mode 100644 index 00000000..be220f7d --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/DeliveryMethodEnum.java @@ -0,0 +1,134 @@ +package org.ccsds.moims.mo.mpd.structures; + +/** + * Enumeration class for DeliveryMethodEnum. + */ +public final class DeliveryMethodEnum extends org.ccsds.moims.mo.mal.structures.Enumeration { + + private static final long serialVersionUID = 2533274807173132L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 2533274807173132L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Enumeration value for SERVICE_COMPLETE. + */ + public static final int SERVICE_COMPLETE_VALUE = 1; + + /** + * Enumeration singleton for value SERVICE_COMPLETE. + */ + public static final org.ccsds.moims.mo.mpd.structures.DeliveryMethodEnum SERVICE_COMPLETE = new org.ccsds.moims.mo.mpd.structures.DeliveryMethodEnum(org.ccsds.moims.mo.mpd.structures.DeliveryMethodEnum.SERVICE_COMPLETE_VALUE); + + /** + * Enumeration value for SERVICE_JUST_METADATA. + */ + public static final int SERVICE_JUST_METADATA_VALUE = 2; + + /** + * Enumeration singleton for value SERVICE_JUST_METADATA. + */ + public static final org.ccsds.moims.mo.mpd.structures.DeliveryMethodEnum SERVICE_JUST_METADATA = new org.ccsds.moims.mo.mpd.structures.DeliveryMethodEnum(org.ccsds.moims.mo.mpd.structures.DeliveryMethodEnum.SERVICE_JUST_METADATA_VALUE); + + /** + * Enumeration value for FILETRANSFER. + */ + public static final int FILETRANSFER_VALUE = 3; + + /** + * Enumeration singleton for value FILETRANSFER. + */ + public static final org.ccsds.moims.mo.mpd.structures.DeliveryMethodEnum FILETRANSFER = new org.ccsds.moims.mo.mpd.structures.DeliveryMethodEnum(org.ccsds.moims.mo.mpd.structures.DeliveryMethodEnum.FILETRANSFER_VALUE); + + /** + * Set of enumeration instances. + */ + private static final org.ccsds.moims.mo.mpd.structures.DeliveryMethodEnum[] _ENUMERATIONS = { + SERVICE_COMPLETE, SERVICE_JUST_METADATA, FILETRANSFER}; + + /** + * The DeliveryMethodEnum enumeration defines the delivery method to be used for delivery of mission data products. + */ + public DeliveryMethodEnum() { + super(-1); + } + + /** + * The DeliveryMethodEnum enumeration defines the delivery method to be used + * for delivery of mission data products. + * + * @param value The value of the Enumeration. + */ + public DeliveryMethodEnum(int value) { + super(value); + } + + @Override + public String toString() { + switch (getValue()) { + case SERVICE_COMPLETE_VALUE: + return "SERVICE_COMPLETE"; + case SERVICE_JUST_METADATA_VALUE: + return "SERVICE_JUST_METADATA"; + case FILETRANSFER_VALUE: + return "FILETRANSFER"; + default: + throw new RuntimeException("Unknown ordinal!"); + } + } + + /** + * Returns the enumeration element represented by the supplied string, or + * null if not matched. + * + * @param s s The string to search for. + * @return The matched enumeration element, or null if not matched. + */ + public static org.ccsds.moims.mo.mpd.structures.DeliveryMethodEnum fromString(String s) { + switch (s) { + case "SERVICE_COMPLETE": + return DeliveryMethodEnum.SERVICE_COMPLETE; + case "SERVICE_JUST_METADATA": + return DeliveryMethodEnum.SERVICE_JUST_METADATA; + case "FILETRANSFER": + return DeliveryMethodEnum.FILETRANSFER; + default: + throw new RuntimeException("Unknown Enumeration for the provided string: " + s); + } + } + + @Override + public org.ccsds.moims.mo.mal.structures.Enumeration fromValue(Integer value) { + switch (value) { + case SERVICE_COMPLETE_VALUE: + return DeliveryMethodEnum.SERVICE_COMPLETE; + case SERVICE_JUST_METADATA_VALUE: + return DeliveryMethodEnum.SERVICE_JUST_METADATA; + case FILETRANSFER_VALUE: + return DeliveryMethodEnum.FILETRANSFER; + default: + throw new RuntimeException("Unknown Enumeration for the provided value: " + value); + } + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return _ENUMERATIONS[0]; + } + + @Override + public int getEnumSize() { + return 3; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/DeliveryMethodEnumList.java b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/DeliveryMethodEnumList.java new file mode 100644 index 00000000..f78e2a52 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/DeliveryMethodEnumList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mpd.structures; + +/** + * List class for DeliveryMethodEnum. + */ +public final class DeliveryMethodEnumList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 2533274823950324L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 2533274823950324L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for DeliveryMethodEnumList. + * + */ + public DeliveryMethodEnumList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public DeliveryMethodEnumList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public DeliveryMethodEnumList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mpd.structures.DeliveryMethodEnum element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mpd.structures.DeliveryMethodEnum element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new DeliveryMethodEnumList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return org.ccsds.moims.mo.mpd.structures.DeliveryMethodEnum.SERVICE_COMPLETE; + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/FileMetadata.java b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/FileMetadata.java new file mode 100644 index 00000000..629ce53a --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/FileMetadata.java @@ -0,0 +1,172 @@ +package org.ccsds.moims.mo.mpd.structures; + +/** + * The FileMetadata contains specific metadata for files. + */ +public final class FileMetadata implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 2533274807173125L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 2533274807173125L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * The latest update date. + */ + private org.ccsds.moims.mo.mal.structures.Time updateDate; + + /** + * The MIME type. + */ + private org.ccsds.moims.mo.mal.structures.Identifier mime; + + /** + * The size of the file in bytes. + */ + private Long fileSize; + + /** + * Default constructor for FileMetadata. + * + */ + public FileMetadata() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param updateDate The latest update date. + * @param mime The MIME type. + * @param fileSize The size of the file in bytes. + */ + public FileMetadata(org.ccsds.moims.mo.mal.structures.Time updateDate, + org.ccsds.moims.mo.mal.structures.Identifier mime, + Long fileSize) { + this.updateDate = updateDate; + this.mime = mime; + this.fileSize = fileSize; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mpd.structures.FileMetadata(); + } + + /** + * Returns the field updateDate. + * + * @return The field updateDate + */ + public org.ccsds.moims.mo.mal.structures.Time getUpdateDate() { + return updateDate; + } + + /** + * Returns the field mime. + * + * @return The field mime + */ + public org.ccsds.moims.mo.mal.structures.Identifier getMime() { + return mime; + } + + /** + * Returns the field fileSize. + * + * @return The field fileSize + */ + public Long getFileSize() { + return fileSize; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof FileMetadata) { + FileMetadata other = (FileMetadata) obj; + if (updateDate == null) { + if (other.updateDate != null) { + return false; + } + } else { + if (! updateDate.equals(other.updateDate)) { + return false; + } + } + if (mime == null) { + if (other.mime != null) { + return false; + } + } else { + if (! mime.equals(other.mime)) { + return false; + } + } + if (fileSize == null) { + if (other.fileSize != null) { + return false; + } + } else { + if (! fileSize.equals(other.fileSize)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (updateDate != null ? updateDate.hashCode() : 0); + hash = 83 * hash + (mime != null ? mime.hashCode() : 0); + hash = 83 * hash + (fileSize != null ? fileSize.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(FileMetadata: "); + buf.append("updateDate=").append(updateDate); + buf.append(", mime=").append(mime); + buf.append(", fileSize=").append(fileSize); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (updateDate == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'updateDate' cannot be null!"); + } + if (mime == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'mime' cannot be null!"); + } + if (fileSize == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'fileSize' cannot be null!"); + } + encoder.encodeTime(updateDate); + encoder.encodeIdentifier(mime); + encoder.encodeLong(fileSize); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + updateDate = decoder.decodeTime(); + mime = decoder.decodeIdentifier(); + fileSize = decoder.decodeLong(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/FileMetadataList.java b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/FileMetadataList.java new file mode 100644 index 00000000..66fe25ce --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/FileMetadataList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mpd.structures; + +/** + * List class for FileMetadata. + */ +public final class FileMetadataList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 2533274823950331L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 2533274823950331L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for FileMetadataList. + * + */ + public FileMetadataList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public FileMetadataList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public FileMetadataList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mpd.structures.FileMetadata element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mpd.structures.FileMetadata element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new FileMetadataList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mpd.structures.FileMetadata(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/Product.java b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/Product.java new file mode 100644 index 00000000..17c36608 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/Product.java @@ -0,0 +1,150 @@ +package org.ccsds.moims.mo.mpd.structures; + +/** + * A Product is an MO object that corresponds to a specific occurrence of + * a generated mission data product. + */ +public final class Product extends org.ccsds.moims.mo.mal.structures.MOObject { + + private static final long serialVersionUID = 2533274807173121L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 2533274807173121L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * The product metadata of the mission data product. The productRef field + * inside the productMetadata may be null when used in this context. + */ + private org.ccsds.moims.mo.mpd.structures.ProductMetadata productMetadata; + + /** + * The product body of the mission data product. + */ + private org.ccsds.moims.mo.mal.structures.Blob productBody; + + /** + * Default constructor for Product. + * + */ + public Product() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param objectIdentity The identity of the MO Object. + * @param productMetadata The product metadata of the mission data product. The productRef field inside the productMetadata may be null when used in this context. + * @param productBody The product body of the mission data product. + */ + public Product(org.ccsds.moims.mo.mal.structures.ObjectIdentity objectIdentity, + org.ccsds.moims.mo.mpd.structures.ProductMetadata productMetadata, + org.ccsds.moims.mo.mal.structures.Blob productBody) { + super(objectIdentity); + this.productMetadata = productMetadata; + this.productBody = productBody; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mpd.structures.Product(); + } + + /** + * Returns the field productMetadata. + * + * @return The field productMetadata + */ + public org.ccsds.moims.mo.mpd.structures.ProductMetadata getProductMetadata() { + return productMetadata; + } + + /** + * Returns the field productBody. + * + * @return The field productBody + */ + public org.ccsds.moims.mo.mal.structures.Blob getProductBody() { + return productBody; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Product) { + if (! super.equals(obj)) { + return false; + } + Product other = (Product) obj; + if (productMetadata == null) { + if (other.productMetadata != null) { + return false; + } + } else { + if (! productMetadata.equals(other.productMetadata)) { + return false; + } + } + if (productBody == null) { + if (other.productBody != null) { + return false; + } + } else { + if (! productBody.equals(other.productBody)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = super.hashCode(); + hash = 83 * hash + (productMetadata != null ? productMetadata.hashCode() : 0); + hash = 83 * hash + (productBody != null ? productBody.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(Product: "); + buf.append(super.toString()); + buf.append(", productMetadata=").append(productMetadata); + buf.append(", productBody=").append(productBody); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + super.encode(encoder); + if (productMetadata == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'productMetadata' cannot be null!"); + } + if (productBody == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'productBody' cannot be null!"); + } + encoder.encodeElement(productMetadata); + encoder.encodeBlob(productBody); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + super.decode(decoder); + productMetadata = (org.ccsds.moims.mo.mpd.structures.ProductMetadata) decoder.decodeElement(new org.ccsds.moims.mo.mpd.structures.ProductMetadata()); + productBody = decoder.decodeBlob(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/ProductFilter.java b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/ProductFilter.java new file mode 100644 index 00000000..1a523bbf --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/ProductFilter.java @@ -0,0 +1,210 @@ +package org.ccsds.moims.mo.mpd.structures; + +/** + * The ProductFilter is used in the context of standing orders and service + * operations requesting a filtered list of available products. It specifies + * a filter in terms of productType, domain, sources and metadata attribute + * values. To pass the filter, the product must satisfy all criteria specified: + * the productType, the domain, one of any listed source objects and all specified + * metadata attribute filters. If no filter is specified for source or attribute + * filters, then all products of the specified type pass the filter. A ProductFilter + * relates to a specific ProductType. Note that the domain filter relates + * to the domain of the product. The domain of a generic product type (for + * example an orbit file) may be defined at agency level to avoid the need + * to define new types for each mission, but the generated product will be + * associated with a specific mission domain. + */ +public final class ProductFilter implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 2533274807173126L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 2533274807173126L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * The name of the product type definition. + */ + private org.ccsds.moims.mo.mal.structures.Identifier productType; + + /** + * The domain to filter on. A wildcard may be used in order to select all + * possibilities within a sub-domain. + */ + private org.ccsds.moims.mo.mal.structures.IdentifierList domain; + + /** + * The set of sources associated with the products to filter on. If the product + * source matches at least one of the listed sources, then it passes the filter. + * If the sources field is set to NULL, then no filtering on the product source + * will be performed. + */ + private org.ccsds.moims.mo.mal.structures.IdentifierList sources; + + /** + * Set of attribute filters defining the desired values of product metadata + * attributes. If multiple attribute filters are defined, then the product + * metadata must match all (ANDed) specified criteria to pass the filter. + */ + private org.ccsds.moims.mo.mpd.structures.AttributeFilterList attributeFilter; + + /** + * Default constructor for ProductFilter. + * + */ + public ProductFilter() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param productType The name of the product type definition. + * @param domain The domain to filter on. A wildcard may be used in order to select all possibilities within a sub-domain. + * @param sources The set of sources associated with the products to filter on. If the product source matches at least one of the listed sources, then it passes the filter. If the sources field is set to NULL, then no filtering on the product source will be performed. + * @param attributeFilter Set of attribute filters defining the desired values of product metadata attributes. If multiple attribute filters are defined, then the product metadata must match all (ANDed) specified criteria to pass the filter. + */ + public ProductFilter(org.ccsds.moims.mo.mal.structures.Identifier productType, + org.ccsds.moims.mo.mal.structures.IdentifierList domain, + org.ccsds.moims.mo.mal.structures.IdentifierList sources, + org.ccsds.moims.mo.mpd.structures.AttributeFilterList attributeFilter) { + this.productType = productType; + this.domain = domain; + this.sources = sources; + this.attributeFilter = attributeFilter; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mpd.structures.ProductFilter(); + } + + /** + * Returns the field productType. + * + * @return The field productType + */ + public org.ccsds.moims.mo.mal.structures.Identifier getProductType() { + return productType; + } + + /** + * Returns the field domain. + * + * @return The field domain + */ + public org.ccsds.moims.mo.mal.structures.IdentifierList getDomain() { + return domain; + } + + /** + * Returns the field sources. + * + * @return The field sources + */ + public org.ccsds.moims.mo.mal.structures.IdentifierList getSources() { + return sources; + } + + /** + * Returns the field attributeFilter. + * + * @return The field attributeFilter + */ + public org.ccsds.moims.mo.mpd.structures.AttributeFilterList getAttributeFilter() { + return attributeFilter; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ProductFilter) { + ProductFilter other = (ProductFilter) obj; + if (productType == null) { + if (other.productType != null) { + return false; + } + } else { + if (! productType.equals(other.productType)) { + return false; + } + } + if (domain == null) { + if (other.domain != null) { + return false; + } + } else { + if (! domain.equals(other.domain)) { + return false; + } + } + if (sources == null) { + if (other.sources != null) { + return false; + } + } else { + if (! sources.equals(other.sources)) { + return false; + } + } + if (attributeFilter == null) { + if (other.attributeFilter != null) { + return false; + } + } else { + if (! attributeFilter.equals(other.attributeFilter)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (productType != null ? productType.hashCode() : 0); + hash = 83 * hash + (domain != null ? domain.hashCode() : 0); + hash = 83 * hash + (sources != null ? sources.hashCode() : 0); + hash = 83 * hash + (attributeFilter != null ? attributeFilter.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(ProductFilter: "); + buf.append("productType=").append(productType); + buf.append(", domain=").append(domain); + buf.append(", sources=").append(sources); + buf.append(", attributeFilter=").append(attributeFilter); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeNullableIdentifier(productType); + encoder.encodeNullableElement(domain); + encoder.encodeNullableElement(sources); + encoder.encodeNullableElement(attributeFilter); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + productType = decoder.decodeNullableIdentifier(); + domain = (org.ccsds.moims.mo.mal.structures.IdentifierList) decoder.decodeNullableElement(new org.ccsds.moims.mo.mal.structures.IdentifierList()); + sources = (org.ccsds.moims.mo.mal.structures.IdentifierList) decoder.decodeNullableElement(new org.ccsds.moims.mo.mal.structures.IdentifierList()); + attributeFilter = (org.ccsds.moims.mo.mpd.structures.AttributeFilterList) decoder.decodeNullableElement(new org.ccsds.moims.mo.mpd.structures.AttributeFilterList()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/ProductFilterList.java b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/ProductFilterList.java new file mode 100644 index 00000000..9f433dcc --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/ProductFilterList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mpd.structures; + +/** + * List class for ProductFilter. + */ +public final class ProductFilterList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 2533274823950330L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 2533274823950330L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for ProductFilterList. + * + */ + public ProductFilterList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public ProductFilterList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public ProductFilterList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mpd.structures.ProductFilter element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mpd.structures.ProductFilter element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new ProductFilterList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mpd.structures.ProductFilter(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/ProductList.java b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/ProductList.java new file mode 100644 index 00000000..6a5b2cd1 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/ProductList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mpd.structures; + +/** + * List class for Product. + */ +public final class ProductList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 2533274823950335L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 2533274823950335L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for ProductList. + * + */ + public ProductList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public ProductList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public ProductList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mpd.structures.Product element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mpd.structures.Product element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new ProductList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mpd.structures.Product(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/ProductMetadata.java b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/ProductMetadata.java new file mode 100644 index 00000000..4f6f63f0 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/ProductMetadata.java @@ -0,0 +1,415 @@ +package org.ccsds.moims.mo.mpd.structures; + +/** + * The ProductMetadata comprises the metadata of the product (without the + * product body) and is used when returning a list of available products for + * retrieval. A ProductMetadata is associated to a specific Product. + */ +public final class ProductMetadata implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 2533274807173124L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 2533274807173124L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * The product type definition. + */ + private org.ccsds.moims.mo.mpd.structures.ProductType productType; + + /** + * The reference to the Product. + */ + private org.ccsds.moims.mo.mal.structures.ObjectRef productRef; + + /** + * The time at which the product was generated. + */ + private org.ccsds.moims.mo.mal.structures.Time creationDate; + + /** + * The source that triggered the generation of the product. + */ + private org.ccsds.moims.mo.mal.structures.Identifier source; + + /** + * An external URI for the products to be retrieved. For example, this can + * be used for pulling a mission data product file via a HTTP URL link. + */ + private org.ccsds.moims.mo.mal.structures.URI externalURI; + + /** + * Period of time to which the source data used to generate the product relates. + */ + private org.ccsds.moims.mo.mpd.structures.TimeWindow contentDate; + + /** + * Named values for metadata attributes whose name and type correspond to + * those defined in the referenced ProductType. + */ + private org.ccsds.moims.mo.mal.structures.NamedValueList attributes; + + /** + * The textual description of this specific occurrence of the product. + */ + private String description; + + /** + * Additional optional metadata for files. + */ + private org.ccsds.moims.mo.mpd.structures.FileMetadata fileMetadata; + + /** + * An optional checksum of the product body. If this functionality is enabled, + * then the checksum algorithm for the calculation shall be agreed as an out-of-band + * agreement. + */ + private org.ccsds.moims.mo.mal.structures.Blob checksum; + + /** + * Default constructor for ProductMetadata. + * + */ + public ProductMetadata() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param productType The product type definition. + * @param productRef The reference to the Product. + * @param creationDate The time at which the product was generated. + * @param source The source that triggered the generation of the product. + * @param externalURI An external URI for the products to be retrieved. For example, this can be used for pulling a mission data product file via a HTTP URL link. + * @param contentDate Period of time to which the source data used to generate the product relates. + * @param attributes Named values for metadata attributes whose name and type correspond to those defined in the referenced ProductType. + * @param description The textual description of this specific occurrence of the product. + * @param fileMetadata Additional optional metadata for files. + * @param checksum An optional checksum of the product body. If this functionality is enabled, then the checksum algorithm for the calculation shall be agreed as an out-of-band agreement. + */ + public ProductMetadata(org.ccsds.moims.mo.mpd.structures.ProductType productType, + org.ccsds.moims.mo.mal.structures.ObjectRef productRef, + org.ccsds.moims.mo.mal.structures.Time creationDate, + org.ccsds.moims.mo.mal.structures.Identifier source, + org.ccsds.moims.mo.mal.structures.URI externalURI, + org.ccsds.moims.mo.mpd.structures.TimeWindow contentDate, + org.ccsds.moims.mo.mal.structures.NamedValueList attributes, + String description, + org.ccsds.moims.mo.mpd.structures.FileMetadata fileMetadata, + org.ccsds.moims.mo.mal.structures.Blob checksum) { + this.productType = productType; + this.productRef = productRef; + this.creationDate = creationDate; + this.source = source; + this.externalURI = externalURI; + this.contentDate = contentDate; + this.attributes = attributes; + this.description = description; + this.fileMetadata = fileMetadata; + this.checksum = checksum; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param productType The product type definition. + * @param productRef The reference to the Product. + * @param creationDate The time at which the product was generated. + * @param contentDate Period of time to which the source data used to generate the product relates. + */ + public ProductMetadata(org.ccsds.moims.mo.mpd.structures.ProductType productType, + org.ccsds.moims.mo.mal.structures.ObjectRef productRef, + org.ccsds.moims.mo.mal.structures.Time creationDate, + org.ccsds.moims.mo.mpd.structures.TimeWindow contentDate) { + this.productType = productType; + this.productRef = productRef; + this.creationDate = creationDate; + this.source = null; + this.externalURI = null; + this.contentDate = contentDate; + this.attributes = null; + this.description = null; + this.fileMetadata = null; + this.checksum = null; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mpd.structures.ProductMetadata(); + } + + /** + * Returns the field productType. + * + * @return The field productType + */ + public org.ccsds.moims.mo.mpd.structures.ProductType getProductType() { + return productType; + } + + /** + * Returns the field productRef. + * + * @return The field productRef + */ + public org.ccsds.moims.mo.mal.structures.ObjectRef getProductRef() { + return productRef; + } + + /** + * Returns the field creationDate. + * + * @return The field creationDate + */ + public org.ccsds.moims.mo.mal.structures.Time getCreationDate() { + return creationDate; + } + + /** + * Returns the field source. + * + * @return The field source + */ + public org.ccsds.moims.mo.mal.structures.Identifier getSource() { + return source; + } + + /** + * Returns the field externalURI. + * + * @return The field externalURI + */ + public org.ccsds.moims.mo.mal.structures.URI getExternalURI() { + return externalURI; + } + + /** + * Returns the field contentDate. + * + * @return The field contentDate + */ + public org.ccsds.moims.mo.mpd.structures.TimeWindow getContentDate() { + return contentDate; + } + + /** + * Returns the field attributes. + * + * @return The field attributes + */ + public org.ccsds.moims.mo.mal.structures.NamedValueList getAttributes() { + return attributes; + } + + /** + * Returns the field description. + * + * @return The field description + */ + public String getDescription() { + return description; + } + + /** + * Returns the field fileMetadata. + * + * @return The field fileMetadata + */ + public org.ccsds.moims.mo.mpd.structures.FileMetadata getFileMetadata() { + return fileMetadata; + } + + /** + * Returns the field checksum. + * + * @return The field checksum + */ + public org.ccsds.moims.mo.mal.structures.Blob getChecksum() { + return checksum; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ProductMetadata) { + ProductMetadata other = (ProductMetadata) obj; + if (productType == null) { + if (other.productType != null) { + return false; + } + } else { + if (! productType.equals(other.productType)) { + return false; + } + } + if (productRef == null) { + if (other.productRef != null) { + return false; + } + } else { + if (! productRef.equals(other.productRef)) { + return false; + } + } + if (creationDate == null) { + if (other.creationDate != null) { + return false; + } + } else { + if (! creationDate.equals(other.creationDate)) { + return false; + } + } + if (source == null) { + if (other.source != null) { + return false; + } + } else { + if (! source.equals(other.source)) { + return false; + } + } + if (externalURI == null) { + if (other.externalURI != null) { + return false; + } + } else { + if (! externalURI.equals(other.externalURI)) { + return false; + } + } + if (contentDate == null) { + if (other.contentDate != null) { + return false; + } + } else { + if (! contentDate.equals(other.contentDate)) { + return false; + } + } + if (attributes == null) { + if (other.attributes != null) { + return false; + } + } else { + if (! attributes.equals(other.attributes)) { + return false; + } + } + if (description == null) { + if (other.description != null) { + return false; + } + } else { + if (! description.equals(other.description)) { + return false; + } + } + if (fileMetadata == null) { + if (other.fileMetadata != null) { + return false; + } + } else { + if (! fileMetadata.equals(other.fileMetadata)) { + return false; + } + } + if (checksum == null) { + if (other.checksum != null) { + return false; + } + } else { + if (! checksum.equals(other.checksum)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (productType != null ? productType.hashCode() : 0); + hash = 83 * hash + (productRef != null ? productRef.hashCode() : 0); + hash = 83 * hash + (creationDate != null ? creationDate.hashCode() : 0); + hash = 83 * hash + (source != null ? source.hashCode() : 0); + hash = 83 * hash + (externalURI != null ? externalURI.hashCode() : 0); + hash = 83 * hash + (contentDate != null ? contentDate.hashCode() : 0); + hash = 83 * hash + (attributes != null ? attributes.hashCode() : 0); + hash = 83 * hash + (description != null ? description.hashCode() : 0); + hash = 83 * hash + (fileMetadata != null ? fileMetadata.hashCode() : 0); + hash = 83 * hash + (checksum != null ? checksum.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(ProductMetadata: "); + buf.append("productType=").append(productType); + buf.append(", productRef=").append(productRef); + buf.append(", creationDate=").append(creationDate); + buf.append(", source=").append(source); + buf.append(", externalURI=").append(externalURI); + buf.append(", contentDate=").append(contentDate); + buf.append(", attributes=").append(attributes); + buf.append(", description=").append(description); + buf.append(", fileMetadata=").append(fileMetadata); + buf.append(", checksum=").append(checksum); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (productType == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'productType' cannot be null!"); + } + if (productRef == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'productRef' cannot be null!"); + } + if (creationDate == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'creationDate' cannot be null!"); + } + if (contentDate == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'contentDate' cannot be null!"); + } + encoder.encodeElement(productType); + encoder.encodeElement(productRef); + encoder.encodeTime(creationDate); + encoder.encodeNullableIdentifier(source); + encoder.encodeNullableURI(externalURI); + encoder.encodeElement(contentDate); + encoder.encodeNullableElement(attributes); + encoder.encodeNullableString(description); + encoder.encodeNullableElement(fileMetadata); + encoder.encodeNullableBlob(checksum); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + productType = (org.ccsds.moims.mo.mpd.structures.ProductType) decoder.decodeElement(new org.ccsds.moims.mo.mpd.structures.ProductType()); + productRef = (org.ccsds.moims.mo.mal.structures.ObjectRef) decoder.decodeElement(new org.ccsds.moims.mo.mal.structures.ObjectRef()); + creationDate = decoder.decodeTime(); + source = decoder.decodeNullableIdentifier(); + externalURI = decoder.decodeNullableURI(); + contentDate = (org.ccsds.moims.mo.mpd.structures.TimeWindow) decoder.decodeElement(new org.ccsds.moims.mo.mpd.structures.TimeWindow()); + attributes = (org.ccsds.moims.mo.mal.structures.NamedValueList) decoder.decodeNullableElement(new org.ccsds.moims.mo.mal.structures.NamedValueList()); + description = decoder.decodeNullableString(); + fileMetadata = (org.ccsds.moims.mo.mpd.structures.FileMetadata) decoder.decodeNullableElement(new org.ccsds.moims.mo.mpd.structures.FileMetadata()); + checksum = decoder.decodeNullableBlob(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/ProductMetadataList.java b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/ProductMetadataList.java new file mode 100644 index 00000000..b9d9192c --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/ProductMetadataList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mpd.structures; + +/** + * List class for ProductMetadata. + */ +public final class ProductMetadataList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 2533274823950332L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 2533274823950332L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for ProductMetadataList. + * + */ + public ProductMetadataList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public ProductMetadataList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public ProductMetadataList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mpd.structures.ProductMetadata element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mpd.structures.ProductMetadata element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new ProductMetadataList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mpd.structures.ProductMetadata(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/ProductType.java b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/ProductType.java new file mode 100644 index 00000000..dcd90e3a --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/ProductType.java @@ -0,0 +1,180 @@ +package org.ccsds.moims.mo.mpd.structures; + +/** + * A ProductType contains the product type definition of a mission data product. + * The ProductType defines the metadata attributes associated with the product + * and implies (but does not specify) the structure of the product body. The + * ProductType is part of the Product Metadata. + */ +public final class ProductType implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 2533274807173122L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 2533274807173122L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * The name of the Product Type. + */ + private org.ccsds.moims.mo.mal.structures.Identifier name; + + /** + * The description of the Product Type. + */ + private String description; + + /** + * The list of metadata Attribute Definitions. + */ + private org.ccsds.moims.mo.mpd.structures.AttributeDefList attributeDefs; + + /** + * Default constructor for ProductType. + * + */ + public ProductType() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param name The name of the Product Type. + * @param description The description of the Product Type. + * @param attributeDefs The list of metadata Attribute Definitions. + */ + public ProductType(org.ccsds.moims.mo.mal.structures.Identifier name, + String description, + org.ccsds.moims.mo.mpd.structures.AttributeDefList attributeDefs) { + this.name = name; + this.description = description; + this.attributeDefs = attributeDefs; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param name The name of the Product Type. + */ + public ProductType(org.ccsds.moims.mo.mal.structures.Identifier name) { + this.name = name; + this.description = null; + this.attributeDefs = null; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mpd.structures.ProductType(); + } + + /** + * Returns the field name. + * + * @return The field name + */ + public org.ccsds.moims.mo.mal.structures.Identifier getName() { + return name; + } + + /** + * Returns the field description. + * + * @return The field description + */ + public String getDescription() { + return description; + } + + /** + * Returns the field attributeDefs. + * + * @return The field attributeDefs + */ + public org.ccsds.moims.mo.mpd.structures.AttributeDefList getAttributeDefs() { + return attributeDefs; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ProductType) { + ProductType other = (ProductType) obj; + if (name == null) { + if (other.name != null) { + return false; + } + } else { + if (! name.equals(other.name)) { + return false; + } + } + if (description == null) { + if (other.description != null) { + return false; + } + } else { + if (! description.equals(other.description)) { + return false; + } + } + if (attributeDefs == null) { + if (other.attributeDefs != null) { + return false; + } + } else { + if (! attributeDefs.equals(other.attributeDefs)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (name != null ? name.hashCode() : 0); + hash = 83 * hash + (description != null ? description.hashCode() : 0); + hash = 83 * hash + (attributeDefs != null ? attributeDefs.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(ProductType: "); + buf.append("name=").append(name); + buf.append(", description=").append(description); + buf.append(", attributeDefs=").append(attributeDefs); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (name == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'name' cannot be null!"); + } + encoder.encodeIdentifier(name); + encoder.encodeNullableString(description); + encoder.encodeNullableElement(attributeDefs); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + name = decoder.decodeIdentifier(); + description = decoder.decodeNullableString(); + attributeDefs = (org.ccsds.moims.mo.mpd.structures.AttributeDefList) decoder.decodeNullableElement(new org.ccsds.moims.mo.mpd.structures.AttributeDefList()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/ProductTypeList.java b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/ProductTypeList.java new file mode 100644 index 00000000..05163ee3 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/ProductTypeList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mpd.structures; + +/** + * List class for ProductType. + */ +public final class ProductTypeList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 2533274823950334L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 2533274823950334L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for ProductTypeList. + * + */ + public ProductTypeList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public ProductTypeList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public ProductTypeList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mpd.structures.ProductType element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mpd.structures.ProductType element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new ProductTypeList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mpd.structures.ProductType(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/StandingOrder.java b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/StandingOrder.java new file mode 100644 index 00000000..b4b46279 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/StandingOrder.java @@ -0,0 +1,313 @@ +package org.ccsds.moims.mo.mpd.structures; + +/** + * A StandingOrder is a data structure that holds the details of a standing + * order. This includes the orderID, the user who owns the product order, + * the product filter, how the products are to be delivered, the target URI + * where to deliver the files, and additional comments. + */ +public final class StandingOrder implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 2533274807173123L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 2533274807173123L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * The orderID of the standing order. It shall be NULL when the order is being + * submitted. + */ + private Long orderID; + + /** + * The user that is the owner of the product order. + */ + private org.ccsds.moims.mo.mal.structures.Identifier user; + + /** + * Specifies the filter criteria for the standing order, including the product + * type and optional filters on product source and metadata attributes. + */ + private org.ccsds.moims.mo.mpd.structures.ProductFilter productFilter; + + /** + * Period of time over which the standing order is required to be active. + */ + private org.ccsds.moims.mo.mpd.structures.TimeWindow validityPeriod; + + /** + * Specifies how the product is to be delivered: via the service interface + * or by file transfer. + */ + private org.ccsds.moims.mo.mpd.structures.DeliveryMethodEnum deliveryMethod; + + /** + * The delivery address for file transfer. Not required if deliveryMethod + * is SERVICE. + */ + private org.ccsds.moims.mo.mal.structures.URI deliverTo; + + /** + * Any optional notes or comments. + */ + private String comments; + + /** + * Default constructor for StandingOrder. + * + */ + public StandingOrder() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param orderID The orderID of the standing order. It shall be NULL when the order is being submitted. + * @param user The user that is the owner of the product order. + * @param productFilter Specifies the filter criteria for the standing order, including the product type and optional filters on product source and metadata attributes. + * @param validityPeriod Period of time over which the standing order is required to be active. + * @param deliveryMethod Specifies how the product is to be delivered: via the service interface or by file transfer. + * @param deliverTo The delivery address for file transfer. Not required if deliveryMethod is SERVICE. + * @param comments Any optional notes or comments. + */ + public StandingOrder(Long orderID, + org.ccsds.moims.mo.mal.structures.Identifier user, + org.ccsds.moims.mo.mpd.structures.ProductFilter productFilter, + org.ccsds.moims.mo.mpd.structures.TimeWindow validityPeriod, + org.ccsds.moims.mo.mpd.structures.DeliveryMethodEnum deliveryMethod, + org.ccsds.moims.mo.mal.structures.URI deliverTo, + String comments) { + this.orderID = orderID; + this.user = user; + this.productFilter = productFilter; + this.validityPeriod = validityPeriod; + this.deliveryMethod = deliveryMethod; + this.deliverTo = deliverTo; + this.comments = comments; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param user The user that is the owner of the product order. + * @param deliveryMethod Specifies how the product is to be delivered: via the service interface or by file transfer. + */ + public StandingOrder(org.ccsds.moims.mo.mal.structures.Identifier user, + org.ccsds.moims.mo.mpd.structures.DeliveryMethodEnum deliveryMethod) { + this.orderID = null; + this.user = user; + this.productFilter = null; + this.validityPeriod = null; + this.deliveryMethod = deliveryMethod; + this.deliverTo = null; + this.comments = null; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mpd.structures.StandingOrder(); + } + + /** + * Returns the field orderID. + * + * @return The field orderID + */ + public Long getOrderID() { + return orderID; + } + + /** + * Returns the field user. + * + * @return The field user + */ + public org.ccsds.moims.mo.mal.structures.Identifier getUser() { + return user; + } + + /** + * Returns the field productFilter. + * + * @return The field productFilter + */ + public org.ccsds.moims.mo.mpd.structures.ProductFilter getProductFilter() { + return productFilter; + } + + /** + * Returns the field validityPeriod. + * + * @return The field validityPeriod + */ + public org.ccsds.moims.mo.mpd.structures.TimeWindow getValidityPeriod() { + return validityPeriod; + } + + /** + * Returns the field deliveryMethod. + * + * @return The field deliveryMethod + */ + public org.ccsds.moims.mo.mpd.structures.DeliveryMethodEnum getDeliveryMethod() { + return deliveryMethod; + } + + /** + * Returns the field deliverTo. + * + * @return The field deliverTo + */ + public org.ccsds.moims.mo.mal.structures.URI getDeliverTo() { + return deliverTo; + } + + /** + * Returns the field comments. + * + * @return The field comments + */ + public String getComments() { + return comments; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof StandingOrder) { + StandingOrder other = (StandingOrder) obj; + if (orderID == null) { + if (other.orderID != null) { + return false; + } + } else { + if (! orderID.equals(other.orderID)) { + return false; + } + } + if (user == null) { + if (other.user != null) { + return false; + } + } else { + if (! user.equals(other.user)) { + return false; + } + } + if (productFilter == null) { + if (other.productFilter != null) { + return false; + } + } else { + if (! productFilter.equals(other.productFilter)) { + return false; + } + } + if (validityPeriod == null) { + if (other.validityPeriod != null) { + return false; + } + } else { + if (! validityPeriod.equals(other.validityPeriod)) { + return false; + } + } + if (deliveryMethod == null) { + if (other.deliveryMethod != null) { + return false; + } + } else { + if (! deliveryMethod.equals(other.deliveryMethod)) { + return false; + } + } + if (deliverTo == null) { + if (other.deliverTo != null) { + return false; + } + } else { + if (! deliverTo.equals(other.deliverTo)) { + return false; + } + } + if (comments == null) { + if (other.comments != null) { + return false; + } + } else { + if (! comments.equals(other.comments)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (orderID != null ? orderID.hashCode() : 0); + hash = 83 * hash + (user != null ? user.hashCode() : 0); + hash = 83 * hash + (productFilter != null ? productFilter.hashCode() : 0); + hash = 83 * hash + (validityPeriod != null ? validityPeriod.hashCode() : 0); + hash = 83 * hash + (deliveryMethod != null ? deliveryMethod.hashCode() : 0); + hash = 83 * hash + (deliverTo != null ? deliverTo.hashCode() : 0); + hash = 83 * hash + (comments != null ? comments.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(StandingOrder: "); + buf.append("orderID=").append(orderID); + buf.append(", user=").append(user); + buf.append(", productFilter=").append(productFilter); + buf.append(", validityPeriod=").append(validityPeriod); + buf.append(", deliveryMethod=").append(deliveryMethod); + buf.append(", deliverTo=").append(deliverTo); + buf.append(", comments=").append(comments); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (user == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'user' cannot be null!"); + } + if (deliveryMethod == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'deliveryMethod' cannot be null!"); + } + encoder.encodeNullableLong(orderID); + encoder.encodeIdentifier(user); + encoder.encodeNullableElement(productFilter); + encoder.encodeNullableElement(validityPeriod); + encoder.encodeElement(deliveryMethod); + encoder.encodeNullableURI(deliverTo); + encoder.encodeNullableString(comments); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + orderID = decoder.decodeNullableLong(); + user = decoder.decodeIdentifier(); + productFilter = (org.ccsds.moims.mo.mpd.structures.ProductFilter) decoder.decodeNullableElement(new org.ccsds.moims.mo.mpd.structures.ProductFilter()); + validityPeriod = (org.ccsds.moims.mo.mpd.structures.TimeWindow) decoder.decodeNullableElement(new org.ccsds.moims.mo.mpd.structures.TimeWindow()); + deliveryMethod = (org.ccsds.moims.mo.mpd.structures.DeliveryMethodEnum) decoder.decodeElement(org.ccsds.moims.mo.mpd.structures.DeliveryMethodEnum.SERVICE_COMPLETE); + deliverTo = decoder.decodeNullableURI(); + comments = decoder.decodeNullableString(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/StandingOrderList.java b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/StandingOrderList.java new file mode 100644 index 00000000..91cefb91 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/StandingOrderList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mpd.structures; + +/** + * List class for StandingOrder. + */ +public final class StandingOrderList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 2533274823950333L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 2533274823950333L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for StandingOrderList. + * + */ + public StandingOrderList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public StandingOrderList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public StandingOrderList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mpd.structures.StandingOrder element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mpd.structures.StandingOrder element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new StandingOrderList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mpd.structures.StandingOrder(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/StringPattern.java b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/StringPattern.java new file mode 100644 index 00000000..cd57aa6d --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/StringPattern.java @@ -0,0 +1,122 @@ +package org.ccsds.moims.mo.mpd.structures; + +/** + * A StringPattern is a concrete subtype of AttributeFilter that allows the + * specification of a regular expression (or match pattern) to be searched + * for in the value of a text type metadata attribute. + */ +public final class StringPattern extends org.ccsds.moims.mo.mpd.structures.AttributeFilter { + + private static final long serialVersionUID = 2533274807173131L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 2533274807173131L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * The regular expression - a sequence of characters that specifies a match + * pattern to be searched for in a text type metadata attribute (String, Identifier + * or URI). + */ + private String regex; + + /** + * Default constructor for StringPattern. + * + */ + public StringPattern() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param name The name of the metadata attribute to filter. If the product metadata being evaluated does not contain an attribute with this name, then the evaluation of the filter shall be false. + * @param include Indicates whether the filter is to include [TRUE] or exclude [FALSE] attribute values that match the filter. + * @param regex The regular expression - a sequence of characters that specifies a match pattern to be searched for in a text type metadata attribute (String, Identifier or URI). + */ + public StringPattern(org.ccsds.moims.mo.mal.structures.Identifier name, + Boolean include, + String regex) { + super(name, + include); + this.regex = regex; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mpd.structures.StringPattern(); + } + + /** + * Returns the field regex. + * + * @return The field regex + */ + public String getRegex() { + return regex; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof StringPattern) { + if (! super.equals(obj)) { + return false; + } + StringPattern other = (StringPattern) obj; + if (regex == null) { + if (other.regex != null) { + return false; + } + } else { + if (! regex.equals(other.regex)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = super.hashCode(); + hash = 83 * hash + (regex != null ? regex.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(StringPattern: "); + buf.append(super.toString()); + buf.append(", regex=").append(regex); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + super.encode(encoder); + if (regex == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'regex' cannot be null!"); + } + encoder.encodeString(regex); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + super.decode(decoder); + regex = decoder.decodeString(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/StringPatternList.java b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/StringPatternList.java new file mode 100644 index 00000000..f0bf6b50 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/StringPatternList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mpd.structures; + +/** + * List class for StringPattern. + */ +public final class StringPatternList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 2533274823950325L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 2533274823950325L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for StringPatternList. + * + */ + public StringPatternList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public StringPatternList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public StringPatternList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mpd.structures.StringPattern element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mpd.structures.StringPattern element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new StringPatternList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mpd.structures.StringPattern(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/TimeWindow.java b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/TimeWindow.java new file mode 100644 index 00000000..0cdc740e --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/TimeWindow.java @@ -0,0 +1,140 @@ +package org.ccsds.moims.mo.mpd.structures; + +/** + * The TimeWindow represents a specific period, between the start and end + * of a time window. + */ +public final class TimeWindow implements org.ccsds.moims.mo.mal.structures.Composite { + + private static final long serialVersionUID = 2533274807173127L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 2533274807173127L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * The start time of the time window. + */ + private org.ccsds.moims.mo.mal.structures.Time start; + + /** + * The end time of the time window. + */ + private org.ccsds.moims.mo.mal.structures.Time end; + + /** + * Default constructor for TimeWindow. + * + */ + public TimeWindow() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param start The start time of the time window. + * @param end The end time of the time window. + */ + public TimeWindow(org.ccsds.moims.mo.mal.structures.Time start, + org.ccsds.moims.mo.mal.structures.Time end) { + this.start = start; + this.end = end; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mpd.structures.TimeWindow(); + } + + /** + * Returns the field start. + * + * @return The field start + */ + public org.ccsds.moims.mo.mal.structures.Time getStart() { + return start; + } + + /** + * Returns the field end. + * + * @return The field end + */ + public org.ccsds.moims.mo.mal.structures.Time getEnd() { + return end; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof TimeWindow) { + TimeWindow other = (TimeWindow) obj; + if (start == null) { + if (other.start != null) { + return false; + } + } else { + if (! start.equals(other.start)) { + return false; + } + } + if (end == null) { + if (other.end != null) { + return false; + } + } else { + if (! end.equals(other.end)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 83 * hash + (start != null ? start.hashCode() : 0); + hash = 83 * hash + (end != null ? end.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(TimeWindow: "); + buf.append("start=").append(start); + buf.append(", end=").append(end); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + if (start == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'start' cannot be null!"); + } + if (end == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'end' cannot be null!"); + } + encoder.encodeTime(start); + encoder.encodeTime(end); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + start = decoder.decodeTime(); + end = decoder.decodeTime(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/TimeWindowList.java b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/TimeWindowList.java new file mode 100644 index 00000000..3eff4b4a --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/TimeWindowList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mpd.structures; + +/** + * List class for TimeWindow. + */ +public final class TimeWindowList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 2533274823950329L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 2533274823950329L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for TimeWindowList. + * + */ + public TimeWindowList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public TimeWindowList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public TimeWindowList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mpd.structures.TimeWindow element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mpd.structures.TimeWindow element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new TimeWindowList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mpd.structures.TimeWindow(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/ValueRange.java b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/ValueRange.java new file mode 100644 index 00000000..48a3ccec --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/ValueRange.java @@ -0,0 +1,160 @@ +package org.ccsds.moims.mo.mpd.structures; + +/** + * A ValueRange is a concrete subtype of AttributeFilter that allows the specification + * of an allowed (or disallowed) value range for a metadata attribute. + */ +public final class ValueRange extends org.ccsds.moims.mo.mpd.structures.AttributeFilter { + + private static final long serialVersionUID = 2533274807173129L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 2533274807173129L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * The minimum value of the value range (greater than or equal to). + */ + private org.ccsds.moims.mo.mal.structures.Attribute minimum; + + /** + * The maximum value of the value range (less than or equal to). + */ + private org.ccsds.moims.mo.mal.structures.Attribute maximum; + + /** + * Default constructor for ValueRange. + * + */ + public ValueRange() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param name The name of the metadata attribute to filter. If the product metadata being evaluated does not contain an attribute with this name, then the evaluation of the filter shall be false. + * @param include Indicates whether the filter is to include [TRUE] or exclude [FALSE] attribute values that match the filter. + * @param minimum The minimum value of the value range (greater than or equal to). + * @param maximum The maximum value of the value range (less than or equal to). + */ + public ValueRange(org.ccsds.moims.mo.mal.structures.Identifier name, + Boolean include, + org.ccsds.moims.mo.mal.structures.Attribute minimum, + org.ccsds.moims.mo.mal.structures.Attribute maximum) { + super(name, + include); + this.minimum = minimum; + this.maximum = maximum; + } + + /** + * Constructor that initialises the non-nullable values of the structure. + * + * @param name The name of the metadata attribute to filter. If the product metadata being evaluated does not contain an attribute with this name, then the evaluation of the filter shall be false. + * @param include Indicates whether the filter is to include [TRUE] or exclude [FALSE] attribute values that match the filter. + */ + public ValueRange(org.ccsds.moims.mo.mal.structures.Identifier name, + Boolean include) { + super(name, + include); + this.minimum = null; + this.maximum = null; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mpd.structures.ValueRange(); + } + + /** + * Returns the field minimum. + * + * @return The field minimum + */ + public org.ccsds.moims.mo.mal.structures.Attribute getMinimum() { + return minimum; + } + + /** + * Returns the field maximum. + * + * @return The field maximum + */ + public org.ccsds.moims.mo.mal.structures.Attribute getMaximum() { + return maximum; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ValueRange) { + if (! super.equals(obj)) { + return false; + } + ValueRange other = (ValueRange) obj; + if (minimum == null) { + if (other.minimum != null) { + return false; + } + } else { + if (! minimum.equals(other.minimum)) { + return false; + } + } + if (maximum == null) { + if (other.maximum != null) { + return false; + } + } else { + if (! maximum.equals(other.maximum)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = super.hashCode(); + hash = 83 * hash + (minimum != null ? minimum.hashCode() : 0); + hash = 83 * hash + (maximum != null ? maximum.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(ValueRange: "); + buf.append(super.toString()); + buf.append(", minimum=").append(minimum); + buf.append(", maximum=").append(maximum); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + super.encode(encoder); + encoder.encodeNullableAttribute(minimum); + encoder.encodeNullableAttribute(maximum); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + super.decode(decoder); + minimum = (org.ccsds.moims.mo.mal.structures.Attribute) decoder.decodeNullableAttribute(); + maximum = (org.ccsds.moims.mo.mal.structures.Attribute) decoder.decodeNullableAttribute(); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/ValueRangeList.java b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/ValueRangeList.java new file mode 100644 index 00000000..de4a60a4 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/ValueRangeList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mpd.structures; + +/** + * List class for ValueRange. + */ +public final class ValueRangeList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 2533274823950327L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 2533274823950327L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for ValueRangeList. + * + */ + public ValueRangeList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public ValueRangeList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public ValueRangeList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mpd.structures.ValueRange element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mpd.structures.ValueRange element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new ValueRangeList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mpd.structures.ValueRange(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/ValueSet.java b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/ValueSet.java new file mode 100644 index 00000000..0ed10120 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/ValueSet.java @@ -0,0 +1,119 @@ +package org.ccsds.moims.mo.mpd.structures; + +/** + * A ValueSet is a concrete subtype of AttributeFilter that allows the specification + * of a set of allowed (or disallowed) values for a metadata attribute. + */ +public final class ValueSet extends org.ccsds.moims.mo.mpd.structures.AttributeFilter { + + private static final long serialVersionUID = 2533274807173130L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 2533274807173130L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * The set of allowed (or disallowed) values for the metadata attribute. + */ + private org.ccsds.moims.mo.mal.structures.AttributeList values; + + /** + * Default constructor for ValueSet. + * + */ + public ValueSet() { + } + + /** + * Constructor that initialises the values of the structure. + * + * @param name The name of the metadata attribute to filter. If the product metadata being evaluated does not contain an attribute with this name, then the evaluation of the filter shall be false. + * @param include Indicates whether the filter is to include [TRUE] or exclude [FALSE] attribute values that match the filter. + * @param values The set of allowed (or disallowed) values for the metadata attribute. + */ + public ValueSet(org.ccsds.moims.mo.mal.structures.Identifier name, + Boolean include, + org.ccsds.moims.mo.mal.structures.AttributeList values) { + super(name, + include); + this.values = values; + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new org.ccsds.moims.mo.mpd.structures.ValueSet(); + } + + /** + * Returns the field values. + * + * @return The field values + */ + public org.ccsds.moims.mo.mal.structures.AttributeList getValues() { + return values; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ValueSet) { + if (! super.equals(obj)) { + return false; + } + ValueSet other = (ValueSet) obj; + if (values == null) { + if (other.values != null) { + return false; + } + } else { + if (! values.equals(other.values)) { + return false; + } + } + return true; + } + return false; + } + + @Override + public int hashCode() { + int hash = super.hashCode(); + hash = 83 * hash + (values != null ? values.hashCode() : 0); + return hash; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("(ValueSet: "); + buf.append(super.toString()); + buf.append(", values=").append(values); + buf.append(')'); + return buf.toString(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + super.encode(encoder); + if (values == null) { + throw new org.ccsds.moims.mo.mal.MALException("The field 'values' cannot be null!"); + } + encoder.encodeElement(values); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + super.decode(decoder); + values = (org.ccsds.moims.mo.mal.structures.AttributeList) decoder.decodeElement(new org.ccsds.moims.mo.mal.structures.AttributeList()); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/ValueSetList.java b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/ValueSetList.java new file mode 100644 index 00000000..6d415aa4 --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/ValueSetList.java @@ -0,0 +1,79 @@ +package org.ccsds.moims.mo.mpd.structures; + +/** + * List class for ValueSet. + */ +public final class ValueSetList extends java.util.ArrayList implements org.ccsds.moims.mo.mal.structures.HomogeneousList { + + private static final long serialVersionUID = 2533274823950326L; + /** + * The TypeId of this Element as a long. + */ + public static final Long SHORT_FORM = 2533274823950326L; + /** + * The TypeId of this Element. + */ + public static final org.ccsds.moims.mo.mal.TypeId TYPE_ID = new org.ccsds.moims.mo.mal.TypeId(SHORT_FORM); + + /** + * Default constructor for ValueSetList. + * + */ + public ValueSetList() { + } + + /** + * Constructor that initialises the capacity of the list. + * + * @param initialCapacity The required initial capacity. + */ + public ValueSetList(int initialCapacity) { + super(initialCapacity); + } + + /** + * Constructor that uses an ArrayList for initialization. + * + * @param elementList The ArrayList that is used for initialization. + */ + public ValueSetList(java.util.ArrayList elementList) { + for(org.ccsds.moims.mo.mpd.structures.ValueSet element : elementList) { + this.add(element); + } + } + + @Override + public boolean add(org.ccsds.moims.mo.mpd.structures.ValueSet element) { + if (element == null) { + throw new IllegalArgumentException("The added argument cannot be null!"); + } + return super.add(element); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createElement() { + return new ValueSetList(); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element createTypedElement() { + return new org.ccsds.moims.mo.mpd.structures.ValueSet(); + } + + @Override + public void encode(org.ccsds.moims.mo.mal.MALEncoder encoder) throws org.ccsds.moims.mo.mal.MALException { + encoder.encodeHomogeneousList(this); + } + + @Override + public org.ccsds.moims.mo.mal.structures.Element decode(org.ccsds.moims.mo.mal.MALDecoder decoder) throws org.ccsds.moims.mo.mal.MALException { + decoder.decodeHomogeneousList(this); + return this; + } + + @Override + public org.ccsds.moims.mo.mal.TypeId getTypeId() { + return TYPE_ID; + } + +} diff --git a/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/package-info.java b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/package-info.java new file mode 100644 index 00000000..ba1d3f7b --- /dev/null +++ b/testbeds/testbed-api-generator/baseline/java/api-area009-v001-mpd/org/ccsds/moims/mo/mpd/structures/package-info.java @@ -0,0 +1,4 @@ +/** + * Package containing types defined in the MPD area. +*/ +package org.ccsds.moims.mo.mpd.structures; diff --git a/api-generator/api-generator-lib/src/test/java/esa/mo/apigen/generators/docx/DocxBodyTest.java b/testbeds/testbed-api-generator/src/test/java/esa/mo/apigen/generators/docx/DocxBodyTest.java similarity index 96% rename from api-generator/api-generator-lib/src/test/java/esa/mo/apigen/generators/docx/DocxBodyTest.java rename to testbeds/testbed-api-generator/src/test/java/esa/mo/apigen/generators/docx/DocxBodyTest.java index 972ac30e..ba9c2c2b 100644 --- a/api-generator/api-generator-lib/src/test/java/esa/mo/apigen/generators/docx/DocxBodyTest.java +++ b/testbeds/testbed-api-generator/src/test/java/esa/mo/apigen/generators/docx/DocxBodyTest.java @@ -38,6 +38,12 @@ public class DocxBodyTest { private static final Charset UTF8 = Charset.forName("UTF-8"); + /** + * Where the captured output of the existing generator lives, relative to the root + * of the repository. + */ + private static final String BASELINE = "testbeds/testbed-api-generator/baseline"; + private static final String SHADE = "00CCFF"; /** @@ -51,7 +57,7 @@ private static String reference(String document) throws Exception { if (here == null) { return null; } - File file = new File(here, "api-generator/golden/baseline/docx/prototypes/" + File file = new File(here, BASELINE + "/docx/prototypes/" + document + "/word/document.xml"); return file.isFile() ? new String(Files.readAllBytes(file.toPath()), UTF8) : null; } diff --git a/testbeds/testbed-api-generator/src/test/java/esa/mo/apigen/generators/docx/DocxGeneratorGoldenTest.java b/testbeds/testbed-api-generator/src/test/java/esa/mo/apigen/generators/docx/DocxGeneratorGoldenTest.java index 50fc203e..c0236ddb 100644 --- a/testbeds/testbed-api-generator/src/test/java/esa/mo/apigen/generators/docx/DocxGeneratorGoldenTest.java +++ b/testbeds/testbed-api-generator/src/test/java/esa/mo/apigen/generators/docx/DocxGeneratorGoldenTest.java @@ -55,6 +55,12 @@ public class DocxGeneratorGoldenTest { private static final Charset UTF8 = Charset.forName("UTF-8"); + /** + * Where the captured output of the existing generator lives, relative to the root of + * the repository. {@code api-generator/golden/golden.sh} writes it here. + */ + private static final String BASELINE = "testbeds/testbed-api-generator/baseline"; + /** * How many parts of each document may still differ, keyed by set and document. *

                  @@ -94,7 +100,7 @@ private void check(String set) throws Exception { Assume.assumeNotNull("not inside the repository", root); File specs = new File(root, "xml-service-specifications/xml-ccsds-mo-" + set + "/src/main/resources/xml"); - File baseline = new File(root, "api-generator/golden/baseline/docx/" + set); + File baseline = new File(root, BASELINE + "/docx/" + set); Assume.assumeTrue("baseline not captured; run api-generator/golden/golden.sh capture", specs.isDirectory() && baseline.isDirectory()); diff --git a/api-generator/api-generator-lib/src/test/java/esa/mo/apigen/generators/docx/DocxNumberingTest.java b/testbeds/testbed-api-generator/src/test/java/esa/mo/apigen/generators/docx/DocxNumberingTest.java similarity index 92% rename from api-generator/api-generator-lib/src/test/java/esa/mo/apigen/generators/docx/DocxNumberingTest.java rename to testbeds/testbed-api-generator/src/test/java/esa/mo/apigen/generators/docx/DocxNumberingTest.java index b4fd2156..3162bf1e 100644 --- a/api-generator/api-generator-lib/src/test/java/esa/mo/apigen/generators/docx/DocxNumberingTest.java +++ b/testbeds/testbed-api-generator/src/test/java/esa/mo/apigen/generators/docx/DocxNumberingTest.java @@ -38,6 +38,12 @@ public class DocxNumberingTest { private static final Charset UTF8 = Charset.forName("UTF-8"); + /** + * Where the captured output of the existing generator lives, relative to the root of + * the repository. + */ + private static final String BASELINE = "testbeds/testbed-api-generator/baseline"; + /** * @return the captured numbering part of a document, or null if the baseline has not * been taken. @@ -50,7 +56,7 @@ private static File baseline(String document) { if (here == null) { return null; } - File file = new File(here, "api-generator/golden/baseline/docx/prototypes/" + File file = new File(here, BASELINE + "/docx/prototypes/" + document + "/word/numbering.xml"); return file.isFile() ? file : null; } diff --git a/testbeds/testbed-api-generator/src/test/java/esa/mo/apigen/generators/java/GoldenTree.java b/testbeds/testbed-api-generator/src/test/java/esa/mo/apigen/generators/java/GoldenTree.java index 3726a2e7..a3b61824 100644 --- a/testbeds/testbed-api-generator/src/test/java/esa/mo/apigen/generators/java/GoldenTree.java +++ b/testbeds/testbed-api-generator/src/test/java/esa/mo/apigen/generators/java/GoldenTree.java @@ -43,11 +43,19 @@ * Reaches the output of the existing generators, captured by the Phase 0 harness, so the * new generator can be held against it file by file. *

                  - * The baseline is regenerable and not in version control, so everything here degrades to - * a skipped test when it is absent rather than to a failure. + * The baseline is committed, beside the tests that read it, so that a change to what the + * generators produce shows up as a diff rather than only as a failing assertion. Anything + * here still degrades to a skipped test if it is absent, which is what happens to someone + * who has cleared it to re-capture. */ public final class GoldenTree { + /** + * Where the captured output of the existing generators lives, relative to the root of + * the repository. {@code api-generator/golden/golden.sh} writes it here. + */ + static final String BASELINE = "testbeds/testbed-api-generator/baseline"; + private GoldenTree() { } @@ -70,7 +78,7 @@ public static File baselineFor(String module) { if (root == null) { return null; } - File dir = new File(root, "api-generator/golden/baseline/java/" + module); + File dir = new File(root, BASELINE + "/java/" + module); return dir.isDirectory() ? dir : null; } diff --git a/testbeds/testbed-api-generator/src/test/java/esa/mo/apigen/importers/xml/XmlImporterCorpusTest.java b/testbeds/testbed-api-generator/src/test/java/esa/mo/apigen/importers/xml/XmlImporterCorpusTest.java index 31f2e6a4..2788af6e 100644 --- a/testbeds/testbed-api-generator/src/test/java/esa/mo/apigen/importers/xml/XmlImporterCorpusTest.java +++ b/testbeds/testbed-api-generator/src/test/java/esa/mo/apigen/importers/xml/XmlImporterCorpusTest.java @@ -113,7 +113,8 @@ public void readsSoftwareManagementCompletely() throws Exception { assertEquals("COM objects", 4, comObjects); assertEquals("COM events", 6, comEvents); assertEquals("documentation sections", 6, docSections); - assertEquals("diagrams", 2, diagrams); + // None: the diagrams were taken out of this file, being the first step of §8.3. + assertEquals("diagrams", 0, diagrams); } @Test @@ -170,7 +171,10 @@ public void readsObjectReferencesWhichExistOnlyInV003() throws Exception { @Test public void readsDiagramsAsSvgText() throws Exception { - Specification spec = Corpus.read(Corpus.file("area007-v001-Software-Management.xml")); + // Monitor and Control v001 is where the diagrams still are - sixteen of the + // eighteen in the corpus. When they go, so does this test (§8.3). + Specification spec = Corpus.read( + Corpus.file("area004-v001-Monitor-and-Control.xml")); int diagrams = 0; for (Service service : spec.getAreas().get(0).getServices()) { if (service.getCom() == null) { @@ -182,7 +186,7 @@ public void readsDiagramsAsSvgText() throws Exception { assertTrue(d.getName() + " should carry SVG", d.getSvg().contains(" - - - - - - - - - - - - - - - - - - - Package - 1 - PackageDefinition - - - - - Installation - 2 - MAL::Identifier - - - @@ -509,71 +478,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - Stopping - 3 - - - - - - Stopped - 4 - - - - - - StopApp - 2 - MAL::Identifier - - - - - COM::ActivityTracking::OperationActivity - 6 - COM::ActivityTracking::OperationActivity - - - - - App - 1 - AppDetails - - - - - PackageManagement::Installation - 2 - MAL::Identifier - - - From b933fd7b0244299a3f93546a5aa735f8f770a332 Mon Sep 17 00:00:00 2001 From: Cesar Coelho Date: Sun, 23 Aug 2026 14:01:37 +0200 Subject: [PATCH 39/45] Removed the diagram rasterisation, and with it the last dependency A diagram declared inside a specification is SVG, and the document generator rasterised it with Batik to embed in the .docx. That is gone: an SVG inside a specification is a picture of the model that nothing can check against the model, so it can disagree with what it describes and no validator would ever say so. It was also the only third-party dependency the library had. About 90 lines across three files: DocxDocument.rasterise, addDiagram, the image relationships, and DocxBody.appendDrawing. MC v001 is the only file left that declares diagrams, and it is in the standards folder, so it cannot be edited. The old generator still rasterises them and the new one does not, which affects two documents. golden.sh stops capturing word/media, and DocxGeneratorGoldenTest strips the drawing markup off the reference side before comparing, so both document.xml files are still compared in full rather than given a budget - 108 of 108 parts match. The reasoning is in intended-differences.txt and DESIGN.md section 8.3. The validator now warns when a specification declares a diagram, because a diagram that quietly produces no figure would be the same failure in a new form. Co-Authored-By: Claude Opus 5 --- api-generator/api-generator-lib/DESIGN.md | 84 ++++++++------- api-generator/api-generator-lib/pom.xml | 70 +------------ .../mo/apigen/generators/docx/DocxBody.java | 30 ------ .../apigen/generators/docx/DocxDocument.java | 98 +----------------- .../apigen/generators/docx/DocxGenerator.java | 4 - .../esa/mo/apigen/validation/Validator.java | 21 ++++ api-generator/golden/golden.sh | 5 + api-generator/golden/intended-differences.txt | 22 +++- .../testbed-api-generator/baseline/MANIFEST | 4 +- .../word/media/image1.png | Bin 35930 -> 0 bytes .../word/media/image2.png | Bin 24541 -> 0 bytes .../word/media/image3.png | Bin 22204 -> 0 bytes .../word/media/image4.png | Bin 60771 -> 0 bytes .../word/media/image5.png | Bin 31988 -> 0 bytes .../word/media/image6.png | Bin 27153 -> 0 bytes .../word/media/image7.png | Bin 39314 -> 0 bytes .../word/media/image8.png | Bin 16068 -> 0 bytes .../word/media/image1.png | Bin 35930 -> 0 bytes .../word/media/image2.png | Bin 24541 -> 0 bytes .../word/media/image3.png | Bin 22204 -> 0 bytes .../word/media/image4.png | Bin 60771 -> 0 bytes .../word/media/image5.png | Bin 31988 -> 0 bytes .../word/media/image6.png | Bin 27153 -> 0 bytes .../word/media/image7.png | Bin 39314 -> 0 bytes .../word/media/image8.png | Bin 16068 -> 0 bytes .../docx/DocxGeneratorGoldenTest.java | 34 +++++- .../validation/ValidatorCorpusTest.java | 23 +++- 27 files changed, 154 insertions(+), 241 deletions(-) delete mode 100644 testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area004-v001-MC/word/media/image1.png delete mode 100644 testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area004-v001-MC/word/media/image2.png delete mode 100644 testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area004-v001-MC/word/media/image3.png delete mode 100644 testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area004-v001-MC/word/media/image4.png delete mode 100644 testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area004-v001-MC/word/media/image5.png delete mode 100644 testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area004-v001-MC/word/media/image6.png delete mode 100644 testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area004-v001-MC/word/media/image7.png delete mode 100644 testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area004-v001-MC/word/media/image8.png delete mode 100644 testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area004-v001-MC/word/media/image1.png delete mode 100644 testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area004-v001-MC/word/media/image2.png delete mode 100644 testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area004-v001-MC/word/media/image3.png delete mode 100644 testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area004-v001-MC/word/media/image4.png delete mode 100644 testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area004-v001-MC/word/media/image5.png delete mode 100644 testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area004-v001-MC/word/media/image6.png delete mode 100644 testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area004-v001-MC/word/media/image7.png delete mode 100644 testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area004-v001-MC/word/media/image8.png diff --git a/api-generator/api-generator-lib/DESIGN.md b/api-generator/api-generator-lib/DESIGN.md index bc371ae3..f4893dc7 100644 --- a/api-generator/api-generator-lib/DESIGN.md +++ b/api-generator/api-generator-lib/DESIGN.md @@ -100,20 +100,16 @@ Cost to accept for the duration: fixes made to the old generators must be mirror ones, or the difference consciously accepted. Running both in CI is what keeps that honest — a change to either side that moves the output shows up as a diff on the next build. -**Dependencies:** `api-generator-lib` has **one** third-party dependency, and it earns it. The model -is plain Java, XML I/O uses StAX from the JDK, the MOSpec parser is hand-written (§7.2), and the -OOXML of a document is written as text — but a diagram declared in a specification is SVG and a -`.docx` embeds a raster image, so the document generator rasterises it with **Apache Batik** -(`batik-rasterizer`, `batik-codec`, `batik-anim`, 1.16, the same version and exclusions the existing -generator uses). Nothing else needs a third party and nothing in `model/` may use one, invariant 1 -being about the model rather than the generators. This still removes `jaxb-api`, `jaxb-runtime`, -`activation`, `reflections`, `maven-plugin-api`, `de.dlr.gsoc.mcds:mosdl` and both `xjc` -executions. Keeping the library -dependency-free is what makes putting everything in it cost nothing. - -**And Batik is temporary.** It is here only because the specifications carry pictures inside them, -and they are not going to: §8.3 sets out why the diagrams come out of the XML and in what order. -When they do, the rasteriser goes and the count returns to zero. +**Dependencies:** `api-generator-lib` has **none**. The model is plain Java, XML I/O uses StAX from +the JDK, the MOSpec parser is hand-written (§7.2), and the OOXML of a document is written as text. +This removes `jaxb-api`, `jaxb-runtime`, `activation`, `reflections`, `maven-plugin-api`, +`de.dlr.gsoc.mcds:mosdl` and both `xjc` executions. Keeping the library dependency-free is what +makes putting everything in it cost nothing. + +There was one for a while. A diagram declared in a specification is SVG and a `.docx` embeds a +raster image, so the document generator rasterised it with Apache Batik. That support is **gone** +(§8.3) — an SVG inside a specification is a picture of the model that nothing can check against the +model — and it was the only thing standing between this library and no dependencies at all. `api-generator-maven-plugin` stays a separate module — it is the Maven binding, not part of the library, and it must go on depending on the old generators throughout 14.x. @@ -1353,32 +1349,42 @@ out there and nothing was lost. sibling file — so the text format never inlines a picture. The same argument applies one layer down, to the XML. -#### The order matters - -The tempting move is to drop the diagrams from the golden tests, since the ten PNGs are a quarter of -what the baseline costs the repository (§10.1) and sixteen of them belong to a superseded book. -**That is the wrong end to start from.** While the existing generator still emits those images, the -golden tree's job is to prove the new one matches it, and removing them from the tests means -choosing to stop checking something that is still being produced. - -Removing them from the **specifications** gets the same result correctly: - -1. the `` elements come out of the XML; -2. both generators stop emitting images, because there are none to emit; -3. `golden.sh capture` is re-run, and the PNGs leave the baseline on their own; -4. nothing is entered in `intended-differences.txt`, because there is no difference between the two - implementations — only a difference in what they were given. - -The coverage disappears because the thing it covered disappeared, which is the only honest way for a -regression net to shrink. +#### Two routes, decided by which folder the file is in + +A specification in **`xml-ccsds-mo-prototypes`** can be edited. There the clean route is to take the +`` elements out of the XML: both generators then stop emitting images, `golden.sh +capture` is re-run, and the PNGs leave the baseline on their own. Nothing is entered in +`intended-differences.txt`, because the two implementations never disagreed — only what they were +given changed. Software Management was done this way. + +A specification in **`xml-ccsds-mo-standards` cannot be edited.** That is what the folder means: the +file is a published CCSDS artifact and the repository holds it as it was issued. So MC v001 keeps +its eight diagrams whatever this library does with them, and the difference has to be recorded +rather than removed. + +That is the case for the only two documents left with figures, and it is handled in three parts: + +- **`golden.sh` no longer captures `word/media`.** The images are the one part of a capture that + neither compresses nor deltas, a PNG shows nothing in a diff, and the new generator produces + none. `intended-differences.txt` carries the glob with the reasoning. +- **The drawing markup is normalised off the reference side.** What a picture leaves behind is one + paragraph in `word/document.xml` and one relationship in `word/_rels/document.xml.rels`; + `DocxGeneratorGoldenTest.withoutDrawings` removes exactly those from the captured part before + comparing. The alternative was a per-document budget, which would have meant no longer checking + two documents of 1.3 MB each over eight figures. **108 of 108 parts still match byte for byte.** +- **The validator warns.** `diagram.notRendered` fires for every diagram a specification declares, + because the whole argument against inline diagrams is that a picture nothing checks is worse than + no picture — and a diagram that quietly produces no figure would be that same failure in a new + form. #### What follows -- **Batik goes**, and `api-generator-lib` returns to zero third-party dependencies, which is where - §3 wanted it before the document generator forced the exception. `DocxDocument`'s rasterisation - path and the image parts of the package go with it. -- **The baseline loses ~0.27 MB of ten PNGs**, the part of it that neither compresses nor deltas - (§10.1). Everything else in the capture is text and costs almost nothing to keep. +- **Batik is gone**, and `api-generator-lib` is back to zero third-party dependencies, which is + where §3 wanted it before the document generator forced the exception. `DocxDocument.rasterise` + (39 lines), `addDiagram`, `DocxBody.appendDrawing` and the image relationships went with it — + about 90 lines in three files, and three dependencies. +- **The baseline holds no images at all**, which was the part of it that neither compressed nor + deltaed (§10.1). Everything else in a capture is text and costs almost nothing to keep. - **MC v001 stays in the golden tests regardless.** Its Java tree is 0.13 MB, `apis/pom.xml:72` still builds and ships `api-area004-v001-mc`, and none of that has anything to do with diagrams. A superseded book is not an unshipped one. @@ -1978,7 +1984,7 @@ the evidence that settled them, so that they are not silently reopened: | MOSpec normalises the older `ObjectRef(X)` spelling; the XML comes back modernised | §7.9 | | A comment written empty stays empty, and is shown as one | §7.5 | | docx: output unchanged, OOXML layer lifted, styles to resource files | §8 | -| Batik is the one third-party dependency, for rasterising declared diagrams — and temporary | §3, §8.3 | +| No third-party dependencies; Batik went with diagram rasterisation | §3, §8.3 | | The XHTML generator is ported, not dropped, as Phase 6 | §8, §10.7 | | The XHTML page is named after its specification, so two versions of an area no longer collide | §10.7 | | A type that contains itself is drawn once and linked, not expanded | §10.7 | @@ -1987,5 +1993,5 @@ the evidence that settled them, so that they are not silently reopened: | Rewrite rather than port; no language abstraction before a second language | §8, §8.1 | | Parallel generation, with determinism as the binding constraint | §8.2 | | Parallel running through 14.x, cut-over at v15.0 | §3, §10.9 | -| Inline SVG diagrams leave the specification; remove them from the XML, not from the tests | §8.3 | +| Inline SVG diagrams are not rendered; removed from prototype XML, recorded as a difference for published files | §8.3 | | The library compiles in the reactor; its corpus tests live in a testbed | §10.8 | diff --git a/api-generator/api-generator-lib/pom.xml b/api-generator/api-generator-lib/pom.xml index 550ed8e5..cddef2df 100644 --- a/api-generator/api-generator-lib/pom.xml +++ b/api-generator/api-generator-lib/pom.xml @@ -67,10 +67,11 @@ - - org.apache.xmlgraphics - batik-rasterizer - 1.16 - - - xml-apis - xml-apis - - - xalan - xalan - - - org.apache.xmlgraphics - fop - - - org.apache.xmlgraphics - batik-bridge - - - - - org.apache.xmlgraphics - batik-codec - 1.16 - - - xml-apis - xml-apis - - - xalan - xalan - - - org.apache.xmlgraphics - batik-js - - - - - org.apache.xmlgraphics - batik-anim - 1.16 - - - xml-apis - xml-apis - - - xalan - xalan - - - diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/docx/DocxBody.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/docx/DocxBody.java index 1b46db01..1cf60c1b 100644 --- a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/docx/DocxBody.java +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/docx/DocxBody.java @@ -296,36 +296,6 @@ public void sectionBreak() { buffer.append(""); } - /** - * Places a picture in the text, as wide as the page allows. - * - * @param index Which picture this is, which is also what the relationship is named. - * @param height How tall to draw it, in English Metric Units. - * @param width How wide to draw it, in English Metric Units. - */ - void appendDrawing(int index, int height, int width) { - // Appended as it stands, like the breaks: a picture sits in the run of text rather - // than on a line of its own. - buffer.append("" - + "" - + "" - + "" - + "" - + "" - + "" - + "" - + "" - + ""); - } - /** * @return everything written so far. */ diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/docx/DocxDocument.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/docx/DocxDocument.java index 08cded72..0dcaae8b 100644 --- a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/docx/DocxDocument.java +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/docx/DocxDocument.java @@ -20,7 +20,6 @@ */ package esa.mo.apigen.generators.docx; -import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; @@ -28,26 +27,14 @@ import java.io.OutputStreamWriter; import java.io.Writer; import java.nio.charset.Charset; -import java.util.ArrayList; -import java.util.List; -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import org.apache.batik.anim.dom.SVGDOMImplementation; -import org.apache.batik.transcoder.TranscoderInput; -import org.apache.batik.transcoder.TranscoderOutput; -import org.apache.batik.transcoder.image.PNGTranscoder; -import org.w3c.dom.DOMImplementation; -import org.w3c.dom.Document; -import org.w3c.dom.Element; -import org.w3c.dom.Node; /** * One Word document: its body, its numbering, and the parts that go around them. *

                  * A .docx is a zip of XML parts. Everything fixed comes out of the module's resources; what - * is left is the body, the numbering, and the relationships that name the images. This - * writes the parts into a directory, which is what the comparison against the reference - * output reads and what a zip is made from. + * is left is the body, the numbering, and the relationships. This writes the parts into a + * directory, which is what the comparison against the reference output reads and what a zip + * is made from. */ public final class DocxDocument { @@ -93,8 +80,6 @@ public final class DocxDocument { private final DocxBody body; - private final List images = new ArrayList(); - /** * @param folder The directory the parts are written into. * @throws IOException if the fixed parts are missing from the build. @@ -112,26 +97,6 @@ public DocxBody getBody() { return body; } - /** - * Adds a diagram, rasterised from the SVG the specification declares. - *

                  - * A .docx carries pictures, not drawings, so the SVG is rendered to a PNG beside the - * document and the body points at it. The drawing is set to the width of the text and - * as tall as its own proportions make it. - * - * @param svg The SVG of the diagram, as the specification wrote it. - * @throws IOException if the diagram cannot be read or rendered. - */ - public void addDiagram(String svg) throws IOException { - int index = images.size() + 1; - String name = "image" + index; - int[] size = rasterise(svg, new File(folder, "word/media"), name); - images.add(name); - - int height = size[1] * (WIDTH_EMU / size[0]); - body.appendDrawing(index, height, WIDTH_EMU); - } - /** * Writes every part of the document. * @@ -150,63 +115,8 @@ public void write() throws IOException { + DocxText.line(1, "", DocxText.BODY_SEPARATOR) + DocxText.line(0, "", DocxText.BODY_SEPARATOR)); - StringBuilder rels = new StringBuilder(RELATIONSHIPS); - for (String image : images) { - rels.append(""); - } write(new File(folder, "word/_rels/document.xml.rels"), - rels.append("").toString()); - } - - /** - * Renders an SVG diagram to a PNG. - * - * @param svg The SVG the specification declares. - * @param into The directory to write the image into. - * @param name The name of the image, without its extension. - * @return the width and height the SVG says it is. - * @throws IOException if the diagram cannot be read or rendered. - */ - private static int[] rasterise(String svg, File into, String name) throws IOException { - try { - DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); - factory.setNamespaceAware(true); - DocumentBuilder builder = factory.newDocumentBuilder(); - Element declared = builder.parse( - new ByteArrayInputStream(svg.getBytes(UTF8))).getDocumentElement(); - - // Rebuilt on Batik's own document rather than rendered where it stands: the - // transcoder reads the size off the root, and the declared SVG is a fragment of - // a specification rather than a document in its own right. - DOMImplementation impl = SVGDOMImplementation.getDOMImplementation(); - Document document = impl.createDocument( - SVGDOMImplementation.SVG_NAMESPACE_URI, "svg", null); - Element root = document.getDocumentElement(); - int[] size = new int[]{ - Integer.parseInt(declared.getAttribute("width")), - Integer.parseInt(declared.getAttribute("height"))}; - root.setAttributeNS(null, "width", declared.getAttribute("width")); - root.setAttributeNS(null, "height", declared.getAttribute("height")); - Node imported = document.importNode(declared, true); - root.appendChild(imported); - - into.mkdirs(); - OutputStream out = new FileOutputStream(new File(into, name + ".png")); - try { - new PNGTranscoder().transcode( - new TranscoderInput(document), new TranscoderOutput(out)); - out.flush(); - } finally { - out.close(); - } - return size; - } catch (IOException ex) { - throw ex; - } catch (Exception ex) { - throw new IOException("Could not render the diagram '" + name + "'", ex); - } + RELATIONSHIPS + ""); } private static void write(File file, String content) throws IOException { diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/docx/DocxGenerator.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/docx/DocxGenerator.java index f31c7aa2..74f827ee 100644 --- a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/docx/DocxGenerator.java +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/generators/docx/DocxGenerator.java @@ -37,7 +37,6 @@ import esa.mo.apigen.model.com.ObjectLink; import esa.mo.apigen.model.com.ObjectReference; import esa.mo.apigen.model.docs.DocSection; -import esa.mo.apigen.model.docs.Diagram; import esa.mo.apigen.model.types.AttributeType; import esa.mo.apigen.model.types.CompositeType; import esa.mo.apigen.model.types.EnumerationItem; @@ -272,9 +271,6 @@ private void writeComUsage(DocxBody body, DocxDocument document, Area area, Serv + (hasEvents ? (hasObjects ? " and event" : " event") : "") + " relationships"; body.title(3, "COM Object Relationships"); body.comment("The Figure below shows the " + what + " for this service:"); - for (Diagram diagram : com.getDocumentation().getDiagrams()) { - document.addDiagram(diagram.getSvg()); - } body.figureCaption(service.getName() + " Service " + what); } diff --git a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/validation/Validator.java b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/validation/Validator.java index ea335cee..075bb1c4 100644 --- a/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/validation/Validator.java +++ b/api-generator/api-generator-lib/src/main/java/esa/mo/apigen/validation/Validator.java @@ -31,6 +31,7 @@ import esa.mo.apigen.model.Service; import esa.mo.apigen.model.Specification; import esa.mo.apigen.model.com.COMFeatures; +import esa.mo.apigen.model.docs.Diagram; import esa.mo.apigen.model.com.COMObject; import esa.mo.apigen.model.com.ObjectLink; import esa.mo.apigen.model.types.CompositeType; @@ -378,6 +379,26 @@ private void checkCom(MOModel model, Service service, COMFeatures com, Set numbers = new HashSet(); checkComObjects(model, service, com.getObjects(), "object", numbers, result); checkComObjects(model, service, com.getEvents(), "event", numbers, result); + checkDiagrams(service, com, result); + } + + /** + * A diagram declared inside a specification is no longer drawn into anything. + *

                  + * The schema still permits {@code }, and the importer still reads it, so a + * specification can carry one; nothing renders it. Saying so is the point - the reason + * the support went is that an SVG inside a specification is a picture nothing can check + * against the model it claims to describe (design section 8.3), and a diagram that + * quietly produces no figure would be the same failure in a new form. + */ + private void checkDiagrams(Service service, COMFeatures com, ValidationResult result) { + for (Diagram diagram : com.getDocumentation().getDiagrams()) { + result.add(issue(Severity.WARNING, "diagram.notRendered", + "Diagram '" + diagram.getName() + "' in service " + service.getName() + + " is declared in the specification but is not rendered into any" + + " output; diagrams belong beside a specification, not inside it", + service.getLocation())); + } } private void checkComObjects(MOModel model, Service service, List objects, diff --git a/api-generator/golden/golden.sh b/api-generator/golden/golden.sh index 2701291d..56497da1 100755 --- a/api-generator/golden/golden.sh +++ b/api-generator/golden/golden.sh @@ -76,6 +76,11 @@ snapshot_docx() { local out="$dest/$set_name/$name" mkdir -p "$out" (cd "$out" && unzip -oq "$f") # unzip: word/document.xml et al diff as text + # The rasterised diagrams are not kept. The new generator no longer draws them + # (DESIGN.md 8.3), they are the only part of a capture that neither compresses + # nor deltas, and a PNG shows nothing in a diff. What the old generator still + # emits around them is compared, with the drawing markup normalised away. + rm -rf "$out/word/media" n=$((n+1)) done < <(find "$tmp/$set_name" -name '*.docx' -print0 2>/dev/null) done diff --git a/api-generator/golden/intended-differences.txt b/api-generator/golden/intended-differences.txt index 76788a95..20fb4b76 100644 --- a/api-generator/golden/intended-differences.txt +++ b/api-generator/golden/intended-differences.txt @@ -13,7 +13,7 @@ # # --------------------------------------------------------------------------- -# (none) +word/media # the rasterised diagrams - see below - 2026-08-23 # # There was one, and it was fixed rather than tolerated: the existing generator documented # an error under the number of another area's error of the same name, because it looked @@ -21,3 +21,23 @@ # as COM's 70000 and MC v002's Invalid as MPD's 1, while the XML says 1 and 3 and the # generated Java has always said 1 and 3. MOTypeRegistry now holds an error under its area # as well as its name, both generators agree, and the baseline was re-captured. - 2026-08-22 +# +# Diagrams declared inside a specification are no longer rendered. An SVG sitting in the +# XML is a picture of the model that nothing can check against the model, and the support +# for it cost this library its only third-party dependency (Batik). The reasoning and the +# order of removal are in ../api-generator-lib/DESIGN.md 8.3. +# +# Where the specification is a prototype, the diagrams come out of the XML and there is no +# difference to record: Software Management was done that way. The standards files cannot +# be edited - they are published - so MC v001 still declares eight diagrams that the old +# generator still rasterises and the new one does not. That is the difference recorded +# here, and it is confined to two documents: +# +# docx/standards/Service_Specification_area004-v001-MC +# docx/prototypes/Service_Specification_area004-v001-MC +# +# 'word/media' keeps the PNGs out of the capture entirely. The drawing markup they leave +# behind in word/document.xml and word/_rels/document.xml.rels is normalised out of the +# reference side by DocxGeneratorGoldenTest, so those two parts stay compared in full +# rather than being given a budget - a document of 1.3 MB is too much to stop checking +# over eight figures. - 2026-08-23 diff --git a/testbeds/testbed-api-generator/baseline/MANIFEST b/testbeds/testbed-api-generator/baseline/MANIFEST index 220b356b..6c2c1821 100644 --- a/testbeds/testbed-api-generator/baseline/MANIFEST +++ b/testbeds/testbed-api-generator/baseline/MANIFEST @@ -1,5 +1,5 @@ -captured: 2026-08-23T11:24:15Z -commit: b2cef8cd +captured: 2026-08-23T11:52:10Z +commit: ab46c0a6 branch: v14.2 java files: 950 docx documents: 18 diff --git a/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area004-v001-MC/word/media/image1.png b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area004-v001-MC/word/media/image1.png deleted file mode 100644 index 99affc6fa9c9a948a7d0814887d6f96da3b1af86..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35930 zcmce-2Q=IN|HrF?wv>KbRV_sqs*2X$TE1xQt#;KGi5Z)8P^}iNy;ao=L6IOvYn0kM zh}aSmJ0b{iKYsuFzxRL6J$IaY?zwuJR6b4e8Sl?)JfDx(M*}@gR%R|{1_lP!=gQ0e)e6rLFld!|}{s^nN17-nD1`kqoH|Dz||r}`lG1_Q&Pxmwk5gB!b4 z^Un(|oD)6i=qJ8-k@IQnkZ zVDNh6Qn~`HIX>QKq}K2`V(yH!ZPoP304J;@qz}FwypdChjw8s%ceS>tb&sZue+j1TEnn{6=62h}4Z7Ia7Mn*o- zSUhlgOmg3zlJ}9cZOySmh*;(A&@+0im1Jzq%~EVE|7|?z!_YslLoD0gyiotQjTrMd z#bv^I^uhjA|7KdqNM%SZlafV$QevVBXElx0x>QJ|+ITIUamvR|f4m?Geu-3fn{`+< zB-r2_1H&)aJxLYmmtX4x%8I_WicxgnFO=INU%*uOVraotEZNO^b!MkdO+&)v*b~9E z>%*{IP!ff#O)A@-4I7o(UgCh*h>5M_o13lV(%__+fU%|eqswAt1_^)ECH+VKzElW& zqQoP2rLge5=xE{wHmE>GI=9y3?=5QJaPs{lao;!>TPgMk@P!Lo-9|94inw$ck!&zp zx`RqYKY4d<%zQ@E-Km&>w0a;6Q&ur8`G;5_ViW!hO>J9zaS6C&KGgE%;m|wM&#Un3 z=5biKbA}80$=*S*TkswP=cgv8|FUmj>(4d<`{yS|l;W_Zv{*3%dx4-nwiwDC>(+sA zt?{(NSJNIHrQnFu`9{bU9NJ8rhSa}sK`7hpQ_4**kvYuwnUz` z=KRp(0h|AtXI5gF^oX)y+)*Q&qu2KPMbiCj8LXc|FB3km<4U58r{zmN@&Om71&lUa zo#M#*YaEdN&GwEqAJKSif_tIf$I-bJ$x7XAdHou=C7-w|mwnDyUS$nMmU}_E|5fK- zlU$atl9XG<{?Bg&Q?khjv72?iuTi^99QhD%TkP(7yYrJcZ)gJj%uJc{H{mIyg&?wQQ9 zlw!Gm-?I-RxcjG#Ym~*6oZR_vI3dBfpEwR0z5lJ@jdHqt7-#uO#8D-$u&&yfw`N-v zxJmej6s%2zs8SVOqoO~JHU^ju7W94%#_um>KXKP=s6GA~RDZngF6ZxAp*CnU)6`=D zp7Bo#B(ze}W%nJu>~^rHlt4%qbnxQ6$B#!Dk1Tw5OH4n-BihI1{bc(hm&Nnn_Sf2A z>!(mue&W&IX%QR$pLV-{biWe)F*>$$C)f6Ov-8epETs6y-ku|F27~~D6vy@1vR2J` zoNRCI?eKM`Un}h8gN>K^hsR|w_aBbvpS#pv+`(gN1KO^04_1F1whdw7wB-x-%MK0Q zzCRW*>%t^6Ad>aK(E@2r*~;#y5fl1Gopvn{PQPlJ!CgSS#O@!*8-pps2a3n}*q^D? zUp{9+tZW^@L9LvWoJ6lTG?JIo*^D`^FE3dB1qZ}n(WdhpY(OCA4a_1OyiXT*+Nul8SrnLvYleTnGzrlqd4j5xX-YpL{V zvM?Fbx?YC>Zpqh~kEc!pXY7e96Y%(dl}-LhKXr1QC4h(jdVJ#A^z2807B)abn4do> z0oeM)m43W6t;sz?oD{M|&Tm?Xz#fV}U1-LoJ5AE~JV$=r*6s_kvkeI;!*W_dNRK5t zoL()&n-q_kN6Tji_F-v$Qv&UO1VX|u<)x_c&bi%_0%NdhJ z6@KV9?Wt+%79k89U#~a9wJb><*75J-tk;w4sECs2PuhJ$+h`}OcjLhycktxR{BAA| z!yHXfL)Q=G8PqOr&`3$pg|PkJYe!A<6_d6$T4BMX@hK@Lx0;)`Gp+zjGM;}sn24?B z*Ai>4*8&o3iEWnZM9YR|&Qb2)VgGvh^@f^ggs0t~-VE8GLhSk^tELqA0AhNd^Ly?) zuKPfg4Y=vX$qK)EbG48SlVtkRmXAGt0k_lN;psmYw#p6S;3B#Z9|BpCiashcEK7Jla+4~u0|t~-6uCN{v=akrWJK-+!xJLVmWFY z2;RChD9E8vNqo(N}UPytI4D+>^NFSS^)nS^|2-02^ z3rbWn_82%NzysLDXl^T6E=mK8KWjJb6k9Ms?id;uYb|fV{E46SjnWD z5kDO#Hn6j)w2~WyhOA4gp#wUK$h}K79!vJ924ER~qgj-gOnRSXq`7yG-ESn%G08N# zetp8(qMdxvhYYTmwvS!Pe+*Z|+5%NXOt4eF*46HAG_ZhfadJYneN|PXS>VHhwhJxx zC{YgG57R%m5xSuKu=RWnu7Pqy@U$`R2vUem#!$FpSN08s{WPgva$_K?0?7!Y5fTyn%*X}uvdWzrf-hrp5bXJEs zO(y5WUpYP~;x-kIN@IC@=U|Vli~pV*53;eNg$Pbx0QTZ|Y{0`R2{hKZQE%^f-%_@m zMD&8ixieqb^*wc9f}~LVRMifz-bjNsb{3sAw(BeG?k4Trmi{$k)e$EMo%xMQCGQ$B-M&FP-cQZSc^o9%7t4KGFCx?o{bi5!(I1LFXpQ8UIv?ejVMr1mzfm+@(X#znNGHfPM#PS6h|WK~>^k!26G{O#a@ z_5DZPhngXyMg*%?++ksMQ6X=Di8oFcLNYTnF5EB#>ct>V;QD610lFH`A|W-VOUv-z zXATY>*oI;qLJtGKYo#!Ei7U-N$qWr^wEouj+|lGaOGSJ1*$20N(K4wH)a>i#`j9y+ z@)1z3IAZ%HDjiI)$qSzcCH0)FmKGKgs(L)9{o^kTnBv-h9~aKu)yxnVSf~;IjJn0Z zPx!OQM_qmspyRri~tomIE1^=40pY~Bi zV2S)nd)zk;+tT`r)wT+bLLIQu4W!KxNp zg=!zIVqRf$H&$h6(AuVlf@e>9tIx(#?glS_R>YMuc{lT<(^8f2dDZOK{?pFm%Qbw{B}w3G-sWOsze_*4DmixMM{Ie_~;wpINMp+omL2e7!NcgLc zQOYCSCHrj}ls4@jx(9`XIHfg(=zkW_cg=9xpSzplw%c%YaQF^x((vM&%R%9Sv>Pqf zm6g|ELu{ive&!PK?{96zX4sCNM3N9kCb$l}o>m;PURnal63!m3jOw4t6L(TIse4sK zQ<4`jl<`l?1*!K0K&_*bsEGbDPrvB|w{?=We zpBrL|^fRrx($EDYiM~Pgpu4kbRC5ejtlUckWotX6U0&)lY%7&3Ud1Q4W>A*S=m&%_ zuA@nJO4yGv3r~l|A`bV7h6pY@%Qgw{SZ0`I`rEjkJGp8 zMy*9}ZNuR<+J2N0dwH)%AoGumpYH7Z7UZ@;#o%>6!S&0v7fGaipxLQoc@31gJ9I(V zeSUt^GraJ;dMLB|-2C~IK%7&s>Lo&yf)k88*p_VeP$KKyW;f0DR+S#uh`(sn6vaR> ziH05?KVvm>R*pqYCX#8d4xOPJM$dT=VsH`XG$~MA zc9?6pTmH2)hKz~Qx)7UgN}AuQv|6*6%8zp!a0K&GtKaI2w=UCS5>#Srh)bP;!t7Q( zBB_4nSG7WjjE7=D6s-r7u~BA@9?LhW{n89smACo(w|G79%;_+bir39uNvzW3q55=1 z@}ZBqI{$syam}YeVL(+w!eeI$qT?=ogZ`+g-)i3O)6Vf)DQsf{Zz#A!e;GX}v_tS7 z8uG9gt2cBQNrNtXl^Pj01_l5J_yc`Qq}SiNt=hY-zxl(5mtpiJ)B|J7;KfR%2bTBL zlY|9GM{&&ts;|CWfaT$Q1|Qop=Wu-2c1K{AD}^4|i5gs@>>HWeaS-tRX@v4KQ4Kb5 z550BLSIu*5J&(wRAqD*R0*i-rZL`5IG-JoTQ{GWlS<3In)t#L{_iK_l8B6rb7cA>N zYOMbBi#?k;mQ~M?79=K!y&WmCe`{8rHH$YbnJv4d+zUU=c+LGt!;by^kqIH*bh6Sn z=|U&6=@BJ_Xu8CrZD{TBg^h0_Z%rXN{Z)UJTz9d3@KOx*Dp&mX)YKFQ|tuI@%CP2X4E#wBsr{F+kBNQvkGySSjrD$01ir;OXn)w6E8GYR1+-QriKv zr!N6KuO$vvyLAsj53hkIt`vV)CliMbB1g#6TRU(Hs|s0wwbOi%Dyr63+j8*Id;v&A-h?}6IL-T z^~_>d456P!J|K&sDf6kO6Ungeo;)>frbd^j7T;K5KcGR?{ZC`u_eXGl}pufkfK_Lel0#5Ls z*B%D*D-FoV(5B->RP27{X&~&AWJd&#^SI6)`*# z*xKmM=I57_BZ;RiD~Xz9vU9*;x0z#8>c^oFzA(@5$?%~wI|mB8ihsxmhD}s(^^B@+ zR+F|^Os&pI&wJ+FE1M6zO8!actqG=DQB)*pB9~R_AhP>vn4;lbjWUC(F%`GLRW@c8 z%IMd;Elanz^Rsi>qs4%>6Ci=5Kt_qJcwbq3>8{h-fy4H0-+|`Dc=}u4f3XBQ+f(|cDiw99d zuc{!I6Vl08wr)ady4tW&)%Hahn*EU18*QD+oCh0@mUz7?r3^n^_dc=;`7$+O2RpV3 z<&e&CzAe4xqSZTnruU!#(JCMng>xr9?kFiOws?xyy502yf0{@4{0yidzYu>1&n{j1 zI_Ra5Z)eRA;;h@$=T$80RzR^u_+4F~iP!3_3Z$KqO=7Lz2(7gRCHtGTZ{LPk)`|ai zAE~HdDHvN2U|{2YF~it%aY4CWE2U=7u)Mi(tmd;NN6$f|&XXFMSghF+h5K#|AU+3( z{oQxo&<)yNnX%UP#D~~F#47bor~I^6chT>LD+zGBCd3;lb|*dLU7SG4*RT|swQg9~ zLXXLeG(2$UDi>kk5|Qp6x#=M=qGP2jsHSV6 zd(_vXJfWi23K9Q3es<74Oka;=XrU#Y8#Ex{oON%d$aw~nOy144YgxS}lp=up+ zV~_WaWNy$hq&TAP{{6}k$Hg7`-IUZ{S(ZX&P0V=5{B-hePgnthveMz3B$r)-&yz5V zmdXwKa-mlrXxUE9Ziu^0iU!PRX}s*~LAFhDCxQ2R&qv(YUfdcI$r7%k$%?C1IlcSA zn&iKqVrNqv9yjJsZO!zQcHNc1a>@D?w+N#8#rvl}y^2x{^WM?I5UuzdBgc;fGrL(a zj~_o@7w}Y3*{Gh$W4HO_+om)Ywcplj)0r~O(AUq{hTBA z9CpaVYQWbAj20Jtrk`4C(-=H9+s>*=Rv7^c=+M7NJt~yaNZqd5G5WH9{%3Q*<8D7W zryDQ{k=u=I+@cbZ_{3mmOBeDjCCN*kkke$siiB=a7~Y*-5taH#zD>u@gIF2%z&}0S zZSV8IQ=<_q{DXRb)z`to}2T-V?|UJj9)U-$=LDortTjAyR<$nhA(0y6%sB6zn5ukp02 z!o}`0OaA3^^OCPdd~jhQ94L=T?+&*;vIR{FtK18SdfhWB`pMT8tDLNUNnj>+iAII2 zz5ZtljH$Qt^nD=@OfQc1WmUJo9ypY_k=~8^deQ1Zh^FnNxIX^p`rGP?)a1ZnZ3yL>pHWma*P0q5wDq9WBveVJocVb$hQM>KS zMvux&)=$2)CK0D1)-EI&DWuj@NHtFZO+ z%vwXw>C+9Aodk-c>-d#Mn&lY1gO$WNbht^vvA#jFbd^_8iMv3(n7l~B7UFtbJZ-CU zM|PEvGN-0P%uV|bI37eef_@{-%H`(Yv)0ULf05bjKT5GhdU(Y`@dd#(hcNdb(&n73 zjZqbYm zV*R+M2Jyasiu9hn_hIOmt(2R!ELL7RagyE-^wmrH8~VRb10r&5&+3MM8;gR^pW;*zIs(c`&lY&PMG5V zjdZ-kJ@TZy5xU)t94k{PI2YXS+dANs?QE5tAt~ykN9bmvhKIS62I(v~-48cbshoa| z3z+65xzC@qM%w-=i~?QT`lk-}vCe)L?qlX^z;2{J_PC#YXrn+OD%d%}!-`+2pSDS1 zQb24~6mr!%c?7Uv`RBIb0wo4dVN{V)Bqa!N4}VTM1}IN?fp4%w;Kh1*8&i9&{&s+K zSYEE&d*uHQR(~S)HkjsO70JAhwjU=-()-p5bIMVG>)|?(KpANQuT)LOnZn~b1$W*( z9G(tcVy4ERc0&Wxgx_(?>!;+{@nXRDL`5gUKnSQ+Tw1y!I0YT};j>n!v>&cm-Y;wJ zJ(@Nl6G!tARVdAIQrj=4Z4N5*`h}pn*0*e^{r>I#VwF$#iv@{w$pN!7Z^KI&UibV@ zeZKzg;Ny>g5iuR{DCePCj?;%Y{Xu1RoiLpNQB(2dx9gu+@w5j_QLneJ-CHd5e3QtHn+LgCrnDy|wdkg4k{$B|A zo93HRlMJti0ja*?PXp3YJ6xscSA%ki8GjCB&C(EKWBjLg2E7rX(NJyO+&5Vm5#cxr zw|WNL(qs9o%ppYAkOfIo_{{=yO{py%?Pt#nJJy?vbXHzAKE`jW)aYx*{(+Oha|c_b zF=n=HiVlp7qeOqwHv>FEw{GM@eKW=ysKX0Twv8=SJ>3rGaG)bR0kyh& znN7gIboz9Op;B{wKygt9!8^IwlG@W8EGK%xI3c-qP)XghEv`y3%~EMzWC!~I3` z7v2z`O0!bs%=|v)CDjqaSM8ln2NuO)+mL;q(V}GiOFP+xx>nzRKFpCB&{PS-YLH|! zO3Y{WA?YYo3Y@Ur9bE$Ih{nGl9~P69=G!?A_ET)4V|2}GO7=%K1}C%0FQJVK<~;H@ z3A{Agl3^HGK5&`NwQg-?7hct##nPQk3)v`1cRChF=NmKP0s^F{foM6;JX?!mz|t0$ zk}?I_raFRvWShBX16q{em9QdrV%WT9flPkJ)wf6F-qs(*%)X%{WoEv5I}D+~h%%h% z;AizeNA*P&!^lCx`{x2l9nTd;N{+7T9w5qq7Qbgy!e!c4#46k%V8&J*O1kPd+_dLj zbxkyO^K6;QU1eqUD#E(4k&%1yiWN#-2>)+<$W8XFqES$+>oERVWdFlLGxH?B;p6eE zZe!ZsaWJc3157|Vf-}3(B+sr^r_vechTr=W*4WM{kuW&ruN;o5(@Hu&^tSz+pBiC> zi@If6kF>b~XcOa+v!Kbu-PL!jtvA-|VMw#|u)wVejS_cJ>D~31!KfU_h?T%<%=NL( z$bBwK^Ju9Xrnuk&DVep0;?6k&Xh?y?3v9bmZ*Vk5dUktF7x3(J-K`o=sD@~HFjLP(v+jKw*yVvH@sofL^okKUes6O_wcjE)!hovl0gUTetG^eHJPSuoZB~b1D}7BB)K&nP5^Q z^kAp)+C=u56L6#Un}@JlxiXouI`AG)kKeo0gWa0)LO7^_fcs^F^r%n{E=+TwJ2Z+J z>gaqwxMW$XUIp3Ffo(PsgQw3HY~@t@*^eM?RlGc*k^Pe-i$8iWzmDGY@ezqwY_C1~Q~h~RR(yVe-po>qb$^K7m=)YPT)(LArPb>- zZmp?CM2V4{UGg=|MG2RUQ6MkW0EIkH7_E4l9xg=A#B!X?pd|dAI>B@TD>bR11Sk8+d z`qQBBKfZhGQQV78s>=Xcu@kX%ZoLd|83v#cKe)?GyE;{6CvBM6hGLK+;nrls^yxF9K4s@*`Id(-GIS2s zQ#z_a`kz5d3a0eX@O47}99ju?Q=BxGA0H0*=tmYRtyw5jXjuf3;x)g>Q(`O9Tw->i z``SoUoOQvHaGYZr#7cT5*mKQJJ{Azihaa;WHRseSVHL6UAS*N=^k>}3yP`BK(PFRn zJugA$iNX!9<8i;98V#4LSX}E#T0*#4O|qx@%ERg=s^uPNXLaPU>!T0f$5>G9=`A0u zQ))V-E9`i}Xsu@L?ff}ghq}j3DES$a+gQ1kvHb5O`K=E8vwlfz2?XVN%w><(yBPd^ z`UVLlGMh%lB?GnsdR;*x90$&BE&-SaoIYKLdSy2BTmB7(FL{kL{rh&QIjV2Nd~F2o z%tsXVyF2@*gQa3+|0z7ZKU~jnb}xi9mn}t^Up5tWjp2dTjUoEEV!`kQyp)Y;(aSN& z8GR)~^RN)R?UdM7|1P^O<$>NMlpOt&-ieKCwfqGBCZjIH1=jcVqiScVYs<6=}E3k4eiJjx96Vv#) zaX@_scW?V3pgR_6cQ7N4y&?0uvb^-e?T5o2InLO4&v(AX@lP9WJO!NZL*K}=v|5!A zEP}bNrs4frnvnQ|+t{6=9WyH{P3KF~=4wgqG3KoYk*3X%-yXRWT|#YjvsuTB8#ltt zjH~?J{F@0QIipM{PCJWy{SK!!u9s*I#Un>0^VMEIVKd$#1wM!Y93%i*=n{1fx3uwW zsL~4}AJigF`4-p}0xfSaF>n=DGrAD_KrWNp4q&eKvu-;0kQi`_ByB^q%y`MLU1oi+4^H`B~H zQ_5IBY(0cJNKd*|$RaU&%nidbFf4X5sbM|+{*;IK*c2GHwlL?^$zXRjEkaD{O$?A` zEfofKjhh}0fGGc4ZY=}6RQ;4bn>+q+_%2&!=a^R3<=7nVA%p(U*4dzxh%OGb(S1B~ z@Nuv6B=YWLO}tA*7!q6&LZuW~oF=cFRMn(U;MOIT-r90$G`+bHbZYlzN4}g&2LJ&X zf2sRYWT*s-B~4tTGvQm7N4_eps;6QsrV3qJYs+Yb#R`EEZ-Jn=NB9W~hE<#ED(x(X zir5AHr2VdE?eGJ|rLBAC*w*Y&BFZ55K3{~J@eRKI-CR7A2lXk%AiJD-V?`yfg%fP8 z$%A6Dt$Us*_koK1>=`i3jQc>N@n;w1WAAu5uvm(9;YM;}I0RHENtm;gFMM)6O?oQA zHN;`^<9PLD84sHr;4ZDX&na@nOOH?v0v42Zv{LqG`jGUaaECt3CkL}5k^W-V3jIsR zHl9srz4E5<#nQ2$O?rAd>SeQS2+c8PyVojjgjUIjrx*1*w zx;z;4z*e%H^!}x0>mD60jmYRI#;N$c>UfLfe+RaYQJQLvdH*~pMe(bmZ0_J1Z{#h$3E!xYn@~kV!@MXdvBkA0K*_nX?lh`5 z#j8YMe}P?We`oD=c>KzWcY!_LwA$-svOSi55!->;&1IG5WQt^F%A|%>{~lm+=63Ec z;M-D3I=Yh)(RMZ9)Ia}h68b3XN{{jTTXOKqTwf~{Avx20twp7^Wr4K+W_L*T4UOLa z=?XHxf}u*o_gP$Mf>d%ZGCNzCdy(1pSF$#Da(}_`<}r!~{e5)dja*${^IEbNB44(( zZt6<_BJbs+Xr>dCXV%jY>E{)D*PNjam%avd#D9>a*Q?Ia0?voDp82aM zhw%UF58c_8P}g*Ag;6#kt)K@ld1CLr>1RCOt0r3}%km!&Py*7UTkMFF4e^}>%c)qkNhfYl<^aVCR+21`pz%Wy$MU2?XvzQk0bIfIWo zqm(3nv}&O&+i9L6^`O-D(um2kit>!zmgS^$-lh(v@c-5J0BVXnf}L#|IOK@8tjxbm zyRJjnoM#N^;6Q&j&T;&+oL7?6I#TAVzBa{E21L@Y3v@F8R|4$cE;MlHv&~o1F$jec zJXmn02@PL?_al;8m*@2A3)thM&ZWKp8pksWB{kf2)I|5I|l<p-tN$F&1wcq1btn}Ky1ugZeM0lgZ~ zHLvb4CHo9BgmNk2y`&Dy+R9TN;GmDc4jhiZRwqu^eAi%W9+4<}wf_(2tD~b($#qh% zXdqpF$&&GGAbNjE#{fB3uYVkgFdgd`D?@d?qnctmQ_O3jjSW9iY%TJm*2@tx(-tYD zUCoASRb4L5!Er;ucWbk!D1M92GPAkrO^lm732D>g5%Wg;@1_=jhIOaAM=3jKROcTg z|GhRb?W5nnmEEVS1CeW!H)r4*r&)Pl*oE;GC*@}YykzO&{-H^+YEcH#Z~yk%G<$-B z60rB3xaRNrWB`!sO-I`)LCVv?*=wig0HbGI5nMP1mMu65Qcd8r;q}%XJAZgciq=Fyz=q}DRje}qy&r)EBDOxiYGjXP-J%2z zYkQ$pvI)z}_fUHHpEK5H4=d%2GEf>T>sYv>RR_}vXqt(JscToQfjnscq&(nAB#BGE z94oiFkM-j&V&P==vbiN*b@Wj)*0R{$v}L4Op9eD^Du4N$gX#CcX^-JGN$ymjKQWkY zaC;NhLjqZ|pw=`hea!*t0q6EM_~XN{BK;Z{&(EZ;uW77U=_xGBnbYFHm*(zQi$lIw z$!tzEwbY5Qb0mFPP*hM_Or$p=J-5EuYumu^C&WR1H(RzppNCgWPcFTv=wHrSFqN4* zz6|KdcKrH3$Y&QZrRW>vX@4pTNr|o-vm1?|ZvI`X(mf8_zl|B<<;!{XR`y*k@O9Sb zkE0V!0rR`Wgn9T!v4ZbOk#>hUr{;t_p8VIt`X@1Kh6vWC^yY}z0GvsO5Cw&ILQR(dkbYM zU^c8FkhFr{@wGIh%fcMO@fyFC6ugiwD0^yi&zJS0rkrE z*5AAr>~C{!Og%yQm3(oU@EPq0;l(ulcs(7Gmj-~2CSXWviHgp+Qm~{gDt+OvVpk+< z8&GjL7I&~22VlTSl*GE1o4b8^AbA~tzlsC#qi|A?4YQBtvH(jIGz-lpal3bY0iY-M z&DY8>?9+*Bi;IaSNuoCr9Wcxx#xFB3jH@%Bt3|L9GI+qPY>X+`U0(-GCFxq{#zsB( z(BcLOJ7A6U+f>kNJWW#Wz0YM<`TY&29}Ol|FX=HVeOcmmJybrN1- z=V-jy@J5>6a!0upfZO$?!Egr-CsPgPwzfdT0$`yLpgaaJ{W{;t6#WkHkf5E1Pu#nA zp{BXkA0V~J&j@$h`BKt#Nsr>`V9%_sWY)oNbjr>jG->BxS=gk}ecTO$t)fP(*Lo&5 z(Myw4Wn#DTYwkyuJJImmS_nOo`0DM zpuvcSps=02W6{Auhb=8F#R-mAK%=#@MS$Ixmi~K|`15260dnx>T_u9Qj$+C$wOdvr zA9~OB616lJ5buM>M2ut&dNZyC#I4a41MPIB+;QtDPGSD4SHC z4myEz0Vq!r)Tg{Q$&u#?8^NVT>cQg5cNlpKYy7LFt&oR2mw0%*Sxi;dM>Gl ztN7lmX1k6%?A9Mp*lJFGe+4HkMlu@^Lk84G3gx6s4*)WV^IvqDxEqm8U4uUuucCAq za5D1)$Yy;JOIHs3rud>2lfRv2JmhdZeL@fe{#vI9ZKbx?vT?mAH(?-?$I_yQx0$*c*OM?@tyxnlpW1gQ!q<9L_ zUt6}-Jllwq&0P;TBI2E@MO~&*1kEzPxv5C}25P0i%K5&yxUG$X=|E`^O>$?#31SPt z+;#uFaBlG`0jdt6TfeL#Sr}{UJpy9(A{>DQP|dqu^~5-QI$x8wbVc+&Vq>QY5QpxI zNQ!;%vXS!$MB13ermf*{zHA!+%>UYtQ&*eZ(tcThp`g~x273i$Wz$Tv&j8?;cBtF+ zqsa$H%Etnx@c4ca7*-_7`WD!ryaJTem>05ilf(l6WdL4hm*t6=4M&M|fIU-7PQ_uo zo3YpCfHa}h4Wlm!lv#)UTV|Eq1GN)2J3oq<0sF>vq#gy=y6E=rf;ao@w%K{4-Zb@& z=J!@U?1IjeJ{54KN=#j0};doYC3vGVaDY5aQ=_*EY|(=h=riHom^5h7>)%HZW;7#m;lES0-7ze8yajY0S7kq{QV?mBRPqk)Tca zR;efMqUX3gVh53b0ERlarIK|m7vBJ^_SqiMXysmDNfghwZxcUVDjz!MDdoG=ipr=% zaM^vHnb-JSWXazHt?7K}xn5;+%L6u}YjwvawfCL@hTb<$toJ{A z_G}P<}x1aAM6u__mT!)i&a=nY_H_eeKd5u&*$T@P4S%{3QPAo*777cn7xV6VIC zS07&gW-*NLZEc=#>N2AZG0suC6n=+JANIucyT0*i-E zCNwEo;bTiNpGs!(YUFMMAI>SH(O>&yH6`EL_#C!~Lxef=izF^3t}1M4>u3f4zbF_@x_yET3Q%Hd+IEF`49 z&@}xWfPepDWWco_0sVFeh)$y&8`3I;VIKhlxfkag7%pZd|00I#njsazf#ZzJi~*=? zxJ{JX16##%pwu-61XjSj`Yw1dCbv+pfAK(fv;;qlLzxdEc?Kt|<&1!#(VZSXpuXrz z4Xba~tnroaD;^GT8-c@d3k)z%)BAj{kj7eoZ;3C}*nFm=Gnz8vVMZ0@SX%JKgGypD z?obBu$Wl(K3i~vIA)33;b+xD)n9{h?aMG9N?t3(B^~v+dah0Q{tzc%k0L`MV#G9H2 zm=1-HW~y&lO+*Z{VNw(bVb7mE8(XcT?HuimiQX%pxn8_A0~sqaH*=qC0|DLB@(t2; z+L)zMpdAzl=rczU&pqwua_BXb^zRyjQ!r}aR{WXZjXYKhRbOp(aq<#bg|IM%QZb8S z>u_7u*1Zah<;|q<4doqOBj)u>6G{D+S&z@>e9-mje+uxv{SPELA6)+iOaXW#JLv%J z88CIFJqP~%{k+H?g~?`e^_&dE8>kwy_fLi%6*fE#+TO4uq;?QkIFWDzjcef4EKdX) zZa_`21%5;WT`F*Q0Q*-9pdbx#+RV#?wkbt{mDRy2KzwmG>n{YtuVesSS*oe}LpIS) z9~g{kwFCHn>jBVobuCaGr1J)OyjfqD)AV(*PPsOFo4r^q|i96o7fE`#i!nJ&%GrM zdqU!w$5Bj<>(@UStUh*m0Zax0^D|7Gugf78Mwe#n)Bt@0uvo_cLfa@Mc1dctw`Q_V zcoOF~USrJIUk{)b>wBeuLb3Ao9EjLu#x8XL)JbPAfubxnq^juAqfw^KdQT~9HdrN< zoLE|GFD!gSYySZ6jlFPTcX+uHUL$trj}qT*gR*1aC)QEGFm|J6vqNU|pn$vrQ0S93 z-xm7`1k01WAgaMxs!s+MoS_x_IKW7h1B&Y~pf?BN!Fvm->9$7+(N`}RP!UOqU%q_z zwgYcP5Qp;Lnj$-Q1-4e{${?B7@Gq0Ea=PzVES3t1`uwE{*733swdGWM8Bat z42_g{Gs}R1Y<%!%q|*`LUJMZyWP(IpEvvH}Ma@*DR*RVgHt~i)gcKTGJbtAJUT z|D9t0?@EU)W>$(RCYED#zknI9cx)f*3#6^0G@1GQB{>L+#M4~=iJ!XyY@Q6rNqq`H zrDdHc`b?V)j6+m!#ob~*nAiPfRs7|aO5-6>RNdePy7a$U0Cn8}vY;-jNjr0KbR4ip zPU63H1kP)Bn~jfk8LUkznbPUSlTB)t&4cD>>Rwu~252qVPF-VP_?}~-bALwplZ1`= z`FBu4m?zx7?CjbUP`L(wkB@KB!!juN2Tq9vd|B(NxWCc|BD_YijfxC=u zOX&@hXq5?_V|DiMiza1ULX(wbLE|3>(Cy_U8C4yxW0AW|aA_Pac2dVJvNc#Lk2l+2U%PtT*+^rbq4e0dwIp;i?@5Gav*f7SfB z&&GI(lmTRSZL1k3njCq1+0~KPmma#)ZZ19BFPSSBCpU9DdktvEOZA%%&3rlUxy{Z0 z!_mp-k`1puLYNFTNnhJW0GW?7i;TMr1tx}cK1-+sr;ATqRft!8EwrW+G@N**UXg5r%IRyqEG#spuVD?&H zgpPEA1{2u}t!2i+O(3ny#*jz+2Z=}Ge{Fqr>P8cxD>O)rnWe)~e?g*5exs15qh)!y zkX_o(jzql`6|ieVTOw0IXr|jlhR33$Q??K_LtJIp`-Oh$EB4jFosRzW_(bJ$v=CB? zPTg@pfV!dzZ>q5xPo{213)u`&W$1}cO^=rD$V^!Z^_g&aD+j_EeS;h0l+bhL#Gfo1(Ci>6|dI;kN_yq)d z*vR?A^ImlwciW6?=})O=ZzN}@pBXmx{r0?9P&^-RM$rlMfV9lQjh0G`R!s$7G$oPe zBGZmUsj1c0zkcA`c1En*e&7d;|MOzwka5*< zmeI;6UN$*jMc0{|j&C^I1l|=B5RsxOf;zaL&y+(7`c#IDs+90wZW{SkS?SzDu0Tt! zdLSf`8NxB;;k|R$&j6ce&I8uiWVIej`?7*=QFhiYZL}ue9Xf2}3miodu)_^_@7oFK zsI-xWHYS)|mB)qRg6C`0k*^vt;{9c~4U2}OlOA14GQ)sUb0Lhho&ciX%o4iJDv?`3 zeBrh%;iFrku2bv&D*1+&371jZ+46J&PppCSTfBqHvv-_@WteSeavV>vL#j!0y2YP} zc^4hm@Zf~vZl+~rqYLbr%`&$oV8ZNd%~BIbq-to!ltVK0xfROOp8d40Yxp96)%5Lz zEv<}yuoGuZ+2f6S`x93Lo)9FuAyS__rD;3rmOTF4#gRRdRk%Abx@oTBKEb!jZYGAa z=^kN_lHF29$z#UHA^90IDP|c^?bI+aw{W`bpVb8^=ZW`2FMPcR6dLPL)f0L**gFLq zZgEKdu6=T@IPBo?X+gFLyQ&OTdX%8g(yOoRvMX}b^1bN7th!*D;vr=6ap6@RY+SB@ z2jTH4r6upGrsjzp&{BGQcj`cn`{_LiYC)DJ^)Qv?wF%aQCu#TQPR`5hcQeCy4sk-! ztYn?@K}yg6!rnWDN7jTp@NVC`bUI1$MG!w z^9)&IZbq7oZr`K}7yDSM=0sPf^|2Ubh0iKH0eVq{pcz67?N1yD^*pTV^{5U>_~yWj!%-pUbt3blN4*4=*R)soxy{ZZdzjy!s$m;t z#>&1vv94b1ZCmSL%M|gay}n@9c^!0{Jj(to+dnt%f{cKyY^idlBZg)c}g39bM!pQ|3l^b-`|mVZ2xI2 z+T;cLpWtVSz+-T8n@{wz@jolaT0fQ~RG+I|l`^ltIB2D8}I24V+q-0gt_G?e!=Q0Wy1WXVL4DNH6qs4WeB+MH|#`m?y zSoeH)cW&nQ#MBiFHUd;gpOJ41^J_BUk%1FnBEtnyAqNgTOcc~0&wZvPjmq^jktjA6 zfP#?=(L2!tweA5aW+%sb@Xr!?02(Vu@=<_&`GoBRyDMHg6tU_ou%SWJ(dVVf^Tks2 z6XBW&9}O|3+%SBfDqq;ynO2SZ8g5_mS7?z0{?J!j8^CJKJ^#oP&sMcUYYVc6KncRm zUT&!6w5hKDORUhuZz2*+saJuK+ld=cHrbJN$nS*)Pe{nA)cpeq zdu18g*{l^XVz=c^g!%1{PRJh#hNr7)wa&^Ei?4$~&k#5C6{mYOkc`1)9NkE-Mt%Id z{V9C%+31ugh}l{cr$U9sC(B333m017n?R^5_DFMaJw3T7_!j}v zU#1i~VNXwbxh!{{$=3lWjIbkl=Yfi!mb|zRg4+gcmoaS#?mHr zk;D5&j!1}E*PwiM)pVH4AeNT!FVCLXu0z9|KHd~3Tcv?*Q?IhqySMw;D|a5u&5rvN zExEk+YAA|nKhkzTi3FpAesHv!g5L($oSz3pMS(3jc0ezlT?P*L;EGkEO(o_e(_Xb3 ztJ^zGS%5MbQbZ1WKO2yL^i*`TDa4d{6_CPBw2~N_y~gnYda$rl!xNV5EADEvVy)^}aOg-`%0ve1kE4EJ}# zOLh6Q;3D_w!3Fvok|2^k-(du<`X)K_`oDNQn2271={k} zU(^3I617~|(6u^Qq*0~^I1Ms7C49RN(qwS=u*YJns9p2w^I?KWL9>nKYudD7 zF$zUU6|$TfMD)F^HTd7_x8c0NIq2C{oxYNYsWx@sb$RE)Bq_`6yw6j(j@!aZ>2(Jj z|AJDg7?fOT;1lQW4jo414^?h=euPY=Pm<@}Jfoh>R{EoYB>y0TwfOrW(5+%*IF7b* zwFNWI`S?ji5w~xAja>D$>|_>s{GJp=sl5moPjf{}EZ^R`o9Xu%)o&Sf7ltsAmh*5j z;=~gMfOU6Z{Afy0A(oTJsQ;cJvs&Cx70Xz(n(vn_vDfRk(`%}6kJB>>GV@;ELV{MWmM4#8@5vep6 z=PYW(xFPGa<-|9EKpkwj7}V^)hg-|Bi=Zb`n(Yu*^*OM!(=B`irH@{Jj%U)Hbb)aS zlN3@EYXO+!>`48F(F%DxKvPsahizcq@@L}wB<-a8nq+7uzXBayRQduFEre1381Dr(7R>Ga)4coHw6=Bl4rmsm_fSb3(RqQ7q}a1emPVbXFPI_s(ApW0m_nsj3EX{?elK7JD-L0JYM>>|@EH3tpe^^c;bSY2EcP6u8k$iFY|v z2Fqx1F6(0t2Vn`XnyWFADcIcHg*77h_0sq_FA*Vu#&AiUycaLnB0DlhF-QeU*(&KD ze`y!CewH?bmX9A6w=4POBQhakSdm1|-!)pl?@-)kMPn)$;HIzETqrCvND053zvFWd zPZt5BYcYME$ZGWY1n!qUFgS6~3=ynf% zN~;bHiR2SP?jmun<(KI%p{Qit7Hub@&(xKBbetlxW9T;xw>P;4{75S}HThaCrMR-3 z3LBXA6#DTfjVvQWEAo&~w6jo|DJvce%dV0p?dtH%whPqWY!ams@>H~XtMMvPkSHNv%Ot$OI}y5mtql(0`#ui~ zW0CAgvw#HBlLhlo-3BzBY4=*YI4$mEt!k5w!swOFt-^Al@ZS=mfBhdrTrWdx|KnLP zLp7YZz&QW~`a*(eF%}e zduYgu#;)OU3p<>xnGGg?m)X@$Hv7KDE|{MvbH8IIv{V}E8#XdS zWpCO2J4MO-(wVZ8Wy#Ujp#?)AqMyZ9F3oE)_F=>P@jh>|z(??X<`#THv)0+I+yNf6 z1=+Itz3?tSZ_H>&FE1nG9abdH9=3Rf@n5O-P_~)xdD^GebxEBE~X3t%nSxe*j_y^UqkGeaKu?MEMJL8 zgv-7T<<@QH`W-8LJkzcae?)4(Z(k^wFMS`tp&T%`u-Z1E+=?Nj(H{F9y)^@gxKYXi z7msvglG;g9WSYG58UwLFG+ZG?|BBeS^*?6mTZ|LL6sCqEe%4Hhkb*DK>5=|UG!4?u z4)nx;vwIwbaEKqv<93p`xG%EsK$uy-_2T_^o`Ly)f=*^^xh&wY1(pK~C@25-JE#ZB^|9;18ZSlV=%U}n>hX1$9V7fdrLF&lR+DWky!i8;q z!v%{KwUcgvQ|7zu@&N$=kVvh!cGFj)-tzr8tePgFk%2t?*J0J-cIAcb?YEEUW_##c z*VugF1X5I#GU&Y=|5|9-8hq_r10EqpQkPC}aNl@{Id0?&rq}%hCK<~If2ngA2I|+< zsla0k8ujIYDBbxV;`;u8&c;ZZ=23x5ct%-Uh|Le0D9j8rR^rSZWFDnf+hezr%P^MR=S15G_?m}G* z3*GtJ2Jv0Ct}D!mdXL$AT52P#>LnQ8nG^0C?Yez|MlL4V zIij;t+ZNM}9>eNe9D;*-q{}&NKW5|)kx^ypn_@s5yau9QvCTD}zOh;U`TPGC$8QoU z){WkiWm=_*z)xr|-D$%?v9BUL;xBVWW|rB6%pM?6uO zt#6Lc_-^jh!GNw5#JA_Csbq9Pn-6W*m2)fUrm89o*K3uXkkkm*>}%xGLMvmbNzRV1 z?3q8R{!aglhnP}tVQ<)2|CPA31(UB#P8viF zFJT~q?RjuWcjn5k`OEpyCg3zTWB7FECxr0IU>R(DwjXW}<57)QMTCJzG zC!(d2^R4Mz{Jz-W&mqM-*96En0qg*}J!|cVgG>kC^+#+)SJcIqU zjuwtU4_12niXB@AyP*3Ah-p_E+CkZ^ySd`fzu5T+F+beF4_VL;CZ@9tNyptf}AFkJ+o zK!gbB=yMds5dhcy?b*WK2ZHgNb~~S`fPRFOMjEjE?jX$)rvMv(nSaG*(D{W{yXi^e z-M2t2@Uod$WE2w`=xTLKs(|vvZ@?c=Ws#=@a6>+=;lK+frlf?-Vt)wq@9t{vV_ryR z(vYPhb1=pT6zVZ?mtQdKzl8C;u{_mr9e8S>J*F z^m#)~@{d!gm+wA&g(sW+C51#sY4#(|{u@Fpb8f0=G9`|keDWPh5N$+>xCU)p`+dpF zc)sQRhMHYRFG1Knb+mQuS2BUaHYJniQOm4eM9Zvz8g|Vn2T6)@{;~)ujNA75#Pj-0ZH+Z z0DUKY@z?tuJ{*>2Y`}zL9naH+SBDgyo?X_SKBLL{T9kb`9k10_o4>?T=urJ-+VCaa zPahAx^0@tm8j9UFs6c>?TGmO}?6J+ksLREMVDF7WMRqE!bX;Mvg0X2k4UFSqG>_44 zGDySb))c;-{bXp+_#vg65d9|^O7NAWv^c)u(P%^Ye}u-#PmE9?Vv}t2QYD>S$&gGC zB5PT!&QoPCJGy*=y~{y$zw&~y=OqFRx9Hn4wZ%)?9;~pLY^PN*iF?cBX7PlfYET25 z?jBTU6DJy!RUV?pWz00Fp#Z~co)-oF65`_3GTGfaeY%9y9WFIW#!BG&LE$-}VK?0L zn6!&)jG;Zc$6zPo8Ihl6zS*to$iO(lXrm%osVW?g-KHH{l<;Q{`u;f>j-n>Jo%!tF z;Ei`m?t2y{Mwa8e8ON{{Iec8_!lFpnc4+N zwRv9sZeG@S>@Q8b!i-`!L?c&cstZ;OI7LYW_E3FqcU zz%Y0ZG&DjDNacrjLlZ{rOUCmda)BGd_Tv-fgK^+p4SJNInDtQee*U@5BqJ?#pDDWs zZNrlDeWv|`HvWyx(E7)r?c|`n6vg_A@!OO18#xJ|Kbn&+dbFExp`}JnP?PL<&xC}Z zla<`8-u)ULHST+Co|^>a*}=6RiVju5EuBWfeypkl5dFaHa>bGHr0ON_4T(D8ACh3} zoXPLJ`uEBnkz*tU6}Ah5B-UOMo3kx4l2JC;43unGx@46oEFrH@rg+0B?Adxw>73+9 zT%<~ehcDUMo+ltvPsCFlVDGRssOn0UvQy#W@1L!yK3^)1df0S4U~IJA-|q!XCKEC0 zLe5@s&RBFZq719#KmVbfHsl_iaXsQ)YUQTU(SRMx1X;Dbz37UVOtw|@>7T*YjRxf9 zV0ntEC#$V72EX3ioMB%{B;*xr_Mr%sYGY$48;eOQr9ElF=-De`+7xPVd3Nv8ux|Kx zPgDF;&60|`&_~iR&jB=FUlA_ehj06J>-{S>4_i+c!4=cl+S;R6HS4IJ-y8iEzAz8h zs@Of>wQWaSJdf*3i}T{c6&tAm+;&RJ4(x^kshBDc@{i0ZA(0>97WK%jRnFLU+2QLN zd%@w;RwQ2vObP7-LzAvt2lqdMh`*7t*lGHUXRx_lIQ3#Z8e7>gp4=|OiQ_I%`^d6a z>+?Fr>vgiu82wN zeO4ojjcWieC;_5VL{U4vXs2XbwMFNU2jq9hwMF%`2#Quq40n%O%J|cGbGK>zLnSb)X|g6Qg^3uL}59l#k>W zFyVR*8asSF&EW%fjRbZS|F;)lWanm9DT&qv$Su24n;4HHzy(9(LQ_A_XWMH3QMAXL zX-_Fe_D^$tYW<>@VZ-6EajjbVk%X?OsC$bRb+Ofh9%PW87S0UcE1LA@dlW8z7UA{PTdmw;XK^G?7n!Sumtv{}vxVjq>W78q%iW-5~ zCG{Nuw4^%CN|@N2)56C-VVjy>`dwU1+zP6IcSV)tP0cc;fPsM-4t%~Vn;YYIFKKRg(-$=7c0W?^_S93v&|qL z;cgZT^Rr8bpW*;suhz~ZXMjniWg4?`lHWwmL^Ul{(%Id5RoL~GZ@fHLoQjQ=nz=#8 zAd++<g)5nJ&ja8Pbl+lVtY9zg2vz#?TvuxawK9auQjPfKMZM=ypuN&97I zm1TP5j1ljkdST5WU&&PLGomvv+9^$rF6Iw5bL!U&{uy`jA{ScuByrYEnm+;=E|`IdX={)h=zGM^So%=42f{SblthPNN$fM|vFg)EeY6YrXUZk*K7;SxvI|lVrQjS_iWmGn~2!$7$b5br)o3FE9RF z#EY9M8LN(CxIVRnFfBjRiIt=^08Fq6Y7;2+%!x7InFy2rG zNLbh8i)>V4L_dT#f6;M^wzV|{t23l3;R!#B;@{bKBxyz%PKO%LB>My^oy{oGST1wi zyCvuq5maJ2i9v!5e>gC_rLj`sk`^meB$dizHape~PPoQv%DVQeiD|Uc4&SvhvSIXH zoIFfN&&R-%ajdHmI4LRIvQ<`?LMn-3r;0*j2lithU}NUc#q*kGGhG$30+*kX=lD{u z@%u>LPY$iicVR-8QDKWB{y0m}eE&Mo;d0cXo6r0QE0JBvm0dIkq;ygCLmPh+K|L~n z5%lm-!!YygpRpi0!bdaD$KtIoEn_5^_y0Afa=YlM^xTS_Y1AgvY9<#J-)Q3Pj2Dg2 zT3OF7>WO_LXNdFM>>DUl8XQ3-h|exs&NVVMg+e@QkI7UCT*Z{)ncki*c?yUz&iN&XbMH8TZmH&xw+$ zG_tU$j(WLR!AL%QS9)gf+Du)ir->J5Db?T9xgw1KIvt_2OdWRxXqL13UUYqh;hmcE2%c+(iw(Z&wXIoVUy!q|S z0oKO^0l03@%gsu2(zCNeaek>wDb`wdA&>Euaxd2HgEk%OWA$->9fEAb$D>u|ksudK z^w>$BtTlk-a6ba3dnxat*n*2^kl%bm<`}Ipa~g#5&`;5?_3o($fg9w!L+)IC8l>G9 z(J?EY(T|mi1DG6FK0U-{*K6Ddx1n4=^?iu`6Z3+lJZY)&kNGYg%j(7JQChN(@amZ_*HnC%cvOgA`lfHwhZ1=Sil>uCvG%k5{eZ76B_`QJT7C2E zQLeH+elvRO9XSinFH(^Mg(Fd>v{-Dn5IcRUO3VpJ3mmjSTyHSXzkN~D$iP(wqRW5&gP297^Dah=lg&@$A8YDbF+}N2IIT`sd z^?x>v3`V{f1vo#cpY!hs-9)Ul!@3EK_ka1A=z+wIGHSYIOZrmvgb(rs^`y-7nu|&HQ;ry_qnD_PCaaMtverxDN5}hKuQAEP;>YUamO%ReEo= zMt?1el(=k}OT1~X)6fogrGy9r~E2_-7d5aZWhvWaA6zMvUW_a_>Pfnyf z%9Y4Y=T5Q-n^rW`W3>Qa*Sg8%Cr*5FgsLa}i085oO-+(aXHa#Fj8rSA-U_Nr8Mn3w zE;JzBT%hhlP2@_{FJ%FZIo3esd2hd~!!V7ej_k1XA!GR(8Q6sC@?C=O#6Q>;)Mu4* z_Pr3#z}`m#a%KHe6ef@$nW#&w^DzWm)~ERC#|225h_1 z50u3`*ZT+&Od_IkMBc;yd_>X27e33TY3n zMIb|JC`BcRSUn3=Qs04sHNY_I>4v(tclc5aA&2uDnLt$i{~&BTrB%0*|NN=6I_Sug zh4I#3ps=M@vk4W9$3P@$a!5x8byN_f*6k6H4|s}}VW`0L!on8`qpjG~vSSl#?Jo_kq5mI7|j1--uwewNx)XlW}mf|lL6&ixg zPQv^*3amr{`fPzt4+u8;qv0$bV5dk88my0%mf zG7`6L-t{D`4U9Xi&?iNKFy;hRMB*ANZ`k-Xd5BwJPWFdTx45gmnK@hra?r%MNd|L% znzLniEZPm*Zz`yeLP(yK(=p_vrHM#7)Qjh&^#|cf^lR@)50*UfCn3PDrElepPtNPt z?X<9X_P6fn30)A;IOW_5h0a0&Xus4KVhBd>;tTO|IgVHk+iP=w_QU*p!OyDhM5@*r zr@!A@sIdyd4d3v_lxDTa5^%YoESQFQ2vdVZK6$f*=$P*RlZB2=fX}-3oX_g;CVG0& z6CqNEgYl*C-lcvFx%<-##ccfrQy>D7dJ^!a$KB!@3|;4K!bL0YG8($c`X&Yen|y8{cvYSK zoE;VP77X+=?J4@ zx6Z)p&l`@e3-^OHL^5T@CPLnVB!JlV#K(jOqNK!uMU@gO<_z`#cc4hum-g3)c?<5q z=>7xvPxtMCs&q8nE_&cVe(dvbO8HL|ypfQ!{~^wJ8j4F&L}|BTe+&3FO5bNnwwxE&kONzO!+Hson!H&#I)Pu*y5S_)%0(BQfX3nWKh~uiIt)P~guD|1V zlk&kGK^>1gaCjPvP{($dGqvX=x4AxNIu^`dRoL7YG}o8zl9f%3>YmoW+l>4E6ycB6Fi+t!jn5|NfM6B@NYbM>E#`EhATeYedF>OV z)Az#SwQebTOKv8ZV{7DHVCP$W7-q{UzGlQ!)BDLF6mtoPt(8a&Juh0rHLdmxLW|eTqW2CPxawM zRQiG84A0R}=@?4-s=1bs52dWQ1!m?$s{*mp&_J^QIua$%jg4O013ssHH}r_2z%1Xd zBi>K9KDWZAlXKq=PZTt8E{C4&ha?&rT9!QlV1C-2wOJ=%G}y4!6-Cu-_X|2s0-t`o zD5%I%yYAi>0SXPm1aW<4<66u_2Wz==Kj3b-Z1nx!B!)kNjtL|-8#IHx|ItWq3QUfc zlpy8D*rRwC^zQA|nk^mFe!fZ@!0-7^qO~6gIc%SyGjarMj}yUnij5Tk_@vq5A~{@z zI_6vzdVT8E&|BV+=pR#-r}2+xZSZ)qvj3?C7-$W>^icj zy<|hrrz++9MR-I$s`x#B15WNYZrU8HuG13V+FrlvGxu%T5WqFa7E9-;KwnY-0wd&eLzA1lrtTeN1qU?_*SMFvu95CHn* zURETh&wFzcFdP65{{Hrtsi`iSQ>Kw^f7zC~trvMB%R~RVExgMq6E758_rsA<$LKo%SJ0ZMfHc*?^e>LM*SJdxPF5#(4+C}1MoH*JHKM)nKH0~f{R&RhOZqq)#~mB)2}#(|O?}K*A!qK}uapY+ zgc?g+^Y=K-AX+NAB;;!>IbvJbo!$$bNU|?SPK_EDE9U{p)!k(Jv>->9)!Yca#~K*w z8uQ|}+tqEJeC@L1I95h}+xkS7Sgq1@3#lczFZGJCoQ@b6W81X~@gwG;Q6C67sS0R1 zGKhGx@0uBV9^s9|m;!&qt@^p+L@hY49~mhZsKen5*SXp2Vcd`qY*PY$>Ph4XE$}JT zQMSwl`8X~j@BmEf96lgL6yuG{^}ED^Na8&}*B^b#So`u~B2?jS)Esfyp-bE!1HM6P zsq1Cqp)c*m@^;i35bT+fqUcs7=_K9!!VLdtFweu@rd(4_N{artwTMfPd}@(Z8Y?{S z%BY7Hc&#|MY*9wL`VBuUgq2{Ee^4&E62E5Zl7q<1E9sE`qKg`H=~4c$j=XM8%j3F& zqGo&Ze58nJT{d2t=nb@eDuKwbs7G?X-Q)ikRK4Dj*7Uh+$LPmXhQ8ovXevhg zzuuXBAFKiKT}8Uqz@VBL2rzL3kxR9eOjXJYl~!$y{CJ8mZkSx?33u?so451An4ZKroDMn zAJjj`6*WA8hv5O-&$!t>J*599Rc5Q$YH8R3x26IOF|*MLEVnB=;8F7DN#I+tRBth9 zBC*^^^S={uJ#=SBpYiIFNaueLGiznxs<-fd@9Em55Dz)CnymT!qbZL52%g! z&+mL9N}IGgESDLhoR%V|bdQltNK-~KYgFw)i9rESpQ}TBsd%($*~VCT4jHn&L@%>= zBp}kkJi|jX&ALo@u==nfL%;qgG@b*K&F|%PL*b)$h4xUd5gcZNr9n7{cRmWjVa(uM zJ<5}iH%}Xl!Pz?smG;fO2035@(8i-bZ^Nj+FfJO={LK>qg>(grj9yJ>?$6o2s z=}rqW6k~yIwy`!0uuBZ#;nf*^q`U3NY-7Sdr--OZBYsbfE*f_H2ezZ26sjfkac#P* zgmR)kdtbGU0SWoF`U#SYWY0tW_>21&?(i1%?z%) zb7VBh!ql!_Lz=yq{W-gJ6f=u6UhJ9`r);uOYyb@&@{R&ed{+K8EZe%a*bfTQ+eQ*- zirHED=`xydtX`WDIJk}Au*;LX2CPRLaw5+%B2Sr|oIKd`Xm?xESWMMAPnH|>Uv=Tn z0nZ1ultY+ASh!FMgflEiF2~INSyO;|^qdF8P3AB9R!K)LI01cC&yPU}9gdjA3&Z9G zs4ULthz-xl{Ib>J2>dW8F7<0%(KLkBrt+eo`o1T85-CSOGCoo~6kV0tO3MITb&Z-*Z~Vibp8fKP-7$1i*J0E7 zZbk7DRIQAvzZ-g`=wT|tCPiQu7v!%$6g2*(;+c$6!^CRYWva|7Ln=bJ1I6GFDf+~P;FlW4e{&d|%qG$RY&_W! zA`$&0p!2xS9c;XT;o$@~1WM)yI#1B_(_I=WFZ@rZj}jhnNgR=s@U=R?SM=jtgMBqM z+i4&Pc=6v^lE-2$lqI}tI3e~cBw9$=i{xSjEijawV8&LI5iF0gd zv-5XD`=3Xs+x?|HXlCRaW70*1V0qg=cpZybgae@i30MnJdGp)Ii{xMDg!mU}wxu^T zaHj3aBr0}c(bAkj&>e}BD#M?*L(Tuiy`%j(R5uAxbpUNM0~M9QQ*Sz2>qFj_D)5y(uG2C{G?%3!`6&-L zFO?-1ky#}~f94J44Zf=E!8(PRb1W;PC19-yTmV3>tXTbX+fByV=rM)MY&utgtpC(S^9}TqVQ`VbzQXt>~N=IO$;Ga%W8QSJPw(UZDNT)DStl-wa zSVB?(KM)(>p`28tY!7peXjbdxO|vx_23;z-z}Fk@Qa3_^;|nse{(7#GJe((tB!RD9 z6(?GJ%IB$Q8?{y+RO%MBY?y{3ksbc;46@2uU(4FYF^*Rw8kFp87b6h5*O9vT~SlI;Y*9JXG? zF{8}cE4mvYv5*gXyWIgvUix?Wy2i>23+oIX5%}k*->-GPG0sxw$&n#-hXJ8~BkGCi zrgx4%cInCgLE|KyHC8+LCNx$Y`qx&IEmTCoBkrx!e=~-|$8~Cve!D0A1lL; zO?`|{s(yz7Toe;tQ-{27LnJl+=)Pc<@n;0P0~9pquU7`h3vN4AgP$rzt0gSXg622Z z)NhTlQd5Ys;8iiCkZVz}B0=K9Y?DD97X_*1BmsIei;=9SLfom9SO@*PZ$28{N?vOW zsNB*G2H!{fC6mlnX!KR1z^ZH#o-4Aaym05LH=n@6(#<+$?^eOnwHxCoJKxKF@eyB2 zcjiS_B{@0kb4#!!cN+D64cYMCl}mcPc64M?VxEqMCfWJO#GlCK|7?_FN_GPoyGwOF z3wuzc$%H0Ic@4*05ms&>}UU(*1}H<~*=(-#?8o9fi;IG8Bk?jbxm^|cr9FygifqC^;Q#__uAD#BFw9x-JtX!7?A<hl zI1D5DnH-%3hd;*)%_nO|v+RKvkX^BH7)>r&Y3nC)Y`2pwVs&^bQBw&kS1$;*$>m4A zCxNaft1+Yqgth|{2*L-+h>NIAv4~M_gHc#w^$f{6JBZd{diJI#o4ZJyy3H6*QZ_y| z3oqG)O`Coq!r|7IpDmEpl*NLtyhG!5Qdw7RLTWdu^H#TGZarr?E(Yu6Yq1m=1YB$l?M365awY(tdn=Q%NUvdhnl5mmV zdnzD5aAFqB`D0jO^P7YWk7_ykBCHgkx=SwM140`!k>kk5UEms}r0l9Bf%k+X#3Bj_ z*C>A<1=Du%VqdVl(OW)C?(rmAl9S}aF<&EK*sfB#eBzfc!H(m_-HFCr(uv?$C$r^b zF`DEY&C*wDg&V-vZV$M38=NfWc&Tf+S$>6G&HG0V%G>rpdleFOTGO_MB1VTfvy z9%SJ-7iovvRdDL)E2jL2Y90xT$tlkOy68LlnJ9SlK6|(sn8O()?faUlw!VTZy(Erx zoO+9USF<8GLRFZ|4N|kpS?A_1Y{6`TaTjMeLO#H?5C-v*aJXJl5^uqVp;&uu$TbPt zH9Bzs-8u$NQ|?3-gZYvjJFIw)1_XZR4hyJCH*GkmC+R*yH-ivgqs6(0(PUl)x-(Lu zoiC0XGjex~%IG0dpvf3xJ3ueqyB2DMne07Z$Ni^I?RQ8~K? z1rsk(>pM-^Ab;rwNFi$;S=6Z=7mE9 z;q330*08U4#`}hJdJ4qXCZvc+H%BvoG*tPW{p3Mq7g}lmAk$$l8whn$<|ei49s3Tz zE3Ga3wO}8{^n%5%mxMv?Ve!PI0y#Yx{s0D9P62mK;p-(-teF>jz=526%|MNhLA|l4 z=9AxmiDpe0e%!hH56(7J0r^K){ze5&!mvHG!!-O1DB_<@m{UQuRyaHQ9;*$T)?b^N zuUX?ocMqZmFsUgU6Qa_XDy_2Z_WsV!rD*!RDes;>tZQN*Z$*U~<4~-YGCZzf%W5jc z5`BTpr_aw7qiBij-~8ING2paeYg%02q?I=kVd*aD-tjA0x;#ca{h*ShnfW(~h}dMd z-utF~NRM)2smE+SrPNip1hR#8uIXz}iYI|(1*pz+6$HejW{?;*19qN_r-bZNm8Gol zp0rr9C93V3os-CJ!Zr*aLV8qdvCeBy<_GJ2$z3z_P_(IHWVHVnPczPPZ@RkHeB8?K z+!lLV{Y($|&u6Jdd@w}^s(;sRZjZ~s^}dkMJf(HkQ*Dl8l>VpJdt$0t7FwdO?pO}769_5>}QLK3NyYB|MqQ^cq zn37v6Ah z>$BHInhxD<)>yr;7W!&GdQtg{xzbERFW53+lj^gTotA+xq@oBnL!YAcu*;H=tv)E?I;Q>AHacek8Z zF9<4nDqRKe!FX~)=SxM)W#8`oBGcD;nA<#}ggb?3XSm;xH*u>!LUw&826omdw&sEE z7RBTY>fy@oyz8@Frm9({6+jR$--2v;fV-NivckjX9O>u$>7}}|ElKNW>#TAkppaWW zIf6CoGTvQ&J}4_Prte%UFMno!JEo-=V>$SI9Xd4zpPIy7&2(m}O<>T>4k5Zn1^h|EQ7#Bk zI_f<7>aDLL%IeYgRIi%;5U~qMqXNuuFqA%)AKgoBAtCr#rAVrn{_)5KP+ZFTzBR~N z)TfM)1hbF!kk>!M7w=2V)7>Cl5$D^$FAbKu!kr?6(qyGJ>ZH)0{wq38m`CC2x{wiU zybzo6(NCPTP(x*b5F^E=#w-W2{wMV!1|aruJ>f@rj$CAAPrU3bXf!3Y@@_>vY8CYx zgW}f@eNVt2&7$@4n-sKd)hKa~q`J&MUS5MfaAMO_>0RE{@I&O36F`ohW|KSwiWB6wV<`jBL$W>qc=Y_>pe~(pWg=-3V zlYR}EAvocUU8wUQC_Hb6z@z<6WlMIT^s5y8Oi_9sK#nl>;ewwy2_TL5JT(MI@ui}Fod~evCn(pGX+R13`fp069%#(b=R403RVk>XahV)J| zbt~R=9#1U3*~v|AO4ZlCsjZkl<*~!&u06-Y-9m1wxPnHG z#eY~HC8yk8E&X9?=#C3MY7x`suYUA@yXJw4PLbvBjuf?=`kcQzqkMK^w8xTiS7Wyq z6VgPVdIb30I)ACb$G+r>=;5#WcjdSj-BH-Px^PNR^Do`0&;I=rJ!$ev;%KDje!=`e znMqX|9{V+-mjwGyF?4ua7<H45}$PdW0)L*TG|-4W-PI+eD5i9xQf-!49K+~be@%HlOspKRT8dG88sCAa&F zl{!41$)+~{;G6$YSb1UblnJS>xyq{T+(y9;ZkrM=R~EP|EwIBrnxIk*|j7??$)a5dGgEFT=|_Oxj6TJ%Kp&r z3_jg8GZyfFwUAD{d3^tgAOD_lO1}Reu%IC^Yv-4_J^ZXy*Pet&>8ZS$JjbBMZGOAZ z%{u*B&zB`1qy8zeO;E}YnR@w~QH{qrcfSSGrWfsK0M1G8iwY1=%~JlEEbcNx>+~`8 zIj`G3ik?2&ufcvab6d;#-PZ4t(bwe6t;Ve;st29qp)|^mdKI;Vst E0I_f$od5s; diff --git a/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area004-v001-MC/word/media/image2.png b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area004-v001-MC/word/media/image2.png deleted file mode 100644 index 126279f21b456d0d6a7f822ed1aa886e252b8795..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24541 zcmeFZRa9JI*QHBBfZzdwySoH;g1fuByF+0~2o~Jk-L-Jn;O-vW-R*3?zfbq+V^@9I z#b7X~+Jh>#ylc%lpS4325Ec;uHVgzlIacSF|Ni_?9JPBF zsib7*^ZNMKcps+YjTM=WZnFxatIg+v!)S<2?Xt2T8*tD4CoBna>GIXnr*o#?b{UWzC%gz>)fcO2s z++Ck?-(WcA`4U#yUW9Zu6>%u^I{fP@iS3EiOr|^ly|i+3)R%|JQpj~AO$}z#&@qYW zfeNQiBiv`1r;|I9+AgTS`_6=_-`fofe+fi1-xI{<{cVR+?mqBefB8N_q5x>ckWR}< zlD^a?xwX-W{9}(8e&=Q`F^I_NL8?(}>|AhXX0M!|V=|`)`X2w}PfkX?LlwtBQgpn- zxy0w)5uV)fr;W`ot*b3xt<;?7f;6>Kir&!BVkg>{#Y9Bc2YMZ6H%{$xKQ^B2JsLig zlv?>h+cw+uUNc(fm^gafESARcA>+Lt)GPZ%ccRas33|WQqwO4MZOQ{ZtuQZBX44%x z==4m@`LV$IP>g4{7gDb=L5LV{YoFqe=mu6E%)gm@*JRW9gR)2qXE>4Qqs#7%d0gu+Odfb#I<_T#`C-PwBF8tHB_cLtS;Btli1 zojpO|Y<$DH{po3O0`13Yt0IA{rxXK!-vn>ixJwwI-i*l-0U_(0t6iA0P`48}d5$7H zY&PY`v0CahP4-_ayP%A;>+f_WjD_J)f@JV@~rknBbe;qu@jB{gj{7Vd6p| z!(Xr#^t-pn{Esw?vKcl(wZkBJ?suvtxuI}u-)vM|u!h38J4vBm4#B5{%b$z(y-?Tm}e7e%atlM55&P7u9kVi?v{2}8M z<8g0}e&w6FneNM#yTIdSxVziN@r7M7gYne8mBs7|{iQ_F@>E1s4Qs%7#Shl4`iB+fLp}JN?-OOsmz4} z-7RNxSHLy#h@W;RbMAbiqjNGo|G|vK>dnZY^Jk)i<0@#HrgMLNo@bO-R>sM2DUr?4 z?Dk$lh`VpD{N&G?4suiM1J=NZg~9~tfBy)Iw43vtnNd&_<$5Ucg7P#idWPn(m|T!oq+UZlj;WPM z4o*)aW%_7|%CeZLn39o`XIrK3I1Jf`{4M&_Xfa)`KZ#19iGaa;HE$md{$YyD+lEo{ zu#Ob2ycm5mtbNb{Nt(wPo-Gi*!oFG`&to=T6e=t(G*Le+wy==Yy)yDC6qEH^ieF1b zY8bzCX6CRj-%JgArDbmY>Z0+7v~)UE3JLD7^647>Ffb@6JDg25p1xak^9$c{11&M1 zvKf!%qC3g1<KEyGNd%$fvFQa^V%kE&{*2cNUv9NC z`hf88>84Jqo|%)FEK_b%>^SuXYO#n&Ko?Aqu}H9ZQ!V)m-+iq`eJOW5qdPY({b8C; z9yINIeCN*4P*7gb7GVDGRp7s>!+VYSpQ{5j6L64$qx?Ufhr|L&-meF%$(K=(kboxJ zRK|sH?)p%UmvHme_FU_}#|8$RkEP}t7{$;IRMhe|Ii#J@cpeMf?94V`wNz0s zMFtMYM4Pi>Sf3VW=pv@ zQ#A`6wmqm)tgapn96Yx{NzYtf{4!7~dti948yY#RZ)G2kZAQ*%+)zx%FPBwSf6ILY@ZOia8~ysrKT8-75hgq%BTijCqZFbJU;Qi1 z?@P{9isJ}jVMD~8tbk&oQFqP!54_`UvsVm5%=}ig|7is=bf5-ZU4`BHnNoEIRIcNU zh=Ou)e=zU7Q1t+fGwUu|9CP~_E<$l#x9zm~wvF?-W`no>aYe|#8OmWt>uYNp-puQ_ zs18w8+w`Ht;o;h-;NaI~?4+5ToU@*(ZV@OH!LI6ahX&Q3V$=Ol-)y$|%QSrGxf(e! z0~L*tvV9t4&+j6|93&7<`&I`0VI=n_<{<6c^-#TTp>Ry4C}g<*%&%YkRHqi7DLV~& zYpX_-)v62#$53!N*)N7dqE!7sG^YDmJoNTRvHTB9e?&=G)N=K`er35;T4*S`)7}`A zJTmT0&BUDh-s$)2<2GF=>RfS^sb9%o5U{J|W&H%<#l#|c!q|1$|D|AH{cSFwd|dNk zwW-GWRvqHeAaA*_lw$pJ3ex9UhCV6f`3AQ2ssI!En%4iIR?cXRaW4ikY4wB0PWZ`! zI}uj;k{8Lf9NuGVgK~JR87W%qiUYkt{@i@m8XhrmbrSRH-KGb8Qp&E_heX~-4_FJa zNP#lOr~Xk3geMCD9o?&Q1Tqp5GlSmv(r6n0jY?gz0UzH_{xET>J=*NFVHmRTTgML$ z+ttm5H6LPj_7}#4ff`WL`+92%epJe6RRpnl%ta4jxf{4B@Q6)sJ^OE$hL-sC z{)nXCM+YjM$D?FCC~|F1kNB|G#PqRatK6KkMAh+^aF@QS!9=ShF*u_Q#BcTMfbE8p zpHLlLmz%;o7!JK8K#J|H{}|hK#(XgNczI24IU?-MJ2X*O?Dbjg-VS7Y)8q=z;mvmP z8^ri?5mTRFU~JS@v8J&N=k`E6{`_TyWq-OQ?(tdb&gjv7INniYOYLapi5skAU~5}4 zI<7ljly=)v%GjWWh#8+B^Fluj=T7esXB$Tsr!EOYufSb;8>;Lpo$>R%yA!incZA1e z6fa77GdC_hOgEk{>xlRueAiiCg(wwYHIPpmUD6Tuv#l*a@tj2SmpaH^+`@v6CT=`v zfBzF11B4=5FSd!Sp`8&osNwMj?0HRHLHuvto&A3Kz}M_r~`<3MaSwlWtxdu%Fm z+m@0{6oOJ9o4N<-bFjHKOe3d2CY{8gE$9s2p4GNRZuNs|?=(_8?e5m1xQK}SiNF;P zlcQq@C{XmV2agjk?cn<20{QxYJhsL+_Dz|w#RnI8B+W<5^)H*wN`7sXi3{E_y^0_D z;60X$#ZmEN;qQQf((xG2=!4APtm`%_PQquTwXRRHv)|OAnC8qZRyxs*`FYCBT}epL zR0>zh92}|?Mg_4WIp#mIY+az!Zu_fK!yr635JF#H?Ir`CXuS8jqb55uyg0C;((Y$y zY&=F%QuiSB)ksg)-B6Bc(2WBlSivV@oy}8gO7Zp(ED=}Utm67BUap*6nzP6z%H%u9 zjWO^K+nZPhZ-GWl7A!x$CN^ZyiJ;<{sMRBn`_@E}pkSMytd+p4H^x>wXUQlBh8}w2 zd)s8OID$Bu`c_*o!P4H#d zVB*{-iRprB?Nk@;MB581+)p3(?X}7$iFJo_&7(Z8o-cmJ;Q*2>J+sAys+%P;I5(tMP)T%TNs41j2W`f>*^(r7J&Machi9A{sPtyu7^p9#+wQIyFLRtdGVcNs zGAZ%z1zPr@_`06Ur5DR(k2laOEOy1U5Shav{82p`r@zt$mxn)K%HM265Rs5b!K4CZC^+~7f~kP# zpPNzbyVvR+sG#1B!yBsJUNWaWpcjHnN;4R5Ct|g%MH*Jqk#xWRXWHMhBgD`{>E}Z- z+L}_Y8)W^eI9|sOoKcEbiSy>Mk@-BMT|LAWOJ*l5_D?4h8g#mLtv>5-9%6hood&)8 zkmnVxU(@v$!w^$nW*IXs?b^Q=5PCVP5B9#fb5`$QjV)4@M)bDN#a$* z1;zce-|%rHHaODHfYolG0zyQ5-LK#Vn=gkM?|4+PzK(S5MESAF?g^+1_ZwS~Vm&3Q zgOPzZa3yy&>9xD}o51Bun`xrgdLkT*#o)u1DEdpz4xJ4==O`d~Ugg{+DZrer+hJ)k>zB z;8wn>P%PxjHUj>EUUrq#-PMIB_dtJR>3#y+i!6{XXk>({qkD-p$^(>5@23~)cs8dY z`+&QrM8Tau4>OH~yXm6gRu9!qqin|lSYeN@@K#3(1QZla=gXOxz>$lDjg4X9ds(M0 zPYKy(p#0{uOP!Rmt)_{st<8dfuYocDk_$fL|Kp5F-&S_3ZS)V)opK??yaTT0 z3!n;VWI?fLg73aFwWpY^9Ft*Z!p27YTL|Gv_ErCdY1tk9LyBM@3kBQ$>nHG8JuJ}F z8P33 z%xn9&xl}1&<5xSoLjb3z(e6BWb`Pk@D(6Ik!G@1O^P3|&-F^51K8mLKa&+frX{$ku zK5~7iNwT`bZm)!8Oo1oq-pZQklMm%xh~zGs9n>YO-~jdRjEr~Bl%M=s-(}m@6n$3^ z8TJ?jyrA|b{95xF#V%1PK+u&4pQTnNs>m`5J(kctJk`L-0Zqf4OqWg+*rl(e7HKGCO(Z2H<-v0G?7N3g1GnyTYpE9_#3VU>vwn~620%v{V5vW+ z@>9xc@TZjJGiyuxtJb+P=`5b}fz-C~UYp?+qHCy&)D+C_$t#a4Vd99yI;LfN%t8Kv z7&kKRyWQc+tp~ns2Hr8i!4+n9YhgLHRJ(Xbu8eZ$pH0Z2YC6+xEoq5yb<{4a@SZLS z@W!ZwMS@6vSf%y=nC!>;n=E@h_w1X$-wzteOvoY)nVw20fV9a zx90TW{ubH8#StNBY8oJWtM10W&`OIHAY1~jM@{Om?W;bvuKA|YfcKUEmzE1x& zY5lW(>sIcZbjtL0z4bvU=}QQ3uD(kCPcrvDd!=Rkdkx+zM{YD@rD&imJ4fAxnHdEQ z&n4MMe7N7H=PfY$?SpUNbn;B36g#Lk&Q>tS;b2Z&Ge=Kk;_`74v%;^_b)TVi7ZpstJ?X_ z_w+M}75&K6mi?`#g4pv#2%tTEx zEb92c- zw^RkA!?*OL0W-OjOrfiH!oJ( z?*<5ZUS2%xWfo8@wK`bbMgrd8n4#iA%SoEiEbhWBw!4dINk7GfSB3uwrnP(G6ScqCE_SY*9q=^dS*19TFM^ zp{PGbX|=r+I1pF+#8Mtt+ zt1&Ee4EsBVfRx#^8^eU9L2}gpmJV1_Uj2Wk10}Ia9(;7Y!TUQb+dV!S9fO3*6mudE zPM#=uc)1@_EY}~6PTg;2`s$vnwJ#nTOOguW;T5A{lQ?fU4>`2MUwF8?*TxWlUbMKz ze&l!0{?ep!Wti+#L2S+C(#<|y`S1aYA=9^ScC5i6ZISpbAI~>_J{P$$&~rA1w-{dB zn{*RDw^b#lP;k?HctVCgSht*aMbk;6|MnIH{WozORXlRFU%n%whn#+*SczJI!Rlv< zibOst4SM&xmGTs!tx;PB^-I{uaZBv0Z<^}31)mfz9kQt|x668%BB9!Z9{Ow*(Chu{ zi9{xYVGWXfo4j!3fDTo99R=3<{!u*MWeUtY+%f(a?4+WhEhj zVCJj4YyqlNia2~D9T1wRQzS;0fVQ44U-p1hwPIAiI$J9K42YV^c1S_MBSU?TaPikR zv}PMoZi$*NJ1vv@JUHf^h3|pd+PXY&w25No-`Bw*xWhgC&HYsq0b4;0F=0a(Ft*SE z4+!Wamp@PcO2?u86*Ti~FS2!HFK_gAdt0PIoZ0>iUXoNU`Db+U2|?|ML& z?OL<&%NGZE{B6{@zf}v3y{yAj`s|gjZE>$!ZrHx&Jr0i&>I+Lr2g7z6>#DXb#4Thp zPJ2Q?hdmo2C&I`G%f0*T4GnZ*!qp`8peBX3l2{td-*F+v{1s&kx6poL_P@eS{wgDGTIt)-DEMp zx{O{;;pHAfUQH|^zS3B+ePW~@gnC{HVA8pY?514}#TNgeWt;P!3gyj;DB*moYb`PS zELmB=n>Af48+tB{(J<|g3CXp9GvnGbp|2MMw$!N1B3Lo$znj5-@w$vb zHSW*klXkrN3w)oSbo35=BiY9H#l)u-h)p8L*OO+7(5xo17S zWSAqPve#j9LryAs4Rvta@z#nZBvi6S@>&s6%4$Oo*eO4lQL(Wz&G3KyGG<9@mz8!$ zpLuROq+wxVB!z`rfnPS^qu|JH!536?1iVdryMdLg+ zNJ`m^jA=jP&^eX>*65egh(0qn8U9lqe)2NInQQo2r%YyT_nZ)v~C|PJ7+KYz5gL8O<(PkDIRMS8g_} zXDaQahsNeBI)J?uoe^Fg2wQ0xRef|y)EtF68d}31Db^5z=lp+#C`WFN&P$hA#y0S% zG5Qgj`V75iL_j8lYpPZw#Vky{x0qvT=n?Po*WnSDBX_#YKO0#_>GD1o0YVwa<`xyqEV=Y$-QD@Hk}VIRa2$} z@HJsG!vua4n&aH57i)0|+}hX{a$iZYB%5^T&ktD+R@GUjub`-N6G;Ccnuj{*TrPB{ zet8lNT`~ev4a>Q+?P8w8M+e4T{!0zM#r)Zx9*R{@v%I>*Ei^z82^%Y(8r}saLjAv| zc##oF51n^r>)525qQWj3F!Azf*QraRO8^r za-acZo3*Sub_x0ZK*q$K@ix>qwp)R(8}!HW*nLvui6K# z3Cf<1MYlLm$Z=&W`2%)$SJtMNG11ZBqKFVu)}g#Ke-wMz@3riVZ^MqM2)YpAo|PCs3Yd zm_>C~AYG*!T;wQn-ZI$fS7*|hDmza6CwK<2wW#&yEHL-0GYJ)Ume0F(n7p@rXYYCp z0E@rMFjfG%V1L1yD88hUa$ccsj;GqgTh#hJvxROI;wIYHabipNyaVy z+CD}9u#5b_$IxUb@{#KR6!qwKJi~pvP-eHeW|4qvsMV)N(<}5bZ{~=}PtK?HRSNb- zkEZ)FhJp!JOUzG2(lk$xeQ_1aJM9*S$83h_#7N*eV3is*Ng`Z$$u)l-Waac-s!-SY zBnw2)kS94q*QG2rJRW9ZPm=qO$l`|-MmZB1$Raw%}}-wVOC~C(X3Jw{&=mNAPuDCY_`Ml>g492IrlFCYTGnb;9-qtBDRUAdXSR3Z zQ7n!85||yY>Qj@RZ$c0Tq%m}Sdqn;sduj<7KhTcyjq_9)Y+OFS3!@yr_-CuK*5Hg! zJQsjw0-V$TZnXZlsQ3S2!2TCE1X!u>`VfeKTLEKzrj~oVNggn58B;KC6+f19+kN-$ zhP=_s-~#Nme-=wc1`&GZp4-nS%hg5t4V}v4##;%v_g2l7AbU&0Upb;SlVy&EKzLh` z;gEv9{<0tR4GpQMrw8M#T^A>{eyua>)s(PB@71W zywUz*8x}YCZe|$M-$-lm&MNZXe`FuQa~FRaxAXk{NAnb1T=jaDGeTa8?pFOV!^tV> z#tPN7cl4?ykOe@m$_aMw-QLn4@7kZsxJ%T=A~#8qH|_@&ay>C_>iQ<`hBsd}y>1Kx znJ-oaTi%z-$!pItnQD-wGZ0!;WE|6PORh5$dbTS^GW5;V=4F`p$v+=9y3wDD%gB(l zN^x!U5bxZ)5P`0j0++L^58DDf?NsI>{O=w?N63VFjoUFxm_oNcnQQrBbBy_KuJnK0 z*RGY$@~3!iQqdLw>CGTLAw%Vs zx?R4owq$_3L2_WvWyBk-Yjaow!1DQmikd5jMU5AM2j5o}dHb%O4F`V}91@#GUM=Ps zFVr=&m8c9=^7AZcck;m_6U4^q5DYRz)?flTjv9ItH6#|>+Tb5`oE)2az-@b$Z($0@ z*Tn{!-LT$Xm=YltqiaF*&c9HlcCoXELiHwsXc`(R20JO%7E>VnIXdg?L>?aZ_3lYy zVvnnvnD?$6=XO9Jv-<3Nl<%Y$>LuABpl<5mmsAx$teJG+_Ixk*qlT4}CUTRdlLY3?Ik9 zjL)z9l_Kj#gvnh6<*zhK@xfOo98%dz0o$QBhpzKr z`1&Td?D6mu9{X%xeD#Ip&|Zf-?djTMz^nx8><793!lsZaDjqA0bbMWO`eOm7U2)uNYd$IVBV>-$47A85kkTv#MC^7hhN zKVDgU;&XMQ^a!~Om@hGCoPhnQ8VrOD-TTP2*~xnF5*FaW&1 z9Jx!ItRwuxm?#-#@f1M*z?T$SP@Jfp!7=1`VazDd%iv4pp;|yrX8(|Of|6#wi}}!m zi&07AOJG-T<7R1_oU$%q-j}n)}Gx3z>3#ieou}r&~-Dp0dl}~US`%|5G#2%@MT@A`H$`U3O z?LRFECgMe|A_S{ZD_devZy1$Z5e23M=*Wiq-Ox~*7Pag}UllkeCg z>3(XVzVclwyd0O@T1757g=&8r1;VTbe0@cr(9b%wq3v&ILZUMXRJy`68YcDg*@7au ze<;|#^mK1cuexcMi!rH$)??Di=wU|hc zh`aian+gHG*J;T)R&DE`!gk!UqeY8pKV(?T<@NPk+)^~8Uihrn3jD>Heu2e5H@7Jz zGSu10%4z5t?K7<8+I*&;r%paP`H!QSF=gA(Pf;{KCVyc{QV+wDfyI;6_te?1q(tM8 zI#>+PJFv^GI*PftlS?Ao$9`try|kHjNZ)zG>5lpnRIRlO3lZh+HYVQCm8Uuvlk zHU)ruN>tTOu@DpgB*kINZECm5$w3u~0+IlIL_2)Ohp@`mU07LQ-c!B+WySm{u8hD%1ZTCBC8Zn&-_v&J6 z^=vVpnZ{LgqYzOHj}q)kU@7teVNw#yMMVV-w&E-;AQ+?~6W_SiXfH|zt(Qp>qpzgh zom9L!1ZIiuGEy&%QxNvS*)GBD#46XK@t6O(K#Mdw_cB#1FF_-)h;{-l>uZ+{j#|0R zsRIHUwCJ>l#=<2^@)!(R9Q5AE+QWmRWNst&sDiqqS4HI9YZi;?Aw)=^wjT%$UjF3< z!aEJbqqU|af|0yi0N1;wS{8<{1GR0%nxz29w+e2>C&$1ON!@!NmLoFu3afk$Rmp5t z+0p~-scNMs&3kFmn|5Js`EA-~T)?i|7@?pdA#M10Ryhqg`c~apb+6gtG23&YWQ+NaJ;idaH zK(BUup12Ly&gPW|k10jR?Na-nbrkz6ksq_9y`IIZSMi8W80|yGMgtug{ip)~ThP$P zC1-spwkcdi;$k=9>RRGOIHE9pO}QCF7i+?>Tl7T(0BzM5Rc6#eC>p^1Wx=8FF(B(9 z7nIo)n&Ucb^~i?Ak}Q<;GC@Jcwb5P|>rn7zeyxI|*{-dP&HrOVUc*YYVdM>Av*-(d zhOhuT|It&$>T)IEGd)cMD|a;FvCXvDk<)jH6lD_UH{8kn=OK*TYYVX#=?a|?k+6C@ zHrz5+9K9n$<>)BaA-F+^9WRZEG%j~c?fTVj&`Iw!Jkp5>d!4v|+|Wrp8YwaHLC72X zR2>C&?v!5S<3QYvn~Lp5WWp7dRYL=d^3$ny5G2@iA{G~ zPclvF@=fc49KvF=<{Ja12=Y^5hs%x=WLZ8XCP&Ln9lV5-H%9SCQ$wy4>(3~B$cl0T zn-1J0-IiA#qDDpYs!=R7*Sn@{I@!j$#vN;d1eqa|3Yqqnn?aPU{#%qn7cY^%CFRo! zu>vkGngv&$_UCrq-zriLPbz9CVk1hHhGJ{#m{i%qMwdPifrGBe$oaUlZRnN8U9h>o5TF!>3!*;cQv)j zzs`z}g{+*2pM_{s*Kk{5ZVvPOg#ArCc2vttYB5Y+@`sFtuOhE6qW|p17HO_R0n}0s z!}U~JX6$ou{OS~Ul%|=;dW6-W-xe|C5DwzqB6`-NJt)y_gy~9E6kbVrotXTCquQxn zyp#5B8|Z~CHmT~p0v$v131mRbcr_*<$23)D;Z!Atc^?53Yljj*PUGiWXE(xs$ zhk?fNSoyESn#cz;v;fpv2T7&FR*7ZBF?CD#A=WU7PM;gmJiuEVblb6LPZ@#V5&kWg zrgSqVCH?J*EB96*d2f2fFv_wkA6?A}Q&5ZzQ1rSg2_sb%PRn{?0gNcbu_@Kmfe3W| zcY()>`1^?4h1hyN)-51L*}c%W_OiQmv?)#BnI!*v2Z;ceJ=(=TaSa-U4ElNNDcOV} zT{-!QstL>A9|itGc^q=IgP1k*H;hPN_97UWGVHkZ297?!8 zij|QT8(r0$1yEqs{^47!$N9f~ULo}z2m;a<^05a0rh!5npzRAHp?$og_XkX~Z&yL$ zK2h6Zv4TB!Rs-UTF8(aV#!~Af2PyA~fzO-NaIfRK0{V(sA0;VG$#MhYsFIMK_rcw( z-Rxy2f((06h3N5APg~I)$--i?b#!yvS`!B;u!8^McziVIwV*}6{|X9pYbR_k4{cam zg`LlVpRv!A7~mQVl)%k#QG2;OLOVa#Dgs$b3#7aU43+%+OV@ryE!ifIj+rWx_AD}y z*W=&7Pm*nkvD(}OXRB*^XX4Y%0l0z46+f23)r#x#^4{RS{`DU%)iyn9Pw1}nY`LM~ zjKTR=Ban&{p4iTl4zlTXDvyd;rV9O9tqe?@$lDzcs2W&V{W7zi?^#+>(M{T(GZh}t z>*1optVI^!FJf5OL~+D=5bUFDH~#Ce8T%tguKc4|a*S}0@QiK-HA}0r*_>$Pd_#^w zwSbB(-?kea|16El)Efh7OhECxP57&(ued0UGmu>(sweW&7}L6=)4!EA4ee5x5_{5d zK>wvR&1a^#rgv4JEMO~FnJZMd5K!n`l!^!Ug)SB!w|qjQU#?VNk4|Ov&75cIIgW~w z>2N_;m`?-IUfgvTfUG-@?4ODff10SBt{msDiHlI|n>MVVFEt7hmmi;I)yQfRuaeKv z+yC_SciXxe9JuzOAJr-5Ibio|e=(}DQ?}speH-v8iirAUF-8L+OIVi zPNisuuk5ICa~ZCHEm(O@wa0CIr?hn*cef=`GzJB+(7e`*YL{wbaQYE#1tfOGr~1bI zO;Ymwvr{py^N)FAr`X=8l2Vh4(AX*e2jPD;CBdcAyi;rHJpDS@Fyqsy)pWmXhtN(mr`=OjNx)gIHgRW4&Ora(kp z3$bp3jgBl@s>fG+rW?fT9hphLyP>X3K#3aAJ9hQ>Q3Z@g$(efcCnFNeCtG%f!xazt z^WVnKw;UEz^rn&MA*955q6S$9=f;EX+OvTAX8A={9jKlRl zCYD`uJQPZb%GcasN3T=F0=ajsOM%Z^ONi6Zszd=D(mO1ot28NnhC~F6Gj&H3f*t|x zyd<_P4`yc`Nj$PB&X5J5(E-=#abA+~6+miBkbrho@o-=p508$i$PfGUKa)^Bx=}2H zEW!xe9H!fa_mKoGqxis#(eK1_cLO~&%9qmuPc_*8{F$NZ?T|4{#sGoIaZLaL1n>jD zaNgvb*o&YlGs{rSM-F)4Bh{cib#5C7jPQh37NmD3fNd3KPEmIMgDq0&h9>Cr0_n~Vg~m;D5TsV{eG zRpd!;_&i~hDQ7*7-8)`y$xu-V47ShVJ|l&6owfshNj=Z2$G@w-F;ziV8B2w;F=`~6!HT> z)yAkV|NbNxYs~}vY21P&=PlTe4AS{Q>XS{`==+?;`=lT3ypHeyL8`OI9H}JV5-&5& zYw~WbwLOvEftrl1SFBh-m9;$4kg9edFkn-2{qoR}DVz&kan82@wLIS-*yr>x(Q3I# z=hNVZXg*V_`@OBh;oC=20X_@Xb~85fnM&o2+IhbfET<&XS>K zo5 zt~=a-_gR*Aaw`^l5gr`+i2wR)YgAfak|U~`TEYIx8k*@a=RW`z8<|QVep9df_ZvA# zO+gcK(Bb)U0P6bSBtUeDdp)!%a&xIwBwp&_9oMvd`ngsa->E+Bb1{Uw>~QPB5nml; zGyZNi_L%wIJe2F@Pt<4{0@!^h828!G-aY~#AhR{Mepz`p*025>Tjd;iI6zneUv_e= zr_an0W4x^03Z*8TT0OUU-9;y*Ju5CdbI{3+ibElsfk-JRP=JZHn~rGS?@qhN(~WL? zN-y|m%F&05G9YR@AmM-}h(1=%R*}Mw-p*)N*^=JimUmr4EvRdQSBh z4wo2>#n0u952h+}V}OjV&Gm0*;2$H0;Hj7yCj(C_^c zE1%nl%Pg~&30!6rO!|Zt6Rwyke%zCCGyhEmzSl(H8X#AInIED^Ft$zI&XPuIiEC6? zPZue%Mh$Nh7XvU(R__;Kv~kW?q&SNGE;nrx%_yr)pXhB?yoK8mPog)(cS#vpYF8H8 zuQ29puhqA95>EQd=Sn&SYpB`_PqP3(v#ZQ{}!}@PY@!54&upr@aUsq3;hdTUr9=3Jgp*8PtNO00mPf(0(bg0wc z6AhURHzD1kE6bmut$-sO3CtsIo)HFsTy?7749;^?+L~b9Y;53RyqtX&IFzl5k9(S~ z3<0%^-}ZQ46lzitgnkJyA@jSjE37q^!?Lc#EGEJqKjx~Q=*Zq3ak1L!eD;4#RLne@ zaZKejJTqZ#1OS#4N z_VV@xyDH4>}wXpRQt zv_p=+|zE;9soj^bk;=SJ&AZN(H=V{e)rff5;-5zuxtNov;@es+5FrY67Qpu|5 zr%3<^1n_e;pMEGAru#v$7p6lDMq*Heyj{_!dKgaiL%iRp)Us3dZqHiNI z?(gd`&4IxpZ{`|Q=<6Ff+?D&)(aZLQU1#{{XxR7hModNucL)BntHy-@hoowk11lfPDYNdd^#or}shBpGjSk}|s3Eh|OT`$Gkjr6+xCj-o}Nn%~k;u1;99fYHmyAcH4CuN(53&I2^|# zk2Hn^85vnI(wHXkGEtW*7?^_OZ)~-ii~W%p46F%*YEI%4*7gquha8kMdsBK5$*-qF z+HF!L{GyE#1Pq(+(?q59DmS6g23aDGUapQ~GQdbGplTp;*yMVoi7uUHAB?)NI z#67j|zfBow88EXB>&J|Qx(v~8Tczg{^2fIPezq4Y%_5~0@J^V0kkn6&d$IjpmS_Tj z&|pbv4nt71+`eO!It%ZuCJ`v|xW_wQC@*bp<%wl-c)}XB?h+jq@VuX4l3kN(Ql94* z%Bq=v%1HJz^;&>tKV@YFtrUt2u+k10$c16{%Ay|r(&l!I|Bn#74`N3_UNr-CM}&H4 z)h3k3saJk;sE^Loe0fA-u3MpY94UE}u}!WihInXf2R9EPCL=KpKW~~;lf;v+Ay|{g zg=NXT7*fJg2$b@Yrbi?N#Lbxe@b8HE|Me~wQaer8KQ9)+>Q5XYUWxDE@KYn&J`}f} zW(Ml;svq5t#U`%~5YYY)E9dMHw?HPHl+jFts!(q*WZ{MFPy;Xg@5lfD9snG7U~V0e zusvAs(=vD-=@c4(@*@wNKO6KrHB7;iyx(#J&}h2;An-(%9sPd;?)w1JzKQhxSmnVP z)NPoK6aj+(al+*97y_tkXO{t()B3Lwum9VS`Trmil9_iHJjkeFlir>@pPTMUD)hpC zmzJ_wskjPt@aHS$B&DbHo0~%vjGgx_IvZBiFbfWw+1-1HkaGg*!v&8!jL~ymuE*Od z^ZT%DW`p6q*IArcVuUEOPEe*FPvsmj5fM&AM8f`JZW24AeNqa=K+3!9BOhiwn#N?b z3IcA9ko|wua-QLA{_o#!OYPCtDq5=6m)dHt+Et^rid|ywU22q~Hc^{WBWQ@dN2ooD z+JxFvh#6Hu{4d}Car__r{!i}vxQ{yz^B}p7E~Ytb(Rl$>U?G3RG?ZI!IdoMO7X2Nl`3go(~-xInC?_-kTKs%319MhwxM6uv6H zl(q-XP>XI^0m_P{l|*Pf$xfI0E6>||6VH z8d(9R?Rm%X{IU#&ER&mVNDor>SmaJuth~Gt@0+sS7)=v5RQH`b2UbA7?-Ww5*&T5A zbcI70Xt#ear_2Jq9cAN{WQ#9P0U>``V=kZm~*i+NU6H2m{66|7;YFI`-^+|f%=*PkSsf(nfho>4I4z@!)-K@YE zZ$nMQe)hq`5NTcvp`yI=FHEMO8Zc8YRW-%+BQsby{&b-B99>;=nn)5qMdem_ShD_) z^HSifHDDlD$_P5#STCshQ8W*uq{PuVxukHt*b*VNHBt@>!R@QcwH=L8Aua+a53zrz*(_1rm{DOxgtDkq5mI>i4l{wm5gt-G^5f z0VSCw(Q14e7d0FsBTUR{FH7bC5&LKBLE&b9AK)5XSsKWmy@Lj|mRz)(005l-W5eOo zr$Y{NA2CVKNnPH|GvGz;e=r%8(*aaY5w3Ru3#+xSVWkdzao^&KirDlkYHuQz_vuq_ z(YdsoJ_CJcjqOsf#bGO|X{+`=l*}rKTmv#Bw^U8=yJuH^mLD<2f|!zIBox`;*$;&D zJ$}C=TJW7GVr0|Z zvd&Sa@5|uDv*Oo@h2hFAkJBs&s5mqy%_qtGcl~McfTNqq)^dX7gJM76=P%Apqs4Qor`|~RsZ+CG~m<#NG1|V(h&=X8}`6QU1x<{8NXCi z-HSTdkwOLG-ly45PLNk3bni5KZZ781K6(Hs{^8@z;oEva7EHAB=c&9I!nJ%c0SgTA z*|NLT8UUz9`&uY-wD4vNCELuA^_&|sg=C?0-NT}2uTJ`z_5GpeH>+v#-PUgiRv>|N zf~mB#OvocsPK`Ogk-eU~=@P9Y#A6csnTCE!q1TFu-eU$ol;Ap6<jK7;oDKv@Nx zYtc2ukFS%_Rkb4BuWNVL2Yw*wFx-5O?i7~Si3!naJpf$kXT9Ei8n(q|#;CJp-tf1|=tJ~biTg3; zah=3cTnwTvw9kfHgP<5UfIh=#NH*w}z(Jp_v=-$c2uL z-U2Kzm)FQvs;bf<5sH^S}XlboQcwNsZYAygn5-wwleX^|iWD=KJ^cY8Ta~AW^@b&(WGX_1|QF zk(0>A8aTbx*1qL0R@47GIexm@qCG2|zeD1KkClgg$z#P>+XR0LcPc9V_;b~nRQheCNl zp41lBn3M%s>RXj09T-J?{a(+={w;^v=#{81~p2LO#Ije>Li@Wy}Rh)kkOp!Vo zZ+xI`lYJ+KrJzuK`<4L0ZwpLCro3+i6)V4xADUWF((q_dEIK{vDM2(cv-UYp-eDyC zdoj~F8T5VpbY5Fr5>>ZSD*G#|0a!}2e>*)>ftEUa@pajClvmMvB$phSY~26@KM2jp z%*^i)wI5RaG8~FKZbC0SS-eHne*w#PM2)q|w21G^kW>7FMUJZfvdm^7Kt{{0%=ptlx3?ikODC8eY!?wgqkdMD8ZFK34(TQ@Q`3OnuJ#stbf+TU+j zkaYE5uaM!sHxYuM`?+6sufE*EjnZ@??0dd}-89Ao$vN9;NE*iGv<(^~K-ZtXp#%g5 zvJs2@shwxs?&4m581C5Zbr;Q^8WRtu4b%-qrx;lpPg84NI=wynWrJVmp*y_WI{)^h z#Z^FzpC=>p{@*HY_f%2vD@QbT?k#ems)f{BQt$M#wz8nwAII7^q6|R9{_G=4&Bx6A ziS#&RKLszm;AKnlbiuH8T-H_0z)6Gu?mQ=;Jme95$d6sQU#}_XW~h##Z@MpBBC1zu zmQzv1db#uVVxbTQ%Tj^xK*&0ug-AuYFt#wJkA)zLhp2PKGofLj2lXynTeQ?p>sr41 zS_%pZk_zEcFb(zWnfm)367r-?qgI#p%gEsU@H5a?1g$txS!%LIoVYie0eD2xue?M^ zT&A^^Ud|c}j^xWleLe54kExr~z3Y7Z*f)6ME~%`vsk2nqvoFtQZo5o3uq;>Fy)7^j+n16bVRBc zg&ycSO^g?2F>J5}vfPgUP;TKZAm_8ijisC~x`JI3Tn0HlVHYtmxrTmDQCr3OHqiE_ z4Pp$;%{u~ur6tK*gI|BoIVX%C-jy_FSr2fH?tenhFu0$QN!#ECHk)e~y6fw;B3Oms zj7(gJX|4s?2e~ut@B1D)lvjofHhqce>SlF+v6~*1HS^rI*yb9D0SzxU3W-p8$>Mzp z9*%A2mw(})p-GbB1<@S*F?}{X-W7l7eIPIezi!V0L2lXpy?5{+7EZ-)Y`5qy8jB7TvCCDt_Pq8f4h`9}sR!V7sQ7aXZ?H534WJ$g1VYM;`mwaIpnDJp ze}_Haa}fHWxS<8HMq+f{B6xM4G^v zWHWc~_Ab}fS9cz}2>w2B6kJ-I) zE{SPSoUmZ8o(_9%k%yXVE>mqrL zm;5NHHS>uG4K-KS)Jgnh1zt#?mQ+W-R_kZgGg6l$S*c9_^jp@@p%RaE@^14xG5y={ zPtlsHQ>*I5!5k(RMom@$FCF<6y4QxuFbTL-cC&wROC& zGQA4)x0De4=im6CQ#?@)G?4p{VOC?J?3sc4k^yjy|%8sgp%57gcqU)2Bfk zdOGr5+i}ASa^^;0-e5By_#5b}u;^o=rF$jNk3|E1bC&#n&!;+jr+9*(eZLgIT5W8-#hMdmM|-8S5s9fVwKqDe1a;begumOcZKn{y=O zGt_N=HpMUnFAk5dXqLn)eeR}ZALiOV1Jj7Gc^NbFc9EB>Cl$ny8IWAYU8d~tvpfwu zdyN;rXOJ72eoZ36OI_X3nnl1M;me46$0rQuk7#)?_gSTe@5i06pUs7_+!UhzIEmNq zua=0L{BcCWwcPe+Z#q~ zVi$vzpWo2jG~P1E5WF-Vo}7->#}X$_ok^O9?v;_xjA~YYb1f#Pff`%gJ=%d|)X}!1e3EB9O74<1L=qzgF891;rsyxf9@K}Jw685A@Jk^+$$B-L z)PGt9uiEb}SbtqTI5oq$0q9ry3=+RaBcD{BcvECi!RHxswOO0w+tcp3DS_Z7Ep_7o z@5$U5ACCrj(iLQH4&C5$a+KcSYP<-SD>jEdMc6%kinUv9zhTq-X6}zO)0S|Vqppkz z+++}dxcr{#0^(+(!oMPcFZvzaN2bBo3#grVQ*O zOn>}|b<XiMZT;7-%lD^)*; zNMucR&d%SPO3uI&dC#`j*M!HvB0;7tIYGlUWx}jS=o&pg=fZa{1PWf8Zt?#&W#{o9 z6=?p|`Y2J(6m^BkblY!TewFY|nRw|TVIJYP?y(XAT0Ysho+6D5M;6Or+JuLvZ>=-347-3r;WKoS zg3dKaO3F=1B(@H+azL!ixk{F_3i0^+-EHy63tlz?CMMs*)3O9cF%kinnc$wjVpbVey7+eV5$a8deq&=( z@wFj-ZbTrSiI0Kh{U9N7DPQ*0h;7EQStIzCWB>byt!Heo6$hX%on`{=GhqQ5Hda1{X1JQ2aNJF0|_c}6s~mw%|pY{(F|{F+%{mhL27 zSG`!d>5hI|2XQz=(RRjVH&H37s664?X(55yF#8>-$!j>b9L=Tk$`#&WWVt<3?;d`tQa={hP}07W{~HNrr(4%vJ-N3clsaR~)? zs6bNa_TssBPmif$YiJ87Dappv)&(3%4$IRWJ2^f+8r<%$+JkY%p(`%YkDeCR{b8=^ z-+QN%A=b+NWq%8r_M>v1YS{&aU@ALuN+Qh@OiHOdBIy-CD4V~t~cyTz-N0f z0QCG`vq7!4W@OIJBLWvoTPPo(!>e}GBm?Ff{d>SRz2_D*hb{ab)BQxrdY?BqG?o4G zsBt^OW=C)&i>er^kCHH1pD1=t%@jy-s-h-0r+C!%=|lI^{K-2s%m*mY6EAYnnXSG} z4&`GIz=5fnpgFJw_GasuGW~^<`ZA+VDZY&9bS|(`r=4b0dA{9+n^Nlcr4LTYdKF-j za{I%lY{=uT0!8l7^YhtS|MGY$l=#k+5V0u%*;1U>HvH>OIK_g;Hl5U;8c1B~)ZTN9 znfcz;;^KSU&`n7jY0o&)62|;Sf%aquU$%+v_&vJ3GByx?8i1jAR{uDYDFB|w2?cgC z<{>BDT;)XA!jTJ|;+GgJC+h@$*>@V#9iNNxU-DQPPm^tJ8C0ZghQrTWi2l_ow z;C05(Fyqp-g%ORQ@h4re8b=!0^kp+to+`=Ir)er-Z1baW5`^x+z=+w~H{5u0JpCMk z&kwZGAd^Np7bGwkOZjoawmtJWxClglPn0omEKU0aB)^@tcd8yv6`x{bt*%?gIg$i z2l=*tE8&tX7V-Rx_j{ZjpYO}C{yo-7^+sWoGIQMlLs)=0)(4M?%e3)p>*Egd1={dP zx5$WQF3*!=D_7gFeDLGH&j3a&iBWMFG8-xbCD8g3+BsN>E0lc7C818UC^=itJ&A<~ zCJQ@n@URYAF2W`jQb;G}=Z#Aj=);E{BmkL(5Y9K#i}D&$M0u=H3D<>|ejAzrdMbG} zu1t5&sjlM?JC7xeQGbYnE%5+%;m!f?I1?#(NaewC2q1A?OSjQYTrZ-3JOJk-CM_*= z(1Ridt{k%tTst7%O%^>paQikyBX`NctTCW11SlR?&HnuVi7xuh5%P*$qo*NvA%t|U yRi8`Q8QJ?Uy2uMwf%Jm`7~%gPud6Z~Dbth9ER#;Ap8!<=6Wk$aaDoJf;1b;3gF|q4cWK<+Ew~c`1b6q~?leK?@P7B3dq--1 z&9A9xilX{7z5ATqd#|+~StmmAncILx>tv;13O` z`H~9*Qy`tuiCh@JZ&gMs{x?KG_~Ac9j7Covs{;MAjLweaiG5qXdY31=4Ft-919oA> zzP`)87k4*$XlWFT@bDa{{Z3fm^xoeX9*$3rfr*I;4MRyuY3%=g+VB4oerRCyk5O-| z4S73_b&s|A0wp*-ogngqt3-zeQlYgZSz2Z$1wSR4fxKX}Staw9ohg4Lj#HmxmrS9! z3d@e*#!(v%MSgwSn>CfDW?DL9k0S@+=$lQ((G`nsWN+%uOTF!o%kLrD0#8mil-E|M zk>rW$MM-h$JeQ81=v6*m&3uWb&chd9OP(*0_iJGSi`rXns?CQ@w;d~>_!G0ad$%|;-}aOJ z@ud!Mg_Cyv4yO+!bJopR0vikw|9Ut>V`5;N?a);T?nORZpGN31bA7*`A>`rH+Ah_) z+uApeVp@fou70ACBQ?ObcfOl{T6WvQtO4+JgPyd z^z)Uy(XR;schVY4R+eMz>4y0DvsOUQVx!o=wOzP^)Z9?koAuY$z50POJ~n)T2{Mbx zknON^mpfm5yR#TVwe{(aH#A-J_R3V)^>9%|#Sh)-%A>n!)R6}>Z}w}>IJO-&zo$fS zTx8_rW<&=3DZJ`DEuE4-omI5x)IIQ{ksuDHQdN9}r=u4^#KfHDAR_nXcjs<*W(=(_ ztRzgu`SiDl!-mLOc1#Z=k7KzXxWgHnq9BIw`l+d#dom;5Xi~ zO>1*Fxrawq&u$&0%`w58qpKk~p74zMbvE0-U2@(JTam3ke1y3%YjN|k8APcX8j$`L zBJeLa=|7E@>W(TL^`t>ZvOj(_a4q)~7E&M259gk@V*R{5@4@a5Qx$y^G?TlZtxjV3 zanKN|pk&cy)APop+eVna?F%eKWiOf)^0k=Ap?%xM>6a#~qXlWsZV-rI!L~C{L!ZG0 z1r24TTUSiTlgHsQ#Zjx@6V|8_Doo9qW&2?mL${MSAY~kB9ZbAn+ZxDB;yuH3F*7Zh ztwU~Xf*mt@f7+36jg?Z}89p#NaUuzej)jR?yP3qRrvW*6xKDgneCteO3l%ZH6gzi=sBOx@J&8KIbhi+g%FuTaUHQz(X&|K}dwV zP?5aHr+u$ME-;9XqQ0(00qtAK7*B;Y^R7~F@o0i((|#h73{qO7ht$b&lhg|jB_|@| z$M^*D@IDAkOg3Su{;6ICLcEcmFJsM!$Wh}C*^F*7H~ji5P$(o#1}#Dlb`m6~LJl|G z2juC_-{GFnk)vk&Lij1;{e{P#iu129ziPS@Gc0OHTLBBI_-nl!*gzDPfk>lCuH~8R zO{X1>nubORmgF>9R7`AnC;gAob?ZuAYaFtAMWVZTg_`5g;P@hNh3aog(}-nhC9WbZ z0{AMZ20mIZ-PBKBPm@tGnKKuD{ri=4Dl0f>_XI=6Gv8-wlRrUCgk~@*NJ)*%G^JiS zg>+?8FI07mDRBJfnymlyBH`cdL00Mc4YZyfH+8r_K_BJdhq!Gp#&SUBKX_;Lu-$-i z;4ki%W8F3x(v5Jsoc+A(&GH#Z3@V;1-khOEHP(@pT`#%d#28*`emtnjo_O z)`+AU*?8C6sTap5(d`G4t45ZVv2>tqKfz9R-lk7h4Yu3LH_<|=pH3n#ddj2ltUU9M zWUU>v%}(9Uf9F-U=gf7Xe!OXMew{WIn&G@2x9fh8gO$X^-Tyvqj(U2^=yDdu|HHld zC%VwKnAok{_#D#T#_Yf5fU|N#~2m9v1#Q1^PbCobN49e_*a##*#`M@cgk?W zE>CEq`*H}%Cil}2Ha@HAg^7X2%1)I2i|gOXfrHyg_JN!I>VRieY#?U^M>8rC>;n-r z?QvWwSn{{osxP-qd!Uw37VG;^zFBH`2a{ntO%vVU*Xj&o_1_0lAMa9ZPp*9Rm`xFu zd%MRMng`~1DQ9?@*zb)B;w!v*@56AIbNOpbO?SFI9}9%6hVE1oWcDiF*A9)y!#(Ro zgMgT(FT^C(b&fZjADB*~n@(!BuICY=Nl(y;h@8AvdOC9ire|hQNY9&TR6f7)f};gp z^|^I|LkE8Ky>7IB(x76q-B)@b>yG(Rtao)4W~M~mBLIXWAfZtJIfKr;Ec*4=fP?ed zZV)p`B*meGbLbE{VvO2_>{J}9`kM>lfodJ)Np;oOC{u#jQdjz)`QKi;EqWk zr=Q*+pFm6gTb=-ddiuqBnftC|Qvk4Ok-Yc{rhH1Ab3UIT41VJ&gN_|UMfy89PPfDB z(Wz8>B;#HVjw4oGYVX8D2Cp%TC)dtH*%oD?$Xq5~4gByN!1>SA^W!lvCB}1ual^QORn(kG@o*uUp zan$AtwbjrdvrjC4gZ;dGuOt3bhV8QTt^KobISWv|iVFNkaygW1!B%JRCCPTu0A;ZW zs)>-1TT8zyqvPt}`5!UqBQaF1B*lX(3WLU2=C&u|2Ou*%#%Rc;Y<3a()oKr|ecp+S z^19W>y8vH)jq#LadyTT<<*{7YfyU#EPt8V&|Vy2xkj)M!Y13r3}Pn{e` zP%yNTpENZgB=4Jova<)i!cu^#IPoYyGY)EU82!+tm3`qcSv#1YsU9s8DNb(;_72~n zEnd!3MZ{CBJdVxv*LM7!7qc7`oR-dX>v+YIBIZRt{V|!- zbn%n=U}33Gf`Ur$xL6HqT!BmxNmkw|F!MahXnatdmar;{RK5K7#>!2NWP{@ z#AR2_eCW3@`_L08CRQclZY*tnoI-oDYC#=8wT_8w)}5VvdC~IfOM2Vgc))EosML95 zKK#bd0|ah3gj*QPjXCU?W4x^xa>@cmlLYp#JEB${bmv=xM956`VQ#3fTm9R8REqaE!>Cqf;k{SWf9h8|3H}2j5<&N))o(3L^;_e>c%^8o|F?*O zj;}7k813IyKZ&P|1;MvAYp{HK{om=Av*@1!K;6YA?2a~`@d#xPWEg>_hw%S`CeL^^ z@Zv|yly9i@^%0)UL%krg z{Ci0B{1!Y^?>MXWfngVB(|F?1Ma+~~|GbWL(@#Y*ZpEFK{6maRwL}hovuDN;o{r~^ zwjqoJdgU(#Uf`rxIT4;-?2Rf%E)Q6EEp(eLHc=V1JxPJh$-R7Ur^?@*P?+rJ|%Kx+4#5#t(UsOASmIo8x6c&!lKyJkJdLoKRL>*E%GuKOuKc&*QZ@ zEgvra^y7)Rul*46Hlg91r`ps&L^!v{7z@k>@f>-0&PB?vR%v*bh_x}4w97lAE}M!G zVHKU`Ys!&i*MW|8S>x+ls>97vxs*6I*S{j4t27|yE8B@uZ8r$RgCqm5lxlZhmX@{h zgadZ-dRIpwQ&NUG39osKX6C5cL-T>Ku-0m+z24*GhT;3Xm+X71So_WQ_Cya?UEQ3= zmt72=FNB}uvY(|iAuTPqk1SO(6M?EOd8{91* zYchO|{GJHD!X;}g_R}iib#z zoalx3Qx;hiM8R*+spa!vfa!WX>m9pL$n(Hf*me2YH%hWdK|vvHP+Of%{a!cMwG?Wn zKDX}PIKCnvM}+`DhxoL5>(r)rarDHN4|-mpJ+Gw$s37k$YJyW!sU*4JYqK7 z>GnoOibP*O_XRCDclx?ffA&bW>B)g;f>YgaU zQ%@9%)jSaS(HkRHmpS6WBmi2b0<6a9$FcUjV($*@+)3|04&kVXM1JTMw93(Ellv~Fc@r7iqf1QntFf@jbw|EyQ+&Cpdola_q;Q8;1HV^vw-t9-X|<^$*>Q2HeD z3qIViP1456_^1+AC&Hl39M*Tryva6=6ETn|9)-(5D>ut#V~+llQyXU4>-3XrvJ02_ zNu8`%UMWMXd~e1|xtH;g)v9ua6XaT4Raux=DKo0-$+`DvGL!X&1uD|(H!SBKHuQ-# z0;rT*n9*}CgiPfh9mKnNlrY>l6j=h5>@sAQ6{YODAnSc*2+g8M46E+ak!MWdy+2+T zO`jlDbr4RKE?hJ)MbB-*F|t%BVVrO%K2~IHHdV8@76M|{3g1FC- z?Wyeqj>uqBXqF-Lc{I;)LNEi*C&@(}6fs59A~AH;f-!P|BN~{2vNFM2b4abk$YXlB zudUy>hA{)1A~B3#s}YPidVB$1M8Us~ntG4CluLMYQ>)Fi%p}g}=n30ZV`U!1SrSXoEx9?3k*0 z{+o8?+x%lFLy*GtX93zM$YcE303)m1^JC5Piq;;kc~1@(l8bT(qg|Xlemiut2b`{L18} zLU5owyCtkb@c9*rh6keEI6r8mr?&4}PfDtR38kLs$UE0tu*P{Gr8st%W4 zBQl@>zYR^Z1`D;pN|`%EuQ}h{wq9zGvWtlWX@$(wW(65@;Yz0L9> zsJMh{Mx)Bdx0tHUM9kxM$ylX>rmrt7)tuR?y%;c>-203E;o&pJDtE*jG;v6Dr)s?p zUy=xs2$Y892jByQH^a&n$Sjf9w~T*_-<@~`4}GDcrn`l)QHy7#OYQ-H+W%)C1*HK5 z_K=tYCdZ{83l66LoUSBLUjQ^{5acg}4LD=}UVy=*%l>cP6Z2MgsneFW*={qt`pFd7 zfRpC_d4WOOK~Gl_Q%;ohtI#k`8>+x${VzP{{{_+B*8VxSi@oc^9HX=5DsK#F3CN-C zd2xj6ndFQ5Y4LS?+bFIAw060{=S!#dOT2co{u2Urw_tSPkX`@60+u`>?(g^jocP6Y z_1aDFq&x~?H~Krr`0Xr`5ZvMRCXYf|j}CAMu{9(uQz}eU^DXtBP>$$OYKK?NBW_L$_Mu$H+vr+^19`t`QIk`W-J5Py61hEY!KPIRJ2boIyZn@n ztT*>^M}Is9u?=v{v4#>_2>|V!LraFb6vBDJZ1O9OkWOO(huco<$lvI?vH#&Ulb84B z@sur9H@+5Z($J!?m^<;H9DjJbyt*Mch0DRQ`4<5Ad5YKvwhO_9dYQlK8s%zWNGqH9 zyg%aOv51==>BeRw1cZcG!v0Wo<_Bm6G2;Sn&T-X!FJw1SV>ahoLB`j@hz%NcO0*6z z9Kq&|afi#LL(9PA=E7H?u;bbCLl%1dfn=dZuGCgQ1f@!z%$Lgf*l9qx7*xP&Hi&7n z@&ok~9_M@I-uiK_Vn z>!0pJ@)5k8J+X(C-1$4;@XS+LGc4HEmCb6SNbP;O?Fw)S!Qc(%^3>5U>zxE4M@d%c zHUx!$@uO~V`zw$ zu;o+QW}my=-e_Ba97vp(3J)z-Jw3-QH_pv?igwS%aw9Le7P;M7s^;#`fe}3Iov-w{ z$65615}&4ds{&#j@m#wugJHsx#n!H=&!(3~gBbJ9<9#izT7Za=vxgJ5)%>M!!1FzD zk-WlN2C|ewXFpzGHbg;FPQtq1`;@?2$ZhHix4& zKP+taB&~vODsx7FXN;dY6@riY;tq z%3oMEPV}*CSJx_idkFE%IkxhMrtvwZ$?Ut-b?q~~*QWs~K}fz@oS=2TIUpvcO?q5d zU3y&N*oVvd)MFE3du0BP^MT>_pm>5@)${VY>VI z=Ac%PVyl9T9Hn+Lo0oPwf|>D?}KryK`B+x}JZ1Q}I|N54AJ#R6Mm=fw?M>T&QSEwUd5ZS4u~)^ukKMXLx;8SiXxCJl>Q z3oX8hqZu{#eF?0wjDIpJDacD*sSRpsYOC=GkNqZma6fSCy54U8tD-5@CGP_vZe~q~ zskSX|&7vOTTLZhKlvLHZ48unVX)iRP$(pD|-lyZ-O>eiTZ`a{sfq|2P)n(SIIq>Go zojm|L!WV26@?ujA{hyr31;U;`?c;?afZgq2hsscfW{NtpMdaitq10$>$^(%UaD;b1 zB8nC%of^660hq}A>pqA z*IlW}1eRTIJOoDOek>@0Wa?VrZ9KI56bJV)ISo?yUFX5^-mRXiF&KoQ*iDfx^G|me zMK^xdRo$kzOYH)RW=rrc+^PRV0bTFf|1SZwk_c6rbAI=VGe%9~32p6HlXZe-<1G|# zqx^ZrPbatd3Dcw*t|xi%N4CYP9+Wc!roe%lj9!2Rzj@^k1 zW|pQ*|K(5F_nCGL36dux^XoqbEG_pEF%{?S3^R%#TD`oY%vo*~Imsu6gc%o$osvp` zqbsagN%}a+wHFs0&C~oYcFJ1Xb{JlH5c6V1vq-8+zkc2OK41?q%^@N2k_1TG6d@>W z%f%*a(Ik5Ft#WYG2`Hy~_e_7eOBjz0#9;i8)9~J)8NlyYP!@PyeULsg|P}05ET`wVkR<_{8{)K5gN?w+>rdOgjyscSyg~ zVc+TL8K%f$9obQH@Wo7nT|daVFb^?($>gS4c>UpzFyVlde4w0hgZr|_OWBqPC1s){ zyll29@zpG3emhP*ieTbGkOVOm@aZMi7)7@J{5Rm+u}+aV(-IIvYq1V!U}UnqBg4t|kF>PHb6yQ% zo4=e-oxjj&=xKTDB!~@cHo8$ura!CDLADShlz#;Mn4c{uNr{h7F1BXbIj9Ju1X-F! zyc;Eo*h~#!qaUv!7HWEobzSdP^g3Vq)CJOp`0R0q()|^^1t&Js{>e-Rxjoqob=ZT( z>LT^qg$M_+{V>YUQ;&4bikO1dz3jJ;T{`DxK_xUVVbo>Iop*$U^DJf7P{DE`43J+b zCgI)A610PWYQErtmaqP;x6AcI=|phBO=ji;A|Q@PUXR@xA1(~Tv#}w%w}80-7e(L1 zf+)Hr!wxy%SU4GsI7w;gBj;%`U>>G#JO!Yp-yr))m9!-^VO7klX8=h@hM zYCWpW)BVcQfTlWD$tW&sLko*?YaxJ>x6bzYAEzf5TSUhRjTj+)$#59Iy#r}khhH6t z2<~h~7f{hum#T$7@=aU5;-I=n0FTrahaM@Cg>JuKk-K{dq(etJd=!7gXbg}$qu8*YufXO6hm38dv%S81icLTCcLX!KI&rCe^jKYt z<#*T#z(uyHsC2t~X?E_n@Cn?Q(QeJkz#2+P_N*OQI18t?|Hsp1YJae-lwc`+Um8-XomW3&m^*@w2 z=Bl$5E-X&&tpTj15@)KN?@iieGw}=oAPmznRnpMU%qdFB#rZB)2NPjO>3HI%V#Kk; zUDaM@wri^RF@zr{JIGP9fElg_@O0;r9m$}dlA3}waq&iny58m*tc45B$1~6_&)ZWC zDL*og;Xw|Or}kdko3+3CIC9^cL*2xsih^mXXNpAn>q9(mSZ#M%$w6?!KWpE|yAS5& z(Y9k{R=f^Zm5msgi_H>8%EL+X(hiFCx}-@tM(kvA^^_B7JSBt`3tFKst1E|#f63kq z8*TQ>;S*%DMItXRHBU7HvgLAUyJpbHI%3K>;*3_ROcUORfb#=1<3d_Rk*#=Q?oM);y_1zN){Kt{Evl(-hyR&Rj7WxM2-|3y0 z*8xj#DPPZAr!uKfETCeHiW<7b@dANIe zJo1Hqw{$h6C;NJVR|8li)I~19&(WjBaNBpx!(USr(tST{Y{Wizxa#dZ#yzEoo0<~C zp{)n4XBu!Zr?%+~mXC?R2`5EsSW$0iP#?|h)cpBzWc*?*%Oc>I88Eg+m?tyLzBt++ zuiS8}|7bJk`?<=1bzQ2KojKA}_oBcZS8!+x_|9>{AvXs$iQ^jq zDz^)&fAS$mCZB{A8p;Xb0!yA>D!ZlLn}XX;>cxq`C8;lXRywU5MT2IN1BUdXM@2bx zA0B178h(^xZSmSnH)bd@O7?dcv?~FaYJHmeh5bOThDVn?=YA4o0r9DO$ZbXLy3FtwOI9Usv1*G}Uso56}cXZ5>?e#>DO2qWnTWM?_6uqI;9j4t5Eer?~ClX#L7RX2|a|xxV(ioA91&O1zFO3erc+|4R8VBIiD75HpQ9o zPMrHIOL0FqbI-P^6>*UtN;ICwGMWk|>tBEdHImRzK15L4{flWTDc!f6X<2$5xMW!Yh|K6(%Aad? zYUytU#Rv6{E}wSVaVlAi3@Z8-Q6_t!=ew>LzQ0KwbUxOOK3;|Njnx_mBO0X2wWJQ8 zHkTqHq1a-ut5lW!^p$gZk(h(_avpyE0*hSKgZ9tnkE30g5B|hii_iqV2n$eWP`O%@|7*c zR^Cf_k-XAhdxFC3jP4a^r^^NyvUul2suea;<&5m@?aM1$T57CguJ^9-!GH~9PnEvK z9S%GwGwF3hCwQv1vRgkCghHUn)}N6z_Gioehh^y2nJ;^$kR-dkB}N9Xf7XMU3yC2j z0c49uCTAM|8LNb^`j^?4)m1H19>3VRj6Yvw&J-j>4wHi8@WT(=DAV)!5A@!^^Kvc2 zHg+HYG9Npt&!oKSW>vGkMjhh|R9%~7XC~`Ye{b^`b#`3_yco0dg7{DYKylr7VDiFI ztqx||j|TXed8*o+9{hZ3A(Wz+5L07z3ccg4Enh3un<-mbWd)7EUW0k>r{PPmkF!*{N5~Z-pN;M49Y9t)?wK>ErZDQ z-cTm5Q1_YmOD$qJ;}0ei`{bV=>l`QWztn=PnF}qcCQ-oaoe{K1c&@)^aPXo>B`WFQ@mzqs#}D8NNE1$(Q0J-ZP$$<{jP5M&2Zms zi0!U2L(6j#{vu`YK6{bvW!1}87-}LU|6+)5{-6-0s(KcnagwNP`HHMfcHqGKlL=d= zTiaXkXfqb9&W5n-UF>%-K>*u(sh@l1`EiRDmW&N!+R5T~{76NST>wq>VsBrc^4oT5 zO-N{HlyZjt=a%{jMmUt^N{-)Cb@(WcMZdm+d00&u6ODQlIdXGa1`Ib}Gb=v(5*S36 z8S8R+dD=RA+fpHY$Sjo2WVaZr>jOF029HTGiDuJ$im5dthP3=ZfAeb>T(_upH1o-5 z__^d!Nn9D1CJI!K`>~k$izKYuVi(pzwM{?{*}1St?w3CYcBMqNj~|=>Q)%V#So=R& z>sv3vX3daI-!l6j^fYpQY+?e?%qeo=D`DRx>F(D$g;|`6m^FqGu$Jd>A#Ek@-}Eq#kE-?MQ+s9yBbIog``)yD39ltCLFXB8X@ocP2)h-e^H6kvK%D zWkDo5t6?3B8grXY=^t4psmxEWU)@10?znY5_AE(Z533_>_$WncRng@4O111X&<-{m zuBiQjZ<6SpS9Dx*Ug4!SKB>5N^%7OP7szD6N$e8hUo-#Y zFLYik$eCg)RVSjp2ysr;77H~Onk@Lj&R6aZtS2YTG3z5q_9(bz!XT)9>Y!j81MDJ` zeCez#g`_aI#IOi6gc@+U@k-+rb6N$J5$sVg#TmB8+(XXL*z{L^OFvOYKrZtqMF}z| zxEnlxy*n&!V}U9vTL7;F${)G42r7Wxx9zS>qd;_-f6!3a3VpXLd-Ivd0?lm>HF|e> ztmeiFRH&Wi=QSTOMRWh^dxz#)WO0%f@aa{u0?~zT2u

                  x|X9@fSu$b)le!rk_)jr-18j1H7y^N$Tr)D1Y?&5e{`V>L2pt zF^WbYbo#BB#Aag3EEa~8$%o}qXNyG0ulps9i7Bu1Gi7CxwP$6z)ADh5%uE$##<=xn zPcG|;TJB{KL%*Org%XRJ&YH6Wc=IqdYS+crX+GWVk^z4D+94bJS;wxcELwSiK!D{X z??EbAspyr|o@Lf^OxT12=m9P(jQug>DT2JinQ3?xbK?1(;!^6D>|&yc-}S>g`m(70 zje7B>_y}U!nhi9OgQIXQCc}(2 zau1ySOnMUA0Q0Q*+JO+fefp`a6>;@>~Wdb2z~!>FDj6>C6X$ zxv%EFvfUfrmkfd$liC)Cp?5|BMyKk%?$=qreFKclw{vg^Gu#hb+pF!M8vfPP z!65ej^jkG9eqO1rGei)O#}$&MH%>INCU>TZ%GcVkgZOKjJ!fzT0xAJ|f#$@FGMQ21 zsECkhd|-gk@d{lCKVl9)nZeOM9^KM|i6dp0wJsE*kAFU#R5_EPi5xJ&D){)5H^H;> zr6+r%$~^5YOwRW(=&YOS5a2dRxWt9!Nb=DmXNS05bmb4Z+OO65liuh)%I02P#51ku zkFgV^jGjVvX=Y_tW8mVNG{`+V@bPI`{2=zl3=gN154f}Bw>;|LcN2l2@m4|=ny9dr zW7iCimNUl>7}Hdl`ic(@y-kspGYB7IJ7>Q5yD;hyx|V>7e%=R5Y4-*^+Yfs32VRUHP$NG6qd^dXkbMZYc8DqynVCQqdz(-V}Y zi}(t>HsH}kDfQsZWE787p6cc=uUkb*NXCan)Qj*!Zw>$0z;IZ8rk4)Y_EFx)Kah&N zWpV%ehK9MfwW%Ik^iW1h)1R^}Pxg64+q?nGpT7n^W{a+gI1#Y=lj2%90gmN&X2Aq4 zo?cOiq#ge40e)v9`+G874zh`a`tY^)32-)VoPbRZ;%J-vD}x{38SHaY0kzCSd){89 zH73z$JsdC;#3BfGE@)S~bEniaJvVt6L(Gm}u|ESOz(U)|3q{xDU$pye*C>S{u z>@d!okR7atNl2b!PyodNhcNji{nx(%SHFC97j%?|GGcoKz`nq_6h#sChg_ms&0#9< zo3HnsnahM5pf~|TxIrHLnrax=zJ1O6{8#}D3+S!yPAs6%mjocvi7C*Y@I`+x9L%(farzvoE^%P4Ln4 zrzo6bWO(%GwGSEhQ9P-{<4(6(y~(1>Em0#;7`Snd8zA#I5#sFD2P=8p1c`6(vikuw zWx3e^5ltfIi($j*-(m-#Ysm<3&i$KlGYl~v7tDsM| zt+p4H@cN<*XR6`yNR*c6+x2{^Gb>2V#cJ7mTLhix6DBRUudBjheGFSS2C%rA$WtRUAx0HLRa%;(M*rQp!+zG)Xnf#)9*#U zKTnLbLd>>|?K`lw1P`~vtXxvdFqY$;mPViS__RRc0FYgCMU?lnF+!wD&dOViOU16tz6SmH(&nVoF9C~mZs+Q0kk}_V^zrb{@oM;t5Re5) zPPlX>Hgn7rbwE=(UG2E==+uimHp{*wdK+uO*&RX7gQVVkaO*-#o||4ws~(jm1Xh?u zG^WqHUk~%yPv3!ik)`D24oj&ss^qyY7Xw7Y+`+yU`Ip1i3aGjfoSTBlr(ze3x!VEG z!DcwW>YhN<%$j1p{b>`osqR&YIgNlwm=CzPSgbJDL=s}Z34^`3>{rWQImchnNgE_K zI@KSJ7MGR2Zbjqx>D20hjL>cwk*2Am#$b@&LMBA;?qF>B%IGX%lbAr#GWZI; zVD--w6fnZ^B$m}vCrXV-KBjuP6+J2OO=*Z-gP=3WF}H9?MtYNA*5cJ)w++kjxUq{t zjke6tG-?HoPWKO?A9EWdeArnqaklQz1GU2Lo4Cn;OJ(iXjL29K8|#92%t zTF3;BM=+v>NN+?kA*4>{x)Y?n9Z4}1j7~D0U8pyy*R2=wZcFc*uiMlCi`|+7&=Xkc z@K-f!*ky2N*<|ARgu%ohCPF3q60k;Ey;&rI4c3r$Xg20Ji6|(z82+$nJPDe0PV8!< zau5qz)dUi7Xlkx(&l(B!wrF-DO`WRl=N2_5HKV7rdd#ZlMy)M=)U13s%IqxRe4(n06k^gD6#zq&%3Q;q){t#Yax!RJD^EPB}oLvoHiR z=G(L&D;Yh18Dy2}Pc_Oupl;cwssNc9`X@R04Fl!kT(#qTWoFRd85^phdgUX5a&D<6 z?=qRqGH1!+Z}f`|LS}mOAbrIncu>(tLE#1+P?5zTAA|I27&iT?3}2`SgHO4#Ac(i( zGuyo5Nby=OnM%zl{k+dewK5B+Tgu}lKt{RHfpMI(vv@`tF+%lGQ?%~$iG9Uq$>Mf; zu%SnV%bjXPN#fiGv68h-GX`mlXhurzDKrywuu>;D)* z_aI)}zCUce0$MQH1)Kn0Q687)X|m1u;?E8^BbD|F=;}P=t$7_YVg|g*tcI~QZL?r; zRS6En@K_Ck=y#8#9jUvTS;bfX;-CIEeMjKEnjh|qpD{)CK|x<+#8~;}+3!}U<%7v5 zNv$f%wz76J_|zm`;2d@l>h6UfcRmb5YZd{POts*xBFbPs2GKvolrUgb;O#gRJSAcX zuJo9JZIKvQ!0Tm{!GK+pCjpCMsYnb#ok6rt4#iR>LZ6;E!jQ5!Ldd*}*PZI#oz}3DRwD1h1p`zYPI}*qDrTV5c`|}9 z{eDRx9Dwc=RQj}kfDvw0z>KxLgY-BQt>xk5Y}BF-Dwu&jGQk*yuTQyI9g$q#0&4y$ zk}n&R5Pmj)stO_uEGY|UHC*8lbd;3|1ynV%n(876@~_8e_idN zYRd|qC_s*xPmr}8mBNSEYWU%5!}>34Qnsb+!!i|8@v7sEx64J%&xOsIdCD?F&&s&R z0t1OHMCE~)H<1h`Nr@py!i3#LP#B=XwspAcPV_lNg1>)G7}6_!T2$<{Ae_N!)O+V8 zLu^DH8#l zbcZ2-3E!G-LwuF`Dw7XdsdNIEsaOKoez<5p2b?fD6;&sXlHtpO{W zIrk+l`GreWI!7p41#+P-8CwHf*>XEhoaimMGdIcBH20zlova>^sU_)xf-{y@4pFT0 zCeU}x5|*T>LPE0mJ zGq|^wBfTbkabm(IRxLS!Lm4;q4}`^K;JT8T*mbE(#0INCL0jO&>&l@`$yqslR7})P zKHN2^VPr5=(y@;IkNw51ja1p=^R9>@Ti`oGw9|Cf6hO!xe{*6ONTS`r&e z^C6B(%^tctaogV83vXxH?S~h5j-TxRX8+S+*kkN*8-`gQC9E(BXQhcg5|F$?va>_< zdkm*N#$JzL2BWJ2kJZ*=o^pCFiMyZveUw12js}`|i}>#E^5~q;y6M-i&0_?%b;byQ zZqUBdqbB(U>W?4u<%jMbjz^DM9e0=|;%*ecujpPWeX`X^+ev+1TYfzF2643k4Q9G` z?KeOplHnga#;jR!$;W}vwTcaJs~$mBf`BJ8Vp)Jf6ND(PPD%}C+M zc)za30q)tt*B=e)9e_Auqi>(oTD{*u0R~ROcx%dMshtYLI+ZJ|t&M=$Af}fBgz3lj zO0LdmQvuEfnsR`iC~`$ulD-xbc79)HIVivx`(mdVWIZnTk@nb~;P1X;9*2nn9@vrl|!g{@l zR_g89^6ff2PGL?6eAtA#&ij<7fA;+70vMeCtC5d@d`!n3m-gF6U%lT--|(~yOVU`Y z@A`8qHda*KB~SFjGsOPef@111>WK!kRVdaTp5ef;tb1Eii~dGKdg_EbIw_LGdtZ_B zfVfHdi-^_Ym_=2LRP_Y%zssRO2$a{NK*wcWoL1+ftwLyQqYJ}`cc|HJUoQXN>3X_G z60FTBXU(R(X!XbUS!Tccq8nIHGoCc7?=LWbNIwXDSW9-6RNg0W7CZZrNg{< z7M~ie&O=;?YB!?t7{{k;6~07gJ4^NC04-K(qAaP!H%r|o?KRS@MM(*waQE3?aRUg$RrrPOBFqO~zpS0Om}Z#88#-BBl5SpJO|(UP4&PR($wx8_)q9 zGJUW^GN>JaQ_0*{nij=ybii&$NeL(lNDEaIf>c3jC`#lrfI(0+5PIkxLWezg?R~bd|L8x-S>EJe=9zidTKB3k z66D+pX;9b?t>NS|t;Yo!cTbWa8V;WRHTNK`N+fB9@06XuT*p`V$fdy(&UtlqKiJVs zABzVx1a0mw{)K+kY@q!;kw_GT@G7kq*Om{22LM+#)>ca^ZXS?R*JBe z;=sl@My=@k`bOGtbEd_kLe&AIs_|SW4=JT9ozOrelnE)tfBGcG%v;Yh!QnOc=e>Co zg5+J@oq6{`?J|G1!sU0tyr6Z0dVBF)cwF=Hg=K7KCo_=DJGLyayH75P7P@U3X*d8~ zA#odOSzv|{@Z32TSP6uCZJO47=tC*LZ6ZD*Z>jFOj7yKYYS&{p&r)OVeK2oE>%}JX z3B{ygPmF9ZfYt*lU3SRSm0rJ!2;YXoqf)wgV(`|mfVt|4ON|?l@Yjyj#DBmEBt4H; zVSJhB^ zCn8!vlS9RAYq&?sST4j=e;s+M8cb-4w6cmhcjG&5oT4C`F zLd&FTHwOwOKk)X_{CqOu5*9KR}W(!X3IYXGj__WdrezBT;>26iswRLKA-{_%fs zkZLc+OqBy=D{DBu@Vx}TK-%L}w3$R$69U!Djs(htV>@idD80fQ!68I8`e1E-vh(0j zbv7xltm%oP$=1@{Gazrii#_26d}9ZZcou_GVX@?6V&=1A1l2QDfFPx@!6XJU^>?1! zku5Xz|7Ujci-`)5*Xm}=SUPj|DCY(W&OcOyMuRa5_zV45f_1Au&vtf2bY%*YKEf1Y zXlUp%N|xEyWET`n0i!!V?;&OtmHjF3Dv$)~RX5ZBM0667p59GLh`K@1;@gk!lWc@h z>KBbvl3EWucpK8jCr27Rk2WLqX7KQ^VJk4W2xO(_D?)A^o#M0W z_n;m??JDYW<=bu=X@mn=<3k_zHVP)lg$Bz9EGvy-j>#;HwByDn-l}RjY`F|i$Lc24 zoz}A8COGD3f(9I-k)U_rz3s2Ei3qAMq;X#@$(-Dmu5_kXo+1zTmR3d$Uf*p9#PfYY zycCklQRXT;5mN6Pa~g|PWT^Bbe=))2>3oz5^E%|{3+iMPDr zdRA7Vn!R8zP)yhx!Xr*|)uGgZmxY(lf-)a?O+{J}S5T`NZx?;3M-h8~x|C%f7KFE6 zK^Mz}gbaeC1wF)nnP$Ebr@!!xq%^cB6hi}ivKuK=jV@8bEEH_~Eir)@#mPUo zqX~=cB3BsC0|r;DFON-0I_<*?Km)xIyztE3HAhuo|IX~T`_4TO2dGkQusbriu)PjT zRu2bs?UAagDkX@C|2v@JGh5Tq^F!p&3G75yc0s3=!&(>OXC~=B(~IBK8f0R#STg3x zjPF}F?%9tL^B?AlHx<~L2k>847f6EB$Zr(XK?8!Xj%*C)hmCo=+^N*sVDSf4CTdT9 z$pV~yf7WcsYoBE#=2!D>=T9=xhZ>St05n?3xvQ|{ep9yb!A4!VmcfONj~3ChxS0WG^O{_x;@?3bk&;F`#3BwiBT)`kmkf4`fod=QY{09~$9F)WV}FgR%zi zHT|Z(U^zgyNMy!&V7bPXIRAtO7k3nH4Xly9Lnc?|=c>~lWI61jlP1klPxW3C0Vwq9 zIq6s1Mv57UA8-DC7V>`Gz;f{g*FbDX2k`|)3%ml%5wR|GKbRIcpa;dPX$3UCKwH}lb(O57nOKla@gMGgNhgG;ZlLv(+c z@c~Kr`5^L|Zb-;WcTWT0PAQCEh~*bkXJi#%?PkN|bQ3&YeUG|us=TuRO)~0s-kC2v zwgR8=jvbJ`h0`w-JAgk^X8nyi`)6HeuO(j6I#48m+kYSp)ah`j&w~;d8E|4T$;iO? z)kEWyqE3UV*DG0t8k0{4fvv}Ar~tTfY5V;YWaq&D6Pa?}TMGo^|2!jvN7JxUft3_Q=q%9ncI0Mn;pM0U)SP9e<4h5McRcnB0JBXOWP>@+7ao@$KfdE6o(u zBBS8Apl78k7rwyp06ONXu-h}PzNX2a<4#B}e@GhMrUkW2F^L>5Bl+Q8zX#vIszZjv zk7|wNmj4-qfK*l?%o&%ksC{?1b%zev3ArW9W)-c`F}I}0XMg)`^PkmlCQXq_ex(9x z3nTE?5i!E_vb3MJ#9UuyI0d=5xgY(m89ObMz{&cBd#)MCO1g^3@;ttgDgYZzuL$hX?i3ME2x^Z2jMu9Jn7Z&~*bokQt;G)U+k(p8Ny6=x=0KhH^ie0Z41!(>B@ zD(uoI7Q>2clHBKfEYuLL(d>ngHB>8o$91)KF0P0+#2=B(w=3rLAz?*+tGRU$)C~7s zv0(e@c=z*aq15&6GOWv%>m8I%$i6R2jm>u+F2H(wC|-`>Jtg$<%3_lvtm_{G$;&cb zvBt24n1cNF#KwMvrCCbt;gSSKhyF}p;||R}n@w{16-U|47q>EHD5>LS+E>{Id7~|{ zq*xqw%|2IdW&*zJa7(VR5S^;>Jh>KYUx>E|-4PoJy7lZb;+gH-N0oX@cUxHPcaE!q zZ8U1nGVCU&dkYYkmM6!(Ek3FkYkt9)7P>w?+dcXw7P{X6`#D&#>ynIsOaV!)<@l#b z>9&QnfEGr(93L?|yHfqcz}T05Q`~9Vu2wkHo?5=}FEL1h(uU+MLAQ|XxFsp{c$y=pLLzoQ-8y1rKlF{tFUxjlJygZI&FZ8#KJ(e_J^#N;lj z?GNO7Wxwd5QweoKJ105u+bx0e9j>KvsB721-LhoaHa91uQgYbxR%?>iE4dte+TEf2 zP^5*c=WT3ll6UDLU2G%7n{&#cbeUkkY}6L+gPve^sGN~pmP|AtY@z$`HLeFD8I&B7# z<06G^b%sTV@fu%a=>1;d2Q7q%rkbgW@FZSdnzAQ4nYspZ1_d}8n@pJfQCgcNUSyY7 zIl3MvFjH39Y3NJQ6E?wqM#kx6UdvbT;9I_m`BI(Zha#``mqW??%mO-80y>RF=vgba z8-le0I`RTKiFB+5y`Dbw`bX7YHV{o)f_52RT+Pa4Mt%~V-4yXhvuo~|&$i!^c^3cG zH<}tja8>Q_v>-inegKmA;n8JZBTjf;DeB<>%WVsdHj z+@^$v)B5el=y`wZer@DyKkN_TfP^JPZWBfB4mEU^0`Y`9l7ACABIsc&qxH+_@sn`J zY!ff(Qd#=h;cj6B&Dy1yQ8=X;Gi@wh!RREnaZlqR?sei5`q z;?r2Z_U?#=(omFnSnVkGHJWe9#Y5A1zeqb%KWhA0Et=0~`Zttb7iW&bqiq>PoY;@W zA2k$xVw-j&f7qYNvy}`dTyi4?b#7E`JWbg2J2zi4LNbDIxsAQtt~oB`tZ%qj6Dp#& z%6_e~!J6OdYfTIbH-(EnI)Bte(KzB7t3gnu`w6bX?S%bWZmpLI#7C^E>RdcOc?ZjD z(m}=#^OKZo_H1xZriw+5-}vu;M;Oy$oB!=U2b8z$rd@Fab74Rf;u($PJ(N{V)Nf zL`)|)BTjj1$Iq;an0I^7G{H6?l&YK&NDIaVarVsD!;z6#jLNo-urF-N1uj3{p z35uT>MF|Z1Ug;UCi0?Ntvz3zYs+>B3xP_h$*(lLyb{z(h|JuhPYLEH~y#u69a&ZcD Q#!?vS-M;Zb$1d`J0D;`mm;e9( diff --git a/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area004-v001-MC/word/media/image4.png b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area004-v001-MC/word/media/image4.png deleted file mode 100644 index e2cdf4eaf49a121e17477d6536977d7b9f111317..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 60771 zcmcG$by!sI+dYbcgp`0VGzua}N;gO=NOwy&(mf#3jgktI(%s!1(p^J03_bLmJ$^s$ zd*1h4-|KhI_m4ANxUbo>oxS(-?B~AMz1F%3Rg{;;eoFcj2?+`N!+Qy3B&5ejNJz+7 z=%~ORtSxF7uz6wpURe$a$@4W5(w6`vq#Iz@mmMS|m$yhrd!LYy_>+*3K=vsON`k-# zDCVMaqDV;PQQo&ovB3LBPRi0^NF~GMyTBV%BUxz)Bsk(Hy*U^0F^2tnEhi)-oG!%g zqj*LfGT?MbA0$Lo-RBRM(7ffgsZfvUyyz-mFVu~ovtCeb=HhYE>hOe2F1UqKK^&2u z%%PmE5tLBk;8_KY_~l(1Ob!~~mx&$e-jX&_yy$cUhB(O|*`}T?Lp)gDN&M%p^Pn;M zjmw{RU>Z+C9L8E2K`h`q&bh~Zp0tCX;xaZQW1+eMJ3aR;PoF)*172)(1c(iuzrg?8{O`R= zY?=4m2PRUe$NN;Z$J;jo$1vZgUS2el`IeFG$byPJORB;>w-(Q~n9uznf9Q#cEi&X} z%|DWBU~kbnZ{B3}`m@ftX5mBE$p0**5LBy$2Rv}#c9G~P?G3vx0@Sd8)vDT?Z~%&7z7(i}M?m^P}CU9_+)-`;{1!^Xr|mySd?Mq(Way245co zEu!B=g9APDNY*}sx@jpXQQacfMrSp*=r~cqm6dFyQ?)8LtdSXMseMjfxpD=5s24WZ zI4^-AFtYarqhgB$shEqgnVZ?VdnOGc-7Xa9Xf~bm6Ac%J7Yk6P!&hjMgqpdD{**@V z*pBGazfLvurR3+ayl~AJqc~gYO52xP2;=} zoVKfDye-gde++~6ei{nk;PqwuNYMseicYwXpwRlTEV6S?Tr2?fgLWU$Z<>9@H)}|` zljKTieioFbzNlCWzVs#*KGML^ueO;SJin;kXtlH?*_kwEHCk6@v$kTct0NvHNTeME zmzy@W+9+g$YnwHXBS8ZR+_A91M2_`F{}ABSet*H|@*2gOXE_iWNNMlN{(W#U4ryO) z0ri_wza!^EB}T5P1>EG_^$=Y>sqsD4AEo98A}070ZW>M@Jt%yX*=A`qy5!fQ{jLme zW?YN`ovekAep?o=_wBt}itr+aTA^maEu=c1Yd}pedcs_Mvj+XrHE0jd^#uC0d*<2m z=dAvX=<7yWM#|bz!VDT!iXyCqF3CsjGptW%Se=7I%cB~guOkmOTMC8co>g&jDK-}n zTB%m9HGTyyJ`bJYlIy7P5+z+yMcTz;L&2kuDcKlk+NLh~5amT>&yv)USESXncRXS#vekjWJyQH35i$c_ z&E+`w_$r%{DGd#CB40wHJ_O}|xO~TIwa^<`^0fuIsr)WDXmoP2uhy5qSg(uzaO3rs z<@j|_7$G3}ClM)#!7cLrq3yN5G*XQo z5J+dH!y^AYDh+GcjZ^O&JOY0+KEW|LsH`$E1?nN{Dy-phJ;I1_xkC&h5TSlIPxNCG zZF%nST!l2fP z)|0PM^6ePfx(9RVsX{l{p3}ZYMx;Rz{5Y7HLe4hZ-}lcR`>&ZYgC}}$-hb#<42DgZ zcW%T*u^PQ=Jq6-G=Z-_JNt&3lazn~bWnE|4e~vP-|{VdMFpy0Ws;#B5kt-WQf-`zvZ3|Dv2VRF11Q6zK>dh znKrUo-9WD|zk?4UbNWY(k^2m@n)`#_d>t|lnzUT5_7HR9>2LAe(Mu(MA+DdGhu+ZL z`P+gPULQ^Bt9~tYCgyX;B2d=&nvtp=g`CH#g<*Kqhi`P)9v5j;Y}#;6ZaxU6Ev9En z-W(5WM&f>8o#fp4+*$m>=+` zc}RXk4nI5#1(x7WYj(f*-{jS`@^?W<{LMKM|F!uK_wosOk_T^WoQv6>IeZetCzx=z zN1P=L{cx>D91RD}XxGsI2%=vC11T9iwLg7=JLc*1UdEr(-F#4dT%uu{EN1z6YF=Px ze2frSCVQs4yCj+?3vxwE?jT&Mo{si*beH%CRNUitZ+HkeEy|I})VZXKNv8vA42t<5 z0%;*r((6H&-ie6hNBF4Qs_VX&&}U}}`i#HEsoSr0emyZea&^rnpwvv)-4txMaDl`K zZ_=|k#HMt>GF<&ImjLEHM)%R&3O_L}=)1r1^kkM0{LmFWfbkTOKbtAS{)F7d_PvUL zpJD-%9W~9IGC9bop6Az>XL50G0Iv(A@D=*v=f{21Y(T`E%r~$ptdZ8XeM6wBz0==o zVQu|se0xfO$BRiW#%8@#%Bkxe5+fp-#W+!#o+1ke=LPJ;-0r>+wct_v8nzPp0|NA~O(4ZPGG} zey(h0A!m#IuRA-hOueW&ppLk+bEJLTi@Fg?BZJ%vK9YhTI=bF$+n+e{YFFF$?5q-I zWIVd4Vb%AfXyM6Hl%0zjk=F35uP7GNbf+d_ZVvK-rFBgAJcG7wM_H*ARZuKMV0{X8 z{Jx@8gYuKhVWlw$@gRvP+DI)%lVg5w=d-rZPzszR0YW0p4DxNF^!BCQ)lMwUZ2fJ9 zuG^+I3L-O$OfM$*%_(ABE_qVL?BnB)kJe4e*ENtDE5aQIT3^fT_@IM@n3I0&wasdx z*$wd1q0wBs;~h!P4TLB#v?*y#S9BVnW60eJ)QL#IgwY%{FpicQ69P&Np7%tEFwe|s z?=u<-AV)<>RR|dy+makDR68gKUoKwC67yZYDk{bvEtdT-bUTc;&$ARe2xahVlDyT+ zQ=Y?Dp;PZw*?g6y1HE_DQ*~zF<5~(zN_u{Ns6wQ!?x|UEAQj~!1@^&Ta1-)2-IPLv z8`Ux+jx|bRa$Gv;b-|h3Y}1v-ZjEwZb1&6Wt2c>~y{`-(G7H)BFfaD!S4Rwz`_lxf z-2&s!s2nBufrw6>g+EpuOQxF=G1ioy)v#0`^8yFw!#l{bX=>okOG1;`Ru9If7jb3Q zW;vKtn_cg?8bow4&N*Js^kMCDqp~|=X6nhwVK+_GzmjPng*O{G*bkexsy;)<6ZWpC`J@H9Rip|R zj?ksH9}2L|Hq_8!VO3p4{R>aQ-9ARRJR^*c+rAkslc3GZZL9RgxTttaxg|p%sScSL zIK39fs2mzQh>LTsOXO@11`l*(&7-=<@kqy_UJ`Rud}s3S|5K#}I#~}R%TxLzgL)Pa zpz5)fek9H4CGzGC$@M{EiQ{;T>dHfSTd9#*0iA*jiV`Kwz?X+U<>1e@+0nCg&o{fM zNx2HNH|K`oTe>~hn1*#;%^>l=;MU)3^;u;@i1v|=%rjPp@#~LlA*cQ#O||KY#i;keA6u3(XRP<{u8_Qq455v z@NH(wk&*_in;}`EUT&J;=ZSG)-%nTy-IMvby^S=ws4V&?_@G`p{Rw=2ep2sVM9{gH z4wH*)ME{Z5(&z^7tb@N$Z@xR9Q^Xic=>TKvmYD}p`)Pl9CV&w|ok@9W&(qAGj^1u@`NW!}fg>jv&3UFdhkOoz=2OB9|B z+Qe_q^8|OF0r|Mx@JwjvemJ-7lHbif9yEn27^cEXaIt3;b?I8HR|cTRB7e}@n#yK( zC4&&;O{kg(kEFL)K@;W5H9IMgh^RfmVN-%fBCNI{4za`Oj)#$D)!Z?ns=6lpo+h;Q zKG(R|W7*q2HtHQ#2NNcBiR|4Qp;MSP8Yt5~{!Q_|kI2Zt0RgX9fY7?p0APvLTdI=I z>N`?REs~YHau)W*Mh#6m)&%B5J5=O*5G%*Evpeni&C0VPri+dD^>s0>kl`9){yh|O z+0q1#`H(p)nZ{(Jtx4@CHFWaqM@!M7@%+gfLtJZLCzWaCOoY6$P+cpc`6FvOI&>8h zHX?|XMeSO{uAGeq=MyZZ?Lfj5Zcia2g}rXrz;ulHrk7b$p)1&yKyFW^W(lwxTuxMu0ukcAx@VmYhzes+AJq0hMrAY=*X45Dg{cUbjIF zu4r6o2%dvi49>14tmc12rGxnr$?vQqY1CM-eZEKV?hvwy+Q+ z8YwN+SAV`gfJnDMRZwhhlnGRfhaN8w??c*~=`nE?x&}l(5B{(uovz&u%=jC*UQAmw znQ>3w09lx*R{_;{KME~R)tW}Vw6POe9C5_;TF9;S^zU!YP5E~~)iz00#yf%%3Ux+~&u8|L$kndX=F?AWcb(xQ_vltf_t_7>zP( zzY%SNr?96dC;e+K-*oW?Iikq@iy@g(G(eT+li$zk_xCN^ho`@w1tQJ^+$FU*vaS51 z4~PR<1G$a@nO5PSdwdDj9D5FTOoN(*$w_}m-*qUEO|b}XH` zw6=DG?&WnCM=4WXnh+=~&8J?;q8)q+XIV)msjhqigM*z&2IGXchKv09t8JeV{s^ch zgBtblB$n-t5S8A8+@U@ZSlz}_suDvJ&r^5_BTAr0(yg$;wPg4d%ki~nJI0mm6f?@= zUL;VtI(7+dS+Wm(ym;zek{u{4e4v6lKTqmQReE+>m-n^NLZN78YHUp)5}2(#3sg63 zEGqEh3A&lKzL$iPvfUxKz_=+vKq@p3_oK84QRaV%@5 z@%NM6vM`Iqw`bwu61#mc*^>3kC1P5^y$k?vb6S0(OFKI@WXc(7c}2xzsjGI4oek8z z;_od4i;A(1<;{6q%0#kIz+;I)K|yzy$~5A(AAhJKAJNK{!P;m77)G?3FLC74uqBuH zx#@L!usF7LyH1dQDQ5jt+mZ*0?QfR|80XX7o4dCExpbwk{Ka)0Yp+Hu&G=XP4_a59 zYPxmgevYOe+00B#U78!|%e5+oKpNiEpX^G4StxYJnkj|dmPvOa9p+sQ()mh%w&^T&nF zCMNeZNz;YcAp5|V#7%`TJ%JJq2 zZOlSeX6_UIi`n43ogw?h@>^kAlpMpIcettrpE6K{d};fv20oSK=04%kF!oS6<$WCg zVrN(Bv3T5DMzL)#D$4KK0_=5ZxShfNQGEmC6AjE5gn)$2xt@Yq!&)5g`j_Eo};!jZCA zc1^^p0;&az1yfuW-KWwJVN<1?Dv~YMhJ>uN?t##uBEH19^|hGo6A;~Fuvg-@44r4T zuHetDSTF;y5`|AKHJkk`Tm5iP4-yGU%1O!+?X%&iCnKmF zUY^Wa)YM%JkKAF)NY|Cb&87N(@Ykg@5@7o?)$v)|bP8xRv|Py1l-;YN28SEyH9JmM zpGIsB!&t4g9}1~(4y@3~tna;R+neLw$fw|Z6A32>X6;e`)+=^QZ}2!OTZ4wLo=uza z-a9wtZGO~`S=ctXnB02mp{qN0rBvto!lYX;)N}nxcGdkT1 zIye(}^-Aqb$UWx_{*5JeK}@&LAXo)i zS>N`J?I58+=Joh{x2cp{=r|u@vc|s>i;ffo{7A)$H+l{p=-S&E1+&V;bNXp8lSNP} zkx*_9IUa7$h}f+b?rtlU*kJJCQ;?I>?H{UDRi$3g$WwOhRL


                  PAJBm$PJM#y(y2 zRT4Y3X>^HKOr1+BHTX?l&8p|1SJO-PI=dfJh*6^=CPPnBi+%JU`PO&Ol#&P_y|G+|C-hOO)%dbPYWhZo)xFt0Tw-4jQmD(qouIbMfZ}d z_GWu2`qT?S_-1MlFCN-VWYFxVB2RKnk8r4c)p8!HT%q5amF(jgWp$73iO&CO=r82( zAjS)DP~p?R9y*X)VH*t*Oj-&lf>=~ekELNQs)@A#*Lo~_C@YnKx<6f`F8_GApCAHM z+&taqxNKyV8J@bdSnh0iPaaJG3YC)D1S_ZK76#&_slJ1VF7uviczKA$fbiUBKDRJh z_i-rjI=^+$V zz1Xo&;8~g+ugWK{wT`ii> z6yg-9)x=#qtnmse458D^Tf>GawTvH5f;T5ee$|em0p#$hkG3`{_q|Y{i6Q>XBNHKg zEj6_o9o=IFAGd;71_#lyq^M{}Zkob&=DZcH%Uw)z|jwrKp{X5zG_$p#O zbido%hZTjE(!-K66(d^0SzqCIbP#M>oDW{U4B@xOb54V^XQE_7pP7*~o5 zVXqcPopevI-1bw?Z2pCE|KK$p|k&Z$n3g1B2uBzx_)>GO}lth$NeqTt{{BaL!kB zrxFOw>Qy*UKwa^v{eeJZ+}WBKK+3DS6pho;PgQMdjbF4%zxe6|Gve4_T~|f z`H;D?(;#16MC)8R-BVoMiUc+{daL9qsU7QaYIgIK3X2KcH)YP17!H98T zt7{eZ52EVK=g3InsN@zD8Z!NI4?t)pfLFuZp6Z^az#a8H#v4l2Ckx-2k#<(a&+!H0 z0cAs5e&;VhcZfU=k+{;0Y}+8&9;^3f4_?O1*JOoiJ1NcYl9iN#W`|_VsPkve8?mn)<^GD zV6@9y5cU$rqJlA^m1=YEncm!JpF*mtu$=eGLFEqlNnF)Ly1EgYp@ZKyTV^Yk3~F-6 zTNd=0u6i&{Wt01FHwS;5EQ$WD)E;h9_zAuOTX*sd4gP|n2m zhFO{_o>4n5Epe(r4z{un3fu=ZbarVwd%yJv$Esn4{E9TRv-fzaDr>~`UlR2FggKzGxbiFct zQtN*4fo@Cw&BkK zM89VWlrVdk#+Ykr3#0-tls*ZEukOtCS*>%tB9d;OW!Xw z^|cgs;g@g53Tr_9cyUH_@2-cs|I%O3sVYA^+wa2vO6R}40M`(AQR&!|2M`ks&+Akw z6kfi0qbD!-hNXe_p9yA-$J=D}s;TZQ8>3s%y;PW;Bkmg~;o(skx+)0r9@@Z|`u6Rc z-_MKMws{#U1!I*@g@SglX>NOPdrV523uE#d(R-A|fzoe>!P2k#$BvhD<_oqRKoZ4G z1^W6Q;j1HIFxY(C8IRzS6^F+vC@*p{JbnrrKG1KPe;CjH; zZ|{OD^0N*w2A*V=t#Sg4kDcsPXbM8=$GZi$OT*BI;GCS{yJYY`&!ga%*T8C&IERdH zyhH$7U_ud#1F$q8EDZm>`Oo&U+VuDD9s@+sN=$%Jxk!c~Mo6UWn@R4@4uTU-?m#FJ z@Wq+%n9Jm*6KWe6U^cjENe*XQK3t7T_(N{6bItQvIt$PN%4)d3WHsZt+Spu39l(Z{ zaLW%sB3H{H0rBw&jk}EwSx~9DfEEF8^aScxvsz3si(6NXlI5J2yru0Fxc9$||xarFwnf3{x+~3Hn@645FjR^)bb6T%`2~X@ScZ1Wo*el4% z_2Sc}Q=Q@jWMmMbUclY~;jhmA4S8@BYR8{$lnHYKv0PV{Jne44IfAwhlsGS$1Ru$f z34EFyeL6Zl-BrE+tVOO2-i~5df9zr&H*v8mS_#s)V!iJ2Wi9 zgb|jBuI4J6H4vKF%%608WbU9@KF$IpmB6y2??8q4*6ulgrFA1nJnx(3i{< z10NLLwET5O=*Jpqtg}3>NKP)l@qxEX$A2LY8xbjvD4|#yZG;=@w%|W9Hl`pklaq5^ z*|Nf-*?c$xKO*Kmpa*O$-B)aCWdPsyF~w27#%T(M(c|l(9A1F`g(m(9~ zl0o9`uKK{0o}C@)3Ox{&LVX5G%uIQvt9m2y)k-EEM2C4Fmv(O_*?%cv0Ek?w(^~y+ zp>7;9eD&^3ogNe10!s5sA8Yb69#ugT=C&ThqgVCEH?%B9I&?AS88RVVU8dp^-X=0pGsiwA^GiEFPKJy1f*Bsa6BYxYhSyAFEZ+ieuDy4Ds>hk`~F7 zFrP1ywODLRg;FA(_?bM-h`NzfH?5$pLE+WWv9UHl2kPIfh4!qBe(ODM9n)a}4I5zf z1~J3foUG(%%aYU8<*d&S^|qifz9@i1FLuk#a{5qPx!3nX*xbzQO=NTPOCVEY0mReU zFUv}nOj$G@ERvm<(D3niK-lZSZl%}M+U+-8_TtZ@YBg;X8P-D=_n>_~lHx=%(Ne@B zJr_7kq5Ca0_2t5II^r}edU(+v_QLo!s^WkfUS2*@kh`GS#}YrkdycfUxVYCa4b9pU zO2L7|wyu%FzFR;?GrG@d+UU_!1Q+A0%CUF-OVB^6AeX?AG^K_va|iRSNlu zKZy79d~4p$s07=u-bB84r^4<4DB`@t-F?e`JewCBb=GFrA3KLsLHYS4r{-)O`dL3+ zY96?_xK;{n&c@b7XIu8Ql2LEwL!uS@LPJ@ov%WtSBwBkVl^yVd5}-dPd)JS@y^AZU zV_8^_{XXsheNaL0XTt4Dw$Wj{ySzT^#JO<*CT0`u9RFpD_KVK@!#Ynqn+fs0_{Vm~3 zL3XxiZXq^PqYK^JJMT41K~E;BT`ii0#9Ks)MW72zH@sZ+CtniR&4c(AAY zvC%MOKt6pYUtSWOUPB~}v3->yt3}B#CF)a8p-pb@^wW3M7KlPWSYGXJlkN4Q2!_SF zEY|NXE)xRms`7|Gi&SRqp?8eAFHj=g-O6cw&vIO`e~~IdB*?H_5=lVBQqQve4b(Lm z2k@vS{Sg*t!_DTlVG8&Xc_m7Jp8g>fSZnqPHg(s)G3&*z0vsj{0-3TdfEg#Gz<7WInH7LsVDvzVqFd=3OC| zr6Sx?vD^YDC!<-K7fvcRdNWV&Q7PIZ05BDd+zn1g~S35P7rTdrJmmczmt{iImHTgF1v4Lz>gB9(z&vN z`UBa3D}+upE@n`(yJPX&&gpQ#j9BRC`GCd(k^mXTf~DpyADqG;9~BrF5%+#V_Mgietse( zTQ;hQP&T)lF{G(*U+4K||+n^Ga;UAEl&F$q%qGy^GL0f#kmO$vmkzM~D>= zT;0i^({(nYcd?46kcU_jQ&3L}^sG(17hH{ABB+4*&_62bH92|2#@(q=st4k1nRoVG_gsJ_iD)=Kd?21_;~u~S zO66NpL+~EVY4sbyzb=_L#;CehGkKgK^rxX35Rjps_pXwSE(0#kKUY8qOi^bCRS5zR zE*mr-;SAIzpUOrf&QEW^6z}mT=VO7NJ{5UDaxbZ-&OVJ6#xdYwN&LSBGznr7E932) zX~5ecA!fuNJ^wF3ubIBGdNnW)F>vQ=VXBdhb?+zOhD?tsy9vYnZvol{u=@dOn5uJy z4NMJxfyoCK0F_sNy^svlPd&Q8vuN+g)l0a)LW;!!1&k1SVeh+IHd{A^^ZWO2aSa7b z4f)nHDe^YJ;&*Zn#7^Ir+*b>QHR|Gm!e(>sW8N zw|PpB1g?l7L#@=l(;88R`QKk#j7{PJ>!igV`~JHr&+*i`lf4U9`%3h{dfVzd03C$_ zs^l41AE3{)UFMl<2LT%axd_Q)0LQy~#wm*Ac-*!gFY)N-sg8Yx3L@qO&RwTd_c(Vn zFM|tk4t6G;*S)7VZ$r*-(-)!9;68=*EWgT{REV zdMke+3aq3Q?DbWA4Ud#Gy8CROhV2bDh(+?#0Vwxma6o6auHlKZ^HX^!M@vgc^TI-g znM>giBoDtuGK4jRm+h)df#gE>e9))fk0GA9@`+pda!*eTl>hJ53D;rz**kscEE7#d z$B}PazK^bW0t37_-3f;e?-fSc8kb}<0C;4g)zec9`<9dx1gHvtILNHc>GA~{Nq+}e z_}q@V)8*wDy@eZ|B1{&)s~V*+Zm7{q0M`>x`w(+gWs+CJ?M~EEgs5^-P>79(`ecA2 z^y8%fz@t@JZ$`xXF89P2;#okZX%}3VnkXUxgXud!7+sY8k?9L@Jnc|oYha!ibbF~= z!{@4M$_LIu-=z@|2)%|(N&<>s-U43MA1Yr>d9cC3_DCzF>rxNb@U!_BOM_|Enc7~u z-$rBO`;N}@<6^j-@rO!J%ubph8jzm$&S*oE-~IqA>vVs<1|+nr<%o_^ztq!~(9jZ3 z=O!0Sx(MR6P*i5uPs<&QNyl1h^>?dTnoQb`6p5w6qEj+N0}cgDwQ}bmqEvccku?+v zL197a4|d^Y@KIx};pgds@ay}r$;o%06r1i~?|y5QFpCyJ4?WHK>tWY zy!o)TxS_ae9Tz~wo5TsRY0Bstr9w(I%wl{PZx!YF?K+?d=(jZk%mGkMV8T4Do5x9E zy?ze#yO%aqu01n}8}EzIFOYBIJ2yx`We$U2t!YEE0%T-l=DK>)&ZdA8tV7$zqaY1i zYk*4mIj%0a4DZvaApl&a`S8XsW`}?k6QkJBFqHkA$FfodwHJ^K#k-#pSxmcvGL6~y ztF~E=MFE+jV{8l^C>9KZ9KV*Wmj*lj+9}Myw>vz<9&6OFd`0i4?fv-0yiGw>Mse|* zg`yS9s2mw8HU$;Hq*YhM16|@UPa;|DsK7v>w zogm}FbS(n3Dqr(x!BD)QNa0X`u-B^UKnY?6FBAtN8W?86?u#6}ZJ7jWr zy3-bEJ4r8tD(5&Yt1;~WX>qS>Z&W1;oXpZ_%3E8_786~r^0@v=C?uxYxt{gzKF#dX zZ3WNsobQYEjMGu{@t<0a4LYWto(9KDa?DK=iK;9sjXRt!s7w;yHak#wQy>grGf{S@ zv6xfPPQVL?Md_f6aalVm%GW+VL1+lqYtaEh+)nZ3Q>jJkwLS+SlCG{kSgNh=VQ!ATP&{om$K_`0532blp^CJV7l*(2Jnv6pvWWSrsD<5G&wMTl)Ze=4 zz7elX&&>^`@e)W6&@y{ZbjZul?iGeF6?o%fiy-pIPkosD8_MiVIb6Wiv)m5*v%^my zK2REIs0h5OLU*R5x)Q4*Qw}hkeM~(r`XdME`bu_66Smg2NP0_mBVg1^*5G;o3a2gU zemrjf(s{Z~kSq4ADCNt+(zJSz-PmP&ryl?SA2qnJ@C}L{OZKEE)Oy3^Tp!OP@EiJHSvT=LDqAq zV|bB-htz(8{GQVMR}<`x*FEzg1E%v*K-E}fxfvkh`)4jE53B%`_<*)&G1+#M9sPY) zgzd(6?Ne`x^s$i{iM&4D6NR+b#y16kD08v70&hsTS;n~U9j^0Ui?sglot;l1 zR%%Rarae!z%rc+08a1>pIv=fsK@)Yw?caapSGAkB<| zB<<*~Ij8b|4q^=~90Yec5SsF?8R^E0FZ)$+H@}Ui&tMec>x)F+2MC8Zw{GIi#f)+5 zkeYZ7$TwiBBs|=+At?-IdEODPy=et}(9F)3}Lia(IZkytspA@xzSXqZM5emFF_yTxn(O zH>@SCNJ@RY)zwhImB7;kGmBabZvfj)q-~A>rj(7`XLPu3$_f+o9VfF&YKpCMuJxsB zvIz$VSmmF+7R2tCe9uMs_(~h|7D|=p9w*OK4b}MkIBnb;cVgvcq+>a8$fwsDf6kaN zxgvm&8tHLK|2OjbR-Hw`aI| zx-|WxPa&ZA|A*HO*XVyYXLZ3)$X5-4i^!~1GW2~Ei+-r$uDMIt|LHGf3G`r1)*0$? z+9@UidRQQ=JeJqmQW_sucCD$%V+uIAK{E8gQYxy&WTQ4)LDr7QpZ~MOu4W zizHG(^XSp<14gFMKc+fR{t~DY6Q`*>{Ncp99;Sdo`J`ua4*olTyWF)?Z%zY1Vs*YE zsK&2T+ONY6_mF&`K2-$K4(=7d*(o$Nuob2GcTuLuIvcxbg73=oyZq3v>Cat4z=7oDxFNVX$!|t!2 zn-puRel!`hq>w-;5TOj~sB|Qs7$ zx^})Q4^Xx+)JIhZn=pf5baU9duguMB?qak-1(07(_0+Dfg10{oq;4FXvLk!k()5FNRCX) zJrzHGNJX~XREA!6yFSJ)_CYzos9sd0ueg)*5xx3s6xZ@W9L*(fBzmNpZf`qu;fGU( zFZ5R28LF&IF`owcD+72sJ-@|s!wb?&i8#}xBK?U@BTkX@V+*Sm@O+`;{LvR-v4YUa z2}EZPeqQksqW_LnCWIl?^DO~EFX1`#U?@SE>eApt1SdAd16k8O&$$6iAp-nyM?Hh~PI7=YJQgO3 zGhTWLZL9ea%qs8z~x;c`GQH1ZNbqY)BeuHz9nln6YBM#0I;bU z`UyXOmbARBd7)ojT<)asrD*-Hrh*EiKKvzbSN3*BytQ3=@d>BscT!HJ_gqSUId_hYIe1qlgBo|Z2r;M4%5 zn#m<|k!L_y{nuKx6+iGN721mLNauXqCBBnmLz=UTJt^HpCkG1mHoMQGDdrnK z?RKE@y1m2#D8Rt-a&Bjrsxlw7Gn+%VgBI2Wu+oI@NNwVQHGCM5iEVW?+IzGOqVB>m zO}GCPbZUqIb2COJkrlI$T(Fq)G4-t!MrT&|;&9kIN+4SfR~T7lBpNpp#}k3F_Vz3W zFr_hdoIi#MTJ{yf??T3Ia?AU#^(}Np&m{k}cwjW^vUV{K;8yvT>yQ&O6C8RdeFWuTP*j=ukD;n2tEVguDnDyZyjSsGrfM6*tsJ+ zkWBJs$NmGUEz>AqLKI)AJpS9GyPIC-yZQ$lp!n-pUPgDZ(l$Ou!i{s_iH|-3Z0R1D z;1xHHr>Lmf78Bzn1ifl1z7xm)xkaN_?*CVd#>q28Hl|Xbj!nTzQ4WS54TwKM3bjD!U8?~Y_`C$t=~hK zhA#LtVz3haL1o1FFsQMjG>nkR9`1wH^O4v84AeRK=x+JmVs2#iTl~ho|8n$L!x`n3 z{y~(o-D`ToobY}F)y_Fg!z;^fY?lS|k>J&JpUoAuL8<1C1_rVZ$q5O5@-sIyJY0m#Xt_3*k>7?in_g93HLSd>k!+dmk_bBrMOQ{WrbItnjp#HIii-^5beW2Wt?(xcriyULVyBucsUE&{dIx zRn?aV3${(G?Iwh-ZX{Q40*`>wPYE{9s0{qAfq(s7fF+>KVG&k@jPpM{Ba-40s$I?1 zTu0`^K^eA;=6t7aGOdXg1P?e5VG###8v9Ewe#1G3cTx4>1zp<^ zpaqjVLw{&Bps18w~E3S^Y^WS=Rtd@=kWZImrN(veIXM7bEO0fC3%5 zny4tzBWzQX$dAk;b94HGg^?K`b*IF#YZi8Ct7{T@&^IFAAKfHS<sBd$C2vBL_5D=8G$n=ZRn9;- zuZv5i?-emcES5^_fuH_l4bU(D1dQfx40La0du*EMDS%t` ztU-5Gd44x7^jWw66Qz7lBj1{Kb9TlzK#`E>#>(~gmVZP0DjZXsAYSqIu%l43wj!_y zlaOXBExLrs+AM9RAu#q-T3-WW&~!si*Wxv$h?xW}?NIW7QmZysk!c7K(7?U2VWGQH zW1~HRz%oVvlX2a9Jyid;UU%pV&`&{2G7mV-yVssvlsUN}0ljMR&wP}=6I38$b zjXNsY!H(lB%dyQ~2`puB{_3JtC+5e7tD$oV;RJ!}bpB@)av(6|%$Gr-Laob%jg-}0 zuO47|4;BetK!63K>J8{Ye0U1@hL#z)@L+{adarx4g^J=*z5Q-spXHYQmr@Zzk3i-G zTHBrw5!BR8jzP7LaWPbcYR49u(|AH0973D8Ze~a)%_OwQ{V)+-l~Omyw_OvtZ|X9N z3iYShM_ha41^t1x!#b~Gpox*t8tUxWIrNz&6S6{cb#jY(I>DqwT?3v$-UQ=EhNfw> z=NS^dbv*cRFgvL&B(#x9RXX^ISw18!H#_^=;Y8tGNVpK$WMyJnQ1MN6{(%7&Is#h} z5qSb~5ADqM6V&cO?VFrP3ZOIV5yh_|*zy1HF)^uM8UsG2)5o4CmIlho{D6xii`?HC z>%btD^%+8l<5`%pR@l%T21?8RZwx2Bpc&T8D( z0E}6gGsSSc?n;OqX-*MxbBi}&wcaUg>L@7h-9$wgpJFb+76107)M3}FedfSvQro z16xv_4q>}iz!gA_65k2sR^$nQoZimB2Aa^%vsyOGj)Sd<*)E?0&L3t4tghbeOe{KX zZbET1kB!D=BbHqteP!A*(s{7`yyDdZOyyQk$>M{&5e1{Jn5T{+K<~k(_ek+ifr0HX zR@WcAB@91n7qSJ9o)dv}qFIp`YPu#1bY`mK{B(8SvB-Ne|6hc?byQSs+c$iPg3_V_ z(o&+Nh;&Jp(%pziw=@g_0xFGCB01y`LwBdNba!_R%`o3NUibYx-}kL|t#|%#xn@B3 z?7h$PIF4U!w&c;+kh2p6-0I!Z`shk~PL06Nt+U2%!KB$0Hr`sE%Kl24X<03zH@NJJEu`0%HJ7SQR(fuHeGrCdH-PV^vK^$rPSU~oMRl<5gH)6 zf(vYVU~;k^cZs;x`n(Is(;^4EdK=%=@#{HC8UjR6z?Bt0SLnSxBZvx{j00T1OEo+_ zF1Jk4Fy8aX!F=^jDoIUUElq`d5y^aqg=H=rQg{B_8`a+%^;)k|%QeU zGka0;&wS5ckgVp}eTo?>oM10T(p802ue9S4zq3*R93mM>8&95p?UR<)!aiHHrTk5j z$1OFc(FH-jZ`_AJ2W+h*iB;t3KDc^nNE-LEy=uI7hzjxL3S4gV5dk(ksz3uKPL1lf z2|^}#K!|Q&Ll7NLEUka8^G9YqooDoqvYxPB=)IAIQkfN`5GNhG-4cIw-^=ebj)MlW z+Wyy%uP>aaM+H=_ZnDNplv0F^s@at58?p{@F^t{0yW*SJqurBj?e?BAw^4gDw&JFX_Dh$jlg(0<*yHq4;&%`9Jdg zC`I&m4lwOI-aN4AUt-dXdU%1ez8sZ*9e~477fO zXcf38QM8SED%y>k$-lJz)t@)lfBE_9r0zPM;gIn!yN>?#KVQ{o`8)*f0H4NE^IrfC z@bOmHTIQS(n;7rLzNo(-S~F6#4Cs6O{g*i3e_|rU8nh-!iDWi+W`47j_^q9n2}J=~ zoT#5a`;7oc4;padCBo7i+Z3T<0R+PR{Hq}*D!BNu$l4v|@ww0P-{9py&jiY4i@_~zz?q!Y}Z~L+d#cXPu#CLS{uPIZy?#3k+TnG z&u`(gDYnx!VQ2TrVtPrj0n{W&EUBmWuz|D|y#cwu_+ogAQ%`L-NDqio!^#_ZJI786 z1`9$c)_NO{;4ipc=4|X9Z(98X8^?y+){sSfnFmKQol9qlD~dwhc=x zEDo+9B5_^=)o1y?4(s+k=FZv}OitnE<@@Vm$4@aGju2EMg^S@htH)dG!V*_L-=(Ra z84P_Dd_<(eegxpt`C;}{+O%RN+e=jiCjNYWIVT&&@l#72oN$fjx4(YPof+QDe4@lS zSArCn+fv(#a`dq2J=wGjjtF`;rY~A%wV3O_6)s$v^N&vG^;Qwi%)D=9K2K7#uGm5< zPGtLj2s=o7nzhiLznwJY)#^6>mQvVt+Ct=()?S)RXV^29ULu0iO*bTzl z7SgUp_;|IfNk_$b>s8r)ydV9)}lGSeta~x4SJrd{Z7E|pUMusdu*f+l<8-zeZl}@d^Vp$tM zyHMOdJR4eLZZd3m`HzpMupx7IdM0V{>soE2x<}Yc(> zN{M76HcH=OVyWVu7uje3YRf7ZAN9&DU{UE6yE0T!&s&P#-8_R>->tZs8yRbt);qO2 z7prxEpF#&a&!HpqR_Sv3fSyv6GvwE zI7DQxdf|q@C@HtvzLzUoP>Qc`NE5}Nm1xT4Fxj2+6ZLgETJ9x3V zWfDx)EoFANY-&ql&eSZQOr1O{+bX*CumKjeS6py>m45tedpT5Yd3X;;mO1RsI-Q7! z)M(ok)ovE%1ka^-6>C7@SUpNF^I(_PvXO1aGMM*rUwxl~m-Qc9XSI(OdfG;M4JhMZ zkOtL-qLP;qS7V0HjMxi;>QhWDf56J#;2uCnT@$(2^IdOPyQtw{Fs{m0vKx&ZW`E}- zD6pd_1XgCaz*|kzqc&Yw$F}2V8HR-dH@C$TErq5w2Cqi4%gtNB;Qe-17p_f9BQ9ZD z>~JXMa(Hd_A;7#rxIc+7IGDtt@%V#fxrm_K-88eSlk@q=Z|6J9-*j%~21F_KD(9Ot zP+BIowprw`S^S7#5be}253y~4*I%aoIX*nNt=lxOPgA9kw&sW{B{}e|zCKW3ueJ4| zI*y!l#+Z(b)#56j+?zLIuU|7PEqzxhZJw8&hpY7%XyC|tD#XYaN-t*w>CKGx8}v=* zce3;ebKy?~j>MX)-)|&$CmiII%bB++A3U(qFu;#RHTS8?+*PohOt}s>ZpQFX7n2+c zTA?g;=)&BYol6!31?2WwC^5@gs#U<}I|uL+RzJ-oo>V(qw;#-lIYIV={(~1G>^ahg zY(I%xy!OvGIDQHoqxj%ADEZk-Zn6F3_E9O%EyVD>8sgi|yFRm17n}>bLtB;EW#X;9 z)et_%B3yYArNoHJxTJ1=?i~+WRa{7CxG0SJCqpC6jhxizAN4zi5gid+ip%G@f;s9U z96=CeF(b97erE_B$bqOE>BW&QRAxM#`JVek9p?I|?M_9(kkwJ0&@N(H!fN31gslLF z>tuUHYg%$g)Lo%=B3Z4nhGL{Af;OP1b!h0(cL-muUA;nI{T&XtD@PEE7IcJ<(>z%e zrs+D0!=go_L-UYr3mf}wUfPvcpTNE-K~joOC9dDB`~_Rk!jd}jy>F&;4 zae#nYMv~0V4qN$h(;f5hk6sz$Oq)^CL2|U(Zr&8pi}Ol3fl7^hpV!{vZbhsjaxh#Z z-(hVV=i<;X5xDr-CYw8di*?SO$#ixp7YnnpyL6@n6`#GDr?cLW%57v6L*LSdaRrr@ zvL`cOCv|vuceU6?>YolJfy3YXN443bCB&yCTKvCwrZA8CliXMOtX&$TbclL?EeAgz z9(EELx5ZKSv-TuqZvE%jm!80iRL>cJ^>~dOLJ>NR=Xr~j;!A&u+I1g|`Hu~zXsOJ5 zWCHuxl@L2SS(siy>ncms#&9h|T^UC62$?x`!ob8~=fN@jW=ddvz`;xQJ{^B~^bo!4 zPTkk>`BM#UvsTgE&%#%Bxl@N_w#HEQ>yn!X#*#AG!~!4r%S2J01XNx&if%ss{-!U? zrsPfxttK=7&^P<)isWO8i@#HEex0oVx79US-(s_ziQE_2Ep%= zr}OYvai$ekW~8B)TVI%2zX-Z5YqU$b@(JoJ&Rl%K>r|-uwNgwGEsw!3Lx4J>!GpvN z#66+wE^u;zzibcT&q-DC7CwCTL9qai;RzgSJW(ij8G zF-MC>qtEnfU6n=^73Mp({HY(^hKsxEu=j-0Y;9TpVIW1Mo?bQI?#`Lo9)mwp-5+NE zy|<-VIb&_A+`H?ToWHxds)+KtI5$z>%dr$ zfV1sY`#YtP#EMrp&~koUW%@Pw@TRKnkagA7@Q)gc@yo#zkE(+oOcDILm58DFvAB~V zeh3|&Ohn*PNBbO%$LPp9!qTsoqcN#9o&yHk_kL9+BuxO%Cw#`>o4jGUHCFxX-MjCc z7QYSaxGXAR-6jV6zxo@j?(6xLV18{X0?@-e^Pkm&T_Ed7CU!Oc8hT`hf$3$y>KFJ@CM z;+>1zo2h}vS*OTDy@z#&;jFE6F*x)+2Ny-%7IPWKu|2581*a){H!Dng7H2La~X0kcZIT$TG1FTsFueud*GM(~C zm?LFUrk>)H3EV+L*h45Rn?`S*^cA=8+QHCe52T!>``4acUZAaA)wIWl^m9beg{Aw_xELU$-E z^HH*k$YX6y;;GDO8G~e0`>-%#`EJ8^aTUtVg(G$ahGXLM4_lTa|EZi$%se4gl2eG%wNt6hO5Ac~J2HG1WKb#G+qTgC zl)rrF3nFoFl=@PlR=BvIMhP$~a zHeOjWh}ktLj(K^5#h;9g-38-}x4RT{#oX-dvRzD<+9_Y~2!_o*IQkQFl8C{%1@yt} zaMp2q+yS!HPI z%=OO91wGK)Di-EC#<7#Fnwgpgz06GFEHWain;wu6g=}R^F&k+(iDZ(<4_T~m&J9(T z(B_s?=O7F1zH2x*6t(?I*;?)yV1}M0HpCw-KR=<`bP=~x!mT!|ca>78LmfiguUN$( zycDAkLxq~&Bi1!a_3f}#MK5yFc^XH5Z`)+zU=6ul#&Q>^RD_mp4V6e;;WLLxc_u|- zl?3&$9vdO7P0Kb*uzl{HziUR4b8Hex8%77wg^8@XMTfxhsAz=Kndh!7IKG{;j@d_m zBAF{R_lu!&_AcRM@Sra3T2iGvv|LP?-R&94_0Z$``KfTaIRY5r^|%pRp%T%PbQ!tn z`yNf-e^EH$$~k)dGIU4hBSsBRhC<87bD~;<->n?bDw+AY_(W5z z;-gWV8bg?DP2i84w6mmP^yf!L?c8g5Z@= zw^tZ)?mIoPtx`#*OXmHuA@%;Ij_sheI)TiC?;!TqL4NX`XSZq#;%2|w$`;&TOlr30 zqBygkoYc)3A7(xl`{ zy(RVc$E&#<=5J}14-YT*ynQ{uB8qY-+pob^8I*%jj4!RmrlY1s9`j^i@B-C5lF9F? z|B8c-?xk{8*+cf^y=Hu1(^U!$Q$ve?Ks)}BXs~r@DcW)QLoZjNk*o!4p?-+Cjm=A5 zfY;o11Gj6(9J2CHS)XVA`IS>mYh1w#YW7?Ccqs?SuQFMq`MaL__@S3tJzVY^hTJ|L zKHQ7iHS_!*`5yI6V%6$QU`L*|8bV!vmFSS}$lDN3| zx528U+JO61NeFnXd0P>)gHxF#KaDw9N9(zTSF0>%2VLuT!-6#6TmI4~xH)Gf$-_Xj zfO6-hoSnwD)g$hps8@IbFC})Pq)T6qnBA=)ra#Yo)~*8*Xn0SO^r zi<-x(@aSD!d5^6{YK?Sr+sE(7H|nS3=O?D#^9aqNqWb=s#{8G28@9fI&B0AmNsj9C z6mnkcLQyMCw`N$mmg9o*J@OHjR5l6B_=E)G8yeF4WC@>&mxrxR!Hy0cGRYVx=QNwL zj89B}>AHJ);o_0$6O3a(%jZRMN_CFRKTX+nbv*~{)MHOqHdv7TBt!zqA$BuH#j9NZ zjpgSn=BA`DkSN(k?ndWHEBjj5#xw6z&V7d+kNa zxJ#wh^Ue3Y1tZz1Bu~4*f`UNiAH7NI5!H#WdIQuQGTV|G)K?YNG zWBH9)9ktau^iqj_p)Bf83W|ULT84<42tF5)@=+gm3we-C0s^#q?wWQ|Y53LQ%v2h5 zeronQXlA-{ymF=73+i-cqNlrzSp6901-;@(&lXF5*t948+@LSOS$I zIR3!fmY&(+chSN~`Uk3@qM^s;=e0WJYkA8O<5v=E=`RQhY-V0@bkeQw1%}$83Jtw# zN)1U)4^k|}E>dsIM$FBbSTq7STz9d>CzANyTs4GW>Q`3O;{0ShAM^1&E%UUP%#ZZ+ zJ(&{L_=oJEB7!GB6=&%R!5p>ct@n!UbChXBhM?il=Y~-nfowuIspcy&WI^ON?UL*0 zhB5Rs(VNnvCO|Y8LRl5D^dU2wA;wS8Oj=dev%dN^C`lS(`cw@=ncQ@y@^s!9T{Qr(k`!0%DhAt-%ct&Bbo648pNq41KcSY0-BZr1^&NZH6%9| z`>9fX%wAR5KeKm@ymjS7SwIDthE~0vX|{s+^n{%Uo0w&# z=VJmT6`Mv}TZ{I#+udjGF9iI4tmshNcz^a2w{%v(( zSY^=*werOXi9JefodmPIC|l2rF~gb+)*Z{vV=RCpc7WX?-TbwxN{Q8P-JI0jhi|Xu zdFWia%nRzzK`HCrorw511|L)n^b5VAgBK#&{khXj=6bNlJ#WqB|7rnn`=%W{0x<%4fB)FVC^Vj@;N_O%Du6A0S&hh2QINxQf{oGo$K+#Y z$|;$LI{THbIcL!WH5=n))J%rML721OxPQha=HZi|VtEXc!})wFXl`^}$eNou4-jP% z0W}xp7o?qDG`oEc9-W~%u;ibz95kD}qPsd;k^{$(x)cgOP((!|E(zztkar~jOvbI; z(W!%3)W{|jvB@=%Q#f^F=uB)+F!A-!)Y^DzrRK}Mh|URYnZcq}@}2p?TcA*Az;T(B z0!>!5f(O%VO^_1G4HtWSioft$PZ9^o`hD9rTDLftUc#Nsj+c&BW$~yW$|rI8xJ|d& zWpXaOuf?W@i7PMWUiT1CEV`AkeDj>nE1Z&sXp#koe|~p5Q+jFH109&()59spOD=gv z=tVRXA_cbT`@~6~9ie%xJw1xV`X71^Tf0ZKMi3vTK2Cmq{?Iz@y`#)Y^~dKj)KnbL zH@Q-fYXF_%bnsm}rKt;K^fmOKkFq;p{V`@5fY?#a3rh5y_%hPr`||n|&eZ&_8*1}w z;BJwPn3{TS?E~kvi)EWDFRP5ZocVXB&!J*A){#iDMc(eM)si1xyXg*R&XIpxHl zp)i#SFUo~QH(fo`jL+ejBwNVA?-UuMR(6z90)$*ljFZ_R&R9RFy`4$)WdzRZ(Uz~d z#pbtvPWVo^WNNl*Q@(rf0`zojwrHD=OYNb0?utJw#=u>@u5KlkAa80@3f(S&UMuAx zNcM#>J>2qlm3UBfnL^k(+Vre$sy_ZOh?7^UQcwX-lA9g57dslymK(lHh%Xr@c4CAR zL||27;!e=_L+WxvzPsfONIFSEkTWdH?;Ky zvT)|*2Ekh_ENb3-Ijkb*?lkQB-$qb&Q~6xXMbs0Gz4XIBWa5;PwQ)&EbY%VvO_Ul^ z5h8X`#y5_RU60QfsR1?@=vq)egq-b5eH@zdkur>e>b|l4&@+VWAm~Hu|IF0YN)~=3SzZ^L^5p{qA0Z3wa!Q zu>DX|QdFa@deSwxS$DW6_pVmtmt_&Uw%t!Sp2rQNr;-d^isi2;3@0dI*Tsd-+3QnCowZ) zvvb}xW&O<#Mc&$qJ_m-+g{32$Z^~qwt~10+KhB@q*En2PHvUcO zLB&1?oj3aR|E(EqP5%<7=;`GD_33|xrT^cjoc|3r+2aVX9*0K8$Nz*5*FosXv9X`e zRG~`{Sn;B>M)N_YOm?C#y|=>?H%``0nSQR-gpD7peKOeck(Xy)Lpk0$JnR4uy-~%< z>JtbEVjE9)ug=^;5kU#*4?N4rjjG3tsvh4@fNtw%cUk=sa1Qno0>?J!+{Y*`%xub(JY1)e(teu@%UtIGD7YRdi z7Vf#}9)gqYwN8ToaYK z!+ghqEbbn?7J6UZCk+b`xaS`};+NSkXNu5VGu@F14}^W1Q4Yxp96<@!JPK53C{riP zErx3{Zh!IsNU5$^vz(}phg^5xiY3!wv)AguWgg>56?2UKg1&;l4i-+13sbs9IZ_b0!Nk(Avf5*w~bAJVNP*uNtP(8CDPuC|Qs=KE^yQO3EBXFVWKYd`Hx%qp|J;nAo94+~NVtGY8DP7o_C-2GlgU;m}Q#Jk0zkq@oYWat0((@=2I zHq6>6&&;3H7t#d25{Mc94nmI9kd2~yeCX2aDZ<(LcT3ygZz4Z4-!W9D3yKi>%r++;s$t3%a=h^4nQ)O0k{c8C1zHeps(x~KQFtX zY%Ry@>X-j0Xx%YB_*0*wKZsfH`Di`puNm?Ur^XuD_J}jfoJZ*^o&rzITjrjyhS}+l zbHDNb2A1Q^IENg3xdZq;+_&V!$|=XS)5a}Y+ztS-*b8EExc%>beKyn7JcofPbhNO~ zt%YbkrNQ&lqOE0u-2c0u*HgwX->@pkWj)nCS1_%cv%edQav>uj$pYDP%|n=PNB*8O zbiX1Q;CbOV2?s{ohHR0zXKPJi;{V>_&h)tk=1qSGj0j>0r-$#^pYf4!7R&Jq^eyNW zgNOZiZuR)A>OOk#K=oXP0euB-#jhS9$h-1PkW-Q4%jfUU#Xvl6s=AyEbn#}rbr3q> z3IMyuy}i^Ngx4#%f*Z(F0>q|}Ak?~gOFkeX}SN9La zJe9N45{c1nc4;JRK15#K?|2T`oCEFiI%kS8F^Q@W0;Ry>SR@R})S{ebV~B@L6~ZC; z4egMcQ)ole*n(bnJ&twL^s>_dP=KP}KEF!GMWcrR)f+V*@UH+W7K!>e6XYCg;8d6< z)bCVp_CO+70`Sz0Q#>#G()P7J#l$>+igZvt(L6?usKHX)vD@JKVg8v?x@5axK*+Ua zC_f~GM|}N?EiS%1a;6FQDypxrQJOY1>*1q+#wUGcIOU{(Ge|f*khAITF|~;FGdr19 z$+9=I{1$R6O1qL%nZiC~kRAr}e~eyD!eaWrrb!R_XWc_ldt$q1hy?RLyX6JHvoSw` zp2B1!`>t~R9PqKozm6zuFLF8|zRvNH`TV&p_qFEAFowCavzq%#rJtLLAn`N%3Cb_z zqce!+ELw9W1?1HtJz=h~c2=WBmsG()Bo7j(Oe`ke;p15Ooo)=|H8nSjXO1y2Wy5BU zo)(NRUI#iLHVsr0vu{JrHxcy5WTKl@ID5mm8!ilQv%TWdwTsUEFYC7JEu9hGkjxrQ2R+PgIVjfDe!jf?`Dww}Vu_~g{RjDOyY={SWlirr) zJo?B2^xn47B@|cR-J3M{+UU5>rPE~uwis?A!JIRo+6pC70%F>r7wE`P6&3g5O4a88)ZrUv*{CFTQI~DSxDF0tT?{h@bz1C6dv->o0pFK(` zVB}jQZ*iBPVrF4kf@YVN8h{13fKI^`687jUanHyVH7W1 zkjz7)#ERs4opKaC_fQ9aT&5z<&Sz-eFi^Sn!_;Z?DVBiw_1?Sv8@+ot8wGoIzg;6K zFZdgi+d-)sb(^En#xiZpcWr!a5w ze9jrxv0}AV&P)VA-LbvSa&bxDNj(-3M}D+(`oy$KB%EM!-Y|$Et|3P=J~GuHJ5hC~PXI!%Sw1w0ojjan|L*>IB6Q!H@o={4XN33u zMA!7x$7QZx;m`ogISBNTp|987ihSFG{c1*GFnYm);|7h?HBxrVF2X4cC~WmSR+~;= zcAcKSWJXLR(7$YPM}pQz8S}5}uG@n{Lv&A3ag5JxQHa3v7&TQk+sl3a5ppm*W z+yE~icX5Tdwq?#t_0OY;KvI_0RcC^#?<>{WuZVN9m zn8q*_QPkIo5@9wUnK=#}h+F|LdhM>(>1!;D0BYo9C~9U4+&-YuVO+lqh&VHysq8%H z04HYEJf_&w19!BjR5pR}_x=YcW-2y}mt-^HDa%_5(zY*3EV)>)enrhM-xPuIh?u9q zDomA;lGE0Ss%)6gi->bYGbcaGOziPzdC9(p!XXs$@!S!qtRF$Ps=E*x-fEgfXeJsBE4ky8f@V9PpKv5#}(47 zv+oYa3Esi=wGC}R`e?LHf9i?SZBCEhTKxNP6emMPx8K75ogmK%x?)&Z4Fshn8B+g9 zgsHB|WvOnn-^xWmZ}>7u6M#w$wodFp7JYrV&1(t*0mFoN`1KTr*h(Mq;W_s?M}M>= zBfHo*9g3>EOl;<44i>K6l#a0eKg^ZWIMdTQIpeJi#+4@}Ug?(drb_#G5EcVwPtnDX zrAPL${Ix4~eswS3SzaK<{su!)zgT_xufzRcMDo9En<0S`W9O_}r4a3R!s)bMQz@s; z^ytR$_E|RPpn(@b4k`K)60P<(`P|hWRaA=L_|LHV_wE1tAHuhv@(a~VpBYIi1qd-2 zGx4IEqxw*%%Uf?Al>HB?58mT+7!bqX9+z(QEU$KXE_1#&7YzP;2Z?_VhLUimJkBvi@%THF-|&}<_51)yH^>pw&Ae=yhoe#8HKI*8kLZKmBdqHa9re|&B_DWzZS zL`Y3tk)zW`j8-xNO!ABiN20?XM=!{ckBHE z%hBpglKE?LzkOz&4P>VizAx^~L)31YdH>P?4OgN4Tx7*#aEIv zjlmX!Y8SC#JU8DL@2dZ~v1=T%6lJyvHpBgyEoz}qlj)gnF(|N#BodBYzSGLMep0e0yPzzInP;( z^CDW}7eH5Wa#KsAxHOzb%$0;XP2yE4sR|IW7=ONyhPinnROB&@k1R@Ecno&)3`13g z`5eeCALW#U@7enszD)1{)aMzaGwY41;x8f=zV5T=aew3Duw}eT0U)iv*;@~3X&u3A zdrKx*CSckh(}sxh-7iu0>V5hS%8p)sbH}NDc9I*_$Bowz_SVh2^WRkXPd1|#kg?5( zOf27>&!$^G7CAgKcbJo&mXiAvyI(LuF<$G2*Cy(o0lc|74n5?6HI3Y{VRPUW5?MZU zB>_3Ps$qO=Y+?2w=I$vNj`&jJW==tOlCC6b)O(RD^5*T^mr0HFNsM&mn;A?;hIDoH z`G^#~N<_ote)GB6n*xY&Lu&A1G<2L*uNyYD^>BfvYAuAyPP3K|ahUC** zSnlY+!|z_6`o2I_RlNs-JHn&2a`DF`vX*#WG2yBGZH~bI2RT%Iz_xDrAl6=svD9Rl~OuNk5AatBA zZ(n=nc-ZPpOBdAYEe1L`muqsPhLl~0s(#K~{l%K-(Uo9u%6jDYqC~l|yKJGJ4)*WX zy|z3<&7;+F&-ZmB@(QNv3b<;c4zIGMB%i{>C8UoBLPy5Hg!8*B%~rE9?w5}_Q{G34 zrL_;Hol0YdY9Fu0A5;H*6zR*Cz6qL|7;A_c>5-_0q0E%yY$=R2Cj6h7R~^2?z
                  6=xg{_^nrfoKcMUX4OT^;XUYG9uK!bSe04IjFtiG#Xc-x~_2whKDN4#(
                  z*o3o7e0=l3-@g4Q0v!gApn2hINGc>mcMJ4{EkE(c?^DHmNtdGhlP@QR@XdR*v&(8&
                  zC93|$=E1i(y>CU^J_{R>6_9lfY2zV6rsDnA_ulkDSzKHI_EJ^5Ma2im~i1VfsOBc0{8t`~2{FfLwB6=|{w
                  z8J&yH3@)31hZ#{}HR_S{ka7o9S7W>G5wyga5T?)QE`Sj9O%enLpav?XH55U0M(9o7YNkxbT)EK|!g_K1p#K-X
                  z%sRo`##HV-$S+4MuTxB@JR>O@_Se(|AV+xn(rTP?=}(pqC?^uf!>;p#dhndqX@j>4
                  zs#+iVPC5Y-ytrZf)oqS7%+qD4V|R`sABU_&pAPH_SvMcajUbvjKFNp2IwQH8K{3{a
                  z3k#yO79*+u0JuA9uG~d9SJjYN>m%nBmW0S`1jI+dw3k%lq*eZr^XoHqsi@Ai
                  z<`kFN4(oH|rppa_c3nV3wxQzHi)X<_^C`QCcA>7c781&{=KEO_M
                  z@q2!8WK&SP^0~4tAq52&H99t1QfbgRVYxvQS9*TKK%8b_OH2BS)si8ta`{i{g;f;*
                  zh`?y>u>9ebuFFi$0AWfN<_19Hu}DcN>W0$qi(Jk_Mr?|31_!?ahxTL5Yag;<^AweN
                  z{08DMFrS*txOJBQ!y_sm;~>7RNI~Q-tQ$tdvxLSNKc4~9$Z;0tAee@kjkWx)8uXaY
                  zN5B5@KZi3>5Bnw`meL3`))1eb#xl2?jm?w-jJ=MW2{Y)jZ>)(ir5xvv8ouiEeh`!K
                  zyq}(X=>W93ETA5oNK
                  zbQeukSLFh+JgB{Y#Pw)$>*Jo>fEgKjac+s3>^jQ>6|b(t`e{03z99&@P~6xjFSODC_5yWi|e>bLvEEu+)0+W2eFsY9dR@i5_#WD}+}fCui67
                  zajRW$duz|IVILFdPywBJ`H?6gB1sI+^Y!cVNkfj-3thbg+LtepEplo86$h;EL(o%q
                  z)3iuLJ(A&|vb4PE;`=O(9B&P2Ois{jeWLLX7C5~a5)AlE7@&-3?ML32p-Oq@((mGFW+puha74}3A3L9A
                  zoc&~*E`&-2G7$ARAkJ;uIwRhyCv9yJQXUre=VR0MEuGD
                  zLfRUxLLW@n4hnm67mlpfSI*)t&;URf$|cC(&EZGL06DIWsLG+<{Pk>VU0
                  z+pP6=n*Wp_}#hko7&HCNb_>K4P(_?N{byy#FhB4l=NHTFxUFuv7AS$-+<
                  z#PG*1j}t2lgJa6c<~9r-NMObFlrT}CX$>%L4k)KU8i10iy<@cCJ~?>^@7yFd;N9`I
                  zjDjfs!UQkd)Dz4%T(v0yd>mxon45bvm#5{@zConH>9wb0NBQr+ldRX)&X`ASVUtfY
                  zvvKfz^$XC|S39B?1e&s-6>gKIK}d*B6QYh6`Ig;Cdv0n%fBaBCLH{y1iev?Fi#-5J
                  z8Z?ZL*2iQH{0>N?u0*+@KliLIa@^w5EP73S@<=NQK#ysT0T?qceo(xsLD6|e{a(&=
                  zbK*J>0^JIEUlWo)=Esk8&ln<*v(}_kI$+!xQ~`cgk3Ak*MYe(Yy}K!Cofc3N2uU8h
                  z>hLp>sgRYGM=L$nVXL@_X`vAhdGS`s|2xamZd9+;deOM<@;Bi(AKxFub)g1~Uue0_
                  z+E)X;spg@UM}Q%52vFXuHMSz{0Rm_Ti9gQlK8`6qEY(>EQNJmsW7X;t>c17zBiYPcPe(O{O+(Vu<5o@
                  z188}%K!g!ped>fAnEI18l1-0Acil*-YV5@qE({|=L&D|6fsW`TMHqJ~{eufHVoQZG
                  zoPcEVX9I$BJ{{=^mf+Ap$+cBoh#50vjUBzmgSOo%D~)!#(5;JqG_S5iRD0D`J80Nu4P{T%pi
                  zG+2P0E`Ie@*1&0NB0R1IT^0xKqOeuUuO|mHOm6Y<>*Suvl!^EJ*vt;YI0N$Grm8$-4WV2jl-^ErLxVEtEZak+U?375Z9A6iBQ0+{B-rKFxY}ow2;}rvsO3
                  z?N@t2q;}n4?Hz&gvoVgoZ;c$LT`9M=eD9?7)S9WsC6stSY!LOEHYpLYeV^BWRi%&7!Mc)$E=(MWl)oK$qZEI~SuR?Sw3-5e
                  zfkxwM-&CQDn-S_EZxIvGKBqk_N&%@9Oz{gg)5&hGv5-fA!*l~Pkb!6mqX6f{PDZyw#KdZ
                  z3xXmJV;DZz?_I|1ao+I8#|GuNR*+m8yM^-9OXK5!*8L&Kpvu6|rfoj1+7Dmc<(1D(
                  zJppAg*Jbc+t@XZbj_xGptN>}?{G@};S-r_Cn&;|eHjUKm7x{~OACeZ0tlF|;9Cjq*
                  znZ0xT`}71IcFt|_C{%Cl>XJ%Vj#t1QkpZW*_H=ynU^C8~Zd&(Pzc`EbY+F#DpXIg_
                  z8+ofVrTR8~Aja&aY*Qi2=bcd;iU+@dAG^7G=*?Rh!>lRl$`45Hogo~oC4fGGtk&-&
                  zi1kkJ$l_rfYd`n10AXogU>9PXWtQ~9G#ojtu>n=~rnb
                  zighCecdu$*aQfjOT&?|1qgQXaR~lKKQ01!Zk5`T$|G6q8Sz!XtHm}(#ttWW};XaHX
                  zd^HaDmP*O<0XppK;+=HZE)udOcYR=B>!TZVCp;zMvNI=En2TN%?k|Sy$vJ!e{Ez>Q
                  z^A@t3Tg%wYHi%y|Q~0pVMM3Eeaub2v&xHN-9S~1&+tvQlNZC@(PsV+d8R_v$-0P@JMo)D7wOSx--3cGE&4o|z6V;`$vv>lG;DQfAKab>tT*m(
                  zUmcB{-=Q-)ky@#mUt~wKXt`(O6wf{-=;-cNj_km-UC8LmFT99Lq=4iN2yfa<3nEOc
                  zB4c85_YQM|Am;@?6F>>Z$`j9R~$4IeiO>!?(_iK@K&se6h>
                  zq&%qYTFCo3OKz@mpc}u;UjTRtqNg@3a~E+e_VpdXmY`FoWwh&FWJ`URrm;_EHIoR9
                  zrjCZt7XvSUPHC3c4JbPuB$ZI>;=X04L0q`hOMR@|7m;Rwu^+=h{uSQd6h_B$kJI#M
                  zVQn-T)#cpwbm7SAj}a#iR-o0BO-z$&(+QLGSO1qu$ge1_Fsj@@_y
                  zf^fg=Y%21RKKNA4?^1@BFF#0XKx_RZ+m7!KNN{K_K$N`9&hMmw;dVi7N)B^Zz^r_L
                  zlwEp5bQ?p4IA>Z9)@0BL6bEu&$<{SVIo7`HHtY-cwlH&oUNh1wU@=YHOIzRUAKs9x{H*
                  zUQJ68qzQ+`=u;h{=98_o|6p=j
                  zldvFS@zj$NJOd%!av9@tppbpcq02l_;Z_u|$HU1#ynDs+aF_7syJm^F66pVe*b+$;
                  zD=mlri(wb+5!C-b?7d}F)NQyoiYTBUprRs32olm#A}s>aA<{8}(%nNd7>Lq2bST|Q
                  zHz?BG-6b&$3^@#O?s=ZQ&)IvQb9&%Mr!0vw}9nfAwoE$1!C1ypKB#tLo>))7}tocWU0#r(m8z=9*Tq
                  zEyS>q=Igf>@}=ED_45Fp1?NwR{q6KII%)qSH*8|FViD^k&tci0>a8t_1h)4cY+fT*
                  zYgR>4IgW*Oy`{X)OW}b~tw??Swr2BFlQ4Si;>PdUIm6lAEXoPGB+RHZ7Xal~!leJb
                  zZuSfIrBDtv*Z{<&{5U+MqKcpFPk;}i{Htq@IZc*08uQkD2l&)#_zE}DA2SoI`-yhQ
                  z+ev7clsvW)orG|FoK$Rt$(Xji_bf`>0lxSxkT~%O*~sZ_9vgc}umlDa1c`rnM
                  z=$YL;am`_9Xumn4xE*D3IsKdDmFM0@TV2qhi(f|jT_xEvjb!%fA$LqHlIEd96FMj@{`9toQ#&B@_S*#>E?c!o)VY&
                  z+C8?G1J|++b`2k^hH%4{K)yvYiCSTgcs#5-k&v<=P{F-u{?db(2v#n~jEo=dh0g{d
                  zo@iMmSno4-Gm4?t2ghwYFNe}apFDYG^mLW+NsFtU@=dJ);;Pzts;IWVQFmC|t9EFf
                  z?AwntOBdA@-{&d%{rj30drhvZ7~_)Xm-TNmTtv<@Z_K3wx-xPsS2_2~H4tAFQzGI<
                  zvgyVYEu+e~GcWfKlZqE(*8);K!WM5^y)Qfnm4FY*#y;fHuQ>SAzkhZ(pLE`>=Q|ZL
                  zGZi^yW2A~jH{st(>xF1+j>6ih3ICs3}=WDG1QMH|1~Ut!rgPk$CXj_FoOZcmK56b?7Um8S>!I2g=V
                  zV~-wcg2Iw2J;zh>!2s+AW#_v6lWH};NWG#yOn=}63>L9Y-uB_^2VHvkQ8;ON>iyfO
                  zB800VXp0jjIoV(__=e@2IwpQS)Ozqi5
                  z?v#;^G(LEjT*W4w13VRNaW;hvOhD7!HlC)mZpYJKRqr&pZM;^#dv+V2YPdXuz0@xY
                  z9T?Dc+t;u+v2aU`;dUqGskf@hvbUZs(1xw5zW8T3xj8e;udi?YY@kb>!hb|9u<`O)
                  zBh{?7q&78+A~`R^H>Z5W#E*jt&5k0XCu;jjk6fAN!q!UYzR0`5ReJXZ^@f8jUpeJw)HPPIfJ^
                  ztXBO@4z*V2k+dgjEWS*>i-95F6;pz_j!bV!2G&^W}avi5i5D{5CIZxq!$i4SRdZMTZjIUwHjq{zSyVx&4C$>ZquaYe+Sb{sYiU!3P<8Ls>3Kwy`Jcmjuyo3hA~?
                  zx!_`Rv#5YvBFBKO
                  z+m`0Fk3=z2B|EKU$?)FIVlXF5dDfSoiSn;F_5*)WYm}#wiFe+U0m`;$4dbZZ7HO|f
                  z`gOb!Tra@s$Ps!WQt+Pr+O6AW*`Pl_YXK>0oOAKkaj5(Kf%(&&I*NS9
                  z^TqVilZ9p9eD}w+8$nv!mRC{kq&D)zh-lU^jeg6HAc4|+opxz)o0mfHnm5mPTf{q(
                  z#)*;o-dR}D8er}hqM!0vO@FVmqDM_S)!oFRvw$
                  zjEorhp4fqpXECF(LP1BaBuGn3J5PK5ch71QQBhTOwehqx|1?aj?8Q`zWmPS|v&GFCWod0MZ>m~6%>k3e(E>o&Sl$UwNj}R(6
                  zehSR1SP{fn^bUA$3Z3^dO?TP)_SKryw
                  z#0Ogp|33vZfb~ixifZ~tJbFTu;7ozbQT%5@;(v5p|G(rXoZqjkXd2eskIfiXR!~SX
                  z-+bevX{71O`0}L*hKT8V4)?B?z#R(AwhGQa>u<)9X2Hb=`JCy>+RFc$u?P;68WgvJW)WT!MI&3iaYFh=o%;rr^UVmm@ylql
                  zDfa~gY*59+)MM{m7})GH2`=#6V!M3a=q}HuKS+YU0?ur_#MVthzxXQDBHQgq-fsLkR585w(!CwxPJ6+K-*xoh`
                  z*qP!LHJ`cd#{D%|?G>ifb8iqg(qy=g#H5{GI*x1(*ZYiXPXMg^+bcnxv!~|*VV3Pq
                  z{C4_jKDt*}ta2W>*++f&RrY0)IcW
                  zx5;nz40L-C0IS`)DO`P>Pw(Ph0e690BB|p+-&B?1
                  zDFOr326J?7_zu{2fb`HgPtD&b7$apa;nY9TAIA;9qJb&W@uv&t;kNqm(?a
                  zx>hy_@fUCxS!
                  zy`|hIvzc1^cpS!aZ}ClrS+<*=947TemS*{yIbLcw9~oAQ4Zn>{SYKafW7Bx9@Pf=?
                  z-?8e*9nT>B0MKbwcogw0-e#H_$n;tZ_=#fuzMCefUs+h1f!Jn_OnV%q`rBfAD
                  zcka`1mB2WkNJ!X^5&S+(>b$kZxYQC}rH~UxEMLVPVAf+HYI+v_6FF8Io0Bz5qGZ}z
                  z%g=(j?IZD01ZHHvW+snf=<8!+a$!*`YqHX)>zpiGL^ttHJM_29pu%6
                  zbNLjk(pmimHq0(-F=_{Z|B3ov7B)8*uz15ny__M>N`4C8U@vN!sop4D>DzdW3ZG#I
                  z!!Vz+z7%BF61KYN!KdOaEIdO+BZn}n_(OHxxA{w)K5nmlDyqm)EVHvKiY_$ol<+E<
                  zF+yIRH9br$j7{W6RTs{CXe-9bJEWCVpt+{GqS6}k7zFdp*63-fl>);JpHVF@Ydbz)
                  zX;2v|GuTGeN*TfPpzYA33zyd#UJ$`aXs@*poINlBl{6?l#%;wyN7r}c7V6Vfe5WaF(CC4PBu^t6F*1>iK&%IPD8>IgQniah}G<9}>CwJxX^$_y#DrSq11WHT0|QTkf|<7{iTuRk3nsFbLm_IPh#
                  zH#{$pNt#d%KtNYcp7IP(?WY3AU1be
                  zj^@4x3@a9W{wcT}%W?WOE-tvDar@}zY4NPk)*1)mnBSfGz+(
                  zw%QjHHepI_H|ehJ;O#P@kDLUn?4sY1OlfV7*gJEvKWizsaQM>cTG!S&;hh!Iu-f2$
                  zDI5J&%~sql70SdgR*8CM8QuilVWDtvS(z{!{#IyF_4^vKSzNz#JBH@DYp1DKAUXGA
                  zr2hJ|;lpBss<{HDq^7DGn{4;xayp3}6rcS-vECw#hdXj%!I2HZ+3@KzBzSyKa0ew4
                  z8=lm_$#PUtATw(Thaqbo!TX*wF2g5m($bjUC=M@5FnAvY$TwZtTA6*Ww|THJgM9ou
                  zQ*qU6I(_!O^44tKr)1%W_Fec71=F^kiZ|WUoSx{q?og>Wjyj!}K?POX#VR$@fq39e
                  zEAvZK=V96jit#<}<_uarGaZ{T0bA8OKW`NdK0T@KKuL~8Dc(C<;>ww1XoyXUXCW=?
                  zbRYZrO0Mt$U;2SK98t~c?snl*eUnyKagM59%38CRbG7>vO-?qG6$kC$acFuiHs{*l
                  zc$c!-Fv8vi+wh-RfMfw$Rh5OERrZQ}3xrgQ&{Ww;95<9d
                  zMJ4*N3bp&2qo@-fp{);pocz8nZDhT;5E$C(6&xy3`gZxpJq)+La5hwkulEz8z2*hc
                  zk!~-Csnw7RS*)xEgh-eK4W!RiwHI+LG+d)7=R0_83x|Jz3OkG6PbujIfOO%8uQ&eg02A0@#kfg*ZB4#Lh
                  zo`}?j(ixE?O&w$&coh9O@GuFzi8U^(N5Av4n(FvT>NlHs>6IqPw*)s>4OmC(rR8KM
                  z6boKVY_q+8hcHQIe+*{Vkl+MXAze|9O
                  zAiyJ+Hdc?P`T%R&&LCSZ_}EN~cdOmsk9oV_h2TU!I0xT!AK^mt0FOL0tfCk$rYIMy
                  z*TDVdD*C~9@I@~OL}Ac~GmM7IBRsMC=Gktoe4Sq9Y3T(rJo#dJKa3n1O}%BC1reS<
                  zI4qsin{0Z-dugGL9=1c2b+rIqGn`Totoso@f_^0-Gz}{E`>YuW_FW37@m_!CaOJ;^ITv26Rg;4qy$(g7HzAd5DSdmbR*?kLeQ`vv63Ec{IIO>Qv
                  z7Mg?}Km4Ie9Gl3fR%P(Wg_1@H>$Wh!-1r=PJv=;eon6fJ$x3luLehDr@sjq59QbZi
                  zk@@LfblCfo5(@GT49RUi^BJHahiO#>*j`Wi!w2mc)R3hHO&{-sco|WDP0oacoZ5_ZZ#8S
                  z2w#sQkxxPh(`IjYxqfNCx#0ly;&bkSc}^2|)wyw-LUL4=?fFiuFc1Si$YMsXPIR&4hHXt%
                  zJQ#j`n6TI9xt%r9{PDy>`%*c=Vu(3*;gfQ+BX7(wzv24}e!fbxzd|B9J
                  z4ssek81f}LW+ZR6Cn7?mv@Zp{e;DCx#@Ds5n4}!2mt`hhshal%Fdsa;=BxLec{R*?
                  z#aZZYa&0{|Qo=z+(^rX9BTbnJ+J!TkfoA0`e|M#_%+_~E&{%q+)w01@=N-aM;ltO1FQ;rt4fL)t?PDE{P+LkW5Gd_KyJTsdTJ=*zqN9*yb&}ycG>Ru
                  zXg3}nKJIwSGSHv3n3mBI`~=fgv33QoT)H_UpqbXc_YOmA0BgSn*%jn1@UQ>(>;I=S
                  z5H8G0cE$gp^^6CeS`_n`302^g=IG`CX}m|O3li}y{;bM3-;3gbM_ny*Q;S3Kko}(U
                  zEssJjqo4YS62tEII9RZ7gKVZK-BfcRd6Qs<;FjdV6`Ka^
                  z%Rj@zdLVnif;!+}vl^~Wz<>}#*TC(h)k7T;rTrY|iE+E6xr#SZR+C~D-?6*r{g?5+
                  z&wWKShq4bNj_h0vw%D1txqo^_m$ac`JBP_9d#
                  zJiAKf#|8S+%Cb``K}T8A;2Xb7UYMWhiW_EoYnBgL(sJj4hgPZCKEgVdUvIkqv5|L?
                  zqANU*>V@=&cO8tI8Tk4vmsHAMb4IwLo4u`PM?&3!D4)2SR!kLO93ujJb0hsX9;
                  z6fI+Xo@N%B_V3tn8#bQ6s+2FWU-Z&cmJ$1=J#zPe#xb(y_Wmpnv-Hmu78A1>Bk26Y
                  zMr3xJJr>nF->ppY1Al^e)o1mkd}e3cF|ujw8WMgE
                  z(Y%y!cC(*KE>m_GZ?Y7b{7F~J5A$4VzbGv2dThAlEQ3v)Km!fNBDbA+{S`^hbPm70tKmNXKm!TW!dUV_>Xtl{O*&rkXv$JNF
                  zm@7WA8_z{d`oN}VudOEkR#1%Xc$B4NzMym!FZ{VRxP2qR>d)f@1t
                  zq$u9Po=h8UGljy(#qEo^uYHm(EQa+OwThdXdmpC@_3D{+Lrl)A#~R5W)V^*!gN1L;
                  z_)4+(#7Q?|t)Snx$ZytKTW?Z)|K+Wod}u=mp9nPQ*)Ovw+E9JhWn~{XsMDk-@z?Rn
                  zEraD98wu}?C@RdIf3MtWeS;ymN-|6P4MxnIVqLCFt}ZV17>_-T%uKY?&A%0u4N%n5
                  z(6?m`%+Y>+6l1`!T@`8>$r4w1$h0!FYI7%IcJ`w7_4zjXu$uj7JPlrE0Qp<4d}MFu
                  zJ8c*8Kwq1BtQ)aV$pZ;lP{PAgd!T5BCl<-By~|H4-tzl9MKZM7Sby)pF*1uowLPiI
                  zV}mVFHSHNV)iFCp#0uDFo>4P?m{KY;Y@e~PH}}ljTF8?^Lt2k%+gf|Q&OuPC#KRZLiI?Gvh^rvtj|
                  zp&{GGP)+xn&{EcuMgUo!k{3emK?cq@&N_
                  zP!Ko1NS`Fo!wn59Vtn{4C65XyIj^_C77dM&&5u?u=zJu8hm=N1
                  zq%X8nR6wASg=&HPTW3L5VZYc
                  zxy9Rd)IitO|FAjQ9|%FLsf0Z@NJA|%OtQ9~uagH6_P9S3*xC&}=KHkV&`6KB`!^jh
                  z=>G&6|B%rC20Q+j@9fgUw*TDw8dU2C9rrww$(4Bpfg59KZaW#Nrq-Um2v^e8EvFHN
                  z$%0m}WhHz(wWpMz9?As}u0nn4MgZ@nUiZv@ZhTxC
                  z;_=KOO3GUUWV_7(ZAKrjcrC>a$-+>ikv9OXZa1mwo@sih&_^?;P`n)750me=56FVg
                  zPb`;Nt3+hVuQiN#xt%dbm*jXhdfBC)S=)))FF>j)n@r```{F3@06JL6ZZfA6oZJvM
                  z&{s+vu{TdNPcP8wWTJe@i0mdH{M=bJkBX(O>r*OYxq{Zu`EcY}2h@}Prb)Zf_Iq9C
                  zF+$#y6b>a5Jr#%opNm6oVc1!aY44I*X-{HG7zbd@66elwF+9<)0UuX#g{BmK5r6vE
                  zT(4__2c}qLt+#UANn|!WW}K%ZT5#amVEN&F1EO5{EqJGq0_^Z_ohbiFh8Mp
                  z-Ls-y(Q~!JtkeT$!Vgt?D^Ygj3oIOkxG|$zH#Vl#LSMrg5qYqDKaLzP?*4JxAXB9~
                  z`Hq*MVzR@v9U?NLC|M;{#c%jlt6Qie`D(Xs110WG`w+Licb_s<)
                  zv29%I3I5&#)67M9;+i6^hSU$Y4WwYLiSUGV+SFcFi1t&Fi*{eK>4A_-juNh_4~s9@
                  z45p4Nv0lK@0?HH8eBok}+p~5SzcYUDjlLlHQ>pFDyuhUf)Spgus{z+Ax5bE|YYSgJ
                  zkC7TI@{-m@rnv|tWykxEaVtonpd^0`Sao_@zY=11==#>;308IyF>FSra~~*59Xr|f
                  z8>Pqi8s_ymF0rO{V463Na480dKvZTM62;DcfU#=YhK9*Z(q80c+(v56p~{ydO=R8r
                  zTfbiv=~0^cwgqU^ncsI=e0td5GSseLRqM>$MSLRE-Ce>R7u7nPL=r)kg6L{Ir^LLw
                  z+U$#~ua7~4WPwJO#u`&x657CyErKUhJl?Qsv2dhhnFohAAwVQ?>0ja9FEq*l>7de~=U>_-QcW=9;CL1hXJ;IC4x
                  zV!I`vJap6oNgU_%oNv2q?d7g|tEpKC+Z*{@BZS00mMiHfv?5g|Y;u;B)T=#vu;rJldyBiRo{gF-t=^5H!c}$aOZJGic>>@@03|QX#HyHs&{tq^B(Ue#*)Z
                  zWuTx(RX~9uNpm#VKCQy|I0JREkCgOyJyq3d2Tz%uHxQdKTIq=FURsYsx1Bn0m$+Xo
                  zHVR%0CdJk8RDpY4n66_rX^p29LS0X1fAmEJ@_F
                  zn`haE$s5}_$>X*$BuFKZ8&c2j@$roJ@JF6(Q_4IGZG>2jhQhBiE7RjtlC`F-IH4w<
                  z_Q_7RJ!6qqcP?kv9zbd*$6o{v+zkJ6Cr#7-t8M#N9znbri;?Q99!!?az8h%4jWO?v
                  z&gat~TA+UO4kF1cS$fel=+1Rf=D*6e*#_M&U3C>kbNyh$P9x7!Yhi68+x5NtMb6zL
                  z^VUgsqQ>WSUFIbX5It)5Suuc3-@MQ@{vBG=?ofO6k{etWhQ-L;0Ft{uvm-RO%h
                  zPZHdp+Hf64xE#CD4`;&S9?NkvCo(&zk3;>Ecf)-z+$E9GfGM%stUSbPK9|DX+ft&s
                  z-0_q0wa0o~3C^mwnnF?mm3Rp_0tY=QPuvQ&&YjKlb2z6intXT=eHJirTxlKoCh=Jx
                  zH_kv`TFpsR{RYhpL^<5)XHUF_nzQLK@9;48()J>W_haCOVV$G437Zxp?1AF!yj9b;-(lrWdvo)CO-#_VPZ&|99H#VXc#EN{~
                  zojlL%pKsD$rS;>DPFue^{n`Bd@ZGOxA!|hkC1sF`Fq1IbIrI~qmYWZGr@TUb`j!Nu
                  z_X&5I9xanCM7juF0cW7?`*PF#Mt%GHuxI<}Ryo7dd%b@O1eITFU>sUWYg-D7pQT19Wu6(lId=h*Rz
                  z>?Yo$$&Tu)&C&w}2DbypL$|Qql0@82#{WwBPloo!-FF&s)~fZz1jT>o`={1tbb4hw
                  zAu(*RQha9UC4W4;s8FDsd3eVa%U<0|%
                  zOtwHAa9{J3`QwJ!$??@_EaV{~#EY;6U#VI8smal6&y7*DC}8B?kf3L14a$x#X&+r{
                  z#`~v;zvf%SCbA6siTus?@T&fjRzgHX@UJ1k=ze?`kbxxdd#X8b&&)eu^0LI07}k|+
                  zi2;qjL+{%`zA#$d#iCT@5C{3%?G|Asq)!IL8rmqq=^j(*rt+G9x0DSuG;-JPiL$t{6
                  z#^XWly*;N$Fi5In=w8ms>|&DXa?qO39^S(37vSMCF#*8~l}FS0vi_XOv$}0?$SAS7
                  zxLF4_=`!{lw;*rNx-{=Z;b=|c@`rdHOu)R_)x9o4!HpuDeo~er7-6l&H)odBslWk)G0-Op3HpPV7qr@0*=JQDW;fem$Y7q^i{BmrA#1mBQr=
                  z079BoP7^~$D5v^O#LSf2rVek=arTE$RR#ND=7n1tWA}Gm#7zatBB%#)Mlg8PG
                  zHyT)Yc^P}BxFc4zBc>N8eKb0VPb4o~m-~`@#vO!tz`u#Yg18t=nAYR))q>G-|pH)rLl%PaHdjK+o^BdFvlVMbfORL0(yH7Sg)(zXSv%trCRg`tv
                  z(9&+Lz*AgbNYK?80c(*{uPn2E`5ZNz5#MlM!i`&o_vUz}a*qT(uj0q+@dkOr_FGb7y
                  zZQvziB~a4fDBsIZ@~gy+Xg7A9$)Ef6BgF}VgGl6ro0N~Qc$QPkcGS?YEVWQaU)&ws
                  zTJuPP-hnbOD*n%N(RrWLDPnoS;G&~#(#Y6?tITSV3S`}KGBVu|4u39<=P5U)?3M`o
                  z_}6I!Cs%>dFrzi#x8-MbUu?6@Z_?G%H;YEtS>edmD#di5xV(qi*UMel%4oo_{w`a^
                  z!#?Nu5@wmNkeT`_g~s!@X>8$OjeooIN`{p;S7o?OcmBDyY>CiQsvg>cwP0zgF06T
                  zMQ8lt#pNCoSJMsB1{U$t;z%BeJfCSZppZRDs!A=BP*U0Y&^D?(U7a6L^GIG^xu-Yy
                  zQ%W6oM-FtGkMeqDUs)Ernws;a>#WlHGv0Ri>?uF`S8kDZGd;635n`?T1|Inh;2P7B
                  z;FfJdxAUy?;NaDXuN+4k9NGkmY8(?PU2jOsx_gA%O=myzA6X?;CP#k^PB3k{
                  zcaulgX9zF`3gjp2;mo&W07I37izG`eDSrGuWb48QE5>J{=)1L_i~#Plq9awqG7fl~
                  z=XQcwC~U$m9!Y(9TI^;~xL`>8hw;9Q{rjm;``;K`IR{QWQv*MdlI|`=QkjReDhn%Z-LEm7p{!$)dq2+%
                  zGGY8I-XFa{++$aUVr0EHdWt46^IBT?kFZ&v&cxAf*EKg7ENX*d3!Qb%Kd|G!dN?>Z
                  z6Mhi3IS~5Z;&)Fjn>)XDEyCOKR^fZ+m;0`@Mb}oHzW=JYSe-CX`dSPP2Y%_x-qx@p
                  zmh+Xo0+y4;=w%Co@FW{z{*aXn+leoOV-1w!tNR%ll@N
                  z3voz`)IUt3v(jf(e;<4XfOI+)rB9losbWgP*T5V9`}P0j8K7hTpGM7l*!2@i(i$j-
                  z^P(>P7nk2OJ#U*SSUxwWz^()BXICa4Qt@50L?iO*`}V1!dj)2|fTOuS#jx%^zx5sk!2q1ze$jFr6CkCSz|#5_8#KHiYN1jtY?2!+7+-{Zf4d828K7c^sw{Z(G=KHK
                  zodXXm$Xgf#Xs73i8C`WgIJp;y!DU-V<~Mb_ljG(bN@6uyhr2H&o;ajQ+Ws+T(-ZqB
                  z^XgSM<@}Chim%QGwTeDq~t5JJAZ#hS#^2NEhP-en)gVsyCwBRO0tf|f>=rXA<*zGRaJQ;;&ed##xh$a(Q81t|1H76
                  z*GY>MO+Kt=B88_RkdO6Psnu{4We@+jzj2D0M?9@x43v(-azBwc&4T1kiTPfxfb&eB
                  zX5y!?Z808@IX0u>=uoda`V=4hwT-k?>GQ$QE3Igdtr`9VU#a6MNEq+yoADr6+B{sN
                  zPT;?+cDrr(%dkF8n8F+%Gni%{=O9^P{h{MoKUdW8=a@(kLx|vrE9oT4s8p<|qDfS
                  z?X)%iF{E`R^unffx?2kZFN#Qj13NK{uEEwJ(6*e^7eHdPet&EfN3&dQ{hevZrbLSP
                  zLl(g2SAO`sKeOtE3)u;C02fSrs)FQ!RAzPXq$^M5-
                  zd0S(gjjBm@DccUL-p?HJAc8LS8;PDabFfCAXSJoBj(Gr&bU)j=HeZVAjaH3(X+`1F
                  z#HBP=r1X~RscS|Lw%~n>*kvJP?VCWlyp>T5QzhL(lk!JoNz?peQK3r2jIasMpR1+b
                  zN;P~`DvpJx`ci+>-4zoajjvVFTPp@o!xMt-dT$jNj$sc!cn*z7uL(6;%*zV9uAr}C
                  zkcT@E%{f2!1_ky%4br)NsU&fNTOV+;{n5>GKNiybjPJ$MaovfN-Hi^d!CBFaX4#2&
                  z2A-aEEVc6`O+WR)Aki7qCc6WBbL_L9?l<@_o2jx7`LmZ1Rc^;qoLQktg
                  zk{brUr7$Pevquy6I?~!CpwTo%`q$*KlyUK&xxMNKYE9PFi9HS$(R;_Y
                  zfoY}1VFAYX&YG9_Dk9l`hwXuvlfy2f}8R1o}kcIGB7KbBtb40_u
                  zzy#95ZYzc1;c~B1TAvXRGGih$syYGi6X_|Ny-}@YX&LieRP<|-fi0sH|4CJ)5upD-
                  z1~2K@X<*1cVEtJs$g5vU;qF_h5%&l5!&5oXFI9F|4IRDth_Qmxdwy@sz)_z){HrZJ
                  zc2mU&N(WB~p+1l4+Z7;|no^beAUq+%_wF7Xgt}oxrRyzhc6n5G-D=b#Z
                  zD^jZc&Kt8ky;yl8WN392pUnNBoU4qWg+65J
                  zUDtu@yB~y7aHYPJ9A$5);-l6w$2i
                  z?82~ZzJH!bpTcN0U5|1Z8ABn~gijuxbsbsV<4Y<{uEIx0)yJU}@hapwK~-KyEHYR@?kAEYT&
                  z6D~fPCHMypX?xUlZ8R5r?K`fVx>3Z{;G1m85X4n32uv{*RXxJQkZOH*
                  z`j@8Yh_!K{0vR%XYOnR|=y<(r^>MJdU{Do&s)U6PU28}h%=h)9XyoHS_YYgj%D?cf
                  zP?nzeXlS@)NpifwJrdJ}=dlC?ioTH4?`B+I^Nb1RgAvIgLPm1&gCQP$1|q4OopvkO
                  z)s+S*vz=}UYZc4A?;B=a2QAsk*}cOxJzs9SE6($q8e35b_+-e)LD%W&tFKN88;ZSPdO>KeLHB%!v&nG1g8z+>%hQZvSHGGUrHWqVE|!~`_Ix&dKjn7j
                  zHRKkD>S)wvA7DP?a={ddW`LCEg50A1GkXb(v|{P73U8;co^u5TuQ4ubw=qt?{jfeo
                  zZ&5;yDfN?JJHsjW(Qm$xEg6*e{Lvemb@+u{6IIr$wE3b+E|;%Kb-|pvu2FEG1u_Bq
                  zh~5xe^cjZ|^NG)=glwv#1Z`uHlLnRS9c*Z->}qJ$c;Xb8R4%y_U9%sqbo`uF+pZjW
                  za?*l63R`#o4nf+Y+smb$S9G^&#c91@2i3G1C91zy84?G_(|u;*>b8ers2h3#X
                  zUdigfFPD_EX>!x8_}sg$%c@T4!Z$jUu?=|%+ZK5zTkNlS^o?cN`h12la9m%~XReU;Sg6<;S6nUlhsyyclZ|K4slP%~#cCrM5vZAusWO#EaevdvP`-Zwno@dB
                  zR*&Bdw@nt|)%oA$5gH9qE5?3b^^Eo_j{fUiZg12cKknrl%kZ&|iV;j8&NG*sHB3>t
                  zkxmvoo$FU=iVTDexGNl{w3Gw>Z_BsuC6-+HD#vOIWBx_Icf=;g`}`pl3&S4zPJ-ZZ
                  zwN)H9Bq&6vaHR-PUgOW-lh+epzI@5p8WVJosp9M{kw^>h1Rt0
                  zhDZJXC4@W6SO)Hl#17a11K~IEH6xnO%;ke5m&4kQ+wTalm5bW+cN?A$^d$r4eWZ$Z
                  zS1dc6x}s%veC+ioV|rre=0w!(a_J)wDWtUp;_k&80b{kzOmw>1Z#+8R#F|mLcjebm
                  z5PZ$^tBxXkTJJtL8BATsO@g$`mvM2z7X2}F`c-TEBcgB|3teCsZbIjgFQ___KLFh1
                  z-`L^*(*Fma{69a_oUyQ7<5=U0nesKV0QvD6j}2-fN)UE;T)c(nVaR3ZtOx=%Rk(B&
                  z2zMw&zTC)M4#s3@5J+y!I)uh>$G-M*=WzzYGkn0SGjdjr@PK3S>G{V?yJ%S@HI|dq
                  zJF>&w?eqxvllI4)ocf97iL6jxeOdIHDs#7X@_p!hjK)*AHUA|L4Xp-z!f+_ZmwGpM
                  zx?WJXEoAy17S$iat?>v-?OADOkHhi_@XZ6QEum^zP?EVKBL_7~We7Jw=qQFOWe{v+
                  z+qZu!PBl?$+N$gBg&+-7Bf`rX20*%n*RbYh(LfOARr=|rT(jYs8Pk<
                  zYEYoLr)1Wn^1PwO{(hTz>KXa8Y2`zpyq=g*MSWUWU)GQsmIY
                  zn6wwmuk}DQ^6E>#AbNF;Ovfl4h=DzPUaqBEAwh#`1uQR}W3<1>wt9fn+yLca2LNhH
                  z!fvKLHdFn*0NOe{w)Ap=IdJujS8YcK+o5THWAIQzKRbW#{?v*)&K$#e(=jilZa#`aDh#;e>|H
                  zbA0^l5CdX;ajze<%m0nF;alyOM(^yZlv-+M1lICQebFgiut|j<4@*QN;n>inH8&vp
                  zlG{ld8l|iRSnMl$Z85f8yFI@XnIFqP`O($Ff_I~fF;2d)Gab1NdbaG~B`uit$f_djs+fCn5LJ^?w;&-?v)ou`K?
                  z<24<)gvkQL*=}g~@WQ}F-ln_2FIYDm8h11=?On8p*8m^S_9PVB?W*ian9=K9(n|qD
                  z^T@pg)Xm~=2l>IDOzCOP0Zo*HM-HTG_w}U7JF6*6Q>ZquajC+cBa)vISbQ&%$0kXP
                  z9HM(`qRdKmPubzI%ewWvErvh}i=ijPF^5m~78qr&?f34@fbUN-frbXIY6xtGOy#lR
                  zSF6Qu#Iw-^B65=QxNWhecrtmY&f%Frma?#rZP9@MkBKy>bSPKsCo#VXH&~e7cKiKH
                  zpq}o0N)4t0zr)2r^*2VFs11M&m*l@YD}KKW>HsTp(Tui_+?5h2^*FZCwT+CGkF4*m
                  zXyPQ0L?7UDc8uh@-GC8Ht8_&pCw`M&MDM3n`UJ)lTWrT8AhkbGHXZTLmAM;rFYwpi
                  zgdI+G+F5oNGy>T*Fazq=%dO`9rjHcLd|dmJ549tQOo%%snpYfr)B0zh361nVWCIeh
                  zgLR;?=`?2@>EIs@uM6Z2+S~Z&GdRUZb_8vS<))`$UiWLoZE{PNRd&SYe~*ZfWUQxQ
                  zTw1tRdzXN4`l<{<(OhtaO5ge=U-VEfp;Pw=e%0l%kH+!?i=>^TDlj;Y@ZCI0YtMW)
                  zdSnwU{r&JyQjiXtJuzPW2v|5m36z=MDRKpn)8XHNk{I0UqOm-hDN&M9Z!HHwC{KSG
                  z)wG1*Cfam|wfC9iK#t~`S7Z^hyJ-!>1sUEs?lIFqzNqzfdJc}Ur=Mi6ssZR2~Ao8Au6
                  z=3|XpB0jKZT#FMq-vjCn^ng;pK0TTXYvcyBAxFy>>M(TEe3%}fQWW{Bz7hev=c#gK
                  zaCNxKkR&C5Foh$PXNa2lb~b&}<3IRw{k{W1P$0s-OdkcSx_#<`RV=V&nCQ3fE5=M@
                  z@&H5PCb?5Y58Da{Dn-ySTfhr!cf=D(tbRO%PtDnpyK@QF_liA{r+&|
                  zoVQvRUhrJ%@_J=Je^3{Iy=bAZ!=3sRWBs)of$RHLt{76WmdXeQa;bq-{-Glfx6@;pX#e?iDOMlv5x&a>+8(=_5>~3pEn9dwwoM39EQvY3opAR|ir#7?QVGu{tS@u$f^|SkR
                  zXj#xmGcmg6J&3c;DV*tDFiZ|oW8ZJs@ZPIiB{RKA@)K?UmR(LEY^jJ7{s!*Q(Dl1F
                  zCA@@h-8Lpm?$htA&i(f<3mA8v3o38V8gRJHYR6x@J8=$kILdF0S*s39oX7{h+~Aho
                  z(PdRXYnqK3gTH2`tf$Mwg@U!G1D9pIsuC3Lx81C0T(@(Dhe<0c%6CkIC{A%^*k9M^
                  z$(7D=BBY=B$uwE6Pd{LCoxK>OCF{7{O=WNh0`I|D56w%yhjkcCs$+
                  zIchH)03-1|i_H(>1oS(}0pR5B>JER?kMnp`JKLl$Q4iIl9(qv(YUSJxmLek&y(xIS
                  z{Aya_^d32--E`E67n*zE^D49nXFAvW&PMW8hts<>qhC{_k-E2_Qch2N;N@k#XYNWr
                  z8Wycf|E1`X8jss4E*vbm=I3V#qdCo4ZrRp*xQSS&{iO~uKnOv?>2d7}xLGs=U0llk
                  z7nZZRg7U8h8;d$vOER=seM@jvmY0Ug#I*x=(4jtP?3C2}?vTY*#qKqJrdQgT2B#)x
                  z0J#nq=eX)V6qqC;o|Zeho+0&zK}ij(uW+Y6|6P|saS3kJ*L)dk>35UWozTShd(>Dm
                  z+e`G%jlah1aFZ1m2RpxoW}@VFW8|Eg0y>cZ@8r9`K#GEo*yHrSLRaWs;{$RQJ_<6IEg5`OYXZxt+63oIfO5Gsbk^oW?@juQEc3u3h!1N
                  z@$~o;8z<=cwtfKl{q+6E{ER=>!yJ9Rp3@y1{-&qG&jS;()sS0($2hv7bfBG<<{e&Hm=Y2m
                  z9Geh(bt^K!3`ovw2ZhMfH*r^8^1eb41O_}l;j&UW=bEfoNb77`O(Vf@%*hW
                  za@YR5v{lWZI?K>=!f6Y;M!xbwza_Nkk_*a9wSt)u>Ods@EO*T|V756EjDa1tk?lU-
                  z)c>yMdOXNvphkbcM6Y31+V9$xD=`bc((eQ239-c4&4eR4JXS7l-ZCH*CAbXwxUE7a
                  zA-|3a1|u=8sC$eFYLS3Wl6r8i$qChV*5)Fo~JT=650<9g9XAVVxCxmOA>$
                  zVFSnc&U2?a@s=}q!pS?5=p)DMhd|zxWzCYX{wT9?$`)*t=avvXabE%mDjM?w2Hurg
                  z>7*)g&KY=Kai1&f5ER|EIvrT#LKSDZwu^PvV$kY$`WcF&f`ih>bboX
                  zp10TDkZvAo{h2j`)jFkv_(PNY!{{}XWl(BNK={l5CZZofcjthX;V&+yx+te4qQYFW
                  zq5rIEp3MgD(AndbTi@g~OAd2=Y@&FNdSV4qf91;v79Yl}fZO)MwY`lhYVWfVtD;!{
                  zpsd|do6KwH7XDhvlD$$vRi(bqm3X~}PW;t&wyHW9e9CJ2NJE;1<(%CS3vikc<>;f`
                  zavgqCzGZ@)utM#S);L2x+0t)=GuhI`772)xYQ;_TP$x9o`zF;i%btB<o*2)7rW(M(ryBqQ>+|Ul|2n
                  zul!#%8(ZiAg?AoPvcR|z3y9Msh;u*%Te@$Uc925#K2mPJ=H46d7pqsNPIz|#%FXY*
                  z^E~Bk?umm6@2e?)K2a_vch{jx@k+cnV3I(r-P%{I-t{?eCS;Cxo=K)1cH#=y`T-E<
                  zF2ujWygjNoxp=E#xV8-FEr6Tg>qha9IY3Giub=@cU+;Pw{@6J~Q^*L2SsLtiQfV^#
                  zTI1nYR+|rw`na#1{6-i$3(^M5$hc;)9%J%6D`D{#jXeB;Y&gQU?}Ie_rM!`$qp1rJ
                  zecv%p0x@XIR>tv=XbrcHXz;WgvoQKqNueTNdrkFLmBfupE&`kUj%QS;2d~C0^yQXL
                  z#DyIFDx}c5y|lYeFWn1|bG#Hpz%QJ}cFEFrb$)8X-@b823DR)&%`SFq@$`f05BjW&fIu&2(++y4cz>OfH))G4
                  zsa$^#a9thunE!Od?wQ1;4KXIi4{~%+h*pQ;MyGKEV?_Q!oo6VGjIqqaPiBE0!2kz!~KtZEJzrs+CU1mUlwYd@}7Yt*r)-if?br#c`v
                  zr&Pt=6ANh{dA8y5fmA2QU^AJ-fK3SxeN)RT*2Mx^!7t*`o
                  zjq0XFzQ(4F*@)Wu?>7N}p=)_@GY1@i539+>x3R!y#K^iC}mj}WdF)i
                  z2zinPbgqAW2Jkii>-q_LROoA3YwpLb@xj}CN`Yx|J&iobaRtwR
                  z1}#L#9K-bY@7yIhg12a%9zRIObQB7JphesL-JAVXk`E}eUx?4-|EZtM27bEdFNS%)
                  z!V6agXnPKq0qssKaQ*|k75{ZY^V26!BOp)p!){-re;W38)~&*t{0r@GBu>5vVPumc
                  zG}8{s#dIqdG`@u4(|Dc5bT>BKwT6GMhBvB+$UkKQh!8DbCA?C7i*{D)2#M2$#Z71l
                  z^_$QBnhP*lUpaL?o9;=GdHk%$Z!7YOi-YYmd-0M(lP=%pt*0||H9TOD>!-A+Bn(yVj`uwtV>EdDGD
                  z`Yl38y}oMzQDbGP5kDeBza!AtQ%zS(Oz^Uvp7`_sDOXn?MkMhLd_HS3yJDqw$gWcS
                  z<<}$fK?9ebyx(Vz697C3WZ2E>cD|a+<3)8*sAt&eTl+m*s!ls
                  z%V)1+Ykvi9R<`g(Q1@L&$1#>M8NjakUw_}MF9S1H?Qm^*bou}G`9~3kg$}7rQ~=fG
                  zok4C$PJcOL_DwEO(o#;&hxwWH@x!*R0+#gCdyKq=kj456DVbhBQjr01pfXj{+6bOJiDi@?S=rxk%fa
                  zpPO4O5IlP|$oot1@qkJ@%i!P;aKVJpfyGT0108^kom`WBr~RTHeYp_Q3jtquA4poS
                  z%QxB+LH-@C#=9xryT?Tex}_0!(Dxh`1rx^+)14?vYNsybC}Z9xKXgV7!*ph*SUy;P
                  z0u1h?Ei!wG%pWg;w5!_LdFeRE3p_9Kn%yE2ZyIeUmCJrlXX-f*6&jNCdV6|?RP6Z;
                  zHb^IScI%usBzW?T!ub6jTh?p?yPM0U4GoG_FcZ_3f0wSyhw>`KRk^e{M(*iyD6GuR
                  zqA&CsSGSDUzj!&garIn_{+(b)_9S_7oy6Z^h4A;U?y-eL@pbNT-s-1wMs)V~28n$!)D4_vhv!6mLH))7#IvAxeQ2oBxol2C@yGTj@JYtoL>hm!
                  zHq;C_w@ou#4IhI*6s^xoy(r2>@q#=SdK)k0oaL0<9Oe2gtlwS&c1EyOywXg>Of?uztNh=Wo=Rp@N87y`gM!d3iaORjRmh!MS*n
                  z5=S;)R5Rtlo)mfey_2~DANQ5~Swo>s!q-PByg1JWnRm@l%;r|1VGBmq2*!6h^kPAm
                  z#_|7r!EFSF(`dz~XEwe%)zn&c74jTUelJWCFOgcy@S3;RuETzRos#ek(I4H-jeke2i16NQuet4y`vu$Ibswd~`&x=op{zWadOc_>5cWd+5{t0jVV>(5mYTW|2-N9t8RT6RAU8NZuA3xb@BFt}!G5x_alFc1)hqG_
                  zN0!Q=N1pbM?{6XkF`!0c9`-Ee|CA{0AM;W9ol#$m%Nu^840+8XH~Dsyk
                  zcTw`Fi+y(~cOksD^qK`|ERpKoFyTZXeB#?GT|rk?Ucrug9$;h&6Fi4U>c8GIQgQRoorR3hS9??T
                  zF8#ehSHHM?0Sv6#9J7JP8U9#j#GGEq@K`B|ZEmOVWK!Ltdt4)qO!t=PI?lqU0{GDX
                  zTS$OsAkYNP$KVJCG=r1H;3i;1}h8j!vFur
                  c3o>!$v_t!TTsHrG|p?XaxlYmGcP(
                  z@Q5L5JrnQ`y{W94A_|JvD-;y}uP7)8;35Al6ckrZ6qFrf6cnK(6clpDv_@4C;EBf;
                  z5{eQiD3wt@H>$C~{YNfpGVf8!hN-uKI~bqjWu#E*4RC
                  zcouvr;Mbvil#n8L$VPTJw{Ig>-N#F`szi%I-aFH!sdrPOCtI_n9tk%`Yvc0Pbf{>it1HIe
                  zz`pXeH^j(lUbd!BpQ~S=;<@}b{
                  zPB)8>;{}rpOUad>?_G;`v35ltre9fGR92RNhsR9TM@e$KoBX4xnIN5m!bm?ibtaS~UdQnK
                  z1u++Lg2Zyp4GsVB0DBj;;0ca$dvf(^l1LYofv{)i)?Ks*n0xc7QYMy6`~D1TowyZ*
                  zU$d+gQVS~n#Gv0s8+=R>-FYKbB=*CwiMF`*^guWszMJlCpKUkIb|g54!`N(VVl+w}
                  zD_#_3+ACRU*^iEFjP?xuGbCZAT3#CqPRY;zh7f0D#53@6_@H3RZLU-r`KjAhMs=2GWtatt7rZOP4SVoWUu2i?9E#c%!8TgW4
                  z$x3$3pMVKY3BtO`jWWA`E*hwmTALs*`0vKZ%%G*6KTR2|jlM$VANlsM+>huvDh(#B
                  zX`m!zF;5T^tJBU($IAtu4VsS4RHgf|z7U75dpwDo8G$-+@|2h>;YS%QK>COUQs71|65`
                  z9(%+}S~}0>!B%2y@0j2F1HX&ZEqH0Y*p=ArEN~7`I=24I()_*nYVewY0jq-DI3&<5
                  z8lyPJe(DJ}m#tBJ?dr#g=1Rw7^t984a5Hg_KcPnK<_&jQD+2J1G)k<_4$3JG%JVa2
                  zWyofB_OW#db8*2idlwmtrV;OxzuR{0N;}olB?o;Df<#1UN7WXlb|Fnf-*iT%tGcef
                  zeunGxFDz8Nr{~_G-Lu6*tFA#RQD~8(h3s|wad_4>BXC1RV`ul9D8H16M|JGu5wm%=
                  z-(t2M7i-G0>^&m&(3jJ3%kU~=Cw-sKToD?1VJE`9==S;Z^R{&Z(HjCqXo)GuD{98qIkELldGYJ&D{_I5I9g5*)76_10q
                  ziH``Vu?P5?;_Zx1!=*u-W@bV!8BoV(R^(Cn>!QKJ=(hNKqkz)7?!pDS4e5
                  zD_>nb7o&{g?Ow+P39%Zd^Y2GbnLh^%(|k8;T-a|HfKM$n7gNQ=jGswd^;N34vZ&hQ
                  zQflB!NK{hruU5ZCqyazB5LxNJTGjjEM4oB3i!JaZ?cH3J8Q$HqfqE>5bt
                  zBBHG!mkJr$l7qw(D$rG30kTS|FABtIuuD6`Y5a@^T({Y4Un?B8722;_4W!mclhtp`
                  z!i&wdEq7wZ40ipE7oQvUi_~vEXwk2=IAxTNQ_|Wn?|}qq7=}m4sdb1$_bp_qHn)8T6tPcxK-5k)pX6C
                  z+9FCC=1emVZg?XL*@(E%?xKITC(g173OSdTE-i^Fi_+LiAe+-BJ>cOr2<4h#mR#=~R64&m_+C%(z`nKE)i=|_E**HCI>K`Is
                  z*4!HtVv|=%1)p3r=q?X0)~S>vvB@RYsF$05iXDZGxUpW>Vtw~EN8XHzwGutSk$)E}
                  z&5p3j?V)*J-NU}Mm@Abq*q=q{Yq)&fcg7Gj@CUxcc)Fg1gdM-KhQH3Cv;4DjZi!3P
                  zLg!a%j|MEvB2*8<%jH$qX@h{?>gI=`$@)enrI6z6+cGPOd}&zc)t!uyM!Dw8=|@+C
                  z4#Tz2`2X#7aXO5o^EcI0XIiugh40^*`-ZnHTzWt>|9*v-j|qS#JAtc>xSw~
                  zFUD{ke7K+)VkmlpR^{hHHX?I-LR2SG8HXbBOYCUc?WF|q1SCtoOr
                  z5epL99;lx_#i&$$WkX!D1s^6{{mEQou$FzNOrRG*tE0;12dvU%`jNjv6!{4qS;$CX
                  zS&P+rPFIUz0mW8`ut@$})1x8xP1wCDyuPue=6ZcV$awbxZ*jzA<9YpBo(2C{aVjBNpp!RdaC)#Zgd{E12REBAXQX987;Zs$8f8%Nt5+~4yFPBS0
                  zh$IJ!rwxS2)E^n3<|UPqKF=Ga|4awgS$M0}Ydm)kA1~+mFn?DSpLpKUU@YOndJD<+
                  zS}ZVAg^3E9bGNw4yVqD}wBFx6szjU{v@xIur9Nq%GKx%Is1kJSxMXidE@2w^Exl{m
                  z911Yw0+#sm=C6q~hLrWO7KB7&gHQcID-);(9qH*H*TZd|)tQD(GDB|{e$C{%$v~S*
                  znI(?ogFY_IN>>>aYfX+E?)NWp-|~tw#ZX53H4$6$8-`bz?Tr<+R`2XF!j}XaJOqhJ
                  zmZ2B2kKS*V!|mvb1BdZqaffQFeALu*5f?R`!8HLEu$B^8(&o?vHu)oXv3AEJoBNZ&
                  ziXqJ1pS8z%c^VlKQc@gxD8m#_Quy3J(drflD@pEQVkm|A`P<8vm*#%(TF=$b4!(tj
                  z;#1d@B`j+(JJ!d>k}ym~SX4<3DqBYYeZOYb#=J!UY&{As=Yn|O^
                  zBgAx>fq1F*JD2C5$TBOv;LmjnZ~;hX*FUIfDA6=^AR-?Ymh`C5ky
                  zKI<7x?AQC7ETOr&W0gZnku2Ofx7k1gZ~I*9_|6BkPWog~{=UGAh2MS)l_VB(J=!E_
                  zFk5fgPFK^%z;zN~rAiWH7v*_a(a1m3Qp9V&7}b5tF+Q)&IG=&+w(>~OdnAuTqAxZ-
                  zZQKz3O0yRL=f(SSFn3#h;skd4f;Q6EJmZoL=6Eu3kTYS{8dtaNEh`mdDow+PdrzFM
                  z<(zpCcKx`MJT`8+@Kg2lk&tE>ozbv3RLCKcLd~!(EjXA9d{c~$AXo|(G|EsFZEtcr
                  z(WrYvM5MaJ^Pgimx}T(X{bpF6cfYj#EJ~_-p_I;QH?HK;O(o5GeiEH?TfxlKu3*lU
                  z?v;+UimZr;sI75a|IeRM>R8|2VC+sDH&N!=D~~T?pK)42qoR}oLu)e|TzTlF&nt#)
                  zja9-lRQonGoj9y)q
                  zn@%>HEoaNFIux!}JZuUxJ)1CC4;FwsaL5Izx
                  zq|Uxv>5T$Z6t|rtTD`D~>kj!sgb+B^-`t_z^Ss*cQx_L317D~eym_(c
                  zyF^1hB9hb+Fqs8e0E(3xb*w!0T|KOboV*(`!a*
                  ze2_Zh_BIENLhqYH4#7v=kyK+9wOo?0fnct)NN3B*cAdz5?-dnJuP^5V@J3Yo?mv^s
                  zj=W^$!%Ug!fiT#co+wD%x^r={mGzJ7R#AD#u|s!ldR@hrYev?aO3&K)w3A~eY607;
                  zL6B0EruMPRsgIx`Ifu-1PEP!xl=_{*NaV7~Wbyu2u&>-k|ML63qi+CB8_Q0|oU3&n
                  zfuB@5^(h#!byCmc@il0M|#JWj^WtQFoF3VIt@1`lcW`DmYCQz#}1%OPRYUdpm0HydBC;uN>GWJ$~`*aa5hYp>`p}(M>>B1tfE1ph?r5;rGRXN~6{k;^YO^=mZDfsHs
                  zQouSa6uzg6o@tkn@AjX4s9DoT52j`Xjxw`-3Q50P%rlP2xVX0u%0fVg6DJR^v}x(P
                  zx1UvXD5wf$PJfJkRcND9yE#6u+l1GC&dgI`ypfbT%kh3?*ACD!<3$W{(y%{&V(Fy(
                  zCeDTi-(6bMdni+#|Jdx93vNgX#ap7*CM(sgUtRnb3d-WAhDM`T5yGGPusZ;RqTA7tc5!l7j@Z~K&y%6Qjo0J42HrS*Fr^sa5P
                  zS?!-`PX~SrNjVbhcL~d4H*fUVPJQge~ZP@G`5SHtNn-J{wAQ)rQ!hCbLAR
                  zWC+f0Fv{%z(vH4al5i{rSf&VLn@Oyf(9eZ5QUkUJ;RDLD%D;@yhf1vbx~IvVXNf*
                  z7FO}Kg=-5g6CaRoe0||0^IOBveiECa=?z`;HVb(sU)QR~hp~m7FjRlVsT-Y6eEvhs
                  z?Q304X7r>Ew1J}O^BsZgikor>vL*7OZfrmV*}^3tl~vxsKu5xM7|P=;B?$1Lv1@s8Fl&Ye2=QG1nxi&2~}ZVha2tL+K~
                  zZO6IiewyO9cP(O=$&+h<8oEX8TwpC+4xsm$)9#;!bj8_z2tsyN7iu_+>OIKe5V9$)
                  zR0wk*?#ME=2HByF#GzAi5(QO>GGy{_QC^~bU;9@Nqg60^7k!3Ps?JZhQ!YxOw0IWN
                  zaxbz$Av4bxFJ1)I>fZ!z$jZs}yQQzX6N6w)M-3DK6BeD7w%zf#I#t2U?>?H}RlMkZ
                  z4~QbPGxK^`K04m|jl{)wZnHm;sX1oT>D~_NcE{&6?|bX(pq7I!d9NQnr~0c`(#$vU
                  zp|QD)7`U^!ZG`fCabrhymutHtR9W7MXYGPcC*ry&o{qb6&&I13qCQ7Y`xzH&P(yFN!V`{eJ;9&
                  z-0-H`6DEvX`
                  z-(2|)@lKZSmKc(=T4oDv%hHekv{jlO6cBj%NahZUt8W7p^%LG)ERSy8YRFC;2qtF|
                  zL2IZw_zRn!RYVmus7ub-oj>?9nSHtzCX7#qrD@mG==;NU{a1fKHfD6*;qo~ZSM)+z
                  z9O8!p9V7iBX`nxloN$Z?rtecJy`*oe$hjv@y!KfpKuq?tP2V
                  zd~pg^UT*vkw}s&4%-$h?%>ABm7lS#QeOQ~;cg>X_JLc(9Y`KZG#zd6yc|u|9Qg>j#
                  zlBTjA*@UGf;^us$5M%J=6A~hx6%o}&4T%U^zb62aQimrIlmDY{lOdqcj$
                  z4bm*8ZS$^m>xt-xY4BE6=f;zTDZ=P4=__P=b57RxRC78Hnbn1El$C?_X@rRL%v!uv
                  zYa>JfRQlocmA&QiDs6vKQP@%L)L0`6)V+ZIo)=U#^zO)6z3dUEOP@+Qmr4K1JVl>R=K@+C5*
                  zXCeV$CE~9Z_gR2tVlLvP{7{LVMq!a&0PE(*_Nw9Mug&U|7y^!*&{7^>hobo!Qm5{D
                  zv4!`RI)n9z39E(32*}Cys$S!+OHHlyx%><>--?f)2H+
                  zK{;{jxK%mSlMrxD1o$s#1afErOnqjHdSqYF8kgD6N$>~&!~eehU-p1m|Lf@K>Akz4
                  z*W!CqwBDW+h62s@qw=0K+(V%xR@nDq|JYeZGbq1zFiUJh!gewr#K6AC5)9sdX&>f365FUz9h`}u&}LJ
                  z)Bo{Z{_}+b1myVx3jsD>*aaM2p$hV755yg;=ZX#nk2$)+q!)FgD8%wa9t6w7*=i2L
                  zOg~qQR`M6dW@dqIrJ_fxUw0fU__a48@i?Pv
                  z))RGis_i_XONDNhTTP(CJShbQbxpcQwoief*d6#m?16baM(^(E>cUWb)@V7;5nR_p
                  z``g*CP!aM?8ZXT=gzy;Axr>8#6idbDC5}&r*I|)4DG_{vzY~6PS|zVtaU{};Xcn8Y
                  zs}JB0IqWXkcIEW5mz0uz`3X_TG+MKdLA|s{I)$!4M3&*tW6{Os8N%P_cJg%$Nq2nv
                  zdH7A57)g}>e5H=P-?)ZDiM}t$4yxAuz8)-!y~acveECfUNsgR5mxZOfFBg{>9xk}x
                  z*frS)jC?bEy=sO7OzWgu30G=i+V3Ca*|(;Be+xf#z-JEkf~B8Lu(Bym-oJTcwKeX|
                  z^6677my5OCQx@}FcEV-$i;lUr+eyS1p^Js@p4GeA3dMmtt_@Y_o@R`H&V#4P0ax#T
                  zH@l4Dyj;^9`Tt}vx3uyfhY1Nv>|ugS8(O=5v1FoBMj$g6$^jS)Rd(Q??mi7+~%?kXzB$6cw(~kiB=*ig1Gor
                  z+@V9TREnxliST-Su;%NpIGI}2d^HB7GbQq_m-p&Qdgb=mumZ+4;n1W*qIEv&n(tup
                  z$@c3r`1dUH^XDQgVIID#=j)UntMmT+_Qx{NjSuHcGSVmLfRcs!p#55B#)L4EsGFW0
                  z7^2R*J*H5|fu!ylxYjBC~=n2T@=_PiiF7-#d%8Z-$HCca@_;#f6FfIb?WNd|nteemdaO
                  z879E`=rK(F@L0qZ5lExs+Mmf
                  zY5lDCb{UfI2)Ox-DRzQ|E?iy=xQ8
                  zcU}N5&P55huv2H7U|~$Ge-&|j{d#`9(Do+9=&c%HT~7d#|2fTDXSMRE7k5j4%IC7f
                  z!lua$jVSyxi)js-Rr)$mgF+5LG-zMXmSPRP00}+>(4KlCAYtxHqF)EKa?b{b?hl#~
                  zsL|A#t3O>+k|<0L_PjWG2Cq|@)A672I(BE75Y%S=_z?(T><5jCE4+R#{Vlz?3UYn^D>{UhU5=@^FXP}
                  zE&-0RMt<**&HV1+1j+bRuFc`kc~l`7M@X;{Z>M;#P6?yWalN~#5YYkviQF|%
                  zPph|HJz)Iumd;>S+GLJ=f$gUz_U0u*oPS|`MK4{Q&0)wr*=;_d4Z~U*F=t)FxisoM
                  zHtv1G6OmLgo3e|f!W*#Sn$=CGXIVK_b8GX=bfVv>&}Rg9`ua)t?~=jhs0AFR%gS}~
                  z>rZ0aiRz8#;)>IE4=&lmn_+Y~uFLvYIO0DO68~p=>_1`@6#m#XCb;e|D%ik@l7Zp4!oA{M>CT6T8B(O(ArTqrd9M3Zx9)Wc^xUAH
                  zqPUa^Uy-V5r?3Ti!0;Aw7}(k(_qieM))G-r%71Kq7=y3^JRjUl9QUJHrrGG{++QZa
                  zXNP*&fROb}A(2S20PKuPb#I%x20oniqoNxUz&}JTdSHyoJM1v^R^F>rc(F_3)Y@u3
                  zm0W%e4MF!YG;_oA)Nd3vvs>XS>8(+wu~mHGIW)Js(+J9|
                  z$oKNSSfGjUy?^3nzn5ir->^gw`Andzf9yNuQTW!{EK}u5(`nL)3Etk!B$0~+JP1&O
                  z`0P%#P6_DndH{jqua_@3;bmPo2Zh2ephL&k7-yunXK6<~^By(UJ!cLcZOr$Mnm-ex
                  z3>mGsk|}6v(9OMP$$uvmz4;)7F`I<;(`jg}Z4U6h@0sw;_~)JP!)!py8H|p*nyh4g
                  z69UVZ*M6~4f9B3Dkv2?)s1!48HFxKjbTnP-EULf#jWhr`?we{COO74%>>bmK*tb@H
                  z1ONWjkov$>EK!53Vf6r{FY7y*IjjbYWxEo@sZbzHVY)Jm)XSBljQj78Q4iZO)Jw&C
                  zigPff#|`orL`39Cz&^Ykq&|3L%6(LO`HgdCE-43WV9_jC!3sw1V-p|dZ`JX5yrTqE
                  zD|+Ug46uy3m3@vi}>|L%hPP^$B8xV8ifTfURh342+Hs@h1A>J
                  zu-#N^4_ceuL{c>x-_C<3VIPN&TW-+cclVWdjR@ANh|j6!=F%8z#F!Y}YvJX?MP`7b
                  z69_n$L8gq;{qedNKFagpx?w{EJ@an#H$^o`lDo=-Mu=k4g&!{*TzY>K(%9PX@k_53
                  zGpiv1E0IlIrKzmIsG85Vu{cES76|dMRW?KdD*QDfl0xIPMR`gpdq-YHL3(o@;A@r&(Hd@NmT&x_RQ0c2}r(7
                  zwAQ@Z!O_g}FZOb%yfIo?2Dd?m+Hy0Z(;c|g|u4&K!n5ayVnMxM1?B@xr}E3Ui(E=p4idRC4rH=a|Xau#Hi?Nt*J+V{IeP#
                  z&@>8IsWX<3Dz*4I*pAXckCgPAslU}4@a4KGGASf$OX9iR5BR6+7)oByJbB+H(FFRD
                  z{x-XjEJ6~_E2}>hxSdzLv^C?xVs9D1W@;juJ5&GptxeOTW8D+ZPqLmfb160fVjyuN
                  z;_u3B0+HDcaq9iQo6#*Q|89nFKe~EHZ%9+G*R&B_WD^w;De||}*E&N(I5ml)3*Ifa
                  zU+yd6@-+lFsET
                  zem1C3QTF3UII0Z;=vlnlr$;R6@H@wIucsJi-YRU*lM5g3hU5>2M2xQ)H*j5Le~_nvXDoT^`WShJn&
                  zC4kw<*>vgPyU1_A}X1NVh))+MO7yE2Rs?a1%v?dpT0Mogma1h~KWHpxd8
                  zx&^P{yr*rJKeoBm8dFay>&QH4Gjz&Xm)yQHk}l4gq1c
                  zsxqCSibfr|rf7qfpC-wHZW|an_Xhhf?H8S5FM=Gqa@$p%0_HH)!yER~Ly2plX4_<6~kH);+BX&61=k
                  zmF$XxV_tEQX0b28tL(&C8KmTE`=X#$khvP@wwT1Z{aS3`2QL}>=WOxA{k`8+
                  zc&&|DuR+bpSYzB%ock^xBXy+BU@Jwjm1`-~sd;}VneI{rW>TTUCE*EIkoS@L;rF_W
                  z7r}_753F$nUNg(-GR*f_DHaeTaLSRp@-
                  zm9Y;hnk<2wV
                  zXnxdQb+xhxiB_NkoMg6Kn<7XYC|g(9s7iP<|DDmo1jY@FRaLf@72eq(u8bFS{P!Dg
                  z4Qu`Fi^JHR?NE0~MDp*u`m)9ikvDG?WPc1rMAm}eh)^%UNr#oLV}r$Rlb4?9O2D<{
                  z2=@LMxK$5@Yb;W(bw^ZS88IY7~1A|rT-P?vFA^I_~6UI($Us>{v
                  z8bGpuqo2PKDqk-&K4jFY0<(VFapleobz|HPGcJ$E%`g2RH<-LVQ$}&8?`HrT!QP&!
                  zu!8z!(1sK1zA>CD(&VuDCed{Pxp?uMJ1!|HXT&jI^s2~Rw)Qa5CiDOq({I0Y@pscM
                  zF)Aae?Wp-K!?z(p)`Fv9>9ZT&_FTU_Y-GSyQFepn(2rUT+2ktY-x}$$d7!t0$VIJy
                  zQR=>R?fy%-gecLCdAh9;PjzuY1`!h6z24C6=yYs-`Eh+<&UEh{-*oZ_n`7Z}7Z@m_
                  z-^o1HD!gwRLd7DnDTXQ629?kzB_ukR34r3mFyx0d4D!
                  znMrz;;k!R^7k8wb{5&1-Q(wH=I=7(A#`Nq5D(%dR-Gz~;Mbjt+|u~Tk!P5+1%D+(A}Bgl~oj^9B#FaEGeDf7KHS-#(bf`wP?rBDYzdU(s~EudJ9
                  z)P#fAI@|8rR+(B}YN^R$eG_2aNnEth{Q$jwGsv_%0#=-3-89rM{DS3Ax;p_BKl_39
                  zv(t#+Z44SvI7Ev_=(s4Etk{@M8oYi#*Pef>J5t7BsIFtUY$XQrR!A0c5&_b2mkVIa
                  zH@vTG@@1_^YT1u0DW$;I-5nkJ@mF8tF!Db`cLk0ssP4F|4U%EyeR!wNe`Gnt7ZG3b
                  zq}W=@8T-r)5lSD79n-8Yx%mA&{c8TFxSYvq@TtBL|I0qv0;W2)4R#wPafj;0RuT4w
                  zbgtJg#U{=HWcf1!6oaF+i3(}h|JYY5t44G1$2NYS>nE5?I-2Oi=VZ%$)k(I~jNjv}
                  zG{t5|l;toWvMI5xhJOC&`a>grOPpQ14!W9e!JfTc>_!c?q#SezX{}~T0
                  zUjcC6x%UL+2TX#%_;@S=AW6*CFjOgDUK;jIQB(Y*4rKh0;=`hvYSzx~jKO#t2UA;h3+_(L@gQ2o8l=VMjZZtZ*M#l(U!Gl7ugYX@o(
                  z>WBmy{?%yLX`b}f9fGcH;;_#MzyJk*HYgRcQ*!=t>^n&OD2%*^AztLx%l-K;A`Pu@m{fBaYkuGdz=5OI#=0_6i_SP&x=6Lt^
                  zFox?JNwH~U&hb*H3|;}eOy}{?v!>$B6G3v;lYqnGB>|@jVIkP%ulBqA>l=)Qb|q~o
                  zsRotSw4i6ZT2(7cqH-(0XN8~ON6G*xzvyNy)T3#mx9wX_n3bNX;sCh(4d(+QfIWAT
                  z5*~g&AY{#3wk7$5`Gz1&h!$H;LBB@}ARn4IINM`KZst
                  zfW^hg&s)iCKk7rt(M8|)BGuB06s9&sl{z;f-ireuOAc7~iu0k&)^U84pf}7rv;`w_
                  zBQ-MkY~_&T{6tt1|2?&WVgyLj*2X5pDVJrnz^|lsFX+~OJ;i3HK0hxnM|mX1BVP-P
                  z*Y~DOZ^sX7O4x1r{riCVIv8@ViYRVkqSoxR9i1m6_Yskfo8AV;))WdVGD72vg
                  z>%wY&u420&B}3OPd`Kg$t&Msh{gNB))$<$~n7!&#I;G>D&TjG=e~OSyGT!c!WjwS!AhI`B
                  zXMq(jDu+^Lc(2S>u@DrLP`dGXX2n@IM0>$Fr9{S_jag0LhItWSn;n?Cjx@X_fnNK@
                  z4%yt+m51->I}cwPwU0RSNjm{
                  zTi?QHC8Ns>DMXu54gJo?B9y&QQd6m*dd`0t^7geM*)AmhnIZZ4SkH4~xYL>JssV?(
                  zr`0aq8CDhn+fnPzNJzMly7_ElT9zR0nHPGo5Mh)NT7j1ow&ld0(j%P&a0Tod0(pX(
                  z_2aJ2SBTy!x)kWn0(3gpMgKBk|IrRvZUo@R4*k5*pmK1_+t-4$ts~XWS<>6S=<;$v
                  zgd%}ta{+j+d+;X&(_IPMnzDJ}`%BRdy2R>O#+^y$UvWUVqL-5ae%v^$#UX6oE+yqj
                  z|NMlO&%WVX@`N>&LL&2&d8C2H$W}iI6lw+9xivYW-KO9*byj?6DF6wbPaO*(2+tUw
                  zyQ*96XH)JHYa#5`x+7rW3YSZ}q?Bh2?{O?28Zhc&B>_|Ed>yb~&M%pOaEQEnkgs-2
                  z^Ewh=In=nsEdNb$@s;bxQ)+Q7pa5h!J%_dqE!PZ=vZE3bnR3#(Q+L6oZj{+i)aV_w
                  zlONY)+u!C828v6|8v9&kC%=y8$nB^{WCutlEQa8;r(c%Ktwf%4P#f}}gndrFtNWx{
                  z|KmdfsP)mD4-XGXe7aZ^V2WsKC;f%+=$O9@PteN-qIGw%y?o+jlD~oP(~xld4QnC3
                  zp0W_`&V*Y6v)YWB_mM*!(LC_nza%)|f3GwD%2OR>AVX{XCOp2piT=mGGyLAhQ%-f}
                  zY!G_Fh;k_GC?y&e=CMfc#rMdAKfEF?GgyT-kes-j>entXVg7ylKktEcynh$d{#{J_
                  zcQNhX#k7AH)Basd`~O-@yUKsrg|h?%N2l%jEakxbri2tvN6?g{&eE>5{BRH>=in>1
                  zN`l+l91}a!5J)`sDo{xQ8pbT0og@_&M)ZKGlL2+@Kk{8->Kx5q3tB~*kBH)tkeEJz
                  z&e}nCgnsFvrzZLyLY!072lqb9RroS
                  z+sXqWu?cK4s(Z`A5YpfMf9QPSNnL=tn`M|OLKE^Qqk+mX#|cdfNV@p7hgh}
                  z64=UALA)@Kk15808UeMl_mU)MhjfKzc0m4K7e$GH{v;za(V!=4@sYK{A_RnO`YUz)
                  zp*+reKZtGtYqyFj(?vor@0cvX2Q9!rQed{uKQk|Tf0z`JDXg=18fOG*7yZoek)19X=+tyAre@?*3HOnamcFVf
                  z)^60{%-D7>e=g7%Gwyg!x6nuv-h*erxlt--{q@c9@t*qDST~M*OexptcN0XD^J%26ptwT3Zyeje%{gaONPzqb}E&LAoL@V%x
                  zAMkK;#KNCy*xC)jEvjL>UD>$|Koj1`3kCmU`@Q06PZJ&OhlhTmPRkRo=0*b=i%K&+
                  z|JtSb%joiaP2)aCADHh#E6+R8U->LQA&t!`niZ6V=oYhgHVy|7y>r3x=R*l5Pj~K7yJZ2&H`FJx!yrLBH
                  zC{wcq=oJ0Um-hRQNl0G6Zs%Vxi(PCYPpT1!oiA99#97=iB{hN8Qd%P2eE99oM^3H)B@xx@@^zUt^Vhd5^$FThEOV7{zJx%-
                  z7E0%!1DT4p?9KZ4f;=M_sJ7g)ek8nhR`UIwZa_c|@NxY?*|ysaY9%Z3`+cf8i^kuY
                  zZ0-1dH~!dh>w|M^Cve&Lf7yFzU2^O_ZU&~%G;T%VKRvOMrD=mwUz&b7~M
                  zRf;?GtncHbym<2lbgv8P6+U119_VH+h+)J4>WpC{XSc;#4*v=H-u!6@j&Zm>HOt}-
                  zq9^brYYM$!t9yxdFnS?z(-aA#1c;)OPHGuWJLUWu&YbA1+XEpy4SVeWos@bqw}?#J
                  zySZ@S}i*@Mc4a9B0H#AU#
                  zKGCpayex%AkBTSA?k{?7sF!`e-Fu)m^UK0zWCiLlQd~Q+C#zTWLrG=4Sk6nzNN}3p
                  z;Q~*3_VHawba}d_M_2^6h|F4fW2F(wG;!_omQy})>zvf^6V
                  zcm}KFB!K_Z1bxX<1Wgyq2tB3|A-4SiT56>!tm^nJ%Uh~(s#&c6!~u^j8n_(9B*Jyj
                  zu#q}>+qqPatQ!d4IBnh4e)gNTtN&Tp`yLV%+NMLBI$hVb$1z-lZ<&k*oG6##h)?Z5
                  zL?K$$)Zr;`8jxPYB<)roo6ZfvhTRRMr6pL`L9@5cz=i-`Tbg=5-IFT&F~C|2kefDN
                  zqp|Dt(3;-6YvWXStK?M#W7mwkTois#gx`)c?oWPb@i~V>T;R2MG@Qs>-7Rqs@-*0Q
                  zkk?J)l0!8q97-mAZv8<8GR_G6e?Vf;<4MnIv@Rs6sxM6C!vYu&d2`L
                  zmBME^?aD)4`c|8vfz
                  z#yQv!qM1)@9X|Gf?B4UOL4wdTA(*OIsC6?kd}DbY-?u}Ac-)McjZ;wVT-eSTfe
                  zf?8-D{U(+vs`u}=HD{RrXV+t_erBBb-mbqgY%gczdRZClGKq~}a++&KzR^j6!IG_&
                  zeUr{=@v#(D_M;omw-*{x!@MumRsk1b8!RWhKjg1{-t`PnPBRC^3#eJPVFr_>?^^9%
                  zG_65}qtqr;CgDO8^CcO-&U9R0y&{X3HqVsxo`1qf!*t$}I(K{**M9AI^t*3}cXvg-
                  zeL!Ow=h7s`z+9$krzFAG@H5DxPkxrhXwm8Swl+{(|EKo9wGQN8_~zXgI|C1W9FNry
                  zBiglg>rs^I*2NcQK=K(w;rj1waMR8uRj4SdrectMBXbFX;55y0@zvsQbryS#mb
                  zYh8QuSyV+hADV?{tkmL^AwWD3F52D3ZqSJNuLfJ)nRSZA
                  zj+njnK2?lJb$mJDS#CAISbM5jcG03U-{$m3!?NJ?m4XoD;sY&kWrJ^T=;%VD9i+;l
                  zkAYD%1KV^fTfSc;Hd4s=c{hIk3^5POW
                  z(C27?X6{s*#pF!T6Ws5EaKvYk<&GB@4BR^s?d+-x_@Yf@BTlnGv$bP2w*xUf?j{U?
                  zx|!Kzi>9=_`Qqx;$A1F
                  z`_Z==dWcQWLk+5*r0_efB?DcxxQuzel|^rdE}*t6=1~U$>jpbtP#~mr&h_m#8xrFJ
                  z9mub<98Kf_q!Zp;Nm$}%Vd(QujJHpnyZX
                  z>~k0dPym~GC)EkL_$tYXp0XWJAh$hMuKe-K4vZAYu|Y=|Y7d^Ym(OwicoqbtzB!#O
                  zJz)fX4i~+EdzB=%n>Tm)kpxow`*!4fnuz!r0dP5@=5grD6yA?Uem*|fIi@i@NChUP
                  z;I-cT)+c!KQe5sfxU|~%>w{!}b)*68KH$%i;I0z%l=b>Lr_n&h=o6>nvKf<%JOw3X
                  zha!#|z$k!rg=7tx{%7zdyCE}*9K5m&Tbp0IrHPE
                  zA&mt{mPieB-$oFfW3;U1ahX1#eRo6pJHz{#xp@!sjGi_6(`(y|OW}}30HhA+O01Qd
                  zkg9$hENePnEGwT{@_S9_XLsiPIaQ5j87M8WNxF3ciKPHw?6}>cd4v!VA*Z=lgkaRi
                  zK-Y}xv|9b46d#Yr2j?EV?A7|vjg4=)G>K=fTd_Yii(@7)-d6<>rc#KBS@VMl0WxR)
                  z+psl}n|C)ww;WC|CpVJOh9kpPVeu@skX$d*M6?Y?{>}-%HIxhTG`B
                  zwfCJtO}$^YfFeIdKtVt{NJonF9#j;hO9@D*N(bpRKmb8Ny3#u$odBWt5GjHo^j<>m
                  z9Ri_*cJuqc^Uiy}-23T%yywF+^JH>n&Lnf5z1P}nuYDWz6nnLzrL`O$8l#Peco7{
                  z7H@?R_<|tnUn_L^A)$AIO}%lhShf!3n=Ym9uZ-o=!ech8dvt@d*suK%BNzJ
                  zel+xT#yQJ3(^Hl|tw`-r=a>8Nk78h)_EzuB(kvg36#)TPYn8?Cg#l@{8h0`qfm^^q
                  znWdiGbYxT0%t*osP}xV5mR
                  zj6r4P0(Qt&5N4_;>rOFV9V+JCE?sIkr^^Bz@4Kzzs)HzeZ@WCo_qeduzHG8GVF!Pn
                  zjoqBq3#Kd+%5hSLG}GpH6wsjFNZ#fU
                  zE|D<($V{ZG=7+nb_fSpCizfeWO(LC7jQ&!x5?F>lMjxS2rGyyIdk{Z*#}?%E*VS={
                  zGplDh>+1E+t110Gka*~4ZDgJT(XL%Ha|9k(l
                  zEOLG*2&bT9(KEk`vtp%E7^>2`RfZ^
                  z&kJu7&joR8YHr#7sn|iv*B%yt|7%eMX(1;{2;Yr!hMb*^DAnsLoL8X0ZsH;8O)Rr%
                  zJRk7z<^3-WBL~L=LoCOG!%gnmt4m8S3)C#Nv9Aap{LRs3UZ{E=-G-C-hCj$uyu9@F
                  zTEdD-DI$OP(a3`R7ry*MFY<{6a+0f1=ePxR##5O8(95{7c=`&l)EQXub6V)lEoIDx
                  z%GBcf7aS%niWN6BPR^=vmX40Eu1O9GS?gFtxqv^32rDp|H5&&*huW8R?atz>2eaA~
                  zcIYm}+MAsB%`8mH+1asrbvhFCLq-2IS=Z)n)x?fsfNU6JS{nyoeNBlBG-%Az_$=mn
                  z`F%WOX94;MuB%XVbvbopq@%DuO{-b&m7FM~rG#y|E(TMv;4C+pWu83Y9fZE02?A+?+Is{!+OP(=
                  zA%Ae*qRP~b-y4B_00e33$O)}EI=Y>$ueTy#mnfF8N({6x0MpLlb2gja`?}AK?ElvJvl4#szm7X)<_|MtFNRY-cC1w;&LQa?I9ca;-&s*Bw(A(9Tzv+GS8RiS5H
                  z2w+iHGcZovv!k#7psb7F;UUKFfVa^Z|@gAijEqrptOHogQXOym^MC;HD-uaSv`PkxA7gY%GRrC$^
                  zWuByBOZlZ+C)A^b=2BBziT#^8B{fsMM=uZVP-wKw4W1=y_Pk_+$XK%oq!}1xQ$Y?M
                  z@69t5A_}!p*wr87u>sj8Ng_7&c_HCWLve`gU+#SGQ~0w(2TH^4aZ_c!bg>B7?#rvS
                  zLjgf`je?=dT{^a#^68>A)x!a+5D@KQo0uK^OBgv{sneg;wwR2Hp`Rc9D2ZGU&%|6d
                  zo!s1N3+LxZ|E?IDg?&XAu-E{FXRIrX2TrEHQ;xw8yht?xN&)h5SdcTbTP3|DV)gKj~fwfbUV#
                  z^8}!#{XndOHa7*yLR`zag1lO$?b3mG$(ug~C)b1AC1!)K-6To0>OZf&wV#*@CueGU
                  z)c~v%ba-?{*}_P#kx;}^Fqc8ETlFgqduCRyd3E)Nru6j_!OMv@~
                  ze=|)z@=|}Z-H;xY`Mh_z>bRYU0w4UdgSF-hS4cqdH3@Y$^W&wKDT5VOXMG|e#7R8K
                  zZy!AWJsTOa?yZpZ)8f+ThnbTNTs@I@P0%XX74qWKhx_;S)0-3wirmJNNBgFGI4vyN
                  zwy}nKl`C%D)B6#++8(CjE*eRHQpOPmAL%jErpT96lah}mKNV!lf*X^vA7gBm7oXCe
                  zy$Q^=@lu8?MA9JNgsKW8zeF+uug#qheiUdGMF20~bTL=peDqj_Co^0*c89jj^&q3W
                  zeYkg3qKR;&nAshOrC?Ersj1PZ?io-(KyQ4Y>ur38xc4m-6563|%!%wRoq-sC|DB#7
                  zgIkCpNE37@-bJ`MmNxsu?SdITJ2Tj5^$S#6o_;anJ5Dbl))@HMZcSwWmxvs%#)Wd7
                  z$nl!%a0o0+E44JKdKCBj`8^Y@vw}LL;VzTZa8m{~f=
                  z?WL%pDOG>NVszi1KT2VqUi;)l)1%LaBgfh7st@D_EpZJ!`DK2MvvlI*$pbJ&2+7_r
                  zBF>w5;dvd-xe_Dpz&tRoLB-phSB_WtiYFg?{4waSgG|s#`N8V_*NMpf^h9widtFSC8Ct)l&AK5g8Z3Yna
                  zqAF0rOgtT(Z#T{_iQU#`Rgp~MwNh)*9jba~M@GM#;Cnf+gS2kAnwKj~d_l)f7`OEy
                  zzd9UhOy|Ajre^$`a0KdRCC5R!O5mVsiinQK5<4}guU5STvLp&+)G9~ZVT_{<9AaB=
                  zKhRoNm$(l%2}{evWpJBd9&UEcJLecQ$K8Uw+E-7{Ju{QyZfZHkE0#DD#Kbigj(!j{
                  z_x0$obhB+yOsH?_d(2ewFsR&6v>UpwXYbKrB!V{LEh)^
                  zjbOww(u!b9qtka@gsQ<}qyGt5G}rqZYJ!j2Tq#zT)ymI&p+n5&uM^$n7`|7V7w30v
                  zwQco6Sgn(68A*le<&+g^Dmy}$g?cq1a0^AZ~VY_wxXqnUZgGMc7%xkJvm1^W>&`J0KIp!#bdlvEd;$`({o!SnAr{U3uYKiPV0mHU?
                  z&J(q&I^XB*sx+H>K9>pDEwPBl7%d7+GFNA
                  z=Lzb>G^v}+y%e*j^%ljSjOo49DgK#JDr%nwA&c9=+L%<12!GPr2?
                  z$EW(a@2-gI4F&=4{3fP2(sFSvmI?!hjN=k)#+I;gL@u*#@-Kd4}KZs>`YW
                  z*?gxZcVfYbuOOpSMLidHCLGzVp8Cs4x9-?MtmCiIhFOW^{#%9k?#hI`q~Wy}^!ozM
                  zg~6Fg4`xiWW9^!S7+0HI`#L}R%O6B7?xt~rIK?`cMlB`klS_`RG`BQBV~YA)TLku#
                  zrD>fBj3bz?<=+Zjv9OO;
                  zSL|}JLWXB9-mV~$?vtlJqw&;uJo_8kgP7@(Byg{MipRMB8@Od9!0-RF{2x9%M6AqU
                  zpBkD`5fF^P0@sRoz#oHzS15EAlb?Gi$Y>@{LP5L?WShEQjWf%w-~(lbOgyZC+xpB)
                  zf{z%^2?!Xu|D6%AV2thGdmYe}wdQQ9o&UBaraE59EsFLq-bB(_{--Ln+{tA#c3u-}
                  z@26eU4d62CR2Z7i$I7IORLN2Q<09_+`ILg2cYELtZXxIwa^E@1i(yq-V;+g^==n|?
                  zYdiHR>&E-mG}IECPg~~?{8pxs+26@rKxA4IJRNamxBi(M)a=H4vEg2D>Uec>oR+fA
                  zcstI9vpE*`JwFtt7D^7icP8|@Kn-A&(cqMTKq@#ZrAw5w2C%?vyRa`cfe3%mx(@ff
                  z$CISxGIx7tn!*sY*L#^%Pc9dQ$u>>C4VW~lnfN&-P{-q~!;2McFeiD{sZsTyp?aoC
                  zyOG*F54m%$=^0R|Z)eO*-RbB~YC75ECTvZn43Z&NT`073i4>IaT26K?a7_9#ApqmP
                  zT`zb7F6p`m%*w+DK<(4rSiRiO`r8wnFKH|`(GciOvru<(t`2AQ&~G-s&BNh$d5$=o
                  zl<{IVQzw&+GQ8Laf;A@wL2!^+n$g%HK&#>6Y?^WtkUcU9uM=05#OliZQI)H6!diEg7kEI@-K
                  z7alU^HUpv;28~Jf6^X}w!z|*+i2)t@C~=0eTwv6W4)wT;4Ib$igoHoa?2NszY|=R0
                  z2(H0H#8gu|1qvry_h*l2X`MZ8@#e>tYtLx#5Qj7Wb!dL`TzN%;8o)$9ccQT?Yxpna*#}0%?8MT=KL0I;^G-O3hk
                  zmXVt~kE`|AVKvMiS6mvGr&4%zma#bHc9H$KBp`cyyW&@CDckWS#W-&sRG@tJQ7L5>
                  znVWICgz7szuLH8Y0Qdvl``BxY!#M=x{V;!zfdRR~DC%bE{!^%sF_)C~fNNSoaVC8m
                  z-w;yBS7)HontJQdaZzV6>6tFI^{w>`k8sz(EvI47JyY%5nKGxe@j&|PtDL@|CUL*T
                  zAu`a3jfT8ze-
                  zNxdKbx4k_Qux0e2p5<(_stwUfbKvYgSPTKPI=sg`J7dzTytSNS#`){7Pi9UFQ+leZLdrj;rKP$tz2C6#c^}*>A9#I
                  z=bxMeGXs^Zzs5^3xGPo@ayU1t-c_wJ@ZcFPQni)Y?hcUm&>^;%Xzo2Q8BRv?T%mw3
                  z_driEa*`K&?3qikfD*by379w)@5;J_xRoGCP6b|ruZ~bo
                  zFOHcsOa47neq6JM@kM}wCS0t0b6P-2yB_lVAR;jm^JJ|gU0t%zrn)J#g$j7cIq$MA
                  z(v7`yCW6_1*VIZCAI~VwsJCohf=J#0>du~E)Qj_4TNz_SJ`B9;7sp5+k26EH1xWDO
                  zaS*7MG@tNxRs#`WCjQ4lYNIH@GIv|sRMLcWm&N-i<+I07<(y8ALr-0?>QL>O@5$zU
                  zEK{x80{JA&{}MYWYJDbDbqi^ZOP4&#g*}{5-gpzc^1~|ZAx?NvW(ZU|6y>jbD_w~N
                  zCI(Fc?)61=*m&Zh9~a5+^s#rmN4XTVHYbF*A=6*4{n$lIs;Z;YLeD|61?NVpss_bp
                  zeV9Pg#%v>j)@*Kt1^Fnr2P!(v<^2O*g>WN-wDFZWnF}=oY-t@^{3~mngLYKV(N1el
                  z#o5Iyy2e9HDi^iE0(5D@f*Q@a?B_bPh~ygv7D{r|=>I|2<);-rP=~HJS+(2K-
                  z?K@LbQud=GaTCQ4%sUK}PkMjeE}D#B)&+mfmb$upsH?pA;Qn##bze^hur%AxD+G}(>Ydp}b5a$WkI0Y5do@}Poct_VG
                  zJ@wo)vqk2^nOZvfY&^GX$QbkzZ$MtAz5c2bP?fA&?yj&K5pMvGugaNdzeari3iseBkY+jXpK0o
                  zcMH_43ieA2dQHeKj;#~-w?+!kz~@p2HL;~yYQ6XURjDhK$lO&Vv2{CV1>(p#a&!#(
                  zXzuF`o3vu-8(M0}zP5orL==q+ZbCqzr^V>-6NzMBf#4!x(i9~&d
                  z&UlJtM0G8h8nMv9No%`x1;RNr`K60~nqTO)4+MV>HYymb;c^}t&hX&a1#DAqdq^I^Bb-aKndY4>(LAT1vo&!XnVVqc*2re&Fp-f9>!dGM4US{5*+BP8e6qa{
                  zN7)`#la9m(rX9JQ!y*krg-z?YfNF!$m6eycr#WnGaW#hf!o923Pzrgh9@&Xd(Os1S
                  zd58}2xJzpq2ZM}XS&V%pgLjOZG|N!YAt~g6pqjBl3}b@=5{&+3=OmLGY>=bnrQ-bP
                  zY{r#IOx>zKO#T!4n3jfyUH-i>7ty5H7|Tl79st|;k*U|>_vBdB(W!?|F2uBEzuLpu
                  zq3yc)*BE@A-!R}yJ;PlS$A?pl``G3AmK{DEMziNi;d4G|Op??mFR53=Gs099baOoxztNq)Urp`UVX)5U2HioZB&2GKgm`jL
                  zmqjJ|ZCBcSHL+*0lK_lkFz|#Y8=oQkWlM{S!PWj8Gh0-Q{fq^7X3Ef1FMJ
                  zndVaIWEGFiY31a$X?sQ*vyV?7+APg%?9$p7IqHEuLb=p4xsImyyO{w9UApn#OJRNZ
                  zf@HpqDnDlZj{VsZSF_7fth(fJX3#s^I$=Pw8~EWY?m_Xf10acSNs}|uN|Q3E&S|EL
                  z<68@-e8UPAQ24502@G3eJzSf7CBk9xZKq@~>`4lPmZgmU>OIKWs7k3}pm>(d2uMD=
                  zvfR0iH2LF;{Tp=i4HF-TUL0(5afcgRw&4
                  zJkKsBZ}pHvQg=a^L^=DgkPKF(l9Mu?z!OV~O|K~6Ep1o8m&I#ly(=5?e~**JqX!KY
                  z4%p93Q|(vbb%axu8DB*O+x8TmzVbVLyGb~8*k#tX{VTdETW$=*(z9q77(p5)EqC#;
                  ztCF&sEPHpnS@9>pD-pdT<$`%y!J7#`x`7#bt2AfNG(eKy3VrZ51;LBR8whAyP+4vbygUi{S=%R3-1
                  zH5Sf5I%14T+FavUB=L&wN&F11=!~AA9HAdaKecmMzT*@baK5^ICNBEEBnc>W?4Y*H
                  zlI;Fu&G+H!j0TegwhkgfCu=`u)lwz>Wx5&T1<;55);Pu~@a*%+Fpj2QYo6e}g_$Mx
                  zA7gn7dE>vxTl11R`k{ua@I&u3XLW=Y+Ll2
                  z+n43Vf$QrZS~hPn5SxLwbi~YxXipi730HZ=72%zbaCR(Fk0=aGMCkqa2$5su5r+ir
                  zLDxnfDaXd%&EsSCPZPHZTqu~^|495VI;(ST
                  zzd+SGm*EFRHnSqb{k||mURrzdHh+Kpa(L$UncaIKZpbZ41=1I#a7XLNSx=a}YDwE=}$JcMu#u4h^D1J!mk?^ase}=-IssXg2L_9m+q$m0GhS<
                  zg2Oc+dl8usT)T4vHo_b5JWmtU`UgVis5j9cV|gP7GF(}#dB+43D!O<5e1RurZLpj1
                  zr}M_$(OMx?(YE+p3r+r>ENnD-da!%3sbUY$%3*aE5GCEj+?vL5hn4!}+u69IwRvS`
                  z`;~4(dw-e6RO6d`PY2No_6xT$RPL~|*}dJRC05Z~(v+Jh5u54+;i=8bINR0A`0bZm
                  z9s(W#3JBxUTBlAcKEnzmUy|WUfJ=|}Un5I=#`hm4xJSM*LKnt1d13=m+s=WhChSx0i
                  z))~lOdfZfqY(bR~dx<9F5Mvr2{o@g0&wS%QMRJi`lk~^^FOH)kb~)f*b_~W-%4S6e
                  zbKJ!5YN?{~s&@yKlakFpz>Yv*4KiSI;B9XD^scd5Y&xPvICmo#uod^P*nf6EXbnS0Txo10P>(KGzGuFImOoxeSCf&%W~eQ0y7%`MZ3_Ml_DtGiAI
                  zm6~Y5GG%Fs)lp=Fr0Sef>{FQ_rH6YtyHwJ%Exy-nSF$M$y77W{27Xg=(MfGvB+9YJ
                  zA{ccilU-jfAL+Q?xj~mMsn59h(a#GG)=Oj-I)Cda1uJ2XA5OTpKhP$O6Jk=eTc(b)
                  zGH#*~$U(WZc0Q5>HMXQ{9j4^MY2%_SJtgO9;v!rot0sKa`vW+`8+t5W6}Ba;wxPQI
                  zhYJjzm`!;AEw#1GVZHiT_Y5%on_e5JyfuVRB4;QK7*zHG~e>_o1?uQf?}5rp~T>f~|jGZ-T|mrY60Tlo`M
                  z457PqDtcFHpGft}$8B&U_y>9gNnDX=z2!;($)3g=kbA1mihmw1JV6_XtFShmEeF{?
                  zwbiXLL#njGH>B6U&mVGzYQ<+Urp-A0G1#+WfJcYCUKi^tmO3o7ZpC`8aO98n7$s~G
                  z_Oa9LLW?&{y(Eqi!VEJHh*|KQAkmpqdis}#_bZ=vBEG@SR&tE)5Col&&>bQy&*ok5
                  z)b)nD8N)*Yg1Gaa0Pw;Uv~zj?2jfNShP}(1tSKAzvcdMb-_O|oyV*HaGpg%SBl4yg5F(U
                  z2nb#h{5wV!&kymoHiy?I3;)ZBA|zUCfoE;9#qUf0Bo+-38LGLVX~Wk>Sn8cDim&*9
                  z_IRmSM1?UNcH0jtpLU7i7fsH*gRf)bxryj~hdJTz63%ezQ}I@RI_KHLYcVP=row{&
                  zxgX0n`mhF7xcA)ww|`Ycli?x!La(pSkEqh|SQ^w&{e|DJ4)6khLR*@tOTYFz3oY`^
                  zU{_Fh*%R!%9e7L`+Un9+u7TOn7X-OwuM5f8c$h)0n|KWbZE9dkX2{4Gh&m}vjuxh=
                  zEgKviNiz^#Lrbuzuv-p)$a~%;AmhD6&NM$~Y&JD5)F6r%c_?dTca0`HPHv7A_|^Jc
                  z5X*RSMMhF1)&B(wyO`Z3S&yC5JH08~?ASfS4-JD=e-asTokNlSplOR-Ec
                  zA-ylSfvj-7>aQ(gG(P2hEP=9b@A%S=L*V)+t}zas|CTGe(WzV^0N`VGg~&PevyO=iEq{IwTCO#Df}52_`gJ9J;#
                  z9T{#<@79##h|Z+8+)4}3l*yyE{&m4BHroHCIMh!ku7a4CUoJVl
                  z*0ji`MPeeEGV}Z*4gGm*e@>aNm^rcMpg7O~+7f?t+@gc0L3Lvp$!qZv0qH5DtthMG
                  z9en1`kCWR8H*fwK{4<%&d$(F8*gmST$?mrOpZj0Sjm}jSpPjEdLT)z%<&^h;<`Zw`
                  zqYIkrT8oV~2$~Fed}!Kj#d|>ptbUqF`L;Ai%kg1l5g&Dpc1Cg=Zih>Q
                  z2U@)l?y-I1=v&k#c?~#-_P9(I+|sOYlF);O72TDye){wE>wO*dJ`4Mqzse%(Guz%Zo&@MQh49JNPJEDx^*9=n_V!iR|w
                  zGg&+kqZ3-ccKjg3?YUKjZHfafu0yL2bP@dAfd>2suN)@L3W3{jydRD-FCqTD3ji?Q
                  zr8uzHlze8fwYc;SXGENIum7fSE+gZ8#3z*&gS>;D;Y$|BWEEY`C>u7vmam;uXXp2)
                  z^M?%I7vmX^`L1xxlWZ;GJLqDiaYnJ9S|5A2opP1~vSpawa*kcnd1@3dqGW3O)k1*m
                  zpZaV#?Y1JL^vZ0lF<6zSva!v_-(CKX;un(dnBsffOt+V+31+RAb
                  zK6pxR(%t!L7u_VQ*B0G!)t`{oxTAl(xMY#`-s-|b=QwhlHl`klcTpNZOI!pL4Jr+1
                  zLzXCa@dQ!AOdXOvO%j#bxAP&SdHw_|*`s%w?gAdGS{dwyI68{H$8!W?VBhaEw=NeA
                  zZ3v3&zYjkP7@0P4b?y53Sk~#1g}ku)$E6Tq`G@$rN=6)Rn`58o(ohq|ok+|CkDw$X
                  z2zq#aamZ2D`Rd22f$f)Qq}$>W!P#DIByM*;uI29gjMy(HmuOMFqGZ|_Chf?8o9idw
                  z^)#r+;zN~Yb3f1L@3H{%s-kW3ngSVXg#h{Ne$80jX{*_@Tejy(5!Sty%0KwdZ*UNC
                  zaG4`iPV6$AYL)7R8P~_Xe?D8*&heTh=AC9qpe`|%<;t!{wf?UhuU!Xx@x#|RP0(`5
                  z
                  zg2{uJ{!CRRj>0$ClE$7R+^JaHI3#7YuG;KP5Qf7L-{vfuPm%
                  p(y57%;O9L4hW{5=kYwL2;iLB4Eb-rk|IyE?yw!YD@!CB2e*sf%1Uvu$
                  
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area004-v001-MC/word/media/image6.png b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area004-v001-MC/word/media/image6.png
                  deleted file mode 100644
                  index cbfc8ccfb1f2740176b40f5fbc44e79aa12602f9..0000000000000000000000000000000000000000
                  GIT binary patch
                  literal 0
                  HcmV?d00001
                  
                  literal 27153
                  zcmeFYbx<2&<3C7C3xy(umf~(LF2$`BcMTMGDDLjiV#U3_I>Aj
                  zcfb4NZsz9xyk!_By9vo|_IaLmwlWCLN10En5%1DSJJpcR2YAO787{yLf!w~@iqwC-Aiv)TMLg4KX
                  zq(p^P-R2LMklj?paFJG-^R8b>e)D_hanf?V98;jbrXEl6DJv)B+t=5sVQ<1hLSE-{
                  zz1VA^Z27q?^X(fM3QAt|W+uDVEV|U2m(r)6nLFQHPL8dcT(<}RGk8;TqT(&VBnJ$3d=?gRio0Nw4RSKzQzFrb0vnoa2(bC1U;!KAdtkSr
                  z{x@LvW%Qxj8@9yQmxDKODxXYGf}N3-04S8c1au_~&Y)Jziw^b~>KP)(<2!p7nHlo4
                  zx|%VC3#BbMkiKmJCOopz%<+Lz{6yq=Ie)ZOF3WwcVCTM7_a*THuB0oW&%;*Ua!_>i
                  zcQ;SIY^|AZ78=wBW@aJu(EBy+ZAM;8AMdpQlHKY2cl%RkGf^VoCE;szu3f0(Ezbso
                  zlyDcSr#kYh$UV`^JB{^#w)5fVPh;5(g79B5!{lEsIbXh9RD`H8)joCX^66_eF7O%t
                  zpq{MQ>t)8o!eV7{UtHdWyykQHwf1|YB*z%VR!8{x%LNsU0#8_|k){6G_}d#jupFL1
                  z6&+0k_*YS%TR2fQCOn0)I}-h9b>A@f0Lz}+iTh=z;9Q_fIii74Ggh0K9!Xof2v)rp
                  z2j>zT6Ma5#?qYb?Ie{sGcxPD5Xf#@9wwig7NIy*gH-F}0Sj*&c!*l642WchvMjK>ENI9==ZPFk83{8>us^N$6097DqsLsdnb
                  zP1sHWVzq7IYojsJ9r(GdrnB}hluUJrv5t&8`!mCghxK>BR~gr9-CJRqEbxpLaP1=g
                  zRagB{+Xp194&MKr8iT@{dVU<8&iiR^sk(km&fg~a-jY(atoF@>DN(NXci0YE$TZkieUA2LQrG3VR(prr*BU9+s|*2A66?Fm@^-G(T;L`j9p9Fd
                  z0;}l1L#BaYTaG!(ztSGY-(ihWuHnU@G3dFYL=bMWB2y>k84B9dVdFA&ul{2CRhBEz
                  zWVO4PO{NBJv4TIW`kSzN9KLwGPSPXpxDOmKsegi}R^9K@!
                  z;YgkhsWg`f$)JKML*;E8M`L3|By5sbXeTP59pU#rSn2b)EXdTw*Xh83z>o7yR=v7C
                  zZ_MWtVqn0iV7fZJtcRWt$1UJw8%%F-86WnKVtKNd%(D`qw1)nfKxBQ~dB4XbbUAM=
                  zP(aOyou*y=z13J>JaP{FjDZQwJt1UV62Lbx?kaOPD|<=QiT7TwbwA+JttC*k7;g}Had`m3UTXZ{
                  zvwBwwI&06S#CiiIF@rb1`lba5Hcdv4an2O*ecRvvd3)!0S&kF4**kh4=ucN?>`fFJoQ#OLdhLiyX06<{Ze#M#kBfU6Z&y`h
                  z4DaPn?kjB8*48Xf7yEx9zIH#!0;McxE+wM4j?0CZm{7czm%|R{h{p;{TEDEga%|R-
                  zz{az5ZK!Apk^|$?n>yjt&_83<681lXdJI=ri9OOO1O+wp8W{pTLPJ6_Ub$=;e{D2V
                  zV=@orLbeh4I<^u6o6&GR+8jCYR}ieo(_^=i6wAxY%W^0eJMG{5sl^(4ssh%ktmk>j
                  zj{nNoc$gU-L{^1<`+H;@1|`7)SL4%vtYvwQ42`a&D>$QbaJM`7c*|m9X#G&jMO4mL
                  z5s;cnOmt|?>S{_^x&_&*ncuGrFXka!1c5Dws?df{XO*UIw#X=Q
                  zXgju9nVBW!I)l;i^XLx!M<)Ga{V3PPn_H!+C0u&%w`J6Xk(zjC%_b04NFhbLqQoEa
                  zAy46wbz5q(-+~a`NiTiy**A{1lDEIEm`(MKZA^V>zic6CUk?b`?KkS7ilZWvJQ&w_
                  ze_Q_UHa&_~>}3Fy@I&8LOO!+CNp5RqNXVyZ?w+5(xA$*h`8Q>f|357iU2Xs8r)Se1
                  zYkns(G<@$)_Mcl|<8<7TaBS_CLsDM8KXw7?w)gs{Zj+IZ*SXUNg4#Qkl~1QiMEoDJ
                  zlZ;a2Gb7|LoWbz9pYCr*1kQb|7Ks8jXeo!H-ebqYJ>*8LmkGjFH)8nThKB6Uq03^B
                  zHuwWmso_Ygoz9twm`LDL2g+|$0SOn{=JA#{hleCbrlZ|q9&6QW3Ba&_LlaSY3pwFT
                  z(^&B$4Tlqo3`PO>*`?3s;94H3!s8j98n|h&Iyxj|Fr%UA?MRw8K|0?DzZP#!`1R*W
                  z@PTbcQha>Ci7$U7#{qNa0t^dhU`MpyQ1{1oAxMVr=B}KMMh2hnTlD=cajQceuLt4R
                  zvqf&JO{9^z_MMB|1)4YanBuGXHe!loqv+K;ncV^1JCjv$WBEqp{42#-?%p!b%^?kM
                  zhbfo@QQ-SG2Tku~x*5bHm!mFlZOGZ^NV-97r&p;at2+ljh17Mvbw#*6JS=>+QuYTO
                  z5%?5+C#Pl7i3ItFl1Ii5_N%WDwND>q_W@JYqi52$J>_MO<&xT@7{*j|ChhRCgOQ_?
                  z04!3_PjFOqD`Hi%?&e#&Ux9%J?ykpF1`m0ivkiP`-C=GNT@+fBE+;6xHTb>uTNVua
                  zlLNnmA7LG1tf|ABlF=$Pe`#CQFQ_Tm-1Ie6i#G$IS3w&$p{X8PV2Q51Ef-L)cp~`%
                  z}L#byWk@BKz-$;OAl^5lH&*{JI4AyqU|NQy$kFhU)X7pHC>@*s`Uy)RA
                  zrwd>2yv@~`>G)p1*<9fyhtvv1WcLy9$IWEU2?*!EG2fO-*TGWm=loGAtG@cED#nbn
                  z-8Xjcl>ezUl_WgzNPYi$r7nNXl;#bbw
                  z=DzofV)pM|2`Z<23WWL_Xj+bNM=WzjW_>*$&uPC^O(=6|LFqM!vu|rB{DJQD?8>EW
                  zsP9$yodfi?Wl3)-i~b3?99i0bh<;33@W`jLI>E}6aol%~51bIDD!qNucyJ@0P7eD{
                  z>sv;RS}+_ut{Eb8==|!7UsA@EFM!u>lV)=N%ui)1ac*#zbWGLEQHP?*YAWxz|$lLjg*Oh_NOAyE262543_UhJ=%r{4G6
                  zj(POwn=Y)zFIA~6*~|x&nn&}ahoeKzO&s+H>jTwb&yqu)4XNZCj(
                  zI&bNN=jd2s;Soy0ur6lH^#+&Q2#wGtUP2=_dn=l@v-|cBwc!XXg2Jr3P(iAq4N?d
                  z@5rSSPdf&tu6r!{zGJ*sQ1GOpp(*@_&&31Y!nQPG2VwW5M;(7-JO@X%2G@!Z*;^{C
                  z=E|n&mq4!XpP#Ze1O;UN%_w_qqE$+^txB!GKqkn)G($jorA9e$HJ13!L-+A
                  zms{ZR+IKkVMNRs~Wnva2BpCb7u52xWu3X5(qC~TBqDAea6TJ*gy<|lJFBSJ
                  z#(=8=pZ!Q~Bs^UPHPl^Bwnw%*6pbg*qX-m{!^VzXUDYo|_7BVV)%~kkmy|>)pC)~;
                  zygY#8xPH9!fkDe)_6k_blR2(Gq;U1$Ln2e1YJu_jOUL&YJ{y&Vr$R;;+lVdrWy?q}
                  z={IB50H3tvw2{fGmKLJ23MT0x*u_@B
                  z3LLZVGkjYeg>mfCIu^WTjFty`cAt-3zSuUs1kv5+I29jm%h;Kub>TPQ
                  zmW0MR3{XkN&lkdx?%+?aeN__50!i4}He1et!H?PFt4sWdWG#{!NsooM8_7o9g5}kr
                  zDD`}jZ+HX0R_W6+PSo{%uN2hXZ@{{J
                  zxoG$F4K2eGw+Q)CFys~K2((J~nQ=ojk?BWJY7ZB*+ubZ~Ly^>3ZhlX$nA4eJh%OmVmrY@56(xhis>>6v{MQHT1|i
                  zY)vU2o3$IhxLdH?{UrHqvp<0;G3YB>%gY1XLu8?0NWy;o)9PJiK5
                  z{L|!}rHApmV%fcz7uEPJ&jwOAjM&9S1wD{I$`?uJC!Mx
                  z;v;oe*5?OIN%ZQrxt4|Bek{
                  zt{u6;EA;YL&)UNeJpz7cs3aAU2~NTPn0%aB3Yrh2YS#C82MdaGRh!
                  zGKToBOpXZ=tXjN^)1jEd
                  zU||V3R-L^w&Ti|P(tVcouFT2c$NM*X{zHHN6%hUl7XK?CJWDmx(Y{3yBnhocS0ksn
                  zs(8A+>B!$%jhKGf3HwSG{2ti+2jz^&c)I
                  z7ba{+Ia|E`2;x@@4b2<^jJl^hQRuu?FDj(-L2UZ|`slj%Qeh<(jim7{HT`g}BXe2%
                  z07ufLOS&N85HrSqqylUTo34%3>^Hy+#T*-_GB^@-ckbu&G>&udbptY2Xun~~Pb144
                  z4#*Fs?x}S@$vCf$DXm9<(F50smPtAlKgpoZ*lo=OP~nMBJ#4>$F2NzkCw=kGc5b9!
                  zCD8uitJ&eg^ow$>SL+GKVwXc#z*QvS!tmjsQ(7d9jGS|t&bx4YZNGbpuKgAom@@Tv
                  z>{{{1F5vjV^IGOhqNL?7ca(s@`J=
                  zYibez?$e0hNrqFNC*3sw#GUG8{QMbThxa4f3dnuvj{eRU#c{|QM*n4gdd2?^bboJ&7?i>|Ci#^ekt@4s;^wI9_
                  zj)Vc(BdxQ+eMN4M*SnR-s-xK9t#n!L|2vd)(yuyZ^MEgeL6(>N4`w#(*x54l*eECl
                  zqKAxhb)!>)X3BMl;Rlm_Y{+X}pFOQs_ClUpJ_MSxFDkZLQ9R9CMhSv@4TrsOUu`%2
                  zCYVA?*bkeM=bad>86y^5>avFqfsT?&Yc%YOS~^9Lrp74K$Kw$)bP?2I!+C9W_S
                  z-rQGYWoIw1B;4L&lPBiO-3g-?d;Qh^?yRh#f{wc$LX68aZ?K0-dwGBpc(H$yVA14p
                  z-8{2ZV;9Q)@|-4HI{#HmLGN+@B48`n;mUs`wKHYvwTnR>KmvxU|{~!Z9-N%SFXc}c9AP?mvNF2
                  z*Tx8rgYEmiw%6!g5p8*R_QA
                  zhe)M;{*P%}49C7b_G&)Gdp#p#<=kXcc}>JyRrJh}cw{9GH%6Sw!`m}mSxKoL6
                  z*{agMu4M|g$`j;QWdJ$L#zf*#HD0$0mu((+!J6O~Dpb(IfQ$2IQ#Ga^-^h4fMTJo)
                  ziJYy!g5rIzYD_3NOm;CmCbTe2)=EW;hLeuXUi}~fY8f(F5cR?)e@tQHqD+*AP($@U
                  z@~?56{eU3>MCD9XP^9#GBb6zVhU$32RNj^O*>`xOdx`RsGN>!_`Qnnua$Pdc}~r^`$h0;>Eop`91154VUN|
                  zuV|>P{Z>i#Z_D@nSy@mtUx|>8>2!Jo-Vwee>CedfSv)hZVMcCD804zzE34vLiXf6x
                  zN~Kj>zC_xrM_TGf^W$~2o$@0yr3InDruyz{GNso7?G{Y|6#h4d7A?6M{tSRZ{`l6)
                  z?M+o|1KsQ!41_dFziZq4_g}YOAHMg`o*`j79eB;%gD7J2G}Ojeh^nlOuJHj_N&o-t
                  z|MeBPyZ*mg9}LeS<2aY~AC0eH$q%kQcOt`O%Wx+2wXd(bYUyF1u7FIIBsu0|N<^v%i_1DWkq{P&nVHrX
                  zTWmi}WOYACQeXzu-SU%o_;T=5i%hn6>eq`Zxshw{mRG!W%+bf34>vHW7Ibp*%F`>C
                  zZ;*;#lU33k!^7{?eXcw02eq80AMQF{3yhY_kWZFwfJuXOn*xu)Hlw~f=Z-zLLY$+%
                  z(4vgDN*4^bcicwP3PHChDE-O&9C&Y&(nNmjTEBW#pKVjFZSnYP%(bn~3F6u{DqW;A
                  z5v50xQ`iNrmN(cwWaoCILG|%rDpF=Gr0bN<5oJ{n@LhA<1nlOat-u)
                  zK6;eT?W`94dqe%}!y{`JyHj~0m155D
                  zcuYz6Ikduv3Fq6Vx-n)b*X?%gUIlqqAs=ZXcl5YX`i->m`vva5^|`gMYCK4av%hL)
                  z_t43gG3jk^9K*|#4;Q%a7<$n&=cwc%aMBDC7t)2Cp{CSog|2$1E3!bF1eJol6<;)g
                  z*4P05NbT2vr9fD=2aeu_qx?SAhyU@8CZ&YvicrtD94GweAQJ(VyHOV&?lk4R6&*iE
                  zN)O`HKX83?5xqPiJYB{p`|gdR7g-WnWl}}Sa2Sc9+T-i}W}>w?m%g8gxuUaBIDu6+
                  zy_Xe&&1!M@V$!}d;7WrD5QEkzn!%cVy%!JCib91^
                  zEwNbmR+5!W6O$#&W{ZOb9XL~~X$^Jx-Y$up1z+*w3ECVAm%8WWiHh<_65CV9FRf(3
                  z{E8_yM8u`DGi02xoul$bhGV#25i&PhvsatWQzKjII8N}A*1N74tAVEdw{*f%CmG!l
                  zE23P3kF{8I)0#ic*&~hGQuE;x*s3AjG9$Sn3lFotr@R!PcPc{^pCpgQx4wtp-?6yZ
                  z{P=yo<&ZoB)lS#$9vA`9S|l%jT+4)Yr;*1z)5;14L`N^&8At1jWc>cE&}d6+B4fq{
                  z9T^9NAS^F_Y>8`^fTq+I_a*qj-GMikN#IXwPC@|etKhy7y}XRpH{6fvwKG;Q`#`s9
                  zBN$bxb~UzB8O>%j8;s*jZF7Dfj#Q-Ui$de;stP$36NW#f(Y=YT60V}`1@zo9i?TeB
                  z4}XdO*2xQ;EzB
                  zZE6w;>aB2NWxjYA9>Gz4A?4$AQ2BzR^qw37g|R=jZ2i|Xl#(bf$m)t!9i){PTkpun
                  z`zLBT*A!~L2L$~tiz)2NFMwqIDh6lj8Sd(HsS_sdN{=RHVuECQyDb$ypt$M1Axi7b~sNk*d$0lt5&~@%l
                  z4_jkMD`)nO-^3tvs_v!GBTdb^wK^J=oEnkcAv}9U
                  zRr#mG%8$L{{!f&YrbB#2IIDO)$v6AnVAb|uy_Y!*vIEh6{Ckj!e6*OhZ*+HGV9BaR
                  zqj|4S*4DC`oFFG?ovwN_J)|&Z{ut||N>@E!Ptha=A3=FF;fb6%xw9)zKEY8le3RED>7nmOZ0nUGbZK}6LV?GCI}^99cq|-W0PUyNrYKV
                  zb2EqG!lkd_N#L$!2zmi4&E9A2K15vRWkY@7?7c&{C^sfDPfWr05+>0_fq~9>Bsl5%
                  zf+(`aR{g8~Tc-{q5skLj!i?yEGAb%To5#a^r$%wU6$W{!chK)%G<=V9o&9T4s0
                  zc$fafj8T?kiB0%@nIXo(8DV~*^pOT%!Q41cFKBMBk{Du$eFBS=p4-@V@lE_X@K=6m
                  z#&A7}V|++4Phx<-zwSGmfV>WgH11_DscM@90RYDMzhqC=_(j=
                  zu>**W!djC6>FQd$Wd~?=br}{JNZ0NRTNupzBz;3umKe<=vm2B
                  zmU7%MF>00`IQBYUenPoC3=@MmbTp=(n#aD*26Kpokm4ZmNw3q74RO!6w%>TV)&oSE
                  zjwG)W@=j@5sih=ym_TwhCXwP7zjLDgQc&sjkXGTqUxKOQkre4}<_#r}=I@u;5LyWr
                  zWD)Thwuvkf7=m{L1#PW*BktG|%LQ(xjHCOxVE=mfO%Zm=m%&ox%hVd%bUpP4nQhK?
                  zLh#2C)ucEyLHMOz+c^$yX5)x*5V~YyNyOOzITFpY(n#$PSYe)|h4T+`SpO8A18AU#
                  z8FN2=Wx+PFL+iw!AFN(x=QOg$)
                  znMl^s1)6djOrldR69&E~BEcOfSy{V@(he7iE0}MG!ZQTID8GF9h=_bLdhp@wtp9G@
                  z1bMAoqx&AUB6*-K2S(cZ)U50PLp9jqFaMDAB67@vm)O>SJ
                  z2&olI@~+vRTTImDk@7rEw_+3B99KDCeRw2p@Je@{k$-w1x!K&1zT@Z&QWce!Mx~q4
                  z%mZ^JC5C2tEQNIsVI}vIkx@D<`D8*MpCCWSJG)?bJSaY0o+)2iP6A6#sczSSH%>EH=3g&y+0g(w9j9$^r1eN*
                  zP=p>v4#U@%QCn|Qa#ymf->8~|#2bu1l0)ywpAJ5TtKs|C9#}{k4>6p&W~+p8bm8+B
                  z;KjW1x)gq0WA!n*_=wx-2I-K$Kuh5INWIp{R4g($BCK`ZMYsF_p}$6Q&(rLHz=cdFhRIUZ*lEOqqts4^MD{B1qe}vpy1of%*h27BMY78%WqhZkS~%Zu@#?C
                  z#DiM(gw3L#-jZC~?UQk!lX4nIm;6N*R6zzrX>)r?p|WsP1-aIGw%I9R@7s*7d~IwF
                  z8O8YJJ9dh>L@ibne2h)+(fh4emsbw5j#($w7Mr_g7Ag97x>5QZ5*iH;zeD9F(FwWK
                  z`AT7Ga#WNAIdr~!ID?x*8+W1*u>ex@T}k!&2a^63^0|-rs}?^L8w6uY17-gZHxT_H
                  z`7SS5hv|nOC(EV-$soZmf>S}8vEMx`WqoCG^o*DBB85K!a4#+q0;tp#dlH{J0b?bA
                  zbpxY-Pp@k5oRH|7&%1Fr7EET(#eMt*B4VsB@;^r8VSG-X&xR#Hhv7pF@Vfuo2-*Ld
                  z3;1u0;BtlRx+eNwOgk!Mqy1mnfl20>>T!#{(rqh3?uQ~5m!JpKD{;Z6p?Esh1b4K>
                  z(%`}oI>Zwp;0ZSBz?~vBpW9*T$}(FSy0dL~Yuf&BT%Fp`U+H7?2C$kGv%TceNWOmr(cLB|
                  zjRA(n2j=xqAUu|w8OQg^^{`GYGj~O{=vHyTX~VQxa3*Qc+R#}j-4-eoRDVN-wy#HE
                  zHoP>xQ@d#IHqfQHJp%x|zpeJgd&fxfWs*grEY9n)p4ZS75|iL^WSUtj!7U$ds$2B{5;9AkUtOCL*m`Sj2_
                  zkCxxn#EHYUVMeq$m+2|L78^7YDX*XR<}0IHXGS}TPL%YB+JHQP-HtqV7~s2lA`YZP
                  z1@7LRdpHJ;j*%16m7EB#a7m}wV)I!p<9jpwB)SJCQ4QC`ypMRTciVsO0&0KyGVLHUiJ&IMkg5YR
                  zd=T^HU4;7DRzd?GA;cU%gyNUL<%;FB-ZbQ<4oy~*6ZZS1KS^2su8_%A3d~Ix#N8RJ
                  z*7X;Yp5pUo4Ul{itJ|&(ak8YCYSWmqj_^?G+?&V}*|;8=+(ci)xd78`#~&BdrLzzr
                  zqG!+IPXkFX1DnaiS?42L6Rxe{j`4R5o?PAgx79m2&eN)0Jyh$bF@)UCyr>79n-aN5
                  zLHFxv{5bi`NoCK=Ewn_|yyZPRnQHAfBc&UW9w*YZzRGGcTZQ|=Eg6}u;Na#4ok~Cm
                  z2j;Gb6<-TKwV?}x=j=DcKWcsu=r1F|nvkv)(Z>QU2wQJz=)#Kqj`yd&1Ns7rtP;+C
                  z5f;d~O%(uIR@!p}`Kn*3s6G`dat71Io&QPN*fs?RP+*1=gK$9m4DA_=M{uJ`SKpsZ
                  znFP}?YY^*iEeN)1Co7Tfpk;|*(+47655)ISfiQ3(5opWex9rlbPNdnRDNOZtH&oB}
                  z2Z92qph9`&w~Nm7?gm8!Po?8E2imSW63)~P{Yebm$=#f|uEIKZXQpH=c(FnI^!6r@
                  z+x2PMd%^58S(_bu2axztg7mZf%kY>!Tiy6rFJOhS8e#4`W8P;4_$);(86>kY;z4Cg
                  zeOLZ-rgJ7uKx<~yxn^bDPrsAyZg^APk={p
                  zu+@BSh}Bi9rl6{t<1WOc9oF8}FJX7-MpaVsaUu&ckbH7UKW1%>Q_lR|K_2%F`eZ1T
                  z5@b(?>JPTcE2fKO)iD;zn=Qfwc}C{{XbdDJ1yVO2fk(Kai1TZum$;noh3g=c~^IY{Ym4awy1{xmv?vQ
                  zi$My3bh!Xv+}@!!I(LBN+?}ArMUt_MqO%uFbBy>(q+e8)WV7Dn>dZD&rr+KIHc=ZM
                  z==0E1Lw3a}_1lRiGn6tF^f&L_pW;~WLHR`bOyI74XLY+f*%}M~B)1~(=rX_fU=fK!
                  z;m$kvOCAezz~pLNJb=%)Y$Y;nSz~C+QpJ(q>p&}@bd-k9s}%mBpESE*bdLH}fCTVR
                  z`9Kj#x?2XLBX@mH2=4}T1#ie&8-nYj*YP5golEPCVuHA`CTuXZSCLdwZI*3=96!89
                  z*LEO2d7A?;a(xqto60-0u3i5{6-eCBpwDOAR;uniJ4r#?ei8#;`gNPH*W_y~iGK)I
                  zY)PAOf$3RU@ok}y&gL{P_od6r3){l+rPj&i=UwK1l2a=YXo${|+PSd2BulpUYt=1~
                  zuiRtWk%Cnj$zGL8pWVUTyt!bwjUSYS2h2-%p-Ql=Hz+OTFGG}1RrJ=C^bUJ}y=C=y
                  zih`zfeT7q7%zpyQvsS2KJ=*qMOGwZbp*oT77l*ivv>v=sPpC>;1j2?LwU!Xp&872_
                  zsr9JsBenf3k>+W$_aB)Bz*@`>%05Dmcy&k3rbSt{J*8QF!iDp^uAho#tQ$G%Gr_;_
                  zUKWr+=|YSh9BL*G(yCX(d6v{6{mRB8$3HPw7z+c+`F_ls{)(J*)<4%_;pK;Z%*cq`
                  z{|$P#Qu37=o;11NsYcr=QKA?_CjSyqL;m*_Jyvl*2<8esSmCt5T76fa0^n_jQ&N=A
                  zsdd&s#(MiP7A-uF-}h#(o=)-Q>Yf3(&Ll!mZ5~PF7Zn#R)pXLwoEgISjQ+`2`23*AD6@P-M2gTYdOkQWb(upNe4XM*gN$uEU
                  zvnfrvp~>0rwZ~NrGF{_ubx=zaADne)l7TVFx-_4lb_x*EEKz&g5A^%)dMs2s<4=KH
                  zWf@659r5N8&(l85cMkR-Q>xt_9gEofXz^hn*aF09-1K_L8Ch9fLDX){A>8hC%3SBN
                  zamGH~=Lt!pIU0UEpQH|M@^>cpegF$BB|T-Y!gt%wI^vme+oe+P`_mSOl5Ee9_V!Yk
                  z{65Mnk~-0M$&vyzOANFM5`Qw|4x`KTsw~FeJ?=iDVrsX>A0#d?P0U?DoYXUo!TDoJ
                  zDe)ti6FA-BQoKH?-bgwb^jSjMw_k-+{DY09yc~G<$l8Ym2@4chYj}Z(%WvDl8EOHuC;ZZ_=Z3!xx38j^(9)$?uXdzQ$@Suac{AI6qM6so{#MoX
                  zqMzKmlg31~i$2a+aJZCN0ujgmc#*hZhr>EeLJTseYFR8ff6u*BBRD3vVMawpr|E(*
                  zU78rUceOrII5{@=&i+m|{+KNW;j_RmRF7TeV;s;|Y4XpEe=2iJ|6Cu8fRZjR_hDkr
                  zUnh%%Z7%Gk-Ksm>KWx9^muB$PS;iTyJsl!4*RH3PKfARF($*(EZyAd4IqoBEB=`J7eWNBc3
                  zmxc}GmfWh
                  zEHy$VE4^P3sU+NKog9z;QNs@;*Z74w)xc2h`QF@5M+H4=h;H}$-y5Ro$GHK1+r3QO
                  zv!oPTjWgIy&^u?Vm*)>Hj=BS1_Gs8*&Y|D2Mx6AZiV1sKi~(2^cyZwaAoF*@K}%yA
                  zY2n%`z0?ZF_tzq=gjE?VwP+J{kGu!*Hj-iQ=@4`P$+FRjp{O@7PonCWviA_;A>WfM
                  zDJ~rl*X*vHdFMzigG8hJXJD1K-$fFpEt%8_2!76*a`NNjJx|>=%k+pM)Gf&*gdjvs
                  z@vZiKQNHp-jrvQX(wV7>y~2s?arG44E}vEXSGr!-xyLYi(4q|TC*?8I9&?y53dkx{R#PhB8A
                  zXBu>=kyLfl3?$vg8B+lHzsLJ0Xkb<)y{-7ZBQ(S1*v5rdjLAgN1OL@O#YK#E@!G3~
                  z^_~p&cX9_FyZ?|LF@WQ(Sm_mc|MGo|npkllq3wZHiKLXXX8%S_53c0aO}BdR;1<{f
                  z9}Wn$msE(7m_*Hy#X=+!xgTNn>-xAlb^BIei%*S34vLLfoM4*>2NTESq%(k$J9q9r
                  z85w~IV|;r7m7r>0*CQHmXe8Mk6OkPuzu5|A_YQN%TLM9Vyvslkbc6
                  z-#${;f0zk=_oYU;5$0-N2SRU1ycS?KDY42mZpye4*GWW^1%eG0Pi&GY(vq23HF?x5
                  zF<}RqZrY9JTqtNAs<2MBfRXyIl@i^kJe3AwrT5$Yvlu8yRBy@4<0g@Oo3+fGWXpYd
                  zVoVOhJ|jp=NkIdg)s-r1cp3U}d0RdvIlUENnfS6(bG(w!4p#01fw!-t!t3OvD*Nq(
                  z7!_2dUcgYOMtZxJO(MicUKM-glj`-@=5vWlS4AJF-kS1|>6R_Hy?)`Yb7FZUjk^!P
                  zOOZcl1e$-y%bhP;hLqJzU*ZEYuvF2|LDhEGO`>eW;PY5!F+
                  zffrklcuz7vT0;rTZgorJ%Os}t!v2#I?SwNtd=s|8d!_DEd`!3MnyCvykPeNrO1~4q
                  z)c9#>UckttI+|3LWn5@wv9fJnRZ>NL7NM^~H3LtN@phTY-T0@y5>`3r$PYin;EIDM
                  zHS;r>mC{RpY3MP~BC)%*D7$@ROx>AC+8~}Ot}OMiGZ8mt7!iF5{9aF6I
                  z$dBngm=~pl)b1^Kj6f5`rM*AXEQR25+*r_*KRB1Y5#ynMu(5fxRU}{VX=x=rG0{S3
                  zi=8DR{SWVBJ=4$4n|A{ARHfWmdY>3RM4>x>X!_xzBA|Jfv?5zJO7FgN(&^sm!1fLx8b?$xmx~;KgYHe&hR@x*Ns8%U
                  z)Dn8>v>q`X2?>#ci0$!-Pz*X{-9IOxB2m%8MDszM`5+dA0?oK;LBtYq+23*tIF|F
                  zu2-`$RTBPOw3Zhlf-P%k~##pL#ung{#~7ERF!RGcdiaNxt(pza~ZKfA%~{WK7wOE
                  zf3G`_CD}1RmCo}t?g7)P{yZp#E;``P_khaTY8PviO~=1++tW!)3<9xJ^$`3$C*Czsk1`Ug`*j4Hmp4?G6+#Ep)~w8>^NipuprMeF}ACWBhY_){Pu9z}EZT
                  z%K!Pj$@&U8E?4usr(@%Vo>%MNDNtM#+Z(tNxWYXJJnU|Y_#Xci{fu94QPJaXh0<*M
                  zKu_qpdU;sXuwfq#$N7P0CI&nCoDP
                  zpvivObCm)6DzSaQbo@LU82@RzxR6#3>0*FP3Ez^!T?HR5_duG{3K)@Us6C
                  zZ3ABOD;D{A7U-@V`5v6@!@A*eM6|NJWr%TrvUfg6OW`5?XoMdZLU@+U`^eqValE^-
                  z))z(t*v7zpFcd{hY;`7mO>uhV;I?T(%1z`Sw&kEdi;Oe6)$p?30nS-6r4z8Soi;pq
                  zKU0#mXKKt3l&!-kJ$Z9viw}37yw+q})Q|rz0wv$4dmwA?y>JW&+uOGQ_Fn~xA*Al4
                  zCUZbIc9%~G<}+Qi{Tt}cWq*VJ;&$hyQ-R@eoxQ6&K^wZ{<*TF5dWr9vu_r1znEXAp
                  zX_W!!{z^>rxI3HN18kvudnChGZAD;acvu|t-RJb$QM~u+^=0$hBtsUB+NUiV7r+H>
                  z@99Bm@%%U=#KbAl0tTi_z!ePvh;cUPqPa+si54h$1?c$-{VLjh^~Ew4*V`lUYn@e4
                  z)2Ypp54zB^3-;Q~#%NXs^!N(z)YM$ScA&-xXzpsOpZmW!-km9ow@J5MaYr{B7T<{4
                  z!nNCTV31BY9ba&L0!l5%t+Ce8t1@h886+6HbGga47`;u`KR4E?J1wax*MQov0jZiO
                  z&}mkC5kN$#lU-s0BaU8h)+xW@N#dcbHiT0@J|!nN0YxZ;7G3&^rcXXMd)&t~1*;Py
                  zn7h`cfWmFC<~j&_GVCC)vH0kxH_6IV6p%H|i0JI6kBTR&L&Uc74uL4Bx|%q{GL`fS
                  zW6nw6oTAqnz^u+!rP}7U&5x$|oBc;QI{>%%5QcNs(HNor7YHTMsb7v=-^4VLr}ov|
                  z?l?@}-}RJsJJ;<3Ez?RzBR(7G#nkCU=0d{-&{vd8O&_P{
                  z{D_+>_VhcAAMz;iI2|zOYcWJ=LFCN39=f%8BdPR>yb($JtJzRgY$9T7R)noqkc3wFKB;*3e9VSF0M1o9<0i8hH3bdskL+l$%%lLhGCE8Bt9
                  zNh(q;KmUN}x&nQ$A_NA^#^xG%^kv!EUx;(fw&`xM~o8Q9te63wMMAsEcp(W@JkUmd_ukjFHL3;Er(olOMS
                  zt6RR;t>R
                  z)6|k?kTrjK6C^g)uOc0FPv5Z&)q#!e@)32`mF#7&JYE&e_@l$A;wvOfhTm$8=h-UP
                  zwQmGJq5xSc?h*uAxS8GK9kF-WU8|C`FEdaeH`l$oW{*6`JXWyYzcjkpPtA1$>T!1$
                  z(MEQzhZ*Xz7+}x}>j|GCZ=4RdW&s~Kmnp~?aJ~xrEu;AC0
                  z=#5=)S}h0Jwz`TeB-+n5JqP$ye8=MRdbECn{eGsjt^IWZ9ThpR2glQVX&qZPhSJ!u
                  zh0aC<3`st{PU&DM=;jrnHoATHYE-LQf+5@SqP?(a7fu@VG%3YcXp1-_nZ=zhjmRHd
                  zSf6`xz&Z<0%8q4L@4@n3*3AKEeC-j&r*}UJ=_Up4T6|jPSj<`p0|Zn3tmc&M)^g|*
                  z!TiCamcE+AFfB-0rCq-m&YQ9+*vaHmtFu}qk->nk3
                  z&r;}xV!}1Ls5n7DjMuI9q`h8&U=laZyV;F%9EnFwluyQ)Ogg%+ad$qnl)W!JoU~^d
                  zOqvPObNvaqer+}1sPmdeQ8l|)1>2s*s
                  zJFj6K7jdV(y?0`vFR0%hD_~LeKyspwA}o4|S?xXud#gNgdY@@SHdU13LO_bEs$#<-
                  zrxusDh+JwOp0XZ(QCj->tDLfVO^gLd&XRFq)*^+1JSrtaJubX+)+pxH-FLY$wRWs`
                  zr3K~|```kcp6lI3zZ6~o*qyah3F4>PPt`A1^&G`JJFBbwO}Q$Z-?F!GP*!2)@U~zD
                  zhoq#G>=AN+;_TY$6^M$-5pnp|)BC@b_mx3$L~WM|!5KWbg#>q(03o;pg1a-gySqCiK#<@%xVr{-
                  z3xm4{cZY0~efO)~+F!d>`)jABYPx57`dZ65&pprSQ7DDN0O96?1;o5L)hfFG1ch^%
                  zt6lX|OLO0*nwIP{?t{N_<|KXJrsDulMQiF1ia`Pz_cysKsZV%?)uCAtFmK
                  z{z%!m@qmp)8Irl6ANT+*ITr>xSV
                  z8qspo+E9!-{8&l{y7G!BPJC23@@DE{8CMgdTIn0;5rH1IW3@5Vs}~e!3lvB)!JjJD
                  zMOKIzy=Oc#s%zaAd_~=Tyej&@?FZAMtZ!HvTwOxAG^rjq%al#GPDO{IFx+mv_wzGB
                  z9YgF1=-?dCqOY=EZGAfE8gNb{pEWFz{*a__v+`38I)Da6aC3Lu_eHa))nvL
                  zMXx;2aZ+vzB4iwzO4h{16eXbc(nzd_vm3NGG4YgoI4N$LqEtT~@&zq`#i9X<5jPo!
                  z;sJ_z{FGbBO%u@vY%M?wU-~|N5om~n7?ln1Q4^t=BudAAQnuKEjX^&78@G;(j_s^2
                  zOvY=d=q7zaZ01=z)Le>-T$lrTh+($yUYxu~70G~t{t=Dn15Um@B~DP0
                  zdG*3IY@Hwzog!^XJ6Q}JTe#9Hw;E7m$iP-Ygp3!U&^L;bF><7qp2&Zn(6#SqUbfT3
                  z2veUfLyt7D0i?BMo;ALSm+c$uVuAL2{Zkh3ed==(MdZD(+@D&%Qo=Wk&@&ym&Pmd=GPAxbJpJL%_Eu_c0bTO1xnh9C)
                  z^!D79Lb}4UVz%adn6&jTc|TzwP+SOmS6sOisgVpHq#so|4xF2M8z@nHLkTHrB9AuI
                  zOj4fsl;ofI0YH4Zn@}&Pc7r*nwXoj4XSP#WMMzgCd*#z;*xq@>xY%cE3j5da0s#
                  ze{OC|*?tPK`{tl+7j+z6!G91zfo{zLf#Z&3uKb5i*I4p*g$j~MaT2CFUlALaeieCw
                  z+Bas+z-+Q$jrzOy9xgEPwGiC$QSE~)(LBgdm$(YQ5S^RkH)$1>0j`qizx~l=*3@AA
                  zT$prBvSMjfm20l=(RXkk^=vbfpXo?cjB%Ksh>A6copgFh=2014Ae}v0D(c+I+ZlP9
                  z{aouIQLpI;S4@GrMk+gzhxoz&ggVW>UsG62F8zTyJ&)lBcO{uf;-SE(w$lLciXccj|JJtV~BBd9JTpVBn
                  z0cXR6C(L=)P<%!qgk&fsdQ7l7yGaw!-5Wfxcii@rgp_hmo5ttB1SFV*0JB5BDELJI
                  z;S_b5-6|6W4`6L*)sgvQQ~_kRWSmwKj;%RX+#3+1VlZT;cu~(7pR1Snap}VK3sFOx
                  zpFkCss{;E$?S@(sScL5
                  zlhR-AwwpAg*VVnR$O|a-1$mE>tPUl#|$G(ppLa7J}4S1mqsa;nkWdBagNl4
                  zbF?xo;_WvDAuy{c-bp%_nZ-qQCqsVZ1`rVu$W1~qlGX3`gyD^2YuCn!v>wfSJ!nJj
                  z!VCf
                  zCOne#Ml|n|*oR6Y(*#e-xmK@79D^TC&%;$3Hocy$;}%3VV5ggWOUdk
                  ziS`q|m(&M=Q7+r%BIc+8?jrY&
                  zgon>+#TIBChXL-7(_@f@^N~@LTc!Yp3nqdSgIvN5lqj#}P#`d%?
                  zc_q&V^KOVQ-T1#*ZT-(WDFF&T(txP^yjOtZMfmD&M&I2pWTspH=dQgX=`+BU
                  zr45`1=z)s3W;W2BjXE>B#*c%S%urz7QUW5jrBGwnh8B;+`%`{8HAz
                  za*sCm_S=%+q?Z`}_-IuOsc1Z;Pn7%nj`HTwDqyaAw8#kpaqMhdjL>x=TF2G`ib!~L&-W-XpXCr@iGTYkcP|%I!
                  z8(mnD3Fg~87a-X1lA6xPT`P9yz&moF*PcZXk(e0?B3L2ba1_dq6
                  z_=m$1ooj1*O?e-@BKOz)PS(Gf77SR*@h1D(l3;BWBI1>>d8VG}0GHVG40vh@#
                  zQqRwSpSIOPPoJ|K2+Dn*3QB;an{MKS>w`!C5lN@QS3qyWFbaYgIJmW!BK
                  z^3^RWfhU_&52;Lw3rHfs)^O+Yv&`Q+(dJ?FHW#f}bE!yJ>RE;#%mm5bz}E*I-Q6d9
                  z58_{3<-`dHSOFrz8qWCBFlhpSIu9Xd*ta%%a_Zc!RUBmXwSW9+d312XN$Nh}|+C6V(T9
                  zHPeqj($g)GTfH$*_gnNgcUD!1qk&@Hg|WDU_GSiA#wg1$c&w6;Z;jmQkSnB9?tUSu
                  zYor()()dQXI}46UP^Ogse7G~GBo+r%QhzBjT*v+};lRV>_#`3oBcUn*KGk
                  zdAuz2i@7C5p;0y{{bm^5dQC$HQ~vELqvcm&BeK@wa^>ySsB!s~C_od)DbOFZu8sq4
                  zMP^1no|t)q^2t1?TVi7(`vG@u@n`pxa3pkCYm2@E99wpG&0DY|>}IPnTOWO-vZ^DH
                  z)D7*`bhqKbxam$AA4n1bDtY^5f`8*YfL0bMmBSx&ed`PTT(uS^Hy~f4EX}L696zoL
                  zhvrgO%cA686r0+U$3Piztmdmw*+9ulSu^l?1wm(=m7Vg7Iu7C9gRSvG3z=2LFdYcad$Fcr|;B$Ncxb&{8!ueRMjiL4Bi#=52^@-olAD
                  zJ$xKR%lbJs4W4uW&2UkZY@ts9F10BY(V|
                  z=R)2%_&7$Wr)ly002`;4CJcD&cJOOu7By`glL&v@%|1cVA0
                  zCnb$+Kw;K%CVlguB7WIxv=Gx%N^m9XZUx$91W})1y}7BbhiK-*?n9ZPO*3h8&(WW7
                  zL-U8nHZ(^_U^$#6R8^UD$@G-AM^o@ZNOfB6Pft;UB$oOrlS+ULKSDhpN3@?@dLbz(
                  z@XXgYVxje<1^22I(S6NixwPnJbDgNhdyg5*bnp52@P3^T_a>GUNw&qKb`(>x_&A{^
                  z*j4wWUQITN^y4xKh-@$Bs5rX1dGM@>Yd04yZ6z>_qI#AmP0m`R?ACPsQ9yDnfEy~3k!^-ld4sBFRriS=#y_0MCv-uA84#r
                  z-EkUhOylCJy5l;FAsXFx8TOxCHmKf@QRdjnk=2c76cg0MfHxWmE9)kGaoV4+`F-y1
                  zzAx-Fw>VuYFK!Rd7je@hIn*m!8`mqOYxhAdT`LVXDY3v@h|hW?jfqtXcO9h7{>JoU
                  zA3l-4!D%Btbj-a19kK
                  z#1tt`Y3F`9uH9siDH$0N4!E>MJ61l?Rec*BoJ=`?6B!fU2)Y#fKn^eOPkXo(<$
                  z$$ZwCoz8>La7$iLo5JAYR~mMKr3PZ{{we#6;$3)n3WbBi>4Fx5l%#g&+&Ac%u%KR)
                  zk8=lGC5WiMp@3Mp--UD!IvTp)76m=XQPEZXfmT#BZ?;+hqw7xQZGU?s+I
                  zbhEFE85+}Lpg2LExT{tMTl|oi!==Y@71=P~sY+9ElU&K-R*+G$j~$uhS5IWm$6AA7
                  z@ZAq*RV?M&(ZSFBgjD6p@EPy%Css&q=)(uQ&&D!omnG+h%dyscS!BR;pTG^9kl0CN&^P1S*&?0_ZfpK`NcbMM;@$S_^;^T2X>E&cv>~q>7jEOEO
                  zf>(C#kU9Dm?XSIZ9{1sdFnYiazFbz#K^7`s=$QQ*3Io~1$&ETS;Tu2DeIyXHX^txS
                  z_LO+zH*bT1IdUi`XLyO|8z0(}+bW=18Z)Bye0Y;V&YFD_MlrE`zfm!^ao*H!=Tyl;
                  zFrh*bq6weST{_=iwK2Ri^qK827-`;H*1E&$3Maykof8Y%@$i0hxlkS9@Y2
                  zZo1^eH00O{OI951$wfq`=BTiqg_~QXhRXPCQK7AH*SA8jY|K49ike8iZ)}E`U9gqD
                  z68`c^;fe55WAVc7QIamia43_fKIDAEj${?kz+5Eiy@I
                  zdT#5A2FJ)wUxl+zMvPhF5_KuNzI%L0HIpEcAHfr)meN2!D3}0+7B@t^00F8X)NDGw
                  zEWV4TYjMASAMLaqZ1BnBL<8_dqhbYajt3S$`zK=C1<6LH8`ke|x2IkA_RicaL}11;
                  z_VW3`;{sanp4YwK5o7xD!sUjU^?(a~kkmThs;Wys=5j~BxpM@GsbUF_l2$hCrjbT=
                  zU}8fOXnsp_vZmTMQ%gdS806GkQ~q?=?6q6_PT_k(T0Y3Y*>_iX*g$BC+m71juK-+K
                  z22)u=UJ>>%T`UB_NRw^TKp0DOg
                  zFkRVYmtWUZ(T2t6=0`BoFkL(C+F0j{0l4cfPQ{4UKo`{iQ1jDDckk)0>K>u~MyNDJ}e0LSq$vCfnP!MR_+0e=T
                  zzVWy}lE;G|&D7kAH%1I;M&;WLh41o10pLNd4EYiF!@%5WBE@1PQ^_
                  z7P1tnTy&9?D5=R~^!+;1J_}+5#VKTIpDC6neIIlvTuvf6b;gxAGMSOogwjJ}
                  zdkkhIs3S@%ER3mfdIq=ufLzYRwNoR!^}$QU?(QSW&dTmQT(&I%wyGK2I>W3WRn;Bo
                  zgi861wfWWr1_Sq1%F5_W$L{cA#Dh9d1FLw<
                  zB9QaIm0MkbZK3L_DxOBbJ3_{|Xe}H(L_ba9iH$|%PQYIMF(hgsQc5V4)uPe2-79AP
                  z*10|j@~HeehtQ^Z3^t43#r)o`ng*u>%WmLvA$0}c-%~YGk6iywt}bxY
                  z4rUUbjJfng9ui_I$1}6J-EyDcyW6sbV0feQCvr_j%$1h5%{Rjaa!Ab7oaI)uAl)jZ
                  zu0d%y6E^;3N5<=zR5sSH`CGw(+)7F{3H^mEjqS+?t_l5qzjK2MW#%k5_6;vO9p_s*
                  zySnkWG%>ClD=~L(GeUz8*k&yfcJnH$PP5Lqzy210=!pFqjs@H1Wov8jaZ)DX>DKk=
                  zQf{*CY_J_I$I^_l`cxDS`Qiab#$Sh6sj7rAJ_+RsIyrW`QW&D98OE!OkS`sDYulJD
                  z3fMgx2T$l)y3A-*Oy2A7b
                  zYkxn&=wxx?AAO(+?p1p|=eYKf3gIu+8-TgKd$eRpB6oAZ=PveWf4VLkE(sk$dcjqQ
                  z*z070WUk}mAJ!2jy=xj%Kw&TVzf1IXcg@u2R4d|Oh6xpLB_+UkDMv4`Cz;>>h1wc)
                  zI0N<&Z61EfFPj6T++
                  zx+fVi7S>10QQG1MDCl3E^BVK=x3ipgNAcP1|6(tO0zkFI2Y;S)pr{{s76Fpz%QFHT
                  zP@mwBydZ3jj?Q}vrawJA9fbhs(X~~C?sNDw4CKyVEtuVjy>!icnTX-opG@RbTsV;(
                  zA0ta>c?Xr?-(Ef6*@xqBW&w&~drWXl+9I+Fh8F`=|(v
                  zOHfDfU*)L5bCqxSyghnlHX3){Z>eI+42Cw%!{h`}`hlzE`oSh5I=Ux^?MAt3I}3SB
                  zdC>v3jqy8xE(7RN9Q8`co!x|_AK)N{!`JkU80k?+;NtED=}5T9aeava&bb8(RwsE*
                  z4ogMV^orlFUr36eZ4(HHQB0R@21Mwh0gx!bqQ5ppLh5rqIXxd9XGv05quQf^B{;^I
                  z{yp@{aVH~yL}xZXklM;>6pBppp;h1^KAy*cpOo|Ii{T+;pGNQNU#B_Sj!02TECTWt
                  zaHXXj$U;zuFn$%1zcTegM?5Z9W14C*mFyWt?jRIbX$i+VmtDJ&`ItOzx9~R0V}26u
                  zo>7Fy6@A6;Ja6>WHhY+fjlL^YLq-h{Qia@7_)!E?!RDVs79
                  zEm^w_ck`-eS#mmx(&)#SFu|@rX^jX9a$;+h&xrO$DBrBJ=bS8y=e|cp{x!LIe-7Zq
                  zU;P(y*=pQmwYEyHOC%|*7am(y!l+HVmzF>}eC`JNtI~6%4se^gd|Bs9LvxUh?cv2=
                  z!@o&gu5rVnqGU2Hc)*M3m71l)wJdicrdyfl63mh2AJzL?Jajp
                  zAl2UNrpdd@5;pys{Plgoetxs<9&&5dK8L4*G4
                  zR&#EXwV4SC!GBIjIFHcDYVi1kD>k64oRck{Vz6kaj8247|GFyMy=NOvDRnAO;SGo7
                  z;~^M285mk-clMo^U`v^8gmC0}`ZaS~Tm)M=Z=(a0xMXHd|B-%h!XkPFhj03FTy&IB
                  zL%qHW4O(oJt4q>my0KyG$hJ0v&&kpIP9}}TOdolu=>RNsWG#G|`S
                  zK(wQ_L1Pny^#%=}jRuY>-w|3hAuuB;3yqVMVz1-ogo5nPOd35@BI6By;ImR_xN8=4
                  z>;@r$zw6r;vb%APU{((kis(uIn!nhY!!!*1CK4~Z?e$bfVsUGlef>M-_Q(B}9wUmJ
                  zV16d@N3R~_-M!RjZ$;?yn7rju-bYX8Svkj1Ewk7eMz%GrKQ{7~;vwSc-QY&Ux^#;q
                  z$3bl@Ru_mSB}yISunnOUBQr~E_u3U?I1F;!ng3v>h=mnDa@wotDT6->E;|t!u(6~=
                  zH(O?Vs=6NwI_3o)-QdglU$+xE2#Y&^%g2N#Dh7Jc14CNQ9GUPRT4`q*#!<)T&(hSi
                  zRT2g;`E?0Q1m~?Z&icQt=g@O5k@7{meQ=}&X!GBiiQwmh6T}r#f9$%wqRgD(A6&+JG1{TA_XvA1%;j9E_cioVjOG*zZ~toe!wJ}e2tzXdi?
                  z>)WvM+Zoi5qfqr)w(XzN{{@I{f4WVxQjsS(#p-d>f9qvrhaEtgC6W=B!0q_TtG`Rk
                  zmX_#0RkpXb)H2KS4ab#}2Ah!=+;a6)*rP>R!$=7eM
                  zNl~X#hRTweAQ?e^Uw{8odB+foDo-X&GNq9)A)KBz{(Gsz%%Aa^;ar(RN#5{tkz}47`r8@K;lKP@0@|_&Zj`%pS7vqR}sYsezC(4)I?#S!%#(
                  z>XEqr$3n_Cvv8DRN*#Wkt2ce9zz1QtEC?|1
                  z^>NvU;)^HW415!xr`mS{enAL9#W6t=OrETUppBA^r-QUO@xJ=p6-QReu%V52Xt?h`
                  zT-`0SE2AUfj&jk(??y<GZucTQjSbiP-3vo(!9)M`EB|u+bnPgVGt8bp;A6k9hk}
                  z>S1%_{@I%?&rIk{2kF(HsiH5YEycp9u_OuEE|os99y;oW6DiBf08&$JBopRP%BScy
                  zIrsX@SbBYtobBi>2|g}%eyP~FWW;t2kkH<1^;MV^nbvXMX$eQdgF&@zKI(r^Wzd#_
                  zw>^&{UlNOi@yhjFX<>h!XFk=GsMq7Y&p;
                  zT>;OHUiTBi3r^~YQVr>ptT~{-b)Y@#7M}Uc_!DV>bL&i5hHYCT{&RMVXJmNiBK2P{
                  zo!71WG(U%G3VTRX?3Gun??5k@@c+U4`NJa_tcVP%Va3=x;6Y5Uq{P08mJ90#{5Qcl
                  BCfWc1
                  
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area004-v001-MC/word/media/image7.png b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area004-v001-MC/word/media/image7.png
                  deleted file mode 100644
                  index 9edbeace61b0a546cf62585948322d203f426026..0000000000000000000000000000000000000000
                  GIT binary patch
                  literal 0
                  HcmV?d00001
                  
                  literal 39314
                  zcmd43WmH>X+qMZsN^vb(++B;iySqz@yA`(#Mj3^Y+a6I+l_g2H(T%R53dLBUiazgGWk!vYMEFLoz|-D!pE#&0<-n8CE|v
                  zYy|SM&(kC?%jqzs&7;2m`XuCHt@CEp=fsZ!ax)m(d?JHh{WHKkU5DQc<=E-4jBxL5Nr&LPB$ZzgPwB#4><_;%HV)KT2$ie
                  zjR;b5csg=&Z%I+PFD38H!!9MJ0u1xCHp@4zek-<@gEh@P{;!*k@l`OZco
                  zZEyX?QEnfk`<9pAG?wA^26pApYWC_?*1wpLej2+TNGZo)<>2T6j~ko~?9taWvT2Q?
                  z5u^4NmRg<-_qgm$EhskIA3y$l5|}O(uN4?QyS%V1LkHQn~co
                  z2&U4m@#te(y{C%OFOXiuJhS;zaq?C$ddP?5M7=qiX#5O388d&JV`h}6llo1ZjH5!Y
                  zST`p*In)d3=?qc~MnH@ViHf2kSa8LBV2SvdOFUfPku<0&{?r!hdybC523)=A%(9nw
                  zaUKr=ymdcyERdkRW}Z&d1;Ork_m^dk1Cy;({ymOAP{m4B5v?4DWbEV^Nk6iKw4<1K
                  znyLjE$51c`QlZw7Ow-Ti=^7lj-~|Q8o4UXGqeA@poK8jUavn$^eux1Tou${BU0EL-
                  z)?<6aYloZ<6vCO&SKB_6UURru!MO)aK0jDZ`@emhaFcTOWLUyx9sI(k>9pyF@SeG~
                  z0(>2zPIg=3i9c7hk(X&{W0Uu+tf(m6&diU2l^IO8#`WjGrZjk4IqIp#w7&ayj@F?P
                  zKieVrH?3h^VB4u`F_bZngaophgv8%sK95JTXB|&0{~zr=MI~P|Ak1$hk26pa;$+k+
                  zHFIOGRLN{ijM2tJRv2qPNvdm9HbX}Rv<52+Ggp5aMW?i1*^G-lUU9zmr6rfxD@&p4
                  zx4?B`dA~l{3YF`3tkS9`y87H)=@`VGve*NWsG*PAKC-B?4N82O%<#kr3Ua2G8Fr$C
                  zP*E1|E=dnuc(e_Hn!KNwZVe-Pie|G-LDq#}&w|j2gQdnw`^2Cw;xer!=|=i%-)VG=
                  zPU+kk&m)_4I8G#4%8l=`snV)5gTEs
                  zTV|;@|9JTmH7Tv(z4?4Y{5f!js?wcIuDqrmLGdcP)^^fwwWBAGhlmHegnBu0zC_g2
                  z@Rv8{dQ_ZST+-}$(og&$f81<-?Afm+M?*@$M&xdKT`j`YeG#^*qXKDf-_rE-t{}iw
                  zxQ51%e`P|)&T4!~IO6AWn4udp_Ql72>aBGtB}{$x=9)YPR;;>ToeM?ZT%Q6sjmZF5
                  zLYmFuV*S2?C8IAnbDLC^dOjTTq_ck$TvUdPD&@$!5W>U%?aZ8*qOTae6quJr4%T08
                  zzhHCGhSWMQM3IsgB%0W#aG4BusTPE3_rCSJF+Yz($*Zou>3`DKC7_VAqv2Ma9(MBN
                  znqGCB@5MoaEG(|RI46*JU-1VrK-vVHNz`fPMMig-TTl4e*%Mgakmqw_vm8^9=Lb|M
                  z*-LXdiTnE6RE>^${q7x`Lw`Vn+tq3EdEp29`bC_So?e@Sk(^wHLtfO6Qp0-mrV|8}ryd~Qhyq_G?fRNE
                  z1eISO>o2jB2ucm<@buAkiMx7nZdgQwP^g~)s<<@qz*VMd+t9e7lPp}e=+o%#QgKia
                  z@h5+MLMbU_Wloo~(0ljn>GqecCmPB^v#FZCntBdVuvS&8(21x?)BpjSZn{`y)(MTIdmPN?{rj*7at^!w5dDFLuEytj({fK%M?=#__^&DXdvk|6p0
                  z^^I+lV&*GX&*njGV=eVV1w4J6{r&wCBS#p-<*O^#Nj4Pez4In;+Xs{f^gu>wRbs0n71VvuiS$yZnj5SGPGI5S93wF}p=aO730M
                  zF~I5EyM#e*f*eqZssLYDBOPIb-5%^g&6_%^MabLor8c390AW)yDq2p9jJf(rIKpl`
                  zGFH}mvj<<w;x|K$Lm-5zd8SJ^9(}hYu0njY0CB_V-}KJ
                  zWj?ZqmBT^W3?Zi4Q2C|MtaSSPcB)a`xxr@RLT;qN^92T*$tGxq3TgX+4VUGs`JkOK
                  zkuW|omO9MU(n+@bpX}?CmwN~)6%`88@6(=@)5H9VFcjlt35gdry96LN!h8@S_)>L>
                  z-3LV6Gp!_Yo&&5eh+GSOKmc>dMzvp6J-`4`D5`>?q7mO?Fu!ZP=JY`Cqn@nh%a7I_iMG1H%*
                  z?=kGgh^Pby_2hlNx@A7a)_%yoOv**{u4}a0%X29)D9!tQN<$H6c2pvF>nlOE%9cW>
                  zDUw`Xc=B8&cvEY)qe)3wm~Uw7`S(OuZae@lD-fr=s=%7UaxDAwN9@%WG-z7ki(KnV
                  zZkq8xdP0hcN#2izw9C{Ne-t1d1?S`-=cCQ@p@nQ|-i4vjp^1z8-5SRBM9h*|9qmM;
                  zWIm}*O~9UZ>mznob_E^t!)Sb_H=aNZdGP6-=|w<$vo$9`XP9NvI$jAr?d@Gb_giC$
                  zDUOLM0a;FlZH_d`=;-4|Y_+1AI};DZRQ0AZlIOoryhi5)b~hE>{(egHm+x;6x+><3
                  zTM4QhZa(7*c=Qf3J==64E4vfe2S-FeubryOX`ZE3wv?p~lg^h6d^}pd
                  zfr=xhBIV-x;0I6CU%T}a@5)-z&F(Ok*zbB{<&ITHpRjLk4E-8T@z2SpQZaQsJwCne
                  zdMq-sbG!##5NE|{^!wxHt>+M)m5aF0^%Ml0k9GAx`Saqq=7IYpBvf)eTOIdym$~H&
                  z-Rz`o@LV5H^rcXQ>XuUYmb1q9I`f-Vgm;SQ4<83+K-#rFr+%v+cUt4qFhNXmPUdEkLhb;s0w5CaiJA+=O
                  zu>GLdmk3u1#S9mMDF3ctXcDh{dj{^m2LVw09_ynBYH>iw4$*1cE!Nqke^UzG)^Wpa
                  z+yLwk>DT>1K28EF?$^?$x8We75DNmz8dh%!D);>?ZJ0ehk6o6oXlf%#R%>4__wE6G
                  zNlmDkd-q!0GR<1;=IZt6-Zhw;jeyoLoAX4a>~{mdQJT+VJl$KcYej&f<2Ens6WHf^
                  zRocz~@sppn{%W=MkZPlY{i^?4oRQ^-v*O$$Wo-`*$h}$bQdt>Dp5DSSH1$JM)S0^K
                  zYBQZlba!*pOl9|Dvn@}+2F99=0UpUUeL?Rmcs#N!HQ!jTF8og3Jw27=}sge(N8M*dZ9MrFjc3REpxM-bG3g?
                  zB}lW`5Ax2HZR9a8m#dFrq*aF&hzdd&4{ca9)xY;{I8U|uQi*9k3YJ$4*ZJQtQ@Joj
                  ztRs9&
                  z8a;y&a0IeVZeHOo@L~O1iN-t%iYWcgeEYHHdzR8{F41u(wOXlhqon%%4P`
                  zPt|@(!w*b+h}!SXPwjAH<)hY3QI$`9YS)Fh-=H89JJts_M%)YY^2V^}k^k!*?gRKf
                  z^T-%}S}0WAAR6`dV2POc5V?`%n10YVo4<;>(t6KaQ5g;Fy!7hh(VC4Tt5`zZ_MKKG
                  zZ|~i!7}d%$!RzOFz9H}7;eB!iJo8N2sHOore%+>DC6udAzkXTZ`wi1bg@>XvC1tVM#>{A&7xayp^U4TXb)jkHZTZoX&o-32rok=s=bs3l`
                  zv%Tb5_P0C=?vt->BmJ-_@kPN)SdI?m2>k=yFf>KO?`G$rWPFGwQX-}P;75nnB#1}T
                  zaZ5S#EQ9fcR-;l1v!+P)<(LISs(^4^bmEaR_2^nzE0S>@u;SGIr7rP#>ki!~mWL&c
                  zQoA@DdBXCuM8aiht6ygnwAu@(+!8toesPiSYeg27>Qd;jcgm|nvMVDH)FRS3yV`8V
                  zhbP9ypa`|OwY!z6-sZ=rZA(hhZ2cfPDBXFwPZkAF@Yhs*rkE@md9!2m?Gkdv-@s!3_%4N$^as6h4X4hvip0yXNZUQ+WN=oPy`rjL?
                  z2F#WQeBID|ZmX5|(UOwX-xaJ0qe;}ivS=r5epM1LUb{dM-D@e^d5
                  z)Ul!vYm?S#oOo1DDP58TBV`qa9Dun@Lu*)=-#f9ZyE{sXjZK8MnEzh)o^?32oCbw?
                  zBS4!&B(%L8RP`XIB#Q%X@cj-EZ<6^cD5oK8#Tc@ZWECfG^uDCijfKVYjoDm@uTt!%
                  zm;1&3?NW{bPWgwnoc?BRj856tJTGxat`A~w9fG4TI$^5qAJPWBfdj
                  z&1pF8xW4MJpiNZw-*z`>b#|@Yj*1E26AtwIZ~vWxp%47F*H{bma0G=LzprHG5h=q6
                  zNVwbNx|q2s$;r*)$$=6*5lAU+hXzDf2Rvk?r0^tv!DxhpSjZnVVrjzu+cLOtIJkjU
                  zk2g=W_LdetSWbjq^rK@;BMk|?wt&Ce{@}*47a^TVp#MiWQ1$;sg5TxLq4tEpjPaj`
                  zrqwIJPJ~-D+5HRdOmk>(Sb)4>bwmMt$m$e0`Kmwd-yr8VO&`w~`$q5oTLJDxbY=Mx
                  zfIZd*ey-Z9G=#$`BVhdNt}z71No*beTxa98_&g_o{Qvf?0m8tacR*%&l_v6!s*Lvr
                  zlSF`*hJBk!3OxFs4@#cj0V^2&ni`a0F{WKNU#s&M7x`4ffwD&Kd3y$V3T)42u_2EW
                  zE0syv=84ep=cU>Q;`bAkFLEPpFQP;fSxAyVBXH-hVBm|m`{?$Lu=$pPlM{L%Qn#?sRLMoFm;C}DDJ`G=I@w~$WN51JCb6GvKRg(-blF||tXKIIP3
                  z_k#g~PU&Lb?3ZxY)y_qu3WMKx6H1@i;Eb5OCT{G
                  zN~l?$Y?m!3t0ehZBHzJpnXl2Ik7*uJqs;;u`L?72kaHx#S+vhcS(T1$x2GamS*Q9O16D+woQSBE1jiz-6tR)(lczNCS5%nCF-dqC0di_
                  zp2B{)x43$YF{^f}p@N)VZQzw=uHylMBNNMTgZd1x$L%fA`k(=^rQ}oIW&^H3TkKaeZs
                  zB4JH_Z>05<#CEOMs7xBBE4_6NBC)eqoGSZ@Bo_g>&2*e3Wu-M@lo#KLgmd3vW9JNf
                  z$;QJY*hc>STdTJo(r3byMdP^=
                  znVP<%_XVVoaN^FJ?;uxP96ev9FMnpIhcsAS+*onQ2BA*!%~)t){QMrfcB!TOoDJ-K
                  z3K1ACF6tdEbF?2;o3^Ubjm2>D*@0qL%GZ~kpu1BuWhZKqzSNJ?rdCt)Z;`Q3nels_|s~f!O2+Le@--zN$?-&Iq{F
                  zJO$D$o!i;QuJFzO{i@HgXswx+6?gUHlRR%%GAC`ikKrIkdHI5NR5dS
                  zE}i}{mDY$_BE=X3g(s#NVq&O1@10`Xg*`1%8J-tM?2qH6lBa!?ea)SbXHdB)jRz@iE)r#kWxVaQi`Ce?ax%rXtRkt;lwJN%9CxCp-Yl~kjQD)Iuw
                  zVs{pd`lb;C^O&ktc6E9l8WldLUC?bFk>Uy!#Ji6cG0N~#Q7Q?c=0l2Sq*GAYeEp@z
                  zIagd#lP9%p$ILI|Z|2LXzE?=sA*e0vEeWAgMOu##5qt`i+{9}Hj~t!)6_fAne;?34
                  zUuqmemX)n@SGmlhq&YMlv}5>tiWLVP65ZLZu1Qn5)hVKjhx=
                  zV(X&`$*;E)=2RdNW~%E=Pf*>w${p8rLK9!AH
                  zisXCTUks;7DF00^(!~T&(qSAiG1VLWHiVV;CG#%wkI;WfItDBG}ByscSc
                  zCDuUyoRmVn>$0>w+wjQW9ED3Mi^p%j))Luh%)7_?Ifc!06zq&gTBx^lcgs4XCCu(s
                  z6tpd1N4D@f*+(8Mi@iRuH#M_tonPQFgBZ)Hsh6t{ZlWIy2e2uNL(J}V6apglo6-rQ
                  zWUncrCW(~?+(Z=$I3||+6awCZBT9qQ#n_viIk$K+KtvE!woZm(eSFXiL00W*xfuaV
                  zK~Z`yM`|NZ60*|603}PdZOZ5+=|iR;X|ZGf-=_5Ky!Y>x7w#Cg?ugQyPe?#x%{c0~
                  zZ1^Ces1C{*IR#SPseZZ|b){TP~H27XfMcuaqeX9Z;0n
                  z8aEXtpna7{WS>ke+&*(?ypNK*(p9uy6Q!g(jHaYwc#7)ZcA%j@W)^`-P$N=`R6!>d
                  zOO?^NpABlT1J&Tl((~#kvg5rWTBZx`zsdsDvCxeq)5#V^!6x3r)!5h4syj_wVfDAo
                  zM}^xnjXvQag*R-`CaskXU1n`pAHrKDMyJTAp>Fc9fGA7FG@%LOhGY+v-sL68z)llN
                  zv`S#MT^8&LfakDG#g9BUGFEPEDHD@pcr4L45|ag(GA&54WD6^JJX37n6b;ml>yus6
                  z#fl13$m)7v{-n{!x`+7|D@v&>{|)wOz?)oFH-i0(C1q(ax$L)3z`Fsb-NZtIsEfBz
                  zPsPo`o3+Tr>-W!+0C<_awiKl{S$}1&lQZ`+IQ+=)*+sH!jnZ05n`-qGhHMuNR
                  zI3Yg4c$FxMkz3iR-47S>-{6?2*zb}_2HARE!Kam9)-8;#g-~ku_(;a
                  z)akHeY|yk@fTzb=8{0A(Cul1$&UHK(~PtqN|&F|A8Lz!tYx8RLCB3wqquJYy#9oBSZ2(09@j;n+8s
                  zqnCVQ^|>>*VDk$QiFK*e!O}
                  zq~Ad4Fc5V;V&F-_6t71ICbES^3n1C?3&LZyQ1~G;hO=r2+^UmdY
                  z4h}lYo1MI`8LqPbabRBjIwe5b3UO+ZRF7rF7vd+I+hFZTRC71P!Y4Lk|B~9?C
                  z4ra_&hqEPX&`k&QjeMx-m-bzW!M6p
                  z^Usdo^0(cs$de0S7)S6bbcN-rSgJFzL`U=;3g|eQbo$s+aWR{f!&OL60=#rJ)`W2n
                  zqgZ#2X+~&!zpmkuFBy!j?@!C)#_1!wFBh)W4PDNA2xEe=pvU-)u)e5C{^GF89m+T24R?v@T*-K6iG&uf(FkgFynNKc;md+BfzuY^+q}dE(sCFy~ZZzANDT@
                  zBrzyyjL?VFdv@v<56Crl+2LcUFGJ?;~=|I-2OQslp9_v*L
                  z*|x>-P&4D&*eX4Y+>&F%gx-p!F5K~QkkI+U^~aY4FaB{eSK4cMn^M&w9DV1B7Th(!
                  z`;i?BnpefuxDkpka#O%JR3vTxt`1?kff*BMq5l7TOm_znD??*UGtASPlY3_$Va-D4
                  zzyrEJ-o0V|D-LJZ0!)fvohl_n&9WzYZAW5kTAc`?m9)SrHrXkOVB<7$#)@>5_8@s|hKTkV(
                  zG>KFmd}Yn6rjbjj(KP=!gdhwls|}~ZJn=$J
                  zDl%OY6Mk&n{}>#+`DfECBJ?V&|5@Jb?1%IP<7uJuyh?W!g|Wc@_^t=S+vu?$&;~u%
                  z=OlEM^>JuZD?38HE?G>kqxqIvc2Mt;c>+t5Y|T!_yu+hq`nRnu|IC{q#U9(DA-Rfw
                  z38m_}5yPYQbw@k~w}>h$*B?6;=k|H6v#$7{XF{HbymEVi9=pshg~c)q++4tFcI2GJ
                  zhn0^c(d-~y_7qK|C%U>`|01Ngu!8RijG%{lzAco+yC+TSj^}YbI>BbX48+W4>)xY3#n~qg)ze
                  z-ic2#T@Nnme<_60*bf2W!V9Zk*7unK%i{ZPYm|s;dofHeMWTl7yrsFHMmWLJqWC2#
                  zw|s@}G`8lUeb1(G)t}k8(eh<>SXrP;FEHo#%n~GtM8IgX0U@$2!>vRO+_*CLSQ_(d
                  zRB5O*zt|t@=PB%Po$+E+jF9v4e>>F6+kUCvHIy(h$wE|PCmQy87g5T4tyK)*5^v~f#=8pG;Z#RK9Kd0rT
                  z^DS|no2;#2_ze9KqnNs%<tM{}6H!$U#m7p>I6a7^&9qJ|s$ilL(0jeeukKyT}n`%Qqsc9_u<
                  z>YtHTX62QkIa#i$x>otBhuCO^?Wn-;J(L0Y2SDT^DOU%pqO72k&=e^
                  z38|@7nQ4iM#e{pC);5cbUn=?EXb7|ZS3??U_Wa%2H?aWQ`IblphEc|alb_dSHF+Om
                  zYL*{oN|M$GNcGN7pOR0UU2zT6L@iZb>Uf*1P4dFNtuKToOwVG)5OsX_H?;hF^78rR
                  z-Mdme&Lh^NBZaA^6x*seA9TDQ_hwwz^wHbfZieX>ycqeRtdntFor37t*ijn=aixB8
                  z5fRolv>v?S@PL4}_Su>Q1LMj3!lm;=rryTZhV&n`druzT^iuh!mDS4g`Ly{tKCD44
                  zNpEkyvPE#9*mZGutZZn3j^o2%^G53A)CFaE8aKwzeS{T3tT({q9U^B804Bypjk$+BiKtj^`TCAiK*Mc#<;z?
                  zNo(ljPZK8UR|U<{bfR0c!DKyOXCMdc{{4&ySip3SY>HW|9$ygf`i#qAlA!61RPzZ2
                  zs`9dBV|VK2rBIno?Fy^mgFjCLAcAK2sO^g~xqf}Vd14Na)8H&I%Y*Oo@APfHn!!Vx
                  zi@9%R8AbnXsn#f8mFs+5G5GYA&^L>T-SdWjyNDAyb!cVq$tf=}u>%*&J2Jk2^_pWXL0W+w;^EEqjZ5Ju@Kj{#m#fgsSE8@4E
                  zbVv0byjSJToFW9WHU#)_thQAwT@S_Y59Xc4G%PT+s=MJ%9Vbji+jfE1+TOMb%2|~^
                  z8xZ?X%Ke)xOdjfe){O;YZa$u}iIi#}T1jxd)NqCBs{{-9NS4v~y6@oOy>0HY1M$Y5
                  z_Aw_65ya=^;MmNpBr!zB(DAV2B8+o;tHvuO!d>RvDzmy_1$t1njxo@Qm69=ces?pql{H;%0g2JG}d{iWytnj>uLk5C*OahFX8vPI8layP
                  z?&~rTi-9<}-t$kfj+2z6+A6oUbi2W2yb>Qe3FzzX1#BQdDbd96uPOtvGjiF~;tWLT
                  zn$NV@kQ?k5%=7bWe7^Hp7i?+Q1HDt#Yx@603o5>f(${+D
                  zHJWn>b%0|0Z=Arc5H!>N^eqIexU}ylz>aphx1)vk-zE#r$NK0nT|tPAO%t3{?LhLO
                  z?RfBtFab}n15*yWIaK?yvc*$aiwWE?Pm=9@G#K)>c2fYSZ{PL%t?%Qzt~`LR5dY^X
                  zu*?PXUY&c?=O0|J2I6J$;6w-c3D)dEMy=L=qX1@k8OYt1-)x6u(fLjemKb*MyA=Q?
                  zHGhkbk0imp+nC#krB#=kExTmpA%4w|=GDCi{+Gp)wRQ<KO_7>oDO_1*3IcnMgJ?VshH@WmpO~#h_>vvamgf@0_&D$^bK(#p4ag2>!aGQi42~#zD
                  zK8xWsog%8F(X6#hF-dzB(Mjg4?gQK
                  z0*J~IDRS3V3xx=4$DP`XaWa5Ii_ja;{5tBM@cq;~wM~WSL?@Oidv8E3#a??@IIHxil=5UAR3pD}y&rUD<
                  z#dH|lFx!p$}xAKKdgzYaRq#Zo9wP3XQ)!+irq4a9|
                  zm;VJ3`cqhqk#sf1DQ+WKXPQb)gs=Y|mv5iqrga|f9WSrx5rP69|6_~*bRF0JS_se5
                  z@AU9LiI-~JyfqRkP67&w$Qtq*9?zcUCZB8&q~Ffs>M`?{83Q)eiUDJ8n}dW!V#X0t
                  zhQN7PI2P6{`Yo#xT=}B2)#X3R>b)?H@#Q4LE4JHF^LVLtFXP2k0#kkOe#@cUU@
                  z+WD*oO&N9?>629nn&)CiUu0?NPpmXy>*dQD7AyMV$I8rg6Uu9djZJ3;U45^F$JUU4{~?JNXxwHO_-zbr87Ste
                  z55N3;8tDbRbii}jEO(sTr3Ign?MxRJmACnwtMRx`ud(;=t4+a;dIbV4fwypP#$E}N
                  zsJ69+2qP^t1EY5+RQ`0~UDn5J|`X_slR(a2Y)Fs&YxAznc%;=-iml8iv2QC=?Ncx>gIU#~8b58QV&&49NSq^dBBJWx`7z$E
                  z14237($n9rXkFJ;u|TOVrQpV1JjN3iI^NU+5qXPU^RXA;>auV*OnbN0_f~!y-t^|s
                  zFI;w_hw^)xUuvexr%{-g#5Yc}2$8`7tr|m)68o2XURA`rWV{L~Uh|0%Tb<(IJdH
                  z5``~&NrfIUL24ksXMU}le;*^*&9%Na&AjZDYNb7K_zF;4duwL^WtRTnx5{|vlU%F$
                  zk}E_Q+)RM08uU@8;%0Her$oy$pz@(vA>Pz{il0g&47*@(o^sJ$Na}Qz?knENvrQW2CL$+UGo5y
                  z{9|K_eKrTiys62K;da@uUzi_BRiey;8zjHK_oFg3dY}z
                  zw{&-#hPRg>1A%!ssz}{ZuM6BATP>Et-pIe-5a6)7O3K8-7EZf4rH-XCSsi~;%?Fd?
                  z;KrqOyL1Em`TV`xoeiZ!1a8(fI1tzRHXaf0a_8MVdGZsQzl>Gz=RV>76jwtxCeDj=
                  zi(j&`va^-i{mWw7O>#KLDqZ*9S5j$=j4>CCH?J(^m}QE_VZ7EiHMpq)TiI3a4;MGu
                  z+mzk&Q|!&GWA2&k;dX)ui0Z5*R-mB-A|oc
                  zx6NKftReU}HU8e=cN>t;6-cmCRMh4$7K*dNSO@ThlUUI2-lPV}5Mnm`9Y8AfNlRSn
                  z7&pc(q{L^on2J9P5PlGl^3zkTaD{wL(+`cCHZwN(Sa>$Xh&EBmTB;Uybr~Au8Pg18oQ6Ej*cgsG)0kW|R6G@0kkA1retPXM{e3^F
                  z`>DTOEW6c%%ubQTJKL2`!f{VJ3_+~BR_bnRD)JG9P^`s#uYixRQTK^oTNCbs`P=_H
                  z43R_oe@j(b!p$`#04iFEp1Di>zf)+P7Ul0%dbnQg#~H}jg15c2*^<>r6tIF@5XGx@ulq|{hG5la3oPH-;-G&GtytQZYr4_$8dj}!O)k=R!f$GCHPb&kmu
                  zH2$Oq7Ih^4*KLLq-et9Aj=R+KeE26-)NK!ydM#!fEB9>=!ps-q)&6fawBu;L@s+~s
                  zee@i5Ur$Jg@Wtpbsh{spvt5}b%GBhc}kU8vWD4+4?vA5Vjk6RKKG~sC&eXIS|kl>ivyI6<`1z-RQnZ8
                  zmF0$Fe4vXupX08lWT|8@v5&R~pFT4%z}Ml_*bn{+mPih$>jq6mV`SGQQG9)Fx*tSZ
                  zjCV!XdY1cohMupp(AfguMjX^=*XWlc`|r?d<{H*gF_?!%v{
                  zggjqiqw5{L2S}xFHH$R%;r(;YQ0`93;vat#BI8>LWz`=|1q3Z*LPA`NJ39jQ^He_{
                  z>fI&duOq$9jt%re+T0k6+ej@=KPG1WXY3@st&D~Pe+88U#oNp_X{Gt7yc)kkLHs&p
                  zadvdQcCkuV#yv<@8FCmXN{?2#?x9LC)cG>)e-$R1$kI|tPW#JN2h{yNp^x5V8;@k3
                  zoA#3AC&0w8QqDqQf9tmYhwnV@)Z47h!P)kcNWZkR0Z_TYSe6g;`1;6`%f~zWd}LWy
                  zi1Ez$Wjj$&kT_a7*)+#w5|fI%jo`YB2K!hHfe}V-tWYt%k=~-C)OYY(pBI)%Qwt6D
                  zkB;q8pYp}n0rqGlrE#Y{c@KX$L7F3AI&m319+kg|WVPSvM+47A=pZI%L!k9E1FQey
                  ztAE9i-h8H(I$0jT!E5JSnm8#;FmJEg%Eq>!U0^g^4h@(iub>%@-sM*8Eg_p(v~t%C
                  z&C7)QMtHHrXSmafhsq8?TO@6n2by_#>39iGQWLl|IZYEyQX{_)^dCH;wTac%eInj3TyY+#Dy1Xl!oB
                  z>B2K@8}ByJE;wbl+hJ=Q=yZaYTClH*e|I!_r3MiheetL?l>BopQj~Exe@Zc2m&{@r
                  zH9xvOa>-V=o^(`0TV0R>=yP-Ne^P8JwRbo_vWsZAVGc$KF9F+XyPT*Cm-y$Dw{@zQ
                  z@RN#iqrvdycbXZqcII{sjwZX|M8_J>b}K%;5ywUlL;;@`RPS+ZI_IjP&~~gPUVX|r
                  zBmLzzKAwa*5!q&W^lY>@^z+NA+CkH!NiRdVAGu%gV*plV)CCmcZX=EHNxxb74sl-ESF3lrD80mb?x6rPz_h=J-i)
                  zwJEAqH(&k1Oh$3m&e$lDkwrQoB{1|Vo6XM2OH(!Bm7()rGnt+lZSkN`i&>z1@ECE_
                  z`QdlUAe1|@ckejj1x&jQ(S(eYrh2t@5rM9N5sA4HJsCeTO2}w}9O&iCGl_SZ=@c+#
                  za=u)HxKw}IMNmu6M-5jbr&GEkIj|0g&!etJ93c1rz*H4F?&6OzGMd>#jor|nUqrL+
                  z71QqBv*!GFEWZo9=lz|MnzXfr(X{RO7v<=XE_hdpvjkEorJJ(7GbhZ{#TcxOeK6;u
                  zVSF?^*|D>^G8A4n>`Fd7-D_bSBiU`B)h$RHChA`*utLh(hs(2w
                  z2E4)CT`1gXkW(MJ01CIM8VV=eD~;BtsTzrSy#_z=QN}dL$RxXc0K?rKwXpW?WL0&S
                  zjN`2JkAo`m!!Nd4pFX5$7~#i%JHql9tf*sG
                  zk|&dxlP7QIbdMW9)Mp6(M~fABG~6c4x=lkbf2(SJ1+4NcnoSjh;R!_8eGA
                  zWMt5#<4P!M^Ah_JnC`mxAUtK{X{<%LeJVffNV*+}nZf;4GFAR&cdP{P@!CD;sf*(-
                  z460hYn)5Rnm@L2XTUU?WDuytw?}f_+HJQb)4$hCej3ou_$$tN38Q{}}6=9Sxf9O~y
                  z9|BsJ$1e;G@J9v)7Ny%491iL%y@r>(ay{qTa-#*P#Uv{3nXr~e);-TeAD`v1t_s!z
                  zjuCq9*IoVT3g5}y+kBb(WZzsq+2fF1!DiV-GLeI(E{sga!jvGa^9;r0mWSSr*>jNYN6a7EFEC}f`&iwP39-_4(O|_#)_!(2^fMY!S?&Tm
                  z_-+{*!jXHuE9_`cdG1Us$QfaIv%1Qe+sWP#`em?u;<%2Z9ofNHL7-F!XzyJ{-q+m8
                  zKN6!&W{Ku3QZqGgJ`oqOol&3}bP!d+%K)x}cZH0ptEP4Ww5)&Cu+XK;7Yn94qpU}e
                  zyDwW=B!NNil8o@sWQ{;6al`TCd*zjGWXTIx6{8>uaf9n8d0>`UUa>VHXzzOGB>z#C
                  z7k;8;7km}*keciM(A2C|X?o#0urNru7{o;$;(h-0q8Ofz>5eHk>*AuLfbSSkZDzZK
                  zb3FqAExZg}<^n7c1tAiZ`-tCtq*}r=f-_xS|1zbjd*w$5?(&~idHl|aWeWNf3(~Is
                  zM!|cB7%cvbDLR5z#T-hj`pEfsniX0QBE)>BYx-EID8xX}>%0g_(-1{xJa=_b7p}QV!Kb
                  zkdT_%_<(DTq@cse;}CeMR-c5e_Wq#xc6VYuf{+`_>9C1ROiaOj($S_2p-h+=1Eer?
                  z%)hYdOVaIh|SwkN*wUASz_J=!H{P_M3qFzfnxfFGkyt?a|e*cF?H>784U7T~D@E
                  z>{(eh%}E{4lxqe;wivA0W-}K|b!9ft%e!FPI&YTZbF+J0g_{f7z6Y}ltl52q%g{*c
                  z%yb7(R`4l@eRn~+MR!%-l-v4~hQi?hHgz$X*}bSjU5JMx+i*}&9U6TD`Id7XoWEZ2
                  z-9_fM=Ky8*QX&kBA#T!9TyjS3No}-CEC4*3&3Le@UWVgXUG${E0DX
                  z-TNiE_9TtnKSK8UDMcG@ZsfBU9qg7c%a=M0F_yAkc-}bdZ
                  zR&EXx$q`+2#Q2iOr}otC+hcKfT?F>0L?+p9QIsH-#5sG_)K^T_*k^(2OV&ThJk36w<3W2fGO&E|iivf&vLgcOi8ENT
                  zBXX3b2nmHAQ4cf<&~fA70yVD!Lh(I;#-r~aX6~xHTl0YwI=>1uuQ)@(n5uYFEDFMZs%Xkt+dIby@
                  zZLwzr8bn5kki8kt#eblGh`NO&raMwyFB@V#QVv0}#lV$aW9D+(p5rK`K
                  z%h8Pkw|~EdRNbx{KZU_>wv19ml2R?yVhk->#C+xhrrjxe6$ouHjHsjPqW;__Aeiry
                  zr%;B+UnnWERf86eGono9y<2Hh5%@tC5N*rx3tnoGbOcs!Gyb~PGQGDZ@`*ggo4yOj
                  zaB~&tWk!bTjdsCupLPfg?jk^S|*Z|r22WcgS+%9f?Qg!%k{
                  zN&-im)vK)#lYRO%ZDl8+GThQ-ng4$=_f}DHZe5#bLWJN65+D!=1a}GU?(XgoTno40
                  zK@;3v3wQSb0RjXq+_i9u!lhsK{`x5DIxjqPpSlA?FC58mJGSEj0is)-{4@u9JPWQQ3VjcJU8nZ9Dq@VAIj5I
                  zAZabiY3qH&t=}EQTB?5rthbOJ0vy<+1#dTYUqnljbA@2(4sZev+LgtW>pYpsFd=bmhxibT!7U0ZG54w)co`K#*E@TqfPzi||ik
                  zK(K7#y~OC_mP$2DWh7OU!~Ujt9PQq=xMJ9W1IPl<0akwK1pwt+`h4z@tQp^UpMB85
                  zfRG=yHG28&`5ZT+95t1bKaMIQ@o_w^2F2VNOtJytyW;vs*d_>q_so~{H$FMP-Sc6X
                  zW(I3Cocvz-T6PXf$zwC9USiXkORIBd`t{5=zgb{fJ&1?veLHG`<=9D)rrp4KUzW4y
                  zi)w(mF=>x}vP|u&;a{E%4iBu1dClQE)rD2z8WiT7X+Z8_jdqZ!yUN?TY)rzdh+VfmiN^W0MP|_3-By6ncZj|ED?w0=c_&$@&H&USG-=h#kTHi=L@0&
                  zWJ5sf)#4!~Ww|@GVc*oExjvu;$|{kK>A`yH*=)2YQ4`;bw_FR*w?qd0QjNUI=e1jo
                  z7JnoORRqj9f3ohciZnX1oSz40jGWpfVL~5rJ_{u?-y$$v^F0}v0q!yv$Vb_o9o3_^
                  zpTA*TGLgZq#T?Mb)JIF7zBkJH*xNU(g=ot1Wolql&c5^?IY7+;%~KeN+i`yv5aR+^
                  zj0^=06aazGTAmOhDCYK}G__cNn&|TY;XpHr7UFLj0ES-6QtbkOPU!Z?eFwvk=d2-M
                  zGHLQJtso-KTi2C*8ox~LHix+(L87=i6$IDfa9LsLTTsn%p-Oza+(FFl_
                  z2=CCW;ZzY0Xh#To(X9^%+=>?{`frM9^brGZlhk&!wE?3hH*PHNrH@zApmN6_z;hJs
                  z>%%)`>*u&^e&;}hh=EAL$M>->0!MKysy^YJukL2jZ5rvMGhieWeMEm^VgR_9)0rK+
                  zp`q}}EQBFI6$tcG4{)>2E#fF&V&WmCOK)5xI)61QEd(^@!8W^G3YdiB1wJPadilQKJ2$#z4)KrP~?B$UZnK||rK
                  zgafd^xhy^yc>@`WLelE#`y5NTG*i|Z?7`nlp0nGw2Nsq;^vuBNUF;(RLy5yUg
                  zqB+lUgVgGwe*fn>@G;nvy~&p6xTnzo()GvQ`m;W-Yba;O3S?0=0i
                  z=}#SJ1@_lyfN~$KjEj3Gf7S0|5mhVEd~2)I3~ey6v?LQwXET>A`ThZoeQhcS9ope?
                  zV}qw%PZds~A6)wqiJF@msYvwMa$7^Q`_aUj*WNqxM;9dLZ39f9JaXju6kfRQFl?^4
                  zPdy&MV^7Dx{Ug1O$44Oi<{hXaHTgnKPHpGLxmKWGjyqVSb>VJ**q#yK&_SQ55}E2n-5}@;07}`8x#f$7^p`P%zr8%p#@``J_u1YPa=+($dI%wPqC?y*K|NhegTt@172<)poYq
                  zJ!Jc4CR5Oi``yipzQUdxVymj8yg2a7){z)}w3^p?N2;q>5DR=7kkR0{VUGR!(yu|4
                  zK}WAYs-kQ;U+x3WJI2hi;YL7JfOGf9veTPONAK@MEWOxS69Jox_}^YloI2AVvC>I3
                  zgA*)y^~YT=Y=Bq-jZx6IxV)6qog=Ff?I3^!Gc?Ud>7K)IcE20eczR&z
                  z2@(K$&wBKzn;t|!$gnqRT>vEi_>fZ;8EF>U>*_{mgZCgS6+2oT2mHi-n8$T)1LxHB
                  zE-=$lLx9LK1Ojb%5SiEE=H^z(JFbA)boWt0KbPI<4>MiH;}wdgl=^ZgDqT@)=UEKF
                  z?5CcDpFcam2iBd%7XTiIRU{(H_Zu+U7gT?y%~9?P00-}Mt!2}JenlkptU0r2>fMtL
                  zGG1>bFaz2?@G@!VY?7%pAZd&(j?n@$PHZL3kECMvDMT=?0Z2O?J*wCnN5M{hGgY6h
                  z(Iq@Q0&6JInaus1fFAb38&!=J@5RnCnway;4n!~mJ|1>xl+IDH=W71x^weX`QLK)S
                  ze4_148;VsY0J#9^5M`a0K2X`>;y69=u69iTUdx9r6c)aQB9|@YX6ovv55JPRn@Z3+
                  z1Lpv=-ISUcZr?Q$hJvW7YRwzR87P=mi{ZKe)(kU(%3O4XoW4mNcpdFA{2V@5svvi~u_<*OtP{f5
                  zZy4C^Kfd(o)6!BwShzG*fq$-lkKn5pLW)dp34XrbBU;kSOCvW~vRQfbkgtkDqks=K
                  z`9a`S&da_l8LZ2wAc6LvKmmQCbr%`){{U6Fptz*AB2}I;L#zLZTBO#?Fe*Wt_re*i~FClGO
                  z@{L2+MiGXtsw{pdw`s|rp<&9shj=wuFu2?xja=6zGGDAM$HWPF*07ld$-G<
                  z-}FLj%og9icP;8mY|%Iz_xha5b}@6Q9vU44-Onpl=kF!Y2fr5p!xI#YaF;x#mo~U~
                  zbb1HJwG9}vNJoELlm*`iC!!(A`PW87{b^(#8_OC~Y79^wK~}3$RwW;J+bmAAxGfq}
                  zE)ET8d$!~>*VD(f@0u+nRK3m5WLaVf?LmAsux}7;Y;O@P^kQh3@wm9-I+Op}Bb_sW
                  zpQ)tI@5o(Yb0n@~a4z|>)Ub){7%|7ncdF>w2LGHNgg~?4Pz6&sq@z{F4XQF-3Z5}P
                  z|4q|!L3UX5Oel6{nn1q2grmaBIu;f6!pa4oPP(7q)dIVfRE7i
                  z<05H9;w3cGap>HnB`wT~I{%l{Tg9~@Ro2`aea7@jS%D+!%lEaurvvo_%s0N}Dm=t@
                  zHv{g`frwKe0o@!)Ze?aUR5@tccD+emiUYP-bbZh8WSwP0CG1@Ug*<
                  zIE>BjO{PZfa1Dt2j{OSk)eD#Z68k8s;j$U_8cAIV{En!!+)v>2$qxnW41ccH$Oy^D
                  zOK}%wK!<
                  z4&2Iwqrv?01a*{t+A@eref**yW!(A;^k!jG~f^FK6B=$wER#;Ahj2AEks~qF&(EY!K`aftEgM<1DtSNA@2}`YYSd=^O
                  z6b7cdx*FZGeV6`7geV;ZO@mB^KTIm+&h;iXZNrbze@t;C4u!pM21`
                  zV>?biQgEqEC53rReYuNX!B-_&a_O{v-qON(NZekhDrX2n8pfBvR_*5Hu@{FAh}wEx
                  zLx;~M(Vh-n7f*SF?_fUVK!3HeRbPnr^qAHXq(soHr7|K+GWIsUtW`K45bp)1m0(;#
                  z$~wah9yp_724?RDeZD*RERiyhqACM2)f3{}=A)P$h0^Dx3(**y1jJ&Mo^{dPSlCwrpz3i!sZw1AI!rWsb4U*b)Y0
                  zRGr=`L^&N;!>X5ZO3ihSQ5h;148aY_6qNV9rxW{WaFb~Umxpx}&zJmhc>_I6RtNf0
                  z=LxJ!72tL$o-dx-;PTQBn2S?mzc-JAaZlE+?zeZqev!xsah?3&+u7u3>pp0ymO39;
                  z0n6Jvz1roP99D-EhrZX1VZ4F*`M$*Vp6fEb!eeO1@=+0@(EdivSscV)_@F@}O7~+Q
                  z-Zz!^n1maF%tkE7>7OEy`Kyi*YHFR)c#{ON&$aL9oRm0R43m
                  z4+BSMjC{cTVqh?>e|a*V#%*db5c;`v*9amv@+!fwCemBJt;D+TfCHtfHebq5td3eT%&kjN;YEWet?y
                  zbdeJA51TN!PiEfS8NcNA3mZ+{hx3CBAso7Jg`lW|WK}bi?qNEfJD+3s;n_CDC56-r9|61OgY&Ryt+B@GCFTi4
                  z9$GzuX}48%J+0UbjO8r#7|<2WF|TwOr4M;zp?s!9zrAWYV))CmU~s+mxdy9`%Kh?g
                  zJ2$7OWbVW263wG$5Z@$$#H+Lx&{vxSNpeH+p!hdi>d*f)Tidm*-u|J@H{c#gRP3T~8Q3=vvCNWMrs#%{;
                  z{u*^DT7jR(v||Q*ZPedQrj0iyp=9K8^;h~Pit~Ia;|7fwE3Ry8{0r2ie}h$NMTFha
                  zTh8TJSyp(~7WG4eh@V>^_&G{@O18jH$FcsuhfmvaCHuxJhNux^8cHX$%zM$|<&Ugb
                  zsB~*CUm7aU2QlhPr45UbnehQnxzU*=K{xXFT{M>1CT4#Bd8l}PbAB19Q7r(XQob|}
                  zT%k)cv!+!;Dd4YCD>r7)i=Mb71X*qM!U^2?yVQtD$F7@^JY|^f&i3;>zjUJ8qU0$Y
                  z$6oTuv&HH|^!MQ#A3#aQgDWHF_vg4-Gs3m5wD9`V69@nH-VB{P3~|+&KnrZf$HvUc
                  zQK2Q;(w|Ys5@aK;n*Ger!#q$+
                  zulYSatn56rGbXkLL*>#0?0Vp$pVQeqQ<*!_ZHq`-IsFx=Im;w(8Y
                  z{uHM&!i_FE+c8vLMB={|a+Zd;4U2+Almh=0v=1ozLr7wugd57;4|Q$&3Pa_v_z-u@5haEd!d^$7ir4^fbn#ndftH8lI1idS1kuYKHS
                  z$1gcO0c+Fvq=L_^Z>85z8Gn_ZCJnaPWv>lRs80u>3^FDAb&bI*_SK
                  zw_~`FIuqib(k6EwMd2pI4-ZF#&iq!-!jlZ>QuZ{Ex4xA9YZ~(GK?qzw*H|iM+@aSC
                  zH<<2ul12m1<<@~s6mBan8Y{wH%$F6GDkber?b)I^4a2;9K`Z>S|p
                  z_mdSxLH)A{$&eJg%v{f~;J=BwoPkrE`mcwKl<@&f^69IHT0`Lb*+%W$ZEw$2VG9jd
                  zI*rHM!Jj;z0aao=XF*$ZfJ{b8_&YM}?_*RA9#s-;0(X(5qeKU#y59AcQaU>>Yy!nro<;rxLBL3GIKj&<+*(H
                  zjDvG+u!O!BtY*RW<@)Vhk;5&pP0zRr7hGj+Sb!y3VLi@!#%=gpXG^JEnuzcCHtSBQ
                  z)LfrV#}U8v@^zk2JAxBxf}xq&x0Ofk2*3&=n`~Nq?OAG|wdAc3gCaka6tu*^5q0YX1
                  zspD2^4#i<>mV7P@g6@XkWd#nexo9o^1JE0bA0VLA`mK*l)JjM6{O9^
                  z%am=e6;F3$eQx6O4It*G{p9Idw{dq($h5Q5f8%JM^8OQS;_Td^YtaA=rpEedTGsru=1CqamLoj+Rgt6f
                  zp!4PHj@r+|8y^J(hmaOEl2zES@qrZ`>ucz6g40)gFOCESH}x>D*c1E
                  zqnXa}mxuVjew9InEA%a5dV=Z5WM#!>>1FO}C-CzIj=1THdq5#rmwE
                  zmni2RbHV|W@h+30=ykt>BWTTTkYRNul!OlO7G$lEX00Bi2QYTJ
                  z_GLee&o;m!GYuN*qUdVTEk^r|A^KjMLuTI+M^s0qw9+|W>1A%+az{wC@flEWTv3KP
                  z;lW#o#)buB&W<;My6gPsQW8#3CugS_aN1WimZLkj$gOyHvx7f7r)@O9$*tLP$D&VA
                  z^(u~nH#Bji{oT7vf26FBQyFP)wnxQjZFKssNH0Qc;?iD85b}G*;Qmi7z}zHGAx4yr
                  zt8U;6M3Iy6Vz9fHVX*9_K);*7gT90QajCF}n{FH4_qDu>-Q%y!uSlnx=O1NXilden
                  zXW5^(Mgu@j?_l7P;-3MrnB;m31Eve2H{BQl87zK{G9}WmQ}L{cV!g@9HUTd$+Nszb
                  zFqixSgY|imrTlsM_nzPk(2sPkeKN4xUht-8>WNG1QP)nl%1Luj({K{TPsj|BQ_~P?OW~7V0-d@Zd-yVd5{
                  z!mR=C{$ou2s-U>jz_M3Qgc@o;CZMe9-0Q1MQIPWZ)3Fm8SVW>s%5uOVIK;cbOue6Z
                  z0fB!W7KmvPw_?@A5#x#>W_+%+?RtpRvw||VvH9(YYV**v>EjPUB^}{kVY>T{{!PiA{(GJrn=5kR9zb%iy`zmQPml|qb9
                  zrq4}g+nZm2RYy&hABV)~m0E_pm;ACDnEw|4Fb98A7AW%dB7FY5np?8OA-}MXa*+?)
                  zp#b@48$OZRxQifv6T0#1o1KGW12Yh`)2p;&2ewryqoa3e0_(Fe8hknb;vs#!&$}5D
                  z6~Qc(5u3IRqyM%6MwVV)wTsQ?jgkV(TY9)Pyg-&ArMA)K5Wxj#Dl8Qz4
                  z_)WIOAT>k*@bUPl*z=!+hW=7uc#uhP;l;)4n0;#DW;)#Y)3`+?MN>&u0_!K+I&HHN
                  z=p>P9mWizy{*lj1F2zLE}HK8A0sU!I*!s?EIm}W-=Mv08LpZ
                  zG8icH&uJmLVzvFRMo4Jramen*g7$L))m8#s9qU1@zrd
                  z@GXc0h&XhvGh@{0F|A=yumrPW`>mOBmyECqA7j~q`x0S30)h$rjqVMDU}33JnU%nf
                  z$BHwrCogI=y4yqRmubmzUFTOz+&FBZ#gRMm@h^A_EwYGv8ZbxjpN&-0T+9w;w~cwxfWg
                  zYYo?<4L<5}9D6n8u-iqPHkE35pU*@nsp;@qf15~-Lhn;F-WLFpzB87(BkWg)3$D!TAKN`RJ
                  z3U;Mo(@a#m+}NKW?ro|#Gfd=76wIGkwWZ~nNjmb=Czg5!(?cW6{F!C-GNSO2VYi+bh4&lU&?@bMc_Iqdj6G*XKvAXlfuG+;8!2zz7W2R?IZ>^!Ml_<8cFBR
                  zW#CaCxXM`c_x3}zSfRZWXUlSPdg-=s#m}nFqGam
                  z>>jH$CrNEs=Yk@HQ;v8@1M<}0-Cyo%r<-ZLEWWVJ{3*bI&hhOsZ(>Y?O^}Lo*y9DeR9ABLmwoj=RpoS#Ip4~%G>ik{PMa-TkI(88i2jL^K~yht<>zw<
                  zyvdCH6VI4NfPOJ^!pdGEV;#2=~gG&9f%k&Qb|O9)CvqQ;Bz>?k_!szFG{Nj
                  zSh&dec3EbteB0qbO|yjSNodpSr8o9@c`p}lM4AbA8d>nn4e&cQ5-v06E$o1<=
                  zp+n(*$+3mfO43A=(Q`8Lg4EurqjnO{H?V`g>yHM9Oiigy6}P@5@;H2l
                  zlM&=yvj{CHS0qcz+0x&>Ult9RM8AqpDQzV7WEFzEFV~-#zvEL5hgzFK?Y9z#-ydq@
                  z_Pb3&jaI(Bt=n&TKRP;7RbSn6Cot(o{dI-j2l8y1@}Orh)6-yIqi%ZVNNZEU-E($7
                  zm6`3NZ}WTo)%qvWp*1>pB;drOGT5v-{>h^Be9v4nfT)ilrgcdVrdA#Ws4Zvul`&qP
                  z7K@2e?7dBzemEAJHU|QWmz`H5Z_6uhytiCyhg}S#(!*DPEAkl2%#+#la}I*6xyZM)
                  zVx!*aOFBLVnl9e2VM@IT0)KvNVYKoC2Z7K3nK1?r!O63xFJBG7gx|hXiZ&UM0b~i6
                  zu$=z$@EPt+Lx9P{Tzn$m^5&ojWEXM)0Skw2wnc
                  zgHaHDhG22Dwg(twcc}hr8@nOx`!U;S-3s=nxhPu>PYrMG?YtiqHXORyJBtC%Rl2{!
                  z13*ju`}LF0O9NScSt2{QGdY%d2%4>JXuglt@1&EQdW#)zGsCUpho{jiJ5(`U8}2Fr
                  zeVta<2Ozd-D6z)ODbL7<@#%hlvNe^5$66Dfc?mnVs4|9|adK*I)F;X0X>B05l?(Wd
                  zivcfXQK{aI*V?NqY*+Du@FP5SCtTmFLjD#IgH@(MMH#^|RAc7uuJU@P`s<#UrjE{f
                  zfDM*2lH6@jcognNl7WGKE%&7IaXV3oO{I4ayoW~C;m>`hv~dH(Y8D<
                  zm{!qx8U^WA9R)f5HM9Ch>BnRqO!gDRd=^z6FxANNC9I#D90k53C-x*2rb?H#;+_;&6`STY=zn2~BNn)8@y@!jHYg0&Ej(
                  z#?s2l$Q|jf*nCkw^)zY@ko&lJeLm@3f54adCH%T+SG&UCkuy*V%ZikSTMB~kad}dV
                  z@pf=0w93knR+TDCN8s|Ko*cr$J7+ZY0%VUW8((Kwbvok~7wKC>YEUE+VSRM+B}qCwsymvz_Xt6LaPFz==_jEnytRo@pHZ<`gI
                  zAn(kJD_ix?dNAkDpVT3A3A7t_`W4=Di=18z>lN_B!}60G+5(qDwG8d+lU{`)CU^w5
                  zXJ%;xeNQh|?P4SNxymh#PCxyU?`THE7lFo_mdW2e{rw2h=ri0l)Zjh6#w7ODjp}J;
                  zzwuXq5Fof`c@*;o6Yk1$p@|sr1;65}k_OB~tu=vtH40DrUHi&x7Rtm!J3Frp{hR12z`!tf
                  zYcKn%vCZQna1f|1Wm%tlCBR(}y{wm3tR_<%sFZ(m=`2_+Ry||5?F=)a?5P@Oe8y)m
                  z7qpbd1EmOe3;0P-nuiH;7E=*q)y0k8mJp3s`6uCmj|m4AIx`qb?8jf8Ra)pPa1V`{
                  zp>Jc=(?@$fUZ*6~#%0R$8lB1l9sd;yXRgArvU~lCdAgKJT0uYp)H=UM9=IYi@9(I1
                  zwjfi1_w@JQ2iN$N-5W3lI%W|G0*PQcstpArb^25B?gS39=k|aNHY*JN~J%Mr@D8!=FEr%U(=n
                  zKi`7i*%$H0$k${^*S{x`5{@Y<3T#$Tb#0rfeJSo!hjAQJj7m!z@nyh3!S7M!+q&~=
                  z=7N08#HIO4&DTj5*x%am3hiV?{A!`h-XTLju_X4k1ILXfeQAtH|sE#K5-J1RjlK}ku;)y*(>
                  z%BX_0bRXOwZ&or)nN1B}ul;>q;NLtVnmcv(TsvQl*@eB#Kz%B!E@ZX<13QjZFW+lB
                  zCnw~JrLf?L+NdCrR>Di;OeV|l_>w{h+`Xgy`>xhMM}{X^&E$Y2+EKRn{z7|!N#bzv
                  zJmK_9CfZ=KU0!snWYDDI{$*akPnyen1@)fQ_R*)dNB^Iwd4)*u>Gkz(2$dQsE+Y`2
                  z^)#yOomnWj9y-aSD0uZ!xvvo0HVNU5wUV+SCXXTe909t<6(J<;s
                  znM;MsD6vuhT&ITcPXO>lESXs?k>nB-F=$j;GxS
                  zxv)jvnArMy&r8LLPF+%RKZ)ld|VlB&AZ4}7ISNxDBTpXwHOpgIyuCkgqt9G(PA?~!`12A##_X4
                  zY|4po-3Wkms^1rmPr&P1o~uc3IQxx9;5IGOWn+J_+GHG~FMz9uu>su&m#m;6on1(u
                  z$pNC;sd{G(pjbqOr_n<=4q~KtN8G3EnoyG}#W#|UKNyY(l!N?J8&41}4lz7vDpVrO
                  zmy4B|$3*ORJO$~1>U9n$`jSm}wpl%pCeoM(u}=FD>-0F^eiA0y_OPve
                  zG60(gya*LOT}ZFxzQdtkkAxV|M=6s#k&u!;Z(gz)xt(qJ{8r%J^TWHJ-|;KEqIy4brg@(!
                  zJ78k;6WsZkw$z`;wjU{-3-=rEk?W1-l$$lMJ@N*C&6P{Yz`VyE8>_PV$w=x|et)?}
                  zHh{QA{&?ne^_5EB-E2~CAN%)lSS4B8!7PqxW?`m5+}pe|0FdzUOkxS8!oqo`t7qdf
                  zt0*@bj_ulg+e^D~7fj`{+cB!U&jL@&+nu-OJKJ&=ghcamC)4Y@Dvj~@Q0O9}#{nJs
                  zDZFvuhd|b6;DYzJcncZHk>LcmGGwWg%9nyhVs0ju0H!@R=Z{7XGuapU&}LUX2=o)A
                  z$W4lqd)_e4z<>EDfE>5_(m&_IX8%I)JbwRgu9lEq1czIeu&)0Jrk5cU$oc$~{cS3I(Bu$azK=niT#4
                  z&q#9zegz}}nTp@f5?CsP+ULKjc8;3Nb?1C;n5`XqU#|V@GxNJyw=Q+NMS9?V!aTcc
                  z5!1wpQfF^cJT58U(6wpF;Jz{a)qPX0+rpqZ*B}dTbI_T9fPLXJ%Mhj>_b*bCZUlod
                  zhi-pJ9^io2JPJOlKA}!e-($8}unf)qMC-CoSejLoUwpC|p1EYarpJV@(&5;Rvb3()
                  zMLUQ0htSYEEqq&U-SIvI=OOhtY)vGWJh=esfsS7Cb%IIXo`Yoq(^hAx1^z2MraK-sFt<_nGrARSi1I3N10vbG>JvJ?{)$$xN^93
                  zinXpqP`E%ph-Ff%?;WT#!+hSFW?PEOM%Tc0Kg3a=l^Q&^VzmL|D6mO#(jIc47AV#v
                  zDJYG{RK{dEu&<6cq$ZY3`O2$-*Epvl{cZyekemlq}6imgjhz!XnBNuWpV1dw#qaY^UshT%~zYed=I5NUxRHOm;$1bxJ-ljL2Qn5qiQZ!$t99VrzasNVT6lImW6V+JO0*o^7
                  zq$tM*WPWHTUNbk<{q!lZ%3*UWY?d*0R=eeUH7o7(o1S_-gjvc%GPXuOF27>t<%fh<
                  zZPCw^a5go!@d|kwUsU||-LY%(%4$A9lNwTwRn29tE>2AmC~$9R(CYKBM^!+NXt_)D8*`Z4gZ^$JpEcJKJZ#GNPJSy#5wE6(DQaxNL(8`(-U**VYqYgP!FHCpZtaJCP1Bw`{prB$
                  zI+4HGPmxG0Zxv;U&9D0)Vyb1`>umt9jV1Y8f}PY@eiy&5dxEOC%9@>fXXnj`-@vTD
                  zT`*+bEmffx8I)7)x58Dl$TD_MjHK*z&!3cya~VhHHD48zwAo~T+2qW7f!V@6miX62
                  zGC)USt{2#-bH~nH)
                  zPDjkZvAwd4q{RJFGW+z9Y+wH804BfpXVctJx>_Y)X~7SSB){FF|0Ef%(mwxG5cD!b
                  z!_3QQj(1eDw^}$re-6hoS^{Cw9qDxmk68y;OQoLco1if3r`qE|X;7k{sgFUu0S<*J
                  zN$F?`-DUHgidsONF4oFhE`2F=^^cEz!L|(hDHSouyiVz^nD0RYl%PfDttJ_~fT&}+
                  z>lB%AWYs8C$g*1@@3IN!@f3$DLVQ+D^l>X@?$qn4U4p?m&S(tOg%6YvKD7%A=46ua
                  zFu?5bG?Kw$f(!{63992}|2xWcoex0{A8$SaCvjjrg%M`S{|T6vVf~hgx3_5#oG1-y
                  zaKd;NLc!Z3Sj_+C{Ph93tk2t@QCmK!LccEO+mi@(s2|z5hsK8Y0yjSM*s(2pJ|A?(
                  zELGk`0cJ)6PmN`|RVGIQWxm~x*}o&7p4j~Vd!C`+{}xs&Q#w(uL33&ycYFXGGk${c&VT(k1t0&U(RvCC
                  zNefQ_t(QB=E_KonAVL|VlhH@`_b>gATH}8kTRVjC53U^=n~HpQHh_P}_6R6G!UK|$
                  zu&ky}y8JuLlxmtv_51CupHV3AAU{s7IXF}amu?3$d77$iy4FquhB%C0S5k=o^5Gp}
                  z9t(wgFK!dWAo60hydhbB0(mh{lf;^x7xFa5)@#b0sv6k6^{?&~9yI@p6EBr;1SVS+
                  zWFfxpTPuKY>_~qwkatJR~LxojsLf-_`k`Tp6YPo
                  zHni4@mm3iZSt89f&7kZn_!#TeMJrY^doy|>LuVx9wM}=W=R<9_TxDAG?byc%;4^HG#eP&iYzn)I8y#L2V$UqL=tNXs?fF+mKE2i>{|so
                  zzA7(gMAee?fwsql2<=>#gzMRM4o%{S^@Npi-4_ME^7j{W4B+>rO7{rcKR}EUF`+3C6|=Dp
                  z!;NMGp+m{uqWIRVh{ZV<7}iUJ5At
                  z6!k~0#2lMv^qj^up6ncuCf_gY(KQm|VVB;TYJOF+c=imhSxQt$)l59NB>M~C{m{kY
                  z=gB7y4f^eZvb*hf2|iWcX5h?X_<;|kb3&af^``^>D=6J>U~cerV-HqM=CMs+)0HV7
                  zRbaX8jrd!j+j0O&5m%|M6az^@8wnl0$!vN2boBH`&3?ERI-*0aELivnFSB}Fw}F7}
                  z_x%_vQ>+46ryEjj^Y$o!z^QYGpCYRA`wTs@S<7))*vqHc-qs;_+q^dcvt3SMDL;y>EE~_M~KA_?KL8
                  z78{OH+bnG3<}ZPU7J%2;6lCP(nK4`(1?sb4UEypRp#LW+y@BDQH-I*w`@FUpe?doO
                  z^@WGcYUvkaOxNfrracBtOwMQ5^@D3knCFVOpD^N+uDI1YOap~}HhuoShr1jm~(pzITJI!ZOQYG6=^c}8^aUso7A8-kJWoS#^Kz=0Ez{RobZiX}lV2PR=-!(oFmd;=6)qGFUJS#*t_mbBP|=3kqWJUTgkuGYQaH`|6DhAzwgtrsgz
                  zs$=(yiO;>!PPx%3SsPubXNWv5obK&-LGl#>qEF8#2V9-O*M97BjrSKzGX-81H$i%w
                  zb1KKy_u&mUi+mAxND3HUdaQ-7JCb>;-x~naU%Ar%7krJ}5Or9IvJhcnr0OMKxE_&P
                  zYwLEYHUV2xPQXbdZ!v
                  zzARgN#Q^M3PIL_OemKhJ-+r2Mxd
                  z)iq(5!18vw`$gZz=ah8qk)mwpUZ8U>%6KHr6_p#jLsh78g&nBB<(?SE@kF;zpo+=abz(n&?A4HFee89
                  zv1>mJr7?~N#3%gW;?IpHOaVZc%Tb>&T0XD9tZ?gvwh|7oy3N4
                  z15j1HBYtrK0K@T-pz&q4Qvt8%{Q0r`t|5q)_qkX^lkxAavlHrrvYmUNeyY+PN3-o$
                  z8r_aQn<`1b$XhN)(9!9&a80TZHF-ikfa4IfzbRp5Me`bs3K38#dOob6Fap_25luck
                  zulQQt51=fC@9kyzfnMtCM_=tHJz+tFMe`P+4PtMx(#o<*f3Vs1GpF<6exD!nFrNJp
                  z?f_z*QuW~jMsu;#`8T7CZgj1seVzM50NA+xE~Ek|(VVU$7=&Qfe^clh+Ih$
                  z3*Ah`<=>
                  zxp^CZ{}Utx_?<{tSjN41hobd_lHn1Zx&xwhU)A5*!|73EWKaMJs?pH-#xC_vh1IIv
                  z%U|mNpO+&eLEOO!3@tbL2jfnWmX;Qilq3Y$m*k>Xhy#1sZ0>>{WMmY1X18jXVW=?Q
                  zhkI0RxGo|st>jy(=w{fMNovqru~!i{BM;*-p>1mV2x+e)`wc)}f_E`6v&_b^m5x3!E_QMqY+$0FlJwz@{v}Zt8fr;B2{=
                  ze};j9=(4{V$XG~=qJP{q@JEjF;8@
                  z`WF}1-0ptt@U(cAiMcA;+(IDD>J~2AeSvhspJ1oy_l7;Q&~3AZGTWlS++3@@3u08E
                  z!SxF7ZU+X;MhJSd
                  zuI?UTiug_d2O9%O}adCB=N7T%x8io@bWt>spW4bK5
                  z&_`2CmY6$J03HxBR0_NcC31}Ln6LJ7@og7GmDX2CnIgS0dkL%tL&tgnsH9_C)b%vtcGutwH$7`oA0Lt9C
                  z@2*D0sweRuGVSq`goJhEM>RD8^^sv!m3Fz(g`V;54-tuaQ*tZv#78;S_VEJSnZr&x
                  zmTBwF(s;0!w)zI!uzdj+7M3taV0?KVGJlt|AKy~WCT1z*8AqZdY2V2
                  zwE>IRA3p+KB9$;yuxk-kzA{J#R4PLMkSHlPcG`TLlK!3rmBh-*%5b#K`ly2D8L8m3
                  zsi`R&+fu##9?iA`O!n)gu5lA1Jb}~fqrieqSlxg#AhdPudG36e2>zyRUxws)oFSdu
                  zxXas-29hQYC7~kU>k#$TdGQx4Mnb3MD|Kn9?0SsW-|YNzTZr{&r;n)5ao2&0!p8#-
                  z*zzWs6|ZZbG!E(9AB{2#F92g%)}AXmQOEbVq8_**HqCjxy~;0dS<4a%KQL0x-ksmg
                  z2yuaQ3$&XaAZ+&jg5nW<$}jk>3)sEpNgdajBp{N837_
                  zBR$jIeJFMZN?++wx80yvR<`?p)`^?jwSbfgbs#UCung_0ADj35C>y*^e0MW1eZN_{
                  z6w%07SZr3%`0h|Tr{JT`(8GCSADP?+&H{YuFv6bQ7FCo^hqXy{*S
                  zxVwvd%JQ`D^pJWCpx+q{8&D_~U+Y=zU;NJpuid)Ei#zo;iVZWym5-ihh*4Hkdm`>k
                  z0x27r@S>N^yk8z2_TB|!at;?({TO6ZTI5N>|30z^89$)wAgwUqiYlG_iMgAhADMx8l*p=@OZg&X8xPXHXmpy}Ae?)}2AHmvkld}5o#l!PET{<
                  zMIU-zCa2@UKTKO&+c~80Vyk&jcitoF-P0rQiArG_psKeg;4+l9u<2L}+u%PIEwm#g
                  zKb3*ScP;j#1@_xil_*7ac8s98tT8r)q~yo-qedi3cO`PV$Wm{vf9AoF#K+51B5G=}
                  z=bV7sl8rcIc#(&0K4L#qM%Fl4uuF#Ad5tEKPH=pqAbdJKF%Y=+qr0#IjWqw7X2u3w
                  zioLDwHobOlQNvDJ@h8G3{o`6XQdC#Hd4@^Fp-1K4%5mX@TGpA)fsC;q9bZk0Dh5aa
                  z*xj*DI+v5W?3TdK)h8g1vmUZ6+c|De(5_FOKhC5EE{)Nl@x
                  zy3^lZ-wcY0=3?z1HyWqa8iI<+U%PDZwp(U}A^vw3mm5R5)#`I8asZ3%$(Qox*6;Ja
                  z=NAa|UF$}ptpf$>Qf;*cxFTtkX!QEu40!;PdSF7NgXEV3FiMBax1Ag50|TA5f@+!5
                  zZ;QPGfXst%$_m^ZM%I+42!5|$bB9Kh)g=yysaRyqE8z<`Br2FQMngwi7v8f~o99S-
                  zYU*#AW69w^0pWb0n#Z%M(UV~zm$%D#-bD=^8F3mj>JNpkJZ~60lCk2$Virb
                  zvJcMt#|;CaX0ELRD_D3ExH{^C$J*(a7osyXzCkCbE~
                  zx5B@h?#b%(^Wr77rXPKJeFpfw6mBmvuFc5rSW$h1hzLGfEmk-~y}Typ#BnA}&tH>AWJgARjfdjOa6j$xwM1fI~aqpWN3TzXa0SKSguJxe7F{Y^3
                  z_e(!~X|h2O6~Bqh?HL>6jA80Dyt^I$@BEullsF$ZcjSfbrkmvAn}14u6Dz#!Aw)j<
                  zPF*F*kvj{6J(b;A*(Z~6cS}?_!Pju-5*RP$2@s44^%u4s^YxEq8ESL+?BuS;21XEx
                  zMOVanDU13{@-;?H{1$L7D0S-m{)`kRMUhIcI?;=rP3m+^?nhyC^xReL@0+c+JYTk)4vxg*F8{w5)-c~CHdpi?)CwvZway8LygDf%b
                  z6?)3ucD|13Z$lQJsc+BnZ}At(b#xn-R$^+KsgfT*Y_f?CF_N`fY7w*uEclv53d>XM
                  zV*12%GbBDgEOXqiJbXs`X)Jejdu!Wmzm)}0s{9GlDrf($bkTpapkN#?T}65uJ*!{Q
                  z;&QYXnaJ&XtF#n?Z+3`ONZ=R7KIV*lq0Oyd-=DRT0fm}$HkfwlS@p^b1SwcNL_jrV
                  za?KXhKsGJRBJd9*qs7v}?D2fZ!!H;2f~_f1IVuC_A>5^d!rgk{S`gNeD|gFHAcctY3v_d&Qzg{D{?s
                  zH8*t)@bjVz-mrL%9bXi|6PAS(Nvu-nX%a%1Y3t`|j9^!!PPXC)QSCf1si?&*`}FPM
                  zE6k1+uUHTP@P;e4IUXpEIhn8joUpwQ9+`sE_N-ZwG+~#l9%mhyTPLn
                  znj{Ua!35iXbRg>;opA-j(`@!Of&81=X^B)@W;#{}%rZXyt5)|BuF3O6B>ebSZveF|
                  zDi411cPJ6KCPPpd!&pqUgqA5ga6+^Yxef`26N8>7Jp43Wp9t`(`>XVrW8_cV9MQ9E
                  zZV>t|oaHG~^ivKc;{Jr;0gZdSHC-xnK}d@*ltvay8h}`mCefd~7KhM$=JB^oUF`M=e}-|3!JrL~zVm@!tz?madGuTvsl(P@rWgAvvJJt{Ru{2Z#@;^1d34W>k?3p~05jRmQfSlBO0&ou07VW%bYT?f%wZtVb
                  zL#S#xN?J23PNQl{Y?-}Rz$r3m6>J!Rd^cS1gvqjRFcR_!e68>JK-
                  zym7YtHidA;nq`MQg`e*s^QoICnW2gvJEk~9B*(XAQDw&_s&}dOodG8u-f~@vQ}G+J
                  zj7oZ+GcrTc9%igFJ?qestY
                  zt8&h51Rg%1H0Es(+h*0idvK{(C{(gGea56i`xSPKAu8qOJ5O&H+ArJCFt^O!I_O!2
                  zJ0R(LMDnZ_lOBV44!Id{Y4To|9(-?O7I!tYV3L4}bY)RdT)m-um-1x`nx?8ccadcf!D`UZMVmHxR2z9aZaOA~%z+(8%CD1fXik
                  zNsFG%9aNf+g}m)KwlNr`hPO^O4MY7a{G$9dQODBgy`#+!3TY{6^;q
                  zH0*7sM{FXa!)5FG?7F|W`j8{eWy#y-T;Ft7uHWlD4(Cq&P?}NFE6UF`T3VAiH&qo=
                  zP;BUJ(Mu77TT@U~+nOfF@&z?A(ll19v*>DB7_2j?XuGL5ynNEv^1^3?Dee%dCSw}|
                  zc`T9n3oz*wrrD0a?9+-I<1U`ZN`#vwXlRY7jeX~EY+l8WPOxvy?_sQ~QLYi^8Q=6V
                  zhGVYt^^xEsCZ^_H9`<{)f=H*L^NTF1R>R!~cYSF#>AFvLbjJO;$>5UQ&}c^S-8ff#
                  z8?w?u;D}I-{(2s)W*ew}N%krP|4z{kWkzn!iYl>D^maepedK3xMmzr>-j-hP@m-*i
                  V@2nuY{X+p>TK9C-%2lkM{TKV@1^WO1
                  
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area004-v001-MC/word/media/image8.png b/testbeds/testbed-api-generator/baseline/docx/prototypes/Service_Specification_area004-v001-MC/word/media/image8.png
                  deleted file mode 100644
                  index 36f8f3442f76576111cdbf7a2743f3651b62228b..0000000000000000000000000000000000000000
                  GIT binary patch
                  literal 0
                  HcmV?d00001
                  
                  literal 16068
                  zcmeIZbyQnnwDyV9;!c6$P+BOi#ZrnxahIUQo#K|_v_L6N(c%zXQk>uvcPZ}f4uRxL
                  z?{{adx!-)V)~s3guUV6xaD
                  zV%SKjNTHzAd=G$WBqFy_KWoZ=K&c#kxsTkyvQU+ty)Nj0MwYv|w2c8=i
                  zqm=-sl%a&p#Nl(RD+Q*z!|PvGLEth|Z;dImnbrbviI+ULl--Z>^Vn%OfhZ|&TfY4I
                  z<$reLC0B9qZsrCz&l^fxdU9G~zO9jONRTalr3rI7p&I__O|Ux}&LmGDul+U^xJ}cm
                  zUavqQ0qU=$d4Y%pe5Zw?`};cxl&2bP(^##=FPn_5daqGL;H^fUATGN(XfHBmTf7mR
                  zc(gTyE>MFPRb>w6ZgOSfuRxM|9=_Y_wZT#vdl#dx%J1vmI6A%^2c0?Jl|7}2=2Cwn
                  z_naEal%S6=XTG(BANf55D%if2r1ySy2yg%9AMf@jYw12MU|pxP*6M)|H$B
                  zQH~8^7USa*B3tz3sb#wFuqA0sR+2!kgzb#U18z5;XNr=7SLe#IaJ#47fGz9n?de;H
                  zKNs})uVdw|KX10d#oR7DqOxCsLM?)vMXM4YlY$YfQ~6^;M+=`xO#?L)fkY>wC~&@A
                  zfuhpHfQvBj-RFDO$Esb57+T`o7~e+dF#vzO%8L
                  zd{10@eHOU-1?48;W|Zj9DwDX6o-p_I5hEW}mol02@5XvjCbr-thrp?vFCh%FBmoyz}!mtF4R}=)`}}7uKswT??H=
                  z^lT(fz^XqvOSgUe)Dw8L;@^GsGlh1RF|t@92wo{vYgO0ZDcx|sSyk++N=`JGI`X{^
                  z{DnE0wscLw%5t(kf4+WORQIiOOh!YV+qFGLP@3+PBLIhWhpLvlLad^HoKU$;TTX4U
                  zdY@YI(I<}a?3N=uSlYY$?*P{6Eql?fa=YKYrbtkx#*kx{q$Jm!hr+w7gBIW}NMiMz
                  zU+0VS^0%((s1=eHX|+=VO8TWhCgiN
                  zL4b-a+9ej3n7vbmW|pj!{lFAI`$g*DQ_?SlvoN%$Zj=f)s4UKXCe>nRjBVnyjl{1O
                  z!|8nYBHDIwkTUZ7l3Wx!i?%9>M`DY+Ac?8kyKl=GhPfa29gB{uv?(>?`EaLYeYH-b
                  z&j$Bx!Rtea#3EX0vo(pp4P~BGy9wU&ILCbLujNH!tb(9(UyMw=&U19ywGBth1+Oea
                  zlZO@>BmS`DLd?PBflBV6ywog=!&8uGuq8|^@4Y1D6hx~uB(mKrY>TEFz*QVtFhLKP
                  zlT8*K;yG^FY>r^RC>yiUlhUn}FI~M#-KOgw-Rb-&e+*lNrI2t^3J}#R*Y>
                  zxNl>ADc0Ln#SnMnCG;uxrnbzFFx_Tt-K3IgeQewHf{Xa+8`x8@81E-_J0MJmUGp`r
                  z$)Wc6wC0=pA1rps0`4BQs%}}DuI`$bOWKmG{bPT6dxb_UclCNk1fZ5JkL+u(4M=5%
                  zdW90f)`k19!0v0<-Bh*v2ssc<0PCrMCC!4&Uj#5MZ`cGf*=W
                  zmO5GJ$*2;bsCJR`SfMl&j@z6b(jK4r1>)dizTD@an0|7yuUW@p$6BJrpIWN^g92gc
                  z{V^wzg|cnE#Z(s(6HxRk=dp!UV^FswAYV7u_}}J2JX#xutED=>RUa7TNvS_XAJO33
                  z&UoLGYDzyr9$Upm-x&$M;TV#1AbE>j<`h_d5w}%q1<^{z#SRcWf2Nv)AIJh#R{Zqo
                  zWqJ8qGY1DNdntwVIfdp*b~Z{b**&EQ51_c62{VvDan8mOtfu1QbHogD-L&=q4+*;@
                  z=uu*&JbK0p!c)UBrdoY7wX#53Sv;!Wg&sl_xxBg9FqQ>Q0jcc>^ZXmjzK=RI&l;oO
                  z0Uq{>YNs)l8;kqN3S>eMu`GwF6k!vac!9Q)nXF^Lq?0f8hGacU;k&~)L=lofYER2U
                  zsn=_Y@2|qPny*K*{EpQtjh-)&C}_1-CdRhJQDq63MZ-9L?
                  zDnElh?mmAfel&u^s=O=sVU^H3SHDTNnGpKHm+&fJam+Db64Ifd#Y4-#P6WS|GjA(j
                  z_m|JOD2c4VWBoC+OyK2}Vl8-om5>ruaOk+iK=_E$QrP@B;}9Qr6j~Dp5X8i7+_>0w
                  z#X|n`S8U7pUljw}!T8FiKk-89AcEZ25fQ!Vsy@v7i}XuSft91*2Dg_ImD491j?vZC
                  z^JKf>;j57@CSp@C>)6W;SgGL0Q|J>Tii_uJUdGNOpO?0*fYVmi#&2n9OCJ&<2}V2C
                  z#E{Pi_Ysg2BSJmFwJlD2_ck#xfZ;sy*H$7TA}Vg6aB=R2oEoKX4tC)(L(yw%wn-n4z$0(xr*k5}
                  zI_`VH?iw2BZ$`OIrfCUoX6MV58V8=*?wkMqdYAv*=`vSs%py+UvarBimhg@qceZe$
                  zV2kN*JOAsEg;qzS2Q>UpZ@dETQKl@;FdcT^y;nn9R9M6kCkq3)4s9g!TAC&ADS$)E
                  zjr$MGmqOrxeEV&AqXm}gL7y*`Kpen1{L_%VgDvJqLoMA?tMRIsJ++gHIoy5g2U(Db
                  zf?MFlJG<}~*NVPKIU!F-B4j_+rH4Ihg-e~+zZkTCknp3^)4ho
                  zFn<&0(2x6ebhNYby8dxqZg3JfOx4n_JHdHip*pi+!Mv&J*O_hTlPHzDZmTgH@HK9I
                  znY*f-&Es~UAz=T*{qlGHYX$Wj(alCX!;Y^+t*}n7z-ZG+JI(GY!@rlM-&423>2J8h
                  zgV?Khzw?qL6nh0-o+7qfUQm0{Bj;93#E4$5cU<0UlVJ(1tbE4Ilb+q#Iq7?S&VwRZ9Tw*J@4
                  zsHV^+zo&*!OAn`j>&YT(l^{Od4iS_0N?YzOM==9}SK)v2o(z{;Z5=GbF+U$<%&~};
                  z^ZRpKQjcPL%q|*2^P1o%*^-~v_RXt|=sx{g593YtbtfwPfCd}vRT;PGAh;_z)V;vB
                  zqf3RYYzuRR2`noQ0U^yGMt>nOnU(0N+fj
                  z5^rud5u}rb4Cr@w$r#1E?%u&QRv(-xS?U7ze$qP5-c1eo5Zc*)QXjq)*I-?PPyOO(
                  z=n)^`^ihNP=A|Z2zho_xYsSrawW^P}6^wyBD1a{utu#-hC@+{zRn>mVE7m<;68yot
                  z8>2@SKpI%AP(HS=dy1~E^#7#}`rlVa|79;?NF{sFCLn>1m{>#UF0rljN55JS|MBbJ
                  z$F0G8B_dBU?bJG-_xfl2wmt6jZdvb7-MD`)^7O7AyDWI&x6>J6;vekzfsZSUKT{Pd
                  zeG2ua>z050!sDn`1JEM5e|oQmSjWh-+~8e%A`$Usd@1qZIHh)!!Q0eq_p_?_
                  z}dd
                  z_S_FmM=wM^5faej3mMr2nNnVXpe!r&jZ*?n2Xiy(!(%Fd3*r6zk?{Ob!4z)$Fw)`=
                  z*NFt-;`i#a%wzO>OYL8RW;+vKp7NT~_ATJ+5s{NuT~-sqlKE({8RJmfk>|~H@vmWC
                  zrYND`?Q3hlvjt?zzp5c}KWg#hwD=8DY@1{RG$Y2;pefjdDt9~2emfIRs(l{G;f{tc
                  zHa5?%Ez+ZD5{xRsvG5)dXucknmtGF%CSw+9Fl7l5aLh&&sCxh1RSv-$Sk*~f=2qZz
                  zyT@T0IkwmD(CEv{r@BC)6QT%wE(e@Pu7j;4d96XMww|=}$cYATH>{vRqJm!!-v-C!
                  z@i-#a=~JZx9?_HUO?%hO{XN%GW7_4Ownb4C)@MgoaE5e^KRj8NRa>}OPJ`pMs%#E#
                  z4n=(SDEWNQJu!u
                  z{hj%4cE-bb1L#qcawKD`mod3Pk-=qQZ++73|{0*NOv%hSXbONhEM&
                  z9Nwe;Ew001LxA1ZR?w-7%qZ8NKri3<$qZ>F<3@Lg2!^ZG{Nv!~3X5hHYD
                  zG08%~)%InR?SuALk&F|QA5Z0ayX&$oX6Kk&1IM<0d@m+IQkA8WPu^>n@#G%se--Q>
                  zUD|c^q1gi0F9HHGuRs5d#R^g8T#Y#M!dmsC$_e*E~98jkZTTjN++AMC#F#0HNVF9LdYK4+~kW*u6S(}F^A-yr+R20%mp65
                  zobo82J-fSkoL9U%xcv+pn*$k~$URitvV7fXE~>@B7V-6cT!LpwDZ;Z?v6n14@lY#d
                  zaJ1-H6j{JRZW@Tq5igoeKrqsCbcec&fz{i11
                  zUDiWVHt8$Hc#=(i$XqFjXWZ@Y{ltx%W7|Mtg^>+T9Z~1M!}6wK?zOShpWkzHcWU!}
                  zEwCQO=?KS-*x`JBQ`LSg%mvo`)bDk#{aoyYi`Qc2L6FiwgIk#nJ458*@SmX};&tL0
                  z>)-~&+Vb8KBXqQfqU1wAr77*~ITcTSXz)434+A|NMe}7k>+S
                  zfR1$chmSDy
                  zYM-C6S*Ihd;P8F9@n=jG8vl%tAf1
                  zUrFF*It%nA~N+1(Ta>W?W3wWweVxY~}YioGArmdaSZ$>G?K!U{)Yt
                  z;7XKNY(OftNu5q=#AmV+`<=@xNJ+q(oJ2D_gpQQ9d%8HKoyr|4nvj~GTz8}0F>2`|
                  z65=n_TOueI8U~7slerIrrKG(N6M;%)pLeolx4&gKV+QX*J%Hqmh1CZej)@0+!p=+l
                  z*XyrXr?#4*Zu|>L^a_Xb{u0rfWnbZ<`X7I)`@*3OvuD
                  ztaj7+Jk`2g#$}n4o+D7LgmC{QDzwr>ix$7QQ(z
                  zE_xrNw+tll;6JEY{w_T2Hjs5Vamu(G;ka9580ogk0yV99s0|8KB0npTZP0=}HUlID
                  zdD%PS=)C_preB>aM}NaWAl0Ku$zez^fJ#q~2H2h4N#AG9LG^>N(B}=Nw=d+!n=>|U
                  z%p4t7W2zDh7Iepg`&VajTcoFvpG1+yK{G>w<{E&)RS$Fh=*M_|%ydJ;}5-XnL^hHTwI
                  zqS@a;<>sCuhso91X#}z^+^JXNqI3ug2RM!RH;Nvp;`zZHXhwl&|N-)5m-#>B+hvvQ34PxBk6pc&U^AWI1i)15x+GS}}
                  z1b}0_6-9kGOO?pQtKFtNB_<_Gk>>9{YUO}~gS-4lYL1@Vz{ZIh#6@#4sq0V0qK5Uz
                  zjZ8rD^7cFX(oIjv@>d;nte
                  z`SKPgCFJU>^7HFyDrwUMy!7~m08Pa?K+q&{GNW&ip;D3&uJ=)UE-XH5=_|vCkKE)-
                  z5&I*lWp~B``j1%q1(7WoSts2eIlB3R2$=^MXoUad_e)$IXdE?tS724*w(C2dD;Dv)
                  zT@03%rxUWmM*5$JE-sT*RvpJ7th?9G0+|u{-aH<6CIRzR9^Vd=7u+U|o)QvfrJ8z2
                  z=GB~8!Z+09j)mJ&;lSs{q}rS-X*Pd?D)a*}V-JdrT~p8?RaN|Ol8szv`d$
                  z+BgQO9u0~kl99Vpv32`PlF*ZtAE%Zt0SrMbB5u_R*qqYohr25<
                  zK4tZO3>(bAM46qmaqHw#CXai2VuHuY{#H|v$cT)4r_u;Drk%=^d|8KR6nN&ntiu4~
                  zMmI1N9D~iDayRgL`TFw*sbi+jat3&snrph7mf^`f`rf<|aM-ATy_22e3a?o|Jv{KI
                  zSXY$cjv=N`)f05!5OA!aR#lx9l}-%?_o0F&*{kp3utc8)+?|`y?tSRC;Q6HflZ`Ie
                  z1@8q(RGHq0oi6`s10n_d(YSLLJnMY*G)=wt*eAEee%4Y+yV6WsaatX(@lYCX2#ulT
                  zOE{6G`Z(XR>gBWTI?Wl&rv%!6lxs$TH_nPN`eqdr2riebHF$dOHj}G(a)fTNzLTK!
                  zFww03!qNW1Km&XIRfX>1*tA1433LRUXzvgv62S7}*kswv)~>V(PkBd(XPNp9Cs@%)
                  zr|=bMcOl~eQeR-$0xvNgIxU$l%c2nzhRjyb?8lGwQx=8yR<-
                  z{}kYElw%w-(2xCx&_tnB>mj~ipSvwo>Jv}gm2{zitE__gy0Ze_MajKg?1hSIGxaAk
                  zbEQ=&g?&A)%z{g7!o~bzwG4d;t;b{exU7;%mQ7!YZ;S%n3cU0Q>33E--L>^$e}6R;
                  z6kt(Qr3@W!7lf`tW$nKt*leA-^0cs?C@MtfUA+-2>r%Pdb(N3B5PtqZ@?&bM3Z9oB
                  zE^-4$2SzCx8Ysn;%`wfa_KO0cv_BShH#bPLUjtMV2qo%B69nP?3Y@=+SPP9zW9WoC
                  zq|*`EpD;>_sl~l`vLfU*0$AL)}I
                  z9V28191H$Yv5(+Sh2W4La1#1cMMkElBj@WoF{4BJ#vj3AVz*0csEkZ`Y<;jhe$6%S
                  z+KJnzR|qH9fA0)J4i;-{|2h26?LlJ^FaSLs+o%4Znu0jq?Li~|qUA|qH|-VkFXt!3ASQmYbUgTv_ZL%UiIW;;zr1saFGewGeHmO*;zJkk@2`t->VK8&
                  zfP@0*2>-DFl{6)*0pt`2U&h{jT#5{}RFv0K{egj7@t%UVHA(=^1G_7#YUwJ|Nt;cA
                  z!p7m1r-t!g_k+dolZ(A&S>+Mv>J`1}UJjN}LjN%ZN5ivY6JVU+Vb$J~sJ~;DyZo2F8xFDZ5~JzQuybeoCnbgR;xM1_hih7(|N9c)?jC>kw%FwYd`al(pt`ir{L8-6dl>?
                  zltPxL`wM-e%fi)8Hbj!t>I(v#Qpx-Ux~sK6g$GkcD~ku}nzE4g(vCH5+|f;uRm1VK
                  zE~MOf9}s}n>YfJB61^~aS@aQ5Wb{V7R&4Fbq*tTzqmaaDivgQPlZDq?Be&()6|JRk}B!0&e$S4Yu3fpDY0Y
                  zhm>jhLLmba;lXpxY}=i4_&(zrjwNrk)04w^#N3=n&MOscfma)#tr>*u*5%
                  z`KEDMuKMISXyZoYFZ^18WcmFsr!i4!?}SZc$0QfeJAVNi1I4Jlr7e6Cke71*+wAiP
                  zIj}&UZY+C=R-JvsyJy9t^Cb(7v`AwI!y0}R!&i7>xr$1o1B>l>l>L4-Kobd0#+P!q
                  z7WD^eIco!OI=$cOI4w}21D-{;wdF>eUFqvxH$Bri3_APcWnuA_s6vxM@6wksH^tRM
                  zL0#(BT)2A@`cgXeS1)x{D+goMs!gS<=_
                  z=ECo9gFh(ycbruOLhxVNh9MyafYgqhbApN-r5T+EjlvCfPj$N{
                  zC2So(mBMIEQ@sJD!eDmAy1R;=F`*xTSS1+g>d;(H_9r-CM)ey8`%~6kdyW$5)k*Z3
                  zPHCZ%mJYZ?lR23wvBJ{Z;-F&EFnN?!HT9Go_(EBGup;46sH2A^r>r7D9QBMlxd4{i
                  zGJTvlj1X{ZnKZjz6X3bj?Zq{GEFUtWm(o|c3eYGlWdC(d(UoHVyx!UXanzaL|j3yQP1
                  ze|m=>4=DTg=rzCuE&ld6`ZXR9{q0c~xfTBHk;}e?*DWGpJZ|&L8QH?Q1fTNO>aaMQ
                  z^uVusq6z4x0XCfT>zh!!al>s=UwnwDU2Qf$pCVEDuY?CxkgEC+r?!+!D~?AFYpJmU
                  zN*h{$ko-*87!?|blKf5{OT0NtLuKYcr-RCCyr*@&SaM2j3OrTiKY0CT3yH
                  z$$Jl3NF&ZoxN(eWW-9elG@q@cOcF0T=#|i<%2U2QEJZp&g-}y*hKJ5Wk!0;VjUkOn
                  zU&(DZOCI?Bn?P(uG!QQ?!>_XRc3_(#-Xn8r*LWn6&HTxqTYOBM(kHeh?IFXAxjZX+
                  zxq3ZrYw#TV7v+7{6{X|D!#IRV4j8Tb&&>NHyK897i*iI*@pxHBpiap%b(kO@M$`cK
                  zx7aJv>5H#Xe5|;1Au*qVaduEwzJ!8*g2=L!P+1AhKGVPO+I)^H^bWPa%Y~TDH1S+^WI6gAaoB`uDX-Tx
                  z{dI^-?#a$f}H8;FPYQi(sIi?cLi7A1Rl@%ofJ$=p>WaE{IiI2ciPFH57b+mbn
                  zKhPQ_1@5U)HCEyagQQ(qk&|(y$wF^A62kveCf5D$5voQSk}@N7Ed1q)PIVcPwr;+20@SoT{fqsOL4riI@Zy}8T{#CbT+lM^wPw3d@U6#Msu|Z5vgJqrSFV)AKqW`n
                  z9=>t;OoS?A6I-;S_itbQG16$i@)rJW{ft8yH;E&Wc6-QrS5aE#D#Vf=M6Fxd6oTdX
                  z8R@`klH93gJ?|{!AohW1pRHmySK@_q+RgrSjI7A;k5;V-(xk0SB
                  z184GpDpISjQ&Vv+1Y4_}HwCBaJAV1k*K(?}{jVrez0K-K&uI`9?ZOs6=F`?{R#cS!
                  z=9mXd+Rn&k=D}lzaQ^z1ZRp#|IIRAqrc5G_saAyX13WTzA&!b)ZB4%eID9{W4S@Tx
                  z&s<~wUjQJ2{kaBb+5KHECGYo!oH!OIU7xKnpGnh0k%E7F$nT7W;oto96%qTp=B)7X
                  z;8Mp)gk4mX@E>jCBK{mdI=n2}H~9U-4fZW}tZ<7{->{2A*CgL@F;k1kBGbnTHdgcX
                  z+x3jO(W`cY&DOghd;BSw3(^@eT5ed|TK{h6YZk>uYN}dbrCv`gYEV^|6L#N_N64CFq<1qM~$d
                  z56<$lRpY@#Ec?6c8(mE18|eWsFlF-)Ye2sYrdK<`
                  z?GSY=P7-2`zMdkufWqZdy4A>;34->F>k-@CPjs&cWNNAxaAW7&Hhh-5tz994N)F}@
                  zm-q4ylV6f2fGiyVGCJ6@q=YyxZRWIsgRldhb`Gvr3BFH2&S#V}(oZ%i|0mbsyy`F^
                  zz-|4pGB^<1Iad}2arOEgQ4vc{F
                  zl?8eXI(NtT@WIlTCo1Ys7<8t}ao&R#+2BHxe+*q;v&CO+<+7bw!UmeWDajeXbxA1R
                  z$ERvngZ{4h{T?1rSpw|FJzl&^mx$%&#HBEOU)8?2wz(N{Q*pUIx$P?8kV%Qeyv1+o
                  zkZehRSIWb*!-qk)OLlXDhL`dV@1ZkmtJ`covcA=ZOghkypJC3oSf`>d**GQsz&+x
                  zKdgi9cOc%EIWY^7v@}Nf#y=g4_JhKg&-%*3iTnX3&>VR8a{=cxY$RCS8K3VxejWSa
                  zPvX$?)e+IJo-|cV(Pf-SG=NYLygfeTvPfKzF>fTqk6~ixh2)w_FRX#u9eY2?R;b}h;jwgAd+5h5UVD4(l5MOcCg>zEWepy*YAo%
                  zZOPuQeM6;B`hbKU-oh`@xWK0n=Wank?iWaMw~~IB#v337a^5|mY4qiwuBjp9ahWhc
                  z5(yStY}+bo6s@!`V=*9m`*peVklUgKHryCG|7Y*Sk0&m(^6Z1~{>1^>GS(rke*x~{
                  zx(qx%UJ0oR3OxBBGV9VBLDIW4rAA5JlTjY5K%5!LFTO7wZF)hk)9+7qs
                  zUj>K2Te+D9!k;T@2uYMG&nKF{wSV(flubWox@%KnX)?nuCcaGG1;P!UB$+NG?S&0d
                  zZEPF@L%`-qh6k5<>zjKcy2*1p4!2*~eRTI-(E2mxmn
                  z+bPK-g;)MMF3bw(yl)D4hlYd!!RluDiREmmsk!84eZwfgY9eF~!0DDdnF2B;NYd4)
                  zsgY7n^Pxu^b)}NV{R&!MYK9e9MS4EWBN-rvN5t2T4*#&8cq1!gB_VPiIut?dn~Nmc>k%+6B05bz*e@hyuAGJSu1c_ABn
                  z?rvC=W&Do)pl!B{%&ySvhP{_U70%{3k0$S4stf^}
                  z$xt~saJ9xMd!w7pM_c*#SAN$RnEsP0t?v+9Y!EfU*8FV2EjNM6;!a0mW$g)Qif%K>XI@G^oh0)c38M*hRl2ul{)QY4dlPmxX3&ig%3vWCzIEo`hz_+M>2QrFzbxO0vA*6O3$^X03!CVNGw-70mHJ2+B-uuvo
                  zCuIEl7jG3iGU3eEIVb)n`)7tMO{fmuD~voIT>C#jF!ZB6UQ*d%LOoc~z7y!4UAgjP
                  zP$CsD#~jo8iFM@L%AMO4N^a=0DQM~U$->(GZ6x~*lZQDjwPPU4PrSyq8(%=>D>J{B
                  z!qX-MJ(miU8PuGMKYF^w(1~djD)wFak=5ZMPZxln_L+n7RNK)$mtbj^lzmQoI(&0>
                  zH>LMxU&+bN5n-S>cKau5D4vZ7iSTu<9v}zd{rMt!
                  zADlU5^Wl0KgLYx3ySmeA#CeSQpXWTr@+l0oOK`8zX0K}8L=udo?jkZWXeIY_GO;87
                  zU9$Wc=AlDrCPSweL)>SyAKjIafZ)VtbsPX)jM|k_7RP4&-=VPJ!za6|s+&hm>Q6o5
                  z$dVB0h<^;~Rik5Twb0ny^+HGz6I-bsZH}3>XLypBs)&c+a~S=yB^J6wuDe196!lwU;HZu(fglEKLI&m5C|sHR(>#D
                  z&cP=9g0#5L7vnsCAQ>y9nC#9g+~o~Q0O)esg^=_v)3}Wh+O)V-e2vkDpT9{SDNTTLcUcd-k3LDx~}fEovUCWAS8he$r^Sw
                  z$IhJ{o)#06lSk@~1WrJd8QUI{%i{H$AM^fpdlm)Ke@Pj+=;~iIs2Up_BwmV4|T*Cu>EUCi-;QL
                  z`s)FvE3$C?ZDPU$@8bi>cIXZeSI
                  zPd{scPs|RtXdHPN_n{NT_2+JXiRkW`-Uv2A;tAYufsc02MBFHMxx#XhZ1|hevFwo*
                  zvb&b+m55;JTLyh{tOELgd+?C`f^NMAWE;5@Z3=S4-7Z?53iabe(`uKnMqW5GkIJb`
                  zSBE+dRcpz@!W#<^1@fdzOGNIX4{Vv!?&R=?RG}L(FA&f^pFJ(~H8JFnJkrBCHr(z;
                  zHjMi^yE|RoYQoz>$&oX44oHzr7jf!(s9Vn^bEOe1#x6=1Yg9RlNq>InQcUD}al*X#
                  zh+Iq;0N<8soozz-SA!M~5sP?=h9T?P3EU$Cz@NYZC1(4Xk`PhBGV8n0&nF>*DQ`ck
                  zck(X@9RHb!gg94ap0m65m36qp!Q3cpXWkA9oX)*deXVmLIhgW&=Clgi(0o*!4N}QN
                  zepgX_#VsE&E+(!RyGq5GA=l03l8N(3;OeUIe%UaBBK(KC^2e<8kj|%WGpDRyI79|#
                  z@RoH~Z;;t<=xV@W$SeH(Ysn|^MXINVuuk^#8#sOj9%{SPvaOD?w@fFR+iO#y*`rHd
                  zUW!Iq$3ir~S$_Z<-VqHJTR+C*MFu~+PK*>U6gFQoq{?aeb(S-)+BqNngEZ%O?y&@L
                  zbIei5Wih;B(VON!b$l=&xg*DyK#eXLUOf3Cd4rTt@36}fk7QN(@|Gw0RSC<}*)gj&n*ls9Ii<`)qi}~^mepvrn0-Wj-+ANk4g0dH3`
                  z>`y=M5M}J|l*A&G*tA8FUbJNJ>@eS_?W?`R|ztr%?TsasW!rLe9jX90g&!q
                  zA7S`lQU8adY?&Y%q)a~Wxk@(}QNG^RQupxq{@UX04?*m;abDiqSMKUVHd^tByl;1=sx#II_}!Z(pNIe2@Clo{c4y{esz
                  z1#4Ey!s_QY+Rib+MAj6=j>;B;EG#LDCH9|z&-#w)#wm>bO#et{sEnk;PO!9Al+IIoK_E1hf_P$x_>Mo9*c41w
                  zYVrt1%dDSU)sg~~J(yyuN8^`*MlBj2
                  z%KTQv&b#?_41c~@^Ddo}&^{d>A&qrn;t$S1Cm4a1$D%LW+h|
                  zOv28@J8@y6VzkCXd}&vexcGNE9S!J`O-UbenNq(Uo_AE!3`kxg*U;XXzV|MOYke5I
                  zH88}m;KUR3u5KbRV_sqs*2X$TE1xQt#;KGi5Z)8P^}iNy;ao=L6IOvYn0kM
                  zh}aSmJ0b{iKYsuFzxRL6J$IaY?zwuJR6b4e8Sl?)JfDx(M*}@gR%R|{1_lP!=gQ0e)e6rLFld!|}{s^nN17-nD1`kqoH|Dz||r}`lG1_Q&Pxmwk5gB!b4
                  z^Un(|oD)6i=qJ8-k@IQnkZ
                  zVDNh6Qn~`HIX>QKq}K2`V(yH!ZPoP304J;@qz}FwypdChjw8s%ceS>tb&sZue+j1TEnn{6=62h}4Z7Ia7Mn*o-
                  zSUhlgOmg3zlJ}9cZOySmh*;(A&@+0im1Jzq%~EVE|7|?z!_YslLoD0gyiotQjTrMd
                  z#bv^I^uhjA|7KdqNM%SZlafV$QevVBXElx0x>QJ|+ITIUamvR|f4m?Geu-3fn{`+<
                  zB-r2_1H&)aJxLYmmtX4x%8I_WicxgnFO=INU%*uOVraotEZNO^b!MkdO+&)v*b~9E
                  z>%*{IP!ff#O)A@-4I7o(UgCh*h>5M_o13lV(%__+fU%|eqswAt1_^)ECH+VKzElW&
                  zqQoP2rLge5=xE{wHmE>GI=9y3?=5QJaPs{lao;!>TPgMk@P!Lo-9|94inw$ck!&zp
                  zx`RqYKY4d<%zQ@E-Km&>w0a;6Q&ur8`G;5_ViW!hO>J9zaS6C&KGgE%;m|wM&#Un3
                  z=5biKbA}80$=*S*TkswP=cgv8|FUmj>(4d<`{yS|l;W_Zv{*3%dx4-nwiwDC>(+sA
                  zt?{(NSJNIHrQnFu`9{bU9NJ8rhSa}sK`7hpQ_4**kvYuwnUz`
                  z=KRp(0h|AtXI5gF^oX)y+)*Q&qu2KPMbiCj8LXc|FB3km<4U58r{zmN@&Om71&lUa
                  zo#M#*YaEdN&GwEqAJKSif_tIf$I-bJ$x7XAdHou=C7-w|mwnDyUS$nMmU}_E|5fK-
                  zlU$atl9XG<{?Bg&Q?khjv72?iuTi^99QhD%TkP(7yYrJcZ)gJj%uJc{H{mIyg&?wQQ9
                  zlw!Gm-?I-RxcjG#Ym~*6oZR_vI3dBfpEwR0z5lJ@jdHqt7-#uO#8D-$u&&yfw`N-v
                  zxJmej6s%2zs8SVOqoO~JHU^ju7W94%#_um>KXKP=s6GA~RDZngF6ZxAp*CnU)6`=D
                  zp7Bo#B(ze}W%nJu>~^rHlt4%qbnxQ6$B#!Dk1Tw5OH4n-BihI1{bc(hm&Nnn_Sf2A
                  z>!(mue&W&IX%QR$pLV-{biWe)F*>$$C)f6Ov-8epETs6y-ku|F27~~D6vy@1vR2J`
                  zoNRCI?eKM`Un}h8gN>K^hsR|w_aBbvpS#pv+`(gN1KO^04_1F1whdw7wB-x-%MK0Q
                  zzCRW*>%t^6Ad>aK(E@2r*~;#y5fl1Gopvn{PQPlJ!CgSS#O@!*8-pps2a3n}*q^D?
                  zUp{9+tZW^@L9LvWoJ6lTG?JIo*^D`^FE3dB1qZ}n(WdhpY(OCA4a_1OyiXT*+Nul8SrnLvYleTnGzrlqd4j5xX-YpL{V
                  zvM?Fbx?YC>Zpqh~kEc!pXY7e96Y%(dl}-LhKXr1QC4h(jdVJ#A^z2807B)abn4do>
                  z0oeM)m43W6t;sz?oD{M|&Tm?Xz#fV}U1-LoJ5AE~JV$=r*6s_kvkeI;!*W_dNRK5t
                  zoL()&n-q_kN6Tji_F-v$Qv&UO1VX|u<)x_c&bi%_0%NdhJ
                  z6@KV9?Wt+%79k89U#~a9wJb><*75J-tk;w4sECs2PuhJ$+h`}OcjLhycktxR{BAA|
                  z!yHXfL)Q=G8PqOr&`3$pg|PkJYe!A<6_d6$T4BMX@hK@Lx0;)`Gp+zjGM;}sn24?B
                  z*Ai>4*8&o3iEWnZM9YR|&Qb2)VgGvh^@f^ggs0t~-VE8GLhSk^tELqA0AhNd^Ly?)
                  zuKPfg4Y=vX$qK)EbG48SlVtkRmXAGt0k_lN;psmYw#p6S;3B#Z9|BpCiashcEK7Jla+4~u0|t~-6uCN{v=akrWJK-+!xJLVmWFY
                  z2;RChD9E8vNqo(N}UPytI4D+>^NFSS^)nS^|2-02^
                  z3rbWn_82%NzysLDXl^T6E=mK8KWjJb6k9Ms?id;uYb|fV{E46SjnWD
                  z5kDO#Hn6j)w2~WyhOA4gp#wUK$h}K79!vJ924ER~qgj-gOnRSXq`7yG-ESn%G08N#
                  zetp8(qMdxvhYYTmwvS!Pe+*Z|+5%NXOt4eF*46HAG_ZhfadJYneN|PXS>VHhwhJxx
                  zC{YgG57R%m5xSuKu=RWnu7Pqy@U$`R2vUem#!$FpSN08s{WPgva$_K?0?7!Y5fTyn%*X}uvdWzrf-hrp5bXJEs
                  zO(y5WUpYP~;x-kIN@IC@=U|Vli~pV*53;eNg$Pbx0QTZ|Y{0`R2{hKZQE%^f-%_@m
                  zMD&8ixieqb^*wc9f}~LVRMifz-bjNsb{3sAw(BeG?k4Trmi{$k)e$EMo%xMQCGQ$B-M&FP-cQZSc^o9%7t4KGFCx?o{bi5!(I1LFXpQ8UIv?ejVMr1mzfm+@(X#znNGHfPM#PS6h|WK~>^k!26G{O#a@
                  z_5DZPhngXyMg*%?++ksMQ6X=Di8oFcLNYTnF5EB#>ct>V;QD610lFH`A|W-VOUv-z
                  zXATY>*oI;qLJtGKYo#!Ei7U-N$qWr^wEouj+|lGaOGSJ1*$20N(K4wH)a>i#`j9y+
                  z@)1z3IAZ%HDjiI)$qSzcCH0)FmKGKgs(L)9{o^kTnBv-h9~aKu)yxnVSf~;IjJn0Z
                  zPx!OQM_qmspyRri~tomIE1^=40pY~Bi
                  zV2S)nd)zk;+tT`r)wT+bLLIQu4W!KxNp
                  zg=!zIVqRf$H&$h6(AuVlf@e>9tIx(#?glS_R>YMuc{lT<(^8f2dDZOK{?pFm%Qbw{B}w3G-sWOsze_*4DmixMM{Ie_~;wpINMp+omL2e7!NcgLc
                  zQOYCSCHrj}ls4@jx(9`XIHfg(=zkW_cg=9xpSzplw%c%YaQF^x((vM&%R%9Sv>Pqf
                  zm6g|ELu{ive&!PK?{96zX4sCNM3N9kCb$l}o>m;PURnal63!m3jOw4t6L(TIse4sK
                  zQ<4`jl<`l?1*!K0K&_*bsEGbDPrvB|w{?=We
                  zpBrL|^fRrx($EDYiM~Pgpu4kbRC5ejtlUckWotX6U0&)lY%7&3Ud1Q4W>A*S=m&%_
                  zuA@nJO4yGv3r~l|A`bV7h6pY@%Qgw{SZ0`I`rEjkJGp8
                  zMy*9}ZNuR<+J2N0dwH)%AoGumpYH7Z7UZ@;#o%>6!S&0v7fGaipxLQoc@31gJ9I(V
                  zeSUt^GraJ;dMLB|-2C~IK%7&s>Lo&yf)k88*p_VeP$KKyW;f0DR+S#uh`(sn6vaR>
                  ziH05?KVvm>R*pqYCX#8d4xOPJM$dT=VsH`XG$~MA
                  zc9?6pTmH2)hKz~Qx)7UgN}AuQv|6*6%8zp!a0K&GtKaI2w=UCS5>#Srh)bP;!t7Q(
                  zBB_4nSG7WjjE7=D6s-r7u~BA@9?LhW{n89smACo(w|G79%;_+bir39uNvzW3q55=1
                  z@}ZBqI{$syam}YeVL(+w!eeI$qT?=ogZ`+g-)i3O)6Vf)DQsf{Zz#A!e;GX}v_tS7
                  z8uG9gt2cBQNrNtXl^Pj01_l5J_yc`Qq}SiNt=hY-zxl(5mtpiJ)B|J7;KfR%2bTBL
                  zlY|9GM{&&ts;|CWfaT$Q1|Qop=Wu-2c1K{AD}^4|i5gs@>>HWeaS-tRX@v4KQ4Kb5
                  z550BLSIu*5J&(wRAqD*R0*i-rZL`5IG-JoTQ{GWlS<3In)t#L{_iK_l8B6rb7cA>N
                  zYOMbBi#?k;mQ~M?79=K!y&WmCe`{8rHH$YbnJv4d+zUU=c+LGt!;by^kqIH*bh6Sn
                  z=|U&6=@BJ_Xu8CrZD{TBg^h0_Z%rXN{Z)UJTz9d3@KOx*Dp&mX)YKFQ|tuI@%CP2X4E#wBsr{F+kBNQvkGySSjrD$01ir;OXn)w6E8GYR1+-QriKv
                  zr!N6KuO$vvyLAsj53hkIt`vV)CliMbB1g#6TRU(Hs|s0wwbOi%Dyr63+j8*Id;v&A-h?}6IL-T
                  z^~_>d456P!J|K&sDf6kO6Ungeo;)>frbd^j7T;K5KcGR?{ZC`u_eXGl}pufkfK_Lel0#5Ls
                  z*B%D*D-FoV(5B->RP27{X&~&AWJd&#^SI6)`*#
                  z*xKmM=I57_BZ;RiD~Xz9vU9*;x0z#8>c^oFzA(@5$?%~wI|mB8ihsxmhD}s(^^B@+
                  zR+F|^Os&pI&wJ+FE1M6zO8!actqG=DQB)*pB9~R_AhP>vn4;lbjWUC(F%`GLRW@c8
                  z%IMd;Elanz^Rsi>qs4%>6Ci=5Kt_qJcwbq3>8{h-fy4H0-+|`Dc=}u4f3XBQ+f(|cDiw99d
                  zuc{!I6Vl08wr)ady4tW&)%Hahn*EU18*QD+oCh0@mUz7?r3^n^_dc=;`7$+O2RpV3
                  z<&e&CzAe4xqSZTnruU!#(JCMng>xr9?kFiOws?xyy502yf0{@4{0yidzYu>1&n{j1
                  zI_Ra5Z)eRA;;h@$=T$80RzR^u_+4F~iP!3_3Z$KqO=7Lz2(7gRCHtGTZ{LPk)`|ai
                  zAE~HdDHvN2U|{2YF~it%aY4CWE2U=7u)Mi(tmd;NN6$f|&XXFMSghF+h5K#|AU+3(
                  z{oQxo&<)yNnX%UP#D~~F#47bor~I^6chT>LD+zGBCd3;lb|*dLU7SG4*RT|swQg9~
                  zLXXLeG(2$UDi>kk5|Qp6x#=M=qGP2jsHSV6
                  zd(_vXJfWi23K9Q3es<74Oka;=XrU#Y8#Ex{oON%d$aw~nOy144YgxS}lp=up+
                  zV~_WaWNy$hq&TAP{{6}k$Hg7`-IUZ{S(ZX&P0V=5{B-hePgnthveMz3B$r)-&yz5V
                  zmdXwKa-mlrXxUE9Ziu^0iU!PRX}s*~LAFhDCxQ2R&qv(YUfdcI$r7%k$%?C1IlcSA
                  zn&iKqVrNqv9yjJsZO!zQcHNc1a>@D?w+N#8#rvl}y^2x{^WM?I5UuzdBgc;fGrL(a
                  zj~_o@7w}Y3*{Gh$W4HO_+om)Ywcplj)0r~O(AUq{hTBA
                  z9CpaVYQWbAj20Jtrk`4C(-=H9+s>*=Rv7^c=+M7NJt~yaNZqd5G5WH9{%3Q*<8D7W
                  zryDQ{k=u=I+@cbZ_{3mmOBeDjCCN*kkke$siiB=a7~Y*-5taH#zD>u@gIF2%z&}0S
                  zZSV8IQ=<_q{DXRb)z`to}2T-V?|UJj9)U-$=LDortTjAyR<$nhA(0y6%sB6zn5ukp02
                  z!o}`0OaA3^^OCPdd~jhQ94L=T?+&*;vIR{FtK18SdfhWB`pMT8tDLNUNnj>+iAII2
                  zz5ZtljH$Qt^nD=@OfQc1WmUJo9ypY_k=~8^deQ1Zh^FnNxIX^p`rGP?)a1ZnZ3yL>pHWma*P0q5wDq9WBveVJocVb$hQM>KS
                  zMvux&)=$2)CK0D1)-EI&DWuj@NHtFZO+
                  z%vwXw>C+9Aodk-c>-d#Mn&lY1gO$WNbht^vvA#jFbd^_8iMv3(n7l~B7UFtbJZ-CU
                  zM|PEvGN-0P%uV|bI37eef_@{-%H`(Yv)0ULf05bjKT5GhdU(Y`@dd#(hcNdb(&n73
                  zjZqbYm
                  zV*R+M2Jyasiu9hn_hIOmt(2R!ELL7RagyE-^wmrH8~VRb10r&5&+3MM8;gR^pW;*zIs(c`&lY&PMG5V
                  zjdZ-kJ@TZy5xU)t94k{PI2YXS+dANs?QE5tAt~ykN9bmvhKIS62I(v~-48cbshoa|
                  z3z+65xzC@qM%w-=i~?QT`lk-}vCe)L?qlX^z;2{J_PC#YXrn+OD%d%}!-`+2pSDS1
                  zQb24~6mr!%c?7Uv`RBIb0wo4dVN{V)Bqa!N4}VTM1}IN?fp4%w;Kh1*8&i9&{&s+K
                  zSYEE&d*uHQR(~S)HkjsO70JAhwjU=-()-p5bIMVG>)|?(KpANQuT)LOnZn~b1$W*(
                  z9G(tcVy4ERc0&Wxgx_(?>!;+{@nXRDL`5gUKnSQ+Tw1y!I0YT};j>n!v>&cm-Y;wJ
                  zJ(@Nl6G!tARVdAIQrj=4Z4N5*`h}pn*0*e^{r>I#VwF$#iv@{w$pN!7Z^KI&UibV@
                  zeZKzg;Ny>g5iuR{DCePCj?;%Y{Xu1RoiLpNQB(2dx9gu+@w5j_QLneJ-CHd5e3QtHn+LgCrnDy|wdkg4k{$B|A
                  zo93HRlMJti0ja*?PXp3YJ6xscSA%ki8GjCB&C(EKWBjLg2E7rX(NJyO+&5Vm5#cxr
                  zw|WNL(qs9o%ppYAkOfIo_{{=yO{py%?Pt#nJJy?vbXHzAKE`jW)aYx*{(+Oha|c_b
                  zF=n=HiVlp7qeOqwHv>FEw{GM@eKW=ysKX0Twv8=SJ>3rGaG)bR0kyh&
                  znN7gIboz9Op;B{wKygt9!8^IwlG@W8EGK%xI3c-qP)XghEv`y3%~EMzWC!~I3`
                  z7v2z`O0!bs%=|v)CDjqaSM8ln2NuO)+mL;q(V}GiOFP+xx>nzRKFpCB&{PS-YLH|!
                  zO3Y{WA?YYo3Y@Ur9bE$Ih{nGl9~P69=G!?A_ET)4V|2}GO7=%K1}C%0FQJVK<~;H@
                  z3A{Agl3^HGK5&`NwQg-?7hct##nPQk3)v`1cRChF=NmKP0s^F{foM6;JX?!mz|t0$
                  zk}?I_raFRvWShBX16q{em9QdrV%WT9flPkJ)wf6F-qs(*%)X%{WoEv5I}D+~h%%h%
                  z;AizeNA*P&!^lCx`{x2l9nTd;N{+7T9w5qq7Qbgy!e!c4#46k%V8&J*O1kPd+_dLj
                  zbxkyO^K6;QU1eqUD#E(4k&%1yiWN#-2>)+<$W8XFqES$+>oERVWdFlLGxH?B;p6eE
                  zZe!ZsaWJc3157|Vf-}3(B+sr^r_vechTr=W*4WM{kuW&ruN;o5(@Hu&^tSz+pBiC>
                  zi@If6kF>b~XcOa+v!Kbu-PL!jtvA-|VMw#|u)wVejS_cJ>D~31!KfU_h?T%<%=NL(
                  z$bBwK^Ju9Xrnuk&DVep0;?6k&Xh?y?3v9bmZ*Vk5dUktF7x3(J-K`o=sD@~HFjLP(v+jKw*yVvH@sofL^okKUes6O_wcjE)!hovl0gUTetG^eHJPSuoZB~b1D}7BB)K&nP5^Q
                  z^kAp)+C=u56L6#Un}@JlxiXouI`AG)kKeo0gWa0)LO7^_fcs^F^r%n{E=+TwJ2Z+J
                  z>gaqwxMW$XUIp3Ffo(PsgQw3HY~@t@*^eM?RlGc*k^Pe-i$8iWzmDGY@ezqwY_C1~Q~h~RR(yVe-po>qb$^K7m=)YPT)(LArPb>-
                  zZmp?CM2V4{UGg=|MG2RUQ6MkW0EIkH7_E4l9xg=A#B!X?pd|dAI>B@TD>bR11Sk8+d
                  z`qQBBKfZhGQQV78s>=Xcu@kX%ZoLd|83v#cKe)?GyE;{6CvBM6hGLK+;nrls^yxF9K4s@*`Id(-GIS2s
                  zQ#z_a`kz5d3a0eX@O47}99ju?Q=BxGA0H0*=tmYRtyw5jXjuf3;x)g>Q(`O9Tw->i
                  z``SoUoOQvHaGYZr#7cT5*mKQJJ{Azihaa;WHRseSVHL6UAS*N=^k>}3yP`BK(PFRn
                  zJugA$iNX!9<8i;98V#4LSX}E#T0*#4O|qx@%ERg=s^uPNXLaPU>!T0f$5>G9=`A0u
                  zQ))V-E9`i}Xsu@L?ff}ghq}j3DES$a+gQ1kvHb5O`K=E8vwlfz2?XVN%w><(yBPd^
                  z`UVLlGMh%lB?GnsdR;*x90$&BE&-SaoIYKLdSy2BTmB7(FL{kL{rh&QIjV2Nd~F2o
                  z%tsXVyF2@*gQa3+|0z7ZKU~jnb}xi9mn}t^Up5tWjp2dTjUoEEV!`kQyp)Y;(aSN&
                  z8GR)~^RN)R?UdM7|1P^O<$>NMlpOt&-ieKCwfqGBCZjIH1=jcVqiScVYs<6=}E3k4eiJjx96Vv#)
                  zaX@_scW?V3pgR_6cQ7N4y&?0uvb^-e?T5o2InLO4&v(AX@lP9WJO!NZL*K}=v|5!A
                  zEP}bNrs4frnvnQ|+t{6=9WyH{P3KF~=4wgqG3KoYk*3X%-yXRWT|#YjvsuTB8#ltt
                  zjH~?J{F@0QIipM{PCJWy{SK!!u9s*I#Un>0^VMEIVKd$#1wM!Y93%i*=n{1fx3uwW
                  zsL~4}AJigF`4-p}0xfSaF>n=DGrAD_KrWNp4q&eKvu-;0kQi`_ByB^q%y`MLU1oi+4^H`B~H
                  zQ_5IBY(0cJNKd*|$RaU&%nidbFf4X5sbM|+{*;IK*c2GHwlL?^$zXRjEkaD{O$?A`
                  zEfofKjhh}0fGGc4ZY=}6RQ;4bn>+q+_%2&!=a^R3<=7nVA%p(U*4dzxh%OGb(S1B~
                  z@Nuv6B=YWLO}tA*7!q6&LZuW~oF=cFRMn(U;MOIT-r90$G`+bHbZYlzN4}g&2LJ&X
                  zf2sRYWT*s-B~4tTGvQm7N4_eps;6QsrV3qJYs+Yb#R`EEZ-Jn=NB9W~hE<#ED(x(X
                  zir5AHr2VdE?eGJ|rLBAC*w*Y&BFZ55K3{~J@eRKI-CR7A2lXk%AiJD-V?`yfg%fP8
                  z$%A6Dt$Us*_koK1>=`i3jQc>N@n;w1WAAu5uvm(9;YM;}I0RHENtm;gFMM)6O?oQA
                  zHN;`^<9PLD84sHr;4ZDX&na@nOOH?v0v42Zv{LqG`jGUaaECt3CkL}5k^W-V3jIsR
                  zHl9srz4E5<#nQ2$O?rAd>SeQS2+c8PyVojjgjUIjrx*1*w
                  zx;z;4z*e%H^!}x0>mD60jmYRI#;N$c>UfLfe+RaYQJQLvdH*~pMe(bmZ0_J1Z{#h$3E!xYn@~kV!@MXdvBkA0K*_nX?lh`5
                  z#j8YMe}P?We`oD=c>KzWcY!_LwA$-svOSi55!->;&1IG5WQt^F%A|%>{~lm+=63Ec
                  z;M-D3I=Yh)(RMZ9)Ia}h68b3XN{{jTTXOKqTwf~{Avx20twp7^Wr4K+W_L*T4UOLa
                  z=?XHxf}u*o_gP$Mf>d%ZGCNzCdy(1pSF$#Da(}_`<}r!~{e5)dja*${^IEbNB44((
                  zZt6<_BJbs+Xr>dCXV%jY>E{)D*PNjam%avd#D9>a*Q?Ia0?voDp82aM
                  zhw%UF58c_8P}g*Ag;6#kt)K@ld1CLr>1RCOt0r3}%km!&Py*7UTkMFF4e^}>%c)qkNhfYl<^aVCR+21`pz%Wy$MU2?XvzQk0bIfIWo
                  zqm(3nv}&O&+i9L6^`O-D(um2kit>!zmgS^$-lh(v@c-5J0BVXnf}L#|IOK@8tjxbm
                  zyRJjnoM#N^;6Q&j&T;&+oL7?6I#TAVzBa{E21L@Y3v@F8R|4$cE;MlHv&~o1F$jec
                  zJXmn02@PL?_al;8m*@2A3)thM&ZWKp8pksWB{kf2)I|5I|l<p-tN$F&1wcq1btn}Ky1ugZeM0lgZ~
                  zHLvb4CHo9BgmNk2y`&Dy+R9TN;GmDc4jhiZRwqu^eAi%W9+4<}wf_(2tD~b($#qh%
                  zXdqpF$&&GGAbNjE#{fB3uYVkgFdgd`D?@d?qnctmQ_O3jjSW9iY%TJm*2@tx(-tYD
                  zUCoASRb4L5!Er;ucWbk!D1M92GPAkrO^lm732D>g5%Wg;@1_=jhIOaAM=3jKROcTg
                  z|GhRb?W5nnmEEVS1CeW!H)r4*r&)Pl*oE;GC*@}YykzO&{-H^+YEcH#Z~yk%G<$-B
                  z60rB3xaRNrWB`!sO-I`)LCVv?*=wig0HbGI5nMP1mMu65Qcd8r;q}%XJAZgciq=Fyz=q}DRje}qy&r)EBDOxiYGjXP-J%2z
                  zYkQ$pvI)z}_fUHHpEK5H4=d%2GEf>T>sYv>RR_}vXqt(JscToQfjnscq&(nAB#BGE
                  z94oiFkM-j&V&P==vbiN*b@Wj)*0R{$v}L4Op9eD^Du4N$gX#CcX^-JGN$ymjKQWkY
                  zaC;NhLjqZ|pw=`hea!*t0q6EM_~XN{BK;Z{&(EZ;uW77U=_xGBnbYFHm*(zQi$lIw
                  z$!tzEwbY5Qb0mFPP*hM_Or$p=J-5EuYumu^C&WR1H(RzppNCgWPcFTv=wHrSFqN4*
                  zz6|KdcKrH3$Y&QZrRW>vX@4pTNr|o-vm1?|ZvI`X(mf8_zl|B<<;!{XR`y*k@O9Sb
                  zkE0V!0rR`Wgn9T!v4ZbOk#>hUr{;t_p8VIt`X@1Kh6vWC^yY}z0GvsO5Cw&ILQR(dkbYM
                  zU^c8FkhFr{@wGIh%fcMO@fyFC6ugiwD0^yi&zJS0rkrE
                  z*5AAr>~C{!Og%yQm3(oU@EPq0;l(ulcs(7Gmj-~2CSXWviHgp+Qm~{gDt+OvVpk+<
                  z8&GjL7I&~22VlTSl*GE1o4b8^AbA~tzlsC#qi|A?4YQBtvH(jIGz-lpal3bY0iY-M
                  z&DY8>?9+*Bi;IaSNuoCr9Wcxx#xFB3jH@%Bt3|L9GI+qPY>X+`U0(-GCFxq{#zsB(
                  z(BcLOJ7A6U+f>kNJWW#Wz0YM<`TY&29}Ol|FX=HVeOcmmJybrN1-
                  z=V-jy@J5>6a!0upfZO$?!Egr-CsPgPwzfdT0$`yLpgaaJ{W{;t6#WkHkf5E1Pu#nA
                  zp{BXkA0V~J&j@$h`BKt#Nsr>`V9%_sWY)oNbjr>jG->BxS=gk}ecTO$t)fP(*Lo&5
                  z(Myw4Wn#DTYwkyuJJImmS_nOo`0DM
                  zpuvcSps=02W6{Auhb=8F#R-mAK%=#@MS$Ixmi~K|`15260dnx>T_u9Qj$+C$wOdvr
                  zA9~OB616lJ5buM>M2ut&dNZyC#I4a41MPIB+;QtDPGSD4SHC
                  z4myEz0Vq!r)Tg{Q$&u#?8^NVT>cQg5cNlpKYy7LFt&oR2mw0%*Sxi;dM>Gl
                  ztN7lmX1k6%?A9Mp*lJFGe+4HkMlu@^Lk84G3gx6s4*)WV^IvqDxEqm8U4uUuucCAq
                  za5D1)$Yy;JOIHs3rud>2lfRv2JmhdZeL@fe{#vI9ZKbx?vT?mAH(?-?$I_yQx0$*c*OM?@tyxnlpW1gQ!q<9L_
                  zUt6}-Jllwq&0P;TBI2E@MO~&*1kEzPxv5C}25P0i%K5&yxUG$X=|E`^O>$?#31SPt
                  z+;#uFaBlG`0jdt6TfeL#Sr}{UJpy9(A{>DQP|dqu^~5-QI$x8wbVc+&Vq>QY5QpxI
                  zNQ!;%vXS!$MB13ermf*{zHA!+%>UYtQ&*eZ(tcThp`g~x273i$Wz$Tv&j8?;cBtF+
                  zqsa$H%Etnx@c4ca7*-_7`WD!ryaJTem>05ilf(l6WdL4hm*t6=4M&M|fIU-7PQ_uo
                  zo3YpCfHa}h4Wlm!lv#)UTV|Eq1GN)2J3oq<0sF>vq#gy=y6E=rf;ao@w%K{4-Zb@&
                  z=J!@U?1IjeJ{54KN=#j0};doYC3vGVaDY5aQ=_*EY|(=h=riHom^5h7>)%HZW;7#m;lES0-7ze8yajY0S7kq{QV?mBRPqk)Tca
                  zR;efMqUX3gVh53b0ERlarIK|m7vBJ^_SqiMXysmDNfghwZxcUVDjz!MDdoG=ipr=%
                  zaM^vHnb-JSWXazHt?7K}xn5;+%L6u}YjwvawfCL@hTb<$toJ{A
                  z_G}P<}x1aAM6u__mT!)i&a=nY_H_eeKd5u&*$T@P4S%{3QPAo*777cn7xV6VIC
                  zS07&gW-*NLZEc=#>N2AZG0suC6n=+JANIucyT0*i-E
                  zCNwEo;bTiNpGs!(YUFMMAI>SH(O>&yH6`EL_#C!~Lxef=izF^3t}1M4>u3f4zbF_@x_yET3Q%Hd+IEF`49
                  z&@}xWfPepDWWco_0sVFeh)$y&8`3I;VIKhlxfkag7%pZd|00I#njsazf#ZzJi~*=?
                  zxJ{JX16##%pwu-61XjSj`Yw1dCbv+pfAK(fv;;qlLzxdEc?Kt|<&1!#(VZSXpuXrz
                  z4Xba~tnroaD;^GT8-c@d3k)z%)BAj{kj7eoZ;3C}*nFm=Gnz8vVMZ0@SX%JKgGypD
                  z?obBu$Wl(K3i~vIA)33;b+xD)n9{h?aMG9N?t3(B^~v+dah0Q{tzc%k0L`MV#G9H2
                  zm=1-HW~y&lO+*Z{VNw(bVb7mE8(XcT?HuimiQX%pxn8_A0~sqaH*=qC0|DLB@(t2;
                  z+L)zMpdAzl=rczU&pqwua_BXb^zRyjQ!r}aR{WXZjXYKhRbOp(aq<#bg|IM%QZb8S
                  z>u_7u*1Zah<;|q<4doqOBj)u>6G{D+S&z@>e9-mje+uxv{SPELA6)+iOaXW#JLv%J
                  z88CIFJqP~%{k+H?g~?`e^_&dE8>kwy_fLi%6*fE#+TO4uq;?QkIFWDzjcef4EKdX)
                  zZa_`21%5;WT`F*Q0Q*-9pdbx#+RV#?wkbt{mDRy2KzwmG>n{YtuVesSS*oe}LpIS)
                  z9~g{kwFCHn>jBVobuCaGr1J)OyjfqD)AV(*PPsOFo4r^q|i96o7fE`#i!nJ&%GrM
                  zdqU!w$5Bj<>(@UStUh*m0Zax0^D|7Gugf78Mwe#n)Bt@0uvo_cLfa@Mc1dctw`Q_V
                  zcoOF~USrJIUk{)b>wBeuLb3Ao9EjLu#x8XL)JbPAfubxnq^juAqfw^KdQT~9HdrN<
                  zoLE|GFD!gSYySZ6jlFPTcX+uHUL$trj}qT*gR*1aC)QEGFm|J6vqNU|pn$vrQ0S93
                  z-xm7`1k01WAgaMxs!s+MoS_x_IKW7h1B&Y~pf?BN!Fvm->9$7+(N`}RP!UOqU%q_z
                  zwgYcP5Qp;Lnj$-Q1-4e{${?B7@Gq0Ea=PzVES3t1`uwE{*733swdGWM8Bat
                  z42_g{Gs}R1Y<%!%q|*`LUJMZyWP(IpEvvH}Ma@*DR*RVgHt~i)gcKTGJbtAJUT
                  z|D9t0?@EU)W>$(RCYED#zknI9cx)f*3#6^0G@1GQB{>L+#M4~=iJ!XyY@Q6rNqq`H
                  zrDdHc`b?V)j6+m!#ob~*nAiPfRs7|aO5-6>RNdePy7a$U0Cn8}vY;-jNjr0KbR4ip
                  zPU63H1kP)Bn~jfk8LUkznbPUSlTB)t&4cD>>Rwu~252qVPF-VP_?}~-bALwplZ1`=
                  z`FBu4m?zx7?CjbUP`L(wkB@KB!!juN2Tq9vd|B(NxWCc|BD_YijfxC=u
                  zOX&@hXq5?_V|DiMiza1ULX(wbLE|3>(Cy_U8C4yxW0AW|aA_Pac2dVJvNc#Lk2l+2U%PtT*+^rbq4e0dwIp;i?@5Gav*f7SfB
                  z&&GI(lmTRSZL1k3njCq1+0~KPmma#)ZZ19BFPSSBCpU9DdktvEOZA%%&3rlUxy{Z0
                  z!_mp-k`1puLYNFTNnhJW0GW?7i;TMr1tx}cK1-+sr;ATqRft!8EwrW+G@N**UXg5r%IRyqEG#spuVD?&H
                  zgpPEA1{2u}t!2i+O(3ny#*jz+2Z=}Ge{Fqr>P8cxD>O)rnWe)~e?g*5exs15qh)!y
                  zkX_o(jzql`6|ieVTOw0IXr|jlhR33$Q??K_LtJIp`-Oh$EB4jFosRzW_(bJ$v=CB?
                  zPTg@pfV!dzZ>q5xPo{213)u`&W$1}cO^=rD$V^!Z^_g&aD+j_EeS;h0l+bhL#Gfo1(Ci>6|dI;kN_yq)d
                  z*vR?A^ImlwciW6?=})O=ZzN}@pBXmx{r0?9P&^-RM$rlMfV9lQjh0G`R!s$7G$oPe
                  zBGZmUsj1c0zkcA`c1En*e&7d;|MOzwka5*<
                  zmeI;6UN$*jMc0{|j&C^I1l|=B5RsxOf;zaL&y+(7`c#IDs+90wZW{SkS?SzDu0Tt!
                  zdLSf`8NxB;;k|R$&j6ce&I8uiWVIej`?7*=QFhiYZL}ue9Xf2}3miodu)_^_@7oFK
                  zsI-xWHYS)|mB)qRg6C`0k*^vt;{9c~4U2}OlOA14GQ)sUb0Lhho&ciX%o4iJDv?`3
                  zeBrh%;iFrku2bv&D*1+&371jZ+46J&PppCSTfBqHvv-_@WteSeavV>vL#j!0y2YP}
                  zc^4hm@Zf~vZl+~rqYLbr%`&$oV8ZNd%~BIbq-to!ltVK0xfROOp8d40Yxp96)%5Lz
                  zEv<}yuoGuZ+2f6S`x93Lo)9FuAyS__rD;3rmOTF4#gRRdRk%Abx@oTBKEb!jZYGAa
                  z=^kN_lHF29$z#UHA^90IDP|c^?bI+aw{W`bpVb8^=ZW`2FMPcR6dLPL)f0L**gFLq
                  zZgEKdu6=T@IPBo?X+gFLyQ&OTdX%8g(yOoRvMX}b^1bN7th!*D;vr=6ap6@RY+SB@
                  z2jTH4r6upGrsjzp&{BGQcj`cn`{_LiYC)DJ^)Qv?wF%aQCu#TQPR`5hcQeCy4sk-!
                  ztYn?@K}yg6!rnWDN7jTp@NVC`bUI1$MG!w
                  z^9)&IZbq7oZr`K}7yDSM=0sPf^|2Ubh0iKH0eVq{pcz67?N1yD^*pTV^{5U>_~yWj!%-pUbt3blN4*4=*R)soxy{ZZdzjy!s$m;t
                  z#>&1vv94b1ZCmSL%M|gay}n@9c^!0{Jj(to+dnt%f{cKyY^idlBZg)c}g39bM!pQ|3l^b-`|mVZ2xI2
                  z+T;cLpWtVSz+-T8n@{wz@jolaT0fQ~RG+I|l`^ltIB2D8}I24V+q-0gt_G?e!=Q0Wy1WXVL4DNH6qs4WeB+MH|#`m?y
                  zSoeH)cW&nQ#MBiFHUd;gpOJ41^J_BUk%1FnBEtnyAqNgTOcc~0&wZvPjmq^jktjA6
                  zfP#?=(L2!tweA5aW+%sb@Xr!?02(Vu@=<_&`GoBRyDMHg6tU_ou%SWJ(dVVf^Tks2
                  z6XBW&9}O|3+%SBfDqq;ynO2SZ8g5_mS7?z0{?J!j8^CJKJ^#oP&sMcUYYVc6KncRm
                  zUT&!6w5hKDORUhuZz2*+saJuK+ld=cHrbJN$nS*)Pe{nA)cpeq
                  zdu18g*{l^XVz=c^g!%1{PRJh#hNr7)wa&^Ei?4$~&k#5C6{mYOkc`1)9NkE-Mt%Id
                  z{V9C%+31ugh}l{cr$U9sC(B333m017n?R^5_DFMaJw3T7_!j}v
                  zU#1i~VNXwbxh!{{$=3lWjIbkl=Yfi!mb|zRg4+gcmoaS#?mHr
                  zk;D5&j!1}E*PwiM)pVH4AeNT!FVCLXu0z9|KHd~3Tcv?*Q?IhqySMw;D|a5u&5rvN
                  zExEk+YAA|nKhkzTi3FpAesHv!g5L($oSz3pMS(3jc0ezlT?P*L;EGkEO(o_e(_Xb3
                  ztJ^zGS%5MbQbZ1WKO2yL^i*`TDa4d{6_CPBw2~N_y~gnYda$rl!xNV5EADEvVy)^}aOg-`%0ve1kE4EJ}#
                  zOLh6Q;3D_w!3Fvok|2^k-(du<`X)K_`oDNQn2271={k}
                  zU(^3I617~|(6u^Qq*0~^I1Ms7C49RN(qwS=u*YJns9p2w^I?KWL9>nKYudD7
                  zF$zUU6|$TfMD)F^HTd7_x8c0NIq2C{oxYNYsWx@sb$RE)Bq_`6yw6j(j@!aZ>2(Jj
                  z|AJDg7?fOT;1lQW4jo414^?h=euPY=Pm<@}Jfoh>R{EoYB>y0TwfOrW(5+%*IF7b*
                  zwFNWI`S?ji5w~xAja>D$>|_>s{GJp=sl5moPjf{}EZ^R`o9Xu%)o&Sf7ltsAmh*5j
                  z;=~gMfOU6Z{Afy0A(oTJsQ;cJvs&Cx70Xz(n(vn_vDfRk(`%}6kJB>>GV@;ELV{MWmM4#8@5vep6
                  z=PYW(xFPGa<-|9EKpkwj7}V^)hg-|Bi=Zb`n(Yu*^*OM!(=B`irH@{Jj%U)Hbb)aS
                  zlN3@EYXO+!>`48F(F%DxKvPsahizcq@@L}wB<-a8nq+7uzXBayRQduFEre1381Dr(7R>Ga)4coHw6=Bl4rmsm_fSb3(RqQ7q}a1emPVbXFPI_s(ApW0m_nsj3EX{?elK7JD-L0JYM>>|@EH3tpe^^c;bSY2EcP6u8k$iFY|v
                  z2Fqx1F6(0t2Vn`XnyWFADcIcHg*77h_0sq_FA*Vu#&AiUycaLnB0DlhF-QeU*(&KD
                  ze`y!CewH?bmX9A6w=4POBQhakSdm1|-!)pl?@-)kMPn)$;HIzETqrCvND053zvFWd
                  zPZt5BYcYME$ZGWY1n!qUFgS6~3=ynf%
                  zN~;bHiR2SP?jmun<(KI%p{Qit7Hub@&(xKBbetlxW9T;xw>P;4{75S}HThaCrMR-3
                  z3LBXA6#DTfjVvQWEAo&~w6jo|DJvce%dV0p?dtH%whPqWY!ams@>H~XtMMvPkSHNv%Ot$OI}y5mtql(0`#ui~
                  zW0CAgvw#HBlLhlo-3BzBY4=*YI4$mEt!k5w!swOFt-^Al@ZS=mfBhdrTrWdx|KnLP
                  zLp7YZz&QW~`a*(eF%}e
                  zduYgu#;)OU3p<>xnGGg?m)X@$Hv7KDE|{MvbH8IIv{V}E8#XdS
                  zWpCO2J4MO-(wVZ8Wy#Ujp#?)AqMyZ9F3oE)_F=>P@jh>|z(??X<`#THv)0+I+yNf6
                  z1=+Itz3?tSZ_H>&FE1nG9abdH9=3Rf@n5O-P_~)xdD^GebxEBE~X3t%nSxe*j_y^UqkGeaKu?MEMJL8
                  zgv-7T<<@QH`W-8LJkzcae?)4(Z(k^wFMS`tp&T%`u-Z1E+=?Nj(H{F9y)^@gxKYXi
                  z7msvglG;g9WSYG58UwLFG+ZG?|BBeS^*?6mTZ|LL6sCqEe%4Hhkb*DK>5=|UG!4?u
                  z4)nx;vwIwbaEKqv<93p`xG%EsK$uy-_2T_^o`Ly)f=*^^xh&wY1(pK~C@25-JE#ZB^|9;18ZSlV=%U}n>hX1$9V7fdrLF&lR+DWky!i8;q
                  z!v%{KwUcgvQ|7zu@&N$=kVvh!cGFj)-tzr8tePgFk%2t?*J0J-cIAcb?YEEUW_##c
                  z*VugF1X5I#GU&Y=|5|9-8hq_r10EqpQkPC}aNl@{Id0?&rq}%hCK<~If2ngA2I|+<
                  zsla0k8ujIYDBbxV;`;u8&c;ZZ=23x5ct%-Uh|Le0D9j8rR^rSZWFDnf+hezr%P^MR=S15G_?m}G*
                  z3*GtJ2Jv0Ct}D!mdXL$AT52P#>LnQ8nG^0C?Yez|MlL4V
                  zIij;t+ZNM}9>eNe9D;*-q{}&NKW5|)kx^ypn_@s5yau9QvCTD}zOh;U`TPGC$8QoU
                  z){WkiWm=_*z)xr|-D$%?v9BUL;xBVWW|rB6%pM?6uO
                  zt#6Lc_-^jh!GNw5#JA_Csbq9Pn-6W*m2)fUrm89o*K3uXkkkm*>}%xGLMvmbNzRV1
                  z?3q8R{!aglhnP}tVQ<)2|CPA31(UB#P8viF
                  zFJT~q?RjuWcjn5k`OEpyCg3zTWB7FECxr0IU>R(DwjXW}<57)QMTCJzG
                  zC!(d2^R4Mz{Jz-W&mqM-*96En0qg*}J!|cVgG>kC^+#+)SJcIqU
                  zjuwtU4_12niXB@AyP*3Ah-p_E+CkZ^ySd`fzu5T+F+beF4_VL;CZ@9tNyptf}AFkJ+o
                  zK!gbB=yMds5dhcy?b*WK2ZHgNb~~S`fPRFOMjEjE?jX$)rvMv(nSaG*(D{W{yXi^e
                  z-M2t2@Uod$WE2w`=xTLKs(|vvZ@?c=Ws#=@a6>+=;lK+frlf?-Vt)wq@9t{vV_ryR
                  z(vYPhb1=pT6zVZ?mtQdKzl8C;u{_mr9e8S>J*F
                  z^m#)~@{d!gm+wA&g(sW+C51#sY4#(|{u@Fpb8f0=G9`|keDWPh5N$+>xCU)p`+dpF
                  zc)sQRhMHYRFG1Knb+mQuS2BUaHYJniQOm4eM9Zvz8g|Vn2T6)@{;~)ujNA75#Pj-0ZH+Z
                  z0DUKY@z?tuJ{*>2Y`}zL9naH+SBDgyo?X_SKBLL{T9kb`9k10_o4>?T=urJ-+VCaa
                  zPahAx^0@tm8j9UFs6c>?TGmO}?6J+ksLREMVDF7WMRqE!bX;Mvg0X2k4UFSqG>_44
                  zGDySb))c;-{bXp+_#vg65d9|^O7NAWv^c)u(P%^Ye}u-#PmE9?Vv}t2QYD>S$&gGC
                  zB5PT!&QoPCJGy*=y~{y$zw&~y=OqFRx9Hn4wZ%)?9;~pLY^PN*iF?cBX7PlfYET25
                  z?jBTU6DJy!RUV?pWz00Fp#Z~co)-oF65`_3GTGfaeY%9y9WFIW#!BG&LE$-}VK?0L
                  zn6!&)jG;Zc$6zPo8Ihl6zS*to$iO(lXrm%osVW?g-KHH{l<;Q{`u;f>j-n>Jo%!tF
                  z;Ei`m?t2y{Mwa8e8ON{{Iec8_!lFpnc4+N
                  zwRv9sZeG@S>@Q8b!i-`!L?c&cstZ;OI7LYW_E3FqcU
                  zz%Y0ZG&DjDNacrjLlZ{rOUCmda)BGd_Tv-fgK^+p4SJNInDtQee*U@5BqJ?#pDDWs
                  zZNrlDeWv|`HvWyx(E7)r?c|`n6vg_A@!OO18#xJ|Kbn&+dbFExp`}JnP?PL<&xC}Z
                  zla<`8-u)ULHST+Co|^>a*}=6RiVju5EuBWfeypkl5dFaHa>bGHr0ON_4T(D8ACh3}
                  zoXPLJ`uEBnkz*tU6}Ah5B-UOMo3kx4l2JC;43unGx@46oEFrH@rg+0B?Adxw>73+9
                  zT%<~ehcDUMo+ltvPsCFlVDGRssOn0UvQy#W@1L!yK3^)1df0S4U~IJA-|q!XCKEC0
                  zLe5@s&RBFZq719#KmVbfHsl_iaXsQ)YUQTU(SRMx1X;Dbz37UVOtw|@>7T*YjRxf9
                  zV0ntEC#$V72EX3ioMB%{B;*xr_Mr%sYGY$48;eOQr9ElF=-De`+7xPVd3Nv8ux|Kx
                  zPgDF;&60|`&_~iR&jB=FUlA_ehj06J>-{S>4_i+c!4=cl+S;R6HS4IJ-y8iEzAz8h
                  zs@Of>wQWaSJdf*3i}T{c6&tAm+;&RJ4(x^kshBDc@{i0ZA(0>97WK%jRnFLU+2QLN
                  zd%@w;RwQ2vObP7-LzAvt2lqdMh`*7t*lGHUXRx_lIQ3#Z8e7>gp4=|OiQ_I%`^d6a
                  z>+?Fr>vgiu82wN
                  zeO4ojjcWieC;_5VL{U4vXs2XbwMFNU2jq9hwMF%`2#Quq40n%O%J|cGbGK>zLnSb)X|g6Qg^3uL}59l#k>W
                  zFyVR*8asSF&EW%fjRbZS|F;)lWanm9DT&qv$Su24n;4HHzy(9(LQ_A_XWMH3QMAXL
                  zX-_Fe_D^$tYW<>@VZ-6EajjbVk%X?OsC$bRb+Ofh9%PW87S0UcE1LA@dlW8z7UA{PTdmw;XK^G?7n!Sumtv{}vxVjq>W78q%iW-5~
                  zCG{Nuw4^%CN|@N2)56C-VVjy>`dwU1+zP6IcSV)tP0cc;fPsM-4t%~Vn;YYIFKKRg(-$=7c0W?^_S93v&|qL
                  z;cgZT^Rr8bpW*;suhz~ZXMjniWg4?`lHWwmL^Ul{(%Id5RoL~GZ@fHLoQjQ=nz=#8
                  zAd++<g)5nJ&ja8Pbl+lVtY9zg2vz#?TvuxawK9auQjPfKMZM=ypuN&97I
                  zm1TP5j1ljkdST5WU&&PLGomvv+9^$rF6Iw5bL!U&{uy`jA{ScuByrYEnm+;=E|`IdX={)h=zGM^So%=42f{SblthPNN$fM|vFg)EeY6YrXUZk*K7;SxvI|lVrQjS_iWmGn~2!$7$b5br)o3FE9RF
                  z#EY9M8LN(CxIVRnFfBjRiIt=^08Fq6Y7;2+%!x7InFy2rG
                  zNLbh8i)>V4L_dT#f6;M^wzV|{t23l3;R!#B;@{bKBxyz%PKO%LB>My^oy{oGST1wi
                  zyCvuq5maJ2i9v!5e>gC_rLj`sk`^meB$dizHape~PPoQv%DVQeiD|Uc4&SvhvSIXH
                  zoIFfN&&R-%ajdHmI4LRIvQ<`?LMn-3r;0*j2lithU}NUc#q*kGGhG$30+*kX=lD{u
                  z@%u>LPY$iicVR-8QDKWB{y0m}eE&Mo;d0cXo6r0QE0JBvm0dIkq;ygCLmPh+K|L~n
                  z5%lm-!!YygpRpi0!bdaD$KtIoEn_5^_y0Afa=YlM^xTS_Y1AgvY9<#J-)Q3Pj2Dg2
                  zT3OF7>WO_LXNdFM>>DUl8XQ3-h|exs&NVVMg+e@QkI7UCT*Z{)ncki*c?yUz&iN&XbMH8TZmH&xw+$
                  zG_tU$j(WLR!AL%QS9)gf+Du)ir->J5Db?T9xgw1KIvt_2OdWRxXqL13UUYqh;hmcE2%c+(iw(Z&wXIoVUy!q|S
                  z0oKO^0l03@%gsu2(zCNeaek>wDb`wdA&>Euaxd2HgEk%OWA$->9fEAb$D>u|ksudK
                  z^w>$BtTlk-a6ba3dnxat*n*2^kl%bm<`}Ipa~g#5&`;5?_3o($fg9w!L+)IC8l>G9
                  z(J?EY(T|mi1DG6FK0U-{*K6Ddx1n4=^?iu`6Z3+lJZY)&kNGYg%j(7JQChN(@amZ_*HnC%cvOgA`lfHwhZ1=Sil>uCvG%k5{eZ76B_`QJT7C2E
                  zQLeH+elvRO9XSinFH(^Mg(Fd>v{-Dn5IcRUO3VpJ3mmjSTyHSXzkN~D$iP(wqRW5&gP297^Dah=lg&@$A8YDbF+}N2IIT`sd
                  z^?x>v3`V{f1vo#cpY!hs-9)Ul!@3EK_ka1A=z+wIGHSYIOZrmvgb(rs^`y-7nu|&HQ;ry_qnD_PCaaMtverxDN5}hKuQAEP;>YUamO%ReEo=
                  zMt?1el(=k}OT1~X)6fogrGy9r~E2_-7d5aZWhvWaA6zMvUW_a_>Pfnyf
                  z%9Y4Y=T5Q-n^rW`W3>Qa*Sg8%Cr*5FgsLa}i085oO-+(aXHa#Fj8rSA-U_Nr8Mn3w
                  zE;JzBT%hhlP2@_{FJ%FZIo3esd2hd~!!V7ej_k1XA!GR(8Q6sC@?C=O#6Q>;)Mu4*
                  z_Pr3#z}`m#a%KHe6ef@$nW#&w^DzWm)~ERC#|225h_1
                  z50u3`*ZT+&Od_IkMBc;yd_>X27e33TY3n
                  zMIb|JC`BcRSUn3=Qs04sHNY_I>4v(tclc5aA&2uDnLt$i{~&BTrB%0*|NN=6I_Sug
                  zh4I#3ps=M@vk4W9$3P@$a!5x8byN_f*6k6H4|s}}VW`0L!on8`qpjG~vSSl#?Jo_kq5mI7|j1--uwewNx)XlW}mf|lL6&ixg
                  zPQv^*3amr{`fPzt4+u8;qv0$bV5dk88my0%mf
                  zG7`6L-t{D`4U9Xi&?iNKFy;hRMB*ANZ`k-Xd5BwJPWFdTx45gmnK@hra?r%MNd|L%
                  znzLniEZPm*Zz`yeLP(yK(=p_vrHM#7)Qjh&^#|cf^lR@)50*UfCn3PDrElepPtNPt
                  z?X<9X_P6fn30)A;IOW_5h0a0&Xus4KVhBd>;tTO|IgVHk+iP=w_QU*p!OyDhM5@*r
                  zr@!A@sIdyd4d3v_lxDTa5^%YoESQFQ2vdVZK6$f*=$P*RlZB2=fX}-3oX_g;CVG0&
                  z6CqNEgYl*C-lcvFx%<-##ccfrQy>D7dJ^!a$KB!@3|;4K!bL0YG8($c`X&Yen|y8{cvYSK
                  zoE;VP77X+=?J4@
                  zx6Z)p&l`@e3-^OHL^5T@CPLnVB!JlV#K(jOqNK!uMU@gO<_z`#cc4hum-g3)c?<5q
                  z=>7xvPxtMCs&q8nE_&cVe(dvbO8HL|ypfQ!{~^wJ8j4F&L}|BTe+&3FO5bNnwwxE&kONzO!+Hson!H&#I)Pu*y5S_)%0(BQfX3nWKh~uiIt)P~guD|1V
                  zlk&kGK^>1gaCjPvP{($dGqvX=x4AxNIu^`dRoL7YG}o8zl9f%3>YmoW+l>4E6ycB6Fi+t!jn5|NfM6B@NYbM>E#`EhATeYedF>OV
                  z)Az#SwQebTOKv8ZV{7DHVCP$W7-q{UzGlQ!)BDLF6mtoPt(8a&Juh0rHLdmxLW|eTqW2CPxawM
                  zRQiG84A0R}=@?4-s=1bs52dWQ1!m?$s{*mp&_J^QIua$%jg4O013ssHH}r_2z%1Xd
                  zBi>K9KDWZAlXKq=PZTt8E{C4&ha?&rT9!QlV1C-2wOJ=%G}y4!6-Cu-_X|2s0-t`o
                  zD5%I%yYAi>0SXPm1aW<4<66u_2Wz==Kj3b-Z1nx!B!)kNjtL|-8#IHx|ItWq3QUfc
                  zlpy8D*rRwC^zQA|nk^mFe!fZ@!0-7^qO~6gIc%SyGjarMj}yUnij5Tk_@vq5A~{@z
                  zI_6vzdVT8E&|BV+=pR#-r}2+xZSZ)qvj3?C7-$W>^icj
                  zy<|hrrz++9MR-I$s`x#B15WNYZrU8HuG13V+FrlvGxu%T5WqFa7E9-;KwnY-0wd&eLzA1lrtTeN1qU?_*SMFvu95CHn*
                  zURETh&wFzcFdP65{{Hrtsi`iSQ>Kw^f7zC~trvMB%R~RVExgMq6E758_rsA<$LKo%SJ0ZMfHc*?^e>LM*SJdxPF5#(4+C}1MoH*JHKM)nKH0~f{R&RhOZqq)#~mB)2}#(|O?}K*A!qK}uapY+
                  zgc?g+^Y=K-AX+NAB;;!>IbvJbo!$$bNU|?SPK_EDE9U{p)!k(Jv>->9)!Yca#~K*w
                  z8uQ|}+tqEJeC@L1I95h}+xkS7Sgq1@3#lczFZGJCoQ@b6W81X~@gwG;Q6C67sS0R1
                  zGKhGx@0uBV9^s9|m;!&qt@^p+L@hY49~mhZsKen5*SXp2Vcd`qY*PY$>Ph4XE$}JT
                  zQMSwl`8X~j@BmEf96lgL6yuG{^}ED^Na8&}*B^b#So`u~B2?jS)Esfyp-bE!1HM6P
                  zsq1Cqp)c*m@^;i35bT+fqUcs7=_K9!!VLdtFweu@rd(4_N{artwTMfPd}@(Z8Y?{S
                  z%BY7Hc&#|MY*9wL`VBuUgq2{Ee^4&E62E5Zl7q<1E9sE`qKg`H=~4c$j=XM8%j3F&
                  zqGo&Ze58nJT{d2t=nb@eDuKwbs7G?X-Q)ikRK4Dj*7Uh+$LPmXhQ8ovXevhg
                  zzuuXBAFKiKT}8Uqz@VBL2rzL3kxR9eOjXJYl~!$y{CJ8mZkSx?33u?so451An4ZKroDMn
                  zAJjj`6*WA8hv5O-&$!t>J*599Rc5Q$YH8R3x26IOF|*MLEVnB=;8F7DN#I+tRBth9
                  zBC*^^^S={uJ#=SBpYiIFNaueLGiznxs<-fd@9Em55Dz)CnymT!qbZL52%g!
                  z&+mL9N}IGgESDLhoR%V|bdQltNK-~KYgFw)i9rESpQ}TBsd%($*~VCT4jHn&L@%>=
                  zBp}kkJi|jX&ALo@u==nfL%;qgG@b*K&F|%PL*b)$h4xUd5gcZNr9n7{cRmWjVa(uM
                  zJ<5}iH%}Xl!Pz?smG;fO2035@(8i-bZ^Nj+FfJO={LK>qg>(grj9yJ>?$6o2s
                  z=}rqW6k~yIwy`!0uuBZ#;nf*^q`U3NY-7Sdr--OZBYsbfE*f_H2ezZ26sjfkac#P*
                  zgmR)kdtbGU0SWoF`U#SYWY0tW_>21&?(i1%?z%)
                  zb7VBh!ql!_Lz=yq{W-gJ6f=u6UhJ9`r);uOYyb@&@{R&ed{+K8EZe%a*bfTQ+eQ*-
                  zirHED=`xydtX`WDIJk}Au*;LX2CPRLaw5+%B2Sr|oIKd`Xm?xESWMMAPnH|>Uv=Tn
                  z0nZ1ultY+ASh!FMgflEiF2~INSyO;|^qdF8P3AB9R!K)LI01cC&yPU}9gdjA3&Z9G
                  zs4ULthz-xl{Ib>J2>dW8F7<0%(KLkBrt+eo`o1T85-CSOGCoo~6kV0tO3MITb&Z-*Z~Vibp8fKP-7$1i*J0E7
                  zZbk7DRIQAvzZ-g`=wT|tCPiQu7v!%$6g2*(;+c$6!^CRYWva|7Ln=bJ1I6GFDf+~P;FlW4e{&d|%qG$RY&_W!
                  zA`$&0p!2xS9c;XT;o$@~1WM)yI#1B_(_I=WFZ@rZj}jhnNgR=s@U=R?SM=jtgMBqM
                  z+i4&Pc=6v^lE-2$lqI}tI3e~cBw9$=i{xSjEijawV8&LI5iF0gd
                  zv-5XD`=3Xs+x?|HXlCRaW70*1V0qg=cpZybgae@i30MnJdGp)Ii{xMDg!mU}wxu^T
                  zaHj3aBr0}c(bAkj&>e}BD#M?*L(Tuiy`%j(R5uAxbpUNM0~M9QQ*Sz2>qFj_D)5y(uG2C{G?%3!`6&-L
                  zFO?-1ky#}~f94J44Zf=E!8(PRb1W;PC19-yTmV3>tXTbX+fByV=rM)MY&utgtpC(S^9}TqVQ`VbzQXt>~N=IO$;Ga%W8QSJPw(UZDNT)DStl-wa
                  zSVB?(KM)(>p`28tY!7peXjbdxO|vx_23;z-z}Fk@Qa3_^;|nse{(7#GJe((tB!RD9
                  z6(?GJ%IB$Q8?{y+RO%MBY?y{3ksbc;46@2uU(4FYF^*Rw8kFp87b6h5*O9vT~SlI;Y*9JXG?
                  zF{8}cE4mvYv5*gXyWIgvUix?Wy2i>23+oIX5%}k*->-GPG0sxw$&n#-hXJ8~BkGCi
                  zrgx4%cInCgLE|KyHC8+LCNx$Y`qx&IEmTCoBkrx!e=~-|$8~Cve!D0A1lL;
                  zO?`|{s(yz7Toe;tQ-{27LnJl+=)Pc<@n;0P0~9pquU7`h3vN4AgP$rzt0gSXg622Z
                  z)NhTlQd5Ys;8iiCkZVz}B0=K9Y?DD97X_*1BmsIei;=9SLfom9SO@*PZ$28{N?vOW
                  zsNB*G2H!{fC6mlnX!KR1z^ZH#o-4Aaym05LH=n@6(#<+$?^eOnwHxCoJKxKF@eyB2
                  zcjiS_B{@0kb4#!!cN+D64cYMCl}mcPc64M?VxEqMCfWJO#GlCK|7?_FN_GPoyGwOF
                  z3wuzc$%H0Ic@4*05ms&>}UU(*1}H<~*=(-#?8o9fi;IG8Bk?jbxm^|cr9FygifqC^;Q#__uAD#BFw9x-JtX!7?A<hl
                  zI1D5DnH-%3hd;*)%_nO|v+RKvkX^BH7)>r&Y3nC)Y`2pwVs&^bQBw&kS1$;*$>m4A
                  zCxNaft1+Yqgth|{2*L-+h>NIAv4~M_gHc#w^$f{6JBZd{diJI#o4ZJyy3H6*QZ_y|
                  z3oqG)O`Coq!r|7IpDmEpl*NLtyhG!5Qdw7RLTWdu^H#TGZarr?E(Yu6Yq1m=1YB$l?M365awY(tdn=Q%NUvdhnl5mmV
                  zdnzD5aAFqB`D0jO^P7YWk7_ykBCHgkx=SwM140`!k>kk5UEms}r0l9Bf%k+X#3Bj_
                  z*C>A<1=Du%VqdVl(OW)C?(rmAl9S}aF<&EK*sfB#eBzfc!H(m_-HFCr(uv?$C$r^b
                  zF`DEY&C*wDg&V-vZV$M38=NfWc&Tf+S$>6G&HG0V%G>rpdleFOTGO_MB1VTfvy
                  z9%SJ-7iovvRdDL)E2jL2Y90xT$tlkOy68LlnJ9SlK6|(sn8O()?faUlw!VTZy(Erx
                  zoO+9USF<8GLRFZ|4N|kpS?A_1Y{6`TaTjMeLO#H?5C-v*aJXJl5^uqVp;&uu$TbPt
                  zH9Bzs-8u$NQ|?3-gZYvjJFIw)1_XZR4hyJCH*GkmC+R*yH-ivgqs6(0(PUl)x-(Lu
                  zoiC0XGjex~%IG0dpvf3xJ3ueqyB2DMne07Z$Ni^I?RQ8~K?
                  z1rsk(>pM-^Ab;rwNFi$;S=6Z=7mE9
                  z;q330*08U4#`}hJdJ4qXCZvc+H%BvoG*tPW{p3Mq7g}lmAk$$l8whn$<|ei49s3Tz
                  zE3Ga3wO}8{^n%5%mxMv?Ve!PI0y#Yx{s0D9P62mK;p-(-teF>jz=526%|MNhLA|l4
                  z=9AxmiDpe0e%!hH56(7J0r^K){ze5&!mvHG!!-O1DB_<@m{UQuRyaHQ9;*$T)?b^N
                  zuUX?ocMqZmFsUgU6Qa_XDy_2Z_WsV!rD*!RDes;>tZQN*Z$*U~<4~-YGCZzf%W5jc
                  z5`BTpr_aw7qiBij-~8ING2paeYg%02q?I=kVd*aD-tjA0x;#ca{h*ShnfW(~h}dMd
                  z-utF~NRM)2smE+SrPNip1hR#8uIXz}iYI|(1*pz+6$HejW{?;*19qN_r-bZNm8Gol
                  zp0rr9C93V3os-CJ!Zr*aLV8qdvCeBy<_GJ2$z3z_P_(IHWVHVnPczPPZ@RkHeB8?K
                  z+!lLV{Y($|&u6Jdd@w}^s(;sRZjZ~s^}dkMJf(HkQ*Dl8l>VpJdt$0t7FwdO?pO}769_5>}QLK3NyYB|MqQ^cq
                  zn37v6Ah
                  z>$BHInhxD<)>yr;7W!&GdQtg{xzbERFW53+lj^gTotA+xq@oBnL!YAcu*;H=tv)E?I;Q>AHacek8Z
                  zF9<4nDqRKe!FX~)=SxM)W#8`oBGcD;nA<#}ggb?3XSm;xH*u>!LUw&826omdw&sEE
                  z7RBTY>fy@oyz8@Frm9({6+jR$--2v;fV-NivckjX9O>u$>7}}|ElKNW>#TAkppaWW
                  zIf6CoGTvQ&J}4_Prte%UFMno!JEo-=V>$SI9Xd4zpPIy7&2(m}O<>T>4k5Zn1^h|EQ7#Bk
                  zI_f<7>aDLL%IeYgRIi%;5U~qMqXNuuFqA%)AKgoBAtCr#rAVrn{_)5KP+ZFTzBR~N
                  z)TfM)1hbF!kk>!M7w=2V)7>Cl5$D^$FAbKu!kr?6(qyGJ>ZH)0{wq38m`CC2x{wiU
                  zybzo6(NCPTP(x*b5F^E=#w-W2{wMV!1|aruJ>f@rj$CAAPrU3bXf!3Y@@_>vY8CYx
                  zgW}f@eNVt2&7$@4n-sKd)hKa~q`J&MUS5MfaAMO_>0RE{@I&O36F`ohW|KSwiWB6wV<`jBL$W>qc=Y_>pe~(pWg=-3V
                  zlYR}EAvocUU8wUQC_Hb6z@z<6WlMIT^s5y8Oi_9sK#nl>;ewwy2_TL5JT(MI@ui}Fod~evCn(pGX+R13`fp069%#(b=R403RVk>XahV)J|
                  zbt~R=9#1U3*~v|AO4ZlCsjZkl<*~!&u06-Y-9m1wxPnHG
                  z#eY~HC8yk8E&X9?=#C3MY7x`suYUA@yXJw4PLbvBjuf?=`kcQzqkMK^w8xTiS7Wyq
                  z6VgPVdIb30I)ACb$G+r>=;5#WcjdSj-BH-Px^PNR^Do`0&;I=rJ!$ev;%KDje!=`e
                  znMqX|9{V+-mjwGyF?4ua7<H45}$PdW0)L*TG|-4W-PI+eD5i9xQf-!49K+~be@%HlOspKRT8dG88sCAa&F
                  zl{!41$)+~{;G6$YSb1UblnJS>xyq{T+(y9;ZkrM=R~EP|EwIBrnxIk*|j7??$)a5dGgEFT=|_Oxj6TJ%Kp&r
                  z3_jg8GZyfFwUAD{d3^tgAOD_lO1}Reu%IC^Yv-4_J^ZXy*Pet&>8ZS$JjbBMZGOAZ
                  z%{u*B&zB`1qy8zeO;E}YnR@w~QH{qrcfSSGrWfsK0M1G8iwY1=%~JlEEbcNx>+~`8
                  zIj`G3ik?2&ufcvab6d;#-PZ4t(bwe6t;Ve;st29qp)|^mdKI;Vst
                  E0I_f$od5s;
                  
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area004-v001-MC/word/media/image2.png b/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area004-v001-MC/word/media/image2.png
                  deleted file mode 100644
                  index 126279f21b456d0d6a7f822ed1aa886e252b8795..0000000000000000000000000000000000000000
                  GIT binary patch
                  literal 0
                  HcmV?d00001
                  
                  literal 24541
                  zcmeFZRa9JI*QHBBfZzdwySoH;g1fuByF+0~2o~Jk-L-Jn;O-vW-R*3?zfbq+V^@9I
                  z#b7X~+Jh>#ylc%lpS4325Ec;uHVgzlIacSF|Ni_?9JPBF
                  zsib7*^ZNMKcps+YjTM=WZnFxatIg+v!)S<2?Xt2T8*tD4CoBna>GIXnr*o#?b{UWzC%gz>)fcO2s
                  z++Ck?-(WcA`4U#yUW9Zu6>%u^I{fP@iS3EiOr|^ly|i+3)R%|JQpj~AO$}z#&@qYW
                  zfeNQiBiv`1r;|I9+AgTS`_6=_-`fofe+fi1-xI{<{cVR+?mqBefB8N_q5x>ckWR}<
                  zlD^a?xwX-W{9}(8e&=Q`F^I_NL8?(}>|AhXX0M!|V=|`)`X2w}PfkX?LlwtBQgpn-
                  zxy0w)5uV)fr;W`ot*b3xt<;?7f;6>Kir&!BVkg>{#Y9Bc2YMZ6H%{$xKQ^B2JsLig
                  zlv?>h+cw+uUNc(fm^gafESARcA>+Lt)GPZ%ccRas33|WQqwO4MZOQ{ZtuQZBX44%x
                  z==4m@`LV$IP>g4{7gDb=L5LV{YoFqe=mu6E%)gm@*JRW9gR)2qXE>4Qqs#7%d0gu+Odfb#I<_T#`C-PwBF8tHB_cLtS;Btli1
                  zojpO|Y<$DH{po3O0`13Yt0IA{rxXK!-vn>ixJwwI-i*l-0U_(0t6iA0P`48}d5$7H
                  zY&PY`v0CahP4-_ayP%A;>+f_WjD_J)f@JV@~rknBbe;qu@jB{gj{7Vd6p|
                  z!(Xr#^t-pn{Esw?vKcl(wZkBJ?suvtxuI}u-)vM|u!h38J4vBm4#B5{%b$z(y-?Tm}e7e%atlM55&P7u9kVi?v{2}8M
                  z<8g0}e&w6FneNM#yTIdSxVziN@r7M7gYne8mBs7|{iQ_F@>E1s4Qs%7#Shl4`iB+fLp}JN?-OOsmz4}
                  z-7RNxSHLy#h@W;RbMAbiqjNGo|G|vK>dnZY^Jk)i<0@#HrgMLNo@bO-R>sM2DUr?4
                  z?Dk$lh`VpD{N&G?4suiM1J=NZg~9~tfBy)Iw43vtnNd&_<$5Ucg7P#idWPn(m|T!oq+UZlj;WPM
                  z4o*)aW%_7|%CeZLn39o`XIrK3I1Jf`{4M&_Xfa)`KZ#19iGaa;HE$md{$YyD+lEo{
                  zu#Ob2ycm5mtbNb{Nt(wPo-Gi*!oFG`&to=T6e=t(G*Le+wy==Yy)yDC6qEH^ieF1b
                  zY8bzCX6CRj-%JgArDbmY>Z0+7v~)UE3JLD7^647>Ffb@6JDg25p1xak^9$c{11&M1
                  zvKf!%qC3g1<KEyGNd%$fvFQa^V%kE&{*2cNUv9NC
                  z`hf88>84Jqo|%)FEK_b%>^SuXYO#n&Ko?Aqu}H9ZQ!V)m-+iq`eJOW5qdPY({b8C;
                  z9yINIeCN*4P*7gb7GVDGRp7s>!+VYSpQ{5j6L64$qx?Ufhr|L&-meF%$(K=(kboxJ
                  zRK|sH?)p%UmvHme_FU_}#|8$RkEP}t7{$;IRMhe|Ii#J@cpeMf?94V`wNz0s
                  zMFtMYM4Pi>Sf3VW=pv@
                  zQ#A`6wmqm)tgapn96Yx{NzYtf{4!7~dti948yY#RZ)G2kZAQ*%+)zx%FPBwSf6ILY@ZOia8~ysrKT8-75hgq%BTijCqZFbJU;Qi1
                  z?@P{9isJ}jVMD~8tbk&oQFqP!54_`UvsVm5%=}ig|7is=bf5-ZU4`BHnNoEIRIcNU
                  zh=Ou)e=zU7Q1t+fGwUu|9CP~_E<$l#x9zm~wvF?-W`no>aYe|#8OmWt>uYNp-puQ_
                  zs18w8+w`Ht;o;h-;NaI~?4+5ToU@*(ZV@OH!LI6ahX&Q3V$=Ol-)y$|%QSrGxf(e!
                  z0~L*tvV9t4&+j6|93&7<`&I`0VI=n_<{<6c^-#TTp>Ry4C}g<*%&%YkRHqi7DLV~&
                  zYpX_-)v62#$53!N*)N7dqE!7sG^YDmJoNTRvHTB9e?&=G)N=K`er35;T4*S`)7}`A
                  zJTmT0&BUDh-s$)2<2GF=>RfS^sb9%o5U{J|W&H%<#l#|c!q|1$|D|AH{cSFwd|dNk
                  zwW-GWRvqHeAaA*_lw$pJ3ex9UhCV6f`3AQ2ssI!En%4iIR?cXRaW4ikY4wB0PWZ`!
                  zI}uj;k{8Lf9NuGVgK~JR87W%qiUYkt{@i@m8XhrmbrSRH-KGb8Qp&E_heX~-4_FJa
                  zNP#lOr~Xk3geMCD9o?&Q1Tqp5GlSmv(r6n0jY?gz0UzH_{xET>J=*NFVHmRTTgML$
                  z+ttm5H6LPj_7}#4ff`WL`+92%epJe6RRpnl%ta4jxf{4B@Q6)sJ^OE$hL-sC
                  z{)nXCM+YjM$D?FCC~|F1kNB|G#PqRatK6KkMAh+^aF@QS!9=ShF*u_Q#BcTMfbE8p
                  zpHLlLmz%;o7!JK8K#J|H{}|hK#(XgNczI24IU?-MJ2X*O?Dbjg-VS7Y)8q=z;mvmP
                  z8^ri?5mTRFU~JS@v8J&N=k`E6{`_TyWq-OQ?(tdb&gjv7INniYOYLapi5skAU~5}4
                  zI<7ljly=)v%GjWWh#8+B^Fluj=T7esXB$Tsr!EOYufSb;8>;Lpo$>R%yA!incZA1e
                  z6fa77GdC_hOgEk{>xlRueAiiCg(wwYHIPpmUD6Tuv#l*a@tj2SmpaH^+`@v6CT=`v
                  zfBzF11B4=5FSd!Sp`8&osNwMj?0HRHLHuvto&A3Kz}M_r~`<3MaSwlWtxdu%Fm
                  z+m@0{6oOJ9o4N<-bFjHKOe3d2CY{8gE$9s2p4GNRZuNs|?=(_8?e5m1xQK}SiNF;P
                  zlcQq@C{XmV2agjk?cn<20{QxYJhsL+_Dz|w#RnI8B+W<5^)H*wN`7sXi3{E_y^0_D
                  z;60X$#ZmEN;qQQf((xG2=!4APtm`%_PQquTwXRRHv)|OAnC8qZRyxs*`FYCBT}epL
                  zR0>zh92}|?Mg_4WIp#mIY+az!Zu_fK!yr635JF#H?Ir`CXuS8jqb55uyg0C;((Y$y
                  zY&=F%QuiSB)ksg)-B6Bc(2WBlSivV@oy}8gO7Zp(ED=}Utm67BUap*6nzP6z%H%u9
                  zjWO^K+nZPhZ-GWl7A!x$CN^ZyiJ;<{sMRBn`_@E}pkSMytd+p4H^x>wXUQlBh8}w2
                  zd)s8OID$Bu`c_*o!P4H#d
                  zVB*{-iRprB?Nk@;MB581+)p3(?X}7$iFJo_&7(Z8o-cmJ;Q*2>J+sAys+%P;I5(tMP)T%TNs41j2W`f>*^(r7J&Machi9A{sPtyu7^p9#+wQIyFLRtdGVcNs
                  zGAZ%z1zPr@_`06Ur5DR(k2laOEOy1U5Shav{82p`r@zt$mxn)K%HM265Rs5b!K4CZC^+~7f~kP#
                  zpPNzbyVvR+sG#1B!yBsJUNWaWpcjHnN;4R5Ct|g%MH*Jqk#xWRXWHMhBgD`{>E}Z-
                  z+L}_Y8)W^eI9|sOoKcEbiSy>Mk@-BMT|LAWOJ*l5_D?4h8g#mLtv>5-9%6hood&)8
                  zkmnVxU(@v$!w^$nW*IXs?b^Q=5PCVP5B9#fb5`$QjV)4@M)bDN#a$*
                  z1;zce-|%rHHaODHfYolG0zyQ5-LK#Vn=gkM?|4+PzK(S5MESAF?g^+1_ZwS~Vm&3Q
                  zgOPzZa3yy&>9xD}o51Bun`xrgdLkT*#o)u1DEdpz4xJ4==O`d~Ugg{+DZrer+hJ)k>zB
                  z;8wn>P%PxjHUj>EUUrq#-PMIB_dtJR>3#y+i!6{XXk>({qkD-p$^(>5@23~)cs8dY
                  z`+&QrM8Tau4>OH~yXm6gRu9!qqin|lSYeN@@K#3(1QZla=gXOxz>$lDjg4X9ds(M0
                  zPYKy(p#0{uOP!Rmt)_{st<8dfuYocDk_$fL|Kp5F-&S_3ZS)V)opK??yaTT0
                  z3!n;VWI?fLg73aFwWpY^9Ft*Z!p27YTL|Gv_ErCdY1tk9LyBM@3kBQ$>nHG8JuJ}F
                  z8P33
                  z%xn9&xl}1&<5xSoLjb3z(e6BWb`Pk@D(6Ik!G@1O^P3|&-F^51K8mLKa&+frX{$ku
                  zK5~7iNwT`bZm)!8Oo1oq-pZQklMm%xh~zGs9n>YO-~jdRjEr~Bl%M=s-(}m@6n$3^
                  z8TJ?jyrA|b{95xF#V%1PK+u&4pQTnNs>m`5J(kctJk`L-0Zqf4OqWg+*rl(e7HKGCO(Z2H<-v0G?7N3g1GnyTYpE9_#3VU>vwn~620%v{V5vW+
                  z@>9xc@TZjJGiyuxtJb+P=`5b}fz-C~UYp?+qHCy&)D+C_$t#a4Vd99yI;LfN%t8Kv
                  z7&kKRyWQc+tp~ns2Hr8i!4+n9YhgLHRJ(Xbu8eZ$pH0Z2YC6+xEoq5yb<{4a@SZLS
                  z@W!ZwMS@6vSf%y=nC!>;n=E@h_w1X$-wzteOvoY)nVw20fV9a
                  zx90TW{ubH8#StNBY8oJWtM10W&`OIHAY1~jM@{Om?W;bvuKA|YfcKUEmzE1x&
                  zY5lW(>sIcZbjtL0z4bvU=}QQ3uD(kCPcrvDd!=Rkdkx+zM{YD@rD&imJ4fAxnHdEQ
                  z&n4MMe7N7H=PfY$?SpUNbn;B36g#Lk&Q>tS;b2Z&Ge=Kk;_`74v%;^_b)TVi7ZpstJ?X_
                  z_w+M}75&K6mi?`#g4pv#2%tTEx
                  zEb92c-
                  zw^RkA!?*OL0W-OjOrfiH!oJ(
                  z?*<5ZUS2%xWfo8@wK`bbMgrd8n4#iA%SoEiEbhWBw!4dINk7GfSB3uwrnP(G6ScqCE_SY*9q=^dS*19TFM^
                  zp{PGbX|=r+I1pF+#8Mtt+
                  zt1&Ee4EsBVfRx#^8^eU9L2}gpmJV1_Uj2Wk10}Ia9(;7Y!TUQb+dV!S9fO3*6mudE
                  zPM#=uc)1@_EY}~6PTg;2`s$vnwJ#nTOOguW;T5A{lQ?fU4>`2MUwF8?*TxWlUbMKz
                  ze&l!0{?ep!Wti+#L2S+C(#<|y`S1aYA=9^ScC5i6ZISpbAI~>_J{P$$&~rA1w-{dB
                  zn{*RDw^b#lP;k?HctVCgSht*aMbk;6|MnIH{WozORXlRFU%n%whn#+*SczJI!Rlv<
                  zibOst4SM&xmGTs!tx;PB^-I{uaZBv0Z<^}31)mfz9kQt|x668%BB9!Z9{Ow*(Chu{
                  zi9{xYVGWXfo4j!3fDTo99R=3<{!u*MWeUtY+%f(a?4+WhEhj
                  zVCJj4YyqlNia2~D9T1wRQzS;0fVQ44U-p1hwPIAiI$J9K42YV^c1S_MBSU?TaPikR
                  zv}PMoZi$*NJ1vv@JUHf^h3|pd+PXY&w25No-`Bw*xWhgC&HYsq0b4;0F=0a(Ft*SE
                  z4+!Wamp@PcO2?u86*Ti~FS2!HFK_gAdt0PIoZ0>iUXoNU`Db+U2|?|ML&
                  z?OL<&%NGZE{B6{@zf}v3y{yAj`s|gjZE>$!ZrHx&Jr0i&>I+Lr2g7z6>#DXb#4Thp
                  zPJ2Q?hdmo2C&I`G%f0*T4GnZ*!qp`8peBX3l2{td-*F+v{1s&kx6poL_P@eS{wgDGTIt)-DEMp
                  zx{O{;;pHAfUQH|^zS3B+ePW~@gnC{HVA8pY?514}#TNgeWt;P!3gyj;DB*moYb`PS
                  zELmB=n>Af48+tB{(J<|g3CXp9GvnGbp|2MMw$!N1B3Lo$znj5-@w$vb
                  zHSW*klXkrN3w)oSbo35=BiY9H#l)u-h)p8L*OO+7(5xo17S
                  zWSAqPve#j9LryAs4Rvta@z#nZBvi6S@>&s6%4$Oo*eO4lQL(Wz&G3KyGG<9@mz8!$
                  zpLuROq+wxVB!z`rfnPS^qu|JH!536?1iVdryMdLg+
                  zNJ`m^jA=jP&^eX>*65egh(0qn8U9lqe)2NInQQo2r%YyT_nZ)v~C|PJ7+KYz5gL8O<(PkDIRMS8g_}
                  zXDaQahsNeBI)J?uoe^Fg2wQ0xRef|y)EtF68d}31Db^5z=lp+#C`WFN&P$hA#y0S%
                  zG5Qgj`V75iL_j8lYpPZw#Vky{x0qvT=n?Po*WnSDBX_#YKO0#_>GD1o0YVwa<`xyqEV=Y$-QD@Hk}VIRa2$}
                  z@HJsG!vua4n&aH57i)0|+}hX{a$iZYB%5^T&ktD+R@GUjub`-N6G;Ccnuj{*TrPB{
                  zet8lNT`~ev4a>Q+?P8w8M+e4T{!0zM#r)Zx9*R{@v%I>*Ei^z82^%Y(8r}saLjAv|
                  zc##oF51n^r>)525qQWj3F!Azf*QraRO8^r
                  za-acZo3*Sub_x0ZK*q$K@ix>qwp)R(8}!HW*nLvui6K#
                  z3Cf<1MYlLm$Z=&W`2%)$SJtMNG11ZBqKFVu)}g#Ke-wMz@3riVZ^MqM2)YpAo|PCs3Yd
                  zm_>C~AYG*!T;wQn-ZI$fS7*|hDmza6CwK<2wW#&yEHL-0GYJ)Ume0F(n7p@rXYYCp
                  z0E@rMFjfG%V1L1yD88hUa$ccsj;GqgTh#hJvxROI;wIYHabipNyaVy
                  z+CD}9u#5b_$IxUb@{#KR6!qwKJi~pvP-eHeW|4qvsMV)N(<}5bZ{~=}PtK?HRSNb-
                  zkEZ)FhJp!JOUzG2(lk$xeQ_1aJM9*S$83h_#7N*eV3is*Ng`Z$$u)l-Waac-s!-SY
                  zBnw2)kS94q*QG2rJRW9ZPm=qO$l`|-MmZB1$Raw%}}-wVOC~C(X3Jw{&=mNAPuDCY_`Ml>g492IrlFCYTGnb;9-qtBDRUAdXSR3Z
                  zQ7n!85||yY>Qj@RZ$c0Tq%m}Sdqn;sduj<7KhTcyjq_9)Y+OFS3!@yr_-CuK*5Hg!
                  zJQsjw0-V$TZnXZlsQ3S2!2TCE1X!u>`VfeKTLEKzrj~oVNggn58B;KC6+f19+kN-$
                  zhP=_s-~#Nme-=wc1`&GZp4-nS%hg5t4V}v4##;%v_g2l7AbU&0Upb;SlVy&EKzLh`
                  z;gEv9{<0tR4GpQMrw8M#T^A>{eyua>)s(PB@71W
                  zywUz*8x}YCZe|$M-$-lm&MNZXe`FuQa~FRaxAXk{NAnb1T=jaDGeTa8?pFOV!^tV>
                  z#tPN7cl4?ykOe@m$_aMw-QLn4@7kZsxJ%T=A~#8qH|_@&ay>C_>iQ<`hBsd}y>1Kx
                  znJ-oaTi%z-$!pItnQD-wGZ0!;WE|6PORh5$dbTS^GW5;V=4F`p$v+=9y3wDD%gB(l
                  zN^x!U5bxZ)5P`0j0++L^58DDf?NsI>{O=w?N63VFjoUFxm_oNcnQQrBbBy_KuJnK0
                  z*RGY$@~3!iQqdLw>CGTLAw%Vs
                  zx?R4owq$_3L2_WvWyBk-Yjaow!1DQmikd5jMU5AM2j5o}dHb%O4F`V}91@#GUM=Ps
                  zFVr=&m8c9=^7AZcck;m_6U4^q5DYRz)?flTjv9ItH6#|>+Tb5`oE)2az-@b$Z($0@
                  z*Tn{!-LT$Xm=YltqiaF*&c9HlcCoXELiHwsXc`(R20JO%7E>VnIXdg?L>?aZ_3lYy
                  zVvnnvnD?$6=XO9Jv-<3Nl<%Y$>LuABpl<5mmsAx$teJG+_Ixk*qlT4}CUTRdlLY3?Ik9
                  zjL)z9l_Kj#gvnh6<*zhK@xfOo98%dz0o$QBhpzKr
                  z`1&Td?D6mu9{X%xeD#Ip&|Zf-?djTMz^nx8><793!lsZaDjqA0bbMWO`eOm7U2)uNYd$IVBV>-$47A85kkTv#MC^7hhN
                  zKVDgU;&XMQ^a!~Om@hGCoPhnQ8VrOD-TTP2*~xnF5*FaW&1
                  z9Jx!ItRwuxm?#-#@f1M*z?T$SP@Jfp!7=1`VazDd%iv4pp;|yrX8(|Of|6#wi}}!m
                  zi&07AOJG-T<7R1_oU$%q-j}n)}Gx3z>3#ieou}r&~-Dp0dl}~US`%|5G#2%@MT@A`H$`U3O
                  z?LRFECgMe|A_S{ZD_devZy1$Z5e23M=*Wiq-Ox~*7Pag}UllkeCg
                  z>3(XVzVclwyd0O@T1757g=&8r1;VTbe0@cr(9b%wq3v&ILZUMXRJy`68YcDg*@7au
                  ze<;|#^mK1cuexcMi!rH$)??Di=wU|hc
                  zh`aian+gHG*J;T)R&DE`!gk!UqeY8pKV(?T<@NPk+)^~8Uihrn3jD>Heu2e5H@7Jz
                  zGSu10%4z5t?K7<8+I*&;r%paP`H!QSF=gA(Pf;{KCVyc{QV+wDfyI;6_te?1q(tM8
                  zI#>+PJFv^GI*PftlS?Ao$9`try|kHjNZ)zG>5lpnRIRlO3lZh+HYVQCm8Uuvlk
                  zHU)ruN>tTOu@DpgB*kINZECm5$w3u~0+IlIL_2)Ohp@`mU07LQ-c!B+WySm{u8hD%1ZTCBC8Zn&-_v&J6
                  z^=vVpnZ{LgqYzOHj}q)kU@7teVNw#yMMVV-w&E-;AQ+?~6W_SiXfH|zt(Qp>qpzgh
                  zom9L!1ZIiuGEy&%QxNvS*)GBD#46XK@t6O(K#Mdw_cB#1FF_-)h;{-l>uZ+{j#|0R
                  zsRIHUwCJ>l#=<2^@)!(R9Q5AE+QWmRWNst&sDiqqS4HI9YZi;?Aw)=^wjT%$UjF3<
                  z!aEJbqqU|af|0yi0N1;wS{8<{1GR0%nxz29w+e2>C&$1ON!@!NmLoFu3afk$Rmp5t
                  z+0p~-scNMs&3kFmn|5Js`EA-~T)?i|7@?pdA#M10Ryhqg`c~apb+6gtG23&YWQ+NaJ;idaH
                  zK(BUup12Ly&gPW|k10jR?Na-nbrkz6ksq_9y`IIZSMi8W80|yGMgtug{ip)~ThP$P
                  zC1-spwkcdi;$k=9>RRGOIHE9pO}QCF7i+?>Tl7T(0BzM5Rc6#eC>p^1Wx=8FF(B(9
                  z7nIo)n&Ucb^~i?Ak}Q<;GC@Jcwb5P|>rn7zeyxI|*{-dP&HrOVUc*YYVdM>Av*-(d
                  zhOhuT|It&$>T)IEGd)cMD|a;FvCXvDk<)jH6lD_UH{8kn=OK*TYYVX#=?a|?k+6C@
                  zHrz5+9K9n$<>)BaA-F+^9WRZEG%j~c?fTVj&`Iw!Jkp5>d!4v|+|Wrp8YwaHLC72X
                  zR2>C&?v!5S<3QYvn~Lp5WWp7dRYL=d^3$ny5G2@iA{G~
                  zPclvF@=fc49KvF=<{Ja12=Y^5hs%x=WLZ8XCP&Ln9lV5-H%9SCQ$wy4>(3~B$cl0T
                  zn-1J0-IiA#qDDpYs!=R7*Sn@{I@!j$#vN;d1eqa|3Yqqnn?aPU{#%qn7cY^%CFRo!
                  zu>vkGngv&$_UCrq-zriLPbz9CVk1hHhGJ{#m{i%qMwdPifrGBe$oaUlZRnN8U9h>o5TF!>3!*;cQv)j
                  zzs`z}g{+*2pM_{s*Kk{5ZVvPOg#ArCc2vttYB5Y+@`sFtuOhE6qW|p17HO_R0n}0s
                  z!}U~JX6$ou{OS~Ul%|=;dW6-W-xe|C5DwzqB6`-NJt)y_gy~9E6kbVrotXTCquQxn
                  zyp#5B8|Z~CHmT~p0v$v131mRbcr_*<$23)D;Z!Atc^?53Yljj*PUGiWXE(xs$
                  zhk?fNSoyESn#cz;v;fpv2T7&FR*7ZBF?CD#A=WU7PM;gmJiuEVblb6LPZ@#V5&kWg
                  zrgSqVCH?J*EB96*d2f2fFv_wkA6?A}Q&5ZzQ1rSg2_sb%PRn{?0gNcbu_@Kmfe3W|
                  zcY()>`1^?4h1hyN)-51L*}c%W_OiQmv?)#BnI!*v2Z;ceJ=(=TaSa-U4ElNNDcOV}
                  zT{-!QstL>A9|itGc^q=IgP1k*H;hPN_97UWGVHkZ297?!8
                  zij|QT8(r0$1yEqs{^47!$N9f~ULo}z2m;a<^05a0rh!5npzRAHp?$og_XkX~Z&yL$
                  zK2h6Zv4TB!Rs-UTF8(aV#!~Af2PyA~fzO-NaIfRK0{V(sA0;VG$#MhYsFIMK_rcw(
                  z-Rxy2f((06h3N5APg~I)$--i?b#!yvS`!B;u!8^McziVIwV*}6{|X9pYbR_k4{cam
                  zg`LlVpRv!A7~mQVl)%k#QG2;OLOVa#Dgs$b3#7aU43+%+OV@ryE!ifIj+rWx_AD}y
                  z*W=&7Pm*nkvD(}OXRB*^XX4Y%0l0z46+f23)r#x#^4{RS{`DU%)iyn9Pw1}nY`LM~
                  zjKTR=Ban&{p4iTl4zlTXDvyd;rV9O9tqe?@$lDzcs2W&V{W7zi?^#+>(M{T(GZh}t
                  z>*1optVI^!FJf5OL~+D=5bUFDH~#Ce8T%tguKc4|a*S}0@QiK-HA}0r*_>$Pd_#^w
                  zwSbB(-?kea|16El)Efh7OhECxP57&(ued0UGmu>(sweW&7}L6=)4!EA4ee5x5_{5d
                  zK>wvR&1a^#rgv4JEMO~FnJZMd5K!n`l!^!Ug)SB!w|qjQU#?VNk4|Ov&75cIIgW~w
                  z>2N_;m`?-IUfgvTfUG-@?4ODff10SBt{msDiHlI|n>MVVFEt7hmmi;I)yQfRuaeKv
                  z+yC_SciXxe9JuzOAJr-5Ibio|e=(}DQ?}speH-v8iirAUF-8L+OIVi
                  zPNisuuk5ICa~ZCHEm(O@wa0CIr?hn*cef=`GzJB+(7e`*YL{wbaQYE#1tfOGr~1bI
                  zO;Ymwvr{py^N)FAr`X=8l2Vh4(AX*e2jPD;CBdcAyi;rHJpDS@Fyqsy)pWmXhtN(mr`=OjNx)gIHgRW4&Ora(kp
                  z3$bp3jgBl@s>fG+rW?fT9hphLyP>X3K#3aAJ9hQ>Q3Z@g$(efcCnFNeCtG%f!xazt
                  z^WVnKw;UEz^rn&MA*955q6S$9=f;EX+OvTAX8A={9jKlRl
                  zCYD`uJQPZb%GcasN3T=F0=ajsOM%Z^ONi6Zszd=D(mO1ot28NnhC~F6Gj&H3f*t|x
                  zyd<_P4`yc`Nj$PB&X5J5(E-=#abA+~6+miBkbrho@o-=p508$i$PfGUKa)^Bx=}2H
                  zEW!xe9H!fa_mKoGqxis#(eK1_cLO~&%9qmuPc_*8{F$NZ?T|4{#sGoIaZLaL1n>jD
                  zaNgvb*o&YlGs{rSM-F)4Bh{cib#5C7jPQh37NmD3fNd3KPEmIMgDq0&h9>Cr0_n~Vg~m;D5TsV{eG
                  zRpd!;_&i~hDQ7*7-8)`y$xu-V47ShVJ|l&6owfshNj=Z2$G@w-F;ziV8B2w;F=`~6!HT>
                  z)yAkV|NbNxYs~}vY21P&=PlTe4AS{Q>XS{`==+?;`=lT3ypHeyL8`OI9H}JV5-&5&
                  zYw~WbwLOvEftrl1SFBh-m9;$4kg9edFkn-2{qoR}DVz&kan82@wLIS-*yr>x(Q3I#
                  z=hNVZXg*V_`@OBh;oC=20X_@Xb~85fnM&o2+IhbfET<&XS>K
                  zo5
                  zt~=a-_gR*Aaw`^l5gr`+i2wR)YgAfak|U~`TEYIx8k*@a=RW`z8<|QVep9df_ZvA#
                  zO+gcK(Bb)U0P6bSBtUeDdp)!%a&xIwBwp&_9oMvd`ngsa->E+Bb1{Uw>~QPB5nml;
                  zGyZNi_L%wIJe2F@Pt<4{0@!^h828!G-aY~#AhR{Mepz`p*025>Tjd;iI6zneUv_e=
                  zr_an0W4x^03Z*8TT0OUU-9;y*Ju5CdbI{3+ibElsfk-JRP=JZHn~rGS?@qhN(~WL?
                  zN-y|m%F&05G9YR@AmM-}h(1=%R*}Mw-p*)N*^=JimUmr4EvRdQSBh
                  z4wo2>#n0u952h+}V}OjV&Gm0*;2$H0;Hj7yCj(C_^c
                  zE1%nl%Pg~&30!6rO!|Zt6Rwyke%zCCGyhEmzSl(H8X#AInIED^Ft$zI&XPuIiEC6?
                  zPZue%Mh$Nh7XvU(R__;Kv~kW?q&SNGE;nrx%_yr)pXhB?yoK8mPog)(cS#vpYF8H8
                  zuQ29puhqA95>EQd=Sn&SYpB`_PqP3(v#ZQ{}!}@PY@!54&upr@aUsq3;hdTUr9=3Jgp*8PtNO00mPf(0(bg0wc
                  z6AhURHzD1kE6bmut$-sO3CtsIo)HFsTy?7749;^?+L~b9Y;53RyqtX&IFzl5k9(S~
                  z3<0%^-}ZQ46lzitgnkJyA@jSjE37q^!?Lc#EGEJqKjx~Q=*Zq3ak1L!eD;4#RLne@
                  zaZKejJTqZ#1OS#4N
                  z_VV@xyDH4>}wXpRQt
                  zv_p=+|zE;9soj^bk;=SJ&AZN(H=V{e)rff5;-5zuxtNov;@es+5FrY67Qpu|5
                  zr%3<^1n_e;pMEGAru#v$7p6lDMq*Heyj{_!dKgaiL%iRp)Us3dZqHiNI
                  z?(gd`&4IxpZ{`|Q=<6Ff+?D&)(aZLQU1#{{XxR7hModNucL)BntHy-@hoowk11lfPDYNdd^#or}shBpGjSk}|s3Eh|OT`$Gkjr6+xCj-o}Nn%~k;u1;99fYHmyAcH4CuN(53&I2^|#
                  zk2Hn^85vnI(wHXkGEtW*7?^_OZ)~-ii~W%p46F%*YEI%4*7gquha8kMdsBK5$*-qF
                  z+HF!L{GyE#1Pq(+(?q59DmS6g23aDGUapQ~GQdbGplTp;*yMVoi7uUHAB?)NI
                  z#67j|zfBow88EXB>&J|Qx(v~8Tczg{^2fIPezq4Y%_5~0@J^V0kkn6&d$IjpmS_Tj
                  z&|pbv4nt71+`eO!It%ZuCJ`v|xW_wQC@*bp<%wl-c)}XB?h+jq@VuX4l3kN(Ql94*
                  z%Bq=v%1HJz^;&>tKV@YFtrUt2u+k10$c16{%Ay|r(&l!I|Bn#74`N3_UNr-CM}&H4
                  z)h3k3saJk;sE^Loe0fA-u3MpY94UE}u}!WihInXf2R9EPCL=KpKW~~;lf;v+Ay|{g
                  zg=NXT7*fJg2$b@Yrbi?N#Lbxe@b8HE|Me~wQaer8KQ9)+>Q5XYUWxDE@KYn&J`}f}
                  zW(Ml;svq5t#U`%~5YYY)E9dMHw?HPHl+jFts!(q*WZ{MFPy;Xg@5lfD9snG7U~V0e
                  zusvAs(=vD-=@c4(@*@wNKO6KrHB7;iyx(#J&}h2;An-(%9sPd;?)w1JzKQhxSmnVP
                  z)NPoK6aj+(al+*97y_tkXO{t()B3Lwum9VS`Trmil9_iHJjkeFlir>@pPTMUD)hpC
                  zmzJ_wskjPt@aHS$B&DbHo0~%vjGgx_IvZBiFbfWw+1-1HkaGg*!v&8!jL~ymuE*Od
                  z^ZT%DW`p6q*IArcVuUEOPEe*FPvsmj5fM&AM8f`JZW24AeNqa=K+3!9BOhiwn#N?b
                  z3IcA9ko|wua-QLA{_o#!OYPCtDq5=6m)dHt+Et^rid|ywU22q~Hc^{WBWQ@dN2ooD
                  z+JxFvh#6Hu{4d}Car__r{!i}vxQ{yz^B}p7E~Ytb(Rl$>U?G3RG?ZI!IdoMO7X2Nl`3go(~-xInC?_-kTKs%319MhwxM6uv6H
                  zl(q-XP>XI^0m_P{l|*Pf$xfI0E6>||6VH
                  z8d(9R?Rm%X{IU#&ER&mVNDor>SmaJuth~Gt@0+sS7)=v5RQH`b2UbA7?-Ww5*&T5A
                  zbcI70Xt#ear_2Jq9cAN{WQ#9P0U>``V=kZm~*i+NU6H2m{66|7;YFI`-^+|f%=*PkSsf(nfho>4I4z@!)-K@YE
                  zZ$nMQe)hq`5NTcvp`yI=FHEMO8Zc8YRW-%+BQsby{&b-B99>;=nn)5qMdem_ShD_)
                  z^HSifHDDlD$_P5#STCshQ8W*uq{PuVxukHt*b*VNHBt@>!R@QcwH=L8Aua+a53zrz*(_1rm{DOxgtDkq5mI>i4l{wm5gt-G^5f
                  z0VSCw(Q14e7d0FsBTUR{FH7bC5&LKBLE&b9AK)5XSsKWmy@Lj|mRz)(005l-W5eOo
                  zr$Y{NA2CVKNnPH|GvGz;e=r%8(*aaY5w3Ru3#+xSVWkdzao^&KirDlkYHuQz_vuq_
                  z(YdsoJ_CJcjqOsf#bGO|X{+`=l*}rKTmv#Bw^U8=yJuH^mLD<2f|!zIBox`;*$;&D
                  zJ$}C=TJW7GVr0|Z
                  zvd&Sa@5|uDv*Oo@h2hFAkJBs&s5mqy%_qtGcl~McfTNqq)^dX7gJM76=P%Apqs4Qor`|~RsZ+CG~m<#NG1|V(h&=X8}`6QU1x<{8NXCi
                  z-HSTdkwOLG-ly45PLNk3bni5KZZ781K6(Hs{^8@z;oEva7EHAB=c&9I!nJ%c0SgTA
                  z*|NLT8UUz9`&uY-wD4vNCELuA^_&|sg=C?0-NT}2uTJ`z_5GpeH>+v#-PUgiRv>|N
                  zf~mB#OvocsPK`Ogk-eU~=@P9Y#A6csnTCE!q1TFu-eU$ol;Ap6<jK7;oDKv@Nx
                  zYtc2ukFS%_Rkb4BuWNVL2Yw*wFx-5O?i7~Si3!naJpf$kXT9Ei8n(q|#;CJp-tf1|=tJ~biTg3;
                  zah=3cTnwTvw9kfHgP<5UfIh=#NH*w}z(Jp_v=-$c2uL
                  z-U2Kzm)FQvs;bf<5sH^S}XlboQcwNsZYAygn5-wwleX^|iWD=KJ^cY8Ta~AW^@b&(WGX_1|QF
                  zk(0>A8aTbx*1qL0R@47GIexm@qCG2|zeD1KkClgg$z#P>+XR0LcPc9V_;b~nRQheCNl
                  zp41lBn3M%s>RXj09T-J?{a(+={w;^v=#{81~p2LO#Ije>Li@Wy}Rh)kkOp!Vo
                  zZ+xI`lYJ+KrJzuK`<4L0ZwpLCro3+i6)V4xADUWF((q_dEIK{vDM2(cv-UYp-eDyC
                  zdoj~F8T5VpbY5Fr5>>ZSD*G#|0a!}2e>*)>ftEUa@pajClvmMvB$phSY~26@KM2jp
                  z%*^i)wI5RaG8~FKZbC0SS-eHne*w#PM2)q|w21G^kW>7FMUJZfvdm^7Kt{{0%=ptlx3?ikODC8eY!?wgqkdMD8ZFK34(TQ@Q`3OnuJ#stbf+TU+j
                  zkaYE5uaM!sHxYuM`?+6sufE*EjnZ@??0dd}-89Ao$vN9;NE*iGv<(^~K-ZtXp#%g5
                  zvJs2@shwxs?&4m581C5Zbr;Q^8WRtu4b%-qrx;lpPg84NI=wynWrJVmp*y_WI{)^h
                  z#Z^FzpC=>p{@*HY_f%2vD@QbT?k#ems)f{BQt$M#wz8nwAII7^q6|R9{_G=4&Bx6A
                  ziS#&RKLszm;AKnlbiuH8T-H_0z)6Gu?mQ=;Jme95$d6sQU#}_XW~h##Z@MpBBC1zu
                  zmQzv1db#uVVxbTQ%Tj^xK*&0ug-AuYFt#wJkA)zLhp2PKGofLj2lXynTeQ?p>sr41
                  zS_%pZk_zEcFb(zWnfm)367r-?qgI#p%gEsU@H5a?1g$txS!%LIoVYie0eD2xue?M^
                  zT&A^^Ud|c}j^xWleLe54kExr~z3Y7Z*f)6ME~%`vsk2nqvoFtQZo5o3uq;>Fy)7^j+n16bVRBc
                  zg&ycSO^g?2F>J5}vfPgUP;TKZAm_8ijisC~x`JI3Tn0HlVHYtmxrTmDQCr3OHqiE_
                  z4Pp$;%{u~ur6tK*gI|BoIVX%C-jy_FSr2fH?tenhFu0$QN!#ECHk)e~y6fw;B3Oms
                  zj7(gJX|4s?2e~ut@B1D)lvjofHhqce>SlF+v6~*1HS^rI*yb9D0SzxU3W-p8$>Mzp
                  z9*%A2mw(})p-GbB1<@S*F?}{X-W7l7eIPIezi!V0L2lXpy?5{+7EZ-)Y`5qy8jB7TvCCDt_Pq8f4h`9}sR!V7sQ7aXZ?H534WJ$g1VYM;`mwaIpnDJp
                  ze}_Haa}fHWxS<8HMq+f{B6xM4G^v
                  zWHWc~_Ab}fS9cz}2>w2B6kJ-I)
                  zE{SPSoUmZ8o(_9%k%yXVE>mqrL
                  zm;5NHHS>uG4K-KS)Jgnh1zt#?mQ+W-R_kZgGg6l$S*c9_^jp@@p%RaE@^14xG5y={
                  zPtlsHQ>*I5!5k(RMom@$FCF<6y4QxuFbTL-cC&wROC&
                  zGQA4)x0De4=im6CQ#?@)G?4p{VOC?J?3sc4k^yjy|%8sgp%57gcqU)2Bfk
                  zdOGr5+i}ASa^^;0-e5By_#5b}u;^o=rF$jNk3|E1bC&#n&!;+jr+9*(eZLgIT5W8-#hMdmM|-8S5s9fVwKqDe1a;begumOcZKn{y=O
                  zGt_N=HpMUnFAk5dXqLn)eeR}ZALiOV1Jj7Gc^NbFc9EB>Cl$ny8IWAYU8d~tvpfwu
                  zdyN;rXOJ72eoZ36OI_X3nnl1M;me46$0rQuk7#)?_gSTe@5i06pUs7_+!UhzIEmNq
                  zua=0L{BcCWwcPe+Z#q~
                  zVi$vzpWo2jG~P1E5WF-Vo}7->#}X$_ok^O9?v;_xjA~YYb1f#Pff`%gJ=%d|)X}!1e3EB9O74<1L=qzgF891;rsyxf9@K}Jw685A@Jk^+$$B-L
                  z)PGt9uiEb}SbtqTI5oq$0q9ry3=+RaBcD{BcvECi!RHxswOO0w+tcp3DS_Z7Ep_7o
                  z@5$U5ACCrj(iLQH4&C5$a+KcSYP<-SD>jEdMc6%kinUv9zhTq-X6}zO)0S|Vqppkz
                  z+++}dxcr{#0^(+(!oMPcFZvzaN2bBo3#grVQ*O
                  zOn>}|b<XiMZT;7-%lD^)*;
                  zNMucR&d%SPO3uI&dC#`j*M!HvB0;7tIYGlUWx}jS=o&pg=fZa{1PWf8Zt?#&W#{o9
                  z6=?p|`Y2J(6m^BkblY!TewFY|nRw|TVIJYP?y(XAT0Ysho+6D5M;6Or+JuLvZ>=-347-3r;WKoS
                  zg3dKaO3F=1B(@H+azL!ixk{F_3i0^+-EHy63tlz?CMMs*)3O9cF%kinnc$wjVpbVey7+eV5$a8deq&=(
                  z@wFj-ZbTrSiI0Kh{U9N7DPQ*0h;7EQStIzCWB>byt!Heo6$hX%on`{=GhqQ5Hda1{X1JQ2aNJF0|_c}6s~mw%|pY{(F|{F+%{mhL27
                  zSG`!d>5hI|2XQz=(RRjVH&H37s664?X(55yF#8>-$!j>b9L=Tk$`#&WWVt<3?;d`tQa={hP}07W{~HNrr(4%vJ-N3clsaR~)?
                  zs6bNa_TssBPmif$YiJ87Dappv)&(3%4$IRWJ2^f+8r<%$+JkY%p(`%YkDeCR{b8=^
                  z-+QN%A=b+NWq%8r_M>v1YS{&aU@ALuN+Qh@OiHOdBIy-CD4V~t~cyTz-N0f
                  z0QCG`vq7!4W@OIJBLWvoTPPo(!>e}GBm?Ff{d>SRz2_D*hb{ab)BQxrdY?BqG?o4G
                  zsBt^OW=C)&i>er^kCHH1pD1=t%@jy-s-h-0r+C!%=|lI^{K-2s%m*mY6EAYnnXSG}
                  z4&`GIz=5fnpgFJw_GasuGW~^<`ZA+VDZY&9bS|(`r=4b0dA{9+n^Nlcr4LTYdKF-j
                  za{I%lY{=uT0!8l7^YhtS|MGY$l=#k+5V0u%*;1U>HvH>OIK_g;Hl5U;8c1B~)ZTN9
                  znfcz;;^KSU&`n7jY0o&)62|;Sf%aquU$%+v_&vJ3GByx?8i1jAR{uDYDFB|w2?cgC
                  z<{>BDT;)XA!jTJ|;+GgJC+h@$*>@V#9iNNxU-DQPPm^tJ8C0ZghQrTWi2l_ow
                  z;C05(Fyqp-g%ORQ@h4re8b=!0^kp+to+`=Ir)er-Z1baW5`^x+z=+w~H{5u0JpCMk
                  z&kwZGAd^Np7bGwkOZjoawmtJWxClglPn0omEKU0aB)^@tcd8yv6`x{bt*%?gIg$i
                  z2l=*tE8&tX7V-Rx_j{ZjpYO}C{yo-7^+sWoGIQMlLs)=0)(4M?%e3)p>*Egd1={dP
                  zx5$WQF3*!=D_7gFeDLGH&j3a&iBWMFG8-xbCD8g3+BsN>E0lc7C818UC^=itJ&A<~
                  zCJQ@n@URYAF2W`jQb;G}=Z#Aj=);E{BmkL(5Y9K#i}D&$M0u=H3D<>|ejAzrdMbG}
                  zu1t5&sjlM?JC7xeQGbYnE%5+%;m!f?I1?#(NaewC2q1A?OSjQYTrZ-3JOJk-CM_*=
                  z(1Ridt{k%tTst7%O%^>paQikyBX`NctTCW11SlR?&HnuVi7xuh5%P*$qo*NvA%t|U
                  yRi8`Q8QJ?Uy2uMwf%Jm`7~%gPud6Z~Dbth9ER#;Ap8!<=6Wk$aaDoJf;1b;3gF|q4cWK<+Ew~c`1b6q~?leK?@P7B3dq--1
                  z&9A9xilX{7z5ATqd#|+~StmmAncILx>tv;13O`
                  z`H~9*Qy`tuiCh@JZ&gMs{x?KG_~Ac9j7Covs{;MAjLweaiG5qXdY31=4Ft-919oA>
                  zzP`)87k4*$XlWFT@bDa{{Z3fm^xoeX9*$3rfr*I;4MRyuY3%=g+VB4oerRCyk5O-|
                  z4S73_b&s|A0wp*-ogngqt3-zeQlYgZSz2Z$1wSR4fxKX}Staw9ohg4Lj#HmxmrS9!
                  z3d@e*#!(v%MSgwSn>CfDW?DL9k0S@+=$lQ((G`nsWN+%uOTF!o%kLrD0#8mil-E|M
                  zk>rW$MM-h$JeQ81=v6*m&3uWb&chd9OP(*0_iJGSi`rXns?CQ@w;d~>_!G0ad$%|;-}aOJ
                  z@ud!Mg_Cyv4yO+!bJopR0vikw|9Ut>V`5;N?a);T?nORZpGN31bA7*`A>`rH+Ah_)
                  z+uApeVp@fou70ACBQ?ObcfOl{T6WvQtO4+JgPyd
                  z^z)Uy(XR;schVY4R+eMz>4y0DvsOUQVx!o=wOzP^)Z9?koAuY$z50POJ~n)T2{Mbx
                  zknON^mpfm5yR#TVwe{(aH#A-J_R3V)^>9%|#Sh)-%A>n!)R6}>Z}w}>IJO-&zo$fS
                  zTx8_rW<&=3DZJ`DEuE4-omI5x)IIQ{ksuDHQdN9}r=u4^#KfHDAR_nXcjs<*W(=(_
                  ztRzgu`SiDl!-mLOc1#Z=k7KzXxWgHnq9BIw`l+d#dom;5Xi~
                  zO>1*Fxrawq&u$&0%`w58qpKk~p74zMbvE0-U2@(JTam3ke1y3%YjN|k8APcX8j$`L
                  zBJeLa=|7E@>W(TL^`t>ZvOj(_a4q)~7E&M259gk@V*R{5@4@a5Qx$y^G?TlZtxjV3
                  zanKN|pk&cy)APop+eVna?F%eKWiOf)^0k=Ap?%xM>6a#~qXlWsZV-rI!L~C{L!ZG0
                  z1r24TTUSiTlgHsQ#Zjx@6V|8_Doo9qW&2?mL${MSAY~kB9ZbAn+ZxDB;yuH3F*7Zh
                  ztwU~Xf*mt@f7+36jg?Z}89p#NaUuzej)jR?yP3qRrvW*6xKDgneCteO3l%ZH6gzi=sBOx@J&8KIbhi+g%FuTaUHQz(X&|K}dwV
                  zP?5aHr+u$ME-;9XqQ0(00qtAK7*B;Y^R7~F@o0i((|#h73{qO7ht$b&lhg|jB_|@|
                  z$M^*D@IDAkOg3Su{;6ICLcEcmFJsM!$Wh}C*^F*7H~ji5P$(o#1}#Dlb`m6~LJl|G
                  z2juC_-{GFnk)vk&Lij1;{e{P#iu129ziPS@Gc0OHTLBBI_-nl!*gzDPfk>lCuH~8R
                  zO{X1>nubORmgF>9R7`AnC;gAob?ZuAYaFtAMWVZTg_`5g;P@hNh3aog(}-nhC9WbZ
                  z0{AMZ20mIZ-PBKBPm@tGnKKuD{ri=4Dl0f>_XI=6Gv8-wlRrUCgk~@*NJ)*%G^JiS
                  zg>+?8FI07mDRBJfnymlyBH`cdL00Mc4YZyfH+8r_K_BJdhq!Gp#&SUBKX_;Lu-$-i
                  z;4ki%W8F3x(v5Jsoc+A(&GH#Z3@V;1-khOEHP(@pT`#%d#28*`emtnjo_O
                  z)`+AU*?8C6sTap5(d`G4t45ZVv2>tqKfz9R-lk7h4Yu3LH_<|=pH3n#ddj2ltUU9M
                  zWUU>v%}(9Uf9F-U=gf7Xe!OXMew{WIn&G@2x9fh8gO$X^-Tyvqj(U2^=yDdu|HHld
                  zC%VwKnAok{_#D#T#_Yf5fU|N#~2m9v1#Q1^PbCobN49e_*a##*#`M@cgk?W
                  zE>CEq`*H}%Cil}2Ha@HAg^7X2%1)I2i|gOXfrHyg_JN!I>VRieY#?U^M>8rC>;n-r
                  z?QvWwSn{{osxP-qd!Uw37VG;^zFBH`2a{ntO%vVU*Xj&o_1_0lAMa9ZPp*9Rm`xFu
                  zd%MRMng`~1DQ9?@*zb)B;w!v*@56AIbNOpbO?SFI9}9%6hVE1oWcDiF*A9)y!#(Ro
                  zgMgT(FT^C(b&fZjADB*~n@(!BuICY=Nl(y;h@8AvdOC9ire|hQNY9&TR6f7)f};gp
                  z^|^I|LkE8Ky>7IB(x76q-B)@b>yG(Rtao)4W~M~mBLIXWAfZtJIfKr;Ec*4=fP?ed
                  zZV)p`B*meGbLbE{VvO2_>{J}9`kM>lfodJ)Np;oOC{u#jQdjz)`QKi;EqWk
                  zr=Q*+pFm6gTb=-ddiuqBnftC|Qvk4Ok-Yc{rhH1Ab3UIT41VJ&gN_|UMfy89PPfDB
                  z(Wz8>B;#HVjw4oGYVX8D2Cp%TC)dtH*%oD?$Xq5~4gByN!1>SA^W!lvCB}1ual^QORn(kG@o*uUp
                  zan$AtwbjrdvrjC4gZ;dGuOt3bhV8QTt^KobISWv|iVFNkaygW1!B%JRCCPTu0A;ZW
                  zs)>-1TT8zyqvPt}`5!UqBQaF1B*lX(3WLU2=C&u|2Ou*%#%Rc;Y<3a()oKr|ecp+S
                  z^19W>y8vH)jq#LadyTT<<*{7YfyU#EPt8V&|Vy2xkj)M!Y13r3}Pn{e`
                  zP%yNTpENZgB=4Jova<)i!cu^#IPoYyGY)EU82!+tm3`qcSv#1YsU9s8DNb(;_72~n
                  zEnd!3MZ{CBJdVxv*LM7!7qc7`oR-dX>v+YIBIZRt{V|!-
                  zbn%n=U}33Gf`Ur$xL6HqT!BmxNmkw|F!MahXnatdmar;{RK5K7#>!2NWP{@
                  z#AR2_eCW3@`_L08CRQclZY*tnoI-oDYC#=8wT_8w)}5VvdC~IfOM2Vgc))EosML95
                  zKK#bd0|ah3gj*QPjXCU?W4x^xa>@cmlLYp#JEB${bmv=xM956`VQ#3fTm9R8REqaE!>Cqf;k{SWf9h8|3H}2j5<&N))o(3L^;_e>c%^8o|F?*O
                  zj;}7k813IyKZ&P|1;MvAYp{HK{om=Av*@1!K;6YA?2a~`@d#xPWEg>_hw%S`CeL^^
                  z@Zv|yly9i@^%0)UL%krg
                  z{Ci0B{1!Y^?>MXWfngVB(|F?1Ma+~~|GbWL(@#Y*ZpEFK{6maRwL}hovuDN;o{r~^
                  zwjqoJdgU(#Uf`rxIT4;-?2Rf%E)Q6EEp(eLHc=V1JxPJh$-R7Ur^?@*P?+rJ|%Kx+4#5#t(UsOASmIo8x6c&!lKyJkJdLoKRL>*E%GuKOuKc&*QZ@
                  zEgvra^y7)Rul*46Hlg91r`ps&L^!v{7z@k>@f>-0&PB?vR%v*bh_x}4w97lAE}M!G
                  zVHKU`Ys!&i*MW|8S>x+ls>97vxs*6I*S{j4t27|yE8B@uZ8r$RgCqm5lxlZhmX@{h
                  zgadZ-dRIpwQ&NUG39osKX6C5cL-T>Ku-0m+z24*GhT;3Xm+X71So_WQ_Cya?UEQ3=
                  zmt72=FNB}uvY(|iAuTPqk1SO(6M?EOd8{91*
                  zYchO|{GJHD!X;}g_R}iib#z
                  zoalx3Qx;hiM8R*+spa!vfa!WX>m9pL$n(Hf*me2YH%hWdK|vvHP+Of%{a!cMwG?Wn
                  zKDX}PIKCnvM}+`DhxoL5>(r)rarDHN4|-mpJ+Gw$s37k$YJyW!sU*4JYqK7
                  z>GnoOibP*O_XRCDclx?ffA&bW>B)g;f>YgaU
                  zQ%@9%)jSaS(HkRHmpS6WBmi2b0<6a9$FcUjV($*@+)3|04&kVXM1JTMw93(Ellv~Fc@r7iqf1QntFf@jbw|EyQ+&Cpdola_q;Q8;1HV^vw-t9-X|<^$*>Q2HeD
                  z3qIViP1456_^1+AC&Hl39M*Tryva6=6ETn|9)-(5D>ut#V~+llQyXU4>-3XrvJ02_
                  zNu8`%UMWMXd~e1|xtH;g)v9ua6XaT4Raux=DKo0-$+`DvGL!X&1uD|(H!SBKHuQ-#
                  z0;rT*n9*}CgiPfh9mKnNlrY>l6j=h5>@sAQ6{YODAnSc*2+g8M46E+ak!MWdy+2+T
                  zO`jlDbr4RKE?hJ)MbB-*F|t%BVVrO%K2~IHHdV8@76M|{3g1FC-
                  z?Wyeqj>uqBXqF-Lc{I;)LNEi*C&@(}6fs59A~AH;f-!P|BN~{2vNFM2b4abk$YXlB
                  zudUy>hA{)1A~B3#s}YPidVB$1M8Us~ntG4CluLMYQ>)Fi%p}g}=n30ZV`U!1SrSXoEx9?3k*0
                  z{+o8?+x%lFLy*GtX93zM$YcE303)m1^JC5Piq;;kc~1@(l8bT(qg|Xlemiut2b`{L18}
                  zLU5owyCtkb@c9*rh6keEI6r8mr?&4}PfDtR38kLs$UE0tu*P{Gr8st%W4
                  zBQl@>zYR^Z1`D;pN|`%EuQ}h{wq9zGvWtlWX@$(wW(65@;Yz0L9>
                  zsJMh{Mx)Bdx0tHUM9kxM$ylX>rmrt7)tuR?y%;c>-203E;o&pJDtE*jG;v6Dr)s?p
                  zUy=xs2$Y892jByQH^a&n$Sjf9w~T*_-<@~`4}GDcrn`l)QHy7#OYQ-H+W%)C1*HK5
                  z_K=tYCdZ{83l66LoUSBLUjQ^{5acg}4LD=}UVy=*%l>cP6Z2MgsneFW*={qt`pFd7
                  zfRpC_d4WOOK~Gl_Q%;ohtI#k`8>+x${VzP{{{_+B*8VxSi@oc^9HX=5DsK#F3CN-C
                  zd2xj6ndFQ5Y4LS?+bFIAw060{=S!#dOT2co{u2Urw_tSPkX`@60+u`>?(g^jocP6Y
                  z_1aDFq&x~?H~Krr`0Xr`5ZvMRCXYf|j}CAMu{9(uQz}eU^DXtBP>$$OYKK?NBW_L$_Mu$H+vr+^19`t`QIk`W-J5Py61hEY!KPIRJ2boIyZn@n
                  ztT*>^M}Is9u?=v{v4#>_2>|V!LraFb6vBDJZ1O9OkWOO(huco<$lvI?vH#&Ulb84B
                  z@sur9H@+5Z($J!?m^<;H9DjJbyt*Mch0DRQ`4<5Ad5YKvwhO_9dYQlK8s%zWNGqH9
                  zyg%aOv51==>BeRw1cZcG!v0Wo<_Bm6G2;Sn&T-X!FJw1SV>ahoLB`j@hz%NcO0*6z
                  z9Kq&|afi#LL(9PA=E7H?u;bbCLl%1dfn=dZuGCgQ1f@!z%$Lgf*l9qx7*xP&Hi&7n
                  z@&ok~9_M@I-uiK_Vn
                  z>!0pJ@)5k8J+X(C-1$4;@XS+LGc4HEmCb6SNbP;O?Fw)S!Qc(%^3>5U>zxE4M@d%c
                  zHUx!$@uO~V`zw$
                  zu;o+QW}my=-e_Ba97vp(3J)z-Jw3-QH_pv?igwS%aw9Le7P;M7s^;#`fe}3Iov-w{
                  z$65615}&4ds{&#j@m#wugJHsx#n!H=&!(3~gBbJ9<9#izT7Za=vxgJ5)%>M!!1FzD
                  zk-WlN2C|ewXFpzGHbg;FPQtq1`;@?2$ZhHix4&
                  zKP+taB&~vODsx7FXN;dY6@riY;tq
                  z%3oMEPV}*CSJx_idkFE%IkxhMrtvwZ$?Ut-b?q~~*QWs~K}fz@oS=2TIUpvcO?q5d
                  zU3y&N*oVvd)MFE3du0BP^MT>_pm>5@)${VY>VI
                  z=Ac%PVyl9T9Hn+Lo0oPwf|>D?}KryK`B+x}JZ1Q}I|N54AJ#R6Mm=fw?M>T&QSEwUd5ZS4u~)^ukKMXLx;8SiXxCJl>Q
                  z3oX8hqZu{#eF?0wjDIpJDacD*sSRpsYOC=GkNqZma6fSCy54U8tD-5@CGP_vZe~q~
                  zskSX|&7vOTTLZhKlvLHZ48unVX)iRP$(pD|-lyZ-O>eiTZ`a{sfq|2P)n(SIIq>Go
                  zojm|L!WV26@?ujA{hyr31;U;`?c;?afZgq2hsscfW{NtpMdaitq10$>$^(%UaD;b1
                  zB8nC%of^660hq}A>pqA
                  z*IlW}1eRTIJOoDOek>@0Wa?VrZ9KI56bJV)ISo?yUFX5^-mRXiF&KoQ*iDfx^G|me
                  zMK^xdRo$kzOYH)RW=rrc+^PRV0bTFf|1SZwk_c6rbAI=VGe%9~32p6HlXZe-<1G|#
                  zqx^ZrPbatd3Dcw*t|xi%N4CYP9+Wc!roe%lj9!2Rzj@^k1
                  zW|pQ*|K(5F_nCGL36dux^XoqbEG_pEF%{?S3^R%#TD`oY%vo*~Imsu6gc%o$osvp`
                  zqbsagN%}a+wHFs0&C~oYcFJ1Xb{JlH5c6V1vq-8+zkc2OK41?q%^@N2k_1TG6d@>W
                  z%f%*a(Ik5Ft#WYG2`Hy~_e_7eOBjz0#9;i8)9~J)8NlyYP!@PyeULsg|P}05ET`wVkR<_{8{)K5gN?w+>rdOgjyscSyg~
                  zVc+TL8K%f$9obQH@Wo7nT|daVFb^?($>gS4c>UpzFyVlde4w0hgZr|_OWBqPC1s){
                  zyll29@zpG3emhP*ieTbGkOVOm@aZMi7)7@J{5Rm+u}+aV(-IIvYq1V!U}UnqBg4t|kF>PHb6yQ%
                  zo4=e-oxjj&=xKTDB!~@cHo8$ura!CDLADShlz#;Mn4c{uNr{h7F1BXbIj9Ju1X-F!
                  zyc;Eo*h~#!qaUv!7HWEobzSdP^g3Vq)CJOp`0R0q()|^^1t&Js{>e-Rxjoqob=ZT(
                  z>LT^qg$M_+{V>YUQ;&4bikO1dz3jJ;T{`DxK_xUVVbo>Iop*$U^DJf7P{DE`43J+b
                  zCgI)A610PWYQErtmaqP;x6AcI=|phBO=ji;A|Q@PUXR@xA1(~Tv#}w%w}80-7e(L1
                  zf+)Hr!wxy%SU4GsI7w;gBj;%`U>>G#JO!Yp-yr))m9!-^VO7klX8=h@hM
                  zYCWpW)BVcQfTlWD$tW&sLko*?YaxJ>x6bzYAEzf5TSUhRjTj+)$#59Iy#r}khhH6t
                  z2<~h~7f{hum#T$7@=aU5;-I=n0FTrahaM@Cg>JuKk-K{dq(etJd=!7gXbg}$qu8*YufXO6hm38dv%S81icLTCcLX!KI&rCe^jKYt
                  z<#*T#z(uyHsC2t~X?E_n@Cn?Q(QeJkz#2+P_N*OQI18t?|Hsp1YJae-lwc`+Um8-XomW3&m^*@w2
                  z=Bl$5E-X&&tpTj15@)KN?@iieGw}=oAPmznRnpMU%qdFB#rZB)2NPjO>3HI%V#Kk;
                  zUDaM@wri^RF@zr{JIGP9fElg_@O0;r9m$}dlA3}waq&iny58m*tc45B$1~6_&)ZWC
                  zDL*og;Xw|Or}kdko3+3CIC9^cL*2xsih^mXXNpAn>q9(mSZ#M%$w6?!KWpE|yAS5&
                  z(Y9k{R=f^Zm5msgi_H>8%EL+X(hiFCx}-@tM(kvA^^_B7JSBt`3tFKst1E|#f63kq
                  z8*TQ>;S*%DMItXRHBU7HvgLAUyJpbHI%3K>;*3_ROcUORfb#=1<3d_Rk*#=Q?oM);y_1zN){Kt{Evl(-hyR&Rj7WxM2-|3y0
                  z*8xj#DPPZAr!uKfETCeHiW<7b@dANIe
                  zJo1Hqw{$h6C;NJVR|8li)I~19&(WjBaNBpx!(USr(tST{Y{Wizxa#dZ#yzEoo0<~C
                  zp{)n4XBu!Zr?%+~mXC?R2`5EsSW$0iP#?|h)cpBzWc*?*%Oc>I88Eg+m?tyLzBt++
                  zuiS8}|7bJk`?<=1bzQ2KojKA}_oBcZS8!+x_|9>{AvXs$iQ^jq
                  zDz^)&fAS$mCZB{A8p;Xb0!yA>D!ZlLn}XX;>cxq`C8;lXRywU5MT2IN1BUdXM@2bx
                  zA0B178h(^xZSmSnH)bd@O7?dcv?~FaYJHmeh5bOThDVn?=YA4o0r9DO$ZbXLy3FtwOI9Usv1*G}Uso56}cXZ5>?e#>DO2qWnTWM?_6uqI;9j4t5Eer?~ClX#L7RX2|a|xxV(ioA91&O1zFO3erc+|4R8VBIiD75HpQ9o
                  zPMrHIOL0FqbI-P^6>*UtN;ICwGMWk|>tBEdHImRzK15L4{flWTDc!f6X<2$5xMW!Yh|K6(%Aad?
                  zYUytU#Rv6{E}wSVaVlAi3@Z8-Q6_t!=ew>LzQ0KwbUxOOK3;|Njnx_mBO0X2wWJQ8
                  zHkTqHq1a-ut5lW!^p$gZk(h(_avpyE0*hSKgZ9tnkE30g5B|hii_iqV2n$eWP`O%@|7*c
                  zR^Cf_k-XAhdxFC3jP4a^r^^NyvUul2suea;<&5m@?aM1$T57CguJ^9-!GH~9PnEvK
                  z9S%GwGwF3hCwQv1vRgkCghHUn)}N6z_Gioehh^y2nJ;^$kR-dkB}N9Xf7XMU3yC2j
                  z0c49uCTAM|8LNb^`j^?4)m1H19>3VRj6Yvw&J-j>4wHi8@WT(=DAV)!5A@!^^Kvc2
                  zHg+HYG9Npt&!oKSW>vGkMjhh|R9%~7XC~`Ye{b^`b#`3_yco0dg7{DYKylr7VDiFI
                  ztqx||j|TXed8*o+9{hZ3A(Wz+5L07z3ccg4Enh3un<-mbWd)7EUW0k>r{PPmkF!*{N5~Z-pN;M49Y9t)?wK>ErZDQ
                  z-cTm5Q1_YmOD$qJ;}0ei`{bV=>l`QWztn=PnF}qcCQ-oaoe{K1c&@)^aPXo>B`WFQ@mzqs#}D8NNE1$(Q0J-ZP$$<{jP5M&2Zms
                  zi0!U2L(6j#{vu`YK6{bvW!1}87-}LU|6+)5{-6-0s(KcnagwNP`HHMfcHqGKlL=d=
                  zTiaXkXfqb9&W5n-UF>%-K>*u(sh@l1`EiRDmW&N!+R5T~{76NST>wq>VsBrc^4oT5
                  zO-N{HlyZjt=a%{jMmUt^N{-)Cb@(WcMZdm+d00&u6ODQlIdXGa1`Ib}Gb=v(5*S36
                  z8S8R+dD=RA+fpHY$Sjo2WVaZr>jOF029HTGiDuJ$im5dthP3=ZfAeb>T(_upH1o-5
                  z__^d!Nn9D1CJI!K`>~k$izKYuVi(pzwM{?{*}1St?w3CYcBMqNj~|=>Q)%V#So=R&
                  z>sv3vX3daI-!l6j^fYpQY+?e?%qeo=D`DRx>F(D$g;|`6m^FqGu$Jd>A#Ek@-}Eq#kE-?MQ+s9yBbIog``)yD39ltCLFXB8X@ocP2)h-e^H6kvK%D
                  zWkDo5t6?3B8grXY=^t4psmxEWU)@10?znY5_AE(Z533_>_$WncRng@4O111X&<-{m
                  zuBiQjZ<6SpS9Dx*Ug4!SKB>5N^%7OP7szD6N$e8hUo-#Y
                  zFLYik$eCg)RVSjp2ysr;77H~Onk@Lj&R6aZtS2YTG3z5q_9(bz!XT)9>Y!j81MDJ`
                  zeCez#g`_aI#IOi6gc@+U@k-+rb6N$J5$sVg#TmB8+(XXL*z{L^OFvOYKrZtqMF}z|
                  zxEnlxy*n&!V}U9vTL7;F${)G42r7Wxx9zS>qd;_-f6!3a3VpXLd-Ivd0?lm>HF|e>
                  ztmeiFRH&Wi=QSTOMRWh^dxz#)WO0%f@aa{u0?~zT2u

                  x|X9@fSu$b)le!rk_)jr-18j1H7y^N$Tr)D1Y?&5e{`V>L2pt zF^WbYbo#BB#Aag3EEa~8$%o}qXNyG0ulps9i7Bu1Gi7CxwP$6z)ADh5%uE$##<=xn zPcG|;TJB{KL%*Org%XRJ&YH6Wc=IqdYS+crX+GWVk^z4D+94bJS;wxcELwSiK!D{X z??EbAspyr|o@Lf^OxT12=m9P(jQug>DT2JinQ3?xbK?1(;!^6D>|&yc-}S>g`m(70 zje7B>_y}U!nhi9OgQIXQCc}(2 zau1ySOnMUA0Q0Q*+JO+fefp`a6>;@>~Wdb2z~!>FDj6>C6X$ zxv%EFvfUfrmkfd$liC)Cp?5|BMyKk%?$=qreFKclw{vg^Gu#hb+pF!M8vfPP z!65ej^jkG9eqO1rGei)O#}$&MH%>INCU>TZ%GcVkgZOKjJ!fzT0xAJ|f#$@FGMQ21 zsECkhd|-gk@d{lCKVl9)nZeOM9^KM|i6dp0wJsE*kAFU#R5_EPi5xJ&D){)5H^H;> zr6+r%$~^5YOwRW(=&YOS5a2dRxWt9!Nb=DmXNS05bmb4Z+OO65liuh)%I02P#51ku zkFgV^jGjVvX=Y_tW8mVNG{`+V@bPI`{2=zl3=gN154f}Bw>;|LcN2l2@m4|=ny9dr zW7iCimNUl>7}Hdl`ic(@y-kspGYB7IJ7>Q5yD;hyx|V>7e%=R5Y4-*^+Yfs32VRUHP$NG6qd^dXkbMZYc8DqynVCQqdz(-V}Y zi}(t>HsH}kDfQsZWE787p6cc=uUkb*NXCan)Qj*!Zw>$0z;IZ8rk4)Y_EFx)Kah&N zWpV%ehK9MfwW%Ik^iW1h)1R^}Pxg64+q?nGpT7n^W{a+gI1#Y=lj2%90gmN&X2Aq4 zo?cOiq#ge40e)v9`+G874zh`a`tY^)32-)VoPbRZ;%J-vD}x{38SHaY0kzCSd){89 zH73z$JsdC;#3BfGE@)S~bEniaJvVt6L(Gm}u|ESOz(U)|3q{xDU$pye*C>S{u z>@d!okR7atNl2b!PyodNhcNji{nx(%SHFC97j%?|GGcoKz`nq_6h#sChg_ms&0#9< zo3HnsnahM5pf~|TxIrHLnrax=zJ1O6{8#}D3+S!yPAs6%mjocvi7C*Y@I`+x9L%(farzvoE^%P4Ln4 zrzo6bWO(%GwGSEhQ9P-{<4(6(y~(1>Em0#;7`Snd8zA#I5#sFD2P=8p1c`6(vikuw zWx3e^5ltfIi($j*-(m-#Ysm<3&i$KlGYl~v7tDsM| zt+p4H@cN<*XR6`yNR*c6+x2{^Gb>2V#cJ7mTLhix6DBRUudBjheGFSS2C%rA$WtRUAx0HLRa%;(M*rQp!+zG)Xnf#)9*#U zKTnLbLd>>|?K`lw1P`~vtXxvdFqY$;mPViS__RRc0FYgCMU?lnF+!wD&dOViOU16tz6SmH(&nVoF9C~mZs+Q0kk}_V^zrb{@oM;t5Re5) zPPlX>Hgn7rbwE=(UG2E==+uimHp{*wdK+uO*&RX7gQVVkaO*-#o||4ws~(jm1Xh?u zG^WqHUk~%yPv3!ik)`D24oj&ss^qyY7Xw7Y+`+yU`Ip1i3aGjfoSTBlr(ze3x!VEG z!DcwW>YhN<%$j1p{b>`osqR&YIgNlwm=CzPSgbJDL=s}Z34^`3>{rWQImchnNgE_K zI@KSJ7MGR2Zbjqx>D20hjL>cwk*2Am#$b@&LMBA;?qF>B%IGX%lbAr#GWZI; zVD--w6fnZ^B$m}vCrXV-KBjuP6+J2OO=*Z-gP=3WF}H9?MtYNA*5cJ)w++kjxUq{t zjke6tG-?HoPWKO?A9EWdeArnqaklQz1GU2Lo4Cn;OJ(iXjL29K8|#92%t zTF3;BM=+v>NN+?kA*4>{x)Y?n9Z4}1j7~D0U8pyy*R2=wZcFc*uiMlCi`|+7&=Xkc z@K-f!*ky2N*<|ARgu%ohCPF3q60k;Ey;&rI4c3r$Xg20Ji6|(z82+$nJPDe0PV8!< zau5qz)dUi7Xlkx(&l(B!wrF-DO`WRl=N2_5HKV7rdd#ZlMy)M=)U13s%IqxRe4(n06k^gD6#zq&%3Q;q){t#Yax!RJD^EPB}oLvoHiR z=G(L&D;Yh18Dy2}Pc_Oupl;cwssNc9`X@R04Fl!kT(#qTWoFRd85^phdgUX5a&D<6 z?=qRqGH1!+Z}f`|LS}mOAbrIncu>(tLE#1+P?5zTAA|I27&iT?3}2`SgHO4#Ac(i( zGuyo5Nby=OnM%zl{k+dewK5B+Tgu}lKt{RHfpMI(vv@`tF+%lGQ?%~$iG9Uq$>Mf; zu%SnV%bjXPN#fiGv68h-GX`mlXhurzDKrywuu>;D)* z_aI)}zCUce0$MQH1)Kn0Q687)X|m1u;?E8^BbD|F=;}P=t$7_YVg|g*tcI~QZL?r; zRS6En@K_Ck=y#8#9jUvTS;bfX;-CIEeMjKEnjh|qpD{)CK|x<+#8~;}+3!}U<%7v5 zNv$f%wz76J_|zm`;2d@l>h6UfcRmb5YZd{POts*xBFbPs2GKvolrUgb;O#gRJSAcX zuJo9JZIKvQ!0Tm{!GK+pCjpCMsYnb#ok6rt4#iR>LZ6;E!jQ5!Ldd*}*PZI#oz}3DRwD1h1p`zYPI}*qDrTV5c`|}9 z{eDRx9Dwc=RQj}kfDvw0z>KxLgY-BQt>xk5Y}BF-Dwu&jGQk*yuTQyI9g$q#0&4y$ zk}n&R5Pmj)stO_uEGY|UHC*8lbd;3|1ynV%n(876@~_8e_idN zYRd|qC_s*xPmr}8mBNSEYWU%5!}>34Qnsb+!!i|8@v7sEx64J%&xOsIdCD?F&&s&R z0t1OHMCE~)H<1h`Nr@py!i3#LP#B=XwspAcPV_lNg1>)G7}6_!T2$<{Ae_N!)O+V8 zLu^DH8#l zbcZ2-3E!G-LwuF`Dw7XdsdNIEsaOKoez<5p2b?fD6;&sXlHtpO{W zIrk+l`GreWI!7p41#+P-8CwHf*>XEhoaimMGdIcBH20zlova>^sU_)xf-{y@4pFT0 zCeU}x5|*T>LPE0mJ zGq|^wBfTbkabm(IRxLS!Lm4;q4}`^K;JT8T*mbE(#0INCL0jO&>&l@`$yqslR7})P zKHN2^VPr5=(y@;IkNw51ja1p=^R9>@Ti`oGw9|Cf6hO!xe{*6ONTS`r&e z^C6B(%^tctaogV83vXxH?S~h5j-TxRX8+S+*kkN*8-`gQC9E(BXQhcg5|F$?va>_< zdkm*N#$JzL2BWJ2kJZ*=o^pCFiMyZveUw12js}`|i}>#E^5~q;y6M-i&0_?%b;byQ zZqUBdqbB(U>W?4u<%jMbjz^DM9e0=|;%*ecujpPWeX`X^+ev+1TYfzF2643k4Q9G` z?KeOplHnga#;jR!$;W}vwTcaJs~$mBf`BJ8Vp)Jf6ND(PPD%}C+M zc)za30q)tt*B=e)9e_Auqi>(oTD{*u0R~ROcx%dMshtYLI+ZJ|t&M=$Af}fBgz3lj zO0LdmQvuEfnsR`iC~`$ulD-xbc79)HIVivx`(mdVWIZnTk@nb~;P1X;9*2nn9@vrl|!g{@l zR_g89^6ff2PGL?6eAtA#&ij<7fA;+70vMeCtC5d@d`!n3m-gF6U%lT--|(~yOVU`Y z@A`8qHda*KB~SFjGsOPef@111>WK!kRVdaTp5ef;tb1Eii~dGKdg_EbIw_LGdtZ_B zfVfHdi-^_Ym_=2LRP_Y%zssRO2$a{NK*wcWoL1+ftwLyQqYJ}`cc|HJUoQXN>3X_G z60FTBXU(R(X!XbUS!Tccq8nIHGoCc7?=LWbNIwXDSW9-6RNg0W7CZZrNg{< z7M~ie&O=;?YB!?t7{{k;6~07gJ4^NC04-K(qAaP!H%r|o?KRS@MM(*waQE3?aRUg$RrrPOBFqO~zpS0Om}Z#88#-BBl5SpJO|(UP4&PR($wx8_)q9 zGJUW^GN>JaQ_0*{nij=ybii&$NeL(lNDEaIf>c3jC`#lrfI(0+5PIkxLWezg?R~bd|L8x-S>EJe=9zidTKB3k z66D+pX;9b?t>NS|t;Yo!cTbWa8V;WRHTNK`N+fB9@06XuT*p`V$fdy(&UtlqKiJVs zABzVx1a0mw{)K+kY@q!;kw_GT@G7kq*Om{22LM+#)>ca^ZXS?R*JBe z;=sl@My=@k`bOGtbEd_kLe&AIs_|SW4=JT9ozOrelnE)tfBGcG%v;Yh!QnOc=e>Co zg5+J@oq6{`?J|G1!sU0tyr6Z0dVBF)cwF=Hg=K7KCo_=DJGLyayH75P7P@U3X*d8~ zA#odOSzv|{@Z32TSP6uCZJO47=tC*LZ6ZD*Z>jFOj7yKYYS&{p&r)OVeK2oE>%}JX z3B{ygPmF9ZfYt*lU3SRSm0rJ!2;YXoqf)wgV(`|mfVt|4ON|?l@Yjyj#DBmEBt4H; zVSJhB^ zCn8!vlS9RAYq&?sST4j=e;s+M8cb-4w6cmhcjG&5oT4C`F zLd&FTHwOwOKk)X_{CqOu5*9KR}W(!X3IYXGj__WdrezBT;>26iswRLKA-{_%fs zkZLc+OqBy=D{DBu@Vx}TK-%L}w3$R$69U!Djs(htV>@idD80fQ!68I8`e1E-vh(0j zbv7xltm%oP$=1@{Gazrii#_26d}9ZZcou_GVX@?6V&=1A1l2QDfFPx@!6XJU^>?1! zku5Xz|7Ujci-`)5*Xm}=SUPj|DCY(W&OcOyMuRa5_zV45f_1Au&vtf2bY%*YKEf1Y zXlUp%N|xEyWET`n0i!!V?;&OtmHjF3Dv$)~RX5ZBM0667p59GLh`K@1;@gk!lWc@h z>KBbvl3EWucpK8jCr27Rk2WLqX7KQ^VJk4W2xO(_D?)A^o#M0W z_n;m??JDYW<=bu=X@mn=<3k_zHVP)lg$Bz9EGvy-j>#;HwByDn-l}RjY`F|i$Lc24 zoz}A8COGD3f(9I-k)U_rz3s2Ei3qAMq;X#@$(-Dmu5_kXo+1zTmR3d$Uf*p9#PfYY zycCklQRXT;5mN6Pa~g|PWT^Bbe=))2>3oz5^E%|{3+iMPDr zdRA7Vn!R8zP)yhx!Xr*|)uGgZmxY(lf-)a?O+{J}S5T`NZx?;3M-h8~x|C%f7KFE6 zK^Mz}gbaeC1wF)nnP$Ebr@!!xq%^cB6hi}ivKuK=jV@8bEEH_~Eir)@#mPUo zqX~=cB3BsC0|r;DFON-0I_<*?Km)xIyztE3HAhuo|IX~T`_4TO2dGkQusbriu)PjT zRu2bs?UAagDkX@C|2v@JGh5Tq^F!p&3G75yc0s3=!&(>OXC~=B(~IBK8f0R#STg3x zjPF}F?%9tL^B?AlHx<~L2k>847f6EB$Zr(XK?8!Xj%*C)hmCo=+^N*sVDSf4CTdT9 z$pV~yf7WcsYoBE#=2!D>=T9=xhZ>St05n?3xvQ|{ep9yb!A4!VmcfONj~3ChxS0WG^O{_x;@?3bk&;F`#3BwiBT)`kmkf4`fod=QY{09~$9F)WV}FgR%zi zHT|Z(U^zgyNMy!&V7bPXIRAtO7k3nH4Xly9Lnc?|=c>~lWI61jlP1klPxW3C0Vwq9 zIq6s1Mv57UA8-DC7V>`Gz;f{g*FbDX2k`|)3%ml%5wR|GKbRIcpa;dPX$3UCKwH}lb(O57nOKla@gMGgNhgG;ZlLv(+c z@c~Kr`5^L|Zb-;WcTWT0PAQCEh~*bkXJi#%?PkN|bQ3&YeUG|us=TuRO)~0s-kC2v zwgR8=jvbJ`h0`w-JAgk^X8nyi`)6HeuO(j6I#48m+kYSp)ah`j&w~;d8E|4T$;iO? z)kEWyqE3UV*DG0t8k0{4fvv}Ar~tTfY5V;YWaq&D6Pa?}TMGo^|2!jvN7JxUft3_Q=q%9ncI0Mn;pM0U)SP9e<4h5McRcnB0JBXOWP>@+7ao@$KfdE6o(u zBBS8Apl78k7rwyp06ONXu-h}PzNX2a<4#B}e@GhMrUkW2F^L>5Bl+Q8zX#vIszZjv zk7|wNmj4-qfK*l?%o&%ksC{?1b%zev3ArW9W)-c`F}I}0XMg)`^PkmlCQXq_ex(9x z3nTE?5i!E_vb3MJ#9UuyI0d=5xgY(m89ObMz{&cBd#)MCO1g^3@;ttgDgYZzuL$hX?i3ME2x^Z2jMu9Jn7Z&~*bokQt;G)U+k(p8Ny6=x=0KhH^ie0Z41!(>B@ zD(uoI7Q>2clHBKfEYuLL(d>ngHB>8o$91)KF0P0+#2=B(w=3rLAz?*+tGRU$)C~7s zv0(e@c=z*aq15&6GOWv%>m8I%$i6R2jm>u+F2H(wC|-`>Jtg$<%3_lvtm_{G$;&cb zvBt24n1cNF#KwMvrCCbt;gSSKhyF}p;||R}n@w{16-U|47q>EHD5>LS+E>{Id7~|{ zq*xqw%|2IdW&*zJa7(VR5S^;>Jh>KYUx>E|-4PoJy7lZb;+gH-N0oX@cUxHPcaE!q zZ8U1nGVCU&dkYYkmM6!(Ek3FkYkt9)7P>w?+dcXw7P{X6`#D&#>ynIsOaV!)<@l#b z>9&QnfEGr(93L?|yHfqcz}T05Q`~9Vu2wkHo?5=}FEL1h(uU+MLAQ|XxFsp{c$y=pLLzoQ-8y1rKlF{tFUxjlJygZI&FZ8#KJ(e_J^#N;lj z?GNO7Wxwd5QweoKJ105u+bx0e9j>KvsB721-LhoaHa91uQgYbxR%?>iE4dte+TEf2 zP^5*c=WT3ll6UDLU2G%7n{&#cbeUkkY}6L+gPve^sGN~pmP|AtY@z$`HLeFD8I&B7# z<06G^b%sTV@fu%a=>1;d2Q7q%rkbgW@FZSdnzAQ4nYspZ1_d}8n@pJfQCgcNUSyY7 zIl3MvFjH39Y3NJQ6E?wqM#kx6UdvbT;9I_m`BI(Zha#``mqW??%mO-80y>RF=vgba z8-le0I`RTKiFB+5y`Dbw`bX7YHV{o)f_52RT+Pa4Mt%~V-4yXhvuo~|&$i!^c^3cG zH<}tja8>Q_v>-inegKmA;n8JZBTjf;DeB<>%WVsdHj z+@^$v)B5el=y`wZer@DyKkN_TfP^JPZWBfB4mEU^0`Y`9l7ACABIsc&qxH+_@sn`J zY!ff(Qd#=h;cj6B&Dy1yQ8=X;Gi@wh!RREnaZlqR?sei5`q z;?r2Z_U?#=(omFnSnVkGHJWe9#Y5A1zeqb%KWhA0Et=0~`Zttb7iW&bqiq>PoY;@W zA2k$xVw-j&f7qYNvy}`dTyi4?b#7E`JWbg2J2zi4LNbDIxsAQtt~oB`tZ%qj6Dp#& z%6_e~!J6OdYfTIbH-(EnI)Bte(KzB7t3gnu`w6bX?S%bWZmpLI#7C^E>RdcOc?ZjD z(m}=#^OKZo_H1xZriw+5-}vu;M;Oy$oB!=U2b8z$rd@Fab74Rf;u($PJ(N{V)Nf zL`)|)BTjj1$Iq;an0I^7G{H6?l&YK&NDIaVarVsD!;z6#jLNo-urF-N1uj3{p z35uT>MF|Z1Ug;UCi0?Ntvz3zYs+>B3xP_h$*(lLyb{z(h|JuhPYLEH~y#u69a&ZcD Q#!?vS-M;Zb$1d`J0D;`mm;e9( diff --git a/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area004-v001-MC/word/media/image4.png b/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area004-v001-MC/word/media/image4.png deleted file mode 100644 index e2cdf4eaf49a121e17477d6536977d7b9f111317..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 60771 zcmcG$by!sI+dYbcgp`0VGzua}N;gO=NOwy&(mf#3jgktI(%s!1(p^J03_bLmJ$^s$ zd*1h4-|KhI_m4ANxUbo>oxS(-?B~AMz1F%3Rg{;;eoFcj2?+`N!+Qy3B&5ejNJz+7 z=%~ORtSxF7uz6wpURe$a$@4W5(w6`vq#Iz@mmMS|m$yhrd!LYy_>+*3K=vsON`k-# zDCVMaqDV;PQQo&ovB3LBPRi0^NF~GMyTBV%BUxz)Bsk(Hy*U^0F^2tnEhi)-oG!%g zqj*LfGT?MbA0$Lo-RBRM(7ffgsZfvUyyz-mFVu~ovtCeb=HhYE>hOe2F1UqKK^&2u z%%PmE5tLBk;8_KY_~l(1Ob!~~mx&$e-jX&_yy$cUhB(O|*`}T?Lp)gDN&M%p^Pn;M zjmw{RU>Z+C9L8E2K`h`q&bh~Zp0tCX;xaZQW1+eMJ3aR;PoF)*172)(1c(iuzrg?8{O`R= zY?=4m2PRUe$NN;Z$J;jo$1vZgUS2el`IeFG$byPJORB;>w-(Q~n9uznf9Q#cEi&X} z%|DWBU~kbnZ{B3}`m@ftX5mBE$p0**5LBy$2Rv}#c9G~P?G3vx0@Sd8)vDT?Z~%&7z7(i}M?m^P}CU9_+)-`;{1!^Xr|mySd?Mq(Way245co zEu!B=g9APDNY*}sx@jpXQQacfMrSp*=r~cqm6dFyQ?)8LtdSXMseMjfxpD=5s24WZ zI4^-AFtYarqhgB$shEqgnVZ?VdnOGc-7Xa9Xf~bm6Ac%J7Yk6P!&hjMgqpdD{**@V z*pBGazfLvurR3+ayl~AJqc~gYO52xP2;=} zoVKfDye-gde++~6ei{nk;PqwuNYMseicYwXpwRlTEV6S?Tr2?fgLWU$Z<>9@H)}|` zljKTieioFbzNlCWzVs#*KGML^ueO;SJin;kXtlH?*_kwEHCk6@v$kTct0NvHNTeME zmzy@W+9+g$YnwHXBS8ZR+_A91M2_`F{}ABSet*H|@*2gOXE_iWNNMlN{(W#U4ryO) z0ri_wza!^EB}T5P1>EG_^$=Y>sqsD4AEo98A}070ZW>M@Jt%yX*=A`qy5!fQ{jLme zW?YN`ovekAep?o=_wBt}itr+aTA^maEu=c1Yd}pedcs_Mvj+XrHE0jd^#uC0d*<2m z=dAvX=<7yWM#|bz!VDT!iXyCqF3CsjGptW%Se=7I%cB~guOkmOTMC8co>g&jDK-}n zTB%m9HGTyyJ`bJYlIy7P5+z+yMcTz;L&2kuDcKlk+NLh~5amT>&yv)USESXncRXS#vekjWJyQH35i$c_ z&E+`w_$r%{DGd#CB40wHJ_O}|xO~TIwa^<`^0fuIsr)WDXmoP2uhy5qSg(uzaO3rs z<@j|_7$G3}ClM)#!7cLrq3yN5G*XQo z5J+dH!y^AYDh+GcjZ^O&JOY0+KEW|LsH`$E1?nN{Dy-phJ;I1_xkC&h5TSlIPxNCG zZF%nST!l2fP z)|0PM^6ePfx(9RVsX{l{p3}ZYMx;Rz{5Y7HLe4hZ-}lcR`>&ZYgC}}$-hb#<42DgZ zcW%T*u^PQ=Jq6-G=Z-_JNt&3lazn~bWnE|4e~vP-|{VdMFpy0Ws;#B5kt-WQf-`zvZ3|Dv2VRF11Q6zK>dh znKrUo-9WD|zk?4UbNWY(k^2m@n)`#_d>t|lnzUT5_7HR9>2LAe(Mu(MA+DdGhu+ZL z`P+gPULQ^Bt9~tYCgyX;B2d=&nvtp=g`CH#g<*Kqhi`P)9v5j;Y}#;6ZaxU6Ev9En z-W(5WM&f>8o#fp4+*$m>=+` zc}RXk4nI5#1(x7WYj(f*-{jS`@^?W<{LMKM|F!uK_wosOk_T^WoQv6>IeZetCzx=z zN1P=L{cx>D91RD}XxGsI2%=vC11T9iwLg7=JLc*1UdEr(-F#4dT%uu{EN1z6YF=Px ze2frSCVQs4yCj+?3vxwE?jT&Mo{si*beH%CRNUitZ+HkeEy|I})VZXKNv8vA42t<5 z0%;*r((6H&-ie6hNBF4Qs_VX&&}U}}`i#HEsoSr0emyZea&^rnpwvv)-4txMaDl`K zZ_=|k#HMt>GF<&ImjLEHM)%R&3O_L}=)1r1^kkM0{LmFWfbkTOKbtAS{)F7d_PvUL zpJD-%9W~9IGC9bop6Az>XL50G0Iv(A@D=*v=f{21Y(T`E%r~$ptdZ8XeM6wBz0==o zVQu|se0xfO$BRiW#%8@#%Bkxe5+fp-#W+!#o+1ke=LPJ;-0r>+wct_v8nzPp0|NA~O(4ZPGG} zey(h0A!m#IuRA-hOueW&ppLk+bEJLTi@Fg?BZJ%vK9YhTI=bF$+n+e{YFFF$?5q-I zWIVd4Vb%AfXyM6Hl%0zjk=F35uP7GNbf+d_ZVvK-rFBgAJcG7wM_H*ARZuKMV0{X8 z{Jx@8gYuKhVWlw$@gRvP+DI)%lVg5w=d-rZPzszR0YW0p4DxNF^!BCQ)lMwUZ2fJ9 zuG^+I3L-O$OfM$*%_(ABE_qVL?BnB)kJe4e*ENtDE5aQIT3^fT_@IM@n3I0&wasdx z*$wd1q0wBs;~h!P4TLB#v?*y#S9BVnW60eJ)QL#IgwY%{FpicQ69P&Np7%tEFwe|s z?=u<-AV)<>RR|dy+makDR68gKUoKwC67yZYDk{bvEtdT-bUTc;&$ARe2xahVlDyT+ zQ=Y?Dp;PZw*?g6y1HE_DQ*~zF<5~(zN_u{Ns6wQ!?x|UEAQj~!1@^&Ta1-)2-IPLv z8`Ux+jx|bRa$Gv;b-|h3Y}1v-ZjEwZb1&6Wt2c>~y{`-(G7H)BFfaD!S4Rwz`_lxf z-2&s!s2nBufrw6>g+EpuOQxF=G1ioy)v#0`^8yFw!#l{bX=>okOG1;`Ru9If7jb3Q zW;vKtn_cg?8bow4&N*Js^kMCDqp~|=X6nhwVK+_GzmjPng*O{G*bkexsy;)<6ZWpC`J@H9Rip|R zj?ksH9}2L|Hq_8!VO3p4{R>aQ-9ARRJR^*c+rAkslc3GZZL9RgxTttaxg|p%sScSL zIK39fs2mzQh>LTsOXO@11`l*(&7-=<@kqy_UJ`Rud}s3S|5K#}I#~}R%TxLzgL)Pa zpz5)fek9H4CGzGC$@M{EiQ{;T>dHfSTd9#*0iA*jiV`Kwz?X+U<>1e@+0nCg&o{fM zNx2HNH|K`oTe>~hn1*#;%^>l=;MU)3^;u;@i1v|=%rjPp@#~LlA*cQ#O||KY#i;keA6u3(XRP<{u8_Qq455v z@NH(wk&*_in;}`EUT&J;=ZSG)-%nTy-IMvby^S=ws4V&?_@G`p{Rw=2ep2sVM9{gH z4wH*)ME{Z5(&z^7tb@N$Z@xR9Q^Xic=>TKvmYD}p`)Pl9CV&w|ok@9W&(qAGj^1u@`NW!}fg>jv&3UFdhkOoz=2OB9|B z+Qe_q^8|OF0r|Mx@JwjvemJ-7lHbif9yEn27^cEXaIt3;b?I8HR|cTRB7e}@n#yK( zC4&&;O{kg(kEFL)K@;W5H9IMgh^RfmVN-%fBCNI{4za`Oj)#$D)!Z?ns=6lpo+h;Q zKG(R|W7*q2HtHQ#2NNcBiR|4Qp;MSP8Yt5~{!Q_|kI2Zt0RgX9fY7?p0APvLTdI=I z>N`?REs~YHau)W*Mh#6m)&%B5J5=O*5G%*Evpeni&C0VPri+dD^>s0>kl`9){yh|O z+0q1#`H(p)nZ{(Jtx4@CHFWaqM@!M7@%+gfLtJZLCzWaCOoY6$P+cpc`6FvOI&>8h zHX?|XMeSO{uAGeq=MyZZ?Lfj5Zcia2g}rXrz;ulHrk7b$p)1&yKyFW^W(lwxTuxMu0ukcAx@VmYhzes+AJq0hMrAY=*X45Dg{cUbjIF zu4r6o2%dvi49>14tmc12rGxnr$?vQqY1CM-eZEKV?hvwy+Q+ z8YwN+SAV`gfJnDMRZwhhlnGRfhaN8w??c*~=`nE?x&}l(5B{(uovz&u%=jC*UQAmw znQ>3w09lx*R{_;{KME~R)tW}Vw6POe9C5_;TF9;S^zU!YP5E~~)iz00#yf%%3Ux+~&u8|L$kndX=F?AWcb(xQ_vltf_t_7>zP( zzY%SNr?96dC;e+K-*oW?Iikq@iy@g(G(eT+li$zk_xCN^ho`@w1tQJ^+$FU*vaS51 z4~PR<1G$a@nO5PSdwdDj9D5FTOoN(*$w_}m-*qUEO|b}XH` zw6=DG?&WnCM=4WXnh+=~&8J?;q8)q+XIV)msjhqigM*z&2IGXchKv09t8JeV{s^ch zgBtblB$n-t5S8A8+@U@ZSlz}_suDvJ&r^5_BTAr0(yg$;wPg4d%ki~nJI0mm6f?@= zUL;VtI(7+dS+Wm(ym;zek{u{4e4v6lKTqmQReE+>m-n^NLZN78YHUp)5}2(#3sg63 zEGqEh3A&lKzL$iPvfUxKz_=+vKq@p3_oK84QRaV%@5 z@%NM6vM`Iqw`bwu61#mc*^>3kC1P5^y$k?vb6S0(OFKI@WXc(7c}2xzsjGI4oek8z z;_od4i;A(1<;{6q%0#kIz+;I)K|yzy$~5A(AAhJKAJNK{!P;m77)G?3FLC74uqBuH zx#@L!usF7LyH1dQDQ5jt+mZ*0?QfR|80XX7o4dCExpbwk{Ka)0Yp+Hu&G=XP4_a59 zYPxmgevYOe+00B#U78!|%e5+oKpNiEpX^G4StxYJnkj|dmPvOa9p+sQ()mh%w&^T&nF zCMNeZNz;YcAp5|V#7%`TJ%JJq2 zZOlSeX6_UIi`n43ogw?h@>^kAlpMpIcettrpE6K{d};fv20oSK=04%kF!oS6<$WCg zVrN(Bv3T5DMzL)#D$4KK0_=5ZxShfNQGEmC6AjE5gn)$2xt@Yq!&)5g`j_Eo};!jZCA zc1^^p0;&az1yfuW-KWwJVN<1?Dv~YMhJ>uN?t##uBEH19^|hGo6A;~Fuvg-@44r4T zuHetDSTF;y5`|AKHJkk`Tm5iP4-yGU%1O!+?X%&iCnKmF zUY^Wa)YM%JkKAF)NY|Cb&87N(@Ykg@5@7o?)$v)|bP8xRv|Py1l-;YN28SEyH9JmM zpGIsB!&t4g9}1~(4y@3~tna;R+neLw$fw|Z6A32>X6;e`)+=^QZ}2!OTZ4wLo=uza z-a9wtZGO~`S=ctXnB02mp{qN0rBvto!lYX;)N}nxcGdkT1 zIye(}^-Aqb$UWx_{*5JeK}@&LAXo)i zS>N`J?I58+=Joh{x2cp{=r|u@vc|s>i;ffo{7A)$H+l{p=-S&E1+&V;bNXp8lSNP} zkx*_9IUa7$h}f+b?rtlU*kJJCQ;?I>?H{UDRi$3g$WwOhRL


                  PAJBm$PJM#y(y2 zRT4Y3X>^HKOr1+BHTX?l&8p|1SJO-PI=dfJh*6^=CPPnBi+%JU`PO&Ol#&P_y|G+|C-hOO)%dbPYWhZo)xFt0Tw-4jQmD(qouIbMfZ}d z_GWu2`qT?S_-1MlFCN-VWYFxVB2RKnk8r4c)p8!HT%q5amF(jgWp$73iO&CO=r82( zAjS)DP~p?R9y*X)VH*t*Oj-&lf>=~ekELNQs)@A#*Lo~_C@YnKx<6f`F8_GApCAHM z+&taqxNKyV8J@bdSnh0iPaaJG3YC)D1S_ZK76#&_slJ1VF7uviczKA$fbiUBKDRJh z_i-rjI=^+$V zz1Xo&;8~g+ugWK{wT`ii> z6yg-9)x=#qtnmse458D^Tf>GawTvH5f;T5ee$|em0p#$hkG3`{_q|Y{i6Q>XBNHKg zEj6_o9o=IFAGd;71_#lyq^M{}Zkob&=DZcH%Uw)z|jwrKp{X5zG_$p#O zbido%hZTjE(!-K66(d^0SzqCIbP#M>oDW{U4B@xOb54V^XQE_7pP7*~o5 zVXqcPopevI-1bw?Z2pCE|KK$p|k&Z$n3g1B2uBzx_)>GO}lth$NeqTt{{BaL!kB zrxFOw>Qy*UKwa^v{eeJZ+}WBKK+3DS6pho;PgQMdjbF4%zxe6|Gve4_T~|f z`H;D?(;#16MC)8R-BVoMiUc+{daL9qsU7QaYIgIK3X2KcH)YP17!H98T zt7{eZ52EVK=g3InsN@zD8Z!NI4?t)pfLFuZp6Z^az#a8H#v4l2Ckx-2k#<(a&+!H0 z0cAs5e&;VhcZfU=k+{;0Y}+8&9;^3f4_?O1*JOoiJ1NcYl9iN#W`|_VsPkve8?mn)<^GD zV6@9y5cU$rqJlA^m1=YEncm!JpF*mtu$=eGLFEqlNnF)Ly1EgYp@ZKyTV^Yk3~F-6 zTNd=0u6i&{Wt01FHwS;5EQ$WD)E;h9_zAuOTX*sd4gP|n2m zhFO{_o>4n5Epe(r4z{un3fu=ZbarVwd%yJv$Esn4{E9TRv-fzaDr>~`UlR2FggKzGxbiFct zQtN*4fo@Cw&BkK zM89VWlrVdk#+Ykr3#0-tls*ZEukOtCS*>%tB9d;OW!Xw z^|cgs;g@g53Tr_9cyUH_@2-cs|I%O3sVYA^+wa2vO6R}40M`(AQR&!|2M`ks&+Akw z6kfi0qbD!-hNXe_p9yA-$J=D}s;TZQ8>3s%y;PW;Bkmg~;o(skx+)0r9@@Z|`u6Rc z-_MKMws{#U1!I*@g@SglX>NOPdrV523uE#d(R-A|fzoe>!P2k#$BvhD<_oqRKoZ4G z1^W6Q;j1HIFxY(C8IRzS6^F+vC@*p{JbnrrKG1KPe;CjH; zZ|{OD^0N*w2A*V=t#Sg4kDcsPXbM8=$GZi$OT*BI;GCS{yJYY`&!ga%*T8C&IERdH zyhH$7U_ud#1F$q8EDZm>`Oo&U+VuDD9s@+sN=$%Jxk!c~Mo6UWn@R4@4uTU-?m#FJ z@Wq+%n9Jm*6KWe6U^cjENe*XQK3t7T_(N{6bItQvIt$PN%4)d3WHsZt+Spu39l(Z{ zaLW%sB3H{H0rBw&jk}EwSx~9DfEEF8^aScxvsz3si(6NXlI5J2yru0Fxc9$||xarFwnf3{x+~3Hn@645FjR^)bb6T%`2~X@ScZ1Wo*el4% z_2Sc}Q=Q@jWMmMbUclY~;jhmA4S8@BYR8{$lnHYKv0PV{Jne44IfAwhlsGS$1Ru$f z34EFyeL6Zl-BrE+tVOO2-i~5df9zr&H*v8mS_#s)V!iJ2Wi9 zgb|jBuI4J6H4vKF%%608WbU9@KF$IpmB6y2??8q4*6ulgrFA1nJnx(3i{< z10NLLwET5O=*Jpqtg}3>NKP)l@qxEX$A2LY8xbjvD4|#yZG;=@w%|W9Hl`pklaq5^ z*|Nf-*?c$xKO*Kmpa*O$-B)aCWdPsyF~w27#%T(M(c|l(9A1F`g(m(9~ zl0o9`uKK{0o}C@)3Ox{&LVX5G%uIQvt9m2y)k-EEM2C4Fmv(O_*?%cv0Ek?w(^~y+ zp>7;9eD&^3ogNe10!s5sA8Yb69#ugT=C&ThqgVCEH?%B9I&?AS88RVVU8dp^-X=0pGsiwA^GiEFPKJy1f*Bsa6BYxYhSyAFEZ+ieuDy4Ds>hk`~F7 zFrP1ywODLRg;FA(_?bM-h`NzfH?5$pLE+WWv9UHl2kPIfh4!qBe(ODM9n)a}4I5zf z1~J3foUG(%%aYU8<*d&S^|qifz9@i1FLuk#a{5qPx!3nX*xbzQO=NTPOCVEY0mReU zFUv}nOj$G@ERvm<(D3niK-lZSZl%}M+U+-8_TtZ@YBg;X8P-D=_n>_~lHx=%(Ne@B zJr_7kq5Ca0_2t5II^r}edU(+v_QLo!s^WkfUS2*@kh`GS#}YrkdycfUxVYCa4b9pU zO2L7|wyu%FzFR;?GrG@d+UU_!1Q+A0%CUF-OVB^6AeX?AG^K_va|iRSNlu zKZy79d~4p$s07=u-bB84r^4<4DB`@t-F?e`JewCBb=GFrA3KLsLHYS4r{-)O`dL3+ zY96?_xK;{n&c@b7XIu8Ql2LEwL!uS@LPJ@ov%WtSBwBkVl^yVd5}-dPd)JS@y^AZU zV_8^_{XXsheNaL0XTt4Dw$Wj{ySzT^#JO<*CT0`u9RFpD_KVK@!#Ynqn+fs0_{Vm~3 zL3XxiZXq^PqYK^JJMT41K~E;BT`ii0#9Ks)MW72zH@sZ+CtniR&4c(AAY zvC%MOKt6pYUtSWOUPB~}v3->yt3}B#CF)a8p-pb@^wW3M7KlPWSYGXJlkN4Q2!_SF zEY|NXE)xRms`7|Gi&SRqp?8eAFHj=g-O6cw&vIO`e~~IdB*?H_5=lVBQqQve4b(Lm z2k@vS{Sg*t!_DTlVG8&Xc_m7Jp8g>fSZnqPHg(s)G3&*z0vsj{0-3TdfEg#Gz<7WInH7LsVDvzVqFd=3OC| zr6Sx?vD^YDC!<-K7fvcRdNWV&Q7PIZ05BDd+zn1g~S35P7rTdrJmmczmt{iImHTgF1v4Lz>gB9(z&vN z`UBa3D}+upE@n`(yJPX&&gpQ#j9BRC`GCd(k^mXTf~DpyADqG;9~BrF5%+#V_Mgietse( zTQ;hQP&T)lF{G(*U+4K||+n^Ga;UAEl&F$q%qGy^GL0f#kmO$vmkzM~D>= zT;0i^({(nYcd?46kcU_jQ&3L}^sG(17hH{ABB+4*&_62bH92|2#@(q=st4k1nRoVG_gsJ_iD)=Kd?21_;~u~S zO66NpL+~EVY4sbyzb=_L#;CehGkKgK^rxX35Rjps_pXwSE(0#kKUY8qOi^bCRS5zR zE*mr-;SAIzpUOrf&QEW^6z}mT=VO7NJ{5UDaxbZ-&OVJ6#xdYwN&LSBGznr7E932) zX~5ecA!fuNJ^wF3ubIBGdNnW)F>vQ=VXBdhb?+zOhD?tsy9vYnZvol{u=@dOn5uJy z4NMJxfyoCK0F_sNy^svlPd&Q8vuN+g)l0a)LW;!!1&k1SVeh+IHd{A^^ZWO2aSa7b z4f)nHDe^YJ;&*Zn#7^Ir+*b>QHR|Gm!e(>sW8N zw|PpB1g?l7L#@=l(;88R`QKk#j7{PJ>!igV`~JHr&+*i`lf4U9`%3h{dfVzd03C$_ zs^l41AE3{)UFMl<2LT%axd_Q)0LQy~#wm*Ac-*!gFY)N-sg8Yx3L@qO&RwTd_c(Vn zFM|tk4t6G;*S)7VZ$r*-(-)!9;68=*EWgT{REV zdMke+3aq3Q?DbWA4Ud#Gy8CROhV2bDh(+?#0Vwxma6o6auHlKZ^HX^!M@vgc^TI-g znM>giBoDtuGK4jRm+h)df#gE>e9))fk0GA9@`+pda!*eTl>hJ53D;rz**kscEE7#d z$B}PazK^bW0t37_-3f;e?-fSc8kb}<0C;4g)zec9`<9dx1gHvtILNHc>GA~{Nq+}e z_}q@V)8*wDy@eZ|B1{&)s~V*+Zm7{q0M`>x`w(+gWs+CJ?M~EEgs5^-P>79(`ecA2 z^y8%fz@t@JZ$`xXF89P2;#okZX%}3VnkXUxgXud!7+sY8k?9L@Jnc|oYha!ibbF~= z!{@4M$_LIu-=z@|2)%|(N&<>s-U43MA1Yr>d9cC3_DCzF>rxNb@U!_BOM_|Enc7~u z-$rBO`;N}@<6^j-@rO!J%ubph8jzm$&S*oE-~IqA>vVs<1|+nr<%o_^ztq!~(9jZ3 z=O!0Sx(MR6P*i5uPs<&QNyl1h^>?dTnoQb`6p5w6qEj+N0}cgDwQ}bmqEvccku?+v zL197a4|d^Y@KIx};pgds@ay}r$;o%06r1i~?|y5QFpCyJ4?WHK>tWY zy!o)TxS_ae9Tz~wo5TsRY0Bstr9w(I%wl{PZx!YF?K+?d=(jZk%mGkMV8T4Do5x9E zy?ze#yO%aqu01n}8}EzIFOYBIJ2yx`We$U2t!YEE0%T-l=DK>)&ZdA8tV7$zqaY1i zYk*4mIj%0a4DZvaApl&a`S8XsW`}?k6QkJBFqHkA$FfodwHJ^K#k-#pSxmcvGL6~y ztF~E=MFE+jV{8l^C>9KZ9KV*Wmj*lj+9}Myw>vz<9&6OFd`0i4?fv-0yiGw>Mse|* zg`yS9s2mw8HU$;Hq*YhM16|@UPa;|DsK7v>w zogm}FbS(n3Dqr(x!BD)QNa0X`u-B^UKnY?6FBAtN8W?86?u#6}ZJ7jWr zy3-bEJ4r8tD(5&Yt1;~WX>qS>Z&W1;oXpZ_%3E8_786~r^0@v=C?uxYxt{gzKF#dX zZ3WNsobQYEjMGu{@t<0a4LYWto(9KDa?DK=iK;9sjXRt!s7w;yHak#wQy>grGf{S@ zv6xfPPQVL?Md_f6aalVm%GW+VL1+lqYtaEh+)nZ3Q>jJkwLS+SlCG{kSgNh=VQ!ATP&{om$K_`0532blp^CJV7l*(2Jnv6pvWWSrsD<5G&wMTl)Ze=4 zz7elX&&>^`@e)W6&@y{ZbjZul?iGeF6?o%fiy-pIPkosD8_MiVIb6Wiv)m5*v%^my zK2REIs0h5OLU*R5x)Q4*Qw}hkeM~(r`XdME`bu_66Smg2NP0_mBVg1^*5G;o3a2gU zemrjf(s{Z~kSq4ADCNt+(zJSz-PmP&ryl?SA2qnJ@C}L{OZKEE)Oy3^Tp!OP@EiJHSvT=LDqAq zV|bB-htz(8{GQVMR}<`x*FEzg1E%v*K-E}fxfvkh`)4jE53B%`_<*)&G1+#M9sPY) zgzd(6?Ne`x^s$i{iM&4D6NR+b#y16kD08v70&hsTS;n~U9j^0Ui?sglot;l1 zR%%Rarae!z%rc+08a1>pIv=fsK@)Yw?caapSGAkB<| zB<<*~Ij8b|4q^=~90Yec5SsF?8R^E0FZ)$+H@}Ui&tMec>x)F+2MC8Zw{GIi#f)+5 zkeYZ7$TwiBBs|=+At?-IdEODPy=et}(9F)3}Lia(IZkytspA@xzSXqZM5emFF_yTxn(O zH>@SCNJ@RY)zwhImB7;kGmBabZvfj)q-~A>rj(7`XLPu3$_f+o9VfF&YKpCMuJxsB zvIz$VSmmF+7R2tCe9uMs_(~h|7D|=p9w*OK4b}MkIBnb;cVgvcq+>a8$fwsDf6kaN zxgvm&8tHLK|2OjbR-Hw`aI| zx-|WxPa&ZA|A*HO*XVyYXLZ3)$X5-4i^!~1GW2~Ei+-r$uDMIt|LHGf3G`r1)*0$? z+9@UidRQQ=JeJqmQW_sucCD$%V+uIAK{E8gQYxy&WTQ4)LDr7QpZ~MOu4W zizHG(^XSp<14gFMKc+fR{t~DY6Q`*>{Ncp99;Sdo`J`ua4*olTyWF)?Z%zY1Vs*YE zsK&2T+ONY6_mF&`K2-$K4(=7d*(o$Nuob2GcTuLuIvcxbg73=oyZq3v>Cat4z=7oDxFNVX$!|t!2 zn-puRel!`hq>w-;5TOj~sB|Qs7$ zx^})Q4^Xx+)JIhZn=pf5baU9duguMB?qak-1(07(_0+Dfg10{oq;4FXvLk!k()5FNRCX) zJrzHGNJX~XREA!6yFSJ)_CYzos9sd0ueg)*5xx3s6xZ@W9L*(fBzmNpZf`qu;fGU( zFZ5R28LF&IF`owcD+72sJ-@|s!wb?&i8#}xBK?U@BTkX@V+*Sm@O+`;{LvR-v4YUa z2}EZPeqQksqW_LnCWIl?^DO~EFX1`#U?@SE>eApt1SdAd16k8O&$$6iAp-nyM?Hh~PI7=YJQgO3 zGhTWLZL9ea%qs8z~x;c`GQH1ZNbqY)BeuHz9nln6YBM#0I;bU z`UyXOmbARBd7)ojT<)asrD*-Hrh*EiKKvzbSN3*BytQ3=@d>BscT!HJ_gqSUId_hYIe1qlgBo|Z2r;M4%5 zn#m<|k!L_y{nuKx6+iGN721mLNauXqCBBnmLz=UTJt^HpCkG1mHoMQGDdrnK z?RKE@y1m2#D8Rt-a&Bjrsxlw7Gn+%VgBI2Wu+oI@NNwVQHGCM5iEVW?+IzGOqVB>m zO}GCPbZUqIb2COJkrlI$T(Fq)G4-t!MrT&|;&9kIN+4SfR~T7lBpNpp#}k3F_Vz3W zFr_hdoIi#MTJ{yf??T3Ia?AU#^(}Np&m{k}cwjW^vUV{K;8yvT>yQ&O6C8RdeFWuTP*j=ukD;n2tEVguDnDyZyjSsGrfM6*tsJ+ zkWBJs$NmGUEz>AqLKI)AJpS9GyPIC-yZQ$lp!n-pUPgDZ(l$Ou!i{s_iH|-3Z0R1D z;1xHHr>Lmf78Bzn1ifl1z7xm)xkaN_?*CVd#>q28Hl|Xbj!nTzQ4WS54TwKM3bjD!U8?~Y_`C$t=~hK zhA#LtVz3haL1o1FFsQMjG>nkR9`1wH^O4v84AeRK=x+JmVs2#iTl~ho|8n$L!x`n3 z{y~(o-D`ToobY}F)y_Fg!z;^fY?lS|k>J&JpUoAuL8<1C1_rVZ$q5O5@-sIyJY0m#Xt_3*k>7?in_g93HLSd>k!+dmk_bBrMOQ{WrbItnjp#HIii-^5beW2Wt?(xcriyULVyBucsUE&{dIx zRn?aV3${(G?Iwh-ZX{Q40*`>wPYE{9s0{qAfq(s7fF+>KVG&k@jPpM{Ba-40s$I?1 zTu0`^K^eA;=6t7aGOdXg1P?e5VG###8v9Ewe#1G3cTx4>1zp<^ zpaqjVLw{&Bps18w~E3S^Y^WS=Rtd@=kWZImrN(veIXM7bEO0fC3%5 zny4tzBWzQX$dAk;b94HGg^?K`b*IF#YZi8Ct7{T@&^IFAAKfHS<sBd$C2vBL_5D=8G$n=ZRn9;- zuZv5i?-emcES5^_fuH_l4bU(D1dQfx40La0du*EMDS%t` ztU-5Gd44x7^jWw66Qz7lBj1{Kb9TlzK#`E>#>(~gmVZP0DjZXsAYSqIu%l43wj!_y zlaOXBExLrs+AM9RAu#q-T3-WW&~!si*Wxv$h?xW}?NIW7QmZysk!c7K(7?U2VWGQH zW1~HRz%oVvlX2a9Jyid;UU%pV&`&{2G7mV-yVssvlsUN}0ljMR&wP}=6I38$b zjXNsY!H(lB%dyQ~2`puB{_3JtC+5e7tD$oV;RJ!}bpB@)av(6|%$Gr-Laob%jg-}0 zuO47|4;BetK!63K>J8{Ye0U1@hL#z)@L+{adarx4g^J=*z5Q-spXHYQmr@Zzk3i-G zTHBrw5!BR8jzP7LaWPbcYR49u(|AH0973D8Ze~a)%_OwQ{V)+-l~Omyw_OvtZ|X9N z3iYShM_ha41^t1x!#b~Gpox*t8tUxWIrNz&6S6{cb#jY(I>DqwT?3v$-UQ=EhNfw> z=NS^dbv*cRFgvL&B(#x9RXX^ISw18!H#_^=;Y8tGNVpK$WMyJnQ1MN6{(%7&Is#h} z5qSb~5ADqM6V&cO?VFrP3ZOIV5yh_|*zy1HF)^uM8UsG2)5o4CmIlho{D6xii`?HC z>%btD^%+8l<5`%pR@l%T21?8RZwx2Bpc&T8D( z0E}6gGsSSc?n;OqX-*MxbBi}&wcaUg>L@7h-9$wgpJFb+76107)M3}FedfSvQro z16xv_4q>}iz!gA_65k2sR^$nQoZimB2Aa^%vsyOGj)Sd<*)E?0&L3t4tghbeOe{KX zZbET1kB!D=BbHqteP!A*(s{7`yyDdZOyyQk$>M{&5e1{Jn5T{+K<~k(_ek+ifr0HX zR@WcAB@91n7qSJ9o)dv}qFIp`YPu#1bY`mK{B(8SvB-Ne|6hc?byQSs+c$iPg3_V_ z(o&+Nh;&Jp(%pziw=@g_0xFGCB01y`LwBdNba!_R%`o3NUibYx-}kL|t#|%#xn@B3 z?7h$PIF4U!w&c;+kh2p6-0I!Z`shk~PL06Nt+U2%!KB$0Hr`sE%Kl24X<03zH@NJJEu`0%HJ7SQR(fuHeGrCdH-PV^vK^$rPSU~oMRl<5gH)6 zf(vYVU~;k^cZs;x`n(Is(;^4EdK=%=@#{HC8UjR6z?Bt0SLnSxBZvx{j00T1OEo+_ zF1Jk4Fy8aX!F=^jDoIUUElq`d5y^aqg=H=rQg{B_8`a+%^;)k|%QeU zGka0;&wS5ckgVp}eTo?>oM10T(p802ue9S4zq3*R93mM>8&95p?UR<)!aiHHrTk5j z$1OFc(FH-jZ`_AJ2W+h*iB;t3KDc^nNE-LEy=uI7hzjxL3S4gV5dk(ksz3uKPL1lf z2|^}#K!|Q&Ll7NLEUka8^G9YqooDoqvYxPB=)IAIQkfN`5GNhG-4cIw-^=ebj)MlW z+Wyy%uP>aaM+H=_ZnDNplv0F^s@at58?p{@F^t{0yW*SJqurBj?e?BAw^4gDw&JFX_Dh$jlg(0<*yHq4;&%`9Jdg zC`I&m4lwOI-aN4AUt-dXdU%1ez8sZ*9e~477fO zXcf38QM8SED%y>k$-lJz)t@)lfBE_9r0zPM;gIn!yN>?#KVQ{o`8)*f0H4NE^IrfC z@bOmHTIQS(n;7rLzNo(-S~F6#4Cs6O{g*i3e_|rU8nh-!iDWi+W`47j_^q9n2}J=~ zoT#5a`;7oc4;padCBo7i+Z3T<0R+PR{Hq}*D!BNu$l4v|@ww0P-{9py&jiY4i@_~zz?q!Y}Z~L+d#cXPu#CLS{uPIZy?#3k+TnG z&u`(gDYnx!VQ2TrVtPrj0n{W&EUBmWuz|D|y#cwu_+ogAQ%`L-NDqio!^#_ZJI786 z1`9$c)_NO{;4ipc=4|X9Z(98X8^?y+){sSfnFmKQol9qlD~dwhc=x zEDo+9B5_^=)o1y?4(s+k=FZv}OitnE<@@Vm$4@aGju2EMg^S@htH)dG!V*_L-=(Ra z84P_Dd_<(eegxpt`C;}{+O%RN+e=jiCjNYWIVT&&@l#72oN$fjx4(YPof+QDe4@lS zSArCn+fv(#a`dq2J=wGjjtF`;rY~A%wV3O_6)s$v^N&vG^;Qwi%)D=9K2K7#uGm5< zPGtLj2s=o7nzhiLznwJY)#^6>mQvVt+Ct=()?S)RXV^29ULu0iO*bTzl z7SgUp_;|IfNk_$b>s8r)ydV9)}lGSeta~x4SJrd{Z7E|pUMusdu*f+l<8-zeZl}@d^Vp$tM zyHMOdJR4eLZZd3m`HzpMupx7IdM0V{>soE2x<}Yc(> zN{M76HcH=OVyWVu7uje3YRf7ZAN9&DU{UE6yE0T!&s&P#-8_R>->tZs8yRbt);qO2 z7prxEpF#&a&!HpqR_Sv3fSyv6GvwE zI7DQxdf|q@C@HtvzLzUoP>Qc`NE5}Nm1xT4Fxj2+6ZLgETJ9x3V zWfDx)EoFANY-&ql&eSZQOr1O{+bX*CumKjeS6py>m45tedpT5Yd3X;;mO1RsI-Q7! z)M(ok)ovE%1ka^-6>C7@SUpNF^I(_PvXO1aGMM*rUwxl~m-Qc9XSI(OdfG;M4JhMZ zkOtL-qLP;qS7V0HjMxi;>QhWDf56J#;2uCnT@$(2^IdOPyQtw{Fs{m0vKx&ZW`E}- zD6pd_1XgCaz*|kzqc&Yw$F}2V8HR-dH@C$TErq5w2Cqi4%gtNB;Qe-17p_f9BQ9ZD z>~JXMa(Hd_A;7#rxIc+7IGDtt@%V#fxrm_K-88eSlk@q=Z|6J9-*j%~21F_KD(9Ot zP+BIowprw`S^S7#5be}253y~4*I%aoIX*nNt=lxOPgA9kw&sW{B{}e|zCKW3ueJ4| zI*y!l#+Z(b)#56j+?zLIuU|7PEqzxhZJw8&hpY7%XyC|tD#XYaN-t*w>CKGx8}v=* zce3;ebKy?~j>MX)-)|&$CmiII%bB++A3U(qFu;#RHTS8?+*PohOt}s>ZpQFX7n2+c zTA?g;=)&BYol6!31?2WwC^5@gs#U<}I|uL+RzJ-oo>V(qw;#-lIYIV={(~1G>^ahg zY(I%xy!OvGIDQHoqxj%ADEZk-Zn6F3_E9O%EyVD>8sgi|yFRm17n}>bLtB;EW#X;9 z)et_%B3yYArNoHJxTJ1=?i~+WRa{7CxG0SJCqpC6jhxizAN4zi5gid+ip%G@f;s9U z96=CeF(b97erE_B$bqOE>BW&QRAxM#`JVek9p?I|?M_9(kkwJ0&@N(H!fN31gslLF z>tuUHYg%$g)Lo%=B3Z4nhGL{Af;OP1b!h0(cL-muUA;nI{T&XtD@PEE7IcJ<(>z%e zrs+D0!=go_L-UYr3mf}wUfPvcpTNE-K~joOC9dDB`~_Rk!jd}jy>F&;4 zae#nYMv~0V4qN$h(;f5hk6sz$Oq)^CL2|U(Zr&8pi}Ol3fl7^hpV!{vZbhsjaxh#Z z-(hVV=i<;X5xDr-CYw8di*?SO$#ixp7YnnpyL6@n6`#GDr?cLW%57v6L*LSdaRrr@ zvL`cOCv|vuceU6?>YolJfy3YXN443bCB&yCTKvCwrZA8CliXMOtX&$TbclL?EeAgz z9(EELx5ZKSv-TuqZvE%jm!80iRL>cJ^>~dOLJ>NR=Xr~j;!A&u+I1g|`Hu~zXsOJ5 zWCHuxl@L2SS(siy>ncms#&9h|T^UC62$?x`!ob8~=fN@jW=ddvz`;xQJ{^B~^bo!4 zPTkk>`BM#UvsTgE&%#%Bxl@N_w#HEQ>yn!X#*#AG!~!4r%S2J01XNx&if%ss{-!U? zrsPfxttK=7&^P<)isWO8i@#HEex0oVx79US-(s_ziQE_2Ep%= zr}OYvai$ekW~8B)TVI%2zX-Z5YqU$b@(JoJ&Rl%K>r|-uwNgwGEsw!3Lx4J>!GpvN z#66+wE^u;zzibcT&q-DC7CwCTL9qai;RzgSJW(ij8G zF-MC>qtEnfU6n=^73Mp({HY(^hKsxEu=j-0Y;9TpVIW1Mo?bQI?#`Lo9)mwp-5+NE zy|<-VIb&_A+`H?ToWHxds)+KtI5$z>%dr$ zfV1sY`#YtP#EMrp&~koUW%@Pw@TRKnkagA7@Q)gc@yo#zkE(+oOcDILm58DFvAB~V zeh3|&Ohn*PNBbO%$LPp9!qTsoqcN#9o&yHk_kL9+BuxO%Cw#`>o4jGUHCFxX-MjCc z7QYSaxGXAR-6jV6zxo@j?(6xLV18{X0?@-e^Pkm&T_Ed7CU!Oc8hT`hf$3$y>KFJ@CM z;+>1zo2h}vS*OTDy@z#&;jFE6F*x)+2Ny-%7IPWKu|2581*a){H!Dng7H2La~X0kcZIT$TG1FTsFueud*GM(~C zm?LFUrk>)H3EV+L*h45Rn?`S*^cA=8+QHCe52T!>``4acUZAaA)wIWl^m9beg{Aw_xELU$-E z^HH*k$YX6y;;GDO8G~e0`>-%#`EJ8^aTUtVg(G$ahGXLM4_lTa|EZi$%se4gl2eG%wNt6hO5Ac~J2HG1WKb#G+qTgC zl)rrF3nFoFl=@PlR=BvIMhP$~a zHeOjWh}ktLj(K^5#h;9g-38-}x4RT{#oX-dvRzD<+9_Y~2!_o*IQkQFl8C{%1@yt} zaMp2q+yS!HPI z%=OO91wGK)Di-EC#<7#Fnwgpgz06GFEHWain;wu6g=}R^F&k+(iDZ(<4_T~m&J9(T z(B_s?=O7F1zH2x*6t(?I*;?)yV1}M0HpCw-KR=<`bP=~x!mT!|ca>78LmfiguUN$( zycDAkLxq~&Bi1!a_3f}#MK5yFc^XH5Z`)+zU=6ul#&Q>^RD_mp4V6e;;WLLxc_u|- zl?3&$9vdO7P0Kb*uzl{HziUR4b8Hex8%77wg^8@XMTfxhsAz=Kndh!7IKG{;j@d_m zBAF{R_lu!&_AcRM@Sra3T2iGvv|LP?-R&94_0Z$``KfTaIRY5r^|%pRp%T%PbQ!tn z`yNf-e^EH$$~k)dGIU4hBSsBRhC<87bD~;<->n?bDw+AY_(W5z z;-gWV8bg?DP2i84w6mmP^yf!L?c8g5Z@= zw^tZ)?mIoPtx`#*OXmHuA@%;Ij_sheI)TiC?;!TqL4NX`XSZq#;%2|w$`;&TOlr30 zqBygkoYc)3A7(xl`{ zy(RVc$E&#<=5J}14-YT*ynQ{uB8qY-+pob^8I*%jj4!RmrlY1s9`j^i@B-C5lF9F? z|B8c-?xk{8*+cf^y=Hu1(^U!$Q$ve?Ks)}BXs~r@DcW)QLoZjNk*o!4p?-+Cjm=A5 zfY;o11Gj6(9J2CHS)XVA`IS>mYh1w#YW7?Ccqs?SuQFMq`MaL__@S3tJzVY^hTJ|L zKHQ7iHS_!*`5yI6V%6$QU`L*|8bV!vmFSS}$lDN3| zx528U+JO61NeFnXd0P>)gHxF#KaDw9N9(zTSF0>%2VLuT!-6#6TmI4~xH)Gf$-_Xj zfO6-hoSnwD)g$hps8@IbFC})Pq)T6qnBA=)ra#Yo)~*8*Xn0SO^r zi<-x(@aSD!d5^6{YK?Sr+sE(7H|nS3=O?D#^9aqNqWb=s#{8G28@9fI&B0AmNsj9C z6mnkcLQyMCw`N$mmg9o*J@OHjR5l6B_=E)G8yeF4WC@>&mxrxR!Hy0cGRYVx=QNwL zj89B}>AHJ);o_0$6O3a(%jZRMN_CFRKTX+nbv*~{)MHOqHdv7TBt!zqA$BuH#j9NZ zjpgSn=BA`DkSN(k?ndWHEBjj5#xw6z&V7d+kNa zxJ#wh^Ue3Y1tZz1Bu~4*f`UNiAH7NI5!H#WdIQuQGTV|G)K?YNG zWBH9)9ktau^iqj_p)Bf83W|ULT84<42tF5)@=+gm3we-C0s^#q?wWQ|Y53LQ%v2h5 zeronQXlA-{ymF=73+i-cqNlrzSp6901-;@(&lXF5*t948+@LSOS$I zIR3!fmY&(+chSN~`Uk3@qM^s;=e0WJYkA8O<5v=E=`RQhY-V0@bkeQw1%}$83Jtw# zN)1U)4^k|}E>dsIM$FBbSTq7STz9d>CzANyTs4GW>Q`3O;{0ShAM^1&E%UUP%#ZZ+ zJ(&{L_=oJEB7!GB6=&%R!5p>ct@n!UbChXBhM?il=Y~-nfowuIspcy&WI^ON?UL*0 zhB5Rs(VNnvCO|Y8LRl5D^dU2wA;wS8Oj=dev%dN^C`lS(`cw@=ncQ@y@^s!9T{Qr(k`!0%DhAt-%ct&Bbo648pNq41KcSY0-BZr1^&NZH6%9| z`>9fX%wAR5KeKm@ymjS7SwIDthE~0vX|{s+^n{%Uo0w&# z=VJmT6`Mv}TZ{I#+udjGF9iI4tmshNcz^a2w{%v(( zSY^=*werOXi9JefodmPIC|l2rF~gb+)*Z{vV=RCpc7WX?-TbwxN{Q8P-JI0jhi|Xu zdFWia%nRzzK`HCrorw511|L)n^b5VAgBK#&{khXj=6bNlJ#WqB|7rnn`=%W{0x<%4fB)FVC^Vj@;N_O%Du6A0S&hh2QINxQf{oGo$K+#Y z$|;$LI{THbIcL!WH5=n))J%rML721OxPQha=HZi|VtEXc!})wFXl`^}$eNou4-jP% z0W}xp7o?qDG`oEc9-W~%u;ibz95kD}qPsd;k^{$(x)cgOP((!|E(zztkar~jOvbI; z(W!%3)W{|jvB@=%Q#f^F=uB)+F!A-!)Y^DzrRK}Mh|URYnZcq}@}2p?TcA*Az;T(B z0!>!5f(O%VO^_1G4HtWSioft$PZ9^o`hD9rTDLftUc#Nsj+c&BW$~yW$|rI8xJ|d& zWpXaOuf?W@i7PMWUiT1CEV`AkeDj>nE1Z&sXp#koe|~p5Q+jFH109&()59spOD=gv z=tVRXA_cbT`@~6~9ie%xJw1xV`X71^Tf0ZKMi3vTK2Cmq{?Iz@y`#)Y^~dKj)KnbL zH@Q-fYXF_%bnsm}rKt;K^fmOKkFq;p{V`@5fY?#a3rh5y_%hPr`||n|&eZ&_8*1}w z;BJwPn3{TS?E~kvi)EWDFRP5ZocVXB&!J*A){#iDMc(eM)si1xyXg*R&XIpxHl zp)i#SFUo~QH(fo`jL+ejBwNVA?-UuMR(6z90)$*ljFZ_R&R9RFy`4$)WdzRZ(Uz~d z#pbtvPWVo^WNNl*Q@(rf0`zojwrHD=OYNb0?utJw#=u>@u5KlkAa80@3f(S&UMuAx zNcM#>J>2qlm3UBfnL^k(+Vre$sy_ZOh?7^UQcwX-lA9g57dslymK(lHh%Xr@c4CAR zL||27;!e=_L+WxvzPsfONIFSEkTWdH?;Ky zvT)|*2Ekh_ENb3-Ijkb*?lkQB-$qb&Q~6xXMbs0Gz4XIBWa5;PwQ)&EbY%VvO_Ul^ z5h8X`#y5_RU60QfsR1?@=vq)egq-b5eH@zdkur>e>b|l4&@+VWAm~Hu|IF0YN)~=3SzZ^L^5p{qA0Z3wa!Q zu>DX|QdFa@deSwxS$DW6_pVmtmt_&Uw%t!Sp2rQNr;-d^isi2;3@0dI*Tsd-+3QnCowZ) zvvb}xW&O<#Mc&$qJ_m-+g{32$Z^~qwt~10+KhB@q*En2PHvUcO zLB&1?oj3aR|E(EqP5%<7=;`GD_33|xrT^cjoc|3r+2aVX9*0K8$Nz*5*FosXv9X`e zRG~`{Sn;B>M)N_YOm?C#y|=>?H%``0nSQR-gpD7peKOeck(Xy)Lpk0$JnR4uy-~%< z>JtbEVjE9)ug=^;5kU#*4?N4rjjG3tsvh4@fNtw%cUk=sa1Qno0>?J!+{Y*`%xub(JY1)e(teu@%UtIGD7YRdi z7Vf#}9)gqYwN8ToaYK z!+ghqEbbn?7J6UZCk+b`xaS`};+NSkXNu5VGu@F14}^W1Q4Yxp96<@!JPK53C{riP zErx3{Zh!IsNU5$^vz(}phg^5xiY3!wv)AguWgg>56?2UKg1&;l4i-+13sbs9IZ_b0!Nk(Avf5*w~bAJVNP*uNtP(8CDPuC|Qs=KE^yQO3EBXFVWKYd`Hx%qp|J;nAo94+~NVtGY8DP7o_C-2GlgU;m}Q#Jk0zkq@oYWat0((@=2I zHq6>6&&;3H7t#d25{Mc94nmI9kd2~yeCX2aDZ<(LcT3ygZz4Z4-!W9D3yKi>%r++;s$t3%a=h^4nQ)O0k{c8C1zHeps(x~KQFtX zY%Ry@>X-j0Xx%YB_*0*wKZsfH`Di`puNm?Ur^XuD_J}jfoJZ*^o&rzITjrjyhS}+l zbHDNb2A1Q^IENg3xdZq;+_&V!$|=XS)5a}Y+ztS-*b8EExc%>beKyn7JcofPbhNO~ zt%YbkrNQ&lqOE0u-2c0u*HgwX->@pkWj)nCS1_%cv%edQav>uj$pYDP%|n=PNB*8O zbiX1Q;CbOV2?s{ohHR0zXKPJi;{V>_&h)tk=1qSGj0j>0r-$#^pYf4!7R&Jq^eyNW zgNOZiZuR)A>OOk#K=oXP0euB-#jhS9$h-1PkW-Q4%jfUU#Xvl6s=AyEbn#}rbr3q> z3IMyuy}i^Ngx4#%f*Z(F0>q|}Ak?~gOFkeX}SN9La zJe9N45{c1nc4;JRK15#K?|2T`oCEFiI%kS8F^Q@W0;Ry>SR@R})S{ebV~B@L6~ZC; z4egMcQ)ole*n(bnJ&twL^s>_dP=KP}KEF!GMWcrR)f+V*@UH+W7K!>e6XYCg;8d6< z)bCVp_CO+70`Sz0Q#>#G()P7J#l$>+igZvt(L6?usKHX)vD@JKVg8v?x@5axK*+Ua zC_f~GM|}N?EiS%1a;6FQDypxrQJOY1>*1q+#wUGcIOU{(Ge|f*khAITF|~;FGdr19 z$+9=I{1$R6O1qL%nZiC~kRAr}e~eyD!eaWrrb!R_XWc_ldt$q1hy?RLyX6JHvoSw` zp2B1!`>t~R9PqKozm6zuFLF8|zRvNH`TV&p_qFEAFowCavzq%#rJtLLAn`N%3Cb_z zqce!+ELw9W1?1HtJz=h~c2=WBmsG()Bo7j(Oe`ke;p15Ooo)=|H8nSjXO1y2Wy5BU zo)(NRUI#iLHVsr0vu{JrHxcy5WTKl@ID5mm8!ilQv%TWdwTsUEFYC7JEu9hGkjxrQ2R+PgIVjfDe!jf?`Dww}Vu_~g{RjDOyY={SWlirr) zJo?B2^xn47B@|cR-J3M{+UU5>rPE~uwis?A!JIRo+6pC70%F>r7wE`P6&3g5O4a88)ZrUv*{CFTQI~DSxDF0tT?{h@bz1C6dv->o0pFK(` zVB}jQZ*iBPVrF4kf@YVN8h{13fKI^`687jUanHyVH7W1 zkjz7)#ERs4opKaC_fQ9aT&5z<&Sz-eFi^Sn!_;Z?DVBiw_1?Sv8@+ot8wGoIzg;6K zFZdgi+d-)sb(^En#xiZpcWr!a5w ze9jrxv0}AV&P)VA-LbvSa&bxDNj(-3M}D+(`oy$KB%EM!-Y|$Et|3P=J~GuHJ5hC~PXI!%Sw1w0ojjan|L*>IB6Q!H@o={4XN33u zMA!7x$7QZx;m`ogISBNTp|987ihSFG{c1*GFnYm);|7h?HBxrVF2X4cC~WmSR+~;= zcAcKSWJXLR(7$YPM}pQz8S}5}uG@n{Lv&A3ag5JxQHa3v7&TQk+sl3a5ppm*W z+yE~icX5Tdwq?#t_0OY;KvI_0RcC^#?<>{WuZVN9m zn8q*_QPkIo5@9wUnK=#}h+F|LdhM>(>1!;D0BYo9C~9U4+&-YuVO+lqh&VHysq8%H z04HYEJf_&w19!BjR5pR}_x=YcW-2y}mt-^HDa%_5(zY*3EV)>)enrhM-xPuIh?u9q zDomA;lGE0Ss%)6gi->bYGbcaGOziPzdC9(p!XXs$@!S!qtRF$Ps=E*x-fEgfXeJsBE4ky8f@V9PpKv5#}(47 zv+oYa3Esi=wGC}R`e?LHf9i?SZBCEhTKxNP6emMPx8K75ogmK%x?)&Z4Fshn8B+g9 zgsHB|WvOnn-^xWmZ}>7u6M#w$wodFp7JYrV&1(t*0mFoN`1KTr*h(Mq;W_s?M}M>= zBfHo*9g3>EOl;<44i>K6l#a0eKg^ZWIMdTQIpeJi#+4@}Ug?(drb_#G5EcVwPtnDX zrAPL${Ix4~eswS3SzaK<{su!)zgT_xufzRcMDo9En<0S`W9O_}r4a3R!s)bMQz@s; z^ytR$_E|RPpn(@b4k`K)60P<(`P|hWRaA=L_|LHV_wE1tAHuhv@(a~VpBYIi1qd-2 zGx4IEqxw*%%Uf?Al>HB?58mT+7!bqX9+z(QEU$KXE_1#&7YzP;2Z?_VhLUimJkBvi@%THF-|&}<_51)yH^>pw&Ae=yhoe#8HKI*8kLZKmBdqHa9re|&B_DWzZS zL`Y3tk)zW`j8-xNO!ABiN20?XM=!{ckBHE z%hBpglKE?LzkOz&4P>VizAx^~L)31YdH>P?4OgN4Tx7*#aEIv zjlmX!Y8SC#JU8DL@2dZ~v1=T%6lJyvHpBgyEoz}qlj)gnF(|N#BodBYzSGLMep0e0yPzzInP;( z^CDW}7eH5Wa#KsAxHOzb%$0;XP2yE4sR|IW7=ONyhPinnROB&@k1R@Ecno&)3`13g z`5eeCALW#U@7enszD)1{)aMzaGwY41;x8f=zV5T=aew3Duw}eT0U)iv*;@~3X&u3A zdrKx*CSckh(}sxh-7iu0>V5hS%8p)sbH}NDc9I*_$Bowz_SVh2^WRkXPd1|#kg?5( zOf27>&!$^G7CAgKcbJo&mXiAvyI(LuF<$G2*Cy(o0lc|74n5?6HI3Y{VRPUW5?MZU zB>_3Ps$qO=Y+?2w=I$vNj`&jJW==tOlCC6b)O(RD^5*T^mr0HFNsM&mn;A?;hIDoH z`G^#~N<_ote)GB6n*xY&Lu&A1G<2L*uNyYD^>BfvYAuAyPP3K|ahUC** zSnlY+!|z_6`o2I_RlNs-JHn&2a`DF`vX*#WG2yBGZH~bI2RT%Iz_xDrAl6=svD9Rl~OuNk5AatBA zZ(n=nc-ZPpOBdAYEe1L`muqsPhLl~0s(#K~{l%K-(Uo9u%6jDYqC~l|yKJGJ4)*WX zy|z3<&7;+F&-ZmB@(QNv3b<;c4zIGMB%i{>C8UoBLPy5Hg!8*B%~rE9?w5}_Q{G34 zrL_;Hol0YdY9Fu0A5;H*6zR*Cz6qL|7;A_c>5-_0q0E%yY$=R2Cj6h7R~^2?z
                  6=xg{_^nrfoKcMUX4OT^;XUYG9uK!bSe04IjFtiG#Xc-x~_2whKDN4#(
                  z*o3o7e0=l3-@g4Q0v!gApn2hINGc>mcMJ4{EkE(c?^DHmNtdGhlP@QR@XdR*v&(8&
                  zC93|$=E1i(y>CU^J_{R>6_9lfY2zV6rsDnA_ulkDSzKHI_EJ^5Ma2im~i1VfsOBc0{8t`~2{FfLwB6=|{w
                  z8J&yH3@)31hZ#{}HR_S{ka7o9S7W>G5wyga5T?)QE`Sj9O%enLpav?XH55U0M(9o7YNkxbT)EK|!g_K1p#K-X
                  z%sRo`##HV-$S+4MuTxB@JR>O@_Se(|AV+xn(rTP?=}(pqC?^uf!>;p#dhndqX@j>4
                  zs#+iVPC5Y-ytrZf)oqS7%+qD4V|R`sABU_&pAPH_SvMcajUbvjKFNp2IwQH8K{3{a
                  z3k#yO79*+u0JuA9uG~d9SJjYN>m%nBmW0S`1jI+dw3k%lq*eZr^XoHqsi@Ai
                  z<`kFN4(oH|rppa_c3nV3wxQzHi)X<_^C`QCcA>7c781&{=KEO_M
                  z@q2!8WK&SP^0~4tAq52&H99t1QfbgRVYxvQS9*TKK%8b_OH2BS)si8ta`{i{g;f;*
                  zh`?y>u>9ebuFFi$0AWfN<_19Hu}DcN>W0$qi(Jk_Mr?|31_!?ahxTL5Yag;<^AweN
                  z{08DMFrS*txOJBQ!y_sm;~>7RNI~Q-tQ$tdvxLSNKc4~9$Z;0tAee@kjkWx)8uXaY
                  zN5B5@KZi3>5Bnw`meL3`))1eb#xl2?jm?w-jJ=MW2{Y)jZ>)(ir5xvv8ouiEeh`!K
                  zyq}(X=>W93ETA5oNK
                  zbQeukSLFh+JgB{Y#Pw)$>*Jo>fEgKjac+s3>^jQ>6|b(t`e{03z99&@P~6xjFSODC_5yWi|e>bLvEEu+)0+W2eFsY9dR@i5_#WD}+}fCui67
                  zajRW$duz|IVILFdPywBJ`H?6gB1sI+^Y!cVNkfj-3thbg+LtepEplo86$h;EL(o%q
                  z)3iuLJ(A&|vb4PE;`=O(9B&P2Ois{jeWLLX7C5~a5)AlE7@&-3?ML32p-Oq@((mGFW+puha74}3A3L9A
                  zoc&~*E`&-2G7$ARAkJ;uIwRhyCv9yJQXUre=VR0MEuGD
                  zLfRUxLLW@n4hnm67mlpfSI*)t&;URf$|cC(&EZGL06DIWsLG+<{Pk>VU0
                  z+pP6=n*Wp_}#hko7&HCNb_>K4P(_?N{byy#FhB4l=NHTFxUFuv7AS$-+<
                  z#PG*1j}t2lgJa6c<~9r-NMObFlrT}CX$>%L4k)KU8i10iy<@cCJ~?>^@7yFd;N9`I
                  zjDjfs!UQkd)Dz4%T(v0yd>mxon45bvm#5{@zConH>9wb0NBQr+ldRX)&X`ASVUtfY
                  zvvKfz^$XC|S39B?1e&s-6>gKIK}d*B6QYh6`Ig;Cdv0n%fBaBCLH{y1iev?Fi#-5J
                  z8Z?ZL*2iQH{0>N?u0*+@KliLIa@^w5EP73S@<=NQK#ysT0T?qceo(xsLD6|e{a(&=
                  zbK*J>0^JIEUlWo)=Esk8&ln<*v(}_kI$+!xQ~`cgk3Ak*MYe(Yy}K!Cofc3N2uU8h
                  z>hLp>sgRYGM=L$nVXL@_X`vAhdGS`s|2xamZd9+;deOM<@;Bi(AKxFub)g1~Uue0_
                  z+E)X;spg@UM}Q%52vFXuHMSz{0Rm_Ti9gQlK8`6qEY(>EQNJmsW7X;t>c17zBiYPcPe(O{O+(Vu<5o@
                  z188}%K!g!ped>fAnEI18l1-0Acil*-YV5@qE({|=L&D|6fsW`TMHqJ~{eufHVoQZG
                  zoPcEVX9I$BJ{{=^mf+Ap$+cBoh#50vjUBzmgSOo%D~)!#(5;JqG_S5iRD0D`J80Nu4P{T%pi
                  zG+2P0E`Ie@*1&0NB0R1IT^0xKqOeuUuO|mHOm6Y<>*Suvl!^EJ*vt;YI0N$Grm8$-4WV2jl-^ErLxVEtEZak+U?375Z9A6iBQ0+{B-rKFxY}ow2;}rvsO3
                  z?N@t2q;}n4?Hz&gvoVgoZ;c$LT`9M=eD9?7)S9WsC6stSY!LOEHYpLYeV^BWRi%&7!Mc)$E=(MWl)oK$qZEI~SuR?Sw3-5e
                  zfkxwM-&CQDn-S_EZxIvGKBqk_N&%@9Oz{gg)5&hGv5-fA!*l~Pkb!6mqX6f{PDZyw#KdZ
                  z3xXmJV;DZz?_I|1ao+I8#|GuNR*+m8yM^-9OXK5!*8L&Kpvu6|rfoj1+7Dmc<(1D(
                  zJppAg*Jbc+t@XZbj_xGptN>}?{G@};S-r_Cn&;|eHjUKm7x{~OACeZ0tlF|;9Cjq*
                  znZ0xT`}71IcFt|_C{%Cl>XJ%Vj#t1QkpZW*_H=ynU^C8~Zd&(Pzc`EbY+F#DpXIg_
                  z8+ofVrTR8~Aja&aY*Qi2=bcd;iU+@dAG^7G=*?Rh!>lRl$`45Hogo~oC4fGGtk&-&
                  zi1kkJ$l_rfYd`n10AXogU>9PXWtQ~9G#ojtu>n=~rnb
                  zighCecdu$*aQfjOT&?|1qgQXaR~lKKQ01!Zk5`T$|G6q8Sz!XtHm}(#ttWW};XaHX
                  zd^HaDmP*O<0XppK;+=HZE)udOcYR=B>!TZVCp;zMvNI=En2TN%?k|Sy$vJ!e{Ez>Q
                  z^A@t3Tg%wYHi%y|Q~0pVMM3Eeaub2v&xHN-9S~1&+tvQlNZC@(PsV+d8R_v$-0P@JMo)D7wOSx--3cGE&4o|z6V;`$vv>lG;DQfAKab>tT*m(
                  zUmcB{-=Q-)ky@#mUt~wKXt`(O6wf{-=;-cNj_km-UC8LmFT99Lq=4iN2yfa<3nEOc
                  zB4c85_YQM|Am;@?6F>>Z$`j9R~$4IeiO>!?(_iK@K&se6h>
                  zq&%qYTFCo3OKz@mpc}u;UjTRtqNg@3a~E+e_VpdXmY`FoWwh&FWJ`URrm;_EHIoR9
                  zrjCZt7XvSUPHC3c4JbPuB$ZI>;=X04L0q`hOMR@|7m;Rwu^+=h{uSQd6h_B$kJI#M
                  zVQn-T)#cpwbm7SAj}a#iR-o0BO-z$&(+QLGSO1qu$ge1_Fsj@@_y
                  zf^fg=Y%21RKKNA4?^1@BFF#0XKx_RZ+m7!KNN{K_K$N`9&hMmw;dVi7N)B^Zz^r_L
                  zlwEp5bQ?p4IA>Z9)@0BL6bEu&$<{SVIo7`HHtY-cwlH&oUNh1wU@=YHOIzRUAKs9x{H*
                  zUQJ68qzQ+`=u;h{=98_o|6p=j
                  zldvFS@zj$NJOd%!av9@tppbpcq02l_;Z_u|$HU1#ynDs+aF_7syJm^F66pVe*b+$;
                  zD=mlri(wb+5!C-b?7d}F)NQyoiYTBUprRs32olm#A}s>aA<{8}(%nNd7>Lq2bST|Q
                  zHz?BG-6b&$3^@#O?s=ZQ&)IvQb9&%Mr!0vw}9nfAwoE$1!C1ypKB#tLo>))7}tocWU0#r(m8z=9*Tq
                  zEyS>q=Igf>@}=ED_45Fp1?NwR{q6KII%)qSH*8|FViD^k&tci0>a8t_1h)4cY+fT*
                  zYgR>4IgW*Oy`{X)OW}b~tw??Swr2BFlQ4Si;>PdUIm6lAEXoPGB+RHZ7Xal~!leJb
                  zZuSfIrBDtv*Z{<&{5U+MqKcpFPk;}i{Htq@IZc*08uQkD2l&)#_zE}DA2SoI`-yhQ
                  z+ev7clsvW)orG|FoK$Rt$(Xji_bf`>0lxSxkT~%O*~sZ_9vgc}umlDa1c`rnM
                  z=$YL;am`_9Xumn4xE*D3IsKdDmFM0@TV2qhi(f|jT_xEvjb!%fA$LqHlIEd96FMj@{`9toQ#&B@_S*#>E?c!o)VY&
                  z+C8?G1J|++b`2k^hH%4{K)yvYiCSTgcs#5-k&v<=P{F-u{?db(2v#n~jEo=dh0g{d
                  zo@iMmSno4-Gm4?t2ghwYFNe}apFDYG^mLW+NsFtU@=dJ);;Pzts;IWVQFmC|t9EFf
                  z?AwntOBdA@-{&d%{rj30drhvZ7~_)Xm-TNmTtv<@Z_K3wx-xPsS2_2~H4tAFQzGI<
                  zvgyVYEu+e~GcWfKlZqE(*8);K!WM5^y)Qfnm4FY*#y;fHuQ>SAzkhZ(pLE`>=Q|ZL
                  zGZi^yW2A~jH{st(>xF1+j>6ih3ICs3}=WDG1QMH|1~Ut!rgPk$CXj_FoOZcmK56b?7Um8S>!I2g=V
                  zV~-wcg2Iw2J;zh>!2s+AW#_v6lWH};NWG#yOn=}63>L9Y-uB_^2VHvkQ8;ON>iyfO
                  zB800VXp0jjIoV(__=e@2IwpQS)Ozqi5
                  z?v#;^G(LEjT*W4w13VRNaW;hvOhD7!HlC)mZpYJKRqr&pZM;^#dv+V2YPdXuz0@xY
                  z9T?Dc+t;u+v2aU`;dUqGskf@hvbUZs(1xw5zW8T3xj8e;udi?YY@kb>!hb|9u<`O)
                  zBh{?7q&78+A~`R^H>Z5W#E*jt&5k0XCu;jjk6fAN!q!UYzR0`5ReJXZ^@f8jUpeJw)HPPIfJ^
                  ztXBO@4z*V2k+dgjEWS*>i-95F6;pz_j!bV!2G&^W}avi5i5D{5CIZxq!$i4SRdZMTZjIUwHjq{zSyVx&4C$>ZquaYe+Sb{sYiU!3P<8Ls>3Kwy`Jcmjuyo3hA~?
                  zx!_`Rv#5YvBFBKO
                  z+m`0Fk3=z2B|EKU$?)FIVlXF5dDfSoiSn;F_5*)WYm}#wiFe+U0m`;$4dbZZ7HO|f
                  z`gOb!Tra@s$Ps!WQt+Pr+O6AW*`Pl_YXK>0oOAKkaj5(Kf%(&&I*NS9
                  z^TqVilZ9p9eD}w+8$nv!mRC{kq&D)zh-lU^jeg6HAc4|+opxz)o0mfHnm5mPTf{q(
                  z#)*;o-dR}D8er}hqM!0vO@FVmqDM_S)!oFRvw$
                  zjEorhp4fqpXECF(LP1BaBuGn3J5PK5ch71QQBhTOwehqx|1?aj?8Q`zWmPS|v&GFCWod0MZ>m~6%>k3e(E>o&Sl$UwNj}R(6
                  zehSR1SP{fn^bUA$3Z3^dO?TP)_SKryw
                  z#0Ogp|33vZfb~ixifZ~tJbFTu;7ozbQT%5@;(v5p|G(rXoZqjkXd2eskIfiXR!~SX
                  z-+bevX{71O`0}L*hKT8V4)?B?z#R(AwhGQa>u<)9X2Hb=`JCy>+RFc$u?P;68WgvJW)WT!MI&3iaYFh=o%;rr^UVmm@ylql
                  zDfa~gY*59+)MM{m7})GH2`=#6V!M3a=q}HuKS+YU0?ur_#MVthzxXQDBHQgq-fsLkR585w(!CwxPJ6+K-*xoh`
                  z*qP!LHJ`cd#{D%|?G>ifb8iqg(qy=g#H5{GI*x1(*ZYiXPXMg^+bcnxv!~|*VV3Pq
                  z{C4_jKDt*}ta2W>*++f&RrY0)IcW
                  zx5;nz40L-C0IS`)DO`P>Pw(Ph0e690BB|p+-&B?1
                  zDFOr326J?7_zu{2fb`HgPtD&b7$apa;nY9TAIA;9qJb&W@uv&t;kNqm(?a
                  zx>hy_@fUCxS!
                  zy`|hIvzc1^cpS!aZ}ClrS+<*=947TemS*{yIbLcw9~oAQ4Zn>{SYKafW7Bx9@Pf=?
                  z-?8e*9nT>B0MKbwcogw0-e#H_$n;tZ_=#fuzMCefUs+h1f!Jn_OnV%q`rBfAD
                  zcka`1mB2WkNJ!X^5&S+(>b$kZxYQC}rH~UxEMLVPVAf+HYI+v_6FF8Io0Bz5qGZ}z
                  z%g=(j?IZD01ZHHvW+snf=<8!+a$!*`YqHX)>zpiGL^ttHJM_29pu%6
                  zbNLjk(pmimHq0(-F=_{Z|B3ov7B)8*uz15ny__M>N`4C8U@vN!sop4D>DzdW3ZG#I
                  z!!Vz+z7%BF61KYN!KdOaEIdO+BZn}n_(OHxxA{w)K5nmlDyqm)EVHvKiY_$ol<+E<
                  zF+yIRH9br$j7{W6RTs{CXe-9bJEWCVpt+{GqS6}k7zFdp*63-fl>);JpHVF@Ydbz)
                  zX;2v|GuTGeN*TfPpzYA33zyd#UJ$`aXs@*poINlBl{6?l#%;wyN7r}c7V6Vfe5WaF(CC4PBu^t6F*1>iK&%IPD8>IgQniah}G<9}>CwJxX^$_y#DrSq11WHT0|QTkf|<7{iTuRk3nsFbLm_IPh#
                  zH#{$pNt#d%KtNYcp7IP(?WY3AU1be
                  zj^@4x3@a9W{wcT}%W?WOE-tvDar@}zY4NPk)*1)mnBSfGz+(
                  zw%QjHHepI_H|ehJ;O#P@kDLUn?4sY1OlfV7*gJEvKWizsaQM>cTG!S&;hh!Iu-f2$
                  zDI5J&%~sql70SdgR*8CM8QuilVWDtvS(z{!{#IyF_4^vKSzNz#JBH@DYp1DKAUXGA
                  zr2hJ|;lpBss<{HDq^7DGn{4;xayp3}6rcS-vECw#hdXj%!I2HZ+3@KzBzSyKa0ew4
                  z8=lm_$#PUtATw(Thaqbo!TX*wF2g5m($bjUC=M@5FnAvY$TwZtTA6*Ww|THJgM9ou
                  zQ*qU6I(_!O^44tKr)1%W_Fec71=F^kiZ|WUoSx{q?og>Wjyj!}K?POX#VR$@fq39e
                  zEAvZK=V96jit#<}<_uarGaZ{T0bA8OKW`NdK0T@KKuL~8Dc(C<;>ww1XoyXUXCW=?
                  zbRYZrO0Mt$U;2SK98t~c?snl*eUnyKagM59%38CRbG7>vO-?qG6$kC$acFuiHs{*l
                  zc$c!-Fv8vi+wh-RfMfw$Rh5OERrZQ}3xrgQ&{Ww;95<9d
                  zMJ4*N3bp&2qo@-fp{);pocz8nZDhT;5E$C(6&xy3`gZxpJq)+La5hwkulEz8z2*hc
                  zk!~-Csnw7RS*)xEgh-eK4W!RiwHI+LG+d)7=R0_83x|Jz3OkG6PbujIfOO%8uQ&eg02A0@#kfg*ZB4#Lh
                  zo`}?j(ixE?O&w$&coh9O@GuFzi8U^(N5Av4n(FvT>NlHs>6IqPw*)s>4OmC(rR8KM
                  z6boKVY_q+8hcHQIe+*{Vkl+MXAze|9O
                  zAiyJ+Hdc?P`T%R&&LCSZ_}EN~cdOmsk9oV_h2TU!I0xT!AK^mt0FOL0tfCk$rYIMy
                  z*TDVdD*C~9@I@~OL}Ac~GmM7IBRsMC=Gktoe4Sq9Y3T(rJo#dJKa3n1O}%BC1reS<
                  zI4qsin{0Z-dugGL9=1c2b+rIqGn`Totoso@f_^0-Gz}{E`>YuW_FW37@m_!CaOJ;^ITv26Rg;4qy$(g7HzAd5DSdmbR*?kLeQ`vv63Ec{IIO>Qv
                  z7Mg?}Km4Ie9Gl3fR%P(Wg_1@H>$Wh!-1r=PJv=;eon6fJ$x3luLehDr@sjq59QbZi
                  zk@@LfblCfo5(@GT49RUi^BJHahiO#>*j`Wi!w2mc)R3hHO&{-sco|WDP0oacoZ5_ZZ#8S
                  z2w#sQkxxPh(`IjYxqfNCx#0ly;&bkSc}^2|)wyw-LUL4=?fFiuFc1Si$YMsXPIR&4hHXt%
                  zJQ#j`n6TI9xt%r9{PDy>`%*c=Vu(3*;gfQ+BX7(wzv24}e!fbxzd|B9J
                  z4ssek81f}LW+ZR6Cn7?mv@Zp{e;DCx#@Ds5n4}!2mt`hhshal%Fdsa;=BxLec{R*?
                  z#aZZYa&0{|Qo=z+(^rX9BTbnJ+J!TkfoA0`e|M#_%+_~E&{%q+)w01@=N-aM;ltO1FQ;rt4fL)t?PDE{P+LkW5Gd_KyJTsdTJ=*zqN9*yb&}ycG>Ru
                  zXg3}nKJIwSGSHv3n3mBI`~=fgv33QoT)H_UpqbXc_YOmA0BgSn*%jn1@UQ>(>;I=S
                  z5H8G0cE$gp^^6CeS`_n`302^g=IG`CX}m|O3li}y{;bM3-;3gbM_ny*Q;S3Kko}(U
                  zEssJjqo4YS62tEII9RZ7gKVZK-BfcRd6Qs<;FjdV6`Ka^
                  z%Rj@zdLVnif;!+}vl^~Wz<>}#*TC(h)k7T;rTrY|iE+E6xr#SZR+C~D-?6*r{g?5+
                  z&wWKShq4bNj_h0vw%D1txqo^_m$ac`JBP_9d#
                  zJiAKf#|8S+%Cb``K}T8A;2Xb7UYMWhiW_EoYnBgL(sJj4hgPZCKEgVdUvIkqv5|L?
                  zqANU*>V@=&cO8tI8Tk4vmsHAMb4IwLo4u`PM?&3!D4)2SR!kLO93ujJb0hsX9;
                  z6fI+Xo@N%B_V3tn8#bQ6s+2FWU-Z&cmJ$1=J#zPe#xb(y_Wmpnv-Hmu78A1>Bk26Y
                  zMr3xJJr>nF->ppY1Al^e)o1mkd}e3cF|ujw8WMgE
                  z(Y%y!cC(*KE>m_GZ?Y7b{7F~J5A$4VzbGv2dThAlEQ3v)Km!fNBDbA+{S`^hbPm70tKmNXKm!TW!dUV_>Xtl{O*&rkXv$JNF
                  zm@7WA8_z{d`oN}VudOEkR#1%Xc$B4NzMym!FZ{VRxP2qR>d)f@1t
                  zq$u9Po=h8UGljy(#qEo^uYHm(EQa+OwThdXdmpC@_3D{+Lrl)A#~R5W)V^*!gN1L;
                  z_)4+(#7Q?|t)Snx$ZytKTW?Z)|K+Wod}u=mp9nPQ*)Ovw+E9JhWn~{XsMDk-@z?Rn
                  zEraD98wu}?C@RdIf3MtWeS;ymN-|6P4MxnIVqLCFt}ZV17>_-T%uKY?&A%0u4N%n5
                  z(6?m`%+Y>+6l1`!T@`8>$r4w1$h0!FYI7%IcJ`w7_4zjXu$uj7JPlrE0Qp<4d}MFu
                  zJ8c*8Kwq1BtQ)aV$pZ;lP{PAgd!T5BCl<-By~|H4-tzl9MKZM7Sby)pF*1uowLPiI
                  zV}mVFHSHNV)iFCp#0uDFo>4P?m{KY;Y@e~PH}}ljTF8?^Lt2k%+gf|Q&OuPC#KRZLiI?Gvh^rvtj|
                  zp&{GGP)+xn&{EcuMgUo!k{3emK?cq@&N_
                  zP!Ko1NS`Fo!wn59Vtn{4C65XyIj^_C77dM&&5u?u=zJu8hm=N1
                  zq%X8nR6wASg=&HPTW3L5VZYc
                  zxy9Rd)IitO|FAjQ9|%FLsf0Z@NJA|%OtQ9~uagH6_P9S3*xC&}=KHkV&`6KB`!^jh
                  z=>G&6|B%rC20Q+j@9fgUw*TDw8dU2C9rrww$(4Bpfg59KZaW#Nrq-Um2v^e8EvFHN
                  z$%0m}WhHz(wWpMz9?As}u0nn4MgZ@nUiZv@ZhTxC
                  z;_=KOO3GUUWV_7(ZAKrjcrC>a$-+>ikv9OXZa1mwo@sih&_^?;P`n)750me=56FVg
                  zPb`;Nt3+hVuQiN#xt%dbm*jXhdfBC)S=)))FF>j)n@r```{F3@06JL6ZZfA6oZJvM
                  z&{s+vu{TdNPcP8wWTJe@i0mdH{M=bJkBX(O>r*OYxq{Zu`EcY}2h@}Prb)Zf_Iq9C
                  zF+$#y6b>a5Jr#%opNm6oVc1!aY44I*X-{HG7zbd@66elwF+9<)0UuX#g{BmK5r6vE
                  zT(4__2c}qLt+#UANn|!WW}K%ZT5#amVEN&F1EO5{EqJGq0_^Z_ohbiFh8Mp
                  z-Ls-y(Q~!JtkeT$!Vgt?D^Ygj3oIOkxG|$zH#Vl#LSMrg5qYqDKaLzP?*4JxAXB9~
                  z`Hq*MVzR@v9U?NLC|M;{#c%jlt6Qie`D(Xs110WG`w+Licb_s<)
                  zv29%I3I5&#)67M9;+i6^hSU$Y4WwYLiSUGV+SFcFi1t&Fi*{eK>4A_-juNh_4~s9@
                  z45p4Nv0lK@0?HH8eBok}+p~5SzcYUDjlLlHQ>pFDyuhUf)Spgus{z+Ax5bE|YYSgJ
                  zkC7TI@{-m@rnv|tWykxEaVtonpd^0`Sao_@zY=11==#>;308IyF>FSra~~*59Xr|f
                  z8>Pqi8s_ymF0rO{V463Na480dKvZTM62;DcfU#=YhK9*Z(q80c+(v56p~{ydO=R8r
                  zTfbiv=~0^cwgqU^ncsI=e0td5GSseLRqM>$MSLRE-Ce>R7u7nPL=r)kg6L{Ir^LLw
                  z+U$#~ua7~4WPwJO#u`&x657CyErKUhJl?Qsv2dhhnFohAAwVQ?>0ja9FEq*l>7de~=U>_-QcW=9;CL1hXJ;IC4x
                  zV!I`vJap6oNgU_%oNv2q?d7g|tEpKC+Z*{@BZS00mMiHfv?5g|Y;u;B)T=#vu;rJldyBiRo{gF-t=^5H!c}$aOZJGic>>@@03|QX#HyHs&{tq^B(Ue#*)Z
                  zWuTx(RX~9uNpm#VKCQy|I0JREkCgOyJyq3d2Tz%uHxQdKTIq=FURsYsx1Bn0m$+Xo
                  zHVR%0CdJk8RDpY4n66_rX^p29LS0X1fAmEJ@_F
                  zn`haE$s5}_$>X*$BuFKZ8&c2j@$roJ@JF6(Q_4IGZG>2jhQhBiE7RjtlC`F-IH4w<
                  z_Q_7RJ!6qqcP?kv9zbd*$6o{v+zkJ6Cr#7-t8M#N9znbri;?Q99!!?az8h%4jWO?v
                  z&gat~TA+UO4kF1cS$fel=+1Rf=D*6e*#_M&U3C>kbNyh$P9x7!Yhi68+x5NtMb6zL
                  z^VUgsqQ>WSUFIbX5It)5Suuc3-@MQ@{vBG=?ofO6k{etWhQ-L;0Ft{uvm-RO%h
                  zPZHdp+Hf64xE#CD4`;&S9?NkvCo(&zk3;>Ecf)-z+$E9GfGM%stUSbPK9|DX+ft&s
                  z-0_q0wa0o~3C^mwnnF?mm3Rp_0tY=QPuvQ&&YjKlb2z6intXT=eHJirTxlKoCh=Jx
                  zH_kv`TFpsR{RYhpL^<5)XHUF_nzQLK@9;48()J>W_haCOVV$G437Zxp?1AF!yj9b;-(lrWdvo)CO-#_VPZ&|99H#VXc#EN{~
                  zojlL%pKsD$rS;>DPFue^{n`Bd@ZGOxA!|hkC1sF`Fq1IbIrI~qmYWZGr@TUb`j!Nu
                  z_X&5I9xanCM7juF0cW7?`*PF#Mt%GHuxI<}Ryo7dd%b@O1eITFU>sUWYg-D7pQT19Wu6(lId=h*Rz
                  z>?Yo$$&Tu)&C&w}2DbypL$|Qql0@82#{WwBPloo!-FF&s)~fZz1jT>o`={1tbb4hw
                  zAu(*RQha9UC4W4;s8FDsd3eVa%U<0|%
                  zOtwHAa9{J3`QwJ!$??@_EaV{~#EY;6U#VI8smal6&y7*DC}8B?kf3L14a$x#X&+r{
                  z#`~v;zvf%SCbA6siTus?@T&fjRzgHX@UJ1k=ze?`kbxxdd#X8b&&)eu^0LI07}k|+
                  zi2;qjL+{%`zA#$d#iCT@5C{3%?G|Asq)!IL8rmqq=^j(*rt+G9x0DSuG;-JPiL$t{6
                  z#^XWly*;N$Fi5In=w8ms>|&DXa?qO39^S(37vSMCF#*8~l}FS0vi_XOv$}0?$SAS7
                  zxLF4_=`!{lw;*rNx-{=Z;b=|c@`rdHOu)R_)x9o4!HpuDeo~er7-6l&H)odBslWk)G0-Op3HpPV7qr@0*=JQDW;fem$Y7q^i{BmrA#1mBQr=
                  z079BoP7^~$D5v^O#LSf2rVek=arTE$RR#ND=7n1tWA}Gm#7zatBB%#)Mlg8PG
                  zHyT)Yc^P}BxFc4zBc>N8eKb0VPb4o~m-~`@#vO!tz`u#Yg18t=nAYR))q>G-|pH)rLl%PaHdjK+o^BdFvlVMbfORL0(yH7Sg)(zXSv%trCRg`tv
                  z(9&+Lz*AgbNYK?80c(*{uPn2E`5ZNz5#MlM!i`&o_vUz}a*qT(uj0q+@dkOr_FGb7y
                  zZQvziB~a4fDBsIZ@~gy+Xg7A9$)Ef6BgF}VgGl6ro0N~Qc$QPkcGS?YEVWQaU)&ws
                  zTJuPP-hnbOD*n%N(RrWLDPnoS;G&~#(#Y6?tITSV3S`}KGBVu|4u39<=P5U)?3M`o
                  z_}6I!Cs%>dFrzi#x8-MbUu?6@Z_?G%H;YEtS>edmD#di5xV(qi*UMel%4oo_{w`a^
                  z!#?Nu5@wmNkeT`_g~s!@X>8$OjeooIN`{p;S7o?OcmBDyY>CiQsvg>cwP0zgF06T
                  zMQ8lt#pNCoSJMsB1{U$t;z%BeJfCSZppZRDs!A=BP*U0Y&^D?(U7a6L^GIG^xu-Yy
                  zQ%W6oM-FtGkMeqDUs)Ernws;a>#WlHGv0Ri>?uF`S8kDZGd;635n`?T1|Inh;2P7B
                  z;FfJdxAUy?;NaDXuN+4k9NGkmY8(?PU2jOsx_gA%O=myzA6X?;CP#k^PB3k{
                  zcaulgX9zF`3gjp2;mo&W07I37izG`eDSrGuWb48QE5>J{=)1L_i~#Plq9awqG7fl~
                  z=XQcwC~U$m9!Y(9TI^;~xL`>8hw;9Q{rjm;``;K`IR{QWQv*MdlI|`=QkjReDhn%Z-LEm7p{!$)dq2+%
                  zGGY8I-XFa{++$aUVr0EHdWt46^IBT?kFZ&v&cxAf*EKg7ENX*d3!Qb%Kd|G!dN?>Z
                  z6Mhi3IS~5Z;&)Fjn>)XDEyCOKR^fZ+m;0`@Mb}oHzW=JYSe-CX`dSPP2Y%_x-qx@p
                  zmh+Xo0+y4;=w%Co@FW{z{*aXn+leoOV-1w!tNR%ll@N
                  z3voz`)IUt3v(jf(e;<4XfOI+)rB9losbWgP*T5V9`}P0j8K7hTpGM7l*!2@i(i$j-
                  z^P(>P7nk2OJ#U*SSUxwWz^()BXICa4Qt@50L?iO*`}V1!dj)2|fTOuS#jx%^zx5sk!2q1ze$jFr6CkCSz|#5_8#KHiYN1jtY?2!+7+-{Zf4d828K7c^sw{Z(G=KHK
                  zodXXm$Xgf#Xs73i8C`WgIJp;y!DU-V<~Mb_ljG(bN@6uyhr2H&o;ajQ+Ws+T(-ZqB
                  z^XgSM<@}Chim%QGwTeDq~t5JJAZ#hS#^2NEhP-en)gVsyCwBRO0tf|f>=rXA<*zGRaJQ;;&ed##xh$a(Q81t|1H76
                  z*GY>MO+Kt=B88_RkdO6Psnu{4We@+jzj2D0M?9@x43v(-azBwc&4T1kiTPfxfb&eB
                  zX5y!?Z808@IX0u>=uoda`V=4hwT-k?>GQ$QE3Igdtr`9VU#a6MNEq+yoADr6+B{sN
                  zPT;?+cDrr(%dkF8n8F+%Gni%{=O9^P{h{MoKUdW8=a@(kLx|vrE9oT4s8p<|qDfS
                  z?X)%iF{E`R^unffx?2kZFN#Qj13NK{uEEwJ(6*e^7eHdPet&EfN3&dQ{hevZrbLSP
                  zLl(g2SAO`sKeOtE3)u;C02fSrs)FQ!RAzPXq$^M5-
                  zd0S(gjjBm@DccUL-p?HJAc8LS8;PDabFfCAXSJoBj(Gr&bU)j=HeZVAjaH3(X+`1F
                  z#HBP=r1X~RscS|Lw%~n>*kvJP?VCWlyp>T5QzhL(lk!JoNz?peQK3r2jIasMpR1+b
                  zN;P~`DvpJx`ci+>-4zoajjvVFTPp@o!xMt-dT$jNj$sc!cn*z7uL(6;%*zV9uAr}C
                  zkcT@E%{f2!1_ky%4br)NsU&fNTOV+;{n5>GKNiybjPJ$MaovfN-Hi^d!CBFaX4#2&
                  z2A-aEEVc6`O+WR)Aki7qCc6WBbL_L9?l<@_o2jx7`LmZ1Rc^;qoLQktg
                  zk{brUr7$Pevquy6I?~!CpwTo%`q$*KlyUK&xxMNKYE9PFi9HS$(R;_Y
                  zfoY}1VFAYX&YG9_Dk9l`hwXuvlfy2f}8R1o}kcIGB7KbBtb40_u
                  zzy#95ZYzc1;c~B1TAvXRGGih$syYGi6X_|Ny-}@YX&LieRP<|-fi0sH|4CJ)5upD-
                  z1~2K@X<*1cVEtJs$g5vU;qF_h5%&l5!&5oXFI9F|4IRDth_Qmxdwy@sz)_z){HrZJ
                  zc2mU&N(WB~p+1l4+Z7;|no^beAUq+%_wF7Xgt}oxrRyzhc6n5G-D=b#Z
                  zD^jZc&Kt8ky;yl8WN392pUnNBoU4qWg+65J
                  zUDtu@yB~y7aHYPJ9A$5);-l6w$2i
                  z?82~ZzJH!bpTcN0U5|1Z8ABn~gijuxbsbsV<4Y<{uEIx0)yJU}@hapwK~-KyEHYR@?kAEYT&
                  z6D~fPCHMypX?xUlZ8R5r?K`fVx>3Z{;G1m85X4n32uv{*RXxJQkZOH*
                  z`j@8Yh_!K{0vR%XYOnR|=y<(r^>MJdU{Do&s)U6PU28}h%=h)9XyoHS_YYgj%D?cf
                  zP?nzeXlS@)NpifwJrdJ}=dlC?ioTH4?`B+I^Nb1RgAvIgLPm1&gCQP$1|q4OopvkO
                  z)s+S*vz=}UYZc4A?;B=a2QAsk*}cOxJzs9SE6($q8e35b_+-e)LD%W&tFKN88;ZSPdO>KeLHB%!v&nG1g8z+>%hQZvSHGGUrHWqVE|!~`_Ix&dKjn7j
                  zHRKkD>S)wvA7DP?a={ddW`LCEg50A1GkXb(v|{P73U8;co^u5TuQ4ubw=qt?{jfeo
                  zZ&5;yDfN?JJHsjW(Qm$xEg6*e{Lvemb@+u{6IIr$wE3b+E|;%Kb-|pvu2FEG1u_Bq
                  zh~5xe^cjZ|^NG)=glwv#1Z`uHlLnRS9c*Z->}qJ$c;Xb8R4%y_U9%sqbo`uF+pZjW
                  za?*l63R`#o4nf+Y+smb$S9G^&#c91@2i3G1C91zy84?G_(|u;*>b8ers2h3#X
                  zUdigfFPD_EX>!x8_}sg$%c@T4!Z$jUu?=|%+ZK5zTkNlS^o?cN`h12la9m%~XReU;Sg6<;S6nUlhsyyclZ|K4slP%~#cCrM5vZAusWO#EaevdvP`-Zwno@dB
                  zR*&Bdw@nt|)%oA$5gH9qE5?3b^^Eo_j{fUiZg12cKknrl%kZ&|iV;j8&NG*sHB3>t
                  zkxmvoo$FU=iVTDexGNl{w3Gw>Z_BsuC6-+HD#vOIWBx_Icf=;g`}`pl3&S4zPJ-ZZ
                  zwN)H9Bq&6vaHR-PUgOW-lh+epzI@5p8WVJosp9M{kw^>h1Rt0
                  zhDZJXC4@W6SO)Hl#17a11K~IEH6xnO%;ke5m&4kQ+wTalm5bW+cN?A$^d$r4eWZ$Z
                  zS1dc6x}s%veC+ioV|rre=0w!(a_J)wDWtUp;_k&80b{kzOmw>1Z#+8R#F|mLcjebm
                  z5PZ$^tBxXkTJJtL8BATsO@g$`mvM2z7X2}F`c-TEBcgB|3teCsZbIjgFQ___KLFh1
                  z-`L^*(*Fma{69a_oUyQ7<5=U0nesKV0QvD6j}2-fN)UE;T)c(nVaR3ZtOx=%Rk(B&
                  z2zMw&zTC)M4#s3@5J+y!I)uh>$G-M*=WzzYGkn0SGjdjr@PK3S>G{V?yJ%S@HI|dq
                  zJF>&w?eqxvllI4)ocf97iL6jxeOdIHDs#7X@_p!hjK)*AHUA|L4Xp-z!f+_ZmwGpM
                  zx?WJXEoAy17S$iat?>v-?OADOkHhi_@XZ6QEum^zP?EVKBL_7~We7Jw=qQFOWe{v+
                  z+qZu!PBl?$+N$gBg&+-7Bf`rX20*%n*RbYh(LfOARr=|rT(jYs8Pk<
                  zYEYoLr)1Wn^1PwO{(hTz>KXa8Y2`zpyq=g*MSWUWU)GQsmIY
                  zn6wwmuk}DQ^6E>#AbNF;Ovfl4h=DzPUaqBEAwh#`1uQR}W3<1>wt9fn+yLca2LNhH
                  z!fvKLHdFn*0NOe{w)Ap=IdJujS8YcK+o5THWAIQzKRbW#{?v*)&K$#e(=jilZa#`aDh#;e>|H
                  zbA0^l5CdX;ajze<%m0nF;alyOM(^yZlv-+M1lICQebFgiut|j<4@*QN;n>inH8&vp
                  zlG{ld8l|iRSnMl$Z85f8yFI@XnIFqP`O($Ff_I~fF;2d)Gab1NdbaG~B`uit$f_djs+fCn5LJ^?w;&-?v)ou`K?
                  z<24<)gvkQL*=}g~@WQ}F-ln_2FIYDm8h11=?On8p*8m^S_9PVB?W*ian9=K9(n|qD
                  z^T@pg)Xm~=2l>IDOzCOP0Zo*HM-HTG_w}U7JF6*6Q>ZquajC+cBa)vISbQ&%$0kXP
                  z9HM(`qRdKmPubzI%ewWvErvh}i=ijPF^5m~78qr&?f34@fbUN-frbXIY6xtGOy#lR
                  zSF6Qu#Iw-^B65=QxNWhecrtmY&f%Frma?#rZP9@MkBKy>bSPKsCo#VXH&~e7cKiKH
                  zpq}o0N)4t0zr)2r^*2VFs11M&m*l@YD}KKW>HsTp(Tui_+?5h2^*FZCwT+CGkF4*m
                  zXyPQ0L?7UDc8uh@-GC8Ht8_&pCw`M&MDM3n`UJ)lTWrT8AhkbGHXZTLmAM;rFYwpi
                  zgdI+G+F5oNGy>T*Fazq=%dO`9rjHcLd|dmJ549tQOo%%snpYfr)B0zh361nVWCIeh
                  zgLR;?=`?2@>EIs@uM6Z2+S~Z&GdRUZb_8vS<))`$UiWLoZE{PNRd&SYe~*ZfWUQxQ
                  zTw1tRdzXN4`l<{<(OhtaO5ge=U-VEfp;Pw=e%0l%kH+!?i=>^TDlj;Y@ZCI0YtMW)
                  zdSnwU{r&JyQjiXtJuzPW2v|5m36z=MDRKpn)8XHNk{I0UqOm-hDN&M9Z!HHwC{KSG
                  z)wG1*Cfam|wfC9iK#t~`S7Z^hyJ-!>1sUEs?lIFqzNqzfdJc}Ur=Mi6ssZR2~Ao8Au6
                  z=3|XpB0jKZT#FMq-vjCn^ng;pK0TTXYvcyBAxFy>>M(TEe3%}fQWW{Bz7hev=c#gK
                  zaCNxKkR&C5Foh$PXNa2lb~b&}<3IRw{k{W1P$0s-OdkcSx_#<`RV=V&nCQ3fE5=M@
                  z@&H5PCb?5Y58Da{Dn-ySTfhr!cf=D(tbRO%PtDnpyK@QF_liA{r+&|
                  zoVQvRUhrJ%@_J=Je^3{Iy=bAZ!=3sRWBs)of$RHLt{76WmdXeQa;bq-{-Glfx6@;pX#e?iDOMlv5x&a>+8(=_5>~3pEn9dwwoM39EQvY3opAR|ir#7?QVGu{tS@u$f^|SkR
                  zXj#xmGcmg6J&3c;DV*tDFiZ|oW8ZJs@ZPIiB{RKA@)K?UmR(LEY^jJ7{s!*Q(Dl1F
                  zCA@@h-8Lpm?$htA&i(f<3mA8v3o38V8gRJHYR6x@J8=$kILdF0S*s39oX7{h+~Aho
                  z(PdRXYnqK3gTH2`tf$Mwg@U!G1D9pIsuC3Lx81C0T(@(Dhe<0c%6CkIC{A%^*k9M^
                  z$(7D=BBY=B$uwE6Pd{LCoxK>OCF{7{O=WNh0`I|D56w%yhjkcCs$+
                  zIchH)03-1|i_H(>1oS(}0pR5B>JER?kMnp`JKLl$Q4iIl9(qv(YUSJxmLek&y(xIS
                  z{Aya_^d32--E`E67n*zE^D49nXFAvW&PMW8hts<>qhC{_k-E2_Qch2N;N@k#XYNWr
                  z8Wycf|E1`X8jss4E*vbm=I3V#qdCo4ZrRp*xQSS&{iO~uKnOv?>2d7}xLGs=U0llk
                  z7nZZRg7U8h8;d$vOER=seM@jvmY0Ug#I*x=(4jtP?3C2}?vTY*#qKqJrdQgT2B#)x
                  z0J#nq=eX)V6qqC;o|Zeho+0&zK}ij(uW+Y6|6P|saS3kJ*L)dk>35UWozTShd(>Dm
                  z+e`G%jlah1aFZ1m2RpxoW}@VFW8|Eg0y>cZ@8r9`K#GEo*yHrSLRaWs;{$RQJ_<6IEg5`OYXZxt+63oIfO5Gsbk^oW?@juQEc3u3h!1N
                  z@$~o;8z<=cwtfKl{q+6E{ER=>!yJ9Rp3@y1{-&qG&jS;()sS0($2hv7bfBG<<{e&Hm=Y2m
                  z9Geh(bt^K!3`ovw2ZhMfH*r^8^1eb41O_}l;j&UW=bEfoNb77`O(Vf@%*hW
                  za@YR5v{lWZI?K>=!f6Y;M!xbwza_Nkk_*a9wSt)u>Ods@EO*T|V756EjDa1tk?lU-
                  z)c>yMdOXNvphkbcM6Y31+V9$xD=`bc((eQ239-c4&4eR4JXS7l-ZCH*CAbXwxUE7a
                  zA-|3a1|u=8sC$eFYLS3Wl6r8i$qChV*5)Fo~JT=650<9g9XAVVxCxmOA>$
                  zVFSnc&U2?a@s=}q!pS?5=p)DMhd|zxWzCYX{wT9?$`)*t=avvXabE%mDjM?w2Hurg
                  z>7*)g&KY=Kai1&f5ER|EIvrT#LKSDZwu^PvV$kY$`WcF&f`ih>bboX
                  zp10TDkZvAo{h2j`)jFkv_(PNY!{{}XWl(BNK={l5CZZofcjthX;V&+yx+te4qQYFW
                  zq5rIEp3MgD(AndbTi@g~OAd2=Y@&FNdSV4qf91;v79Yl}fZO)MwY`lhYVWfVtD;!{
                  zpsd|do6KwH7XDhvlD$$vRi(bqm3X~}PW;t&wyHW9e9CJ2NJE;1<(%CS3vikc<>;f`
                  zavgqCzGZ@)utM#S);L2x+0t)=GuhI`772)xYQ;_TP$x9o`zF;i%btB<o*2)7rW(M(ryBqQ>+|Ul|2n
                  zul!#%8(ZiAg?AoPvcR|z3y9Msh;u*%Te@$Uc925#K2mPJ=H46d7pqsNPIz|#%FXY*
                  z^E~Bk?umm6@2e?)K2a_vch{jx@k+cnV3I(r-P%{I-t{?eCS;Cxo=K)1cH#=y`T-E<
                  zF2ujWygjNoxp=E#xV8-FEr6Tg>qha9IY3Giub=@cU+;Pw{@6J~Q^*L2SsLtiQfV^#
                  zTI1nYR+|rw`na#1{6-i$3(^M5$hc;)9%J%6D`D{#jXeB;Y&gQU?}Ie_rM!`$qp1rJ
                  zecv%p0x@XIR>tv=XbrcHXz;WgvoQKqNueTNdrkFLmBfupE&`kUj%QS;2d~C0^yQXL
                  z#DyIFDx}c5y|lYeFWn1|bG#Hpz%QJ}cFEFrb$)8X-@b823DR)&%`SFq@$`f05BjW&fIu&2(++y4cz>OfH))G4
                  zsa$^#a9thunE!Od?wQ1;4KXIi4{~%+h*pQ;MyGKEV?_Q!oo6VGjIqqaPiBE0!2kz!~KtZEJzrs+CU1mUlwYd@}7Yt*r)-if?br#c`v
                  zr&Pt=6ANh{dA8y5fmA2QU^AJ-fK3SxeN)RT*2Mx^!7t*`o
                  zjq0XFzQ(4F*@)Wu?>7N}p=)_@GY1@i539+>x3R!y#K^iC}mj}WdF)i
                  z2zinPbgqAW2Jkii>-q_LROoA3YwpLb@xj}CN`Yx|J&iobaRtwR
                  z1}#L#9K-bY@7yIhg12a%9zRIObQB7JphesL-JAVXk`E}eUx?4-|EZtM27bEdFNS%)
                  z!V6agXnPKq0qssKaQ*|k75{ZY^V26!BOp)p!){-re;W38)~&*t{0r@GBu>5vVPumc
                  zG}8{s#dIqdG`@u4(|Dc5bT>BKwT6GMhBvB+$UkKQh!8DbCA?C7i*{D)2#M2$#Z71l
                  z^_$QBnhP*lUpaL?o9;=GdHk%$Z!7YOi-YYmd-0M(lP=%pt*0||H9TOD>!-A+Bn(yVj`uwtV>EdDGD
                  z`Yl38y}oMzQDbGP5kDeBza!AtQ%zS(Oz^Uvp7`_sDOXn?MkMhLd_HS3yJDqw$gWcS
                  z<<}$fK?9ebyx(Vz697C3WZ2E>cD|a+<3)8*sAt&eTl+m*s!ls
                  z%V)1+Ykvi9R<`g(Q1@L&$1#>M8NjakUw_}MF9S1H?Qm^*bou}G`9~3kg$}7rQ~=fG
                  zok4C$PJcOL_DwEO(o#;&hxwWH@x!*R0+#gCdyKq=kj456DVbhBQjr01pfXj{+6bOJiDi@?S=rxk%fa
                  zpPO4O5IlP|$oot1@qkJ@%i!P;aKVJpfyGT0108^kom`WBr~RTHeYp_Q3jtquA4poS
                  z%QxB+LH-@C#=9xryT?Tex}_0!(Dxh`1rx^+)14?vYNsybC}Z9xKXgV7!*ph*SUy;P
                  z0u1h?Ei!wG%pWg;w5!_LdFeRE3p_9Kn%yE2ZyIeUmCJrlXX-f*6&jNCdV6|?RP6Z;
                  zHb^IScI%usBzW?T!ub6jTh?p?yPM0U4GoG_FcZ_3f0wSyhw>`KRk^e{M(*iyD6GuR
                  zqA&CsSGSDUzj!&garIn_{+(b)_9S_7oy6Z^h4A;U?y-eL@pbNT-s-1wMs)V~28n$!)D4_vhv!6mLH))7#IvAxeQ2oBxol2C@yGTj@JYtoL>hm!
                  zHq;C_w@ou#4IhI*6s^xoy(r2>@q#=SdK)k0oaL0<9Oe2gtlwS&c1EyOywXg>Of?uztNh=Wo=Rp@N87y`gM!d3iaORjRmh!MS*n
                  z5=S;)R5Rtlo)mfey_2~DANQ5~Swo>s!q-PByg1JWnRm@l%;r|1VGBmq2*!6h^kPAm
                  z#_|7r!EFSF(`dz~XEwe%)zn&c74jTUelJWCFOgcy@S3;RuETzRos#ek(I4H-jeke2i16NQuet4y`vu$Ibswd~`&x=op{zWadOc_>5cWd+5{t0jVV>(5mYTW|2-N9t8RT6RAU8NZuA3xb@BFt}!G5x_alFc1)hqG_
                  zN0!Q=N1pbM?{6XkF`!0c9`-Ee|CA{0AM;W9ol#$m%Nu^840+8XH~Dsyk
                  zcTw`Fi+y(~cOksD^qK`|ERpKoFyTZXeB#?GT|rk?Ucrug9$;h&6Fi4U>c8GIQgQRoorR3hS9??T
                  zF8#ehSHHM?0Sv6#9J7JP8U9#j#GGEq@K`B|ZEmOVWK!Ltdt4)qO!t=PI?lqU0{GDX
                  zTS$OsAkYNP$KVJCG=r1H;3i;1}h8j!vFur
                  c3o>!$v_t!TTsHrG|p?XaxlYmGcP(
                  z@Q5L5JrnQ`y{W94A_|JvD-;y}uP7)8;35Al6ckrZ6qFrf6cnK(6clpDv_@4C;EBf;
                  z5{eQiD3wt@H>$C~{YNfpGVf8!hN-uKI~bqjWu#E*4RC
                  zcouvr;Mbvil#n8L$VPTJw{Ig>-N#F`szi%I-aFH!sdrPOCtI_n9tk%`Yvc0Pbf{>it1HIe
                  zz`pXeH^j(lUbd!BpQ~S=;<@}b{
                  zPB)8>;{}rpOUad>?_G;`v35ltre9fGR92RNhsR9TM@e$KoBX4xnIN5m!bm?ibtaS~UdQnK
                  z1u++Lg2Zyp4GsVB0DBj;;0ca$dvf(^l1LYofv{)i)?Ks*n0xc7QYMy6`~D1TowyZ*
                  zU$d+gQVS~n#Gv0s8+=R>-FYKbB=*CwiMF`*^guWszMJlCpKUkIb|g54!`N(VVl+w}
                  zD_#_3+ACRU*^iEFjP?xuGbCZAT3#CqPRY;zh7f0D#53@6_@H3RZLU-r`KjAhMs=2GWtatt7rZOP4SVoWUu2i?9E#c%!8TgW4
                  z$x3$3pMVKY3BtO`jWWA`E*hwmTALs*`0vKZ%%G*6KTR2|jlM$VANlsM+>huvDh(#B
                  zX`m!zF;5T^tJBU($IAtu4VsS4RHgf|z7U75dpwDo8G$-+@|2h>;YS%QK>COUQs71|65`
                  z9(%+}S~}0>!B%2y@0j2F1HX&ZEqH0Y*p=ArEN~7`I=24I()_*nYVewY0jq-DI3&<5
                  z8lyPJe(DJ}m#tBJ?dr#g=1Rw7^t984a5Hg_KcPnK<_&jQD+2J1G)k<_4$3JG%JVa2
                  zWyofB_OW#db8*2idlwmtrV;OxzuR{0N;}olB?o;Df<#1UN7WXlb|Fnf-*iT%tGcef
                  zeunGxFDz8Nr{~_G-Lu6*tFA#RQD~8(h3s|wad_4>BXC1RV`ul9D8H16M|JGu5wm%=
                  z-(t2M7i-G0>^&m&(3jJ3%kU~=Cw-sKToD?1VJE`9==S;Z^R{&Z(HjCqXo)GuD{98qIkELldGYJ&D{_I5I9g5*)76_10q
                  ziH``Vu?P5?;_Zx1!=*u-W@bV!8BoV(R^(Cn>!QKJ=(hNKqkz)7?!pDS4e5
                  zD_>nb7o&{g?Ow+P39%Zd^Y2GbnLh^%(|k8;T-a|HfKM$n7gNQ=jGswd^;N34vZ&hQ
                  zQflB!NK{hruU5ZCqyazB5LxNJTGjjEM4oB3i!JaZ?cH3J8Q$HqfqE>5bt
                  zBBHG!mkJr$l7qw(D$rG30kTS|FABtIuuD6`Y5a@^T({Y4Un?B8722;_4W!mclhtp`
                  z!i&wdEq7wZ40ipE7oQvUi_~vEXwk2=IAxTNQ_|Wn?|}qq7=}m4sdb1$_bp_qHn)8T6tPcxK-5k)pX6C
                  z+9FCC=1emVZg?XL*@(E%?xKITC(g173OSdTE-i^Fi_+LiAe+-BJ>cOr2<4h#mR#=~R64&m_+C%(z`nKE)i=|_E**HCI>K`Is
                  z*4!HtVv|=%1)p3r=q?X0)~S>vvB@RYsF$05iXDZGxUpW>Vtw~EN8XHzwGutSk$)E}
                  z&5p3j?V)*J-NU}Mm@Abq*q=q{Yq)&fcg7Gj@CUxcc)Fg1gdM-KhQH3Cv;4DjZi!3P
                  zLg!a%j|MEvB2*8<%jH$qX@h{?>gI=`$@)enrI6z6+cGPOd}&zc)t!uyM!Dw8=|@+C
                  z4#Tz2`2X#7aXO5o^EcI0XIiugh40^*`-ZnHTzWt>|9*v-j|qS#JAtc>xSw~
                  zFUD{ke7K+)VkmlpR^{hHHX?I-LR2SG8HXbBOYCUc?WF|q1SCtoOr
                  z5epL99;lx_#i&$$WkX!D1s^6{{mEQou$FzNOrRG*tE0;12dvU%`jNjv6!{4qS;$CX
                  zS&P+rPFIUz0mW8`ut@$})1x8xP1wCDyuPue=6ZcV$awbxZ*jzA<9YpBo(2C{aVjBNpp!RdaC)#Zgd{E12REBAXQX987;Zs$8f8%Nt5+~4yFPBS0
                  zh$IJ!rwxS2)E^n3<|UPqKF=Ga|4awgS$M0}Ydm)kA1~+mFn?DSpLpKUU@YOndJD<+
                  zS}ZVAg^3E9bGNw4yVqD}wBFx6szjU{v@xIur9Nq%GKx%Is1kJSxMXidE@2w^Exl{m
                  z911Yw0+#sm=C6q~hLrWO7KB7&gHQcID-);(9qH*H*TZd|)tQD(GDB|{e$C{%$v~S*
                  znI(?ogFY_IN>>>aYfX+E?)NWp-|~tw#ZX53H4$6$8-`bz?Tr<+R`2XF!j}XaJOqhJ
                  zmZ2B2kKS*V!|mvb1BdZqaffQFeALu*5f?R`!8HLEu$B^8(&o?vHu)oXv3AEJoBNZ&
                  ziXqJ1pS8z%c^VlKQc@gxD8m#_Quy3J(drflD@pEQVkm|A`P<8vm*#%(TF=$b4!(tj
                  z;#1d@B`j+(JJ!d>k}ym~SX4<3DqBYYeZOYb#=J!UY&{As=Yn|O^
                  zBgAx>fq1F*JD2C5$TBOv;LmjnZ~;hX*FUIfDA6=^AR-?Ymh`C5ky
                  zKI<7x?AQC7ETOr&W0gZnku2Ofx7k1gZ~I*9_|6BkPWog~{=UGAh2MS)l_VB(J=!E_
                  zFk5fgPFK^%z;zN~rAiWH7v*_a(a1m3Qp9V&7}b5tF+Q)&IG=&+w(>~OdnAuTqAxZ-
                  zZQKz3O0yRL=f(SSFn3#h;skd4f;Q6EJmZoL=6Eu3kTYS{8dtaNEh`mdDow+PdrzFM
                  z<(zpCcKx`MJT`8+@Kg2lk&tE>ozbv3RLCKcLd~!(EjXA9d{c~$AXo|(G|EsFZEtcr
                  z(WrYvM5MaJ^Pgimx}T(X{bpF6cfYj#EJ~_-p_I;QH?HK;O(o5GeiEH?TfxlKu3*lU
                  z?v;+UimZr;sI75a|IeRM>R8|2VC+sDH&N!=D~~T?pK)42qoR}oLu)e|TzTlF&nt#)
                  zja9-lRQonGoj9y)q
                  zn@%>HEoaNFIux!}JZuUxJ)1CC4;FwsaL5Izx
                  zq|Uxv>5T$Z6t|rtTD`D~>kj!sgb+B^-`t_z^Ss*cQx_L317D~eym_(c
                  zyF^1hB9hb+Fqs8e0E(3xb*w!0T|KOboV*(`!a*
                  ze2_Zh_BIENLhqYH4#7v=kyK+9wOo?0fnct)NN3B*cAdz5?-dnJuP^5V@J3Yo?mv^s
                  zj=W^$!%Ug!fiT#co+wD%x^r={mGzJ7R#AD#u|s!ldR@hrYev?aO3&K)w3A~eY607;
                  zL6B0EruMPRsgIx`Ifu-1PEP!xl=_{*NaV7~Wbyu2u&>-k|ML63qi+CB8_Q0|oU3&n
                  zfuB@5^(h#!byCmc@il0M|#JWj^WtQFoF3VIt@1`lcW`DmYCQz#}1%OPRYUdpm0HydBC;uN>GWJ$~`*aa5hYp>`p}(M>>B1tfE1ph?r5;rGRXN~6{k;^YO^=mZDfsHs
                  zQouSa6uzg6o@tkn@AjX4s9DoT52j`Xjxw`-3Q50P%rlP2xVX0u%0fVg6DJR^v}x(P
                  zx1UvXD5wf$PJfJkRcND9yE#6u+l1GC&dgI`ypfbT%kh3?*ACD!<3$W{(y%{&V(Fy(
                  zCeDTi-(6bMdni+#|Jdx93vNgX#ap7*CM(sgUtRnb3d-WAhDM`T5yGGPusZ;RqTA7tc5!l7j@Z~K&y%6Qjo0J42HrS*Fr^sa5P
                  zS?!-`PX~SrNjVbhcL~d4H*fUVPJQge~ZP@G`5SHtNn-J{wAQ)rQ!hCbLAR
                  zWC+f0Fv{%z(vH4al5i{rSf&VLn@Oyf(9eZ5QUkUJ;RDLD%D;@yhf1vbx~IvVXNf*
                  z7FO}Kg=-5g6CaRoe0||0^IOBveiECa=?z`;HVb(sU)QR~hp~m7FjRlVsT-Y6eEvhs
                  z?Q304X7r>Ew1J}O^BsZgikor>vL*7OZfrmV*}^3tl~vxsKu5xM7|P=;B?$1Lv1@s8Fl&Ye2=QG1nxi&2~}ZVha2tL+K~
                  zZO6IiewyO9cP(O=$&+h<8oEX8TwpC+4xsm$)9#;!bj8_z2tsyN7iu_+>OIKe5V9$)
                  zR0wk*?#ME=2HByF#GzAi5(QO>GGy{_QC^~bU;9@Nqg60^7k!3Ps?JZhQ!YxOw0IWN
                  zaxbz$Av4bxFJ1)I>fZ!z$jZs}yQQzX6N6w)M-3DK6BeD7w%zf#I#t2U?>?H}RlMkZ
                  z4~QbPGxK^`K04m|jl{)wZnHm;sX1oT>D~_NcE{&6?|bX(pq7I!d9NQnr~0c`(#$vU
                  zp|QD)7`U^!ZG`fCabrhymutHtR9W7MXYGPcC*ry&o{qb6&&I13qCQ7Y`xzH&P(yFN!V`{eJ;9&
                  z-0-H`6DEvX`
                  z-(2|)@lKZSmKc(=T4oDv%hHekv{jlO6cBj%NahZUt8W7p^%LG)ERSy8YRFC;2qtF|
                  zL2IZw_zRn!RYVmus7ub-oj>?9nSHtzCX7#qrD@mG==;NU{a1fKHfD6*;qo~ZSM)+z
                  z9O8!p9V7iBX`nxloN$Z?rtecJy`*oe$hjv@y!KfpKuq?tP2V
                  zd~pg^UT*vkw}s&4%-$h?%>ABm7lS#QeOQ~;cg>X_JLc(9Y`KZG#zd6yc|u|9Qg>j#
                  zlBTjA*@UGf;^us$5M%J=6A~hx6%o}&4T%U^zb62aQimrIlmDY{lOdqcj$
                  z4bm*8ZS$^m>xt-xY4BE6=f;zTDZ=P4=__P=b57RxRC78Hnbn1El$C?_X@rRL%v!uv
                  zYa>JfRQlocmA&QiDs6vKQP@%L)L0`6)V+ZIo)=U#^zO)6z3dUEOP@+Qmr4K1JVl>R=K@+C5*
                  zXCeV$CE~9Z_gR2tVlLvP{7{LVMq!a&0PE(*_Nw9Mug&U|7y^!*&{7^>hobo!Qm5{D
                  zv4!`RI)n9z39E(32*}Cys$S!+OHHlyx%><>--?f)2H+
                  zK{;{jxK%mSlMrxD1o$s#1afErOnqjHdSqYF8kgD6N$>~&!~eehU-p1m|Lf@K>Akz4
                  z*W!CqwBDW+h62s@qw=0K+(V%xR@nDq|JYeZGbq1zFiUJh!gewr#K6AC5)9sdX&>f365FUz9h`}u&}LJ
                  z)Bo{Z{_}+b1myVx3jsD>*aaM2p$hV755yg;=ZX#nk2$)+q!)FgD8%wa9t6w7*=i2L
                  zOg~qQR`M6dW@dqIrJ_fxUw0fU__a48@i?Pv
                  z))RGis_i_XONDNhTTP(CJShbQbxpcQwoief*d6#m?16baM(^(E>cUWb)@V7;5nR_p
                  z``g*CP!aM?8ZXT=gzy;Axr>8#6idbDC5}&r*I|)4DG_{vzY~6PS|zVtaU{};Xcn8Y
                  zs}JB0IqWXkcIEW5mz0uz`3X_TG+MKdLA|s{I)$!4M3&*tW6{Os8N%P_cJg%$Nq2nv
                  zdH7A57)g}>e5H=P-?)ZDiM}t$4yxAuz8)-!y~acveECfUNsgR5mxZOfFBg{>9xk}x
                  z*frS)jC?bEy=sO7OzWgu30G=i+V3Ca*|(;Be+xf#z-JEkf~B8Lu(Bym-oJTcwKeX|
                  z^6677my5OCQx@}FcEV-$i;lUr+eyS1p^Js@p4GeA3dMmtt_@Y_o@R`H&V#4P0ax#T
                  zH@l4Dyj;^9`Tt}vx3uyfhY1Nv>|ugS8(O=5v1FoBMj$g6$^jS)Rd(Q??mi7+~%?kXzB$6cw(~kiB=*ig1Gor
                  z+@V9TREnxliST-Su;%NpIGI}2d^HB7GbQq_m-p&Qdgb=mumZ+4;n1W*qIEv&n(tup
                  z$@c3r`1dUH^XDQgVIID#=j)UntMmT+_Qx{NjSuHcGSVmLfRcs!p#55B#)L4EsGFW0
                  z7^2R*J*H5|fu!ylxYjBC~=n2T@=_PiiF7-#d%8Z-$HCca@_;#f6FfIb?WNd|nteemdaO
                  z879E`=rK(F@L0qZ5lExs+Mmf
                  zY5lDCb{UfI2)Ox-DRzQ|E?iy=xQ8
                  zcU}N5&P55huv2H7U|~$Ge-&|j{d#`9(Do+9=&c%HT~7d#|2fTDXSMRE7k5j4%IC7f
                  z!lua$jVSyxi)js-Rr)$mgF+5LG-zMXmSPRP00}+>(4KlCAYtxHqF)EKa?b{b?hl#~
                  zsL|A#t3O>+k|<0L_PjWG2Cq|@)A672I(BE75Y%S=_z?(T><5jCE4+R#{Vlz?3UYn^D>{UhU5=@^FXP}
                  zE&-0RMt<**&HV1+1j+bRuFc`kc~l`7M@X;{Z>M;#P6?yWalN~#5YYkviQF|%
                  zPph|HJz)Iumd;>S+GLJ=f$gUz_U0u*oPS|`MK4{Q&0)wr*=;_d4Z~U*F=t)FxisoM
                  zHtv1G6OmLgo3e|f!W*#Sn$=CGXIVK_b8GX=bfVv>&}Rg9`ua)t?~=jhs0AFR%gS}~
                  z>rZ0aiRz8#;)>IE4=&lmn_+Y~uFLvYIO0DO68~p=>_1`@6#m#XCb;e|D%ik@l7Zp4!oA{M>CT6T8B(O(ArTqrd9M3Zx9)Wc^xUAH
                  zqPUa^Uy-V5r?3Ti!0;Aw7}(k(_qieM))G-r%71Kq7=y3^JRjUl9QUJHrrGG{++QZa
                  zXNP*&fROb}A(2S20PKuPb#I%x20oniqoNxUz&}JTdSHyoJM1v^R^F>rc(F_3)Y@u3
                  zm0W%e4MF!YG;_oA)Nd3vvs>XS>8(+wu~mHGIW)Js(+J9|
                  z$oKNSSfGjUy?^3nzn5ir->^gw`Andzf9yNuQTW!{EK}u5(`nL)3Etk!B$0~+JP1&O
                  z`0P%#P6_DndH{jqua_@3;bmPo2Zh2ephL&k7-yunXK6<~^By(UJ!cLcZOr$Mnm-ex
                  z3>mGsk|}6v(9OMP$$uvmz4;)7F`I<;(`jg}Z4U6h@0sw;_~)JP!)!py8H|p*nyh4g
                  z69UVZ*M6~4f9B3Dkv2?)s1!48HFxKjbTnP-EULf#jWhr`?we{COO74%>>bmK*tb@H
                  z1ONWjkov$>EK!53Vf6r{FY7y*IjjbYWxEo@sZbzHVY)Jm)XSBljQj78Q4iZO)Jw&C
                  zigPff#|`orL`39Cz&^Ykq&|3L%6(LO`HgdCE-43WV9_jC!3sw1V-p|dZ`JX5yrTqE
                  zD|+Ug46uy3m3@vi}>|L%hPP^$B8xV8ifTfURh342+Hs@h1A>J
                  zu-#N^4_ceuL{c>x-_C<3VIPN&TW-+cclVWdjR@ANh|j6!=F%8z#F!Y}YvJX?MP`7b
                  z69_n$L8gq;{qedNKFagpx?w{EJ@an#H$^o`lDo=-Mu=k4g&!{*TzY>K(%9PX@k_53
                  zGpiv1E0IlIrKzmIsG85Vu{cES76|dMRW?KdD*QDfl0xIPMR`gpdq-YHL3(o@;A@r&(Hd@NmT&x_RQ0c2}r(7
                  zwAQ@Z!O_g}FZOb%yfIo?2Dd?m+Hy0Z(;c|g|u4&K!n5ayVnMxM1?B@xr}E3Ui(E=p4idRC4rH=a|Xau#Hi?Nt*J+V{IeP#
                  z&@>8IsWX<3Dz*4I*pAXckCgPAslU}4@a4KGGASf$OX9iR5BR6+7)oByJbB+H(FFRD
                  z{x-XjEJ6~_E2}>hxSdzLv^C?xVs9D1W@;juJ5&GptxeOTW8D+ZPqLmfb160fVjyuN
                  z;_u3B0+HDcaq9iQo6#*Q|89nFKe~EHZ%9+G*R&B_WD^w;De||}*E&N(I5ml)3*Ifa
                  zU+yd6@-+lFsET
                  zem1C3QTF3UII0Z;=vlnlr$;R6@H@wIucsJi-YRU*lM5g3hU5>2M2xQ)H*j5Le~_nvXDoT^`WShJn&
                  zC4kw<*>vgPyU1_A}X1NVh))+MO7yE2Rs?a1%v?dpT0Mogma1h~KWHpxd8
                  zx&^P{yr*rJKeoBm8dFay>&QH4Gjz&Xm)yQHk}l4gq1c
                  zsxqCSibfr|rf7qfpC-wHZW|an_Xhhf?H8S5FM=Gqa@$p%0_HH)!yER~Ly2plX4_<6~kH);+BX&61=k
                  zmF$XxV_tEQX0b28tL(&C8KmTE`=X#$khvP@wwT1Z{aS3`2QL}>=WOxA{k`8+
                  zc&&|DuR+bpSYzB%ock^xBXy+BU@Jwjm1`-~sd;}VneI{rW>TTUCE*EIkoS@L;rF_W
                  z7r}_753F$nUNg(-GR*f_DHaeTaLSRp@-
                  zm9Y;hnk<2wV
                  zXnxdQb+xhxiB_NkoMg6Kn<7XYC|g(9s7iP<|DDmo1jY@FRaLf@72eq(u8bFS{P!Dg
                  z4Qu`Fi^JHR?NE0~MDp*u`m)9ikvDG?WPc1rMAm}eh)^%UNr#oLV}r$Rlb4?9O2D<{
                  z2=@LMxK$5@Yb;W(bw^ZS88IY7~1A|rT-P?vFA^I_~6UI($Us>{v
                  z8bGpuqo2PKDqk-&K4jFY0<(VFapleobz|HPGcJ$E%`g2RH<-LVQ$}&8?`HrT!QP&!
                  zu!8z!(1sK1zA>CD(&VuDCed{Pxp?uMJ1!|HXT&jI^s2~Rw)Qa5CiDOq({I0Y@pscM
                  zF)Aae?Wp-K!?z(p)`Fv9>9ZT&_FTU_Y-GSyQFepn(2rUT+2ktY-x}$$d7!t0$VIJy
                  zQR=>R?fy%-gecLCdAh9;PjzuY1`!h6z24C6=yYs-`Eh+<&UEh{-*oZ_n`7Z}7Z@m_
                  z-^o1HD!gwRLd7DnDTXQ629?kzB_ukR34r3mFyx0d4D!
                  znMrz;;k!R^7k8wb{5&1-Q(wH=I=7(A#`Nq5D(%dR-Gz~;Mbjt+|u~Tk!P5+1%D+(A}Bgl~oj^9B#FaEGeDf7KHS-#(bf`wP?rBDYzdU(s~EudJ9
                  z)P#fAI@|8rR+(B}YN^R$eG_2aNnEth{Q$jwGsv_%0#=-3-89rM{DS3Ax;p_BKl_39
                  zv(t#+Z44SvI7Ev_=(s4Etk{@M8oYi#*Pef>J5t7BsIFtUY$XQrR!A0c5&_b2mkVIa
                  zH@vTG@@1_^YT1u0DW$;I-5nkJ@mF8tF!Db`cLk0ssP4F|4U%EyeR!wNe`Gnt7ZG3b
                  zq}W=@8T-r)5lSD79n-8Yx%mA&{c8TFxSYvq@TtBL|I0qv0;W2)4R#wPafj;0RuT4w
                  zbgtJg#U{=HWcf1!6oaF+i3(}h|JYY5t44G1$2NYS>nE5?I-2Oi=VZ%$)k(I~jNjv}
                  zG{t5|l;toWvMI5xhJOC&`a>grOPpQ14!W9e!JfTc>_!c?q#SezX{}~T0
                  zUjcC6x%UL+2TX#%_;@S=AW6*CFjOgDUK;jIQB(Y*4rKh0;=`hvYSzx~jKO#t2UA;h3+_(L@gQ2o8l=VMjZZtZ*M#l(U!Gl7ugYX@o(
                  z>WBmy{?%yLX`b}f9fGcH;;_#MzyJk*HYgRcQ*!=t>^n&OD2%*^AztLx%l-K;A`Pu@m{fBaYkuGdz=5OI#=0_6i_SP&x=6Lt^
                  zFox?JNwH~U&hb*H3|;}eOy}{?v!>$B6G3v;lYqnGB>|@jVIkP%ulBqA>l=)Qb|q~o
                  zsRotSw4i6ZT2(7cqH-(0XN8~ON6G*xzvyNy)T3#mx9wX_n3bNX;sCh(4d(+QfIWAT
                  z5*~g&AY{#3wk7$5`Gz1&h!$H;LBB@}ARn4IINM`KZst
                  zfW^hg&s)iCKk7rt(M8|)BGuB06s9&sl{z;f-ireuOAc7~iu0k&)^U84pf}7rv;`w_
                  zBQ-MkY~_&T{6tt1|2?&WVgyLj*2X5pDVJrnz^|lsFX+~OJ;i3HK0hxnM|mX1BVP-P
                  z*Y~DOZ^sX7O4x1r{riCVIv8@ViYRVkqSoxR9i1m6_Yskfo8AV;))WdVGD72vg
                  z>%wY&u420&B}3OPd`Kg$t&Msh{gNB))$<$~n7!&#I;G>D&TjG=e~OSyGT!c!WjwS!AhI`B
                  zXMq(jDu+^Lc(2S>u@DrLP`dGXX2n@IM0>$Fr9{S_jag0LhItWSn;n?Cjx@X_fnNK@
                  z4%yt+m51->I}cwPwU0RSNjm{
                  zTi?QHC8Ns>DMXu54gJo?B9y&QQd6m*dd`0t^7geM*)AmhnIZZ4SkH4~xYL>JssV?(
                  zr`0aq8CDhn+fnPzNJzMly7_ElT9zR0nHPGo5Mh)NT7j1ow&ld0(j%P&a0Tod0(pX(
                  z_2aJ2SBTy!x)kWn0(3gpMgKBk|IrRvZUo@R4*k5*pmK1_+t-4$ts~XWS<>6S=<;$v
                  zgd%}ta{+j+d+;X&(_IPMnzDJ}`%BRdy2R>O#+^y$UvWUVqL-5ae%v^$#UX6oE+yqj
                  z|NMlO&%WVX@`N>&LL&2&d8C2H$W}iI6lw+9xivYW-KO9*byj?6DF6wbPaO*(2+tUw
                  zyQ*96XH)JHYa#5`x+7rW3YSZ}q?Bh2?{O?28Zhc&B>_|Ed>yb~&M%pOaEQEnkgs-2
                  z^Ewh=In=nsEdNb$@s;bxQ)+Q7pa5h!J%_dqE!PZ=vZE3bnR3#(Q+L6oZj{+i)aV_w
                  zlONY)+u!C828v6|8v9&kC%=y8$nB^{WCutlEQa8;r(c%Ktwf%4P#f}}gndrFtNWx{
                  z|KmdfsP)mD4-XGXe7aZ^V2WsKC;f%+=$O9@PteN-qIGw%y?o+jlD~oP(~xld4QnC3
                  zp0W_`&V*Y6v)YWB_mM*!(LC_nza%)|f3GwD%2OR>AVX{XCOp2piT=mGGyLAhQ%-f}
                  zY!G_Fh;k_GC?y&e=CMfc#rMdAKfEF?GgyT-kes-j>entXVg7ylKktEcynh$d{#{J_
                  zcQNhX#k7AH)Basd`~O-@yUKsrg|h?%N2l%jEakxbri2tvN6?g{&eE>5{BRH>=in>1
                  zN`l+l91}a!5J)`sDo{xQ8pbT0og@_&M)ZKGlL2+@Kk{8->Kx5q3tB~*kBH)tkeEJz
                  z&e}nCgnsFvrzZLyLY!072lqb9RroS
                  z+sXqWu?cK4s(Z`A5YpfMf9QPSNnL=tn`M|OLKE^Qqk+mX#|cdfNV@p7hgh}
                  z64=UALA)@Kk15808UeMl_mU)MhjfKzc0m4K7e$GH{v;za(V!=4@sYK{A_RnO`YUz)
                  zp*+reKZtGtYqyFj(?vor@0cvX2Q9!rQed{uKQk|Tf0z`JDXg=18fOG*7yZoek)19X=+tyAre@?*3HOnamcFVf
                  z)^60{%-D7>e=g7%Gwyg!x6nuv-h*erxlt--{q@c9@t*qDST~M*OexptcN0XD^J%26ptwT3Zyeje%{gaONPzqb}E&LAoL@V%x
                  zAMkK;#KNCy*xC)jEvjL>UD>$|Koj1`3kCmU`@Q06PZJ&OhlhTmPRkRo=0*b=i%K&+
                  z|JtSb%joiaP2)aCADHh#E6+R8U->LQA&t!`niZ6V=oYhgHVy|7y>r3x=R*l5Pj~K7yJZ2&H`FJx!yrLBH
                  zC{wcq=oJ0Um-hRQNl0G6Zs%Vxi(PCYPpT1!oiA99#97=iB{hN8Qd%P2eE99oM^3H)B@xx@@^zUt^Vhd5^$FThEOV7{zJx%-
                  z7E0%!1DT4p?9KZ4f;=M_sJ7g)ek8nhR`UIwZa_c|@NxY?*|ysaY9%Z3`+cf8i^kuY
                  zZ0-1dH~!dh>w|M^Cve&Lf7yFzU2^O_ZU&~%G;T%VKRvOMrD=mwUz&b7~M
                  zRf;?GtncHbym<2lbgv8P6+U119_VH+h+)J4>WpC{XSc;#4*v=H-u!6@j&Zm>HOt}-
                  zq9^brYYM$!t9yxdFnS?z(-aA#1c;)OPHGuWJLUWu&YbA1+XEpy4SVeWos@bqw}?#J
                  zySZ@S}i*@Mc4a9B0H#AU#
                  zKGCpayex%AkBTSA?k{?7sF!`e-Fu)m^UK0zWCiLlQd~Q+C#zTWLrG=4Sk6nzNN}3p
                  z;Q~*3_VHawba}d_M_2^6h|F4fW2F(wG;!_omQy})>zvf^6V
                  zcm}KFB!K_Z1bxX<1Wgyq2tB3|A-4SiT56>!tm^nJ%Uh~(s#&c6!~u^j8n_(9B*Jyj
                  zu#q}>+qqPatQ!d4IBnh4e)gNTtN&Tp`yLV%+NMLBI$hVb$1z-lZ<&k*oG6##h)?Z5
                  zL?K$$)Zr;`8jxPYB<)roo6ZfvhTRRMr6pL`L9@5cz=i-`Tbg=5-IFT&F~C|2kefDN
                  zqp|Dt(3;-6YvWXStK?M#W7mwkTois#gx`)c?oWPb@i~V>T;R2MG@Qs>-7Rqs@-*0Q
                  zkk?J)l0!8q97-mAZv8<8GR_G6e?Vf;<4MnIv@Rs6sxM6C!vYu&d2`L
                  zmBME^?aD)4`c|8vfz
                  z#yQv!qM1)@9X|Gf?B4UOL4wdTA(*OIsC6?kd}DbY-?u}Ac-)McjZ;wVT-eSTfe
                  zf?8-D{U(+vs`u}=HD{RrXV+t_erBBb-mbqgY%gczdRZClGKq~}a++&KzR^j6!IG_&
                  zeUr{=@v#(D_M;omw-*{x!@MumRsk1b8!RWhKjg1{-t`PnPBRC^3#eJPVFr_>?^^9%
                  zG_65}qtqr;CgDO8^CcO-&U9R0y&{X3HqVsxo`1qf!*t$}I(K{**M9AI^t*3}cXvg-
                  zeL!Ow=h7s`z+9$krzFAG@H5DxPkxrhXwm8Swl+{(|EKo9wGQN8_~zXgI|C1W9FNry
                  zBiglg>rs^I*2NcQK=K(w;rj1waMR8uRj4SdrectMBXbFX;55y0@zvsQbryS#mb
                  zYh8QuSyV+hADV?{tkmL^AwWD3F52D3ZqSJNuLfJ)nRSZA
                  zj+njnK2?lJb$mJDS#CAISbM5jcG03U-{$m3!?NJ?m4XoD;sY&kWrJ^T=;%VD9i+;l
                  zkAYD%1KV^fTfSc;Hd4s=c{hIk3^5POW
                  z(C27?X6{s*#pF!T6Ws5EaKvYk<&GB@4BR^s?d+-x_@Yf@BTlnGv$bP2w*xUf?j{U?
                  zx|!Kzi>9=_`Qqx;$A1F
                  z`_Z==dWcQWLk+5*r0_efB?DcxxQuzel|^rdE}*t6=1~U$>jpbtP#~mr&h_m#8xrFJ
                  z9mub<98Kf_q!Zp;Nm$}%Vd(QujJHpnyZX
                  z>~k0dPym~GC)EkL_$tYXp0XWJAh$hMuKe-K4vZAYu|Y=|Y7d^Ym(OwicoqbtzB!#O
                  zJz)fX4i~+EdzB=%n>Tm)kpxow`*!4fnuz!r0dP5@=5grD6yA?Uem*|fIi@i@NChUP
                  z;I-cT)+c!KQe5sfxU|~%>w{!}b)*68KH$%i;I0z%l=b>Lr_n&h=o6>nvKf<%JOw3X
                  zha!#|z$k!rg=7tx{%7zdyCE}*9K5m&Tbp0IrHPE
                  zA&mt{mPieB-$oFfW3;U1ahX1#eRo6pJHz{#xp@!sjGi_6(`(y|OW}}30HhA+O01Qd
                  zkg9$hENePnEGwT{@_S9_XLsiPIaQ5j87M8WNxF3ciKPHw?6}>cd4v!VA*Z=lgkaRi
                  zK-Y}xv|9b46d#Yr2j?EV?A7|vjg4=)G>K=fTd_Yii(@7)-d6<>rc#KBS@VMl0WxR)
                  z+psl}n|C)ww;WC|CpVJOh9kpPVeu@skX$d*M6?Y?{>}-%HIxhTG`B
                  zwfCJtO}$^YfFeIdKtVt{NJonF9#j;hO9@D*N(bpRKmb8Ny3#u$odBWt5GjHo^j<>m
                  z9Ri_*cJuqc^Uiy}-23T%yywF+^JH>n&Lnf5z1P}nuYDWz6nnLzrL`O$8l#Peco7{
                  z7H@?R_<|tnUn_L^A)$AIO}%lhShf!3n=Ym9uZ-o=!ech8dvt@d*suK%BNzJ
                  zel+xT#yQJ3(^Hl|tw`-r=a>8Nk78h)_EzuB(kvg36#)TPYn8?Cg#l@{8h0`qfm^^q
                  znWdiGbYxT0%t*osP}xV5mR
                  zj6r4P0(Qt&5N4_;>rOFV9V+JCE?sIkr^^Bz@4Kzzs)HzeZ@WCo_qeduzHG8GVF!Pn
                  zjoqBq3#Kd+%5hSLG}GpH6wsjFNZ#fU
                  zE|D<($V{ZG=7+nb_fSpCizfeWO(LC7jQ&!x5?F>lMjxS2rGyyIdk{Z*#}?%E*VS={
                  zGplDh>+1E+t110Gka*~4ZDgJT(XL%Ha|9k(l
                  zEOLG*2&bT9(KEk`vtp%E7^>2`RfZ^
                  z&kJu7&joR8YHr#7sn|iv*B%yt|7%eMX(1;{2;Yr!hMb*^DAnsLoL8X0ZsH;8O)Rr%
                  zJRk7z<^3-WBL~L=LoCOG!%gnmt4m8S3)C#Nv9Aap{LRs3UZ{E=-G-C-hCj$uyu9@F
                  zTEdD-DI$OP(a3`R7ry*MFY<{6a+0f1=ePxR##5O8(95{7c=`&l)EQXub6V)lEoIDx
                  z%GBcf7aS%niWN6BPR^=vmX40Eu1O9GS?gFtxqv^32rDp|H5&&*huW8R?atz>2eaA~
                  zcIYm}+MAsB%`8mH+1asrbvhFCLq-2IS=Z)n)x?fsfNU6JS{nyoeNBlBG-%Az_$=mn
                  z`F%WOX94;MuB%XVbvbopq@%DuO{-b&m7FM~rG#y|E(TMv;4C+pWu83Y9fZE02?A+?+Is{!+OP(=
                  zA%Ae*qRP~b-y4B_00e33$O)}EI=Y>$ueTy#mnfF8N({6x0MpLlb2gja`?}AK?ElvJvl4#szm7X)<_|MtFNRY-cC1w;&LQa?I9ca;-&s*Bw(A(9Tzv+GS8RiS5H
                  z2w+iHGcZovv!k#7psb7F;UUKFfVa^Z|@gAijEqrptOHogQXOym^MC;HD-uaSv`PkxA7gY%GRrC$^
                  zWuByBOZlZ+C)A^b=2BBziT#^8B{fsMM=uZVP-wKw4W1=y_Pk_+$XK%oq!}1xQ$Y?M
                  z@69t5A_}!p*wr87u>sj8Ng_7&c_HCWLve`gU+#SGQ~0w(2TH^4aZ_c!bg>B7?#rvS
                  zLjgf`je?=dT{^a#^68>A)x!a+5D@KQo0uK^OBgv{sneg;wwR2Hp`Rc9D2ZGU&%|6d
                  zo!s1N3+LxZ|E?IDg?&XAu-E{FXRIrX2TrEHQ;xw8yht?xN&)h5SdcTbTP3|DV)gKj~fwfbUV#
                  z^8}!#{XndOHa7*yLR`zag1lO$?b3mG$(ug~C)b1AC1!)K-6To0>OZf&wV#*@CueGU
                  z)c~v%ba-?{*}_P#kx;}^Fqc8ETlFgqduCRyd3E)Nru6j_!OMv@~
                  ze=|)z@=|}Z-H;xY`Mh_z>bRYU0w4UdgSF-hS4cqdH3@Y$^W&wKDT5VOXMG|e#7R8K
                  zZy!AWJsTOa?yZpZ)8f+ThnbTNTs@I@P0%XX74qWKhx_;S)0-3wirmJNNBgFGI4vyN
                  zwy}nKl`C%D)B6#++8(CjE*eRHQpOPmAL%jErpT96lah}mKNV!lf*X^vA7gBm7oXCe
                  zy$Q^=@lu8?MA9JNgsKW8zeF+uug#qheiUdGMF20~bTL=peDqj_Co^0*c89jj^&q3W
                  zeYkg3qKR;&nAshOrC?Ersj1PZ?io-(KyQ4Y>ur38xc4m-6563|%!%wRoq-sC|DB#7
                  zgIkCpNE37@-bJ`MmNxsu?SdITJ2Tj5^$S#6o_;anJ5Dbl))@HMZcSwWmxvs%#)Wd7
                  z$nl!%a0o0+E44JKdKCBj`8^Y@vw}LL;VzTZa8m{~f=
                  z?WL%pDOG>NVszi1KT2VqUi;)l)1%LaBgfh7st@D_EpZJ!`DK2MvvlI*$pbJ&2+7_r
                  zBF>w5;dvd-xe_Dpz&tRoLB-phSB_WtiYFg?{4waSgG|s#`N8V_*NMpf^h9widtFSC8Ct)l&AK5g8Z3Yna
                  zqAF0rOgtT(Z#T{_iQU#`Rgp~MwNh)*9jba~M@GM#;Cnf+gS2kAnwKj~d_l)f7`OEy
                  zzd9UhOy|Ajre^$`a0KdRCC5R!O5mVsiinQK5<4}guU5STvLp&+)G9~ZVT_{<9AaB=
                  zKhRoNm$(l%2}{evWpJBd9&UEcJLecQ$K8Uw+E-7{Ju{QyZfZHkE0#DD#Kbigj(!j{
                  z_x0$obhB+yOsH?_d(2ewFsR&6v>UpwXYbKrB!V{LEh)^
                  zjbOww(u!b9qtka@gsQ<}qyGt5G}rqZYJ!j2Tq#zT)ymI&p+n5&uM^$n7`|7V7w30v
                  zwQco6Sgn(68A*le<&+g^Dmy}$g?cq1a0^AZ~VY_wxXqnUZgGMc7%xkJvm1^W>&`J0KIp!#bdlvEd;$`({o!SnAr{U3uYKiPV0mHU?
                  z&J(q&I^XB*sx+H>K9>pDEwPBl7%d7+GFNA
                  z=Lzb>G^v}+y%e*j^%ljSjOo49DgK#JDr%nwA&c9=+L%<12!GPr2?
                  z$EW(a@2-gI4F&=4{3fP2(sFSvmI?!hjN=k)#+I;gL@u*#@-Kd4}KZs>`YW
                  z*?gxZcVfYbuOOpSMLidHCLGzVp8Cs4x9-?MtmCiIhFOW^{#%9k?#hI`q~Wy}^!ozM
                  zg~6Fg4`xiWW9^!S7+0HI`#L}R%O6B7?xt~rIK?`cMlB`klS_`RG`BQBV~YA)TLku#
                  zrD>fBj3bz?<=+Zjv9OO;
                  zSL|}JLWXB9-mV~$?vtlJqw&;uJo_8kgP7@(Byg{MipRMB8@Od9!0-RF{2x9%M6AqU
                  zpBkD`5fF^P0@sRoz#oHzS15EAlb?Gi$Y>@{LP5L?WShEQjWf%w-~(lbOgyZC+xpB)
                  zf{z%^2?!Xu|D6%AV2thGdmYe}wdQQ9o&UBaraE59EsFLq-bB(_{--Ln+{tA#c3u-}
                  z@26eU4d62CR2Z7i$I7IORLN2Q<09_+`ILg2cYELtZXxIwa^E@1i(yq-V;+g^==n|?
                  zYdiHR>&E-mG}IECPg~~?{8pxs+26@rKxA4IJRNamxBi(M)a=H4vEg2D>Uec>oR+fA
                  zcstI9vpE*`JwFtt7D^7icP8|@Kn-A&(cqMTKq@#ZrAw5w2C%?vyRa`cfe3%mx(@ff
                  z$CISxGIx7tn!*sY*L#^%Pc9dQ$u>>C4VW~lnfN&-P{-q~!;2McFeiD{sZsTyp?aoC
                  zyOG*F54m%$=^0R|Z)eO*-RbB~YC75ECTvZn43Z&NT`073i4>IaT26K?a7_9#ApqmP
                  zT`zb7F6p`m%*w+DK<(4rSiRiO`r8wnFKH|`(GciOvru<(t`2AQ&~G-s&BNh$d5$=o
                  zl<{IVQzw&+GQ8Laf;A@wL2!^+n$g%HK&#>6Y?^WtkUcU9uM=05#OliZQI)H6!diEg7kEI@-K
                  z7alU^HUpv;28~Jf6^X}w!z|*+i2)t@C~=0eTwv6W4)wT;4Ib$igoHoa?2NszY|=R0
                  z2(H0H#8gu|1qvry_h*l2X`MZ8@#e>tYtLx#5Qj7Wb!dL`TzN%;8o)$9ccQT?Yxpna*#}0%?8MT=KL0I;^G-O3hk
                  zmXVt~kE`|AVKvMiS6mvGr&4%zma#bHc9H$KBp`cyyW&@CDckWS#W-&sRG@tJQ7L5>
                  znVWICgz7szuLH8Y0Qdvl``BxY!#M=x{V;!zfdRR~DC%bE{!^%sF_)C~fNNSoaVC8m
                  z-w;yBS7)HontJQdaZzV6>6tFI^{w>`k8sz(EvI47JyY%5nKGxe@j&|PtDL@|CUL*T
                  zAu`a3jfT8ze-
                  zNxdKbx4k_Qux0e2p5<(_stwUfbKvYgSPTKPI=sg`J7dzTytSNS#`){7Pi9UFQ+leZLdrj;rKP$tz2C6#c^}*>A9#I
                  z=bxMeGXs^Zzs5^3xGPo@ayU1t-c_wJ@ZcFPQni)Y?hcUm&>^;%Xzo2Q8BRv?T%mw3
                  z_driEa*`K&?3qikfD*by379w)@5;J_xRoGCP6b|ruZ~bo
                  zFOHcsOa47neq6JM@kM}wCS0t0b6P-2yB_lVAR;jm^JJ|gU0t%zrn)J#g$j7cIq$MA
                  z(v7`yCW6_1*VIZCAI~VwsJCohf=J#0>du~E)Qj_4TNz_SJ`B9;7sp5+k26EH1xWDO
                  zaS*7MG@tNxRs#`WCjQ4lYNIH@GIv|sRMLcWm&N-i<+I07<(y8ALr-0?>QL>O@5$zU
                  zEK{x80{JA&{}MYWYJDbDbqi^ZOP4&#g*}{5-gpzc^1~|ZAx?NvW(ZU|6y>jbD_w~N
                  zCI(Fc?)61=*m&Zh9~a5+^s#rmN4XTVHYbF*A=6*4{n$lIs;Z;YLeD|61?NVpss_bp
                  zeV9Pg#%v>j)@*Kt1^Fnr2P!(v<^2O*g>WN-wDFZWnF}=oY-t@^{3~mngLYKV(N1el
                  z#o5Iyy2e9HDi^iE0(5D@f*Q@a?B_bPh~ygv7D{r|=>I|2<);-rP=~HJS+(2K-
                  z?K@LbQud=GaTCQ4%sUK}PkMjeE}D#B)&+mfmb$upsH?pA;Qn##bze^hur%AxD+G}(>Ydp}b5a$WkI0Y5do@}Poct_VG
                  zJ@wo)vqk2^nOZvfY&^GX$QbkzZ$MtAz5c2bP?fA&?yj&K5pMvGugaNdzeari3iseBkY+jXpK0o
                  zcMH_43ieA2dQHeKj;#~-w?+!kz~@p2HL;~yYQ6XURjDhK$lO&Vv2{CV1>(p#a&!#(
                  zXzuF`o3vu-8(M0}zP5orL==q+ZbCqzr^V>-6NzMBf#4!x(i9~&d
                  z&UlJtM0G8h8nMv9No%`x1;RNr`K60~nqTO)4+MV>HYymb;c^}t&hX&a1#DAqdq^I^Bb-aKndY4>(LAT1vo&!XnVVqc*2re&Fp-f9>!dGM4US{5*+BP8e6qa{
                  zN7)`#la9m(rX9JQ!y*krg-z?YfNF!$m6eycr#WnGaW#hf!o923Pzrgh9@&Xd(Os1S
                  zd58}2xJzpq2ZM}XS&V%pgLjOZG|N!YAt~g6pqjBl3}b@=5{&+3=OmLGY>=bnrQ-bP
                  zY{r#IOx>zKO#T!4n3jfyUH-i>7ty5H7|Tl79st|;k*U|>_vBdB(W!?|F2uBEzuLpu
                  zq3yc)*BE@A-!R}yJ;PlS$A?pl``G3AmK{DEMziNi;d4G|Op??mFR53=Gs099baOoxztNq)Urp`UVX)5U2HioZB&2GKgm`jL
                  zmqjJ|ZCBcSHL+*0lK_lkFz|#Y8=oQkWlM{S!PWj8Gh0-Q{fq^7X3Ef1FMJ
                  zndVaIWEGFiY31a$X?sQ*vyV?7+APg%?9$p7IqHEuLb=p4xsImyyO{w9UApn#OJRNZ
                  zf@HpqDnDlZj{VsZSF_7fth(fJX3#s^I$=Pw8~EWY?m_Xf10acSNs}|uN|Q3E&S|EL
                  z<68@-e8UPAQ24502@G3eJzSf7CBk9xZKq@~>`4lPmZgmU>OIKWs7k3}pm>(d2uMD=
                  zvfR0iH2LF;{Tp=i4HF-TUL0(5afcgRw&4
                  zJkKsBZ}pHvQg=a^L^=DgkPKF(l9Mu?z!OV~O|K~6Ep1o8m&I#ly(=5?e~**JqX!KY
                  z4%p93Q|(vbb%axu8DB*O+x8TmzVbVLyGb~8*k#tX{VTdETW$=*(z9q77(p5)EqC#;
                  ztCF&sEPHpnS@9>pD-pdT<$`%y!J7#`x`7#bt2AfNG(eKy3VrZ51;LBR8whAyP+4vbygUi{S=%R3-1
                  zH5Sf5I%14T+FavUB=L&wN&F11=!~AA9HAdaKecmMzT*@baK5^ICNBEEBnc>W?4Y*H
                  zlI;Fu&G+H!j0TegwhkgfCu=`u)lwz>Wx5&T1<;55);Pu~@a*%+Fpj2QYo6e}g_$Mx
                  zA7gn7dE>vxTl11R`k{ua@I&u3XLW=Y+Ll2
                  z+n43Vf$QrZS~hPn5SxLwbi~YxXipi730HZ=72%zbaCR(Fk0=aGMCkqa2$5su5r+ir
                  zLDxnfDaXd%&EsSCPZPHZTqu~^|495VI;(ST
                  zzd+SGm*EFRHnSqb{k||mURrzdHh+Kpa(L$UncaIKZpbZ41=1I#a7XLNSx=a}YDwE=}$JcMu#u4h^D1J!mk?^ase}=-IssXg2L_9m+q$m0GhS<
                  zg2Oc+dl8usT)T4vHo_b5JWmtU`UgVis5j9cV|gP7GF(}#dB+43D!O<5e1RurZLpj1
                  zr}M_$(OMx?(YE+p3r+r>ENnD-da!%3sbUY$%3*aE5GCEj+?vL5hn4!}+u69IwRvS`
                  z`;~4(dw-e6RO6d`PY2No_6xT$RPL~|*}dJRC05Z~(v+Jh5u54+;i=8bINR0A`0bZm
                  z9s(W#3JBxUTBlAcKEnzmUy|WUfJ=|}Un5I=#`hm4xJSM*LKnt1d13=m+s=WhChSx0i
                  z))~lOdfZfqY(bR~dx<9F5Mvr2{o@g0&wS%QMRJi`lk~^^FOH)kb~)f*b_~W-%4S6e
                  zbKJ!5YN?{~s&@yKlakFpz>Yv*4KiSI;B9XD^scd5Y&xPvICmo#uod^P*nf6EXbnS0Txo10P>(KGzGuFImOoxeSCf&%W~eQ0y7%`MZ3_Ml_DtGiAI
                  zm6~Y5GG%Fs)lp=Fr0Sef>{FQ_rH6YtyHwJ%Exy-nSF$M$y77W{27Xg=(MfGvB+9YJ
                  zA{ccilU-jfAL+Q?xj~mMsn59h(a#GG)=Oj-I)Cda1uJ2XA5OTpKhP$O6Jk=eTc(b)
                  zGH#*~$U(WZc0Q5>HMXQ{9j4^MY2%_SJtgO9;v!rot0sKa`vW+`8+t5W6}Ba;wxPQI
                  zhYJjzm`!;AEw#1GVZHiT_Y5%on_e5JyfuVRB4;QK7*zHG~e>_o1?uQf?}5rp~T>f~|jGZ-T|mrY60Tlo`M
                  z457PqDtcFHpGft}$8B&U_y>9gNnDX=z2!;($)3g=kbA1mihmw1JV6_XtFShmEeF{?
                  zwbiXLL#njGH>B6U&mVGzYQ<+Urp-A0G1#+WfJcYCUKi^tmO3o7ZpC`8aO98n7$s~G
                  z_Oa9LLW?&{y(Eqi!VEJHh*|KQAkmpqdis}#_bZ=vBEG@SR&tE)5Col&&>bQy&*ok5
                  z)b)nD8N)*Yg1Gaa0Pw;Uv~zj?2jfNShP}(1tSKAzvcdMb-_O|oyV*HaGpg%SBl4yg5F(U
                  z2nb#h{5wV!&kymoHiy?I3;)ZBA|zUCfoE;9#qUf0Bo+-38LGLVX~Wk>Sn8cDim&*9
                  z_IRmSM1?UNcH0jtpLU7i7fsH*gRf)bxryj~hdJTz63%ezQ}I@RI_KHLYcVP=row{&
                  zxgX0n`mhF7xcA)ww|`Ycli?x!La(pSkEqh|SQ^w&{e|DJ4)6khLR*@tOTYFz3oY`^
                  zU{_Fh*%R!%9e7L`+Un9+u7TOn7X-OwuM5f8c$h)0n|KWbZE9dkX2{4Gh&m}vjuxh=
                  zEgKviNiz^#Lrbuzuv-p)$a~%;AmhD6&NM$~Y&JD5)F6r%c_?dTca0`HPHv7A_|^Jc
                  z5X*RSMMhF1)&B(wyO`Z3S&yC5JH08~?ASfS4-JD=e-asTokNlSplOR-Ec
                  zA-ylSfvj-7>aQ(gG(P2hEP=9b@A%S=L*V)+t}zas|CTGe(WzV^0N`VGg~&PevyO=iEq{IwTCO#Df}52_`gJ9J;#
                  z9T{#<@79##h|Z+8+)4}3l*yyE{&m4BHroHCIMh!ku7a4CUoJVl
                  z*0ji`MPeeEGV}Z*4gGm*e@>aNm^rcMpg7O~+7f?t+@gc0L3Lvp$!qZv0qH5DtthMG
                  z9en1`kCWR8H*fwK{4<%&d$(F8*gmST$?mrOpZj0Sjm}jSpPjEdLT)z%<&^h;<`Zw`
                  zqYIkrT8oV~2$~Fed}!Kj#d|>ptbUqF`L;Ai%kg1l5g&Dpc1Cg=Zih>Q
                  z2U@)l?y-I1=v&k#c?~#-_P9(I+|sOYlF);O72TDye){wE>wO*dJ`4Mqzse%(Guz%Zo&@MQh49JNPJEDx^*9=n_V!iR|w
                  zGg&+kqZ3-ccKjg3?YUKjZHfafu0yL2bP@dAfd>2suN)@L3W3{jydRD-FCqTD3ji?Q
                  zr8uzHlze8fwYc;SXGENIum7fSE+gZ8#3z*&gS>;D;Y$|BWEEY`C>u7vmam;uXXp2)
                  z^M?%I7vmX^`L1xxlWZ;GJLqDiaYnJ9S|5A2opP1~vSpawa*kcnd1@3dqGW3O)k1*m
                  zpZaV#?Y1JL^vZ0lF<6zSva!v_-(CKX;un(dnBsffOt+V+31+RAb
                  zK6pxR(%t!L7u_VQ*B0G!)t`{oxTAl(xMY#`-s-|b=QwhlHl`klcTpNZOI!pL4Jr+1
                  zLzXCa@dQ!AOdXOvO%j#bxAP&SdHw_|*`s%w?gAdGS{dwyI68{H$8!W?VBhaEw=NeA
                  zZ3v3&zYjkP7@0P4b?y53Sk~#1g}ku)$E6Tq`G@$rN=6)Rn`58o(ohq|ok+|CkDw$X
                  z2zq#aamZ2D`Rd22f$f)Qq}$>W!P#DIByM*;uI29gjMy(HmuOMFqGZ|_Chf?8o9idw
                  z^)#r+;zN~Yb3f1L@3H{%s-kW3ngSVXg#h{Ne$80jX{*_@Tejy(5!Sty%0KwdZ*UNC
                  zaG4`iPV6$AYL)7R8P~_Xe?D8*&heTh=AC9qpe`|%<;t!{wf?UhuU!Xx@x#|RP0(`5
                  z
                  zg2{uJ{!CRRj>0$ClE$7R+^JaHI3#7YuG;KP5Qf7L-{vfuPm%
                  p(y57%;O9L4hW{5=kYwL2;iLB4Eb-rk|IyE?yw!YD@!CB2e*sf%1Uvu$
                  
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area004-v001-MC/word/media/image6.png b/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area004-v001-MC/word/media/image6.png
                  deleted file mode 100644
                  index cbfc8ccfb1f2740176b40f5fbc44e79aa12602f9..0000000000000000000000000000000000000000
                  GIT binary patch
                  literal 0
                  HcmV?d00001
                  
                  literal 27153
                  zcmeFYbx<2&<3C7C3xy(umf~(LF2$`BcMTMGDDLjiV#U3_I>Aj
                  zcfb4NZsz9xyk!_By9vo|_IaLmwlWCLN10En5%1DSJJpcR2YAO787{yLf!w~@iqwC-Aiv)TMLg4KX
                  zq(p^P-R2LMklj?paFJG-^R8b>e)D_hanf?V98;jbrXEl6DJv)B+t=5sVQ<1hLSE-{
                  zz1VA^Z27q?^X(fM3QAt|W+uDVEV|U2m(r)6nLFQHPL8dcT(<}RGk8;TqT(&VBnJ$3d=?gRio0Nw4RSKzQzFrb0vnoa2(bC1U;!KAdtkSr
                  z{x@LvW%Qxj8@9yQmxDKODxXYGf}N3-04S8c1au_~&Y)Jziw^b~>KP)(<2!p7nHlo4
                  zx|%VC3#BbMkiKmJCOopz%<+Lz{6yq=Ie)ZOF3WwcVCTM7_a*THuB0oW&%;*Ua!_>i
                  zcQ;SIY^|AZ78=wBW@aJu(EBy+ZAM;8AMdpQlHKY2cl%RkGf^VoCE;szu3f0(Ezbso
                  zlyDcSr#kYh$UV`^JB{^#w)5fVPh;5(g79B5!{lEsIbXh9RD`H8)joCX^66_eF7O%t
                  zpq{MQ>t)8o!eV7{UtHdWyykQHwf1|YB*z%VR!8{x%LNsU0#8_|k){6G_}d#jupFL1
                  z6&+0k_*YS%TR2fQCOn0)I}-h9b>A@f0Lz}+iTh=z;9Q_fIii74Ggh0K9!Xof2v)rp
                  z2j>zT6Ma5#?qYb?Ie{sGcxPD5Xf#@9wwig7NIy*gH-F}0Sj*&c!*l642WchvMjK>ENI9==ZPFk83{8>us^N$6097DqsLsdnb
                  zP1sHWVzq7IYojsJ9r(GdrnB}hluUJrv5t&8`!mCghxK>BR~gr9-CJRqEbxpLaP1=g
                  zRagB{+Xp194&MKr8iT@{dVU<8&iiR^sk(km&fg~a-jY(atoF@>DN(NXci0YE$TZkieUA2LQrG3VR(prr*BU9+s|*2A66?Fm@^-G(T;L`j9p9Fd
                  z0;}l1L#BaYTaG!(ztSGY-(ihWuHnU@G3dFYL=bMWB2y>k84B9dVdFA&ul{2CRhBEz
                  zWVO4PO{NBJv4TIW`kSzN9KLwGPSPXpxDOmKsegi}R^9K@!
                  z;YgkhsWg`f$)JKML*;E8M`L3|By5sbXeTP59pU#rSn2b)EXdTw*Xh83z>o7yR=v7C
                  zZ_MWtVqn0iV7fZJtcRWt$1UJw8%%F-86WnKVtKNd%(D`qw1)nfKxBQ~dB4XbbUAM=
                  zP(aOyou*y=z13J>JaP{FjDZQwJt1UV62Lbx?kaOPD|<=QiT7TwbwA+JttC*k7;g}Had`m3UTXZ{
                  zvwBwwI&06S#CiiIF@rb1`lba5Hcdv4an2O*ecRvvd3)!0S&kF4**kh4=ucN?>`fFJoQ#OLdhLiyX06<{Ze#M#kBfU6Z&y`h
                  z4DaPn?kjB8*48Xf7yEx9zIH#!0;McxE+wM4j?0CZm{7czm%|R{h{p;{TEDEga%|R-
                  zz{az5ZK!Apk^|$?n>yjt&_83<681lXdJI=ri9OOO1O+wp8W{pTLPJ6_Ub$=;e{D2V
                  zV=@orLbeh4I<^u6o6&GR+8jCYR}ieo(_^=i6wAxY%W^0eJMG{5sl^(4ssh%ktmk>j
                  zj{nNoc$gU-L{^1<`+H;@1|`7)SL4%vtYvwQ42`a&D>$QbaJM`7c*|m9X#G&jMO4mL
                  z5s;cnOmt|?>S{_^x&_&*ncuGrFXka!1c5Dws?df{XO*UIw#X=Q
                  zXgju9nVBW!I)l;i^XLx!M<)Ga{V3PPn_H!+C0u&%w`J6Xk(zjC%_b04NFhbLqQoEa
                  zAy46wbz5q(-+~a`NiTiy**A{1lDEIEm`(MKZA^V>zic6CUk?b`?KkS7ilZWvJQ&w_
                  ze_Q_UHa&_~>}3Fy@I&8LOO!+CNp5RqNXVyZ?w+5(xA$*h`8Q>f|357iU2Xs8r)Se1
                  zYkns(G<@$)_Mcl|<8<7TaBS_CLsDM8KXw7?w)gs{Zj+IZ*SXUNg4#Qkl~1QiMEoDJ
                  zlZ;a2Gb7|LoWbz9pYCr*1kQb|7Ks8jXeo!H-ebqYJ>*8LmkGjFH)8nThKB6Uq03^B
                  zHuwWmso_Ygoz9twm`LDL2g+|$0SOn{=JA#{hleCbrlZ|q9&6QW3Ba&_LlaSY3pwFT
                  z(^&B$4Tlqo3`PO>*`?3s;94H3!s8j98n|h&Iyxj|Fr%UA?MRw8K|0?DzZP#!`1R*W
                  z@PTbcQha>Ci7$U7#{qNa0t^dhU`MpyQ1{1oAxMVr=B}KMMh2hnTlD=cajQceuLt4R
                  zvqf&JO{9^z_MMB|1)4YanBuGXHe!loqv+K;ncV^1JCjv$WBEqp{42#-?%p!b%^?kM
                  zhbfo@QQ-SG2Tku~x*5bHm!mFlZOGZ^NV-97r&p;at2+ljh17Mvbw#*6JS=>+QuYTO
                  z5%?5+C#Pl7i3ItFl1Ii5_N%WDwND>q_W@JYqi52$J>_MO<&xT@7{*j|ChhRCgOQ_?
                  z04!3_PjFOqD`Hi%?&e#&Ux9%J?ykpF1`m0ivkiP`-C=GNT@+fBE+;6xHTb>uTNVua
                  zlLNnmA7LG1tf|ABlF=$Pe`#CQFQ_Tm-1Ie6i#G$IS3w&$p{X8PV2Q51Ef-L)cp~`%
                  z}L#byWk@BKz-$;OAl^5lH&*{JI4AyqU|NQy$kFhU)X7pHC>@*s`Uy)RA
                  zrwd>2yv@~`>G)p1*<9fyhtvv1WcLy9$IWEU2?*!EG2fO-*TGWm=loGAtG@cED#nbn
                  z-8Xjcl>ezUl_WgzNPYi$r7nNXl;#bbw
                  z=DzofV)pM|2`Z<23WWL_Xj+bNM=WzjW_>*$&uPC^O(=6|LFqM!vu|rB{DJQD?8>EW
                  zsP9$yodfi?Wl3)-i~b3?99i0bh<;33@W`jLI>E}6aol%~51bIDD!qNucyJ@0P7eD{
                  z>sv;RS}+_ut{Eb8==|!7UsA@EFM!u>lV)=N%ui)1ac*#zbWGLEQHP?*YAWxz|$lLjg*Oh_NOAyE262543_UhJ=%r{4G6
                  zj(POwn=Y)zFIA~6*~|x&nn&}ahoeKzO&s+H>jTwb&yqu)4XNZCj(
                  zI&bNN=jd2s;Soy0ur6lH^#+&Q2#wGtUP2=_dn=l@v-|cBwc!XXg2Jr3P(iAq4N?d
                  z@5rSSPdf&tu6r!{zGJ*sQ1GOpp(*@_&&31Y!nQPG2VwW5M;(7-JO@X%2G@!Z*;^{C
                  z=E|n&mq4!XpP#Ze1O;UN%_w_qqE$+^txB!GKqkn)G($jorA9e$HJ13!L-+A
                  zms{ZR+IKkVMNRs~Wnva2BpCb7u52xWu3X5(qC~TBqDAea6TJ*gy<|lJFBSJ
                  z#(=8=pZ!Q~Bs^UPHPl^Bwnw%*6pbg*qX-m{!^VzXUDYo|_7BVV)%~kkmy|>)pC)~;
                  zygY#8xPH9!fkDe)_6k_blR2(Gq;U1$Ln2e1YJu_jOUL&YJ{y&Vr$R;;+lVdrWy?q}
                  z={IB50H3tvw2{fGmKLJ23MT0x*u_@B
                  z3LLZVGkjYeg>mfCIu^WTjFty`cAt-3zSuUs1kv5+I29jm%h;Kub>TPQ
                  zmW0MR3{XkN&lkdx?%+?aeN__50!i4}He1et!H?PFt4sWdWG#{!NsooM8_7o9g5}kr
                  zDD`}jZ+HX0R_W6+PSo{%uN2hXZ@{{J
                  zxoG$F4K2eGw+Q)CFys~K2((J~nQ=ojk?BWJY7ZB*+ubZ~Ly^>3ZhlX$nA4eJh%OmVmrY@56(xhis>>6v{MQHT1|i
                  zY)vU2o3$IhxLdH?{UrHqvp<0;G3YB>%gY1XLu8?0NWy;o)9PJiK5
                  z{L|!}rHApmV%fcz7uEPJ&jwOAjM&9S1wD{I$`?uJC!Mx
                  z;v;oe*5?OIN%ZQrxt4|Bek{
                  zt{u6;EA;YL&)UNeJpz7cs3aAU2~NTPn0%aB3Yrh2YS#C82MdaGRh!
                  zGKToBOpXZ=tXjN^)1jEd
                  zU||V3R-L^w&Ti|P(tVcouFT2c$NM*X{zHHN6%hUl7XK?CJWDmx(Y{3yBnhocS0ksn
                  zs(8A+>B!$%jhKGf3HwSG{2ti+2jz^&c)I
                  z7ba{+Ia|E`2;x@@4b2<^jJl^hQRuu?FDj(-L2UZ|`slj%Qeh<(jim7{HT`g}BXe2%
                  z07ufLOS&N85HrSqqylUTo34%3>^Hy+#T*-_GB^@-ckbu&G>&udbptY2Xun~~Pb144
                  z4#*Fs?x}S@$vCf$DXm9<(F50smPtAlKgpoZ*lo=OP~nMBJ#4>$F2NzkCw=kGc5b9!
                  zCD8uitJ&eg^ow$>SL+GKVwXc#z*QvS!tmjsQ(7d9jGS|t&bx4YZNGbpuKgAom@@Tv
                  z>{{{1F5vjV^IGOhqNL?7ca(s@`J=
                  zYibez?$e0hNrqFNC*3sw#GUG8{QMbThxa4f3dnuvj{eRU#c{|QM*n4gdd2?^bboJ&7?i>|Ci#^ekt@4s;^wI9_
                  zj)Vc(BdxQ+eMN4M*SnR-s-xK9t#n!L|2vd)(yuyZ^MEgeL6(>N4`w#(*x54l*eECl
                  zqKAxhb)!>)X3BMl;Rlm_Y{+X}pFOQs_ClUpJ_MSxFDkZLQ9R9CMhSv@4TrsOUu`%2
                  zCYVA?*bkeM=bad>86y^5>avFqfsT?&Yc%YOS~^9Lrp74K$Kw$)bP?2I!+C9W_S
                  z-rQGYWoIw1B;4L&lPBiO-3g-?d;Qh^?yRh#f{wc$LX68aZ?K0-dwGBpc(H$yVA14p
                  z-8{2ZV;9Q)@|-4HI{#HmLGN+@B48`n;mUs`wKHYvwTnR>KmvxU|{~!Z9-N%SFXc}c9AP?mvNF2
                  z*Tx8rgYEmiw%6!g5p8*R_QA
                  zhe)M;{*P%}49C7b_G&)Gdp#p#<=kXcc}>JyRrJh}cw{9GH%6Sw!`m}mSxKoL6
                  z*{agMu4M|g$`j;QWdJ$L#zf*#HD0$0mu((+!J6O~Dpb(IfQ$2IQ#Ga^-^h4fMTJo)
                  ziJYy!g5rIzYD_3NOm;CmCbTe2)=EW;hLeuXUi}~fY8f(F5cR?)e@tQHqD+*AP($@U
                  z@~?56{eU3>MCD9XP^9#GBb6zVhU$32RNj^O*>`xOdx`RsGN>!_`Qnnua$Pdc}~r^`$h0;>Eop`91154VUN|
                  zuV|>P{Z>i#Z_D@nSy@mtUx|>8>2!Jo-Vwee>CedfSv)hZVMcCD804zzE34vLiXf6x
                  zN~Kj>zC_xrM_TGf^W$~2o$@0yr3InDruyz{GNso7?G{Y|6#h4d7A?6M{tSRZ{`l6)
                  z?M+o|1KsQ!41_dFziZq4_g}YOAHMg`o*`j79eB;%gD7J2G}Ojeh^nlOuJHj_N&o-t
                  z|MeBPyZ*mg9}LeS<2aY~AC0eH$q%kQcOt`O%Wx+2wXd(bYUyF1u7FIIBsu0|N<^v%i_1DWkq{P&nVHrX
                  zTWmi}WOYACQeXzu-SU%o_;T=5i%hn6>eq`Zxshw{mRG!W%+bf34>vHW7Ibp*%F`>C
                  zZ;*;#lU33k!^7{?eXcw02eq80AMQF{3yhY_kWZFwfJuXOn*xu)Hlw~f=Z-zLLY$+%
                  z(4vgDN*4^bcicwP3PHChDE-O&9C&Y&(nNmjTEBW#pKVjFZSnYP%(bn~3F6u{DqW;A
                  z5v50xQ`iNrmN(cwWaoCILG|%rDpF=Gr0bN<5oJ{n@LhA<1nlOat-u)
                  zK6;eT?W`94dqe%}!y{`JyHj~0m155D
                  zcuYz6Ikduv3Fq6Vx-n)b*X?%gUIlqqAs=ZXcl5YX`i->m`vva5^|`gMYCK4av%hL)
                  z_t43gG3jk^9K*|#4;Q%a7<$n&=cwc%aMBDC7t)2Cp{CSog|2$1E3!bF1eJol6<;)g
                  z*4P05NbT2vr9fD=2aeu_qx?SAhyU@8CZ&YvicrtD94GweAQJ(VyHOV&?lk4R6&*iE
                  zN)O`HKX83?5xqPiJYB{p`|gdR7g-WnWl}}Sa2Sc9+T-i}W}>w?m%g8gxuUaBIDu6+
                  zy_Xe&&1!M@V$!}d;7WrD5QEkzn!%cVy%!JCib91^
                  zEwNbmR+5!W6O$#&W{ZOb9XL~~X$^Jx-Y$up1z+*w3ECVAm%8WWiHh<_65CV9FRf(3
                  z{E8_yM8u`DGi02xoul$bhGV#25i&PhvsatWQzKjII8N}A*1N74tAVEdw{*f%CmG!l
                  zE23P3kF{8I)0#ic*&~hGQuE;x*s3AjG9$Sn3lFotr@R!PcPc{^pCpgQx4wtp-?6yZ
                  z{P=yo<&ZoB)lS#$9vA`9S|l%jT+4)Yr;*1z)5;14L`N^&8At1jWc>cE&}d6+B4fq{
                  z9T^9NAS^F_Y>8`^fTq+I_a*qj-GMikN#IXwPC@|etKhy7y}XRpH{6fvwKG;Q`#`s9
                  zBN$bxb~UzB8O>%j8;s*jZF7Dfj#Q-Ui$de;stP$36NW#f(Y=YT60V}`1@zo9i?TeB
                  z4}XdO*2xQ;EzB
                  zZE6w;>aB2NWxjYA9>Gz4A?4$AQ2BzR^qw37g|R=jZ2i|Xl#(bf$m)t!9i){PTkpun
                  z`zLBT*A!~L2L$~tiz)2NFMwqIDh6lj8Sd(HsS_sdN{=RHVuECQyDb$ypt$M1Axi7b~sNk*d$0lt5&~@%l
                  z4_jkMD`)nO-^3tvs_v!GBTdb^wK^J=oEnkcAv}9U
                  zRr#mG%8$L{{!f&YrbB#2IIDO)$v6AnVAb|uy_Y!*vIEh6{Ckj!e6*OhZ*+HGV9BaR
                  zqj|4S*4DC`oFFG?ovwN_J)|&Z{ut||N>@E!Ptha=A3=FF;fb6%xw9)zKEY8le3RED>7nmOZ0nUGbZK}6LV?GCI}^99cq|-W0PUyNrYKV
                  zb2EqG!lkd_N#L$!2zmi4&E9A2K15vRWkY@7?7c&{C^sfDPfWr05+>0_fq~9>Bsl5%
                  zf+(`aR{g8~Tc-{q5skLj!i?yEGAb%To5#a^r$%wU6$W{!chK)%G<=V9o&9T4s0
                  zc$fafj8T?kiB0%@nIXo(8DV~*^pOT%!Q41cFKBMBk{Du$eFBS=p4-@V@lE_X@K=6m
                  z#&A7}V|++4Phx<-zwSGmfV>WgH11_DscM@90RYDMzhqC=_(j=
                  zu>**W!djC6>FQd$Wd~?=br}{JNZ0NRTNupzBz;3umKe<=vm2B
                  zmU7%MF>00`IQBYUenPoC3=@MmbTp=(n#aD*26Kpokm4ZmNw3q74RO!6w%>TV)&oSE
                  zjwG)W@=j@5sih=ym_TwhCXwP7zjLDgQc&sjkXGTqUxKOQkre4}<_#r}=I@u;5LyWr
                  zWD)Thwuvkf7=m{L1#PW*BktG|%LQ(xjHCOxVE=mfO%Zm=m%&ox%hVd%bUpP4nQhK?
                  zLh#2C)ucEyLHMOz+c^$yX5)x*5V~YyNyOOzITFpY(n#$PSYe)|h4T+`SpO8A18AU#
                  z8FN2=Wx+PFL+iw!AFN(x=QOg$)
                  znMl^s1)6djOrldR69&E~BEcOfSy{V@(he7iE0}MG!ZQTID8GF9h=_bLdhp@wtp9G@
                  z1bMAoqx&AUB6*-K2S(cZ)U50PLp9jqFaMDAB67@vm)O>SJ
                  z2&olI@~+vRTTImDk@7rEw_+3B99KDCeRw2p@Je@{k$-w1x!K&1zT@Z&QWce!Mx~q4
                  z%mZ^JC5C2tEQNIsVI}vIkx@D<`D8*MpCCWSJG)?bJSaY0o+)2iP6A6#sczSSH%>EH=3g&y+0g(w9j9$^r1eN*
                  zP=p>v4#U@%QCn|Qa#ymf->8~|#2bu1l0)ywpAJ5TtKs|C9#}{k4>6p&W~+p8bm8+B
                  z;KjW1x)gq0WA!n*_=wx-2I-K$Kuh5INWIp{R4g($BCK`ZMYsF_p}$6Q&(rLHz=cdFhRIUZ*lEOqqts4^MD{B1qe}vpy1of%*h27BMY78%WqhZkS~%Zu@#?C
                  z#DiM(gw3L#-jZC~?UQk!lX4nIm;6N*R6zzrX>)r?p|WsP1-aIGw%I9R@7s*7d~IwF
                  z8O8YJJ9dh>L@ibne2h)+(fh4emsbw5j#($w7Mr_g7Ag97x>5QZ5*iH;zeD9F(FwWK
                  z`AT7Ga#WNAIdr~!ID?x*8+W1*u>ex@T}k!&2a^63^0|-rs}?^L8w6uY17-gZHxT_H
                  z`7SS5hv|nOC(EV-$soZmf>S}8vEMx`WqoCG^o*DBB85K!a4#+q0;tp#dlH{J0b?bA
                  zbpxY-Pp@k5oRH|7&%1Fr7EET(#eMt*B4VsB@;^r8VSG-X&xR#Hhv7pF@Vfuo2-*Ld
                  z3;1u0;BtlRx+eNwOgk!Mqy1mnfl20>>T!#{(rqh3?uQ~5m!JpKD{;Z6p?Esh1b4K>
                  z(%`}oI>Zwp;0ZSBz?~vBpW9*T$}(FSy0dL~Yuf&BT%Fp`U+H7?2C$kGv%TceNWOmr(cLB|
                  zjRA(n2j=xqAUu|w8OQg^^{`GYGj~O{=vHyTX~VQxa3*Qc+R#}j-4-eoRDVN-wy#HE
                  zHoP>xQ@d#IHqfQHJp%x|zpeJgd&fxfWs*grEY9n)p4ZS75|iL^WSUtj!7U$ds$2B{5;9AkUtOCL*m`Sj2_
                  zkCxxn#EHYUVMeq$m+2|L78^7YDX*XR<}0IHXGS}TPL%YB+JHQP-HtqV7~s2lA`YZP
                  z1@7LRdpHJ;j*%16m7EB#a7m}wV)I!p<9jpwB)SJCQ4QC`ypMRTciVsO0&0KyGVLHUiJ&IMkg5YR
                  zd=T^HU4;7DRzd?GA;cU%gyNUL<%;FB-ZbQ<4oy~*6ZZS1KS^2su8_%A3d~Ix#N8RJ
                  z*7X;Yp5pUo4Ul{itJ|&(ak8YCYSWmqj_^?G+?&V}*|;8=+(ci)xd78`#~&BdrLzzr
                  zqG!+IPXkFX1DnaiS?42L6Rxe{j`4R5o?PAgx79m2&eN)0Jyh$bF@)UCyr>79n-aN5
                  zLHFxv{5bi`NoCK=Ewn_|yyZPRnQHAfBc&UW9w*YZzRGGcTZQ|=Eg6}u;Na#4ok~Cm
                  z2j;Gb6<-TKwV?}x=j=DcKWcsu=r1F|nvkv)(Z>QU2wQJz=)#Kqj`yd&1Ns7rtP;+C
                  z5f;d~O%(uIR@!p}`Kn*3s6G`dat71Io&QPN*fs?RP+*1=gK$9m4DA_=M{uJ`SKpsZ
                  znFP}?YY^*iEeN)1Co7Tfpk;|*(+47655)ISfiQ3(5opWex9rlbPNdnRDNOZtH&oB}
                  z2Z92qph9`&w~Nm7?gm8!Po?8E2imSW63)~P{Yebm$=#f|uEIKZXQpH=c(FnI^!6r@
                  z+x2PMd%^58S(_bu2axztg7mZf%kY>!Tiy6rFJOhS8e#4`W8P;4_$);(86>kY;z4Cg
                  zeOLZ-rgJ7uKx<~yxn^bDPrsAyZg^APk={p
                  zu+@BSh}Bi9rl6{t<1WOc9oF8}FJX7-MpaVsaUu&ckbH7UKW1%>Q_lR|K_2%F`eZ1T
                  z5@b(?>JPTcE2fKO)iD;zn=Qfwc}C{{XbdDJ1yVO2fk(Kai1TZum$;noh3g=c~^IY{Ym4awy1{xmv?vQ
                  zi$My3bh!Xv+}@!!I(LBN+?}ArMUt_MqO%uFbBy>(q+e8)WV7Dn>dZD&rr+KIHc=ZM
                  z==0E1Lw3a}_1lRiGn6tF^f&L_pW;~WLHR`bOyI74XLY+f*%}M~B)1~(=rX_fU=fK!
                  z;m$kvOCAezz~pLNJb=%)Y$Y;nSz~C+QpJ(q>p&}@bd-k9s}%mBpESE*bdLH}fCTVR
                  z`9Kj#x?2XLBX@mH2=4}T1#ie&8-nYj*YP5golEPCVuHA`CTuXZSCLdwZI*3=96!89
                  z*LEO2d7A?;a(xqto60-0u3i5{6-eCBpwDOAR;uniJ4r#?ei8#;`gNPH*W_y~iGK)I
                  zY)PAOf$3RU@ok}y&gL{P_od6r3){l+rPj&i=UwK1l2a=YXo${|+PSd2BulpUYt=1~
                  zuiRtWk%Cnj$zGL8pWVUTyt!bwjUSYS2h2-%p-Ql=Hz+OTFGG}1RrJ=C^bUJ}y=C=y
                  zih`zfeT7q7%zpyQvsS2KJ=*qMOGwZbp*oT77l*ivv>v=sPpC>;1j2?LwU!Xp&872_
                  zsr9JsBenf3k>+W$_aB)Bz*@`>%05Dmcy&k3rbSt{J*8QF!iDp^uAho#tQ$G%Gr_;_
                  zUKWr+=|YSh9BL*G(yCX(d6v{6{mRB8$3HPw7z+c+`F_ls{)(J*)<4%_;pK;Z%*cq`
                  z{|$P#Qu37=o;11NsYcr=QKA?_CjSyqL;m*_Jyvl*2<8esSmCt5T76fa0^n_jQ&N=A
                  zsdd&s#(MiP7A-uF-}h#(o=)-Q>Yf3(&Ll!mZ5~PF7Zn#R)pXLwoEgISjQ+`2`23*AD6@P-M2gTYdOkQWb(upNe4XM*gN$uEU
                  zvnfrvp~>0rwZ~NrGF{_ubx=zaADne)l7TVFx-_4lb_x*EEKz&g5A^%)dMs2s<4=KH
                  zWf@659r5N8&(l85cMkR-Q>xt_9gEofXz^hn*aF09-1K_L8Ch9fLDX){A>8hC%3SBN
                  zamGH~=Lt!pIU0UEpQH|M@^>cpegF$BB|T-Y!gt%wI^vme+oe+P`_mSOl5Ee9_V!Yk
                  z{65Mnk~-0M$&vyzOANFM5`Qw|4x`KTsw~FeJ?=iDVrsX>A0#d?P0U?DoYXUo!TDoJ
                  zDe)ti6FA-BQoKH?-bgwb^jSjMw_k-+{DY09yc~G<$l8Ym2@4chYj}Z(%WvDl8EOHuC;ZZ_=Z3!xx38j^(9)$?uXdzQ$@Suac{AI6qM6so{#MoX
                  zqMzKmlg31~i$2a+aJZCN0ujgmc#*hZhr>EeLJTseYFR8ff6u*BBRD3vVMawpr|E(*
                  zU78rUceOrII5{@=&i+m|{+KNW;j_RmRF7TeV;s;|Y4XpEe=2iJ|6Cu8fRZjR_hDkr
                  zUnh%%Z7%Gk-Ksm>KWx9^muB$PS;iTyJsl!4*RH3PKfARF($*(EZyAd4IqoBEB=`J7eWNBc3
                  zmxc}GmfWh
                  zEHy$VE4^P3sU+NKog9z;QNs@;*Z74w)xc2h`QF@5M+H4=h;H}$-y5Ro$GHK1+r3QO
                  zv!oPTjWgIy&^u?Vm*)>Hj=BS1_Gs8*&Y|D2Mx6AZiV1sKi~(2^cyZwaAoF*@K}%yA
                  zY2n%`z0?ZF_tzq=gjE?VwP+J{kGu!*Hj-iQ=@4`P$+FRjp{O@7PonCWviA_;A>WfM
                  zDJ~rl*X*vHdFMzigG8hJXJD1K-$fFpEt%8_2!76*a`NNjJx|>=%k+pM)Gf&*gdjvs
                  z@vZiKQNHp-jrvQX(wV7>y~2s?arG44E}vEXSGr!-xyLYi(4q|TC*?8I9&?y53dkx{R#PhB8A
                  zXBu>=kyLfl3?$vg8B+lHzsLJ0Xkb<)y{-7ZBQ(S1*v5rdjLAgN1OL@O#YK#E@!G3~
                  z^_~p&cX9_FyZ?|LF@WQ(Sm_mc|MGo|npkllq3wZHiKLXXX8%S_53c0aO}BdR;1<{f
                  z9}Wn$msE(7m_*Hy#X=+!xgTNn>-xAlb^BIei%*S34vLLfoM4*>2NTESq%(k$J9q9r
                  z85w~IV|;r7m7r>0*CQHmXe8Mk6OkPuzu5|A_YQN%TLM9Vyvslkbc6
                  z-#${;f0zk=_oYU;5$0-N2SRU1ycS?KDY42mZpye4*GWW^1%eG0Pi&GY(vq23HF?x5
                  zF<}RqZrY9JTqtNAs<2MBfRXyIl@i^kJe3AwrT5$Yvlu8yRBy@4<0g@Oo3+fGWXpYd
                  zVoVOhJ|jp=NkIdg)s-r1cp3U}d0RdvIlUENnfS6(bG(w!4p#01fw!-t!t3OvD*Nq(
                  z7!_2dUcgYOMtZxJO(MicUKM-glj`-@=5vWlS4AJF-kS1|>6R_Hy?)`Yb7FZUjk^!P
                  zOOZcl1e$-y%bhP;hLqJzU*ZEYuvF2|LDhEGO`>eW;PY5!F+
                  zffrklcuz7vT0;rTZgorJ%Os}t!v2#I?SwNtd=s|8d!_DEd`!3MnyCvykPeNrO1~4q
                  z)c9#>UckttI+|3LWn5@wv9fJnRZ>NL7NM^~H3LtN@phTY-T0@y5>`3r$PYin;EIDM
                  zHS;r>mC{RpY3MP~BC)%*D7$@ROx>AC+8~}Ot}OMiGZ8mt7!iF5{9aF6I
                  z$dBngm=~pl)b1^Kj6f5`rM*AXEQR25+*r_*KRB1Y5#ynMu(5fxRU}{VX=x=rG0{S3
                  zi=8DR{SWVBJ=4$4n|A{ARHfWmdY>3RM4>x>X!_xzBA|Jfv?5zJO7FgN(&^sm!1fLx8b?$xmx~;KgYHe&hR@x*Ns8%U
                  z)Dn8>v>q`X2?>#ci0$!-Pz*X{-9IOxB2m%8MDszM`5+dA0?oK;LBtYq+23*tIF|F
                  zu2-`$RTBPOw3Zhlf-P%k~##pL#ung{#~7ERF!RGcdiaNxt(pza~ZKfA%~{WK7wOE
                  zf3G`_CD}1RmCo}t?g7)P{yZp#E;``P_khaTY8PviO~=1++tW!)3<9xJ^$`3$C*Czsk1`Ug`*j4Hmp4?G6+#Ep)~w8>^NipuprMeF}ACWBhY_){Pu9z}EZT
                  z%K!Pj$@&U8E?4usr(@%Vo>%MNDNtM#+Z(tNxWYXJJnU|Y_#Xci{fu94QPJaXh0<*M
                  zKu_qpdU;sXuwfq#$N7P0CI&nCoDP
                  zpvivObCm)6DzSaQbo@LU82@RzxR6#3>0*FP3Ez^!T?HR5_duG{3K)@Us6C
                  zZ3ABOD;D{A7U-@V`5v6@!@A*eM6|NJWr%TrvUfg6OW`5?XoMdZLU@+U`^eqValE^-
                  z))z(t*v7zpFcd{hY;`7mO>uhV;I?T(%1z`Sw&kEdi;Oe6)$p?30nS-6r4z8Soi;pq
                  zKU0#mXKKt3l&!-kJ$Z9viw}37yw+q})Q|rz0wv$4dmwA?y>JW&+uOGQ_Fn~xA*Al4
                  zCUZbIc9%~G<}+Qi{Tt}cWq*VJ;&$hyQ-R@eoxQ6&K^wZ{<*TF5dWr9vu_r1znEXAp
                  zX_W!!{z^>rxI3HN18kvudnChGZAD;acvu|t-RJb$QM~u+^=0$hBtsUB+NUiV7r+H>
                  z@99Bm@%%U=#KbAl0tTi_z!ePvh;cUPqPa+si54h$1?c$-{VLjh^~Ew4*V`lUYn@e4
                  z)2Ypp54zB^3-;Q~#%NXs^!N(z)YM$ScA&-xXzpsOpZmW!-km9ow@J5MaYr{B7T<{4
                  z!nNCTV31BY9ba&L0!l5%t+Ce8t1@h886+6HbGga47`;u`KR4E?J1wax*MQov0jZiO
                  z&}mkC5kN$#lU-s0BaU8h)+xW@N#dcbHiT0@J|!nN0YxZ;7G3&^rcXXMd)&t~1*;Py
                  zn7h`cfWmFC<~j&_GVCC)vH0kxH_6IV6p%H|i0JI6kBTR&L&Uc74uL4Bx|%q{GL`fS
                  zW6nw6oTAqnz^u+!rP}7U&5x$|oBc;QI{>%%5QcNs(HNor7YHTMsb7v=-^4VLr}ov|
                  z?l?@}-}RJsJJ;<3Ez?RzBR(7G#nkCU=0d{-&{vd8O&_P{
                  z{D_+>_VhcAAMz;iI2|zOYcWJ=LFCN39=f%8BdPR>yb($JtJzRgY$9T7R)noqkc3wFKB;*3e9VSF0M1o9<0i8hH3bdskL+l$%%lLhGCE8Bt9
                  zNh(q;KmUN}x&nQ$A_NA^#^xG%^kv!EUx;(fw&`xM~o8Q9te63wMMAsEcp(W@JkUmd_ukjFHL3;Er(olOMS
                  zt6RR;t>R
                  z)6|k?kTrjK6C^g)uOc0FPv5Z&)q#!e@)32`mF#7&JYE&e_@l$A;wvOfhTm$8=h-UP
                  zwQmGJq5xSc?h*uAxS8GK9kF-WU8|C`FEdaeH`l$oW{*6`JXWyYzcjkpPtA1$>T!1$
                  z(MEQzhZ*Xz7+}x}>j|GCZ=4RdW&s~Kmnp~?aJ~xrEu;AC0
                  z=#5=)S}h0Jwz`TeB-+n5JqP$ye8=MRdbECn{eGsjt^IWZ9ThpR2glQVX&qZPhSJ!u
                  zh0aC<3`st{PU&DM=;jrnHoATHYE-LQf+5@SqP?(a7fu@VG%3YcXp1-_nZ=zhjmRHd
                  zSf6`xz&Z<0%8q4L@4@n3*3AKEeC-j&r*}UJ=_Up4T6|jPSj<`p0|Zn3tmc&M)^g|*
                  z!TiCamcE+AFfB-0rCq-m&YQ9+*vaHmtFu}qk->nk3
                  z&r;}xV!}1Ls5n7DjMuI9q`h8&U=laZyV;F%9EnFwluyQ)Ogg%+ad$qnl)W!JoU~^d
                  zOqvPObNvaqer+}1sPmdeQ8l|)1>2s*s
                  zJFj6K7jdV(y?0`vFR0%hD_~LeKyspwA}o4|S?xXud#gNgdY@@SHdU13LO_bEs$#<-
                  zrxusDh+JwOp0XZ(QCj->tDLfVO^gLd&XRFq)*^+1JSrtaJubX+)+pxH-FLY$wRWs`
                  zr3K~|```kcp6lI3zZ6~o*qyah3F4>PPt`A1^&G`JJFBbwO}Q$Z-?F!GP*!2)@U~zD
                  zhoq#G>=AN+;_TY$6^M$-5pnp|)BC@b_mx3$L~WM|!5KWbg#>q(03o;pg1a-gySqCiK#<@%xVr{-
                  z3xm4{cZY0~efO)~+F!d>`)jABYPx57`dZ65&pprSQ7DDN0O96?1;o5L)hfFG1ch^%
                  zt6lX|OLO0*nwIP{?t{N_<|KXJrsDulMQiF1ia`Pz_cysKsZV%?)uCAtFmK
                  z{z%!m@qmp)8Irl6ANT+*ITr>xSV
                  z8qspo+E9!-{8&l{y7G!BPJC23@@DE{8CMgdTIn0;5rH1IW3@5Vs}~e!3lvB)!JjJD
                  zMOKIzy=Oc#s%zaAd_~=Tyej&@?FZAMtZ!HvTwOxAG^rjq%al#GPDO{IFx+mv_wzGB
                  z9YgF1=-?dCqOY=EZGAfE8gNb{pEWFz{*a__v+`38I)Da6aC3Lu_eHa))nvL
                  zMXx;2aZ+vzB4iwzO4h{16eXbc(nzd_vm3NGG4YgoI4N$LqEtT~@&zq`#i9X<5jPo!
                  z;sJ_z{FGbBO%u@vY%M?wU-~|N5om~n7?ln1Q4^t=BudAAQnuKEjX^&78@G;(j_s^2
                  zOvY=d=q7zaZ01=z)Le>-T$lrTh+($yUYxu~70G~t{t=Dn15Um@B~DP0
                  zdG*3IY@Hwzog!^XJ6Q}JTe#9Hw;E7m$iP-Ygp3!U&^L;bF><7qp2&Zn(6#SqUbfT3
                  z2veUfLyt7D0i?BMo;ALSm+c$uVuAL2{Zkh3ed==(MdZD(+@D&%Qo=Wk&@&ym&Pmd=GPAxbJpJL%_Eu_c0bTO1xnh9C)
                  z^!D79Lb}4UVz%adn6&jTc|TzwP+SOmS6sOisgVpHq#so|4xF2M8z@nHLkTHrB9AuI
                  zOj4fsl;ofI0YH4Zn@}&Pc7r*nwXoj4XSP#WMMzgCd*#z;*xq@>xY%cE3j5da0s#
                  ze{OC|*?tPK`{tl+7j+z6!G91zfo{zLf#Z&3uKb5i*I4p*g$j~MaT2CFUlALaeieCw
                  z+Bas+z-+Q$jrzOy9xgEPwGiC$QSE~)(LBgdm$(YQ5S^RkH)$1>0j`qizx~l=*3@AA
                  zT$prBvSMjfm20l=(RXkk^=vbfpXo?cjB%Ksh>A6copgFh=2014Ae}v0D(c+I+ZlP9
                  z{aouIQLpI;S4@GrMk+gzhxoz&ggVW>UsG62F8zTyJ&)lBcO{uf;-SE(w$lLciXccj|JJtV~BBd9JTpVBn
                  z0cXR6C(L=)P<%!qgk&fsdQ7l7yGaw!-5Wfxcii@rgp_hmo5ttB1SFV*0JB5BDELJI
                  z;S_b5-6|6W4`6L*)sgvQQ~_kRWSmwKj;%RX+#3+1VlZT;cu~(7pR1Snap}VK3sFOx
                  zpFkCss{;E$?S@(sScL5
                  zlhR-AwwpAg*VVnR$O|a-1$mE>tPUl#|$G(ppLa7J}4S1mqsa;nkWdBagNl4
                  zbF?xo;_WvDAuy{c-bp%_nZ-qQCqsVZ1`rVu$W1~qlGX3`gyD^2YuCn!v>wfSJ!nJj
                  z!VCf
                  zCOne#Ml|n|*oR6Y(*#e-xmK@79D^TC&%;$3Hocy$;}%3VV5ggWOUdk
                  ziS`q|m(&M=Q7+r%BIc+8?jrY&
                  zgon>+#TIBChXL-7(_@f@^N~@LTc!Yp3nqdSgIvN5lqj#}P#`d%?
                  zc_q&V^KOVQ-T1#*ZT-(WDFF&T(txP^yjOtZMfmD&M&I2pWTspH=dQgX=`+BU
                  zr45`1=z)s3W;W2BjXE>B#*c%S%urz7QUW5jrBGwnh8B;+`%`{8HAz
                  za*sCm_S=%+q?Z`}_-IuOsc1Z;Pn7%nj`HTwDqyaAw8#kpaqMhdjL>x=TF2G`ib!~L&-W-XpXCr@iGTYkcP|%I!
                  z8(mnD3Fg~87a-X1lA6xPT`P9yz&moF*PcZXk(e0?B3L2ba1_dq6
                  z_=m$1ooj1*O?e-@BKOz)PS(Gf77SR*@h1D(l3;BWBI1>>d8VG}0GHVG40vh@#
                  zQqRwSpSIOPPoJ|K2+Dn*3QB;an{MKS>w`!C5lN@QS3qyWFbaYgIJmW!BK
                  z^3^RWfhU_&52;Lw3rHfs)^O+Yv&`Q+(dJ?FHW#f}bE!yJ>RE;#%mm5bz}E*I-Q6d9
                  z58_{3<-`dHSOFrz8qWCBFlhpSIu9Xd*ta%%a_Zc!RUBmXwSW9+d312XN$Nh}|+C6V(T9
                  zHPeqj($g)GTfH$*_gnNgcUD!1qk&@Hg|WDU_GSiA#wg1$c&w6;Z;jmQkSnB9?tUSu
                  zYor()()dQXI}46UP^Ogse7G~GBo+r%QhzBjT*v+};lRV>_#`3oBcUn*KGk
                  zdAuz2i@7C5p;0y{{bm^5dQC$HQ~vELqvcm&BeK@wa^>ySsB!s~C_od)DbOFZu8sq4
                  zMP^1no|t)q^2t1?TVi7(`vG@u@n`pxa3pkCYm2@E99wpG&0DY|>}IPnTOWO-vZ^DH
                  z)D7*`bhqKbxam$AA4n1bDtY^5f`8*YfL0bMmBSx&ed`PTT(uS^Hy~f4EX}L696zoL
                  zhvrgO%cA686r0+U$3Piztmdmw*+9ulSu^l?1wm(=m7Vg7Iu7C9gRSvG3z=2LFdYcad$Fcr|;B$Ncxb&{8!ueRMjiL4Bi#=52^@-olAD
                  zJ$xKR%lbJs4W4uW&2UkZY@ts9F10BY(V|
                  z=R)2%_&7$Wr)ly002`;4CJcD&cJOOu7By`glL&v@%|1cVA0
                  zCnb$+Kw;K%CVlguB7WIxv=Gx%N^m9XZUx$91W})1y}7BbhiK-*?n9ZPO*3h8&(WW7
                  zL-U8nHZ(^_U^$#6R8^UD$@G-AM^o@ZNOfB6Pft;UB$oOrlS+ULKSDhpN3@?@dLbz(
                  z@XXgYVxje<1^22I(S6NixwPnJbDgNhdyg5*bnp52@P3^T_a>GUNw&qKb`(>x_&A{^
                  z*j4wWUQITN^y4xKh-@$Bs5rX1dGM@>Yd04yZ6z>_qI#AmP0m`R?ACPsQ9yDnfEy~3k!^-ld4sBFRriS=#y_0MCv-uA84#r
                  z-EkUhOylCJy5l;FAsXFx8TOxCHmKf@QRdjnk=2c76cg0MfHxWmE9)kGaoV4+`F-y1
                  zzAx-Fw>VuYFK!Rd7je@hIn*m!8`mqOYxhAdT`LVXDY3v@h|hW?jfqtXcO9h7{>JoU
                  zA3l-4!D%Btbj-a19kK
                  z#1tt`Y3F`9uH9siDH$0N4!E>MJ61l?Rec*BoJ=`?6B!fU2)Y#fKn^eOPkXo(<$
                  z$$ZwCoz8>La7$iLo5JAYR~mMKr3PZ{{we#6;$3)n3WbBi>4Fx5l%#g&+&Ac%u%KR)
                  zk8=lGC5WiMp@3Mp--UD!IvTp)76m=XQPEZXfmT#BZ?;+hqw7xQZGU?s+I
                  zbhEFE85+}Lpg2LExT{tMTl|oi!==Y@71=P~sY+9ElU&K-R*+G$j~$uhS5IWm$6AA7
                  z@ZAq*RV?M&(ZSFBgjD6p@EPy%Css&q=)(uQ&&D!omnG+h%dyscS!BR;pTG^9kl0CN&^P1S*&?0_ZfpK`NcbMM;@$S_^;^T2X>E&cv>~q>7jEOEO
                  zf>(C#kU9Dm?XSIZ9{1sdFnYiazFbz#K^7`s=$QQ*3Io~1$&ETS;Tu2DeIyXHX^txS
                  z_LO+zH*bT1IdUi`XLyO|8z0(}+bW=18Z)Bye0Y;V&YFD_MlrE`zfm!^ao*H!=Tyl;
                  zFrh*bq6weST{_=iwK2Ri^qK827-`;H*1E&$3Maykof8Y%@$i0hxlkS9@Y2
                  zZo1^eH00O{OI951$wfq`=BTiqg_~QXhRXPCQK7AH*SA8jY|K49ike8iZ)}E`U9gqD
                  z68`c^;fe55WAVc7QIamia43_fKIDAEj${?kz+5Eiy@I
                  zdT#5A2FJ)wUxl+zMvPhF5_KuNzI%L0HIpEcAHfr)meN2!D3}0+7B@t^00F8X)NDGw
                  zEWV4TYjMASAMLaqZ1BnBL<8_dqhbYajt3S$`zK=C1<6LH8`ke|x2IkA_RicaL}11;
                  z_VW3`;{sanp4YwK5o7xD!sUjU^?(a~kkmThs;Wys=5j~BxpM@GsbUF_l2$hCrjbT=
                  zU}8fOXnsp_vZmTMQ%gdS806GkQ~q?=?6q6_PT_k(T0Y3Y*>_iX*g$BC+m71juK-+K
                  z22)u=UJ>>%T`UB_NRw^TKp0DOg
                  zFkRVYmtWUZ(T2t6=0`BoFkL(C+F0j{0l4cfPQ{4UKo`{iQ1jDDckk)0>K>u~MyNDJ}e0LSq$vCfnP!MR_+0e=T
                  zzVWy}lE;G|&D7kAH%1I;M&;WLh41o10pLNd4EYiF!@%5WBE@1PQ^_
                  z7P1tnTy&9?D5=R~^!+;1J_}+5#VKTIpDC6neIIlvTuvf6b;gxAGMSOogwjJ}
                  zdkkhIs3S@%ER3mfdIq=ufLzYRwNoR!^}$QU?(QSW&dTmQT(&I%wyGK2I>W3WRn;Bo
                  zgi861wfWWr1_Sq1%F5_W$L{cA#Dh9d1FLw<
                  zB9QaIm0MkbZK3L_DxOBbJ3_{|Xe}H(L_ba9iH$|%PQYIMF(hgsQc5V4)uPe2-79AP
                  z*10|j@~HeehtQ^Z3^t43#r)o`ng*u>%WmLvA$0}c-%~YGk6iywt}bxY
                  z4rUUbjJfng9ui_I$1}6J-EyDcyW6sbV0feQCvr_j%$1h5%{Rjaa!Ab7oaI)uAl)jZ
                  zu0d%y6E^;3N5<=zR5sSH`CGw(+)7F{3H^mEjqS+?t_l5qzjK2MW#%k5_6;vO9p_s*
                  zySnkWG%>ClD=~L(GeUz8*k&yfcJnH$PP5Lqzy210=!pFqjs@H1Wov8jaZ)DX>DKk=
                  zQf{*CY_J_I$I^_l`cxDS`Qiab#$Sh6sj7rAJ_+RsIyrW`QW&D98OE!OkS`sDYulJD
                  z3fMgx2T$l)y3A-*Oy2A7b
                  zYkxn&=wxx?AAO(+?p1p|=eYKf3gIu+8-TgKd$eRpB6oAZ=PveWf4VLkE(sk$dcjqQ
                  z*z070WUk}mAJ!2jy=xj%Kw&TVzf1IXcg@u2R4d|Oh6xpLB_+UkDMv4`Cz;>>h1wc)
                  zI0N<&Z61EfFPj6T++
                  zx+fVi7S>10QQG1MDCl3E^BVK=x3ipgNAcP1|6(tO0zkFI2Y;S)pr{{s76Fpz%QFHT
                  zP@mwBydZ3jj?Q}vrawJA9fbhs(X~~C?sNDw4CKyVEtuVjy>!icnTX-opG@RbTsV;(
                  zA0ta>c?Xr?-(Ef6*@xqBW&w&~drWXl+9I+Fh8F`=|(v
                  zOHfDfU*)L5bCqxSyghnlHX3){Z>eI+42Cw%!{h`}`hlzE`oSh5I=Ux^?MAt3I}3SB
                  zdC>v3jqy8xE(7RN9Q8`co!x|_AK)N{!`JkU80k?+;NtED=}5T9aeava&bb8(RwsE*
                  z4ogMV^orlFUr36eZ4(HHQB0R@21Mwh0gx!bqQ5ppLh5rqIXxd9XGv05quQf^B{;^I
                  z{yp@{aVH~yL}xZXklM;>6pBppp;h1^KAy*cpOo|Ii{T+;pGNQNU#B_Sj!02TECTWt
                  zaHXXj$U;zuFn$%1zcTegM?5Z9W14C*mFyWt?jRIbX$i+VmtDJ&`ItOzx9~R0V}26u
                  zo>7Fy6@A6;Ja6>WHhY+fjlL^YLq-h{Qia@7_)!E?!RDVs79
                  zEm^w_ck`-eS#mmx(&)#SFu|@rX^jX9a$;+h&xrO$DBrBJ=bS8y=e|cp{x!LIe-7Zq
                  zU;P(y*=pQmwYEyHOC%|*7am(y!l+HVmzF>}eC`JNtI~6%4se^gd|Bs9LvxUh?cv2=
                  z!@o&gu5rVnqGU2Hc)*M3m71l)wJdicrdyfl63mh2AJzL?Jajp
                  zAl2UNrpdd@5;pys{Plgoetxs<9&&5dK8L4*G4
                  zR&#EXwV4SC!GBIjIFHcDYVi1kD>k64oRck{Vz6kaj8247|GFyMy=NOvDRnAO;SGo7
                  z;~^M285mk-clMo^U`v^8gmC0}`ZaS~Tm)M=Z=(a0xMXHd|B-%h!XkPFhj03FTy&IB
                  zL%qHW4O(oJt4q>my0KyG$hJ0v&&kpIP9}}TOdolu=>RNsWG#G|`S
                  zK(wQ_L1Pny^#%=}jRuY>-w|3hAuuB;3yqVMVz1-ogo5nPOd35@BI6By;ImR_xN8=4
                  z>;@r$zw6r;vb%APU{((kis(uIn!nhY!!!*1CK4~Z?e$bfVsUGlef>M-_Q(B}9wUmJ
                  zV16d@N3R~_-M!RjZ$;?yn7rju-bYX8Svkj1Ewk7eMz%GrKQ{7~;vwSc-QY&Ux^#;q
                  z$3bl@Ru_mSB}yISunnOUBQr~E_u3U?I1F;!ng3v>h=mnDa@wotDT6->E;|t!u(6~=
                  zH(O?Vs=6NwI_3o)-QdglU$+xE2#Y&^%g2N#Dh7Jc14CNQ9GUPRT4`q*#!<)T&(hSi
                  zRT2g;`E?0Q1m~?Z&icQt=g@O5k@7{meQ=}&X!GBiiQwmh6T}r#f9$%wqRgD(A6&+JG1{TA_XvA1%;j9E_cioVjOG*zZ~toe!wJ}e2tzXdi?
                  z>)WvM+Zoi5qfqr)w(XzN{{@I{f4WVxQjsS(#p-d>f9qvrhaEtgC6W=B!0q_TtG`Rk
                  zmX_#0RkpXb)H2KS4ab#}2Ah!=+;a6)*rP>R!$=7eM
                  zNl~X#hRTweAQ?e^Uw{8odB+foDo-X&GNq9)A)KBz{(Gsz%%Aa^;ar(RN#5{tkz}47`r8@K;lKP@0@|_&Zj`%pS7vqR}sYsezC(4)I?#S!%#(
                  z>XEqr$3n_Cvv8DRN*#Wkt2ce9zz1QtEC?|1
                  z^>NvU;)^HW415!xr`mS{enAL9#W6t=OrETUppBA^r-QUO@xJ=p6-QReu%V52Xt?h`
                  zT-`0SE2AUfj&jk(??y<GZucTQjSbiP-3vo(!9)M`EB|u+bnPgVGt8bp;A6k9hk}
                  z>S1%_{@I%?&rIk{2kF(HsiH5YEycp9u_OuEE|os99y;oW6DiBf08&$JBopRP%BScy
                  zIrsX@SbBYtobBi>2|g}%eyP~FWW;t2kkH<1^;MV^nbvXMX$eQdgF&@zKI(r^Wzd#_
                  zw>^&{UlNOi@yhjFX<>h!XFk=GsMq7Y&p;
                  zT>;OHUiTBi3r^~YQVr>ptT~{-b)Y@#7M}Uc_!DV>bL&i5hHYCT{&RMVXJmNiBK2P{
                  zo!71WG(U%G3VTRX?3Gun??5k@@c+U4`NJa_tcVP%Va3=x;6Y5Uq{P08mJ90#{5Qcl
                  BCfWc1
                  
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area004-v001-MC/word/media/image7.png b/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area004-v001-MC/word/media/image7.png
                  deleted file mode 100644
                  index 9edbeace61b0a546cf62585948322d203f426026..0000000000000000000000000000000000000000
                  GIT binary patch
                  literal 0
                  HcmV?d00001
                  
                  literal 39314
                  zcmd43WmH>X+qMZsN^vb(++B;iySqz@yA`(#Mj3^Y+a6I+l_g2H(T%R53dLBUiazgGWk!vYMEFLoz|-D!pE#&0<-n8CE|v
                  zYy|SM&(kC?%jqzs&7;2m`XuCHt@CEp=fsZ!ax)m(d?JHh{WHKkU5DQc<=E-4jBxL5Nr&LPB$ZzgPwB#4><_;%HV)KT2$ie
                  zjR;b5csg=&Z%I+PFD38H!!9MJ0u1xCHp@4zek-<@gEh@P{;!*k@l`OZco
                  zZEyX?QEnfk`<9pAG?wA^26pApYWC_?*1wpLej2+TNGZo)<>2T6j~ko~?9taWvT2Q?
                  z5u^4NmRg<-_qgm$EhskIA3y$l5|}O(uN4?QyS%V1LkHQn~co
                  z2&U4m@#te(y{C%OFOXiuJhS;zaq?C$ddP?5M7=qiX#5O388d&JV`h}6llo1ZjH5!Y
                  zST`p*In)d3=?qc~MnH@ViHf2kSa8LBV2SvdOFUfPku<0&{?r!hdybC523)=A%(9nw
                  zaUKr=ymdcyERdkRW}Z&d1;Ork_m^dk1Cy;({ymOAP{m4B5v?4DWbEV^Nk6iKw4<1K
                  znyLjE$51c`QlZw7Ow-Ti=^7lj-~|Q8o4UXGqeA@poK8jUavn$^eux1Tou${BU0EL-
                  z)?<6aYloZ<6vCO&SKB_6UURru!MO)aK0jDZ`@emhaFcTOWLUyx9sI(k>9pyF@SeG~
                  z0(>2zPIg=3i9c7hk(X&{W0Uu+tf(m6&diU2l^IO8#`WjGrZjk4IqIp#w7&ayj@F?P
                  zKieVrH?3h^VB4u`F_bZngaophgv8%sK95JTXB|&0{~zr=MI~P|Ak1$hk26pa;$+k+
                  zHFIOGRLN{ijM2tJRv2qPNvdm9HbX}Rv<52+Ggp5aMW?i1*^G-lUU9zmr6rfxD@&p4
                  zx4?B`dA~l{3YF`3tkS9`y87H)=@`VGve*NWsG*PAKC-B?4N82O%<#kr3Ua2G8Fr$C
                  zP*E1|E=dnuc(e_Hn!KNwZVe-Pie|G-LDq#}&w|j2gQdnw`^2Cw;xer!=|=i%-)VG=
                  zPU+kk&m)_4I8G#4%8l=`snV)5gTEs
                  zTV|;@|9JTmH7Tv(z4?4Y{5f!js?wcIuDqrmLGdcP)^^fwwWBAGhlmHegnBu0zC_g2
                  z@Rv8{dQ_ZST+-}$(og&$f81<-?Afm+M?*@$M&xdKT`j`YeG#^*qXKDf-_rE-t{}iw
                  zxQ51%e`P|)&T4!~IO6AWn4udp_Ql72>aBGtB}{$x=9)YPR;;>ToeM?ZT%Q6sjmZF5
                  zLYmFuV*S2?C8IAnbDLC^dOjTTq_ck$TvUdPD&@$!5W>U%?aZ8*qOTae6quJr4%T08
                  zzhHCGhSWMQM3IsgB%0W#aG4BusTPE3_rCSJF+Yz($*Zou>3`DKC7_VAqv2Ma9(MBN
                  znqGCB@5MoaEG(|RI46*JU-1VrK-vVHNz`fPMMig-TTl4e*%Mgakmqw_vm8^9=Lb|M
                  z*-LXdiTnE6RE>^${q7x`Lw`Vn+tq3EdEp29`bC_So?e@Sk(^wHLtfO6Qp0-mrV|8}ryd~Qhyq_G?fRNE
                  z1eISO>o2jB2ucm<@buAkiMx7nZdgQwP^g~)s<<@qz*VMd+t9e7lPp}e=+o%#QgKia
                  z@h5+MLMbU_Wloo~(0ljn>GqecCmPB^v#FZCntBdVuvS&8(21x?)BpjSZn{`y)(MTIdmPN?{rj*7at^!w5dDFLuEytj({fK%M?=#__^&DXdvk|6p0
                  z^^I+lV&*GX&*njGV=eVV1w4J6{r&wCBS#p-<*O^#Nj4Pez4In;+Xs{f^gu>wRbs0n71VvuiS$yZnj5SGPGI5S93wF}p=aO730M
                  zF~I5EyM#e*f*eqZssLYDBOPIb-5%^g&6_%^MabLor8c390AW)yDq2p9jJf(rIKpl`
                  zGFH}mvj<<w;x|K$Lm-5zd8SJ^9(}hYu0njY0CB_V-}KJ
                  zWj?ZqmBT^W3?Zi4Q2C|MtaSSPcB)a`xxr@RLT;qN^92T*$tGxq3TgX+4VUGs`JkOK
                  zkuW|omO9MU(n+@bpX}?CmwN~)6%`88@6(=@)5H9VFcjlt35gdry96LN!h8@S_)>L>
                  z-3LV6Gp!_Yo&&5eh+GSOKmc>dMzvp6J-`4`D5`>?q7mO?Fu!ZP=JY`Cqn@nh%a7I_iMG1H%*
                  z?=kGgh^Pby_2hlNx@A7a)_%yoOv**{u4}a0%X29)D9!tQN<$H6c2pvF>nlOE%9cW>
                  zDUw`Xc=B8&cvEY)qe)3wm~Uw7`S(OuZae@lD-fr=s=%7UaxDAwN9@%WG-z7ki(KnV
                  zZkq8xdP0hcN#2izw9C{Ne-t1d1?S`-=cCQ@p@nQ|-i4vjp^1z8-5SRBM9h*|9qmM;
                  zWIm}*O~9UZ>mznob_E^t!)Sb_H=aNZdGP6-=|w<$vo$9`XP9NvI$jAr?d@Gb_giC$
                  zDUOLM0a;FlZH_d`=;-4|Y_+1AI};DZRQ0AZlIOoryhi5)b~hE>{(egHm+x;6x+><3
                  zTM4QhZa(7*c=Qf3J==64E4vfe2S-FeubryOX`ZE3wv?p~lg^h6d^}pd
                  zfr=xhBIV-x;0I6CU%T}a@5)-z&F(Ok*zbB{<&ITHpRjLk4E-8T@z2SpQZaQsJwCne
                  zdMq-sbG!##5NE|{^!wxHt>+M)m5aF0^%Ml0k9GAx`Saqq=7IYpBvf)eTOIdym$~H&
                  z-Rz`o@LV5H^rcXQ>XuUYmb1q9I`f-Vgm;SQ4<83+K-#rFr+%v+cUt4qFhNXmPUdEkLhb;s0w5CaiJA+=O
                  zu>GLdmk3u1#S9mMDF3ctXcDh{dj{^m2LVw09_ynBYH>iw4$*1cE!Nqke^UzG)^Wpa
                  z+yLwk>DT>1K28EF?$^?$x8We75DNmz8dh%!D);>?ZJ0ehk6o6oXlf%#R%>4__wE6G
                  zNlmDkd-q!0GR<1;=IZt6-Zhw;jeyoLoAX4a>~{mdQJT+VJl$KcYej&f<2Ens6WHf^
                  zRocz~@sppn{%W=MkZPlY{i^?4oRQ^-v*O$$Wo-`*$h}$bQdt>Dp5DSSH1$JM)S0^K
                  zYBQZlba!*pOl9|Dvn@}+2F99=0UpUUeL?Rmcs#N!HQ!jTF8og3Jw27=}sge(N8M*dZ9MrFjc3REpxM-bG3g?
                  zB}lW`5Ax2HZR9a8m#dFrq*aF&hzdd&4{ca9)xY;{I8U|uQi*9k3YJ$4*ZJQtQ@Joj
                  ztRs9&
                  z8a;y&a0IeVZeHOo@L~O1iN-t%iYWcgeEYHHdzR8{F41u(wOXlhqon%%4P`
                  zPt|@(!w*b+h}!SXPwjAH<)hY3QI$`9YS)Fh-=H89JJts_M%)YY^2V^}k^k!*?gRKf
                  z^T-%}S}0WAAR6`dV2POc5V?`%n10YVo4<;>(t6KaQ5g;Fy!7hh(VC4Tt5`zZ_MKKG
                  zZ|~i!7}d%$!RzOFz9H}7;eB!iJo8N2sHOore%+>DC6udAzkXTZ`wi1bg@>XvC1tVM#>{A&7xayp^U4TXb)jkHZTZoX&o-32rok=s=bs3l`
                  zv%Tb5_P0C=?vt->BmJ-_@kPN)SdI?m2>k=yFf>KO?`G$rWPFGwQX-}P;75nnB#1}T
                  zaZ5S#EQ9fcR-;l1v!+P)<(LISs(^4^bmEaR_2^nzE0S>@u;SGIr7rP#>ki!~mWL&c
                  zQoA@DdBXCuM8aiht6ygnwAu@(+!8toesPiSYeg27>Qd;jcgm|nvMVDH)FRS3yV`8V
                  zhbP9ypa`|OwY!z6-sZ=rZA(hhZ2cfPDBXFwPZkAF@Yhs*rkE@md9!2m?Gkdv-@s!3_%4N$^as6h4X4hvip0yXNZUQ+WN=oPy`rjL?
                  z2F#WQeBID|ZmX5|(UOwX-xaJ0qe;}ivS=r5epM1LUb{dM-D@e^d5
                  z)Ul!vYm?S#oOo1DDP58TBV`qa9Dun@Lu*)=-#f9ZyE{sXjZK8MnEzh)o^?32oCbw?
                  zBS4!&B(%L8RP`XIB#Q%X@cj-EZ<6^cD5oK8#Tc@ZWECfG^uDCijfKVYjoDm@uTt!%
                  zm;1&3?NW{bPWgwnoc?BRj856tJTGxat`A~w9fG4TI$^5qAJPWBfdj
                  z&1pF8xW4MJpiNZw-*z`>b#|@Yj*1E26AtwIZ~vWxp%47F*H{bma0G=LzprHG5h=q6
                  zNVwbNx|q2s$;r*)$$=6*5lAU+hXzDf2Rvk?r0^tv!DxhpSjZnVVrjzu+cLOtIJkjU
                  zk2g=W_LdetSWbjq^rK@;BMk|?wt&Ce{@}*47a^TVp#MiWQ1$;sg5TxLq4tEpjPaj`
                  zrqwIJPJ~-D+5HRdOmk>(Sb)4>bwmMt$m$e0`Kmwd-yr8VO&`w~`$q5oTLJDxbY=Mx
                  zfIZd*ey-Z9G=#$`BVhdNt}z71No*beTxa98_&g_o{Qvf?0m8tacR*%&l_v6!s*Lvr
                  zlSF`*hJBk!3OxFs4@#cj0V^2&ni`a0F{WKNU#s&M7x`4ffwD&Kd3y$V3T)42u_2EW
                  zE0syv=84ep=cU>Q;`bAkFLEPpFQP;fSxAyVBXH-hVBm|m`{?$Lu=$pPlM{L%Qn#?sRLMoFm;C}DDJ`G=I@w~$WN51JCb6GvKRg(-blF||tXKIIP3
                  z_k#g~PU&Lb?3ZxY)y_qu3WMKx6H1@i;Eb5OCT{G
                  zN~l?$Y?m!3t0ehZBHzJpnXl2Ik7*uJqs;;u`L?72kaHx#S+vhcS(T1$x2GamS*Q9O16D+woQSBE1jiz-6tR)(lczNCS5%nCF-dqC0di_
                  zp2B{)x43$YF{^f}p@N)VZQzw=uHylMBNNMTgZd1x$L%fA`k(=^rQ}oIW&^H3TkKaeZs
                  zB4JH_Z>05<#CEOMs7xBBE4_6NBC)eqoGSZ@Bo_g>&2*e3Wu-M@lo#KLgmd3vW9JNf
                  z$;QJY*hc>STdTJo(r3byMdP^=
                  znVP<%_XVVoaN^FJ?;uxP96ev9FMnpIhcsAS+*onQ2BA*!%~)t){QMrfcB!TOoDJ-K
                  z3K1ACF6tdEbF?2;o3^Ubjm2>D*@0qL%GZ~kpu1BuWhZKqzSNJ?rdCt)Z;`Q3nels_|s~f!O2+Le@--zN$?-&Iq{F
                  zJO$D$o!i;QuJFzO{i@HgXswx+6?gUHlRR%%GAC`ikKrIkdHI5NR5dS
                  zE}i}{mDY$_BE=X3g(s#NVq&O1@10`Xg*`1%8J-tM?2qH6lBa!?ea)SbXHdB)jRz@iE)r#kWxVaQi`Ce?ax%rXtRkt;lwJN%9CxCp-Yl~kjQD)Iuw
                  zVs{pd`lb;C^O&ktc6E9l8WldLUC?bFk>Uy!#Ji6cG0N~#Q7Q?c=0l2Sq*GAYeEp@z
                  zIagd#lP9%p$ILI|Z|2LXzE?=sA*e0vEeWAgMOu##5qt`i+{9}Hj~t!)6_fAne;?34
                  zUuqmemX)n@SGmlhq&YMlv}5>tiWLVP65ZLZu1Qn5)hVKjhx=
                  zV(X&`$*;E)=2RdNW~%E=Pf*>w${p8rLK9!AH
                  zisXCTUks;7DF00^(!~T&(qSAiG1VLWHiVV;CG#%wkI;WfItDBG}ByscSc
                  zCDuUyoRmVn>$0>w+wjQW9ED3Mi^p%j))Luh%)7_?Ifc!06zq&gTBx^lcgs4XCCu(s
                  z6tpd1N4D@f*+(8Mi@iRuH#M_tonPQFgBZ)Hsh6t{ZlWIy2e2uNL(J}V6apglo6-rQ
                  zWUncrCW(~?+(Z=$I3||+6awCZBT9qQ#n_viIk$K+KtvE!woZm(eSFXiL00W*xfuaV
                  zK~Z`yM`|NZ60*|603}PdZOZ5+=|iR;X|ZGf-=_5Ky!Y>x7w#Cg?ugQyPe?#x%{c0~
                  zZ1^Ces1C{*IR#SPseZZ|b){TP~H27XfMcuaqeX9Z;0n
                  z8aEXtpna7{WS>ke+&*(?ypNK*(p9uy6Q!g(jHaYwc#7)ZcA%j@W)^`-P$N=`R6!>d
                  zOO?^NpABlT1J&Tl((~#kvg5rWTBZx`zsdsDvCxeq)5#V^!6x3r)!5h4syj_wVfDAo
                  zM}^xnjXvQag*R-`CaskXU1n`pAHrKDMyJTAp>Fc9fGA7FG@%LOhGY+v-sL68z)llN
                  zv`S#MT^8&LfakDG#g9BUGFEPEDHD@pcr4L45|ag(GA&54WD6^JJX37n6b;ml>yus6
                  z#fl13$m)7v{-n{!x`+7|D@v&>{|)wOz?)oFH-i0(C1q(ax$L)3z`Fsb-NZtIsEfBz
                  zPsPo`o3+Tr>-W!+0C<_awiKl{S$}1&lQZ`+IQ+=)*+sH!jnZ05n`-qGhHMuNR
                  zI3Yg4c$FxMkz3iR-47S>-{6?2*zb}_2HARE!Kam9)-8;#g-~ku_(;a
                  z)akHeY|yk@fTzb=8{0A(Cul1$&UHK(~PtqN|&F|A8Lz!tYx8RLCB3wqquJYy#9oBSZ2(09@j;n+8s
                  zqnCVQ^|>>*VDk$QiFK*e!O}
                  zq~Ad4Fc5V;V&F-_6t71ICbES^3n1C?3&LZyQ1~G;hO=r2+^UmdY
                  z4h}lYo1MI`8LqPbabRBjIwe5b3UO+ZRF7rF7vd+I+hFZTRC71P!Y4Lk|B~9?C
                  z4ra_&hqEPX&`k&QjeMx-m-bzW!M6p
                  z^Usdo^0(cs$de0S7)S6bbcN-rSgJFzL`U=;3g|eQbo$s+aWR{f!&OL60=#rJ)`W2n
                  zqgZ#2X+~&!zpmkuFBy!j?@!C)#_1!wFBh)W4PDNA2xEe=pvU-)u)e5C{^GF89m+T24R?v@T*-K6iG&uf(FkgFynNKc;md+BfzuY^+q}dE(sCFy~ZZzANDT@
                  zBrzyyjL?VFdv@v<56Crl+2LcUFGJ?;~=|I-2OQslp9_v*L
                  z*|x>-P&4D&*eX4Y+>&F%gx-p!F5K~QkkI+U^~aY4FaB{eSK4cMn^M&w9DV1B7Th(!
                  z`;i?BnpefuxDkpka#O%JR3vTxt`1?kff*BMq5l7TOm_znD??*UGtASPlY3_$Va-D4
                  zzyrEJ-o0V|D-LJZ0!)fvohl_n&9WzYZAW5kTAc`?m9)SrHrXkOVB<7$#)@>5_8@s|hKTkV(
                  zG>KFmd}Yn6rjbjj(KP=!gdhwls|}~ZJn=$J
                  zDl%OY6Mk&n{}>#+`DfECBJ?V&|5@Jb?1%IP<7uJuyh?W!g|Wc@_^t=S+vu?$&;~u%
                  z=OlEM^>JuZD?38HE?G>kqxqIvc2Mt;c>+t5Y|T!_yu+hq`nRnu|IC{q#U9(DA-Rfw
                  z38m_}5yPYQbw@k~w}>h$*B?6;=k|H6v#$7{XF{HbymEVi9=pshg~c)q++4tFcI2GJ
                  zhn0^c(d-~y_7qK|C%U>`|01Ngu!8RijG%{lzAco+yC+TSj^}YbI>BbX48+W4>)xY3#n~qg)ze
                  z-ic2#T@Nnme<_60*bf2W!V9Zk*7unK%i{ZPYm|s;dofHeMWTl7yrsFHMmWLJqWC2#
                  zw|s@}G`8lUeb1(G)t}k8(eh<>SXrP;FEHo#%n~GtM8IgX0U@$2!>vRO+_*CLSQ_(d
                  zRB5O*zt|t@=PB%Po$+E+jF9v4e>>F6+kUCvHIy(h$wE|PCmQy87g5T4tyK)*5^v~f#=8pG;Z#RK9Kd0rT
                  z^DS|no2;#2_ze9KqnNs%<tM{}6H!$U#m7p>I6a7^&9qJ|s$ilL(0jeeukKyT}n`%Qqsc9_u<
                  z>YtHTX62QkIa#i$x>otBhuCO^?Wn-;J(L0Y2SDT^DOU%pqO72k&=e^
                  z38|@7nQ4iM#e{pC);5cbUn=?EXb7|ZS3??U_Wa%2H?aWQ`IblphEc|alb_dSHF+Om
                  zYL*{oN|M$GNcGN7pOR0UU2zT6L@iZb>Uf*1P4dFNtuKToOwVG)5OsX_H?;hF^78rR
                  z-Mdme&Lh^NBZaA^6x*seA9TDQ_hwwz^wHbfZieX>ycqeRtdntFor37t*ijn=aixB8
                  z5fRolv>v?S@PL4}_Su>Q1LMj3!lm;=rryTZhV&n`druzT^iuh!mDS4g`Ly{tKCD44
                  zNpEkyvPE#9*mZGutZZn3j^o2%^G53A)CFaE8aKwzeS{T3tT({q9U^B804Bypjk$+BiKtj^`TCAiK*Mc#<;z?
                  zNo(ljPZK8UR|U<{bfR0c!DKyOXCMdc{{4&ySip3SY>HW|9$ygf`i#qAlA!61RPzZ2
                  zs`9dBV|VK2rBIno?Fy^mgFjCLAcAK2sO^g~xqf}Vd14Na)8H&I%Y*Oo@APfHn!!Vx
                  zi@9%R8AbnXsn#f8mFs+5G5GYA&^L>T-SdWjyNDAyb!cVq$tf=}u>%*&J2Jk2^_pWXL0W+w;^EEqjZ5Ju@Kj{#m#fgsSE8@4E
                  zbVv0byjSJToFW9WHU#)_thQAwT@S_Y59Xc4G%PT+s=MJ%9Vbji+jfE1+TOMb%2|~^
                  z8xZ?X%Ke)xOdjfe){O;YZa$u}iIi#}T1jxd)NqCBs{{-9NS4v~y6@oOy>0HY1M$Y5
                  z_Aw_65ya=^;MmNpBr!zB(DAV2B8+o;tHvuO!d>RvDzmy_1$t1njxo@Qm69=ces?pql{H;%0g2JG}d{iWytnj>uLk5C*OahFX8vPI8layP
                  z?&~rTi-9<}-t$kfj+2z6+A6oUbi2W2yb>Qe3FzzX1#BQdDbd96uPOtvGjiF~;tWLT
                  zn$NV@kQ?k5%=7bWe7^Hp7i?+Q1HDt#Yx@603o5>f(${+D
                  zHJWn>b%0|0Z=Arc5H!>N^eqIexU}ylz>aphx1)vk-zE#r$NK0nT|tPAO%t3{?LhLO
                  z?RfBtFab}n15*yWIaK?yvc*$aiwWE?Pm=9@G#K)>c2fYSZ{PL%t?%Qzt~`LR5dY^X
                  zu*?PXUY&c?=O0|J2I6J$;6w-c3D)dEMy=L=qX1@k8OYt1-)x6u(fLjemKb*MyA=Q?
                  zHGhkbk0imp+nC#krB#=kExTmpA%4w|=GDCi{+Gp)wRQ<KO_7>oDO_1*3IcnMgJ?VshH@WmpO~#h_>vvamgf@0_&D$^bK(#p4ag2>!aGQi42~#zD
                  zK8xWsog%8F(X6#hF-dzB(Mjg4?gQK
                  z0*J~IDRS3V3xx=4$DP`XaWa5Ii_ja;{5tBM@cq;~wM~WSL?@Oidv8E3#a??@IIHxil=5UAR3pD}y&rUD<
                  z#dH|lFx!p$}xAKKdgzYaRq#Zo9wP3XQ)!+irq4a9|
                  zm;VJ3`cqhqk#sf1DQ+WKXPQb)gs=Y|mv5iqrga|f9WSrx5rP69|6_~*bRF0JS_se5
                  z@AU9LiI-~JyfqRkP67&w$Qtq*9?zcUCZB8&q~Ffs>M`?{83Q)eiUDJ8n}dW!V#X0t
                  zhQN7PI2P6{`Yo#xT=}B2)#X3R>b)?H@#Q4LE4JHF^LVLtFXP2k0#kkOe#@cUU@
                  z+WD*oO&N9?>629nn&)CiUu0?NPpmXy>*dQD7AyMV$I8rg6Uu9djZJ3;U45^F$JUU4{~?JNXxwHO_-zbr87Ste
                  z55N3;8tDbRbii}jEO(sTr3Ign?MxRJmACnwtMRx`ud(;=t4+a;dIbV4fwypP#$E}N
                  zsJ69+2qP^t1EY5+RQ`0~UDn5J|`X_slR(a2Y)Fs&YxAznc%;=-iml8iv2QC=?Ncx>gIU#~8b58QV&&49NSq^dBBJWx`7z$E
                  z14237($n9rXkFJ;u|TOVrQpV1JjN3iI^NU+5qXPU^RXA;>auV*OnbN0_f~!y-t^|s
                  zFI;w_hw^)xUuvexr%{-g#5Yc}2$8`7tr|m)68o2XURA`rWV{L~Uh|0%Tb<(IJdH
                  z5``~&NrfIUL24ksXMU}le;*^*&9%Na&AjZDYNb7K_zF;4duwL^WtRTnx5{|vlU%F$
                  zk}E_Q+)RM08uU@8;%0Her$oy$pz@(vA>Pz{il0g&47*@(o^sJ$Na}Qz?knENvrQW2CL$+UGo5y
                  z{9|K_eKrTiys62K;da@uUzi_BRiey;8zjHK_oFg3dY}z
                  zw{&-#hPRg>1A%!ssz}{ZuM6BATP>Et-pIe-5a6)7O3K8-7EZf4rH-XCSsi~;%?Fd?
                  z;KrqOyL1Em`TV`xoeiZ!1a8(fI1tzRHXaf0a_8MVdGZsQzl>Gz=RV>76jwtxCeDj=
                  zi(j&`va^-i{mWw7O>#KLDqZ*9S5j$=j4>CCH?J(^m}QE_VZ7EiHMpq)TiI3a4;MGu
                  z+mzk&Q|!&GWA2&k;dX)ui0Z5*R-mB-A|oc
                  zx6NKftReU}HU8e=cN>t;6-cmCRMh4$7K*dNSO@ThlUUI2-lPV}5Mnm`9Y8AfNlRSn
                  z7&pc(q{L^on2J9P5PlGl^3zkTaD{wL(+`cCHZwN(Sa>$Xh&EBmTB;Uybr~Au8Pg18oQ6Ej*cgsG)0kW|R6G@0kkA1retPXM{e3^F
                  z`>DTOEW6c%%ubQTJKL2`!f{VJ3_+~BR_bnRD)JG9P^`s#uYixRQTK^oTNCbs`P=_H
                  z43R_oe@j(b!p$`#04iFEp1Di>zf)+P7Ul0%dbnQg#~H}jg15c2*^<>r6tIF@5XGx@ulq|{hG5la3oPH-;-G&GtytQZYr4_$8dj}!O)k=R!f$GCHPb&kmu
                  zH2$Oq7Ih^4*KLLq-et9Aj=R+KeE26-)NK!ydM#!fEB9>=!ps-q)&6fawBu;L@s+~s
                  zee@i5Ur$Jg@Wtpbsh{spvt5}b%GBhc}kU8vWD4+4?vA5Vjk6RKKG~sC&eXIS|kl>ivyI6<`1z-RQnZ8
                  zmF0$Fe4vXupX08lWT|8@v5&R~pFT4%z}Ml_*bn{+mPih$>jq6mV`SGQQG9)Fx*tSZ
                  zjCV!XdY1cohMupp(AfguMjX^=*XWlc`|r?d<{H*gF_?!%v{
                  zggjqiqw5{L2S}xFHH$R%;r(;YQ0`93;vat#BI8>LWz`=|1q3Z*LPA`NJ39jQ^He_{
                  z>fI&duOq$9jt%re+T0k6+ej@=KPG1WXY3@st&D~Pe+88U#oNp_X{Gt7yc)kkLHs&p
                  zadvdQcCkuV#yv<@8FCmXN{?2#?x9LC)cG>)e-$R1$kI|tPW#JN2h{yNp^x5V8;@k3
                  zoA#3AC&0w8QqDqQf9tmYhwnV@)Z47h!P)kcNWZkR0Z_TYSe6g;`1;6`%f~zWd}LWy
                  zi1Ez$Wjj$&kT_a7*)+#w5|fI%jo`YB2K!hHfe}V-tWYt%k=~-C)OYY(pBI)%Qwt6D
                  zkB;q8pYp}n0rqGlrE#Y{c@KX$L7F3AI&m319+kg|WVPSvM+47A=pZI%L!k9E1FQey
                  ztAE9i-h8H(I$0jT!E5JSnm8#;FmJEg%Eq>!U0^g^4h@(iub>%@-sM*8Eg_p(v~t%C
                  z&C7)QMtHHrXSmafhsq8?TO@6n2by_#>39iGQWLl|IZYEyQX{_)^dCH;wTac%eInj3TyY+#Dy1Xl!oB
                  z>B2K@8}ByJE;wbl+hJ=Q=yZaYTClH*e|I!_r3MiheetL?l>BopQj~Exe@Zc2m&{@r
                  zH9xvOa>-V=o^(`0TV0R>=yP-Ne^P8JwRbo_vWsZAVGc$KF9F+XyPT*Cm-y$Dw{@zQ
                  z@RN#iqrvdycbXZqcII{sjwZX|M8_J>b}K%;5ywUlL;;@`RPS+ZI_IjP&~~gPUVX|r
                  zBmLzzKAwa*5!q&W^lY>@^z+NA+CkH!NiRdVAGu%gV*plV)CCmcZX=EHNxxb74sl-ESF3lrD80mb?x6rPz_h=J-i)
                  zwJEAqH(&k1Oh$3m&e$lDkwrQoB{1|Vo6XM2OH(!Bm7()rGnt+lZSkN`i&>z1@ECE_
                  z`QdlUAe1|@ckejj1x&jQ(S(eYrh2t@5rM9N5sA4HJsCeTO2}w}9O&iCGl_SZ=@c+#
                  za=u)HxKw}IMNmu6M-5jbr&GEkIj|0g&!etJ93c1rz*H4F?&6OzGMd>#jor|nUqrL+
                  z71QqBv*!GFEWZo9=lz|MnzXfr(X{RO7v<=XE_hdpvjkEorJJ(7GbhZ{#TcxOeK6;u
                  zVSF?^*|D>^G8A4n>`Fd7-D_bSBiU`B)h$RHChA`*utLh(hs(2w
                  z2E4)CT`1gXkW(MJ01CIM8VV=eD~;BtsTzrSy#_z=QN}dL$RxXc0K?rKwXpW?WL0&S
                  zjN`2JkAo`m!!Nd4pFX5$7~#i%JHql9tf*sG
                  zk|&dxlP7QIbdMW9)Mp6(M~fABG~6c4x=lkbf2(SJ1+4NcnoSjh;R!_8eGA
                  zWMt5#<4P!M^Ah_JnC`mxAUtK{X{<%LeJVffNV*+}nZf;4GFAR&cdP{P@!CD;sf*(-
                  z460hYn)5Rnm@L2XTUU?WDuytw?}f_+HJQb)4$hCej3ou_$$tN38Q{}}6=9Sxf9O~y
                  z9|BsJ$1e;G@J9v)7Ny%491iL%y@r>(ay{qTa-#*P#Uv{3nXr~e);-TeAD`v1t_s!z
                  zjuCq9*IoVT3g5}y+kBb(WZzsq+2fF1!DiV-GLeI(E{sga!jvGa^9;r0mWSSr*>jNYN6a7EFEC}f`&iwP39-_4(O|_#)_!(2^fMY!S?&Tm
                  z_-+{*!jXHuE9_`cdG1Us$QfaIv%1Qe+sWP#`em?u;<%2Z9ofNHL7-F!XzyJ{-q+m8
                  zKN6!&W{Ku3QZqGgJ`oqOol&3}bP!d+%K)x}cZH0ptEP4Ww5)&Cu+XK;7Yn94qpU}e
                  zyDwW=B!NNil8o@sWQ{;6al`TCd*zjGWXTIx6{8>uaf9n8d0>`UUa>VHXzzOGB>z#C
                  z7k;8;7km}*keciM(A2C|X?o#0urNru7{o;$;(h-0q8Ofz>5eHk>*AuLfbSSkZDzZK
                  zb3FqAExZg}<^n7c1tAiZ`-tCtq*}r=f-_xS|1zbjd*w$5?(&~idHl|aWeWNf3(~Is
                  zM!|cB7%cvbDLR5z#T-hj`pEfsniX0QBE)>BYx-EID8xX}>%0g_(-1{xJa=_b7p}QV!Kb
                  zkdT_%_<(DTq@cse;}CeMR-c5e_Wq#xc6VYuf{+`_>9C1ROiaOj($S_2p-h+=1Eer?
                  z%)hYdOVaIh|SwkN*wUASz_J=!H{P_M3qFzfnxfFGkyt?a|e*cF?H>784U7T~D@E
                  z>{(eh%}E{4lxqe;wivA0W-}K|b!9ft%e!FPI&YTZbF+J0g_{f7z6Y}ltl52q%g{*c
                  z%yb7(R`4l@eRn~+MR!%-l-v4~hQi?hHgz$X*}bSjU5JMx+i*}&9U6TD`Id7XoWEZ2
                  z-9_fM=Ky8*QX&kBA#T!9TyjS3No}-CEC4*3&3Le@UWVgXUG${E0DX
                  z-TNiE_9TtnKSK8UDMcG@ZsfBU9qg7c%a=M0F_yAkc-}bdZ
                  zR&EXx$q`+2#Q2iOr}otC+hcKfT?F>0L?+p9QIsH-#5sG_)K^T_*k^(2OV&ThJk36w<3W2fGO&E|iivf&vLgcOi8ENT
                  zBXX3b2nmHAQ4cf<&~fA70yVD!Lh(I;#-r~aX6~xHTl0YwI=>1uuQ)@(n5uYFEDFMZs%Xkt+dIby@
                  zZLwzr8bn5kki8kt#eblGh`NO&raMwyFB@V#QVv0}#lV$aW9D+(p5rK`K
                  z%h8Pkw|~EdRNbx{KZU_>wv19ml2R?yVhk->#C+xhrrjxe6$ouHjHsjPqW;__Aeiry
                  zr%;B+UnnWERf86eGono9y<2Hh5%@tC5N*rx3tnoGbOcs!Gyb~PGQGDZ@`*ggo4yOj
                  zaB~&tWk!bTjdsCupLPfg?jk^S|*Z|r22WcgS+%9f?Qg!%k{
                  zN&-im)vK)#lYRO%ZDl8+GThQ-ng4$=_f}DHZe5#bLWJN65+D!=1a}GU?(XgoTno40
                  zK@;3v3wQSb0RjXq+_i9u!lhsK{`x5DIxjqPpSlA?FC58mJGSEj0is)-{4@u9JPWQQ3VjcJU8nZ9Dq@VAIj5I
                  zAZabiY3qH&t=}EQTB?5rthbOJ0vy<+1#dTYUqnljbA@2(4sZev+LgtW>pYpsFd=bmhxibT!7U0ZG54w)co`K#*E@TqfPzi||ik
                  zK(K7#y~OC_mP$2DWh7OU!~Ujt9PQq=xMJ9W1IPl<0akwK1pwt+`h4z@tQp^UpMB85
                  zfRG=yHG28&`5ZT+95t1bKaMIQ@o_w^2F2VNOtJytyW;vs*d_>q_so~{H$FMP-Sc6X
                  zW(I3Cocvz-T6PXf$zwC9USiXkORIBd`t{5=zgb{fJ&1?veLHG`<=9D)rrp4KUzW4y
                  zi)w(mF=>x}vP|u&;a{E%4iBu1dClQE)rD2z8WiT7X+Z8_jdqZ!yUN?TY)rzdh+VfmiN^W0MP|_3-By6ncZj|ED?w0=c_&$@&H&USG-=h#kTHi=L@0&
                  zWJ5sf)#4!~Ww|@GVc*oExjvu;$|{kK>A`yH*=)2YQ4`;bw_FR*w?qd0QjNUI=e1jo
                  z7JnoORRqj9f3ohciZnX1oSz40jGWpfVL~5rJ_{u?-y$$v^F0}v0q!yv$Vb_o9o3_^
                  zpTA*TGLgZq#T?Mb)JIF7zBkJH*xNU(g=ot1Wolql&c5^?IY7+;%~KeN+i`yv5aR+^
                  zj0^=06aazGTAmOhDCYK}G__cNn&|TY;XpHr7UFLj0ES-6QtbkOPU!Z?eFwvk=d2-M
                  zGHLQJtso-KTi2C*8ox~LHix+(L87=i6$IDfa9LsLTTsn%p-Oza+(FFl_
                  z2=CCW;ZzY0Xh#To(X9^%+=>?{`frM9^brGZlhk&!wE?3hH*PHNrH@zApmN6_z;hJs
                  z>%%)`>*u&^e&;}hh=EAL$M>->0!MKysy^YJukL2jZ5rvMGhieWeMEm^VgR_9)0rK+
                  zp`q}}EQBFI6$tcG4{)>2E#fF&V&WmCOK)5xI)61QEd(^@!8W^G3YdiB1wJPadilQKJ2$#z4)KrP~?B$UZnK||rK
                  zgafd^xhy^yc>@`WLelE#`y5NTG*i|Z?7`nlp0nGw2Nsq;^vuBNUF;(RLy5yUg
                  zqB+lUgVgGwe*fn>@G;nvy~&p6xTnzo()GvQ`m;W-Yba;O3S?0=0i
                  z=}#SJ1@_lyfN~$KjEj3Gf7S0|5mhVEd~2)I3~ey6v?LQwXET>A`ThZoeQhcS9ope?
                  zV}qw%PZds~A6)wqiJF@msYvwMa$7^Q`_aUj*WNqxM;9dLZ39f9JaXju6kfRQFl?^4
                  zPdy&MV^7Dx{Ug1O$44Oi<{hXaHTgnKPHpGLxmKWGjyqVSb>VJ**q#yK&_SQ55}E2n-5}@;07}`8x#f$7^p`P%zr8%p#@``J_u1YPa=+($dI%wPqC?y*K|NhegTt@172<)poYq
                  zJ!Jc4CR5Oi``yipzQUdxVymj8yg2a7){z)}w3^p?N2;q>5DR=7kkR0{VUGR!(yu|4
                  zK}WAYs-kQ;U+x3WJI2hi;YL7JfOGf9veTPONAK@MEWOxS69Jox_}^YloI2AVvC>I3
                  zgA*)y^~YT=Y=Bq-jZx6IxV)6qog=Ff?I3^!Gc?Ud>7K)IcE20eczR&z
                  z2@(K$&wBKzn;t|!$gnqRT>vEi_>fZ;8EF>U>*_{mgZCgS6+2oT2mHi-n8$T)1LxHB
                  zE-=$lLx9LK1Ojb%5SiEE=H^z(JFbA)boWt0KbPI<4>MiH;}wdgl=^ZgDqT@)=UEKF
                  z?5CcDpFcam2iBd%7XTiIRU{(H_Zu+U7gT?y%~9?P00-}Mt!2}JenlkptU0r2>fMtL
                  zGG1>bFaz2?@G@!VY?7%pAZd&(j?n@$PHZL3kECMvDMT=?0Z2O?J*wCnN5M{hGgY6h
                  z(Iq@Q0&6JInaus1fFAb38&!=J@5RnCnway;4n!~mJ|1>xl+IDH=W71x^weX`QLK)S
                  ze4_148;VsY0J#9^5M`a0K2X`>;y69=u69iTUdx9r6c)aQB9|@YX6ovv55JPRn@Z3+
                  z1Lpv=-ISUcZr?Q$hJvW7YRwzR87P=mi{ZKe)(kU(%3O4XoW4mNcpdFA{2V@5svvi~u_<*OtP{f5
                  zZy4C^Kfd(o)6!BwShzG*fq$-lkKn5pLW)dp34XrbBU;kSOCvW~vRQfbkgtkDqks=K
                  z`9a`S&da_l8LZ2wAc6LvKmmQCbr%`){{U6Fptz*AB2}I;L#zLZTBO#?Fe*Wt_re*i~FClGO
                  z@{L2+MiGXtsw{pdw`s|rp<&9shj=wuFu2?xja=6zGGDAM$HWPF*07ld$-G<
                  z-}FLj%og9icP;8mY|%Iz_xha5b}@6Q9vU44-Onpl=kF!Y2fr5p!xI#YaF;x#mo~U~
                  zbb1HJwG9}vNJoELlm*`iC!!(A`PW87{b^(#8_OC~Y79^wK~}3$RwW;J+bmAAxGfq}
                  zE)ET8d$!~>*VD(f@0u+nRK3m5WLaVf?LmAsux}7;Y;O@P^kQh3@wm9-I+Op}Bb_sW
                  zpQ)tI@5o(Yb0n@~a4z|>)Ub){7%|7ncdF>w2LGHNgg~?4Pz6&sq@z{F4XQF-3Z5}P
                  z|4q|!L3UX5Oel6{nn1q2grmaBIu;f6!pa4oPP(7q)dIVfRE7i
                  z<05H9;w3cGap>HnB`wT~I{%l{Tg9~@Ro2`aea7@jS%D+!%lEaurvvo_%s0N}Dm=t@
                  zHv{g`frwKe0o@!)Ze?aUR5@tccD+emiUYP-bbZh8WSwP0CG1@Ug*<
                  zIE>BjO{PZfa1Dt2j{OSk)eD#Z68k8s;j$U_8cAIV{En!!+)v>2$qxnW41ccH$Oy^D
                  zOK}%wK!<
                  z4&2Iwqrv?01a*{t+A@eref**yW!(A;^k!jG~f^FK6B=$wER#;Ahj2AEks~qF&(EY!K`aftEgM<1DtSNA@2}`YYSd=^O
                  z6b7cdx*FZGeV6`7geV;ZO@mB^KTIm+&h;iXZNrbze@t;C4u!pM21`
                  zV>?biQgEqEC53rReYuNX!B-_&a_O{v-qON(NZekhDrX2n8pfBvR_*5Hu@{FAh}wEx
                  zLx;~M(Vh-n7f*SF?_fUVK!3HeRbPnr^qAHXq(soHr7|K+GWIsUtW`K45bp)1m0(;#
                  z$~wah9yp_724?RDeZD*RERiyhqACM2)f3{}=A)P$h0^Dx3(**y1jJ&Mo^{dPSlCwrpz3i!sZw1AI!rWsb4U*b)Y0
                  zRGr=`L^&N;!>X5ZO3ihSQ5h;148aY_6qNV9rxW{WaFb~Umxpx}&zJmhc>_I6RtNf0
                  z=LxJ!72tL$o-dx-;PTQBn2S?mzc-JAaZlE+?zeZqev!xsah?3&+u7u3>pp0ymO39;
                  z0n6Jvz1roP99D-EhrZX1VZ4F*`M$*Vp6fEb!eeO1@=+0@(EdivSscV)_@F@}O7~+Q
                  z-Zz!^n1maF%tkE7>7OEy`Kyi*YHFR)c#{ON&$aL9oRm0R43m
                  z4+BSMjC{cTVqh?>e|a*V#%*db5c;`v*9amv@+!fwCemBJt;D+TfCHtfHebq5td3eT%&kjN;YEWet?y
                  zbdeJA51TN!PiEfS8NcNA3mZ+{hx3CBAso7Jg`lW|WK}bi?qNEfJD+3s;n_CDC56-r9|61OgY&Ryt+B@GCFTi4
                  z9$GzuX}48%J+0UbjO8r#7|<2WF|TwOr4M;zp?s!9zrAWYV))CmU~s+mxdy9`%Kh?g
                  zJ2$7OWbVW263wG$5Z@$$#H+Lx&{vxSNpeH+p!hdi>d*f)Tidm*-u|J@H{c#gRP3T~8Q3=vvCNWMrs#%{;
                  z{u*^DT7jR(v||Q*ZPedQrj0iyp=9K8^;h~Pit~Ia;|7fwE3Ry8{0r2ie}h$NMTFha
                  zTh8TJSyp(~7WG4eh@V>^_&G{@O18jH$FcsuhfmvaCHuxJhNux^8cHX$%zM$|<&Ugb
                  zsB~*CUm7aU2QlhPr45UbnehQnxzU*=K{xXFT{M>1CT4#Bd8l}PbAB19Q7r(XQob|}
                  zT%k)cv!+!;Dd4YCD>r7)i=Mb71X*qM!U^2?yVQtD$F7@^JY|^f&i3;>zjUJ8qU0$Y
                  z$6oTuv&HH|^!MQ#A3#aQgDWHF_vg4-Gs3m5wD9`V69@nH-VB{P3~|+&KnrZf$HvUc
                  zQK2Q;(w|Ys5@aK;n*Ger!#q$+
                  zulYSatn56rGbXkLL*>#0?0Vp$pVQeqQ<*!_ZHq`-IsFx=Im;w(8Y
                  z{uHM&!i_FE+c8vLMB={|a+Zd;4U2+Almh=0v=1ozLr7wugd57;4|Q$&3Pa_v_z-u@5haEd!d^$7ir4^fbn#ndftH8lI1idS1kuYKHS
                  z$1gcO0c+Fvq=L_^Z>85z8Gn_ZCJnaPWv>lRs80u>3^FDAb&bI*_SK
                  zw_~`FIuqib(k6EwMd2pI4-ZF#&iq!-!jlZ>QuZ{Ex4xA9YZ~(GK?qzw*H|iM+@aSC
                  zH<<2ul12m1<<@~s6mBan8Y{wH%$F6GDkber?b)I^4a2;9K`Z>S|p
                  z_mdSxLH)A{$&eJg%v{f~;J=BwoPkrE`mcwKl<@&f^69IHT0`Lb*+%W$ZEw$2VG9jd
                  zI*rHM!Jj;z0aao=XF*$ZfJ{b8_&YM}?_*RA9#s-;0(X(5qeKU#y59AcQaU>>Yy!nro<;rxLBL3GIKj&<+*(H
                  zjDvG+u!O!BtY*RW<@)Vhk;5&pP0zRr7hGj+Sb!y3VLi@!#%=gpXG^JEnuzcCHtSBQ
                  z)LfrV#}U8v@^zk2JAxBxf}xq&x0Ofk2*3&=n`~Nq?OAG|wdAc3gCaka6tu*^5q0YX1
                  zspD2^4#i<>mV7P@g6@XkWd#nexo9o^1JE0bA0VLA`mK*l)JjM6{O9^
                  z%am=e6;F3$eQx6O4It*G{p9Idw{dq($h5Q5f8%JM^8OQS;_Td^YtaA=rpEedTGsru=1CqamLoj+Rgt6f
                  zp!4PHj@r+|8y^J(hmaOEl2zES@qrZ`>ucz6g40)gFOCESH}x>D*c1E
                  zqnXa}mxuVjew9InEA%a5dV=Z5WM#!>>1FO}C-CzIj=1THdq5#rmwE
                  zmni2RbHV|W@h+30=ykt>BWTTTkYRNul!OlO7G$lEX00Bi2QYTJ
                  z_GLee&o;m!GYuN*qUdVTEk^r|A^KjMLuTI+M^s0qw9+|W>1A%+az{wC@flEWTv3KP
                  z;lW#o#)buB&W<;My6gPsQW8#3CugS_aN1WimZLkj$gOyHvx7f7r)@O9$*tLP$D&VA
                  z^(u~nH#Bji{oT7vf26FBQyFP)wnxQjZFKssNH0Qc;?iD85b}G*;Qmi7z}zHGAx4yr
                  zt8U;6M3Iy6Vz9fHVX*9_K);*7gT90QajCF}n{FH4_qDu>-Q%y!uSlnx=O1NXilden
                  zXW5^(Mgu@j?_l7P;-3MrnB;m31Eve2H{BQl87zK{G9}WmQ}L{cV!g@9HUTd$+Nszb
                  zFqixSgY|imrTlsM_nzPk(2sPkeKN4xUht-8>WNG1QP)nl%1Luj({K{TPsj|BQ_~P?OW~7V0-d@Zd-yVd5{
                  z!mR=C{$ou2s-U>jz_M3Qgc@o;CZMe9-0Q1MQIPWZ)3Fm8SVW>s%5uOVIK;cbOue6Z
                  z0fB!W7KmvPw_?@A5#x#>W_+%+?RtpRvw||VvH9(YYV**v>EjPUB^}{kVY>T{{!PiA{(GJrn=5kR9zb%iy`zmQPml|qb9
                  zrq4}g+nZm2RYy&hABV)~m0E_pm;ACDnEw|4Fb98A7AW%dB7FY5np?8OA-}MXa*+?)
                  zp#b@48$OZRxQifv6T0#1o1KGW12Yh`)2p;&2ewryqoa3e0_(Fe8hknb;vs#!&$}5D
                  z6~Qc(5u3IRqyM%6MwVV)wTsQ?jgkV(TY9)Pyg-&ArMA)K5Wxj#Dl8Qz4
                  z_)WIOAT>k*@bUPl*z=!+hW=7uc#uhP;l;)4n0;#DW;)#Y)3`+?MN>&u0_!K+I&HHN
                  z=p>P9mWizy{*lj1F2zLE}HK8A0sU!I*!s?EIm}W-=Mv08LpZ
                  zG8icH&uJmLVzvFRMo4Jramen*g7$L))m8#s9qU1@zrd
                  z@GXc0h&XhvGh@{0F|A=yumrPW`>mOBmyECqA7j~q`x0S30)h$rjqVMDU}33JnU%nf
                  z$BHwrCogI=y4yqRmubmzUFTOz+&FBZ#gRMm@h^A_EwYGv8ZbxjpN&-0T+9w;w~cwxfWg
                  zYYo?<4L<5}9D6n8u-iqPHkE35pU*@nsp;@qf15~-Lhn;F-WLFpzB87(BkWg)3$D!TAKN`RJ
                  z3U;Mo(@a#m+}NKW?ro|#Gfd=76wIGkwWZ~nNjmb=Czg5!(?cW6{F!C-GNSO2VYi+bh4&lU&?@bMc_Iqdj6G*XKvAXlfuG+;8!2zz7W2R?IZ>^!Ml_<8cFBR
                  zW#CaCxXM`c_x3}zSfRZWXUlSPdg-=s#m}nFqGam
                  z>>jH$CrNEs=Yk@HQ;v8@1M<}0-Cyo%r<-ZLEWWVJ{3*bI&hhOsZ(>Y?O^}Lo*y9DeR9ABLmwoj=RpoS#Ip4~%G>ik{PMa-TkI(88i2jL^K~yht<>zw<
                  zyvdCH6VI4NfPOJ^!pdGEV;#2=~gG&9f%k&Qb|O9)CvqQ;Bz>?k_!szFG{Nj
                  zSh&dec3EbteB0qbO|yjSNodpSr8o9@c`p}lM4AbA8d>nn4e&cQ5-v06E$o1<=
                  zp+n(*$+3mfO43A=(Q`8Lg4EurqjnO{H?V`g>yHM9Oiigy6}P@5@;H2l
                  zlM&=yvj{CHS0qcz+0x&>Ult9RM8AqpDQzV7WEFzEFV~-#zvEL5hgzFK?Y9z#-ydq@
                  z_Pb3&jaI(Bt=n&TKRP;7RbSn6Cot(o{dI-j2l8y1@}Orh)6-yIqi%ZVNNZEU-E($7
                  zm6`3NZ}WTo)%qvWp*1>pB;drOGT5v-{>h^Be9v4nfT)ilrgcdVrdA#Ws4Zvul`&qP
                  z7K@2e?7dBzemEAJHU|QWmz`H5Z_6uhytiCyhg}S#(!*DPEAkl2%#+#la}I*6xyZM)
                  zVx!*aOFBLVnl9e2VM@IT0)KvNVYKoC2Z7K3nK1?r!O63xFJBG7gx|hXiZ&UM0b~i6
                  zu$=z$@EPt+Lx9P{Tzn$m^5&ojWEXM)0Skw2wnc
                  zgHaHDhG22Dwg(twcc}hr8@nOx`!U;S-3s=nxhPu>PYrMG?YtiqHXORyJBtC%Rl2{!
                  z13*ju`}LF0O9NScSt2{QGdY%d2%4>JXuglt@1&EQdW#)zGsCUpho{jiJ5(`U8}2Fr
                  zeVta<2Ozd-D6z)ODbL7<@#%hlvNe^5$66Dfc?mnVs4|9|adK*I)F;X0X>B05l?(Wd
                  zivcfXQK{aI*V?NqY*+Du@FP5SCtTmFLjD#IgH@(MMH#^|RAc7uuJU@P`s<#UrjE{f
                  zfDM*2lH6@jcognNl7WGKE%&7IaXV3oO{I4ayoW~C;m>`hv~dH(Y8D<
                  zm{!qx8U^WA9R)f5HM9Ch>BnRqO!gDRd=^z6FxANNC9I#D90k53C-x*2rb?H#;+_;&6`STY=zn2~BNn)8@y@!jHYg0&Ej(
                  z#?s2l$Q|jf*nCkw^)zY@ko&lJeLm@3f54adCH%T+SG&UCkuy*V%ZikSTMB~kad}dV
                  z@pf=0w93knR+TDCN8s|Ko*cr$J7+ZY0%VUW8((Kwbvok~7wKC>YEUE+VSRM+B}qCwsymvz_Xt6LaPFz==_jEnytRo@pHZ<`gI
                  zAn(kJD_ix?dNAkDpVT3A3A7t_`W4=Di=18z>lN_B!}60G+5(qDwG8d+lU{`)CU^w5
                  zXJ%;xeNQh|?P4SNxymh#PCxyU?`THE7lFo_mdW2e{rw2h=ri0l)Zjh6#w7ODjp}J;
                  zzwuXq5Fof`c@*;o6Yk1$p@|sr1;65}k_OB~tu=vtH40DrUHi&x7Rtm!J3Frp{hR12z`!tf
                  zYcKn%vCZQna1f|1Wm%tlCBR(}y{wm3tR_<%sFZ(m=`2_+Ry||5?F=)a?5P@Oe8y)m
                  z7qpbd1EmOe3;0P-nuiH;7E=*q)y0k8mJp3s`6uCmj|m4AIx`qb?8jf8Ra)pPa1V`{
                  zp>Jc=(?@$fUZ*6~#%0R$8lB1l9sd;yXRgArvU~lCdAgKJT0uYp)H=UM9=IYi@9(I1
                  zwjfi1_w@JQ2iN$N-5W3lI%W|G0*PQcstpArb^25B?gS39=k|aNHY*JN~J%Mr@D8!=FEr%U(=n
                  zKi`7i*%$H0$k${^*S{x`5{@Y<3T#$Tb#0rfeJSo!hjAQJj7m!z@nyh3!S7M!+q&~=
                  z=7N08#HIO4&DTj5*x%am3hiV?{A!`h-XTLju_X4k1ILXfeQAtH|sE#K5-J1RjlK}ku;)y*(>
                  z%BX_0bRXOwZ&or)nN1B}ul;>q;NLtVnmcv(TsvQl*@eB#Kz%B!E@ZX<13QjZFW+lB
                  zCnw~JrLf?L+NdCrR>Di;OeV|l_>w{h+`Xgy`>xhMM}{X^&E$Y2+EKRn{z7|!N#bzv
                  zJmK_9CfZ=KU0!snWYDDI{$*akPnyen1@)fQ_R*)dNB^Iwd4)*u>Gkz(2$dQsE+Y`2
                  z^)#yOomnWj9y-aSD0uZ!xvvo0HVNU5wUV+SCXXTe909t<6(J<;s
                  znM;MsD6vuhT&ITcPXO>lESXs?k>nB-F=$j;GxS
                  zxv)jvnArMy&r8LLPF+%RKZ)ld|VlB&AZ4}7ISNxDBTpXwHOpgIyuCkgqt9G(PA?~!`12A##_X4
                  zY|4po-3Wkms^1rmPr&P1o~uc3IQxx9;5IGOWn+J_+GHG~FMz9uu>su&m#m;6on1(u
                  z$pNC;sd{G(pjbqOr_n<=4q~KtN8G3EnoyG}#W#|UKNyY(l!N?J8&41}4lz7vDpVrO
                  zmy4B|$3*ORJO$~1>U9n$`jSm}wpl%pCeoM(u}=FD>-0F^eiA0y_OPve
                  zG60(gya*LOT}ZFxzQdtkkAxV|M=6s#k&u!;Z(gz)xt(qJ{8r%J^TWHJ-|;KEqIy4brg@(!
                  zJ78k;6WsZkw$z`;wjU{-3-=rEk?W1-l$$lMJ@N*C&6P{Yz`VyE8>_PV$w=x|et)?}
                  zHh{QA{&?ne^_5EB-E2~CAN%)lSS4B8!7PqxW?`m5+}pe|0FdzUOkxS8!oqo`t7qdf
                  zt0*@bj_ulg+e^D~7fj`{+cB!U&jL@&+nu-OJKJ&=ghcamC)4Y@Dvj~@Q0O9}#{nJs
                  zDZFvuhd|b6;DYzJcncZHk>LcmGGwWg%9nyhVs0ju0H!@R=Z{7XGuapU&}LUX2=o)A
                  z$W4lqd)_e4z<>EDfE>5_(m&_IX8%I)JbwRgu9lEq1czIeu&)0Jrk5cU$oc$~{cS3I(Bu$azK=niT#4
                  z&q#9zegz}}nTp@f5?CsP+ULKjc8;3Nb?1C;n5`XqU#|V@GxNJyw=Q+NMS9?V!aTcc
                  z5!1wpQfF^cJT58U(6wpF;Jz{a)qPX0+rpqZ*B}dTbI_T9fPLXJ%Mhj>_b*bCZUlod
                  zhi-pJ9^io2JPJOlKA}!e-($8}unf)qMC-CoSejLoUwpC|p1EYarpJV@(&5;Rvb3()
                  zMLUQ0htSYEEqq&U-SIvI=OOhtY)vGWJh=esfsS7Cb%IIXo`Yoq(^hAx1^z2MraK-sFt<_nGrARSi1I3N10vbG>JvJ?{)$$xN^93
                  zinXpqP`E%ph-Ff%?;WT#!+hSFW?PEOM%Tc0Kg3a=l^Q&^VzmL|D6mO#(jIc47AV#v
                  zDJYG{RK{dEu&<6cq$ZY3`O2$-*Epvl{cZyekemlq}6imgjhz!XnBNuWpV1dw#qaY^UshT%~zYed=I5NUxRHOm;$1bxJ-ljL2Qn5qiQZ!$t99VrzasNVT6lImW6V+JO0*o^7
                  zq$tM*WPWHTUNbk<{q!lZ%3*UWY?d*0R=eeUH7o7(o1S_-gjvc%GPXuOF27>t<%fh<
                  zZPCw^a5go!@d|kwUsU||-LY%(%4$A9lNwTwRn29tE>2AmC~$9R(CYKBM^!+NXt_)D8*`Z4gZ^$JpEcJKJZ#GNPJSy#5wE6(DQaxNL(8`(-U**VYqYgP!FHCpZtaJCP1Bw`{prB$
                  zI+4HGPmxG0Zxv;U&9D0)Vyb1`>umt9jV1Y8f}PY@eiy&5dxEOC%9@>fXXnj`-@vTD
                  zT`*+bEmffx8I)7)x58Dl$TD_MjHK*z&!3cya~VhHHD48zwAo~T+2qW7f!V@6miX62
                  zGC)USt{2#-bH~nH)
                  zPDjkZvAwd4q{RJFGW+z9Y+wH804BfpXVctJx>_Y)X~7SSB){FF|0Ef%(mwxG5cD!b
                  z!_3QQj(1eDw^}$re-6hoS^{Cw9qDxmk68y;OQoLco1if3r`qE|X;7k{sgFUu0S<*J
                  zN$F?`-DUHgidsONF4oFhE`2F=^^cEz!L|(hDHSouyiVz^nD0RYl%PfDttJ_~fT&}+
                  z>lB%AWYs8C$g*1@@3IN!@f3$DLVQ+D^l>X@?$qn4U4p?m&S(tOg%6YvKD7%A=46ua
                  zFu?5bG?Kw$f(!{63992}|2xWcoex0{A8$SaCvjjrg%M`S{|T6vVf~hgx3_5#oG1-y
                  zaKd;NLc!Z3Sj_+C{Ph93tk2t@QCmK!LccEO+mi@(s2|z5hsK8Y0yjSM*s(2pJ|A?(
                  zELGk`0cJ)6PmN`|RVGIQWxm~x*}o&7p4j~Vd!C`+{}xs&Q#w(uL33&ycYFXGGk${c&VT(k1t0&U(RvCC
                  zNefQ_t(QB=E_KonAVL|VlhH@`_b>gATH}8kTRVjC53U^=n~HpQHh_P}_6R6G!UK|$
                  zu&ky}y8JuLlxmtv_51CupHV3AAU{s7IXF}amu?3$d77$iy4FquhB%C0S5k=o^5Gp}
                  z9t(wgFK!dWAo60hydhbB0(mh{lf;^x7xFa5)@#b0sv6k6^{?&~9yI@p6EBr;1SVS+
                  zWFfxpTPuKY>_~qwkatJR~LxojsLf-_`k`Tp6YPo
                  zHni4@mm3iZSt89f&7kZn_!#TeMJrY^doy|>LuVx9wM}=W=R<9_TxDAG?byc%;4^HG#eP&iYzn)I8y#L2V$UqL=tNXs?fF+mKE2i>{|so
                  zzA7(gMAee?fwsql2<=>#gzMRM4o%{S^@Npi-4_ME^7j{W4B+>rO7{rcKR}EUF`+3C6|=Dp
                  z!;NMGp+m{uqWIRVh{ZV<7}iUJ5At
                  z6!k~0#2lMv^qj^up6ncuCf_gY(KQm|VVB;TYJOF+c=imhSxQt$)l59NB>M~C{m{kY
                  z=gB7y4f^eZvb*hf2|iWcX5h?X_<;|kb3&af^``^>D=6J>U~cerV-HqM=CMs+)0HV7
                  zRbaX8jrd!j+j0O&5m%|M6az^@8wnl0$!vN2boBH`&3?ERI-*0aELivnFSB}Fw}F7}
                  z_x%_vQ>+46ryEjj^Y$o!z^QYGpCYRA`wTs@S<7))*vqHc-qs;_+q^dcvt3SMDL;y>EE~_M~KA_?KL8
                  z78{OH+bnG3<}ZPU7J%2;6lCP(nK4`(1?sb4UEypRp#LW+y@BDQH-I*w`@FUpe?doO
                  z^@WGcYUvkaOxNfrracBtOwMQ5^@D3knCFVOpD^N+uDI1YOap~}HhuoShr1jm~(pzITJI!ZOQYG6=^c}8^aUso7A8-kJWoS#^Kz=0Ez{RobZiX}lV2PR=-!(oFmd;=6)qGFUJS#*t_mbBP|=3kqWJUTgkuGYQaH`|6DhAzwgtrsgz
                  zs$=(yiO;>!PPx%3SsPubXNWv5obK&-LGl#>qEF8#2V9-O*M97BjrSKzGX-81H$i%w
                  zb1KKy_u&mUi+mAxND3HUdaQ-7JCb>;-x~naU%Ar%7krJ}5Or9IvJhcnr0OMKxE_&P
                  zYwLEYHUV2xPQXbdZ!v
                  zzARgN#Q^M3PIL_OemKhJ-+r2Mxd
                  z)iq(5!18vw`$gZz=ah8qk)mwpUZ8U>%6KHr6_p#jLsh78g&nBB<(?SE@kF;zpo+=abz(n&?A4HFee89
                  zv1>mJr7?~N#3%gW;?IpHOaVZc%Tb>&T0XD9tZ?gvwh|7oy3N4
                  z15j1HBYtrK0K@T-pz&q4Qvt8%{Q0r`t|5q)_qkX^lkxAavlHrrvYmUNeyY+PN3-o$
                  z8r_aQn<`1b$XhN)(9!9&a80TZHF-ikfa4IfzbRp5Me`bs3K38#dOob6Fap_25luck
                  zulQQt51=fC@9kyzfnMtCM_=tHJz+tFMe`P+4PtMx(#o<*f3Vs1GpF<6exD!nFrNJp
                  z?f_z*QuW~jMsu;#`8T7CZgj1seVzM50NA+xE~Ek|(VVU$7=&Qfe^clh+Ih$
                  z3*Ah`<=>
                  zxp^CZ{}Utx_?<{tSjN41hobd_lHn1Zx&xwhU)A5*!|73EWKaMJs?pH-#xC_vh1IIv
                  z%U|mNpO+&eLEOO!3@tbL2jfnWmX;Qilq3Y$m*k>Xhy#1sZ0>>{WMmY1X18jXVW=?Q
                  zhkI0RxGo|st>jy(=w{fMNovqru~!i{BM;*-p>1mV2x+e)`wc)}f_E`6v&_b^m5x3!E_QMqY+$0FlJwz@{v}Zt8fr;B2{=
                  ze};j9=(4{V$XG~=qJP{q@JEjF;8@
                  z`WF}1-0ptt@U(cAiMcA;+(IDD>J~2AeSvhspJ1oy_l7;Q&~3AZGTWlS++3@@3u08E
                  z!SxF7ZU+X;MhJSd
                  zuI?UTiug_d2O9%O}adCB=N7T%x8io@bWt>spW4bK5
                  z&_`2CmY6$J03HxBR0_NcC31}Ln6LJ7@og7GmDX2CnIgS0dkL%tL&tgnsH9_C)b%vtcGutwH$7`oA0Lt9C
                  z@2*D0sweRuGVSq`goJhEM>RD8^^sv!m3Fz(g`V;54-tuaQ*tZv#78;S_VEJSnZr&x
                  zmTBwF(s;0!w)zI!uzdj+7M3taV0?KVGJlt|AKy~WCT1z*8AqZdY2V2
                  zwE>IRA3p+KB9$;yuxk-kzA{J#R4PLMkSHlPcG`TLlK!3rmBh-*%5b#K`ly2D8L8m3
                  zsi`R&+fu##9?iA`O!n)gu5lA1Jb}~fqrieqSlxg#AhdPudG36e2>zyRUxws)oFSdu
                  zxXas-29hQYC7~kU>k#$TdGQx4Mnb3MD|Kn9?0SsW-|YNzTZr{&r;n)5ao2&0!p8#-
                  z*zzWs6|ZZbG!E(9AB{2#F92g%)}AXmQOEbVq8_**HqCjxy~;0dS<4a%KQL0x-ksmg
                  z2yuaQ3$&XaAZ+&jg5nW<$}jk>3)sEpNgdajBp{N837_
                  zBR$jIeJFMZN?++wx80yvR<`?p)`^?jwSbfgbs#UCung_0ADj35C>y*^e0MW1eZN_{
                  z6w%07SZr3%`0h|Tr{JT`(8GCSADP?+&H{YuFv6bQ7FCo^hqXy{*S
                  zxVwvd%JQ`D^pJWCpx+q{8&D_~U+Y=zU;NJpuid)Ei#zo;iVZWym5-ihh*4Hkdm`>k
                  z0x27r@S>N^yk8z2_TB|!at;?({TO6ZTI5N>|30z^89$)wAgwUqiYlG_iMgAhADMx8l*p=@OZg&X8xPXHXmpy}Ae?)}2AHmvkld}5o#l!PET{<
                  zMIU-zCa2@UKTKO&+c~80Vyk&jcitoF-P0rQiArG_psKeg;4+l9u<2L}+u%PIEwm#g
                  zKb3*ScP;j#1@_xil_*7ac8s98tT8r)q~yo-qedi3cO`PV$Wm{vf9AoF#K+51B5G=}
                  z=bV7sl8rcIc#(&0K4L#qM%Fl4uuF#Ad5tEKPH=pqAbdJKF%Y=+qr0#IjWqw7X2u3w
                  zioLDwHobOlQNvDJ@h8G3{o`6XQdC#Hd4@^Fp-1K4%5mX@TGpA)fsC;q9bZk0Dh5aa
                  z*xj*DI+v5W?3TdK)h8g1vmUZ6+c|De(5_FOKhC5EE{)Nl@x
                  zy3^lZ-wcY0=3?z1HyWqa8iI<+U%PDZwp(U}A^vw3mm5R5)#`I8asZ3%$(Qox*6;Ja
                  z=NAa|UF$}ptpf$>Qf;*cxFTtkX!QEu40!;PdSF7NgXEV3FiMBax1Ag50|TA5f@+!5
                  zZ;QPGfXst%$_m^ZM%I+42!5|$bB9Kh)g=yysaRyqE8z<`Br2FQMngwi7v8f~o99S-
                  zYU*#AW69w^0pWb0n#Z%M(UV~zm$%D#-bD=^8F3mj>JNpkJZ~60lCk2$Virb
                  zvJcMt#|;CaX0ELRD_D3ExH{^C$J*(a7osyXzCkCbE~
                  zx5B@h?#b%(^Wr77rXPKJeFpfw6mBmvuFc5rSW$h1hzLGfEmk-~y}Typ#BnA}&tH>AWJgARjfdjOa6j$xwM1fI~aqpWN3TzXa0SKSguJxe7F{Y^3
                  z_e(!~X|h2O6~Bqh?HL>6jA80Dyt^I$@BEullsF$ZcjSfbrkmvAn}14u6Dz#!Aw)j<
                  zPF*F*kvj{6J(b;A*(Z~6cS}?_!Pju-5*RP$2@s44^%u4s^YxEq8ESL+?BuS;21XEx
                  zMOVanDU13{@-;?H{1$L7D0S-m{)`kRMUhIcI?;=rP3m+^?nhyC^xReL@0+c+JYTk)4vxg*F8{w5)-c~CHdpi?)CwvZway8LygDf%b
                  z6?)3ucD|13Z$lQJsc+BnZ}At(b#xn-R$^+KsgfT*Y_f?CF_N`fY7w*uEclv53d>XM
                  zV*12%GbBDgEOXqiJbXs`X)Jejdu!Wmzm)}0s{9GlDrf($bkTpapkN#?T}65uJ*!{Q
                  z;&QYXnaJ&XtF#n?Z+3`ONZ=R7KIV*lq0Oyd-=DRT0fm}$HkfwlS@p^b1SwcNL_jrV
                  za?KXhKsGJRBJd9*qs7v}?D2fZ!!H;2f~_f1IVuC_A>5^d!rgk{S`gNeD|gFHAcctY3v_d&Qzg{D{?s
                  zH8*t)@bjVz-mrL%9bXi|6PAS(Nvu-nX%a%1Y3t`|j9^!!PPXC)QSCf1si?&*`}FPM
                  zE6k1+uUHTP@P;e4IUXpEIhn8joUpwQ9+`sE_N-ZwG+~#l9%mhyTPLn
                  znj{Ua!35iXbRg>;opA-j(`@!Of&81=X^B)@W;#{}%rZXyt5)|BuF3O6B>ebSZveF|
                  zDi411cPJ6KCPPpd!&pqUgqA5ga6+^Yxef`26N8>7Jp43Wp9t`(`>XVrW8_cV9MQ9E
                  zZV>t|oaHG~^ivKc;{Jr;0gZdSHC-xnK}d@*ltvay8h}`mCefd~7KhM$=JB^oUF`M=e}-|3!JrL~zVm@!tz?madGuTvsl(P@rWgAvvJJt{Ru{2Z#@;^1d34W>k?3p~05jRmQfSlBO0&ou07VW%bYT?f%wZtVb
                  zL#S#xN?J23PNQl{Y?-}Rz$r3m6>J!Rd^cS1gvqjRFcR_!e68>JK-
                  zym7YtHidA;nq`MQg`e*s^QoICnW2gvJEk~9B*(XAQDw&_s&}dOodG8u-f~@vQ}G+J
                  zj7oZ+GcrTc9%igFJ?qestY
                  zt8&h51Rg%1H0Es(+h*0idvK{(C{(gGea56i`xSPKAu8qOJ5O&H+ArJCFt^O!I_O!2
                  zJ0R(LMDnZ_lOBV44!Id{Y4To|9(-?O7I!tYV3L4}bY)RdT)m-um-1x`nx?8ccadcf!D`UZMVmHxR2z9aZaOA~%z+(8%CD1fXik
                  zNsFG%9aNf+g}m)KwlNr`hPO^O4MY7a{G$9dQODBgy`#+!3TY{6^;q
                  zH0*7sM{FXa!)5FG?7F|W`j8{eWy#y-T;Ft7uHWlD4(Cq&P?}NFE6UF`T3VAiH&qo=
                  zP;BUJ(Mu77TT@U~+nOfF@&z?A(ll19v*>DB7_2j?XuGL5ynNEv^1^3?Dee%dCSw}|
                  zc`T9n3oz*wrrD0a?9+-I<1U`ZN`#vwXlRY7jeX~EY+l8WPOxvy?_sQ~QLYi^8Q=6V
                  zhGVYt^^xEsCZ^_H9`<{)f=H*L^NTF1R>R!~cYSF#>AFvLbjJO;$>5UQ&}c^S-8ff#
                  z8?w?u;D}I-{(2s)W*ew}N%krP|4z{kWkzn!iYl>D^maepedK3xMmzr>-j-hP@m-*i
                  V@2nuY{X+p>TK9C-%2lkM{TKV@1^WO1
                  
                  diff --git a/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area004-v001-MC/word/media/image8.png b/testbeds/testbed-api-generator/baseline/docx/standards/Service_Specification_area004-v001-MC/word/media/image8.png
                  deleted file mode 100644
                  index 36f8f3442f76576111cdbf7a2743f3651b62228b..0000000000000000000000000000000000000000
                  GIT binary patch
                  literal 0
                  HcmV?d00001
                  
                  literal 16068
                  zcmeIZbyQnnwDyV9;!c6$P+BOi#ZrnxahIUQo#K|_v_L6N(c%zXQk>uvcPZ}f4uRxL
                  z?{{adx!-)V)~s3guUV6xaD
                  zV%SKjNTHzAd=G$WBqFy_KWoZ=K&c#kxsTkyvQU+ty)Nj0MwYv|w2c8=i
                  zqm=-sl%a&p#Nl(RD+Q*z!|PvGLEth|Z;dImnbrbviI+ULl--Z>^Vn%OfhZ|&TfY4I
                  z<$reLC0B9qZsrCz&l^fxdU9G~zO9jONRTalr3rI7p&I__O|Ux}&LmGDul+U^xJ}cm
                  zUavqQ0qU=$d4Y%pe5Zw?`};cxl&2bP(^##=FPn_5daqGL;H^fUATGN(XfHBmTf7mR
                  zc(gTyE>MFPRb>w6ZgOSfuRxM|9=_Y_wZT#vdl#dx%J1vmI6A%^2c0?Jl|7}2=2Cwn
                  z_naEal%S6=XTG(BANf55D%if2r1ySy2yg%9AMf@jYw12MU|pxP*6M)|H$B
                  zQH~8^7USa*B3tz3sb#wFuqA0sR+2!kgzb#U18z5;XNr=7SLe#IaJ#47fGz9n?de;H
                  zKNs})uVdw|KX10d#oR7DqOxCsLM?)vMXM4YlY$YfQ~6^;M+=`xO#?L)fkY>wC~&@A
                  zfuhpHfQvBj-RFDO$Esb57+T`o7~e+dF#vzO%8L
                  zd{10@eHOU-1?48;W|Zj9DwDX6o-p_I5hEW}mol02@5XvjCbr-thrp?vFCh%FBmoyz}!mtF4R}=)`}}7uKswT??H=
                  z^lT(fz^XqvOSgUe)Dw8L;@^GsGlh1RF|t@92wo{vYgO0ZDcx|sSyk++N=`JGI`X{^
                  z{DnE0wscLw%5t(kf4+WORQIiOOh!YV+qFGLP@3+PBLIhWhpLvlLad^HoKU$;TTX4U
                  zdY@YI(I<}a?3N=uSlYY$?*P{6Eql?fa=YKYrbtkx#*kx{q$Jm!hr+w7gBIW}NMiMz
                  zU+0VS^0%((s1=eHX|+=VO8TWhCgiN
                  zL4b-a+9ej3n7vbmW|pj!{lFAI`$g*DQ_?SlvoN%$Zj=f)s4UKXCe>nRjBVnyjl{1O
                  z!|8nYBHDIwkTUZ7l3Wx!i?%9>M`DY+Ac?8kyKl=GhPfa29gB{uv?(>?`EaLYeYH-b
                  z&j$Bx!Rtea#3EX0vo(pp4P~BGy9wU&ILCbLujNH!tb(9(UyMw=&U19ywGBth1+Oea
                  zlZO@>BmS`DLd?PBflBV6ywog=!&8uGuq8|^@4Y1D6hx~uB(mKrY>TEFz*QVtFhLKP
                  zlT8*K;yG^FY>r^RC>yiUlhUn}FI~M#-KOgw-Rb-&e+*lNrI2t^3J}#R*Y>
                  zxNl>ADc0Ln#SnMnCG;uxrnbzFFx_Tt-K3IgeQewHf{Xa+8`x8@81E-_J0MJmUGp`r
                  z$)Wc6wC0=pA1rps0`4BQs%}}DuI`$bOWKmG{bPT6dxb_UclCNk1fZ5JkL+u(4M=5%
                  zdW90f)`k19!0v0<-Bh*v2ssc<0PCrMCC!4&Uj#5MZ`cGf*=W
                  zmO5GJ$*2;bsCJR`SfMl&j@z6b(jK4r1>)dizTD@an0|7yuUW@p$6BJrpIWN^g92gc
                  z{V^wzg|cnE#Z(s(6HxRk=dp!UV^FswAYV7u_}}J2JX#xutED=>RUa7TNvS_XAJO33
                  z&UoLGYDzyr9$Upm-x&$M;TV#1AbE>j<`h_d5w}%q1<^{z#SRcWf2Nv)AIJh#R{Zqo
                  zWqJ8qGY1DNdntwVIfdp*b~Z{b**&EQ51_c62{VvDan8mOtfu1QbHogD-L&=q4+*;@
                  z=uu*&JbK0p!c)UBrdoY7wX#53Sv;!Wg&sl_xxBg9FqQ>Q0jcc>^ZXmjzK=RI&l;oO
                  z0Uq{>YNs)l8;kqN3S>eMu`GwF6k!vac!9Q)nXF^Lq?0f8hGacU;k&~)L=lofYER2U
                  zsn=_Y@2|qPny*K*{EpQtjh-)&C}_1-CdRhJQDq63MZ-9L?
                  zDnElh?mmAfel&u^s=O=sVU^H3SHDTNnGpKHm+&fJam+Db64Ifd#Y4-#P6WS|GjA(j
                  z_m|JOD2c4VWBoC+OyK2}Vl8-om5>ruaOk+iK=_E$QrP@B;}9Qr6j~Dp5X8i7+_>0w
                  z#X|n`S8U7pUljw}!T8FiKk-89AcEZ25fQ!Vsy@v7i}XuSft91*2Dg_ImD491j?vZC
                  z^JKf>;j57@CSp@C>)6W;SgGL0Q|J>Tii_uJUdGNOpO?0*fYVmi#&2n9OCJ&<2}V2C
                  z#E{Pi_Ysg2BSJmFwJlD2_ck#xfZ;sy*H$7TA}Vg6aB=R2oEoKX4tC)(L(yw%wn-n4z$0(xr*k5}
                  zI_`VH?iw2BZ$`OIrfCUoX6MV58V8=*?wkMqdYAv*=`vSs%py+UvarBimhg@qceZe$
                  zV2kN*JOAsEg;qzS2Q>UpZ@dETQKl@;FdcT^y;nn9R9M6kCkq3)4s9g!TAC&ADS$)E
                  zjr$MGmqOrxeEV&AqXm}gL7y*`Kpen1{L_%VgDvJqLoMA?tMRIsJ++gHIoy5g2U(Db
                  zf?MFlJG<}~*NVPKIU!F-B4j_+rH4Ihg-e~+zZkTCknp3^)4ho
                  zFn<&0(2x6ebhNYby8dxqZg3JfOx4n_JHdHip*pi+!Mv&J*O_hTlPHzDZmTgH@HK9I
                  znY*f-&Es~UAz=T*{qlGHYX$Wj(alCX!;Y^+t*}n7z-ZG+JI(GY!@rlM-&423>2J8h
                  zgV?Khzw?qL6nh0-o+7qfUQm0{Bj;93#E4$5cU<0UlVJ(1tbE4Ilb+q#Iq7?S&VwRZ9Tw*J@4
                  zsHV^+zo&*!OAn`j>&YT(l^{Od4iS_0N?YzOM==9}SK)v2o(z{;Z5=GbF+U$<%&~};
                  z^ZRpKQjcPL%q|*2^P1o%*^-~v_RXt|=sx{g593YtbtfwPfCd}vRT;PGAh;_z)V;vB
                  zqf3RYYzuRR2`noQ0U^yGMt>nOnU(0N+fj
                  z5^rud5u}rb4Cr@w$r#1E?%u&QRv(-xS?U7ze$qP5-c1eo5Zc*)QXjq)*I-?PPyOO(
                  z=n)^`^ihNP=A|Z2zho_xYsSrawW^P}6^wyBD1a{utu#-hC@+{zRn>mVE7m<;68yot
                  z8>2@SKpI%AP(HS=dy1~E^#7#}`rlVa|79;?NF{sFCLn>1m{>#UF0rljN55JS|MBbJ
                  z$F0G8B_dBU?bJG-_xfl2wmt6jZdvb7-MD`)^7O7AyDWI&x6>J6;vekzfsZSUKT{Pd
                  zeG2ua>z050!sDn`1JEM5e|oQmSjWh-+~8e%A`$Usd@1qZIHh)!!Q0eq_p_?_
                  z}dd
                  z_S_FmM=wM^5faej3mMr2nNnVXpe!r&jZ*?n2Xiy(!(%Fd3*r6zk?{Ob!4z)$Fw)`=
                  z*NFt-;`i#a%wzO>OYL8RW;+vKp7NT~_ATJ+5s{NuT~-sqlKE({8RJmfk>|~H@vmWC
                  zrYND`?Q3hlvjt?zzp5c}KWg#hwD=8DY@1{RG$Y2;pefjdDt9~2emfIRs(l{G;f{tc
                  zHa5?%Ez+ZD5{xRsvG5)dXucknmtGF%CSw+9Fl7l5aLh&&sCxh1RSv-$Sk*~f=2qZz
                  zyT@T0IkwmD(CEv{r@BC)6QT%wE(e@Pu7j;4d96XMww|=}$cYATH>{vRqJm!!-v-C!
                  z@i-#a=~JZx9?_HUO?%hO{XN%GW7_4Ownb4C)@MgoaE5e^KRj8NRa>}OPJ`pMs%#E#
                  z4n=(SDEWNQJu!u
                  z{hj%4cE-bb1L#qcawKD`mod3Pk-=qQZ++73|{0*NOv%hSXbONhEM&
                  z9Nwe;Ew001LxA1ZR?w-7%qZ8NKri3<$qZ>F<3@Lg2!^ZG{Nv!~3X5hHYD
                  zG08%~)%InR?SuALk&F|QA5Z0ayX&$oX6Kk&1IM<0d@m+IQkA8WPu^>n@#G%se--Q>
                  zUD|c^q1gi0F9HHGuRs5d#R^g8T#Y#M!dmsC$_e*E~98jkZTTjN++AMC#F#0HNVF9LdYK4+~kW*u6S(}F^A-yr+R20%mp65
                  zobo82J-fSkoL9U%xcv+pn*$k~$URitvV7fXE~>@B7V-6cT!LpwDZ;Z?v6n14@lY#d
                  zaJ1-H6j{JRZW@Tq5igoeKrqsCbcec&fz{i11
                  zUDiWVHt8$Hc#=(i$XqFjXWZ@Y{ltx%W7|Mtg^>+T9Z~1M!}6wK?zOShpWkzHcWU!}
                  zEwCQO=?KS-*x`JBQ`LSg%mvo`)bDk#{aoyYi`Qc2L6FiwgIk#nJ458*@SmX};&tL0
                  z>)-~&+Vb8KBXqQfqU1wAr77*~ITcTSXz)434+A|NMe}7k>+S
                  zfR1$chmSDy
                  zYM-C6S*Ihd;P8F9@n=jG8vl%tAf1
                  zUrFF*It%nA~N+1(Ta>W?W3wWweVxY~}YioGArmdaSZ$>G?K!U{)Yt
                  z;7XKNY(OftNu5q=#AmV+`<=@xNJ+q(oJ2D_gpQQ9d%8HKoyr|4nvj~GTz8}0F>2`|
                  z65=n_TOueI8U~7slerIrrKG(N6M;%)pLeolx4&gKV+QX*J%Hqmh1CZej)@0+!p=+l
                  z*XyrXr?#4*Zu|>L^a_Xb{u0rfWnbZ<`X7I)`@*3OvuD
                  ztaj7+Jk`2g#$}n4o+D7LgmC{QDzwr>ix$7QQ(z
                  zE_xrNw+tll;6JEY{w_T2Hjs5Vamu(G;ka9580ogk0yV99s0|8KB0npTZP0=}HUlID
                  zdD%PS=)C_preB>aM}NaWAl0Ku$zez^fJ#q~2H2h4N#AG9LG^>N(B}=Nw=d+!n=>|U
                  z%p4t7W2zDh7Iepg`&VajTcoFvpG1+yK{G>w<{E&)RS$Fh=*M_|%ydJ;}5-XnL^hHTwI
                  zqS@a;<>sCuhso91X#}z^+^JXNqI3ug2RM!RH;Nvp;`zZHXhwl&|N-)5m-#>B+hvvQ34PxBk6pc&U^AWI1i)15x+GS}}
                  z1b}0_6-9kGOO?pQtKFtNB_<_Gk>>9{YUO}~gS-4lYL1@Vz{ZIh#6@#4sq0V0qK5Uz
                  zjZ8rD^7cFX(oIjv@>d;nte
                  z`SKPgCFJU>^7HFyDrwUMy!7~m08Pa?K+q&{GNW&ip;D3&uJ=)UE-XH5=_|vCkKE)-
                  z5&I*lWp~B``j1%q1(7WoSts2eIlB3R2$=^MXoUad_e)$IXdE?tS724*w(C2dD;Dv)
                  zT@03%rxUWmM*5$JE-sT*RvpJ7th?9G0+|u{-aH<6CIRzR9^Vd=7u+U|o)QvfrJ8z2
                  z=GB~8!Z+09j)mJ&;lSs{q}rS-X*Pd?D)a*}V-JdrT~p8?RaN|Ol8szv`d$
                  z+BgQO9u0~kl99Vpv32`PlF*ZtAE%Zt0SrMbB5u_R*qqYohr25<
                  zK4tZO3>(bAM46qmaqHw#CXai2VuHuY{#H|v$cT)4r_u;Drk%=^d|8KR6nN&ntiu4~
                  zMmI1N9D~iDayRgL`TFw*sbi+jat3&snrph7mf^`f`rf<|aM-ATy_22e3a?o|Jv{KI
                  zSXY$cjv=N`)f05!5OA!aR#lx9l}-%?_o0F&*{kp3utc8)+?|`y?tSRC;Q6HflZ`Ie
                  z1@8q(RGHq0oi6`s10n_d(YSLLJnMY*G)=wt*eAEee%4Y+yV6WsaatX(@lYCX2#ulT
                  zOE{6G`Z(XR>gBWTI?Wl&rv%!6lxs$TH_nPN`eqdr2riebHF$dOHj}G(a)fTNzLTK!
                  zFww03!qNW1Km&XIRfX>1*tA1433LRUXzvgv62S7}*kswv)~>V(PkBd(XPNp9Cs@%)
                  zr|=bMcOl~eQeR-$0xvNgIxU$l%c2nzhRjyb?8lGwQx=8yR<-
                  z{}kYElw%w-(2xCx&_tnB>mj~ipSvwo>Jv}gm2{zitE__gy0Ze_MajKg?1hSIGxaAk
                  zbEQ=&g?&A)%z{g7!o~bzwG4d;t;b{exU7;%mQ7!YZ;S%n3cU0Q>33E--L>^$e}6R;
                  z6kt(Qr3@W!7lf`tW$nKt*leA-^0cs?C@MtfUA+-2>r%Pdb(N3B5PtqZ@?&bM3Z9oB
                  zE^-4$2SzCx8Ysn;%`wfa_KO0cv_BShH#bPLUjtMV2qo%B69nP?3Y@=+SPP9zW9WoC
                  zq|*`EpD;>_sl~l`vLfU*0$AL)}I
                  z9V28191H$Yv5(+Sh2W4La1#1cMMkElBj@WoF{4BJ#vj3AVz*0csEkZ`Y<;jhe$6%S
                  z+KJnzR|qH9fA0)J4i;-{|2h26?LlJ^FaSLs+o%4Znu0jq?Li~|qUA|qH|-VkFXt!3ASQmYbUgTv_ZL%UiIW;;zr1saFGewGeHmO*;zJkk@2`t->VK8&
                  zfP@0*2>-DFl{6)*0pt`2U&h{jT#5{}RFv0K{egj7@t%UVHA(=^1G_7#YUwJ|Nt;cA
                  z!p7m1r-t!g_k+dolZ(A&S>+Mv>J`1}UJjN}LjN%ZN5ivY6JVU+Vb$J~sJ~;DyZo2F8xFDZ5~JzQuybeoCnbgR;xM1_hih7(|N9c)?jC>kw%FwYd`al(pt`ir{L8-6dl>?
                  zltPxL`wM-e%fi)8Hbj!t>I(v#Qpx-Ux~sK6g$GkcD~ku}nzE4g(vCH5+|f;uRm1VK
                  zE~MOf9}s}n>YfJB61^~aS@aQ5Wb{V7R&4Fbq*tTzqmaaDivgQPlZDq?Be&()6|JRk}B!0&e$S4Yu3fpDY0Y
                  zhm>jhLLmba;lXpxY}=i4_&(zrjwNrk)04w^#N3=n&MOscfma)#tr>*u*5%
                  z`KEDMuKMISXyZoYFZ^18WcmFsr!i4!?}SZc$0QfeJAVNi1I4Jlr7e6Cke71*+wAiP
                  zIj}&UZY+C=R-JvsyJy9t^Cb(7v`AwI!y0}R!&i7>xr$1o1B>l>l>L4-Kobd0#+P!q
                  z7WD^eIco!OI=$cOI4w}21D-{;wdF>eUFqvxH$Bri3_APcWnuA_s6vxM@6wksH^tRM
                  zL0#(BT)2A@`cgXeS1)x{D+goMs!gS<=_
                  z=ECo9gFh(ycbruOLhxVNh9MyafYgqhbApN-r5T+EjlvCfPj$N{
                  zC2So(mBMIEQ@sJD!eDmAy1R;=F`*xTSS1+g>d;(H_9r-CM)ey8`%~6kdyW$5)k*Z3
                  zPHCZ%mJYZ?lR23wvBJ{Z;-F&EFnN?!HT9Go_(EBGup;46sH2A^r>r7D9QBMlxd4{i
                  zGJTvlj1X{ZnKZjz6X3bj?Zq{GEFUtWm(o|c3eYGlWdC(d(UoHVyx!UXanzaL|j3yQP1
                  ze|m=>4=DTg=rzCuE&ld6`ZXR9{q0c~xfTBHk;}e?*DWGpJZ|&L8QH?Q1fTNO>aaMQ
                  z^uVusq6z4x0XCfT>zh!!al>s=UwnwDU2Qf$pCVEDuY?CxkgEC+r?!+!D~?AFYpJmU
                  zN*h{$ko-*87!?|blKf5{OT0NtLuKYcr-RCCyr*@&SaM2j3OrTiKY0CT3yH
                  z$$Jl3NF&ZoxN(eWW-9elG@q@cOcF0T=#|i<%2U2QEJZp&g-}y*hKJ5Wk!0;VjUkOn
                  zU&(DZOCI?Bn?P(uG!QQ?!>_XRc3_(#-Xn8r*LWn6&HTxqTYOBM(kHeh?IFXAxjZX+
                  zxq3ZrYw#TV7v+7{6{X|D!#IRV4j8Tb&&>NHyK897i*iI*@pxHBpiap%b(kO@M$`cK
                  zx7aJv>5H#Xe5|;1Au*qVaduEwzJ!8*g2=L!P+1AhKGVPO+I)^H^bWPa%Y~TDH1S+^WI6gAaoB`uDX-Tx
                  z{dI^-?#a$f}H8;FPYQi(sIi?cLi7A1Rl@%ofJ$=p>WaE{IiI2ciPFH57b+mbn
                  zKhPQ_1@5U)HCEyagQQ(qk&|(y$wF^A62kveCf5D$5voQSk}@N7Ed1q)PIVcPwr;+20@SoT{fqsOL4riI@Zy}8T{#CbT+lM^wPw3d@U6#Msu|Z5vgJqrSFV)AKqW`n
                  z9=>t;OoS?A6I-;S_itbQG16$i@)rJW{ft8yH;E&Wc6-QrS5aE#D#Vf=M6Fxd6oTdX
                  z8R@`klH93gJ?|{!AohW1pRHmySK@_q+RgrSjI7A;k5;V-(xk0SB
                  z184GpDpISjQ&Vv+1Y4_}HwCBaJAV1k*K(?}{jVrez0K-K&uI`9?ZOs6=F`?{R#cS!
                  z=9mXd+Rn&k=D}lzaQ^z1ZRp#|IIRAqrc5G_saAyX13WTzA&!b)ZB4%eID9{W4S@Tx
                  z&s<~wUjQJ2{kaBb+5KHECGYo!oH!OIU7xKnpGnh0k%E7F$nT7W;oto96%qTp=B)7X
                  z;8Mp)gk4mX@E>jCBK{mdI=n2}H~9U-4fZW}tZ<7{->{2A*CgL@F;k1kBGbnTHdgcX
                  z+x3jO(W`cY&DOghd;BSw3(^@eT5ed|TK{h6YZk>uYN}dbrCv`gYEV^|6L#N_N64CFq<1qM~$d
                  z56<$lRpY@#Ec?6c8(mE18|eWsFlF-)Ye2sYrdK<`
                  z?GSY=P7-2`zMdkufWqZdy4A>;34->F>k-@CPjs&cWNNAxaAW7&Hhh-5tz994N)F}@
                  zm-q4ylV6f2fGiyVGCJ6@q=YyxZRWIsgRldhb`Gvr3BFH2&S#V}(oZ%i|0mbsyy`F^
                  zz-|4pGB^<1Iad}2arOEgQ4vc{F
                  zl?8eXI(NtT@WIlTCo1Ys7<8t}ao&R#+2BHxe+*q;v&CO+<+7bw!UmeWDajeXbxA1R
                  z$ERvngZ{4h{T?1rSpw|FJzl&^mx$%&#HBEOU)8?2wz(N{Q*pUIx$P?8kV%Qeyv1+o
                  zkZehRSIWb*!-qk)OLlXDhL`dV@1ZkmtJ`covcA=ZOghkypJC3oSf`>d**GQsz&+x
                  zKdgi9cOc%EIWY^7v@}Nf#y=g4_JhKg&-%*3iTnX3&>VR8a{=cxY$RCS8K3VxejWSa
                  zPvX$?)e+IJo-|cV(Pf-SG=NYLygfeTvPfKzF>fTqk6~ixh2)w_FRX#u9eY2?R;b}h;jwgAd+5h5UVD4(l5MOcCg>zEWepy*YAo%
                  zZOPuQeM6;B`hbKU-oh`@xWK0n=Wank?iWaMw~~IB#v337a^5|mY4qiwuBjp9ahWhc
                  z5(yStY}+bo6s@!`V=*9m`*peVklUgKHryCG|7Y*Sk0&m(^6Z1~{>1^>GS(rke*x~{
                  zx(qx%UJ0oR3OxBBGV9VBLDIW4rAA5JlTjY5K%5!LFTO7wZF)hk)9+7qs
                  zUj>K2Te+D9!k;T@2uYMG&nKF{wSV(flubWox@%KnX)?nuCcaGG1;P!UB$+NG?S&0d
                  zZEPF@L%`-qh6k5<>zjKcy2*1p4!2*~eRTI-(E2mxmn
                  z+bPK-g;)MMF3bw(yl)D4hlYd!!RluDiREmmsk!84eZwfgY9eF~!0DDdnF2B;NYd4)
                  zsgY7n^Pxu^b)}NV{R&!MYK9e9MS4EWBN-rvN5t2T4*#&8cq1!gB_VPiIut?dn~Nmc>k%+6B05bz*e@hyuAGJSu1c_ABn
                  z?rvC=W&Do)pl!B{%&ySvhP{_U70%{3k0$S4stf^}
                  z$xt~saJ9xMd!w7pM_c*#SAN$RnEsP0t?v+9Y!EfU*8FV2EjNM6;!a0mW$g)Qif%K>XI@G^oh0)c38M*hRl2ul{)QY4dlPmxX3&ig%3vWCzIEo`hz_+M>2QrFzbxO0vA*6O3$^X03!CVNGw-70mHJ2+B-uuvo
                  zCuIEl7jG3iGU3eEIVb)n`)7tMO{fmuD~voIT>C#jF!ZB6UQ*d%LOoc~z7y!4UAgjP
                  zP$CsD#~jo8iFM@L%AMO4N^a=0DQM~U$->(GZ6x~*lZQDjwPPU4PrSyq8(%=>D>J{B
                  z!qX-MJ(miU8PuGMKYF^w(1~djD)wFak=5ZMPZxln_L+n7RNK)$mtbj^lzmQoI(&0>
                  zH>LMxU&+bN5n-S>cKau5D4vZ7iSTu<9v}zd{rMt!
                  zADlU5^Wl0KgLYx3ySmeA#CeSQpXWTr@+l0oOK`8zX0K}8L=udo?jkZWXeIY_GO;87
                  zU9$Wc=AlDrCPSweL)>SyAKjIafZ)VtbsPX)jM|k_7RP4&-=VPJ!za6|s+&hm>Q6o5
                  z$dVB0h<^;~Rik5Twb0ny^+HGz6I-bsZH}3>XLypBs)&c+a~S=yB^J6wuDe196!lwU;HZu(fglEKLI&m5C|sHR(>#D
                  z&cP=9g0#5L7vnsCAQ>y9nC#9g+~o~Q0O)esg^=_v)3}Wh+O)V-e2vkDpT9{SDNTTLcUcd-k3LDx~}fEovUCWAS8he$r^Sw
                  z$IhJ{o)#06lSk@~1WrJd8QUI{%i{H$AM^fpdlm)Ke@Pj+=;~iIs2Up_BwmV4|T*Cu>EUCi-;QL
                  z`s)FvE3$C?ZDPU$@8bi>cIXZeSI
                  zPd{scPs|RtXdHPN_n{NT_2+JXiRkW`-Uv2A;tAYufsc02MBFHMxx#XhZ1|hevFwo*
                  zvb&b+m55;JTLyh{tOELgd+?C`f^NMAWE;5@Z3=S4-7Z?53iabe(`uKnMqW5GkIJb`
                  zSBE+dRcpz@!W#<^1@fdzOGNIX4{Vv!?&R=?RG}L(FA&f^pFJ(~H8JFnJkrBCHr(z;
                  zHjMi^yE|RoYQoz>$&oX44oHzr7jf!(s9Vn^bEOe1#x6=1Yg9RlNq>InQcUD}al*X#
                  zh+Iq;0N<8soozz-SA!M~5sP?=h9T?P3EU$Cz@NYZC1(4Xk`PhBGV8n0&nF>*DQ`ck
                  zck(X@9RHb!gg94ap0m65m36qp!Q3cpXWkA9oX)*deXVmLIhgW&=Clgi(0o*!4N}QN
                  zepgX_#VsE&E+(!RyGq5GA=l03l8N(3;OeUIe%UaBBK(KC^2e<8kj|%WGpDRyI79|#
                  z@RoH~Z;;t<=xV@W$SeH(Ysn|^MXINVuuk^#8#sOj9%{SPvaOD?w@fFR+iO#y*`rHd
                  zUW!Iq$3ir~S$_Z<-VqHJTR+C*MFu~+PK*>U6gFQoq{?aeb(S-)+BqNngEZ%O?y&@L
                  zbIei5Wih;B(VON!b$l=&xg*DyK#eXLUOf3Cd4rTt@36}fk7QN(@|Gw0RSC<}*)gj&n*ls9Ii<`)qi}~^mepvrn0-Wj-+ANk4g0dH3`
                  z>`y=M5M}J|l*A&G*tA8FUbJNJ>@eS_?W?`R|ztr%?TsasW!rLe9jX90g&!q
                  zA7S`lQU8adY?&Y%q)a~Wxk@(}QNG^RQupxq{@UX04?*m;abDiqSMKUVHd^tByl;1=sx#II_}!Z(pNIe2@Clo{c4y{esz
                  z1#4Ey!s_QY+Rib+MAj6=j>;B;EG#LDCH9|z&-#w)#wm>bO#et{sEnk;PO!9Al+IIoK_E1hf_P$x_>Mo9*c41w
                  zYVrt1%dDSU)sg~~J(yyuN8^`*MlBj2
                  z%KTQv&b#?_41c~@^Ddo}&^{d>A&qrn;t$S1Cm4a1$D%LW+h|
                  zOv28@J8@y6VzkCXd}&vexcGNE9S!J`O-UbenNq(Uo_AE!3`kxg*U;XXzV|MOYke5I
                  zH88}m;KUR3u5 differences
                                   differing++;
                                   continue;
                               }
                  -            if (!Arrays.equals(Files.readAllBytes(part.toPath()),
                  -                    Files.readAllBytes(other.toPath()))) {
                  +            if (!Arrays.equals(withoutDrawings(part), Files.readAllBytes(other.toPath()))) {
                                   differences.add("differs: " + captured.getName() + "/" + relative
                                           + describe(part, other));
                                   differing++;
                  @@ -169,6 +168,37 @@ private static int compare(File captured, File written, List differences
                           return differing;
                       }
                   
                  +    /**
                  +     * Reads a captured part with the figures taken out of it.
                  +     * 

                  + * The existing generator rasterises the diagrams a specification declares; this one no + * longer does (design section 8.3), and MC v001 is published so the eight it declares + * cannot simply be removed from the XML. Rather than stop comparing the two documents + * that hold them - 1.3 MB each, over eight figures - the drawing markup is taken off + * the reference side and everything else is still compared byte for byte. What is + * removed is exactly what a picture contributes: the paragraph wrapping the drawing, + * and the relationship naming the image part. + * + * @param part The captured part. + * @return its bytes, with any drawing removed. + * @throws IOException if it cannot be read. + */ + private static byte[] withoutDrawings(File part) throws IOException { + byte[] raw = Files.readAllBytes(part.toPath()); + String name = part.getName(); + if (!name.equals("document.xml") && !name.equals("document.xml.rels")) { + return raw; + } + String text = new String(raw, UTF8); + if (name.equals("document.xml")) { + text = text.replaceAll(".*?", ""); + } else { + text = text.replaceAll( + "]*relationships/image\"[^>]*/>", ""); + } + return text.getBytes(UTF8); + } + /** * @return the first line that differs, which is usually enough to say what changed. */ diff --git a/testbeds/testbed-api-generator/src/test/java/esa/mo/apigen/validation/ValidatorCorpusTest.java b/testbeds/testbed-api-generator/src/test/java/esa/mo/apigen/validation/ValidatorCorpusTest.java index e94a95f9..42a88bee 100644 --- a/testbeds/testbed-api-generator/src/test/java/esa/mo/apigen/validation/ValidatorCorpusTest.java +++ b/testbeds/testbed-api-generator/src/test/java/esa/mo/apigen/validation/ValidatorCorpusTest.java @@ -226,10 +226,25 @@ public void eachGenerationResolvesAgainstItsOwnMal() throws Exception { "area001-v003-MAL.xml"}); Assume.assumeNotNull(v001, v003); - assertFalse("MC v1 with MAL v1 should report nothing", - new Validator().validate(v001).hasIssues()); - assertFalse("MC v2 with MAL v3 should report nothing", - new Validator().validate(v003).hasIssues()); + assertEquals("MC v1 with MAL v1 should resolve completely", + "", unresolved(new Validator().validate(v001))); + assertEquals("MC v2 with MAL v3 should resolve completely", + "", unresolved(new Validator().validate(v003))); + } + + /** + * @return every issue that is about resolution, which is what this test is about. + * MC v001 also reports eight diagrams that nothing renders any more - true, and + * deliberate (design section 8.3), but not a failure to resolve anything. + */ + private static String unresolved(esa.mo.apigen.validation.ValidationResult result) { + StringBuilder buf = new StringBuilder(); + for (esa.mo.apigen.validation.ValidationIssue issue : result.getIssues()) { + if (!"diagram.notRendered".equals(issue.getRule())) { + buf.append(issue).append('\n'); + } + } + return buf.toString(); } /** From eea741b5c81be781ac8483a1a8766f63ad393ff5 Mon Sep 17 00:00:00 2001 From: Cesar Coelho Date: Sun, 23 Aug 2026 15:12:01 +0200 Subject: [PATCH 40/45] Find the generators without scanning the classpath for them The plugin used org.reflections to walk every jar on its classpath looking for subtypes of Generator. That cost about 300 ms of every module's build to discover five classes, roughly ten times what generating the code itself takes. Each module that supplies a generator now names it in a service file, in the form the JDK's own service loading uses, and the plugin reads those. The constructor still takes the Log, so the file is read directly rather than through ServiceLoader. org.reflections is no longer a dependency. Measured on api-area002-v001-com, as the goal's cost above a bare clean: 450 ms before, 151 ms after. Over a whole reactor build of apis/*, 3811 ms to 2525 ms. Also restores src/main/resources in the three generator modules. They override to pick up LICENCE.md, which silently dropped the directory the parent declares, so nothing under src/main/resources had ever been packaged there - which is why the service files did not appear until it was fixed. Co-Authored-By: Claude Opus 5 --- .../api-generator-maven-plugin/pom.xml | 10 +-- .../esa/mo/tools/stubgen/StubGenerator.java | 87 +++++++++++++++---- api-generator/generator-docs/pom.xml | 5 ++ .../services/esa.mo.tools.stubgen.Generator | 4 + api-generator/generator-java/pom.xml | 5 ++ .../services/esa.mo.tools.stubgen.Generator | 4 + 6 files changed, 92 insertions(+), 23 deletions(-) create mode 100644 api-generator/generator-docs/src/main/resources/META-INF/services/esa.mo.tools.stubgen.Generator create mode 100644 api-generator/generator-java/src/main/resources/META-INF/services/esa.mo.tools.stubgen.Generator diff --git a/api-generator/api-generator-maven-plugin/pom.xml b/api-generator/api-generator-maven-plugin/pom.xml index b8099ddc..5c4ceb1e 100644 --- a/api-generator/api-generator-maven-plugin/pom.xml +++ b/api-generator/api-generator-maven-plugin/pom.xml @@ -80,11 +80,6 @@ com.sun.xml.bind jaxb-core - - org.reflections - reflections - 0.9.10 - xml-apis xml-apis @@ -107,6 +102,11 @@ + + + ${basedir}/src/main/resources + ${basedir}/.. diff --git a/api-generator/api-generator-maven-plugin/src/main/java/esa/mo/tools/stubgen/StubGenerator.java b/api-generator/api-generator-maven-plugin/src/main/java/esa/mo/tools/stubgen/StubGenerator.java index 7d5d42fd..9c98dee5 100644 --- a/api-generator/api-generator-maven-plugin/src/main/java/esa/mo/tools/stubgen/StubGenerator.java +++ b/api-generator/api-generator-maven-plugin/src/main/java/esa/mo/tools/stubgen/StubGenerator.java @@ -24,14 +24,19 @@ import esa.mo.xsd.util.XmlSpecification; import esa.mo.xsd.util.XsdSpecification; import java.io.File; +import java.io.BufferedReader; import java.io.IOException; +import java.io.InputStreamReader; import java.lang.reflect.Modifier; +import java.net.URL; import java.util.AbstractMap; import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; +import java.util.Enumeration; +import java.util.LinkedHashSet; import java.util.Set; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; @@ -42,10 +47,6 @@ import org.apache.maven.plugins.annotations.LifecyclePhase; import org.apache.maven.plugins.annotations.Mojo; import org.apache.maven.plugins.annotations.Parameter; -import org.reflections.Reflections; -import org.reflections.scanners.SubTypesScanner; -import org.reflections.util.ClasspathHelper; -import org.reflections.util.ConfigurationBuilder; import w3c.xsd.Schema; /** @@ -427,6 +428,21 @@ private static XsdSpecification loadXsdSpecification(final File file) throws IOE return new XsdSpecification(file, schema); } + /** + * The resource each module supplying generators declares them in, one class name per + * line, in the form the JDK's own service loading uses. + */ + private static final String SERVICES = "META-INF/services/" + Generator.class.getName(); + + /** + * Finds the generators on the classpath. + *

                  + * Each module that supplies one names it in a service file, and this reads those files. + * It used to be found by scanning: every jar on the plugin's classpath was walked for + * subtypes of {@link Generator}, which cost around 300 ms of every build to discover + * five classes - close to ten times what generating the code itself takes. A module + * that supplies a generator already knows it does, so it says so. + */ private void loadGenerators(final org.apache.maven.plugin.logging.Log logger) { if (generatorsLoaded) { return; @@ -434,26 +450,61 @@ private void loadGenerators(final org.apache.maven.plugin.logging.Log logger) { generatorsLoaded = true; - final Reflections reflections = new Reflections(new ConfigurationBuilder() - .setUrls(ClasspathHelper.forClassLoader()) - .setScanners(new SubTypesScanner())); + for (String name : declaredGenerators(logger)) { + try { + final Class cls = Class.forName(name, true, loader()); + if (Modifier.isAbstract(cls.getModifiers())) { + continue; + } + final Generator g = (Generator) cls.getConstructor(new Class[]{ + org.apache.maven.plugin.logging.Log.class + }).newInstance(new Object[]{logger}); - final Set> classes = reflections.getSubTypesOf(Generator.class); + GENERATOR_MAP.put(g.getShortName().toLowerCase(), g); + } catch (Exception ex) { + logger.warn("Could not construct generator : " + name); + } + } + } - for (Class cls : classes) { - final int mods = cls.getModifiers(); - if (!Modifier.isAbstract(mods)) { - try { - final Generator g = (Generator) cls.getConstructor(new Class[]{ - org.apache.maven.plugin.logging.Log.class - }).newInstance(new Object[]{logger}); + /** + * The plugin's own class loader, which is the realm holding both the plugin and + * whatever generators the build supplied to it. The thread's context loader is not it: + * inside a Mojo that is Maven's own, and it can see neither. + */ + private static ClassLoader loader() { + return StubGenerator.class.getClassLoader(); + } - GENERATOR_MAP.put(g.getShortName().toLowerCase(), g); - } catch (Exception ex) { - logger.warn("Could not construct generator : " + cls.getName()); + /** + * @return the class name of every generator declared on the classpath, in the order the + * class loader offers them. + */ + private static Set declaredGenerators( + final org.apache.maven.plugin.logging.Log logger) { + final Set names = new LinkedHashSet(); + try { + final Enumeration found = loader().getResources(SERVICES); + while (found.hasMoreElements()) { + final BufferedReader in = new BufferedReader(new InputStreamReader( + found.nextElement().openStream(), "UTF-8")); + try { + String line; + while ((line = in.readLine()) != null) { + final int comment = line.indexOf('#'); + final String name = (comment < 0 ? line : line.substring(0, comment)).trim(); + if (!name.isEmpty()) { + names.add(name); + } + } + } finally { + in.close(); } } + } catch (IOException ex) { + logger.warn("Could not read the declared generators: " + ex.getMessage()); } + return names; } private void processWithGenerator(final Generator generator, diff --git a/api-generator/generator-docs/pom.xml b/api-generator/generator-docs/pom.xml index dbd0c841..0b1f56d6 100644 --- a/api-generator/generator-docs/pom.xml +++ b/api-generator/generator-docs/pom.xml @@ -145,6 +145,11 @@ + + + ${basedir}/src/main/resources + ${basedir}/.. diff --git a/api-generator/generator-docs/src/main/resources/META-INF/services/esa.mo.tools.stubgen.Generator b/api-generator/generator-docs/src/main/resources/META-INF/services/esa.mo.tools.stubgen.Generator new file mode 100644 index 00000000..0bb508bd --- /dev/null +++ b/api-generator/generator-docs/src/main/resources/META-INF/services/esa.mo.tools.stubgen.Generator @@ -0,0 +1,4 @@ +# The generators this module supplies, found by the plugin without scanning the +# classpath for them. See StubGenerator.loadGenerators. +esa.mo.tools.stubgen.GeneratorDocx +esa.mo.tools.stubgen.GeneratorSvg diff --git a/api-generator/generator-java/pom.xml b/api-generator/generator-java/pom.xml index 33e9a832..34fc5b68 100644 --- a/api-generator/generator-java/pom.xml +++ b/api-generator/generator-java/pom.xml @@ -89,6 +89,11 @@ + + + ${basedir}/src/main/resources + ${basedir}/.. diff --git a/api-generator/generator-java/src/main/resources/META-INF/services/esa.mo.tools.stubgen.Generator b/api-generator/generator-java/src/main/resources/META-INF/services/esa.mo.tools.stubgen.Generator new file mode 100644 index 00000000..e4fa0906 --- /dev/null +++ b/api-generator/generator-java/src/main/resources/META-INF/services/esa.mo.tools.stubgen.Generator @@ -0,0 +1,4 @@ +# The generators this module supplies, found by the plugin without scanning the +# classpath for them. See StubGenerator.loadGenerators. +esa.mo.tools.stubgen.GeneratorJava +esa.mo.tools.stubgen.GeneratorGwt From 589b32d74ef7f3cda7590f54d5f81a518f28d446 Mon Sep 17 00:00:00 2001 From: Cesar Coelho Date: Sun, 23 Aug 2026 15:18:49 +0200 Subject: [PATCH 41/45] Added the plugin option to select the new generator Wired the new library into the maven plugin, so both generators can be selected from the same build. NewJavaGenerator is an adapter in the plugin: it reaches api-generator-lib through the interface the plugin expects and registers as "Java2". Generation is deferred to close(), because the library links every specification before generating any of them. The default is unchanged. esa.stubgen.generator defaults to "Java", so a plain mvn install builds every API with the existing generator and never constructs the adapter. -Pnew-generator selects the library for a whole build; setting the property in one module's pom selects it for that module alone. Flipping the default is the v15.0 cut-over. Verified: the whole reactor built with -Pnew-generator produces 950 of 950 files byte-identical to the existing generator's output, compiles, and passes 295 tests across the eight testbeds. One module on the new generator inside an otherwise old build was checked separately, and also matches. Co-Authored-By: Claude Opus 5 --- api-generator/api-generator-lib/DESIGN.md | 21 ++- .../api-generator-maven-plugin/pom.xml | 10 + .../mo/tools/stubgen/NewJavaGenerator.java | 171 ++++++++++++++++++ .../services/esa.mo.tools.stubgen.Generator | 3 + parent/pom.xml | 19 +- 5 files changed, 216 insertions(+), 8 deletions(-) create mode 100644 api-generator/api-generator-maven-plugin/src/main/java/esa/mo/tools/stubgen/NewJavaGenerator.java create mode 100644 api-generator/api-generator-maven-plugin/src/main/resources/META-INF/services/esa.mo.tools.stubgen.Generator diff --git a/api-generator/api-generator-lib/DESIGN.md b/api-generator/api-generator-lib/DESIGN.md index f4893dc7..f4c202f0 100644 --- a/api-generator/api-generator-lib/DESIGN.md +++ b/api-generator/api-generator-lib/DESIGN.md @@ -75,9 +75,9 @@ while the **default stays the old generators**. A clean checkout, and every rele builds exactly as it does today. Flipping that default is the cut-over, and it happens once, at v15.0 (§10.9). -The plugin already selects a generator by short name, so the new generators register under distinct -names. Making the choice a property turns a per-module edit into a whole-build switch — -`parent/pom.xml:356` currently hardcodes it: +**This is wired up.** The plugin selects a generator by short name, so `NewJavaGenerator` — an +adapter in the plugin that reaches the library through the interface the plugin expects — +registers as `Java2`. `parent/pom.xml` takes the name from a property: ```xml @@ -85,16 +85,23 @@ names. Making the choice a property turns a per-module edit into a whole-build s ``` -with `esa.stubgen.generator` defaulting to `Java` (the old path) and a profile selecting the new -one. Three ways to exercise it then fall out of the same mechanism: +**`esa.stubgen.generator` defaults to `Java`.** A plain `mvn install`, with no flags and no +profile, builds every API with the existing generator exactly as it always has; the adapter is +never constructed. That stays true until the v15.0 cut-over, which is the one line that changes +(§10.9). Three ways to exercise the other path fall out of the same property: - **one module** — override the property in that module's pom, for a first pilot; -- **the whole build** — `mvn -Pnew-generator install`, which is what CI runs as a second job; +- **the whole build** — `mvn -Pnew-generator install`; - **both, compared** — build each way and diff the two `generated-sources/stub` trees, which is the golden-tree check (§10.1) applied to a live build rather than a stored snapshot. That last one is the strongest form of the parallel-run contract, and it is why the two -implementations coexisting is worth the duplication rather than merely tolerable. +implementations coexisting is worth the duplication rather than merely tolerable. It has been run: +**950 of 950 files, byte-identical**, generated through the plugin by the library, with the whole +reactor compiling and 295 tests across eight testbeds passing against the result. + +The name `Java2` is poor — it sits in a list of *languages* and is not one. It is not renamed only +because it is temporary; if it outlives 14.x, rename it before it reaches anyone's pom. Cost to accept for the duration: fixes made to the old generators must be mirrored into the new ones, or the difference consciously accepted. Running both in CI is what keeps that honest — a diff --git a/api-generator/api-generator-maven-plugin/pom.xml b/api-generator/api-generator-maven-plugin/pom.xml index 5c4ceb1e..623d7c7f 100644 --- a/api-generator/api-generator-maven-plugin/pom.xml +++ b/api-generator/api-generator-maven-plugin/pom.xml @@ -85,6 +85,16 @@ xml-apis 1.3.04 + + + int.esa.ccsds.mo + api-generator-lib + int.esa.ccsds.mo generator-interfaces diff --git a/api-generator/api-generator-maven-plugin/src/main/java/esa/mo/tools/stubgen/NewJavaGenerator.java b/api-generator/api-generator-maven-plugin/src/main/java/esa/mo/tools/stubgen/NewJavaGenerator.java new file mode 100644 index 00000000..6504855c --- /dev/null +++ b/api-generator/api-generator-maven-plugin/src/main/java/esa/mo/tools/stubgen/NewJavaGenerator.java @@ -0,0 +1,171 @@ +/* ---------------------------------------------------------------------------- + * Copyright (C) 2026 European Space Agency + * European Space Operations Centre + * Darmstadt + * Germany + * ---------------------------------------------------------------------------- + * System : CCSDS MO API Generator + * ---------------------------------------------------------------------------- + * Licensed under the European Space Agency Public License, Version 2.0 + * You may not use this file except in compliance with the License. + * + * Except as expressly set forth in this License, the Software is provided to + * You on an "as is" basis and without warranties of any kind, including without + * limitation merchantability, fitness for a particular purpose, absence of + * defects or errors, accuracy or non-infringement of intellectual property rights. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + */ +package esa.mo.tools.stubgen; + +import esa.mo.apigen.generators.java.JavaGenerator; +import esa.mo.apigen.importers.xml.XmlImporter; +import esa.mo.apigen.link.Linker; +import esa.mo.apigen.model.Area; +import esa.mo.apigen.model.MOModel; +import esa.mo.apigen.model.SourceRef; +import esa.mo.apigen.model.Specification; +import esa.mo.xsd.util.XmlSpecification; +import esa.mo.xsd.util.XsdSpecification; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.Reader; +import java.nio.charset.Charset; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import org.apache.maven.plugin.logging.Log; + +/** + * Reaches the new generator library through the interface this plugin expects. + *

                  + * Temporary, for running the two generators side by side through the same build: it answers + * to a name of its own so that nothing has to be taken off the classpath to try it. At v15.0 + * the library replaces the old generator outright and this goes away with the interface. + *

                  + * The library reads XML itself rather than being handed a parsed tree, so what arrives here + * is used for the file it names and nothing else. Generation is deferred to {@code close}: + * the library links every specification before generating any of them, which is what a + * reference across two files needs. + */ +public class NewJavaGenerator implements Generator { + + private static final Charset UTF8 = Charset.forName("UTF-8"); + + private final Log logger; + + /** + * Every file handed over, by path, so that a file named twice is read once. + */ + private final Map loaded = new LinkedHashMap(); + + /** + * The files to generate, which are the ones named by {@code generate} rather than by + * {@code loadXML}. + */ + private final List targets = new ArrayList(); + + public NewJavaGenerator(Log logger) { + this.logger = logger; + } + + @Override + public String getShortName() { + return "Java2"; + } + + @Override + public String getDescription() { + return "Generates a Java language mapping, using the new generator library."; + } + + @Override + public void init(String destinationFolderName, boolean generateStructures, + boolean generateCOM, Map packageBindings, + Map extraProperties) throws IOException { + // The library takes no configuration: everything the old generator could be told + // here it now always does. + } + + @Override + public void postinit(String destinationFolderName, boolean generateStructures, + boolean generateCOM, Map packageBindings, + Map extraProperties) throws IOException { + } + + @Override + public void loadXML(XmlSpecification xml) { + remember(xml); + } + + @Override + public void loadXSD(XsdSpecification xsd) { + // The library has no use for XML Schema types. + } + + @Override + public void generate(String destinationFolderName, XmlSpecification xml, + javax.xml.bind.JAXBElement rootNode) { + File file = remember(xml); + if (!targets.contains(file)) { + targets.add(file); + } + } + + @Override + public void close(String destinationFolderName) throws IOException { + if (targets.isEmpty()) { + return; + } + + MOModel model = new MOModel(); + List areas = new ArrayList(); + + for (Map.Entry entry : loaded.entrySet()) { + Specification specification = read(entry.getValue()); + model.add(specification); + if (targets.contains(entry.getValue())) { + areas.addAll(specification.getAreas()); + } + } + + // Timed and reported the way the existing generator reports itself, so the two can + // be compared from the same build log. + long started = System.currentTimeMillis(); + new Linker().link(model); + new JavaGenerator().generate(model, areas, Paths.get(destinationFolderName)); + logger.info("Processed all Areas in " + (System.currentTimeMillis() - started) + + " ms (" + areas.size() + " area(s), new generator library)"); + } + + @Override + public void reset() { + loaded.clear(); + targets.clear(); + } + + private File remember(XmlSpecification xml) { + File file = xml.getFile(); + loaded.put(file.getAbsolutePath(), file); + return file; + } + + private static Specification read(File file) throws IOException { + Reader in = new InputStreamReader(new FileInputStream(file), UTF8); + try { + return new XmlImporter().read(in, new SourceRef(file.getName(), file.getPath())); + } catch (esa.mo.apigen.importers.ImportException ex) { + // The build has no way to report an unreadable specification other than as an + // IO failure, which is what the interface allows for. + throw new IOException("Could not read " + file.getPath() + ": " + ex.getMessage(), ex); + } finally { + in.close(); + } + } +} diff --git a/api-generator/api-generator-maven-plugin/src/main/resources/META-INF/services/esa.mo.tools.stubgen.Generator b/api-generator/api-generator-maven-plugin/src/main/resources/META-INF/services/esa.mo.tools.stubgen.Generator new file mode 100644 index 00000000..b4c3be15 --- /dev/null +++ b/api-generator/api-generator-maven-plugin/src/main/resources/META-INF/services/esa.mo.tools.stubgen.Generator @@ -0,0 +1,3 @@ +# The generators this module supplies, found by the plugin without scanning the +# classpath for them. See StubGenerator.loadGenerators. +esa.mo.tools.stubgen.NewJavaGenerator diff --git a/parent/pom.xml b/parent/pom.xml index 95fdcc9b..15cd56e3 100644 --- a/parent/pom.xml +++ b/parent/pom.xml @@ -91,6 +91,15 @@ **/area001-v003-MAL.xml ${project.build.directory}/xml ${project.build.directory}/xml-ref/xml + + Java @@ -359,7 +368,7 @@ - Java + ${esa.stubgen.generator} ${esa.stubgen.xmlDirectory} ${esa.stubgen.xmlRefDirectory} @@ -543,6 +552,14 @@ + + + new-generator + + Java2 + + release From 2b242863fb9a988f36750c3df6a496aa1ef122b3 Mon Sep 17 00:00:00 2001 From: Cesar Coelho Date: Fri, 28 Aug 2026 21:26:44 +0200 Subject: [PATCH 42/45] Add release notes for version 14.2 Co-Authored-By: Claude Opus 5 --- RELEASE_NOTES.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md index 47dbf653..1393013e 100644 --- a/RELEASE_NOTES.md +++ b/RELEASE_NOTES.md @@ -4,6 +4,17 @@ ESA CCSDS MO services - Release Notes These Release Notes include a short summary of the updates done for each version. The different versions and respective updates are the following: +### Version 14.2 (28 August 2026) +* Adds the api-generator-lib, which will replace the three existing generators at v15.0 +* Fixes the TCP/IP transport handing back closed sockets from the client pool +* Skips the address lookup for PUBLISH error messages (fixes #9) +* Drops the subscriptions of a consumer as soon as it disconnects +* Extracts the endpoint registry and the URI addressing scheme out of Transport +* Multiple fixes to the HTTP transport and re-enables the MAL testbed over HTTP +* Encodes the Blob length as 64-bit so that Blobs above 2 GB work +* Creates the Elements of an Area on demand instead of holding one of each (Java optimized) +* Adds the JDK 25 build and testbed jobs + ### Version 14.1 (18 July 2026) * Vendors the W3C XML Schema files instead of downloading them at build time (removes the build's dependency on network access to w3.org) * Fixes a race condition and silent failures in the LazyMessageBody decoding From 82f2d181276e3fde8da10bb26de4def7889d3e58 Mon Sep 17 00:00:00 2001 From: Cesar Coelho Date: Fri, 28 Aug 2026 21:34:08 +0200 Subject: [PATCH 43/45] Exclude the generated schema classes from javadoc:javadoc The classes xjc derives from the schemas carry the schema's own documentation, which contains markup that Javadoc rejects: the W3C schema describes a type as annotatable by anything "other than itself", and Javadoc reads that as an unknown tag. w3c.xsd was already excluded, but only on the attach-javadocs execution inside the release profile, so javadoc:javadoc failed. The exclusion is now on the plugin itself, and covers esa.mo.xsd as well, whose generated classes carry the same markup. Co-Authored-By: Claude Opus 5 --- api-generator/generator-interfaces/pom.xml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/api-generator/generator-interfaces/pom.xml b/api-generator/generator-interfaces/pom.xml index 3aea71d8..a6b71444 100644 --- a/api-generator/generator-interfaces/pom.xml +++ b/api-generator/generator-interfaces/pom.xml @@ -103,6 +103,21 @@ org.apache.maven.plugins maven-dependency-plugin + + + org.apache.maven.plugins + maven-javadoc-plugin + + w3c.xsd:esa.mo.xsd + + org.codehaus.mojo jaxb2-maven-plugin From c573ffbf1ebc636be61aa6b4590296029340f9e1 Mon Sep 17 00:00:00 2001 From: Cesar Coelho Date: Fri, 28 Aug 2026 22:05:03 +0200 Subject: [PATCH 44/45] Revert the plugin-level javadoc exclusion in generator-interfaces The exclusion was already declared on the attach-javadocs execution, and Maven lets the execution override the plugin, so the added block never applied to the release jar. For javadoc:javadoc it excluded esa.mo.xsd, which javadoc documents without complaint, dropping 104 generated classes from the output. Co-Authored-By: Claude Opus 5 --- api-generator/generator-interfaces/pom.xml | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/api-generator/generator-interfaces/pom.xml b/api-generator/generator-interfaces/pom.xml index a6b71444..3aea71d8 100644 --- a/api-generator/generator-interfaces/pom.xml +++ b/api-generator/generator-interfaces/pom.xml @@ -103,21 +103,6 @@ org.apache.maven.plugins maven-dependency-plugin - - - org.apache.maven.plugins - maven-javadoc-plugin - - w3c.xsd:esa.mo.xsd - - org.codehaus.mojo jaxb2-maven-plugin From 12d3780c7a48b7426af3c1e865662dbba67ed0a3 Mon Sep 17 00:00:00 2001 From: Cesar Coelho Date: Fri, 28 Aug 2026 22:05:17 +0200 Subject: [PATCH 45/45] Bump version to 14.2 for release Co-Authored-By: Claude Opus 5 --- api-generator/api-generator-lib/pom.xml | 6 +++--- api-generator/api-generator-maven-plugin/pom.xml | 4 ++-- api-generator/generator-docs/pom.xml | 4 ++-- api-generator/generator-interfaces/pom.xml | 8 ++++---- api-generator/generator-java/pom.xml | 4 ++-- api-generator/pom.xml | 4 ++-- apis/api-area001-v003-mal/pom.xml | 4 ++-- apis/api-area002-v001-com/pom.xml | 4 ++-- apis/api-area003-v001-common/pom.xml | 4 ++-- apis/api-area004-v001-mc/pom.xml | 4 ++-- apis/api-area004-v002-mc/pom.xml | 4 ++-- apis/api-area005-v001-mps/pom.xml | 4 ++-- apis/api-area009-v001-mpd/pom.xml | 4 ++-- apis/pom.xml | 4 ++-- encodings/encoding-binary/pom.xml | 4 ++-- encodings/encoding-string/pom.xml | 4 ++-- encodings/encoding-xml/pom.xml | 4 ++-- encodings/pom.xml | 4 ++-- mal-impl/pom.xml | 4 ++-- parent/pom.xml | 4 ++-- pom.xml | 2 +- services-impl/pom.xml | 4 ++-- services-impl/services-area003-v001-common/pom.xml | 4 ++-- services-impl/services-area004-v002-mc/pom.xml | 4 ++-- services-impl/services-area009-v001-mpd/pom.xml | 4 ++-- testbeds/pom.xml | 4 ++-- testbeds/test-apis/pom.xml | 4 ++-- testbeds/test-apis/test-api-com/pom.xml | 4 ++-- testbeds/test-apis/test-api-mal/pom.xml | 4 ++-- testbeds/test-apis/test-api-mc/pom.xml | 4 ++-- testbeds/testbed-api-generator/pom.xml | 4 ++-- testbeds/testbed-com-framework/pom.xml | 4 ++-- testbeds/testbed-com-provider-esa/pom.xml | 4 ++-- testbeds/testbed-com/pom.xml | 4 ++-- testbeds/testbed-encoders/pom.xml | 4 ++-- testbeds/testbed-mal/pom.xml | 4 ++-- testbeds/testbed-malspp-framework/pom.xml | 4 ++-- testbeds/testbed-malspp/pom.xml | 4 ++-- testbeds/testbed-mc/pom.xml | 4 ++-- testbeds/testbed-mpd/pom.xml | 4 ++-- testbeds/testbed-pom/pom.xml | 4 ++-- testbeds/testbed-util-spp/pom.xml | 4 ++-- testbeds/testbed-util/pom.xml | 4 ++-- testbeds/xml-tests/pom.xml | 2 +- tooling/basic-demo/pom.xml | 4 ++-- tooling/mo-navigator/pom.xml | 4 ++-- tooling/pom.xml | 4 ++-- tooling/simple-mo-consumer/pom.xml | 4 ++-- tooling/simple-mo-provider/pom.xml | 4 ++-- tooling/transport-bridge/pom.xml | 4 ++-- transports/pom.xml | 4 ++-- transports/transport-file/pom.xml | 4 ++-- transports/transport-generic/pom.xml | 4 ++-- transports/transport-http/pom.xml | 4 ++-- transports/transport-rmi/pom.xml | 4 ++-- transports/transport-spp/pom.xml | 4 ++-- transports/transport-tcpip/pom.xml | 4 ++-- transports/transport-zmtp/pom.xml | 4 ++-- xml-service-specifications/pom.xml | 4 ++-- .../xml-ccsds-mo-prototypes/pom.xml | 4 ++-- xml-service-specifications/xml-ccsds-mo-standards/pom.xml | 4 ++-- 61 files changed, 123 insertions(+), 123 deletions(-) diff --git a/api-generator/api-generator-lib/pom.xml b/api-generator/api-generator-lib/pom.xml index cddef2df..5bb7c642 100644 --- a/api-generator/api-generator-lib/pom.xml +++ b/api-generator/api-generator-lib/pom.xml @@ -19,12 +19,12 @@ int.esa.ccsds.mo parent - 14.2-SNAPSHOT + 14.2 ../../parent/pom.xml api-generator-lib - 14.2-SNAPSHOT + 14.2 jar ESA MO API Generator - Library @@ -82,7 +82,7 @@ int.esa.ccsds.mo xml-ccsds-mo-standards - 14.2-SNAPSHOT + 14.2 provided diff --git a/api-generator/api-generator-maven-plugin/pom.xml b/api-generator/api-generator-maven-plugin/pom.xml index 623d7c7f..05728f66 100644 --- a/api-generator/api-generator-maven-plugin/pom.xml +++ b/api-generator/api-generator-maven-plugin/pom.xml @@ -19,12 +19,12 @@ int.esa.ccsds.mo parent - 14.2-SNAPSHOT + 14.2 ../../parent/pom.xml api-generator-maven-plugin - 14.2-SNAPSHOT + 14.2 maven-plugin ESA MO API Generator - Maven Plugin diff --git a/api-generator/generator-docs/pom.xml b/api-generator/generator-docs/pom.xml index 0b1f56d6..685227db 100644 --- a/api-generator/generator-docs/pom.xml +++ b/api-generator/generator-docs/pom.xml @@ -19,12 +19,12 @@ int.esa.ccsds.mo parent - 14.2-SNAPSHOT + 14.2 ../../parent/pom.xml generator-docs - 14.2-SNAPSHOT + 14.2 jar ESA MO API Generator - Documentation diff --git a/api-generator/generator-interfaces/pom.xml b/api-generator/generator-interfaces/pom.xml index 3aea71d8..70c3eae9 100644 --- a/api-generator/generator-interfaces/pom.xml +++ b/api-generator/generator-interfaces/pom.xml @@ -19,12 +19,12 @@ int.esa.ccsds.mo parent - 14.2-SNAPSHOT + 14.2 ../../parent/pom.xml generator-interfaces - 14.2-SNAPSHOT + 14.2 jar ESA MO API Generator - Interfaces @@ -65,12 +65,12 @@ int.esa.ccsds.mo xml-ccsds-mo-prototypes - 14.2-SNAPSHOT + 14.2 int.esa.ccsds.mo xml-ccsds-mo-standards - 14.2-SNAPSHOT + 14.2 diff --git a/api-generator/generator-java/pom.xml b/api-generator/generator-java/pom.xml index 34fc5b68..4c157b70 100644 --- a/api-generator/generator-java/pom.xml +++ b/api-generator/generator-java/pom.xml @@ -19,12 +19,12 @@ int.esa.ccsds.mo parent - 14.2-SNAPSHOT + 14.2 ../../parent/pom.xml generator-java - 14.2-SNAPSHOT + 14.2 jar ESA MO API Generator - Java diff --git a/api-generator/pom.xml b/api-generator/pom.xml index 782ee33d..e84df90c 100644 --- a/api-generator/pom.xml +++ b/api-generator/pom.xml @@ -19,12 +19,12 @@ int.esa.ccsds.mo parent - 14.2-SNAPSHOT + 14.2 ../parent/pom.xml api-generator - 14.2-SNAPSHOT + 14.2 pom ESA MO API Generator diff --git a/apis/api-area001-v003-mal/pom.xml b/apis/api-area001-v003-mal/pom.xml index 9df2ae68..1ddf0703 100644 --- a/apis/api-area001-v003-mal/pom.xml +++ b/apis/api-area001-v003-mal/pom.xml @@ -19,12 +19,12 @@ int.esa.ccsds.mo parent - 14.2-SNAPSHOT + 14.2 ../../parent/pom.xml api-area001-v003-mal - 14.2-SNAPSHOT + 14.2 jar ESA MO API - MAL v003 diff --git a/apis/api-area002-v001-com/pom.xml b/apis/api-area002-v001-com/pom.xml index a1aae269..e289dbfa 100644 --- a/apis/api-area002-v001-com/pom.xml +++ b/apis/api-area002-v001-com/pom.xml @@ -19,12 +19,12 @@ int.esa.ccsds.mo parent - 14.2-SNAPSHOT + 14.2 ../../parent/pom.xml api-area002-v001-com - 14.2-SNAPSHOT + 14.2 jar ESA MO API - COM v001 diff --git a/apis/api-area003-v001-common/pom.xml b/apis/api-area003-v001-common/pom.xml index 44218bc0..fbd2bd50 100644 --- a/apis/api-area003-v001-common/pom.xml +++ b/apis/api-area003-v001-common/pom.xml @@ -19,12 +19,12 @@ int.esa.ccsds.mo parent - 14.2-SNAPSHOT + 14.2 ../../parent/pom.xml api-area003-v001-common - 14.2-SNAPSHOT + 14.2 jar ESA MO API - Common v001 diff --git a/apis/api-area004-v001-mc/pom.xml b/apis/api-area004-v001-mc/pom.xml index 2b973f15..93877959 100644 --- a/apis/api-area004-v001-mc/pom.xml +++ b/apis/api-area004-v001-mc/pom.xml @@ -19,12 +19,12 @@ int.esa.ccsds.mo parent - 14.2-SNAPSHOT + 14.2 ../../parent/pom.xml api-area004-v001-mc - 14.2-SNAPSHOT + 14.2 jar ESA MO API - MC v001 diff --git a/apis/api-area004-v002-mc/pom.xml b/apis/api-area004-v002-mc/pom.xml index c2900e34..c73c9639 100644 --- a/apis/api-area004-v002-mc/pom.xml +++ b/apis/api-area004-v002-mc/pom.xml @@ -19,12 +19,12 @@ int.esa.ccsds.mo parent - 14.2-SNAPSHOT + 14.2 ../../parent/pom.xml api-area004-v002-mc - 14.2-SNAPSHOT + 14.2 jar ESA MO API - MC v002 diff --git a/apis/api-area005-v001-mps/pom.xml b/apis/api-area005-v001-mps/pom.xml index c4eabab1..24047325 100644 --- a/apis/api-area005-v001-mps/pom.xml +++ b/apis/api-area005-v001-mps/pom.xml @@ -19,12 +19,12 @@ int.esa.ccsds.mo parent - 14.2-SNAPSHOT + 14.2 ../../parent/pom.xml api-area005-v001-mps - 14.2-SNAPSHOT + 14.2 jar ESA MO API - MPS v001 diff --git a/apis/api-area009-v001-mpd/pom.xml b/apis/api-area009-v001-mpd/pom.xml index d1498273..744b4733 100644 --- a/apis/api-area009-v001-mpd/pom.xml +++ b/apis/api-area009-v001-mpd/pom.xml @@ -19,12 +19,12 @@ int.esa.ccsds.mo parent - 14.2-SNAPSHOT + 14.2 ../../parent/pom.xml api-area009-v001-mpd - 14.2-SNAPSHOT + 14.2 jar ESA MO API - MPD v001 diff --git a/apis/pom.xml b/apis/pom.xml index cc63f733..0040fb1e 100644 --- a/apis/pom.xml +++ b/apis/pom.xml @@ -19,12 +19,12 @@ int.esa.ccsds.mo parent - 14.2-SNAPSHOT + 14.2 ../parent/pom.xml apis - 14.2-SNAPSHOT + 14.2 pom ESA MO APIs diff --git a/encodings/encoding-binary/pom.xml b/encodings/encoding-binary/pom.xml index 2d4cd3a1..ecffe510 100644 --- a/encodings/encoding-binary/pom.xml +++ b/encodings/encoding-binary/pom.xml @@ -19,13 +19,13 @@ int.esa.ccsds.mo parent - 14.2-SNAPSHOT + 14.2 ../../parent/pom.xml encoding-binary jar - 14.2-SNAPSHOT + 14.2 ESA MO Encoder - Binary A simple Java binary encoder for the CCSDS MAL diff --git a/encodings/encoding-string/pom.xml b/encodings/encoding-string/pom.xml index b76cb7b6..34b036d0 100644 --- a/encodings/encoding-string/pom.xml +++ b/encodings/encoding-string/pom.xml @@ -19,13 +19,13 @@ int.esa.ccsds.mo parent - 14.2-SNAPSHOT + 14.2 ../../parent/pom.xml encoding-string jar - 14.2-SNAPSHOT + 14.2 ESA MO Encoder - String A simple Java String based encoder for the CCSDS MAL diff --git a/encodings/encoding-xml/pom.xml b/encodings/encoding-xml/pom.xml index ff69aeb1..e928be26 100644 --- a/encodings/encoding-xml/pom.xml +++ b/encodings/encoding-xml/pom.xml @@ -19,13 +19,13 @@ int.esa.ccsds.mo parent - 14.2-SNAPSHOT + 14.2 ../../parent/pom.xml encoding-xml jar - 14.2-SNAPSHOT + 14.2 ESA MO Encoder - XML A simple Java String based encoder for the CCSDS MAL diff --git a/encodings/pom.xml b/encodings/pom.xml index 63e6cc95..0d2ced64 100644 --- a/encodings/pom.xml +++ b/encodings/pom.xml @@ -19,12 +19,12 @@ int.esa.ccsds.mo parent - 14.2-SNAPSHOT + 14.2 ../parent/pom.xml encodings - 14.2-SNAPSHOT + 14.2 pom ESA MO Encodings diff --git a/mal-impl/pom.xml b/mal-impl/pom.xml index 1aa861d3..5f102805 100644 --- a/mal-impl/pom.xml +++ b/mal-impl/pom.xml @@ -19,13 +19,13 @@ int.esa.ccsds.mo parent - 14.2-SNAPSHOT + 14.2 ../parent/pom.xml mal-impl jar - 14.2-SNAPSHOT + 14.2 ESA MO MAL Java Implementation The ESA implementation of the CCSDS MAL in Java diff --git a/parent/pom.xml b/parent/pom.xml index 15cd56e3..0f37b8b4 100644 --- a/parent/pom.xml +++ b/parent/pom.xml @@ -17,7 +17,7 @@ 4.0.0 int.esa.ccsds.mo parent - 14.2-SNAPSHOT + 14.2 pom ESA MO POM @@ -73,7 +73,7 @@ UTF-8 - 14.2-SNAPSHOT + 14.2 ${esa.mo.version} ${esa.mo.version} diff --git a/pom.xml b/pom.xml index 543fc8f4..72718faf 100644 --- a/pom.xml +++ b/pom.xml @@ -19,7 +19,7 @@ int.esa.ccsds.mo parent - 14.2-SNAPSHOT + 14.2 parent/pom.xml diff --git a/services-impl/pom.xml b/services-impl/pom.xml index b83127fa..fdc2c79c 100644 --- a/services-impl/pom.xml +++ b/services-impl/pom.xml @@ -19,12 +19,12 @@ int.esa.ccsds.mo parent - 14.2-SNAPSHOT + 14.2 ../parent/pom.xml services-impl - 14.2-SNAPSHOT + 14.2 pom ESA MO Services Implementations diff --git a/services-impl/services-area003-v001-common/pom.xml b/services-impl/services-area003-v001-common/pom.xml index c09760e4..6df250c6 100644 --- a/services-impl/services-area003-v001-common/pom.xml +++ b/services-impl/services-area003-v001-common/pom.xml @@ -19,12 +19,12 @@ int.esa.ccsds.mo parent - 14.2-SNAPSHOT + 14.2 ../../parent/pom.xml services-area003-v001-common - 14.2-SNAPSHOT + 14.2 jar ESA MO Services - Common Services diff --git a/services-impl/services-area004-v002-mc/pom.xml b/services-impl/services-area004-v002-mc/pom.xml index 7e154bb9..811db008 100644 --- a/services-impl/services-area004-v002-mc/pom.xml +++ b/services-impl/services-area004-v002-mc/pom.xml @@ -19,12 +19,12 @@ int.esa.ccsds.mo parent - 14.2-SNAPSHOT + 14.2 ../../parent/pom.xml services-area004-v002-mc - 14.2-SNAPSHOT + 14.2 jar ESA MO Services - MC Services diff --git a/services-impl/services-area009-v001-mpd/pom.xml b/services-impl/services-area009-v001-mpd/pom.xml index 06b2e755..bf7fdd86 100644 --- a/services-impl/services-area009-v001-mpd/pom.xml +++ b/services-impl/services-area009-v001-mpd/pom.xml @@ -19,12 +19,12 @@ int.esa.ccsds.mo parent - 14.2-SNAPSHOT + 14.2 ../../parent/pom.xml services-area009-v001-mpd - 14.2-SNAPSHOT + 14.2 jar ESA MO Services - MPD Services diff --git a/testbeds/pom.xml b/testbeds/pom.xml index 908a9e79..8020a76c 100644 --- a/testbeds/pom.xml +++ b/testbeds/pom.xml @@ -19,12 +19,12 @@ int.esa.ccsds.mo parent - 14.2-SNAPSHOT + 14.2 ../parent/pom.xml testbeds - 14.2-SNAPSHOT + 14.2 pom ESA CCSDS Testbed reactor build diff --git a/testbeds/test-apis/pom.xml b/testbeds/test-apis/pom.xml index 168ad590..2af94000 100644 --- a/testbeds/test-apis/pom.xml +++ b/testbeds/test-apis/pom.xml @@ -19,12 +19,12 @@ int.esa.ccsds.mo testbed-pom - 14.2-SNAPSHOT + 14.2 ../testbed-pom/pom.xml test-apis - 14.2-SNAPSHOT + 14.2 pom CCSDS MOIMS MO Testbed APIs diff --git a/testbeds/test-apis/test-api-com/pom.xml b/testbeds/test-apis/test-api-com/pom.xml index e5ee8f8e..b6516b15 100644 --- a/testbeds/test-apis/test-api-com/pom.xml +++ b/testbeds/test-apis/test-api-com/pom.xml @@ -19,12 +19,12 @@ int.esa.ccsds.mo testbed-pom - 14.2-SNAPSHOT + 14.2 ../../testbed-pom/pom.xml api-com-test - 14.2-SNAPSHOT + 14.2 jar CCSDS MOIMS MO Testbed API - COM diff --git a/testbeds/test-apis/test-api-mal/pom.xml b/testbeds/test-apis/test-api-mal/pom.xml index 35828189..8d5f2568 100644 --- a/testbeds/test-apis/test-api-mal/pom.xml +++ b/testbeds/test-apis/test-api-mal/pom.xml @@ -19,12 +19,12 @@ int.esa.ccsds.mo testbed-pom - 14.2-SNAPSHOT + 14.2 ../../testbed-pom/pom.xml api-mal-test - 14.2-SNAPSHOT + 14.2 jar CCSDS MOIMS MO Testbed API - MAL diff --git a/testbeds/test-apis/test-api-mc/pom.xml b/testbeds/test-apis/test-api-mc/pom.xml index beddae45..c7431192 100644 --- a/testbeds/test-apis/test-api-mc/pom.xml +++ b/testbeds/test-apis/test-api-mc/pom.xml @@ -19,12 +19,12 @@ int.esa.ccsds.mo testbed-pom - 14.2-SNAPSHOT + 14.2 ../../testbed-pom/pom.xml api-mc-test - 14.2-SNAPSHOT + 14.2 jar CCSDS MOIMS MO Testbed API - MC diff --git a/testbeds/testbed-api-generator/pom.xml b/testbeds/testbed-api-generator/pom.xml index 2e58f00c..1c27b7ec 100644 --- a/testbeds/testbed-api-generator/pom.xml +++ b/testbeds/testbed-api-generator/pom.xml @@ -19,14 +19,14 @@ int.esa.ccsds.mo parent - 14.2-SNAPSHOT + 14.2 ../../parent/pom.xml int.esa.ccsds.mo testbed-api-generator jar - 14.2-SNAPSHOT + 14.2 CCSDS MOIMS MO Testbed API Generator Holds the api-generator-lib tests that read a corpus: the golden trees, the corpus walks and the round trips. They live here rather than in the library so that diff --git a/testbeds/testbed-com-framework/pom.xml b/testbeds/testbed-com-framework/pom.xml index b68fa646..10e0abc9 100644 --- a/testbeds/testbed-com-framework/pom.xml +++ b/testbeds/testbed-com-framework/pom.xml @@ -19,13 +19,13 @@ int.esa.ccsds.mo testbed-pom - 14.2-SNAPSHOT + 14.2 ../testbed-pom/pom.xml testbed-com-framework jar - 14.2-SNAPSHOT + 14.2 CCSDS MOIMS MO Testbed COM - Harness diff --git a/testbeds/testbed-com-provider-esa/pom.xml b/testbeds/testbed-com-provider-esa/pom.xml index d6fdf749..07c90cbf 100644 --- a/testbeds/testbed-com-provider-esa/pom.xml +++ b/testbeds/testbed-com-provider-esa/pom.xml @@ -19,12 +19,12 @@ int.esa.ccsds.mo testbed-pom - 14.2-SNAPSHOT + 14.2 ../testbed-pom/pom.xml testbed-com-provider-esa - 14.2-SNAPSHOT + 14.2 jar CCSDS MOIMS MO Testbed COM - Provider Impl diff --git a/testbeds/testbed-com/pom.xml b/testbeds/testbed-com/pom.xml index b9fb8501..525effcb 100644 --- a/testbeds/testbed-com/pom.xml +++ b/testbeds/testbed-com/pom.xml @@ -19,13 +19,13 @@ int.esa.ccsds.mo testbed-pom - 14.2-SNAPSHOT + 14.2 ../testbed-pom/pom.xml testbed-com jar - 14.2-SNAPSHOT + 14.2 CCSDS MOIMS MO Testbed for COM diff --git a/testbeds/testbed-encoders/pom.xml b/testbeds/testbed-encoders/pom.xml index 9280bf09..277a1a9c 100644 --- a/testbeds/testbed-encoders/pom.xml +++ b/testbeds/testbed-encoders/pom.xml @@ -19,13 +19,13 @@ int.esa.ccsds.mo parent - 14.2-SNAPSHOT + 14.2 ../../testbed-pom/pom.xml testbed-encoders jar - 14.2-SNAPSHOT + 14.2 CCSDS MOIMS MO Testbed Encoders diff --git a/testbeds/testbed-mal/pom.xml b/testbeds/testbed-mal/pom.xml index b49fb23b..507c2007 100644 --- a/testbeds/testbed-mal/pom.xml +++ b/testbeds/testbed-mal/pom.xml @@ -19,13 +19,13 @@ int.esa.ccsds.mo testbed-pom - 14.2-SNAPSHOT + 14.2 ../testbed-pom/pom.xml testbed-mal jar - 14.2-SNAPSHOT + 14.2 CCSDS MOIMS MO Testbed for MAL diff --git a/testbeds/testbed-malspp-framework/pom.xml b/testbeds/testbed-malspp-framework/pom.xml index d7c5e00c..1f9d000b 100644 --- a/testbeds/testbed-malspp-framework/pom.xml +++ b/testbeds/testbed-malspp-framework/pom.xml @@ -40,14 +40,14 @@ int.esa.ccsds.mo testbed-pom - 14.2-SNAPSHOT + 14.2 ../testbed-pom/pom.xml int.esa.ccsds.mo testbed-malspp-framework jar - 14.2-SNAPSHOT + 14.2 CCSDS MOIMS MO Testbed Framework for MAL/SPP Binding diff --git a/testbeds/testbed-malspp/pom.xml b/testbeds/testbed-malspp/pom.xml index 3b38aad3..2118333d 100644 --- a/testbeds/testbed-malspp/pom.xml +++ b/testbeds/testbed-malspp/pom.xml @@ -40,14 +40,14 @@ int.esa.ccsds.mo testbed-pom - 14.2-SNAPSHOT + 14.2 ../testbed-pom/pom.xml int.esa.ccsds.mo testbed-malspp jar - 14.2-SNAPSHOT + 14.2 CCSDS MOIMS MO Testbed for MAL/SPP Binding diff --git a/testbeds/testbed-mc/pom.xml b/testbeds/testbed-mc/pom.xml index 01150d51..7b1a74a8 100644 --- a/testbeds/testbed-mc/pom.xml +++ b/testbeds/testbed-mc/pom.xml @@ -19,13 +19,13 @@ int.esa.ccsds.mo testbed-pom - 14.2-SNAPSHOT + 14.2 ../testbed-pom/pom.xml testbed-mc jar - 14.2-SNAPSHOT + 14.2 CCSDS MOIMS MO Testbed MC diff --git a/testbeds/testbed-mpd/pom.xml b/testbeds/testbed-mpd/pom.xml index 0947915c..ca989a25 100644 --- a/testbeds/testbed-mpd/pom.xml +++ b/testbeds/testbed-mpd/pom.xml @@ -19,14 +19,14 @@ int.esa.ccsds.mo parent - 14.2-SNAPSHOT + 14.2 ../../parent/pom.xml int.esa.ccsds.mo testbed-mpd jar - 14.2-SNAPSHOT + 14.2 CCSDS MOIMS MO Testbed MPD diff --git a/testbeds/testbed-pom/pom.xml b/testbeds/testbed-pom/pom.xml index 8815db59..4e9fe30b 100644 --- a/testbeds/testbed-pom/pom.xml +++ b/testbeds/testbed-pom/pom.xml @@ -19,13 +19,13 @@ int.esa.ccsds.mo parent - 14.2-SNAPSHOT + 14.2 ../../parent/pom.xml testbed-pom pom - 14.2-SNAPSHOT + 14.2 CCSDS MOIMS MO Testbed POM diff --git a/testbeds/testbed-util-spp/pom.xml b/testbeds/testbed-util-spp/pom.xml index cf30effd..489095a4 100644 --- a/testbeds/testbed-util-spp/pom.xml +++ b/testbeds/testbed-util-spp/pom.xml @@ -40,14 +40,14 @@ int.esa.ccsds.mo testbed-pom - 14.2-SNAPSHOT + 14.2 ../testbed-pom/pom.xml int.esa.ccsds.mo testbed-util-spp jar - 14.2-SNAPSHOT + 14.2 CCSDS MOIMS MO Testbed utilities for the Space Packet Protocol diff --git a/testbeds/testbed-util/pom.xml b/testbeds/testbed-util/pom.xml index 4f95fe3b..eb4287cc 100644 --- a/testbeds/testbed-util/pom.xml +++ b/testbeds/testbed-util/pom.xml @@ -19,13 +19,13 @@ int.esa.ccsds.mo testbed-pom - 14.2-SNAPSHOT + 14.2 ../testbed-pom/pom.xml testbed-util jar - 14.2-SNAPSHOT + 14.2 CCSDS MOIMS MO Testbed utilities diff --git a/testbeds/xml-tests/pom.xml b/testbeds/xml-tests/pom.xml index 6dc3b616..ace1b399 100644 --- a/testbeds/xml-tests/pom.xml +++ b/testbeds/xml-tests/pom.xml @@ -18,7 +18,7 @@ int.esa.ccsds.mo xml-tests - 14.2-SNAPSHOT + 14.2 jar CCSDS MOIMS MO Testbed XML diff --git a/tooling/basic-demo/pom.xml b/tooling/basic-demo/pom.xml index 7f1c7989..a60ed9d5 100644 --- a/tooling/basic-demo/pom.xml +++ b/tooling/basic-demo/pom.xml @@ -19,13 +19,13 @@ int.esa.ccsds.mo parent - 14.2-SNAPSHOT + 14.2 ../../parent/pom.xml basic-demo jar - 14.2-SNAPSHOT + 14.2 ESA MO Java Demo A Demo Java application for the CCSDS MAL diff --git a/tooling/mo-navigator/pom.xml b/tooling/mo-navigator/pom.xml index 39a1c261..bc6cf6f4 100644 --- a/tooling/mo-navigator/pom.xml +++ b/tooling/mo-navigator/pom.xml @@ -19,13 +19,13 @@ int.esa.ccsds.mo parent - 14.2-SNAPSHOT + 14.2 ../../parent/pom.xml int.esa.ccsds.mo mo-navigator - 14.2-SNAPSHOT + 14.2 jar ESA MO Navigator diff --git a/tooling/pom.xml b/tooling/pom.xml index cd6dae94..5b17b2f3 100644 --- a/tooling/pom.xml +++ b/tooling/pom.xml @@ -19,12 +19,12 @@ int.esa.ccsds.mo parent - 14.2-SNAPSHOT + 14.2 ../parent/pom.xml tooling - 14.2-SNAPSHOT + 14.2 pom ESA MO Tooling diff --git a/tooling/simple-mo-consumer/pom.xml b/tooling/simple-mo-consumer/pom.xml index b4d17de8..5bf79979 100644 --- a/tooling/simple-mo-consumer/pom.xml +++ b/tooling/simple-mo-consumer/pom.xml @@ -7,12 +7,12 @@ int.esa.ccsds.mo parent - 14.2-SNAPSHOT + 14.2 ../../parent/pom.xml simple-mo-consumer - 14.2-SNAPSHOT + 14.2 jar Simple MO Consumer diff --git a/tooling/simple-mo-provider/pom.xml b/tooling/simple-mo-provider/pom.xml index b79b890d..16f58573 100644 --- a/tooling/simple-mo-provider/pom.xml +++ b/tooling/simple-mo-provider/pom.xml @@ -7,12 +7,12 @@ int.esa.ccsds.mo parent - 14.2-SNAPSHOT + 14.2 ../../parent/pom.xml simple-mo-provider - 14.2-SNAPSHOT + 14.2 jar Simple MO Provider diff --git a/tooling/transport-bridge/pom.xml b/tooling/transport-bridge/pom.xml index 78abc605..7253b4da 100644 --- a/tooling/transport-bridge/pom.xml +++ b/tooling/transport-bridge/pom.xml @@ -19,12 +19,12 @@ int.esa.ccsds.mo parent - 14.2-SNAPSHOT + 14.2 ../../parent/pom.xml transport-bridge - 14.2-SNAPSHOT + 14.2 jar ESA MO Transport Bridge diff --git a/transports/pom.xml b/transports/pom.xml index 3bb5914c..aac7e28d 100644 --- a/transports/pom.xml +++ b/transports/pom.xml @@ -19,12 +19,12 @@ int.esa.ccsds.mo parent - 14.2-SNAPSHOT + 14.2 ../parent/pom.xml transports - 14.2-SNAPSHOT + 14.2 pom ESA MO Transports diff --git a/transports/transport-file/pom.xml b/transports/transport-file/pom.xml index a2f74a6b..6959552f 100644 --- a/transports/transport-file/pom.xml +++ b/transports/transport-file/pom.xml @@ -19,13 +19,13 @@ int.esa.ccsds.mo parent - 14.2-SNAPSHOT + 14.2 ../../parent/pom.xml transport-file jar - 14.2-SNAPSHOT + 14.2 ESA MO Transport - File A Java File based transport for CCSDS MAL diff --git a/transports/transport-generic/pom.xml b/transports/transport-generic/pom.xml index 72812017..3e02f353 100644 --- a/transports/transport-generic/pom.xml +++ b/transports/transport-generic/pom.xml @@ -19,13 +19,13 @@ int.esa.ccsds.mo parent - 14.2-SNAPSHOT + 14.2 ../../parent/pom.xml transport-generic jar - 14.2-SNAPSHOT + 14.2 ESA MO Transport - Generic Framework A base Java framework for CCSDS MAL transports diff --git a/transports/transport-http/pom.xml b/transports/transport-http/pom.xml index 640b1340..dc4a997a 100644 --- a/transports/transport-http/pom.xml +++ b/transports/transport-http/pom.xml @@ -19,13 +19,13 @@ int.esa.ccsds.mo parent - 14.2-SNAPSHOT + 14.2 ../../parent/pom.xml transport-http jar - 14.2-SNAPSHOT + 14.2 ESA MO Transport - HTTP A Java HTTP transport for CCSDS MAL diff --git a/transports/transport-rmi/pom.xml b/transports/transport-rmi/pom.xml index 51752149..e0d1a022 100644 --- a/transports/transport-rmi/pom.xml +++ b/transports/transport-rmi/pom.xml @@ -19,13 +19,13 @@ int.esa.ccsds.mo parent - 14.2-SNAPSHOT + 14.2 ../../parent/pom.xml transport-rmi jar - 14.2-SNAPSHOT + 14.2 ESA MO Transport - RMI A Java RMI transport for CCSDS MAL diff --git a/transports/transport-spp/pom.xml b/transports/transport-spp/pom.xml index e7f05c86..05d5463b 100644 --- a/transports/transport-spp/pom.xml +++ b/transports/transport-spp/pom.xml @@ -19,13 +19,13 @@ int.esa.ccsds.mo parent - 14.2-SNAPSHOT + 14.2 ../../parent/pom.xml transport-spp jar - 14.2-SNAPSHOT + 14.2 ESA MO Transport - SPP A Java SPP transport for CCSDS MAL diff --git a/transports/transport-tcpip/pom.xml b/transports/transport-tcpip/pom.xml index 75ac0626..22007274 100644 --- a/transports/transport-tcpip/pom.xml +++ b/transports/transport-tcpip/pom.xml @@ -19,12 +19,12 @@ int.esa.ccsds.mo parent - 14.2-SNAPSHOT + 14.2 ../../parent/pom.xml transport-tcpip - 14.2-SNAPSHOT + 14.2 jar ESA MO Transport - TCP/IP diff --git a/transports/transport-zmtp/pom.xml b/transports/transport-zmtp/pom.xml index fd5a1ee2..c3a8c4dc 100644 --- a/transports/transport-zmtp/pom.xml +++ b/transports/transport-zmtp/pom.xml @@ -19,13 +19,13 @@ int.esa.ccsds.mo parent - 14.2-SNAPSHOT + 14.2 ../../parent/pom.xml transport-zmtp jar - 14.2-SNAPSHOT + 14.2 ESA MO Transport - ZMTP A Java ZeroMQ Transport Protocol binding for CCSDS MAL diff --git a/xml-service-specifications/pom.xml b/xml-service-specifications/pom.xml index c8b67174..db1fc0f3 100644 --- a/xml-service-specifications/pom.xml +++ b/xml-service-specifications/pom.xml @@ -19,13 +19,13 @@ int.esa.ccsds.mo parent - 14.2-SNAPSHOT + 14.2 ../parent/pom.xml int.esa.ccsds.mo xml-service-specifications - 14.2-SNAPSHOT + 14.2 pom ESA MO XML specifications diff --git a/xml-service-specifications/xml-ccsds-mo-prototypes/pom.xml b/xml-service-specifications/xml-ccsds-mo-prototypes/pom.xml index c872429a..dea7af6b 100644 --- a/xml-service-specifications/xml-ccsds-mo-prototypes/pom.xml +++ b/xml-service-specifications/xml-ccsds-mo-prototypes/pom.xml @@ -19,13 +19,13 @@ int.esa.ccsds.mo parent - 14.2-SNAPSHOT + 14.2 ../../parent/pom.xml int.esa.ccsds.mo xml-ccsds-mo-prototypes - 14.2-SNAPSHOT + 14.2 jar ESA MO XML specifications - MO Prototypes diff --git a/xml-service-specifications/xml-ccsds-mo-standards/pom.xml b/xml-service-specifications/xml-ccsds-mo-standards/pom.xml index 2ce6bbca..d8667368 100644 --- a/xml-service-specifications/xml-ccsds-mo-standards/pom.xml +++ b/xml-service-specifications/xml-ccsds-mo-standards/pom.xml @@ -19,13 +19,13 @@ int.esa.ccsds.mo parent - 14.2-SNAPSHOT + 14.2 ../../parent/pom.xml int.esa.ccsds.mo xml-ccsds-mo-standards - 14.2-SNAPSHOT + 14.2 jar ESA MO XML specifications - MO Standards